From e56c6a36abc3a34501417600668826917435901f Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 29 Jan 2025 14:58:24 +0100 Subject: [PATCH 001/132] GO-4459: Add descriptions for swagger data models --- core/api/docs/docs.go | 207 ++++++++++++++++++++--- core/api/docs/swagger.json | 207 ++++++++++++++++++++--- core/api/docs/swagger.yaml | 172 ++++++++++++++++--- core/api/internal/auth/model.go | 6 +- core/api/internal/export/model.go | 4 +- core/api/internal/object/model.go | 112 ++++++------ core/api/internal/object/service_test.go | 9 +- core/api/internal/search/model.go | 10 +- core/api/internal/space/model.go | 56 +++--- core/api/pagination/model.go | 12 +- 10 files changed, 614 insertions(+), 181 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 838673118..34e2a56f6 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -947,6 +947,7 @@ const docTemplate = `{ "type": "object", "properties": { "challenge_id": { + "description": "The challenge id associated with the displayed code and needed to solve the challenge for token", "type": "string", "example": "67647f5ecda913e9a2e11b26" } @@ -956,10 +957,12 @@ const docTemplate = `{ "type": "object", "properties": { "app_key": { + "description": "The permanent app key", "type": "string", "example": "zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=" }, "session_token": { + "description": "The ephemeral session token", "type": "string", "example": "eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII" } @@ -969,6 +972,7 @@ const docTemplate = `{ "type": "object", "properties": { "path": { + "description": "The path the object was exported to", "type": "string", "example": "/path/to/export" } @@ -978,6 +982,7 @@ const docTemplate = `{ "type": "object", "properties": { "align": { + "description": "The alignment of the block", "type": "string", "enum": [ "AlignLeft", @@ -988,10 +993,12 @@ const docTemplate = `{ "example": "AlignLeft" }, "background_color": { + "description": "The background color of the block", "type": "string", "example": "red" }, "children_ids": { + "description": "The ids of the block's children", "type": "array", "items": { "type": "string" @@ -1001,16 +1008,28 @@ const docTemplate = `{ ] }, "file": { - "$ref": "#/definitions/object.File" + "description": "The file of the block, if applicable", + "allOf": [ + { + "$ref": "#/definitions/object.File" + } + ] }, "id": { + "description": "The id of the block", "type": "string", "example": "64394517de52ad5acb89c66c" }, "text": { - "$ref": "#/definitions/object.Text" + "description": "The text of the block, if applicable", + "allOf": [ + { + "$ref": "#/definitions/object.Text" + } + ] }, "vertical_align": { + "description": "The vertical alignment of the block", "type": "string", "enum": [ "VerticalAlignTop", @@ -1025,30 +1044,37 @@ const docTemplate = `{ "type": "object", "properties": { "body": { + "description": "The body of the object", "type": "string", - "example": "Object Body" + "example": "This is the body of the object. Markdown syntax is supported here." }, "description": { + "description": "The description of the object", "type": "string", - "example": "Object Description" + "example": "This is a description of the object." }, "icon": { + "description": "The icon of the object", "type": "string", "example": "📄" }, "name": { + "description": "The name of the object", "type": "string", - "example": "Object Name" + "example": "My object" }, "object_type_unique_key": { + "description": "The unique key of the object type", "type": "string", "example": "ot-page" }, "source": { + "description": "The source url, only applicable for bookmarks", "type": "string", - "example": "https://source.com" + "example": "https://bookmark-source.com" }, "template_id": { + "description": "The id of the template to use", "type": "string", "example": "bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge" } @@ -1058,10 +1084,12 @@ const docTemplate = `{ "type": "object", "properties": { "details": { + "description": "The details", "type": "object", "additionalProperties": true }, "id": { + "description": "The id of the detail", "type": "string", "enum": [ "last_modified_date", @@ -1079,30 +1107,39 @@ const docTemplate = `{ "type": "object", "properties": { "added_at": { + "description": "The added at of the file", "type": "integer" }, "hash": { + "description": "The hash of the file", "type": "string" }, "mime": { + "description": "The mime of the file", "type": "string" }, "name": { + "description": "The name of the file", "type": "string" }, "size": { + "description": "The size of the file", "type": "integer" }, "state": { + "description": "The state of the file", "type": "string" }, "style": { + "description": "The style of the file", "type": "string" }, "target_object_id": { + "description": "The target object id of the file", "type": "string" }, "type": { + "description": "The type of the file", "type": "string" } } @@ -1111,46 +1148,56 @@ const docTemplate = `{ "type": "object", "properties": { "blocks": { + "description": "The blocks of the object", "type": "array", "items": { "$ref": "#/definitions/object.Block" } }, "details": { + "description": "The details of the object", "type": "array", "items": { "$ref": "#/definitions/object.Detail" } }, "icon": { + "description": "The icon of the object", "type": "string", "example": "📄" }, "id": { + "description": "The id of the object", "type": "string", "example": "bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ" }, "layout": { + "description": "The layout of the object", "type": "string", "example": "basic" }, "name": { + "description": "The name of the object", "type": "string", - "example": "Object Name" + "example": "My object" }, "root_id": { + "description": "The id of the object's root", "type": "string", "example": "bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u" }, "snippet": { + "description": "The snippet of the object, especially important for notes as they don't have a name", "type": "string", "example": "The beginning of the object body..." }, "space_id": { + "description": "The id of the space the object is in", "type": "string", "example": "bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1" }, "type": { + "description": "The type of the object", "type": "string", "example": "Page" } @@ -1160,7 +1207,12 @@ const docTemplate = `{ "type": "object", "properties": { "object": { - "$ref": "#/definitions/object.Object" + "description": "The object", + "allOf": [ + { + "$ref": "#/definitions/object.Object" + } + ] } } }, @@ -1168,18 +1220,22 @@ const docTemplate = `{ "type": "object", "properties": { "icon": { + "description": "The icon of the template", "type": "string", "example": "📄" }, "id": { + "description": "The id of the template", "type": "string", "example": "bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge" }, "name": { + "description": "The name of the template", "type": "string", - "example": "Template Name" + "example": "My template" }, "type": { + "description": "The type of the object", "type": "string", "example": "template" } @@ -1189,7 +1245,12 @@ const docTemplate = `{ "type": "object", "properties": { "template": { - "$ref": "#/definitions/object.Template" + "description": "The template", + "allOf": [ + { + "$ref": "#/definitions/object.Template" + } + ] } } }, @@ -1197,18 +1258,22 @@ const docTemplate = `{ "type": "object", "properties": { "checked": { + "description": "Whether the text is checked", "type": "boolean", "example": true }, "color": { + "description": "The color of the text", "type": "string", "example": "red" }, "icon": { + "description": "The icon of the text", "type": "string", "example": "📄" }, "style": { + "description": "The style of the text", "type": "string", "enum": [ "Paragraph", @@ -1229,8 +1294,9 @@ const docTemplate = `{ "example": "Paragraph" }, "text": { + "description": "The text", "type": "string", - "example": "Some text" + "example": "Some text..." } } }, @@ -1238,26 +1304,32 @@ const docTemplate = `{ "type": "object", "properties": { "icon": { + "description": "The icon of the type", "type": "string", "example": "📄" }, "id": { + "description": "The id of the type", "type": "string", "example": "bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu" }, "name": { + "description": "The name of the type", "type": "string", "example": "Page" }, "recommended_layout": { + "description": "The recommended layout of the type", "type": "string", "example": "todo" }, "type": { + "description": "The type of the object", "type": "string", "example": "type" }, "unique_key": { + "description": "The unique key of the type", "type": "string", "example": "ot-page" } @@ -1267,7 +1339,12 @@ const docTemplate = `{ "type": "object", "properties": { "type": { - "$ref": "#/definitions/object.Type" + "description": "The type", + "allOf": [ + { + "$ref": "#/definitions/object.Type" + } + ] } } }, @@ -1275,13 +1352,19 @@ const docTemplate = `{ "type": "object", "properties": { "data": { + "description": "The list of items in the current result set", "type": "array", "items": { "$ref": "#/definitions/object.Object" } }, "pagination": { - "$ref": "#/definitions/pagination.PaginationMeta" + "description": "The pagination metadata for the response", + "allOf": [ + { + "$ref": "#/definitions/pagination.PaginationMeta" + } + ] } } }, @@ -1289,13 +1372,19 @@ const docTemplate = `{ "type": "object", "properties": { "data": { + "description": "The list of items in the current result set", "type": "array", "items": { "$ref": "#/definitions/object.Template" } }, "pagination": { - "$ref": "#/definitions/pagination.PaginationMeta" + "description": "The pagination metadata for the response", + "allOf": [ + { + "$ref": "#/definitions/pagination.PaginationMeta" + } + ] } } }, @@ -1303,13 +1392,19 @@ const docTemplate = `{ "type": "object", "properties": { "data": { + "description": "The list of items in the current result set", "type": "array", "items": { "$ref": "#/definitions/object.Type" } }, "pagination": { - "$ref": "#/definitions/pagination.PaginationMeta" + "description": "The pagination metadata for the response", + "allOf": [ + { + "$ref": "#/definitions/pagination.PaginationMeta" + } + ] } } }, @@ -1317,13 +1412,19 @@ const docTemplate = `{ "type": "object", "properties": { "data": { + "description": "The list of items in the current result set", "type": "array", "items": { "$ref": "#/definitions/space.Member" } }, "pagination": { - "$ref": "#/definitions/pagination.PaginationMeta" + "description": "The pagination metadata for the response", + "allOf": [ + { + "$ref": "#/definitions/pagination.PaginationMeta" + } + ] } } }, @@ -1331,13 +1432,19 @@ const docTemplate = `{ "type": "object", "properties": { "data": { + "description": "The list of items in the current result set", "type": "array", "items": { "$ref": "#/definitions/space.Space" } }, "pagination": { - "$ref": "#/definitions/pagination.PaginationMeta" + "description": "The pagination metadata for the response", + "allOf": [ + { + "$ref": "#/definitions/pagination.PaginationMeta" + } + ] } } }, @@ -1345,22 +1452,22 @@ const docTemplate = `{ "type": "object", "properties": { "has_more": { - "description": "whether there are more items available", + "description": "Indicates if there are more items available beyond the current result set", "type": "boolean", "example": true }, "limit": { - "description": "the current limit", + "description": "The maximum number of items returned in the result set", "type": "integer", "example": 100 }, "offset": { - "description": "the current offset", + "description": "The number of items skipped before starting to collect the result set", "type": "integer", "example": 0 }, "total": { - "description": "the total number of items available on that endpoint", + "description": "The total number of items available for the endpoint", "type": "integer", "example": 1024 } @@ -1370,16 +1477,30 @@ const docTemplate = `{ "type": "object", "properties": { "query": { - "type": "string" + "description": "The search term to look for in object names and snippets", + "type": "string", + "example": "test" }, "sort": { - "$ref": "#/definitions/search.SortOptions" + "description": "The sorting criteria and direction for the search results", + "allOf": [ + { + "$ref": "#/definitions/search.SortOptions" + } + ] }, "types": { + "description": "The types of objects to search for, specified by unique key or ID", "type": "array", "items": { "type": "string" - } + }, + "example": [ + "ot-note", + "ot-page", + "ot-678043f0cda9133be777049f", + "bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q" + ] } } }, @@ -1387,6 +1508,7 @@ const docTemplate = `{ "type": "object", "properties": { "direction": { + "description": "The direction to sort the search results", "type": "string", "default": "desc", "enum": [ @@ -1395,6 +1517,7 @@ const docTemplate = `{ ] }, "timestamp": { + "description": "The timestamp to sort the search results by", "type": "string", "default": "last_modified_date", "enum": [ @@ -1409,6 +1532,7 @@ const docTemplate = `{ "type": "object", "properties": { "name": { + "description": "The name of the space", "type": "string", "example": "New Space" } @@ -1418,7 +1542,12 @@ const docTemplate = `{ "type": "object", "properties": { "space": { - "$ref": "#/definitions/space.Space" + "description": "The created space", + "allOf": [ + { + "$ref": "#/definitions/space.Space" + } + ] } } }, @@ -1426,26 +1555,32 @@ const docTemplate = `{ "type": "object", "properties": { "global_name": { + "description": "The global name of the member in the network", "type": "string", "example": "john.any" }, "icon": { + "description": "The icon of the member", "type": "string", "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100" }, "id": { + "description": "The profile object id of the member", "type": "string", "example": "_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ" }, "identity": { + "description": "The identity of the member in the network", "type": "string", "example": "AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ" }, "name": { + "description": "The name of the member", "type": "string", "example": "John Doe" }, "role": { + "description": "The role of the member", "type": "string", "enum": [ "Reader", @@ -1456,6 +1591,7 @@ const docTemplate = `{ "example": "Owner" }, "type": { + "description": "The type of the object", "type": "string", "example": "member" } @@ -1465,78 +1601,97 @@ const docTemplate = `{ "type": "object", "properties": { "account_space_id": { + "description": "The id of the account space", "type": "string", "example": "bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1" }, "analytics_id": { + "description": "The analytics id of the account", "type": "string", "example": "624aecdd-4797-4611-9d61-a2ae5f53cf1c" }, "archive_object_id": { + "description": "The id of the archive object", "type": "string", "example": "bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri" }, "device_id": { + "description": "The id of the device", "type": "string", "example": "12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF" }, "gateway_url": { + "description": "The gateway url to serve files and media", "type": "string", "example": "http://127.0.0.1:31006" }, "home_object_id": { + "description": "The id of the home object", "type": "string", "example": "bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya" }, "icon": { + "description": "The icon of the space", "type": "string", "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay" }, "id": { + "description": "The id of the space", "type": "string", "example": "bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1" }, "local_storage_path": { + "description": "The local storage path of the account", "type": "string", "example": "/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha" }, "marketplace_workspace_id": { + "description": "The id of the marketplace workspace", "type": "string", "example": "_anytype_marketplace" }, "name": { + "description": "The name of the space", "type": "string", - "example": "Space Name" + "example": "My Space" }, "network_id": { + "description": "The network id of the space", "type": "string", "example": "N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU" }, "profile_object_id": { + "description": "The id of the profile object", "type": "string", "example": "bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4" }, "space_view_id": { + "description": "The id of the space view", "type": "string", "example": "bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy" }, "tech_space_id": { + "description": "The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself", "type": "string", "example": "bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1" }, "timezone": { + "description": "The timezone of the account", "type": "string", "example": "" }, "type": { + "description": "The type of the object", "type": "string", "example": "space" }, "widgets_id": { + "description": "The id of the widgets", "type": "string", "example": "bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva" }, "workspace_object_id": { + "description": "The id of the workspace object", "type": "string", "example": "bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y" } diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index cf8fe16d3..f5647435c 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -941,6 +941,7 @@ "type": "object", "properties": { "challenge_id": { + "description": "The challenge id associated with the displayed code and needed to solve the challenge for token", "type": "string", "example": "67647f5ecda913e9a2e11b26" } @@ -950,10 +951,12 @@ "type": "object", "properties": { "app_key": { + "description": "The permanent app key", "type": "string", "example": "zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=" }, "session_token": { + "description": "The ephemeral session token", "type": "string", "example": "eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII" } @@ -963,6 +966,7 @@ "type": "object", "properties": { "path": { + "description": "The path the object was exported to", "type": "string", "example": "/path/to/export" } @@ -972,6 +976,7 @@ "type": "object", "properties": { "align": { + "description": "The alignment of the block", "type": "string", "enum": [ "AlignLeft", @@ -982,10 +987,12 @@ "example": "AlignLeft" }, "background_color": { + "description": "The background color of the block", "type": "string", "example": "red" }, "children_ids": { + "description": "The ids of the block's children", "type": "array", "items": { "type": "string" @@ -995,16 +1002,28 @@ ] }, "file": { - "$ref": "#/definitions/object.File" + "description": "The file of the block, if applicable", + "allOf": [ + { + "$ref": "#/definitions/object.File" + } + ] }, "id": { + "description": "The id of the block", "type": "string", "example": "64394517de52ad5acb89c66c" }, "text": { - "$ref": "#/definitions/object.Text" + "description": "The text of the block, if applicable", + "allOf": [ + { + "$ref": "#/definitions/object.Text" + } + ] }, "vertical_align": { + "description": "The vertical alignment of the block", "type": "string", "enum": [ "VerticalAlignTop", @@ -1019,30 +1038,37 @@ "type": "object", "properties": { "body": { + "description": "The body of the object", "type": "string", - "example": "Object Body" + "example": "This is the body of the object. Markdown syntax is supported here." }, "description": { + "description": "The description of the object", "type": "string", - "example": "Object Description" + "example": "This is a description of the object." }, "icon": { + "description": "The icon of the object", "type": "string", "example": "📄" }, "name": { + "description": "The name of the object", "type": "string", - "example": "Object Name" + "example": "My object" }, "object_type_unique_key": { + "description": "The unique key of the object type", "type": "string", "example": "ot-page" }, "source": { + "description": "The source url, only applicable for bookmarks", "type": "string", - "example": "https://source.com" + "example": "https://bookmark-source.com" }, "template_id": { + "description": "The id of the template to use", "type": "string", "example": "bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge" } @@ -1052,10 +1078,12 @@ "type": "object", "properties": { "details": { + "description": "The details", "type": "object", "additionalProperties": true }, "id": { + "description": "The id of the detail", "type": "string", "enum": [ "last_modified_date", @@ -1073,30 +1101,39 @@ "type": "object", "properties": { "added_at": { + "description": "The added at of the file", "type": "integer" }, "hash": { + "description": "The hash of the file", "type": "string" }, "mime": { + "description": "The mime of the file", "type": "string" }, "name": { + "description": "The name of the file", "type": "string" }, "size": { + "description": "The size of the file", "type": "integer" }, "state": { + "description": "The state of the file", "type": "string" }, "style": { + "description": "The style of the file", "type": "string" }, "target_object_id": { + "description": "The target object id of the file", "type": "string" }, "type": { + "description": "The type of the file", "type": "string" } } @@ -1105,46 +1142,56 @@ "type": "object", "properties": { "blocks": { + "description": "The blocks of the object", "type": "array", "items": { "$ref": "#/definitions/object.Block" } }, "details": { + "description": "The details of the object", "type": "array", "items": { "$ref": "#/definitions/object.Detail" } }, "icon": { + "description": "The icon of the object", "type": "string", "example": "📄" }, "id": { + "description": "The id of the object", "type": "string", "example": "bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ" }, "layout": { + "description": "The layout of the object", "type": "string", "example": "basic" }, "name": { + "description": "The name of the object", "type": "string", - "example": "Object Name" + "example": "My object" }, "root_id": { + "description": "The id of the object's root", "type": "string", "example": "bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u" }, "snippet": { + "description": "The snippet of the object, especially important for notes as they don't have a name", "type": "string", "example": "The beginning of the object body..." }, "space_id": { + "description": "The id of the space the object is in", "type": "string", "example": "bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1" }, "type": { + "description": "The type of the object", "type": "string", "example": "Page" } @@ -1154,7 +1201,12 @@ "type": "object", "properties": { "object": { - "$ref": "#/definitions/object.Object" + "description": "The object", + "allOf": [ + { + "$ref": "#/definitions/object.Object" + } + ] } } }, @@ -1162,18 +1214,22 @@ "type": "object", "properties": { "icon": { + "description": "The icon of the template", "type": "string", "example": "📄" }, "id": { + "description": "The id of the template", "type": "string", "example": "bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge" }, "name": { + "description": "The name of the template", "type": "string", - "example": "Template Name" + "example": "My template" }, "type": { + "description": "The type of the object", "type": "string", "example": "template" } @@ -1183,7 +1239,12 @@ "type": "object", "properties": { "template": { - "$ref": "#/definitions/object.Template" + "description": "The template", + "allOf": [ + { + "$ref": "#/definitions/object.Template" + } + ] } } }, @@ -1191,18 +1252,22 @@ "type": "object", "properties": { "checked": { + "description": "Whether the text is checked", "type": "boolean", "example": true }, "color": { + "description": "The color of the text", "type": "string", "example": "red" }, "icon": { + "description": "The icon of the text", "type": "string", "example": "📄" }, "style": { + "description": "The style of the text", "type": "string", "enum": [ "Paragraph", @@ -1223,8 +1288,9 @@ "example": "Paragraph" }, "text": { + "description": "The text", "type": "string", - "example": "Some text" + "example": "Some text..." } } }, @@ -1232,26 +1298,32 @@ "type": "object", "properties": { "icon": { + "description": "The icon of the type", "type": "string", "example": "📄" }, "id": { + "description": "The id of the type", "type": "string", "example": "bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu" }, "name": { + "description": "The name of the type", "type": "string", "example": "Page" }, "recommended_layout": { + "description": "The recommended layout of the type", "type": "string", "example": "todo" }, "type": { + "description": "The type of the object", "type": "string", "example": "type" }, "unique_key": { + "description": "The unique key of the type", "type": "string", "example": "ot-page" } @@ -1261,7 +1333,12 @@ "type": "object", "properties": { "type": { - "$ref": "#/definitions/object.Type" + "description": "The type", + "allOf": [ + { + "$ref": "#/definitions/object.Type" + } + ] } } }, @@ -1269,13 +1346,19 @@ "type": "object", "properties": { "data": { + "description": "The list of items in the current result set", "type": "array", "items": { "$ref": "#/definitions/object.Object" } }, "pagination": { - "$ref": "#/definitions/pagination.PaginationMeta" + "description": "The pagination metadata for the response", + "allOf": [ + { + "$ref": "#/definitions/pagination.PaginationMeta" + } + ] } } }, @@ -1283,13 +1366,19 @@ "type": "object", "properties": { "data": { + "description": "The list of items in the current result set", "type": "array", "items": { "$ref": "#/definitions/object.Template" } }, "pagination": { - "$ref": "#/definitions/pagination.PaginationMeta" + "description": "The pagination metadata for the response", + "allOf": [ + { + "$ref": "#/definitions/pagination.PaginationMeta" + } + ] } } }, @@ -1297,13 +1386,19 @@ "type": "object", "properties": { "data": { + "description": "The list of items in the current result set", "type": "array", "items": { "$ref": "#/definitions/object.Type" } }, "pagination": { - "$ref": "#/definitions/pagination.PaginationMeta" + "description": "The pagination metadata for the response", + "allOf": [ + { + "$ref": "#/definitions/pagination.PaginationMeta" + } + ] } } }, @@ -1311,13 +1406,19 @@ "type": "object", "properties": { "data": { + "description": "The list of items in the current result set", "type": "array", "items": { "$ref": "#/definitions/space.Member" } }, "pagination": { - "$ref": "#/definitions/pagination.PaginationMeta" + "description": "The pagination metadata for the response", + "allOf": [ + { + "$ref": "#/definitions/pagination.PaginationMeta" + } + ] } } }, @@ -1325,13 +1426,19 @@ "type": "object", "properties": { "data": { + "description": "The list of items in the current result set", "type": "array", "items": { "$ref": "#/definitions/space.Space" } }, "pagination": { - "$ref": "#/definitions/pagination.PaginationMeta" + "description": "The pagination metadata for the response", + "allOf": [ + { + "$ref": "#/definitions/pagination.PaginationMeta" + } + ] } } }, @@ -1339,22 +1446,22 @@ "type": "object", "properties": { "has_more": { - "description": "whether there are more items available", + "description": "Indicates if there are more items available beyond the current result set", "type": "boolean", "example": true }, "limit": { - "description": "the current limit", + "description": "The maximum number of items returned in the result set", "type": "integer", "example": 100 }, "offset": { - "description": "the current offset", + "description": "The number of items skipped before starting to collect the result set", "type": "integer", "example": 0 }, "total": { - "description": "the total number of items available on that endpoint", + "description": "The total number of items available for the endpoint", "type": "integer", "example": 1024 } @@ -1364,16 +1471,30 @@ "type": "object", "properties": { "query": { - "type": "string" + "description": "The search term to look for in object names and snippets", + "type": "string", + "example": "test" }, "sort": { - "$ref": "#/definitions/search.SortOptions" + "description": "The sorting criteria and direction for the search results", + "allOf": [ + { + "$ref": "#/definitions/search.SortOptions" + } + ] }, "types": { + "description": "The types of objects to search for, specified by unique key or ID", "type": "array", "items": { "type": "string" - } + }, + "example": [ + "ot-note", + "ot-page", + "ot-678043f0cda9133be777049f", + "bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q" + ] } } }, @@ -1381,6 +1502,7 @@ "type": "object", "properties": { "direction": { + "description": "The direction to sort the search results", "type": "string", "default": "desc", "enum": [ @@ -1389,6 +1511,7 @@ ] }, "timestamp": { + "description": "The timestamp to sort the search results by", "type": "string", "default": "last_modified_date", "enum": [ @@ -1403,6 +1526,7 @@ "type": "object", "properties": { "name": { + "description": "The name of the space", "type": "string", "example": "New Space" } @@ -1412,7 +1536,12 @@ "type": "object", "properties": { "space": { - "$ref": "#/definitions/space.Space" + "description": "The created space", + "allOf": [ + { + "$ref": "#/definitions/space.Space" + } + ] } } }, @@ -1420,26 +1549,32 @@ "type": "object", "properties": { "global_name": { + "description": "The global name of the member in the network", "type": "string", "example": "john.any" }, "icon": { + "description": "The icon of the member", "type": "string", "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100" }, "id": { + "description": "The profile object id of the member", "type": "string", "example": "_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ" }, "identity": { + "description": "The identity of the member in the network", "type": "string", "example": "AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ" }, "name": { + "description": "The name of the member", "type": "string", "example": "John Doe" }, "role": { + "description": "The role of the member", "type": "string", "enum": [ "Reader", @@ -1450,6 +1585,7 @@ "example": "Owner" }, "type": { + "description": "The type of the object", "type": "string", "example": "member" } @@ -1459,78 +1595,97 @@ "type": "object", "properties": { "account_space_id": { + "description": "The id of the account space", "type": "string", "example": "bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1" }, "analytics_id": { + "description": "The analytics id of the account", "type": "string", "example": "624aecdd-4797-4611-9d61-a2ae5f53cf1c" }, "archive_object_id": { + "description": "The id of the archive object", "type": "string", "example": "bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri" }, "device_id": { + "description": "The id of the device", "type": "string", "example": "12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF" }, "gateway_url": { + "description": "The gateway url to serve files and media", "type": "string", "example": "http://127.0.0.1:31006" }, "home_object_id": { + "description": "The id of the home object", "type": "string", "example": "bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya" }, "icon": { + "description": "The icon of the space", "type": "string", "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay" }, "id": { + "description": "The id of the space", "type": "string", "example": "bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1" }, "local_storage_path": { + "description": "The local storage path of the account", "type": "string", "example": "/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha" }, "marketplace_workspace_id": { + "description": "The id of the marketplace workspace", "type": "string", "example": "_anytype_marketplace" }, "name": { + "description": "The name of the space", "type": "string", - "example": "Space Name" + "example": "My Space" }, "network_id": { + "description": "The network id of the space", "type": "string", "example": "N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU" }, "profile_object_id": { + "description": "The id of the profile object", "type": "string", "example": "bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4" }, "space_view_id": { + "description": "The id of the space view", "type": "string", "example": "bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy" }, "tech_space_id": { + "description": "The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself", "type": "string", "example": "bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1" }, "timezone": { + "description": "The timezone of the account", "type": "string", "example": "" }, "type": { + "description": "The type of the object", "type": "string", "example": "space" }, "widgets_id": { + "description": "The id of the widgets", "type": "string", "example": "bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva" }, "workspace_object_id": { + "description": "The id of the workspace object", "type": "string", "example": "bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y" } diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 550a59d1c..c9ba28757 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -3,27 +3,33 @@ definitions: auth.DisplayCodeResponse: properties: challenge_id: + description: The challenge id associated with the displayed code and needed + to solve the challenge for token example: 67647f5ecda913e9a2e11b26 type: string type: object auth.TokenResponse: properties: app_key: + description: The permanent app key example: zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6= type: string session_token: + description: The ephemeral session token example: eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII type: string type: object export.ObjectExportResponse: properties: path: + description: The path the object was exported to example: /path/to/export type: string type: object object.Block: properties: align: + description: The alignment of the block enum: - AlignLeft - AlignCenter @@ -32,22 +38,30 @@ definitions: example: AlignLeft type: string background_color: + description: The background color of the block example: red type: string children_ids: + description: The ids of the block's children example: - '[''6797ce8ecda913cde14b02dc'']' items: type: string type: array file: - $ref: '#/definitions/object.File' + allOf: + - $ref: '#/definitions/object.File' + description: The file of the block, if applicable id: + description: The id of the block example: 64394517de52ad5acb89c66c type: string text: - $ref: '#/definitions/object.Text' + allOf: + - $ref: '#/definitions/object.Text' + description: The text of the block, if applicable vertical_align: + description: The vertical alignment of the block enum: - VerticalAlignTop - VerticalAlignMiddle @@ -58,24 +72,31 @@ definitions: object.CreateObjectRequest: properties: body: - example: Object Body + description: The body of the object + example: This is the body of the object. Markdown syntax is supported here. type: string description: - example: Object Description + description: The description of the object + example: This is a description of the object. type: string icon: + description: The icon of the object example: "\U0001F4C4" type: string name: - example: Object Name + description: The name of the object + example: My object type: string object_type_unique_key: + description: The unique key of the object type example: ot-page type: string source: - example: https://source.com + description: The source url, only applicable for bookmarks + example: https://bookmark-source.com type: string template_id: + description: The id of the template to use example: bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge type: string type: object @@ -83,8 +104,10 @@ definitions: properties: details: additionalProperties: true + description: The details type: object id: + description: The id of the detail enum: - last_modified_date - last_modified_by @@ -98,96 +121,128 @@ definitions: object.File: properties: added_at: + description: The added at of the file type: integer hash: + description: The hash of the file type: string mime: + description: The mime of the file type: string name: + description: The name of the file type: string size: + description: The size of the file type: integer state: + description: The state of the file type: string style: + description: The style of the file type: string target_object_id: + description: The target object id of the file type: string type: + description: The type of the file type: string type: object object.Object: properties: blocks: + description: The blocks of the object items: $ref: '#/definitions/object.Block' type: array details: + description: The details of the object items: $ref: '#/definitions/object.Detail' type: array icon: + description: The icon of the object example: "\U0001F4C4" type: string id: + description: The id of the object example: bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ type: string layout: + description: The layout of the object example: basic type: string name: - example: Object Name + description: The name of the object + example: My object type: string root_id: + description: The id of the object's root example: bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u type: string snippet: + description: The snippet of the object, especially important for notes as + they don't have a name example: The beginning of the object body... type: string space_id: + description: The id of the space the object is in example: bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1 type: string type: + description: The type of the object example: Page type: string type: object object.ObjectResponse: properties: object: - $ref: '#/definitions/object.Object' + allOf: + - $ref: '#/definitions/object.Object' + description: The object type: object object.Template: properties: icon: + description: The icon of the template example: "\U0001F4C4" type: string id: + description: The id of the template example: bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge type: string name: - example: Template Name + description: The name of the template + example: My template type: string type: + description: The type of the object example: template type: string type: object object.TemplateResponse: properties: template: - $ref: '#/definitions/object.Template' + allOf: + - $ref: '#/definitions/object.Template' + description: The template type: object object.Text: properties: checked: + description: Whether the text is checked example: true type: boolean color: + description: The color of the text example: red type: string icon: + description: The icon of the text example: "\U0001F4C4" type: string style: + description: The style of the text enum: - Paragraph - Header1 @@ -206,106 +261,143 @@ definitions: example: Paragraph type: string text: - example: Some text + description: The text + example: Some text... type: string type: object object.Type: properties: icon: + description: The icon of the type example: "\U0001F4C4" type: string id: + description: The id of the type example: bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu type: string name: + description: The name of the type example: Page type: string recommended_layout: + description: The recommended layout of the type example: todo type: string type: + description: The type of the object example: type type: string unique_key: + description: The unique key of the type example: ot-page type: string type: object object.TypeResponse: properties: type: - $ref: '#/definitions/object.Type' + allOf: + - $ref: '#/definitions/object.Type' + description: The type type: object pagination.PaginatedResponse-object_Object: properties: data: + description: The list of items in the current result set items: $ref: '#/definitions/object.Object' type: array pagination: - $ref: '#/definitions/pagination.PaginationMeta' + allOf: + - $ref: '#/definitions/pagination.PaginationMeta' + description: The pagination metadata for the response type: object pagination.PaginatedResponse-object_Template: properties: data: + description: The list of items in the current result set items: $ref: '#/definitions/object.Template' type: array pagination: - $ref: '#/definitions/pagination.PaginationMeta' + allOf: + - $ref: '#/definitions/pagination.PaginationMeta' + description: The pagination metadata for the response type: object pagination.PaginatedResponse-object_Type: properties: data: + description: The list of items in the current result set items: $ref: '#/definitions/object.Type' type: array pagination: - $ref: '#/definitions/pagination.PaginationMeta' + allOf: + - $ref: '#/definitions/pagination.PaginationMeta' + description: The pagination metadata for the response type: object pagination.PaginatedResponse-space_Member: properties: data: + description: The list of items in the current result set items: $ref: '#/definitions/space.Member' type: array pagination: - $ref: '#/definitions/pagination.PaginationMeta' + allOf: + - $ref: '#/definitions/pagination.PaginationMeta' + description: The pagination metadata for the response type: object pagination.PaginatedResponse-space_Space: properties: data: + description: The list of items in the current result set items: $ref: '#/definitions/space.Space' type: array pagination: - $ref: '#/definitions/pagination.PaginationMeta' + allOf: + - $ref: '#/definitions/pagination.PaginationMeta' + description: The pagination metadata for the response type: object pagination.PaginationMeta: properties: has_more: - description: whether there are more items available + description: Indicates if there are more items available beyond the current + result set example: true type: boolean limit: - description: the current limit + description: The maximum number of items returned in the result set example: 100 type: integer offset: - description: the current offset + description: The number of items skipped before starting to collect the result + set example: 0 type: integer total: - description: the total number of items available on that endpoint + description: The total number of items available for the endpoint example: 1024 type: integer type: object search.SearchRequest: properties: query: + description: The search term to look for in object names and snippets + example: test type: string sort: - $ref: '#/definitions/search.SortOptions' + allOf: + - $ref: '#/definitions/search.SortOptions' + description: The sorting criteria and direction for the search results types: + description: The types of objects to search for, specified by unique key or + ID + example: + - ot-note + - ot-page + - ot-678043f0cda9133be777049f + - bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q items: type: string type: array @@ -314,12 +406,14 @@ definitions: properties: direction: default: desc + description: The direction to sort the search results enum: - asc - desc type: string timestamp: default: last_modified_date + description: The timestamp to sort the search results by enum: - created_date - last_modified_date @@ -329,32 +423,41 @@ definitions: space.CreateSpaceRequest: properties: name: + description: The name of the space example: New Space type: string type: object space.CreateSpaceResponse: properties: space: - $ref: '#/definitions/space.Space' + allOf: + - $ref: '#/definitions/space.Space' + description: The created space type: object space.Member: properties: global_name: + description: The global name of the member in the network example: john.any type: string icon: + description: The icon of the member example: http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100 type: string id: + description: The profile object id of the member example: _participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ type: string identity: + description: The identity of the member in the network example: AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ type: string name: + description: The name of the member example: John Doe type: string role: + description: The role of the member enum: - Reader - Writer @@ -363,66 +466,87 @@ definitions: example: Owner type: string type: + description: The type of the object example: member type: string type: object space.Space: properties: account_space_id: + description: The id of the account space example: bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1 type: string analytics_id: + description: The analytics id of the account example: 624aecdd-4797-4611-9d61-a2ae5f53cf1c type: string archive_object_id: + description: The id of the archive object example: bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri type: string device_id: + description: The id of the device example: 12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF type: string gateway_url: + description: The gateway url to serve files and media example: http://127.0.0.1:31006 type: string home_object_id: + description: The id of the home object example: bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya type: string icon: + description: The icon of the space example: http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay type: string id: + description: The id of the space example: bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1 type: string local_storage_path: + description: The local storage path of the account example: /Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha type: string marketplace_workspace_id: + description: The id of the marketplace workspace example: _anytype_marketplace type: string name: - example: Space Name + description: The name of the space + example: My Space type: string network_id: + description: The network id of the space example: N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU type: string profile_object_id: + description: The id of the profile object example: bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4 type: string space_view_id: + description: The id of the space view example: bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy type: string tech_space_id: + description: The id of tech space, where objects outside of user's actual + spaces are stored, e.g. spaces itself example: bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1 type: string timezone: + description: The timezone of the account example: "" type: string type: + description: The type of the object example: space type: string widgets_id: + description: The id of the widgets example: bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva type: string workspace_object_id: + description: The id of the workspace object example: bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y type: string type: object diff --git a/core/api/internal/auth/model.go b/core/api/internal/auth/model.go index 2d34926f5..221797cd3 100644 --- a/core/api/internal/auth/model.go +++ b/core/api/internal/auth/model.go @@ -1,10 +1,10 @@ package auth type DisplayCodeResponse struct { - ChallengeId string `json:"challenge_id" example:"67647f5ecda913e9a2e11b26"` + ChallengeId string `json:"challenge_id" example:"67647f5ecda913e9a2e11b26"` // The challenge id associated with the displayed code and needed to solve the challenge for token } type TokenResponse struct { - SessionToken string `json:"session_token" example:"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII"` - AppKey string `json:"app_key" example:"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6="` + SessionToken string `json:"session_token" example:"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII"` // The ephemeral session token + AppKey string `json:"app_key" example:"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6="` // The permanent app key } diff --git a/core/api/internal/export/model.go b/core/api/internal/export/model.go index dde242246..e6541b62b 100644 --- a/core/api/internal/export/model.go +++ b/core/api/internal/export/model.go @@ -1,9 +1,9 @@ package export type ObjectExportRequest struct { - Path string `json:"path" example:"/path/to/export"` + Path string `json:"path" example:"/path/to/export"` // The path to export the object to } type ObjectExportResponse struct { - Path string `json:"path" example:"/path/to/export"` + Path string `json:"path" example:"/path/to/export"` // The path the object was exported to } diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index 70ba449aa..d59121491 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -1,93 +1,93 @@ package object type CreateObjectRequest struct { - Name string `json:"name" example:"Object Name"` - Icon string `json:"icon" example:"📄"` - Description string `json:"description" example:"Object Description"` - Body string `json:"body" example:"Object Body"` - Source string `json:"source" example:"https://source.com"` - TemplateId string `json:"template_id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` - ObjectTypeUniqueKey string `json:"object_type_unique_key" example:"ot-page"` + Name string `json:"name" example:"My object"` // The name of the object + Icon string `json:"icon" example:"📄"` // The icon of the object + Description string `json:"description" example:"This is a description of the object."` // The description of the object + Body string `json:"body" example:"This is the body of the object. Markdown syntax is supported here."` // The body of the object + Source string `json:"source" example:"https://bookmark-source.com"` // The source url, only applicable for bookmarks + TemplateId string `json:"template_id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` // The id of the template to use + ObjectTypeUniqueKey string `json:"object_type_unique_key" example:"ot-page"` // The unique key of the object type } type ObjectResponse struct { - Object Object `json:"object"` + Object Object `json:"object"` // The object } type Object struct { - Type string `json:"type" example:"Page"` - Id string `json:"id" example:"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ"` - Name string `json:"name" example:"Object Name"` - Icon string `json:"icon" example:"📄"` - Snippet string `json:"snippet" example:"The beginning of the object body..."` - Layout string `json:"layout" example:"basic"` - SpaceId string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` - RootId string `json:"root_id" example:"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u"` - Blocks []Block `json:"blocks"` - Details []Detail `json:"details"` + Type string `json:"type" example:"Page"` // The type of the object + Id string `json:"id" example:"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ"` // The id of the object + Name string `json:"name" example:"My object"` // The name of the object + Icon string `json:"icon" example:"📄"` // The icon of the object + Snippet string `json:"snippet" example:"The beginning of the object body..."` // The snippet of the object, especially important for notes as they don't have a name + Layout string `json:"layout" example:"basic"` // The layout of the object + SpaceId string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` // The id of the space the object is in + RootId string `json:"root_id" example:"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u"` // The id of the object's root + Blocks []Block `json:"blocks"` // The blocks of the object + Details []Detail `json:"details"` // The details of the object } type Block struct { - Id string `json:"id" example:"64394517de52ad5acb89c66c"` - ChildrenIds []string `json:"children_ids" example:"['6797ce8ecda913cde14b02dc']"` - BackgroundColor string `json:"background_color" example:"red"` - Align string `json:"align" enums:"AlignLeft,AlignCenter,AlignRight,AlignJustify" example:"AlignLeft"` - VerticalAlign string `json:"vertical_align" enums:"VerticalAlignTop,VerticalAlignMiddle,VerticalAlignBottom" example:"VerticalAlignTop"` - Text *Text `json:"text,omitempty"` - File *File `json:"file,omitempty"` + Id string `json:"id" example:"64394517de52ad5acb89c66c"` // The id of the block + ChildrenIds []string `json:"children_ids" example:"['6797ce8ecda913cde14b02dc']"` // The ids of the block's children + BackgroundColor string `json:"background_color" example:"red"` // The background color of the block + Align string `json:"align" enums:"AlignLeft,AlignCenter,AlignRight,AlignJustify" example:"AlignLeft"` // The alignment of the block + VerticalAlign string `json:"vertical_align" enums:"VerticalAlignTop,VerticalAlignMiddle,VerticalAlignBottom" example:"VerticalAlignTop"` // The vertical alignment of the block + Text *Text `json:"text,omitempty"` // The text of the block, if applicable + File *File `json:"file,omitempty"` // The file of the block, if applicable } type Text struct { - Text string `json:"text" example:"Some text"` - Style string `json:"style" enums:"Paragraph,Header1,Header2,Header3,Header4,Quote,Code,Title,Checkbox,Marked,Numbered,Toggle,Description,Callout" example:"Paragraph"` - Checked bool `json:"checked" example:"true"` - Color string `json:"color" example:"red"` - Icon string `json:"icon" example:"📄"` + Text string `json:"text" example:"Some text..."` // The text + Style string `json:"style" enums:"Paragraph,Header1,Header2,Header3,Header4,Quote,Code,Title,Checkbox,Marked,Numbered,Toggle,Description,Callout" example:"Paragraph"` // The style of the text + Checked bool `json:"checked" example:"true"` // Whether the text is checked + Color string `json:"color" example:"red"` // The color of the text + Icon string `json:"icon" example:"📄"` // The icon of the text } type File struct { - Hash string `json:"hash"` - Name string `json:"name"` - Type string `json:"type"` - Mime string `json:"mime"` - Size int `json:"size"` - AddedAt int `json:"added_at"` - TargetObjectId string `json:"target_object_id"` - State string `json:"state"` - Style string `json:"style"` + Hash string `json:"hash"` // The hash of the file + Name string `json:"name"` // The name of the file + Type string `json:"type"` // The type of the file + Mime string `json:"mime"` // The mime of the file + Size int `json:"size"` // The size of the file + AddedAt int `json:"added_at"` // The added at of the file + TargetObjectId string `json:"target_object_id"` // The target object id of the file + State string `json:"state"` // The state of the file + Style string `json:"style"` // The style of the file } type Detail struct { - Id string `json:"id" enums:"last_modified_date,last_modified_by,created_date,created_by,last_opened_date,tags" example:"last_modified_date"` - Details map[string]interface{} `json:"details"` + Id string `json:"id" enums:"last_modified_date,last_modified_by,created_date,created_by,last_opened_date,tags" example:"last_modified_date"` // The id of the detail + Details map[string]interface{} `json:"details"` // The details } type Tag struct { - Id string `json:"id" example:"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq"` - Name string `json:"name" example:"Tag Name"` - Color string `json:"color" example:"yellow"` + Id string `json:"id" example:"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq"` // The id of the tag + Name string `json:"name" example:"in-progress"` // The name of the tag + Color string `json:"color" example:"yellow"` // The color of the tag } type TypeResponse struct { - Type Type `json:"type"` + Type Type `json:"type"` // The type } type Type struct { - Type string `json:"type" example:"type"` - Id string `json:"id" example:"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu"` - UniqueKey string `json:"unique_key" example:"ot-page"` - Name string `json:"name" example:"Page"` - Icon string `json:"icon" example:"📄"` - RecommendedLayout string `json:"recommended_layout" example:"todo"` + Type string `json:"type" example:"type"` // The type of the object + Id string `json:"id" example:"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu"` // The id of the type + UniqueKey string `json:"unique_key" example:"ot-page"` // The unique key of the type + Name string `json:"name" example:"Page"` // The name of the type + Icon string `json:"icon" example:"📄"` // The icon of the type + RecommendedLayout string `json:"recommended_layout" example:"todo"` // The recommended layout of the type } type TemplateResponse struct { - Template Template `json:"template"` + Template Template `json:"template"` // The template } type Template struct { - Type string `json:"type" example:"template"` - Id string `json:"id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` - Name string `json:"name" example:"Template Name"` - Icon string `json:"icon" example:"📄"` + Type string `json:"type" example:"template"` // The type of the object + Id string `json:"id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` // The id of the template + Name string `json:"name" example:"My template"` // The name of the template + Icon string `json:"icon" example:"📄"` // The icon of the template } diff --git a/core/api/internal/object/service_test.go b/core/api/internal/object/service_test.go index 10ba7e1c4..5ae1f6ba2 100644 --- a/core/api/internal/object/service_test.go +++ b/core/api/internal/object/service_test.go @@ -390,7 +390,7 @@ func TestObjectService_CreateObject(t *testing.T) { bundle.RelationKeyOrigin.String(): pbtypes.Int64(int64(model.ObjectOrigin_api)), }, }, - TemplateId: "", + TemplateId: mockedTemplateId, SpaceId: mockedSpaceId, ObjectTypeUniqueKey: mockedObjectTypeUniqueKey, WithChat: false, @@ -483,10 +483,9 @@ func TestObjectService_CreateObject(t *testing.T) { // when object, err := fx.CreateObject(ctx, mockedSpaceId, CreateObjectRequest{ - Name: mockedObjectName, - Icon: mockedObjectIcon, - // TODO: use actual values - TemplateId: "", + Name: mockedObjectName, + Icon: mockedObjectIcon, + TemplateId: mockedTemplateId, ObjectTypeUniqueKey: mockedObjectTypeUniqueKey, }) diff --git a/core/api/internal/search/model.go b/core/api/internal/search/model.go index f52cf59e4..170933841 100644 --- a/core/api/internal/search/model.go +++ b/core/api/internal/search/model.go @@ -1,12 +1,12 @@ package search type SearchRequest struct { - Query string `json:"query"` - Types []string `json:"types"` - Sort SortOptions `json:"sort"` + Query string `json:"query" example:"test"` // The search term to look for in object names and snippets + Types []string `json:"types" example:"ot-note,ot-page,ot-678043f0cda9133be777049f,bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"` // The types of objects to search for, specified by unique key or ID + Sort SortOptions `json:"sort"` // The sorting criteria and direction for the search results } type SortOptions struct { - Direction string `json:"direction" enums:"asc,desc" default:"desc"` - Timestamp string `json:"timestamp" enums:"created_date,last_modified_date,last_opened_date" default:"last_modified_date"` + Direction string `json:"direction" enums:"asc,desc" default:"desc"` // The direction to sort the search results + Timestamp string `json:"timestamp" enums:"created_date,last_modified_date,last_opened_date" default:"last_modified_date"` // The timestamp to sort the search results by } diff --git a/core/api/internal/space/model.go b/core/api/internal/space/model.go index d13951c3f..73cbe732b 100644 --- a/core/api/internal/space/model.go +++ b/core/api/internal/space/model.go @@ -1,41 +1,41 @@ package space type CreateSpaceRequest struct { - Name string `json:"name" example:"New Space"` + Name string `json:"name" example:"New Space"` // The name of the space } type CreateSpaceResponse struct { - Space Space `json:"space"` + Space Space `json:"space"` // The created space } type Space struct { - Type string `json:"type" example:"space"` - Id string `json:"id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` - Name string `json:"name" example:"Space Name"` - Icon string `json:"icon" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay"` - HomeObjectId string `json:"home_object_id" example:"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya"` - ArchiveObjectId string `json:"archive_object_id" example:"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri"` - ProfileObjectId string `json:"profile_object_id" example:"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4"` - MarketplaceWorkspaceId string `json:"marketplace_workspace_id" example:"_anytype_marketplace"` - WorkspaceObjectId string `json:"workspace_object_id" example:"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y"` - DeviceId string `json:"device_id" example:"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF"` - AccountSpaceId string `json:"account_space_id" example:"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1"` - WidgetsId string `json:"widgets_id" example:"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva"` - SpaceViewId string `json:"space_view_id" example:"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy"` - TechSpaceId string `json:"tech_space_id" example:"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1"` - GatewayUrl string `json:"gateway_url" example:"http://127.0.0.1:31006"` - LocalStoragePath string `json:"local_storage_path" example:"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha"` - Timezone string `json:"timezone" example:""` - AnalyticsId string `json:"analytics_id" example:"624aecdd-4797-4611-9d61-a2ae5f53cf1c"` - NetworkId string `json:"network_id" example:"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU"` + Type string `json:"type" example:"space"` // The type of the object + Id string `json:"id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` // The id of the space + Name string `json:"name" example:"My Space"` // The name of the space + Icon string `json:"icon" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay"` // The icon of the space + HomeObjectId string `json:"home_object_id" example:"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya"` // The id of the home object + ArchiveObjectId string `json:"archive_object_id" example:"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri"` // The id of the archive object + ProfileObjectId string `json:"profile_object_id" example:"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4"` // The id of the profile object + MarketplaceWorkspaceId string `json:"marketplace_workspace_id" example:"_anytype_marketplace"` // The id of the marketplace workspace + WorkspaceObjectId string `json:"workspace_object_id" example:"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y"` // The id of the workspace object + DeviceId string `json:"device_id" example:"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF"` // The id of the device + AccountSpaceId string `json:"account_space_id" example:"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1"` // The id of the account space + WidgetsId string `json:"widgets_id" example:"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva"` // The id of the widgets + SpaceViewId string `json:"space_view_id" example:"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy"` // The id of the space view + TechSpaceId string `json:"tech_space_id" example:"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1"` // The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself + GatewayUrl string `json:"gateway_url" example:"http://127.0.0.1:31006"` // The gateway url to serve files and media + LocalStoragePath string `json:"local_storage_path" example:"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha"` // The local storage path of the account + Timezone string `json:"timezone" example:""` // The timezone of the account + AnalyticsId string `json:"analytics_id" example:"624aecdd-4797-4611-9d61-a2ae5f53cf1c"` // The analytics id of the account + NetworkId string `json:"network_id" example:"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU"` // The network id of the space } type Member struct { - Type string `json:"type" example:"member"` - Id string `json:"id" example:"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ"` - Name string `json:"name" example:"John Doe"` - Icon string `json:"icon" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100"` - Identity string `json:"identity" example:"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"` - GlobalName string `json:"global_name" example:"john.any"` - Role string `json:"role" enums:"Reader,Writer,Owner,NoPermission" example:"Owner"` + Type string `json:"type" example:"member"` // The type of the object + Id string `json:"id" example:"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ"` // The profile object id of the member + Name string `json:"name" example:"John Doe"` // The name of the member + Icon string `json:"icon" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100"` // The icon of the member + Identity string `json:"identity" example:"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"` // The identity of the member in the network + GlobalName string `json:"global_name" example:"john.any"` // The global name of the member in the network + Role string `json:"role" enums:"Reader,Writer,Owner,NoPermission" example:"Owner"` // The role of the member } diff --git a/core/api/pagination/model.go b/core/api/pagination/model.go index 06539ce63..3d679fec4 100644 --- a/core/api/pagination/model.go +++ b/core/api/pagination/model.go @@ -1,13 +1,13 @@ package pagination type PaginationMeta struct { - Total int `json:"total" example:"1024"` // the total number of items available on that endpoint - Offset int `json:"offset" example:"0"` // the current offset - Limit int `json:"limit" example:"100"` // the current limit - HasMore bool `json:"has_more" example:"true"` // whether there are more items available + Total int `json:"total" example:"1024"` // The total number of items available for the endpoint + Offset int `json:"offset" example:"0"` // The number of items skipped before starting to collect the result set + Limit int `json:"limit" example:"100"` // The maximum number of items returned in the result set + HasMore bool `json:"has_more" example:"true"` // Indicates if there are more items available beyond the current result set } type PaginatedResponse[T any] struct { - Data []T `json:"data"` - Pagination PaginationMeta `json:"pagination"` + Data []T `json:"data"` // The list of items in the current result set + Pagination PaginationMeta `json:"pagination"` // The pagination metadata for the response } From c7acd87e2b90c48e49caa24ee2fdee1104367a30 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 29 Jan 2025 15:08:08 +0100 Subject: [PATCH 002/132] GO-4459: Add swagger examples for errors --- core/api/docs/docs.go | 15 ++++++++----- core/api/docs/swagger.json | 15 ++++++++----- core/api/docs/swagger.yaml | 5 +++++ core/api/util/error.go | 46 +++++++++++++++++++++++--------------- 4 files changed, 53 insertions(+), 28 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 34e2a56f6..239cbb9d8 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -1704,7 +1704,8 @@ const docTemplate = `{ "type": "object", "properties": { "message": { - "type": "string" + "type": "string", + "example": "Forbidden" } } } @@ -1717,7 +1718,8 @@ const docTemplate = `{ "type": "object", "properties": { "message": { - "type": "string" + "type": "string", + "example": "Resource not found" } } } @@ -1730,7 +1732,8 @@ const docTemplate = `{ "type": "object", "properties": { "message": { - "type": "string" + "type": "string", + "example": "Internal server error" } } } @@ -1743,7 +1746,8 @@ const docTemplate = `{ "type": "object", "properties": { "message": { - "type": "string" + "type": "string", + "example": "Unauthorized" } } } @@ -1756,7 +1760,8 @@ const docTemplate = `{ "type": "object", "properties": { "message": { - "type": "string" + "type": "string", + "example": "Bad request" } } } diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index f5647435c..72c7919b2 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1698,7 +1698,8 @@ "type": "object", "properties": { "message": { - "type": "string" + "type": "string", + "example": "Forbidden" } } } @@ -1711,7 +1712,8 @@ "type": "object", "properties": { "message": { - "type": "string" + "type": "string", + "example": "Resource not found" } } } @@ -1724,7 +1726,8 @@ "type": "object", "properties": { "message": { - "type": "string" + "type": "string", + "example": "Internal server error" } } } @@ -1737,7 +1740,8 @@ "type": "object", "properties": { "message": { - "type": "string" + "type": "string", + "example": "Unauthorized" } } } @@ -1750,7 +1754,8 @@ "type": "object", "properties": { "message": { - "type": "string" + "type": "string", + "example": "Bad request" } } } diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index c9ba28757..fbbc53a88 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -555,6 +555,7 @@ definitions: error: properties: message: + example: Forbidden type: string type: object type: object @@ -563,6 +564,7 @@ definitions: error: properties: message: + example: Resource not found type: string type: object type: object @@ -571,6 +573,7 @@ definitions: error: properties: message: + example: Internal server error type: string type: object type: object @@ -579,6 +582,7 @@ definitions: error: properties: message: + example: Unauthorized type: string type: object type: object @@ -587,6 +591,7 @@ definitions: error: properties: message: + example: Bad request type: string type: object type: object diff --git a/core/api/util/error.go b/core/api/util/error.go index b7553f3fd..acec46041 100644 --- a/core/api/util/error.go +++ b/core/api/util/error.go @@ -5,38 +5,38 @@ import ( "net/http" ) -// 400 +// ValidationError is a struct for 400 errors type ValidationError struct { Error struct { - Message string `json:"message"` + Message string `json:"message" example:"Bad request"` } `json:"error"` } -// 401 +// UnauthorizedError is a struct for 401 errors type UnauthorizedError struct { Error struct { - Message string `json:"message"` + Message string `json:"message" example:"Unauthorized"` } `json:"error"` } -// 403 +// ForbiddenError is a struct for 403 errors type ForbiddenError struct { Error struct { - Message string `json:"message"` + Message string `json:"message" example:"Forbidden"` } `json:"error"` } -// 404 +// NotFoundError is a struct for 404 errors type NotFoundError struct { Error struct { - Message string `json:"message"` + Message string `json:"message" example:"Resource not found"` } `json:"error"` } -// 500 +// ServerError is a struct for 500 errors type ServerError struct { Error struct { - Message string `json:"message"` + Message string `json:"message" example:"Internal server error"` } `json:"error"` } @@ -72,10 +72,11 @@ func MapErrorCode(err error, mappings ...errCodeMapping) int { // for the given HTTP code, embedding the supplied message. func CodeToAPIError(code int, message string) any { switch code { - case http.StatusNotFound: - return NotFoundError{ + + case http.StatusBadRequest: + return ValidationError{ Error: struct { - Message string `json:"message"` + Message string `json:"message" example:"Bad request"` }{ Message: message, }, @@ -84,16 +85,25 @@ func CodeToAPIError(code int, message string) any { case http.StatusUnauthorized: return UnauthorizedError{ Error: struct { - Message string `json:"message"` + Message string `json:"message" example:"Unauthorized"` }{ Message: message, }, } - case http.StatusBadRequest: - return ValidationError{ + case http.StatusForbidden: + return ForbiddenError{ Error: struct { - Message string `json:"message"` + Message string `json:"message" example:"Forbidden"` + }{ + Message: message, + }, + } + + case http.StatusNotFound: + return NotFoundError{ + Error: struct { + Message string `json:"message" example:"Resource not found"` }{ Message: message, }, @@ -102,7 +112,7 @@ func CodeToAPIError(code int, message string) any { default: return ServerError{ Error: struct { - Message string `json:"message"` + Message string `json:"message" example:"Internal server error"` }{ Message: message, }, From cfbe6135e17b86c347649809b3d7508f10822ab5 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:50:54 +0100 Subject: [PATCH 003/132] GO-4459: Return proper api errors and 423 from middleware --- core/api/docs/docs.go | 32 +++++++++++++++++++++++++++++ core/api/docs/swagger.json | 32 +++++++++++++++++++++++++++++ core/api/docs/swagger.yaml | 21 +++++++++++++++++++ core/api/internal/object/handler.go | 2 ++ core/api/internal/space/handler.go | 1 + core/api/server/middleware.go | 16 ++++++++++----- core/api/util/error.go | 16 +++++++++++++++ 7 files changed, 115 insertions(+), 5 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 239cbb9d8..66823dff8 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -268,6 +268,12 @@ const docTemplate = `{ "$ref": "#/definitions/util.UnauthorizedError" } }, + "423": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/util.RateLimitError" + } + }, "500": { "description": "Internal server error", "schema": { @@ -440,6 +446,12 @@ const docTemplate = `{ "$ref": "#/definitions/util.UnauthorizedError" } }, + "423": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/util.RateLimitError" + } + }, "500": { "description": "Internal server error", "schema": { @@ -556,6 +568,12 @@ const docTemplate = `{ "$ref": "#/definitions/util.NotFoundError" } }, + "423": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/util.RateLimitError" + } + }, "500": { "description": "Internal server error", "schema": { @@ -1725,6 +1743,20 @@ const docTemplate = `{ } } }, + "util.RateLimitError": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "message": { + "type": "string", + "example": "Rate limit exceeded" + } + } + } + } + }, "util.ServerError": { "type": "object", "properties": { diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 72c7919b2..13034aae6 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -262,6 +262,12 @@ "$ref": "#/definitions/util.UnauthorizedError" } }, + "423": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/util.RateLimitError" + } + }, "500": { "description": "Internal server error", "schema": { @@ -434,6 +440,12 @@ "$ref": "#/definitions/util.UnauthorizedError" } }, + "423": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/util.RateLimitError" + } + }, "500": { "description": "Internal server error", "schema": { @@ -550,6 +562,12 @@ "$ref": "#/definitions/util.NotFoundError" } }, + "423": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/util.RateLimitError" + } + }, "500": { "description": "Internal server error", "schema": { @@ -1719,6 +1737,20 @@ } } }, + "util.RateLimitError": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "message": { + "type": "string", + "example": "Rate limit exceeded" + } + } + } + } + }, "util.ServerError": { "type": "object", "properties": { diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index fbbc53a88..29f3e2d8f 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -568,6 +568,15 @@ definitions: type: string type: object type: object + util.RateLimitError: + properties: + error: + properties: + message: + example: Rate limit exceeded + type: string + type: object + type: object util.ServerError: properties: error: @@ -775,6 +784,10 @@ paths: description: Unauthorized schema: $ref: '#/definitions/util.UnauthorizedError' + "423": + description: Rate limit exceeded + schema: + $ref: '#/definitions/util.RateLimitError' "500": description: Internal server error schema: @@ -892,6 +905,10 @@ paths: description: Unauthorized schema: $ref: '#/definitions/util.UnauthorizedError' + "423": + description: Rate limit exceeded + schema: + $ref: '#/definitions/util.RateLimitError' "500": description: Internal server error schema: @@ -933,6 +950,10 @@ paths: description: Resource not found schema: $ref: '#/definitions/util.NotFoundError' + "423": + description: Rate limit exceeded + schema: + $ref: '#/definitions/util.RateLimitError' "500": description: Internal server error schema: diff --git a/core/api/internal/object/handler.go b/core/api/internal/object/handler.go index 671f25583..57c1e2e87 100644 --- a/core/api/internal/object/handler.go +++ b/core/api/internal/object/handler.go @@ -91,6 +91,7 @@ func GetObjectHandler(s *ObjectService) gin.HandlerFunc { // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 403 {object} util.ForbiddenError "Forbidden" // @Failure 404 {object} util.NotFoundError "Resource not found" +// @Failure 423 {object} util.RateLimitError "Rate limit exceeded" // @Failure 500 {object} util.ServerError "Internal server error" // @Router /spaces/{space_id}/objects/{object_id} [delete] func DeleteObjectHandler(s *ObjectService) gin.HandlerFunc { @@ -126,6 +127,7 @@ func DeleteObjectHandler(s *ObjectService) gin.HandlerFunc { // @Success 200 {object} ObjectResponse "The created object" // @Failure 400 {object} util.ValidationError "Bad request" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 423 {object} util.RateLimitError "Rate limit exceeded" // @Failure 500 {object} util.ServerError "Internal server error" // @Router /spaces/{space_id}/objects [post] func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { diff --git a/core/api/internal/space/handler.go b/core/api/internal/space/handler.go index 2a6ca043d..962423a3e 100644 --- a/core/api/internal/space/handler.go +++ b/core/api/internal/space/handler.go @@ -52,6 +52,7 @@ func GetSpacesHandler(s *SpaceService) gin.HandlerFunc { // @Success 200 {object} CreateSpaceResponse "Space created successfully" // @Failure 400 {object} util.ValidationError "Bad request" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 423 {object} util.RateLimitError "Rate limit exceeded" // @Failure 500 {object} util.ServerError "Internal server error" // @Router /spaces [post] func CreateSpaceHandler(s *SpaceService) gin.HandlerFunc { diff --git a/core/api/server/middleware.go b/core/api/server/middleware.go index da05740b8..d2a2d23c9 100644 --- a/core/api/server/middleware.go +++ b/core/api/server/middleware.go @@ -11,6 +11,7 @@ import ( "github.com/gin-gonic/gin" "github.com/anyproto/anytype-heart/core/anytype/account" + "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service" ) @@ -26,7 +27,8 @@ func (s *Server) rateLimit(max float64) gin.HandlerFunc { return func(c *gin.Context) { httpError := tollbooth.LimitByRequest(lmt, c.Writer, c.Request) if httpError != nil { - c.AbortWithStatusJSON(httpError.StatusCode, gin.H{"error": httpError.Message}) + apiErr := util.CodeToAPIError(httpError.StatusCode, httpError.Message) + c.AbortWithStatusJSON(httpError.StatusCode, apiErr) return } c.Next() @@ -38,12 +40,14 @@ func (s *Server) ensureAuthenticated(mw service.ClientCommandsServer) gin.Handle return func(c *gin.Context) { authHeader := c.GetHeader("Authorization") if authHeader == "" { - c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Missing Authorization header"}) + apiErr := util.CodeToAPIError(http.StatusUnauthorized, "Missing Authorization header") + c.AbortWithStatusJSON(http.StatusUnauthorized, apiErr) return } if !strings.HasPrefix(authHeader, "Bearer ") { - c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Invalid Authorization header format"}) + apiErr := util.CodeToAPIError(http.StatusUnauthorized, "Invalid Authorization header format") + c.AbortWithStatusJSON(http.StatusUnauthorized, apiErr) return } key := strings.TrimPrefix(authHeader, "Bearer ") @@ -57,7 +61,8 @@ func (s *Server) ensureAuthenticated(mw service.ClientCommandsServer) gin.Handle if !exists { response := mw.WalletCreateSession(context.Background(), &pb.RpcWalletCreateSessionRequest{Auth: &pb.RpcWalletCreateSessionRequestAuthOfAppKey{AppKey: key}}) if response.Error.Code != pb.RpcWalletCreateSessionResponseError_NULL { - c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Invalid token"}) + apiErr := util.CodeToAPIError(http.StatusUnauthorized, "Invalid token") + c.AbortWithStatusJSON(http.StatusUnauthorized, apiErr) return } token = response.Token @@ -78,7 +83,8 @@ func (s *Server) ensureAccountInfo(accountService account.Service) gin.HandlerFu return func(c *gin.Context) { accInfo, err := accountService.GetInfo(context.Background()) if err != nil { - c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("failed to get account info: %v", err)}) + apiErr := util.CodeToAPIError(http.StatusInternalServerError, fmt.Sprintf("failed to get account info: %v", err)) + c.AbortWithStatusJSON(http.StatusInternalServerError, apiErr) return } diff --git a/core/api/util/error.go b/core/api/util/error.go index acec46041..77aeff751 100644 --- a/core/api/util/error.go +++ b/core/api/util/error.go @@ -33,6 +33,13 @@ type NotFoundError struct { } `json:"error"` } +// RateLimitError is a struct for 423 errors +type RateLimitError struct { + Error struct { + Message string `json:"message" example:"Rate limit exceeded"` + } `json:"error"` +} + // ServerError is a struct for 500 errors type ServerError struct { Error struct { @@ -109,6 +116,15 @@ func CodeToAPIError(code int, message string) any { }, } + case http.StatusTooManyRequests: + return RateLimitError{ + Error: struct { + Message string `json:"message" example:"Rate limit exceeded"` + }{ + Message: message, + }, + } + default: return ServerError{ Error: struct { From 86975463fdc2f5909f458b1c6f33a76c989b68d6 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 3 Feb 2025 16:24:56 +0100 Subject: [PATCH 004/132] GO-4459: Add last_modified sort criterion as fallback for last_opened sort --- core/api/internal/search/service.go | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/core/api/internal/search/service.go b/core/api/internal/search/service.go index 58c783ef3..ecd240871 100644 --- a/core/api/internal/search/service.go +++ b/core/api/internal/search/service.go @@ -48,7 +48,7 @@ func (s *SearchService) GlobalSearch(ctx context.Context, request SearchRequest, baseFilters := s.prepareBaseFilters() queryFilters := s.prepareQueryFilter(request.Query) sorts := s.prepareSorts(request.Sort) - dateToSortAfter := sorts.RelationKey + dateToSortAfter := sorts[0].RelationKey allResponses := make([]*pb.RpcObjectSearchResponse, 0, len(spaces)) for _, space := range spaces { @@ -59,7 +59,7 @@ func (s *SearchService) GlobalSearch(ctx context.Context, request SearchRequest, objResp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ SpaceId: space.Id, Filters: filters, - Sorts: []*model.BlockContentDataviewSort{sorts}, + Sorts: sorts, Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeySpaceId.String(), dateToSortAfter}, Limit: int32(offset + limit), // nolint: gosec }) @@ -91,7 +91,7 @@ func (s *SearchService) GlobalSearch(ctx context.Context, request SearchRequest, } // sort after posix last_modified_date to achieve descending sort order across all spaces - sort.Slice(combinedRecords, func(i, j int) bool { + sort.SliceStable(combinedRecords, func(i, j int) bool { return combinedRecords[i].DateToSortAfter > combinedRecords[j].DateToSortAfter }) @@ -118,12 +118,12 @@ func (s *SearchService) Search(ctx context.Context, spaceId string, request Sear filters := s.combineFilters(model.BlockContentDataviewFilter_And, baseFilters, queryFilters, typeFilters) sorts := s.prepareSorts(request.Sort) - dateToSortAfter := sorts.RelationKey + dateToSortAfter := sorts[0].RelationKey resp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: filters, - Sorts: []*model.BlockContentDataviewSort{sorts}, + Sorts: sorts, Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeySpaceId.String(), dateToSortAfter}, }) @@ -262,14 +262,28 @@ func (s *SearchService) prepareObjectTypeFilters(spaceId string, objectTypes []s } // prepareSorts returns a sort filter based on the given sort parameters -func (s *SearchService) prepareSorts(sort SortOptions) *model.BlockContentDataviewSort { - return &model.BlockContentDataviewSort{ +func (s *SearchService) prepareSorts(sort SortOptions) []*model.BlockContentDataviewSort { + primarySort := &model.BlockContentDataviewSort{ RelationKey: s.getSortRelationKey(sort.Timestamp), Type: s.getSortDirection(sort.Direction), Format: model.RelationFormat_date, IncludeTime: true, EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, } + + // last_opened_date possibly is empty, wherefore we sort by last_modified_date as secondary criterion + if primarySort.RelationKey == bundle.RelationKeyLastOpenedDate.String() { + secondarySort := &model.BlockContentDataviewSort{ + RelationKey: bundle.RelationKeyLastModifiedDate.String(), + Type: s.getSortDirection(sort.Direction), + Format: model.RelationFormat_date, + IncludeTime: true, + EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, + } + return []*model.BlockContentDataviewSort{primarySort, secondarySort} + } + + return []*model.BlockContentDataviewSort{primarySort} } // getSortRelationKey returns the relation key for the given sort timestamp From 6f238c480fb3b8556022275a44044d831d2904e0 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 3 Feb 2025 16:25:17 +0100 Subject: [PATCH 005/132] GO-4459: Add ANYTYPE_API_DEBUG to run config --- .run/Run.run.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/.run/Run.run.xml b/.run/Run.run.xml index 47b924fe5..78502fd86 100644 --- a/.run/Run.run.xml +++ b/.run/Run.run.xml @@ -9,6 +9,7 @@ + From e4fa847daee41b06d9101d5fcbbeeeef9102ef51 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 9 Feb 2025 18:32:21 +0100 Subject: [PATCH 006/132] GO-4459: Add endpoint for single space --- core/api/docs/docs.go | 77 ++++++++++++++++++++++++------ core/api/docs/swagger.json | 77 ++++++++++++++++++++++++------ core/api/docs/swagger.yaml | 48 +++++++++++++++---- core/api/internal/space/handler.go | 36 +++++++++++++- core/api/internal/space/model.go | 8 ++-- core/api/internal/space/service.go | 52 +++++++++++++++++--- core/api/server/router.go | 1 + 7 files changed, 250 insertions(+), 49 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 66823dff8..75a4a45c8 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -253,7 +253,7 @@ const docTemplate = `{ "200": { "description": "Space created successfully", "schema": { - "$ref": "#/definitions/space.CreateSpaceResponse" + "$ref": "#/definitions/space.SpaceResponse" } }, "400": { @@ -283,6 +283,55 @@ const docTemplate = `{ } } }, + "/spaces/{space_id}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "spaces" + ], + "summary": "Get space", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "Space", + "schema": { + "$ref": "#/definitions/space.SpaceResponse" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "404": { + "description": "Space not found", + "schema": { + "$ref": "#/definitions/util.NotFoundError" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + } + }, "/spaces/{space_id}/members": { "get": { "consumes": [ @@ -1556,19 +1605,6 @@ const docTemplate = `{ } } }, - "space.CreateSpaceResponse": { - "type": "object", - "properties": { - "space": { - "description": "The created space", - "allOf": [ - { - "$ref": "#/definitions/space.Space" - } - ] - } - } - }, "space.Member": { "type": "object", "properties": { @@ -1715,6 +1751,19 @@ const docTemplate = `{ } } }, + "space.SpaceResponse": { + "type": "object", + "properties": { + "space": { + "description": "The space", + "allOf": [ + { + "$ref": "#/definitions/space.Space" + } + ] + } + } + }, "util.ForbiddenError": { "type": "object", "properties": { diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 13034aae6..edc96b8e6 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -247,7 +247,7 @@ "200": { "description": "Space created successfully", "schema": { - "$ref": "#/definitions/space.CreateSpaceResponse" + "$ref": "#/definitions/space.SpaceResponse" } }, "400": { @@ -277,6 +277,55 @@ } } }, + "/spaces/{space_id}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "spaces" + ], + "summary": "Get space", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "Space", + "schema": { + "$ref": "#/definitions/space.SpaceResponse" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "404": { + "description": "Space not found", + "schema": { + "$ref": "#/definitions/util.NotFoundError" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + } + }, "/spaces/{space_id}/members": { "get": { "consumes": [ @@ -1550,19 +1599,6 @@ } } }, - "space.CreateSpaceResponse": { - "type": "object", - "properties": { - "space": { - "description": "The created space", - "allOf": [ - { - "$ref": "#/definitions/space.Space" - } - ] - } - } - }, "space.Member": { "type": "object", "properties": { @@ -1709,6 +1745,19 @@ } } }, + "space.SpaceResponse": { + "type": "object", + "properties": { + "space": { + "description": "The space", + "allOf": [ + { + "$ref": "#/definitions/space.Space" + } + ] + } + } + }, "util.ForbiddenError": { "type": "object", "properties": { diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 29f3e2d8f..5e5dd22fb 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -427,13 +427,6 @@ definitions: example: New Space type: string type: object - space.CreateSpaceResponse: - properties: - space: - allOf: - - $ref: '#/definitions/space.Space' - description: The created space - type: object space.Member: properties: global_name: @@ -550,6 +543,13 @@ definitions: example: bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y type: string type: object + space.SpaceResponse: + properties: + space: + allOf: + - $ref: '#/definitions/space.Space' + description: The space + type: object util.ForbiddenError: properties: error: @@ -775,7 +775,7 @@ paths: "200": description: Space created successfully schema: - $ref: '#/definitions/space.CreateSpaceResponse' + $ref: '#/definitions/space.SpaceResponse' "400": description: Bad request schema: @@ -795,6 +795,38 @@ paths: summary: Create space tags: - spaces + /spaces/{space_id}: + get: + consumes: + - application/json + parameters: + - description: Space ID + in: path + name: space_id + required: true + type: string + produces: + - application/json + responses: + "200": + description: Space + schema: + $ref: '#/definitions/space.SpaceResponse' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/util.UnauthorizedError' + "404": + description: Space not found + schema: + $ref: '#/definitions/util.NotFoundError' + "500": + description: Internal server error + schema: + $ref: '#/definitions/util.ServerError' + summary: Get space + tags: + - spaces /spaces/{space_id}/members: get: consumes: diff --git a/core/api/internal/space/handler.go b/core/api/internal/space/handler.go index 962423a3e..9aa63043c 100644 --- a/core/api/internal/space/handler.go +++ b/core/api/internal/space/handler.go @@ -42,6 +42,38 @@ func GetSpacesHandler(s *SpaceService) gin.HandlerFunc { } } +// GetSpaceHandler retrieves a space +// +// @Summary Get space +// @Tags spaces +// @Accept json +// @Produce json +// @Param space_id path string true "Space ID" +// @Success 200 {object} SpaceResponse "Space" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Space not found" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Router /spaces/{space_id} [get] +func GetSpaceHandler(s *SpaceService) gin.HandlerFunc { + return func(c *gin.Context) { + spaceId := c.Param("space_id") + + space, err := s.GetSpace(c.Request.Context(), spaceId) + code := util.MapErrorCode(err, + util.ErrToCode(ErrWorkspaceNotFound, http.StatusNotFound), + util.ErrToCode(ErrFailedOpenWorkspace, http.StatusInternalServerError), + ) + + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) + return + } + + c.JSON(http.StatusOK, SpaceResponse{Space: space}) + } +} + // CreateSpaceHandler creates a new space // // @Summary Create space @@ -49,7 +81,7 @@ func GetSpacesHandler(s *SpaceService) gin.HandlerFunc { // @Accept json // @Produce json // @Param name body CreateSpaceRequest true "Space to create" -// @Success 200 {object} CreateSpaceResponse "Space created successfully" +// @Success 200 {object} SpaceResponse "Space created successfully" // @Failure 400 {object} util.ValidationError "Bad request" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 423 {object} util.RateLimitError "Rate limit exceeded" @@ -75,7 +107,7 @@ func CreateSpaceHandler(s *SpaceService) gin.HandlerFunc { return } - c.JSON(http.StatusOK, CreateSpaceResponse{Space: space}) + c.JSON(http.StatusOK, SpaceResponse{Space: space}) } } diff --git a/core/api/internal/space/model.go b/core/api/internal/space/model.go index 73cbe732b..877978edc 100644 --- a/core/api/internal/space/model.go +++ b/core/api/internal/space/model.go @@ -1,13 +1,13 @@ package space +type SpaceResponse struct { + Space Space `json:"space"` // The space +} + type CreateSpaceRequest struct { Name string `json:"name" example:"New Space"` // The name of the space } -type CreateSpaceResponse struct { - Space Space `json:"space"` // The created space -} - type Space struct { Type string `json:"type" example:"space"` // The type of the object Id string `json:"id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` // The id of the space diff --git a/core/api/internal/space/service.go b/core/api/internal/space/service.go index 9a617b847..a997e43cc 100644 --- a/core/api/internal/space/service.go +++ b/core/api/internal/space/service.go @@ -20,6 +20,7 @@ import ( var ( ErrFailedListSpaces = errors.New("failed to retrieve list of spaces") ErrFailedOpenWorkspace = errors.New("failed to open workspace") + ErrWorkspaceNotFound = errors.New("workspace not found") ErrFailedGenerateRandomIcon = errors.New("failed to generate random icon") ErrFailedCreateSpace = errors.New("failed to create space") ErrFailedListMembers = errors.New("failed to retrieve list of members") @@ -27,6 +28,7 @@ var ( type Service interface { ListSpaces(ctx context.Context, offset int, limit int) ([]Space, int, bool, error) + GetSpace(ctx context.Context, spaceId string) (Space, error) CreateSpace(ctx context.Context, name string) (Space, error) ListMembers(ctx context.Context, spaceId string, offset int, limit int) ([]Member, int, bool, error) } @@ -78,21 +80,55 @@ func (s *SpaceService) ListSpaces(ctx context.Context, offset int, limit int) (s spaces = make([]Space, 0, len(paginatedRecords)) for _, record := range paginatedRecords { - workspace, err := s.getWorkspaceInfo(record.Fields[bundle.RelationKeyTargetSpaceId.String()].GetStringValue()) + name := record.Fields[bundle.RelationKeyName.String()].GetStringValue() + icon := util.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), record.Fields[bundle.RelationKeyIconImage.String()].GetStringValue()) + + workspace, err := s.getWorkspaceInfo(record.Fields[bundle.RelationKeyTargetSpaceId.String()].GetStringValue(), name, icon) if err != nil { return nil, 0, false, err } - // TODO: name and icon are only returned here; fix that - workspace.Name = record.Fields[bundle.RelationKeyName.String()].GetStringValue() - workspace.Icon = util.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), record.Fields[bundle.RelationKeyIconImage.String()].GetStringValue()) - spaces = append(spaces, workspace) } return spaces, total, hasMore, nil } +// GetSpace returns the space info for the space with the given ID. +func (s *SpaceService) GetSpace(ctx context.Context, spaceId string) (Space, error) { + // Check if the workspace exists and is active + resp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ + SpaceId: s.AccountInfo.TechSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyTargetSpaceId.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(spaceId), + }, + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeySpaceLocalStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), + }, + }, + Keys: []string{bundle.RelationKeyTargetSpaceId.String()}, + }) + + if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + return Space{}, ErrFailedOpenWorkspace + } + + if len(resp.Records) == 0 { + return Space{}, ErrWorkspaceNotFound + } + + name := resp.Records[0].Fields[bundle.RelationKeyName.String()].GetStringValue() + icon := util.GetIconFromEmojiOrImage(s.AccountInfo, resp.Records[0].Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), resp.Records[0].Fields[bundle.RelationKeyIconImage.String()].GetStringValue()) + return s.getWorkspaceInfo(spaceId, name, icon) +} + // CreateSpace creates a new space with the given name and returns the space info. func (s *SpaceService) CreateSpace(ctx context.Context, name string) (Space, error) { iconOption, err := rand.Int(rand.Reader, big.NewInt(13)) @@ -117,7 +153,7 @@ func (s *SpaceService) CreateSpace(ctx context.Context, name string) (Space, err return Space{}, ErrFailedCreateSpace } - return s.getWorkspaceInfo(resp.SpaceId) + return s.getWorkspaceInfo(resp.SpaceId, name, "") } // ListMembers returns a paginated list of members in the space with the given ID. @@ -210,7 +246,7 @@ func (s *SpaceService) GetParticipantDetails(mw service.ClientCommandsServer, sp } // getWorkspaceInfo returns the workspace info for the space with the given ID. -func (s *SpaceService) getWorkspaceInfo(spaceId string) (space Space, err error) { +func (s *SpaceService) getWorkspaceInfo(spaceId string, name string, icon string) (space Space, err error) { workspaceResponse := s.mw.WorkspaceOpen(context.Background(), &pb.RpcWorkspaceOpenRequest{ SpaceId: spaceId, WithChat: true, @@ -223,6 +259,8 @@ func (s *SpaceService) getWorkspaceInfo(spaceId string) (space Space, err error) return Space{ Type: "space", Id: spaceId, + Name: name, + Icon: icon, HomeObjectId: workspaceResponse.Info.HomeObjectId, ArchiveObjectId: workspaceResponse.Info.ArchiveObjectId, ProfileObjectId: workspaceResponse.Info.ProfileObjectId, diff --git a/core/api/server/router.go b/core/api/server/router.go index e33206a32..d0467e936 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -78,6 +78,7 @@ func (s *Server) NewRouter(accountService account.Service, mw service.ClientComm // Space v1.GET("/spaces", space.GetSpacesHandler(s.spaceService)) + v1.GET("/spaces/:space_id", space.GetSpaceHandler(s.spaceService)) v1.GET("/spaces/:space_id/members", space.GetMembersHandler(s.spaceService)) v1.POST("/spaces", s.rateLimit(maxWriteRequestsPerSecond), space.CreateSpaceHandler(s.spaceService)) From da5299019d9ced4e406d4341e43fe1ffec812736 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 9 Feb 2025 19:02:18 +0100 Subject: [PATCH 007/132] GO-4459: Add missing relation keys in GetSpace --- core/api/internal/space/service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/api/internal/space/service.go b/core/api/internal/space/service.go index a997e43cc..b9c27bb57 100644 --- a/core/api/internal/space/service.go +++ b/core/api/internal/space/service.go @@ -113,7 +113,7 @@ func (s *SpaceService) GetSpace(ctx context.Context, spaceId string) (Space, err Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), }, }, - Keys: []string{bundle.RelationKeyTargetSpaceId.String()}, + Keys: []string{bundle.RelationKeyTargetSpaceId.String(), bundle.RelationKeyName.String(), bundle.RelationKeyIconEmoji.String(), bundle.RelationKeyIconImage.String()}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { From 2010b1a2a37c3708b3782ce59e5ebc7ccc75e9a1 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 9 Feb 2025 19:31:07 +0100 Subject: [PATCH 008/132] GO-4459: Add endpoint for single member --- core/api/docs/docs.go | 69 +++++++++++++++++++++++++++++ core/api/docs/swagger.json | 69 +++++++++++++++++++++++++++++ core/api/docs/swagger.yaml | 44 ++++++++++++++++++ core/api/internal/object/service.go | 14 +++++- core/api/internal/space/handler.go | 34 ++++++++++++++ core/api/internal/space/model.go | 4 ++ core/api/internal/space/service.go | 16 ++++--- core/api/server/router.go | 1 + 8 files changed, 243 insertions(+), 8 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 75a4a45c8..79214ab94 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -390,6 +390,62 @@ const docTemplate = `{ } } }, + "/spaces/{space_id}/members/{member_id}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "spaces" + ], + "summary": "Get member", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Member ID", + "name": "member_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "Member", + "schema": { + "$ref": "#/definitions/space.MemberResponse" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "404": { + "description": "Member not found", + "schema": { + "$ref": "#/definitions/util.NotFoundError" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + } + }, "/spaces/{space_id}/objects": { "get": { "consumes": [ @@ -1651,6 +1707,19 @@ const docTemplate = `{ } } }, + "space.MemberResponse": { + "type": "object", + "properties": { + "member": { + "description": "The member", + "allOf": [ + { + "$ref": "#/definitions/space.Member" + } + ] + } + } + }, "space.Space": { "type": "object", "properties": { diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index edc96b8e6..7978d53c0 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -384,6 +384,62 @@ } } }, + "/spaces/{space_id}/members/{member_id}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "spaces" + ], + "summary": "Get member", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Member ID", + "name": "member_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "Member", + "schema": { + "$ref": "#/definitions/space.MemberResponse" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "404": { + "description": "Member not found", + "schema": { + "$ref": "#/definitions/util.NotFoundError" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + } + }, "/spaces/{space_id}/objects": { "get": { "consumes": [ @@ -1645,6 +1701,19 @@ } } }, + "space.MemberResponse": { + "type": "object", + "properties": { + "member": { + "description": "The member", + "allOf": [ + { + "$ref": "#/definitions/space.Member" + } + ] + } + } + }, "space.Space": { "type": "object", "properties": { diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 5e5dd22fb..1f1b9a769 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -463,6 +463,13 @@ definitions: example: member type: string type: object + space.MemberResponse: + properties: + member: + allOf: + - $ref: '#/definitions/space.Member' + description: The member + type: object space.Space: properties: account_space_id: @@ -867,6 +874,43 @@ paths: summary: List members tags: - spaces + /spaces/{space_id}/members/{member_id}: + get: + consumes: + - application/json + parameters: + - description: Space ID + in: path + name: space_id + required: true + type: string + - description: Member ID + in: path + name: member_id + required: true + type: string + produces: + - application/json + responses: + "200": + description: Member + schema: + $ref: '#/definitions/space.MemberResponse' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/util.UnauthorizedError' + "404": + description: Member not found + schema: + $ref: '#/definitions/util.NotFoundError' + "500": + description: Internal server error + schema: + $ref: '#/definitions/util.ServerError' + summary: Get member + tags: + - spaces /spaces/{space_id}/objects: get: consumes: diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 91efda7b2..284a588ad 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -447,6 +447,16 @@ func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { } } + memberLastModifiedBy, err := s.spaceService.GetMember(context.Background(), resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), lastModifiedById) + if err != nil { + memberLastModifiedBy = space.Member{} + } + + memberCreator, err := s.spaceService.GetMember(context.Background(), resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), creatorId) + if err != nil { + memberCreator = space.Member{} + } + return []Detail{ { Id: "last_modified_date", @@ -457,7 +467,7 @@ func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { { Id: "last_modified_by", Details: map[string]interface{}{ - "details": s.spaceService.GetParticipantDetails(s.mw, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), lastModifiedById), + "details": memberLastModifiedBy, }, }, { @@ -469,7 +479,7 @@ func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { { Id: "created_by", Details: map[string]interface{}{ - "details": s.spaceService.GetParticipantDetails(s.mw, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), creatorId), + "details": memberCreator, }, }, { diff --git a/core/api/internal/space/handler.go b/core/api/internal/space/handler.go index 9aa63043c..5dbbd2cd8 100644 --- a/core/api/internal/space/handler.go +++ b/core/api/internal/space/handler.go @@ -144,3 +144,37 @@ func GetMembersHandler(s *SpaceService) gin.HandlerFunc { pagination.RespondWithPagination(c, http.StatusOK, members, total, offset, limit, hasMore) } } + +// GetMemberHandler retrieves a member in a space +// +// @Summary Get member +// @Tags spaces +// @Accept json +// @Produce json +// @Param space_id path string true "Space ID" +// @Param member_id path string true "Member ID" +// @Success 200 {object} MemberResponse "Member" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Member not found" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Router /spaces/{space_id}/members/{member_id} [get] +func GetMemberHandler(s *SpaceService) gin.HandlerFunc { + return func(c *gin.Context) { + spaceId := c.Param("space_id") + memberId := c.Param("member_id") + + member, err := s.GetMember(c.Request.Context(), spaceId, memberId) + code := util.MapErrorCode(err, + util.ErrToCode(ErrMemberNotFound, http.StatusNotFound), + util.ErrToCode(ErrFailedGetMember, http.StatusInternalServerError), + ) + + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) + return + } + + c.JSON(http.StatusOK, MemberResponse{Member: member}) + } +} diff --git a/core/api/internal/space/model.go b/core/api/internal/space/model.go index 877978edc..6805de3cc 100644 --- a/core/api/internal/space/model.go +++ b/core/api/internal/space/model.go @@ -30,6 +30,10 @@ type Space struct { NetworkId string `json:"network_id" example:"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU"` // The network id of the space } +type MemberResponse struct { + Member Member `json:"member"` // The member +} + type Member struct { Type string `json:"type" example:"member"` // The type of the object Id string `json:"id" example:"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ"` // The profile object id of the member diff --git a/core/api/internal/space/service.go b/core/api/internal/space/service.go index b9c27bb57..eb83f636c 100644 --- a/core/api/internal/space/service.go +++ b/core/api/internal/space/service.go @@ -24,6 +24,8 @@ var ( ErrFailedGenerateRandomIcon = errors.New("failed to generate random icon") ErrFailedCreateSpace = errors.New("failed to create space") ErrFailedListMembers = errors.New("failed to retrieve list of members") + ErrFailedGetMember = errors.New("failed to retrieve member") + ErrMemberNotFound = errors.New("member not found") ) type Service interface { @@ -31,6 +33,7 @@ type Service interface { GetSpace(ctx context.Context, spaceId string) (Space, error) CreateSpace(ctx context.Context, name string) (Space, error) ListMembers(ctx context.Context, spaceId string, offset int, limit int) ([]Member, int, bool, error) + GetMember(ctx context.Context, spaceId string, memberId string) (Member, error) } type SpaceService struct { @@ -210,26 +213,27 @@ func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset i return members, total, hasMore, nil } -func (s *SpaceService) GetParticipantDetails(mw service.ClientCommandsServer, spaceId string, participantId string) Member { - resp := mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ +// GetMember returns the member with the given ID in the space with the given ID. +func (s *SpaceService) GetMember(ctx context.Context, spaceId string, memberId string) (Member, error) { + resp := s.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ { Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeyId.String(), Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(participantId), + Value: pbtypes.String(memberId), }, }, Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String(), bundle.RelationKeyIconEmoji.String(), bundle.RelationKeyIconImage.String(), bundle.RelationKeyIdentity.String(), bundle.RelationKeyGlobalName.String(), bundle.RelationKeyParticipantPermissions.String()}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { - return Member{} + return Member{}, ErrFailedGetMember } if len(resp.Records) == 0 { - return Member{} + return Member{}, ErrMemberNotFound } icon := util.GetIconFromEmojiOrImage(s.AccountInfo, "", resp.Records[0].Fields[bundle.RelationKeyIconImage.String()].GetStringValue()) @@ -242,7 +246,7 @@ func (s *SpaceService) GetParticipantDetails(mw service.ClientCommandsServer, sp Identity: resp.Records[0].Fields[bundle.RelationKeyIdentity.String()].GetStringValue(), GlobalName: resp.Records[0].Fields[bundle.RelationKeyGlobalName.String()].GetStringValue(), Role: model.ParticipantPermissions_name[int32(resp.Records[0].Fields[bundle.RelationKeyParticipantPermissions.String()].GetNumberValue())], - } + }, nil } // getWorkspaceInfo returns the workspace info for the space with the given ID. diff --git a/core/api/server/router.go b/core/api/server/router.go index d0467e936..ed1b00a99 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -80,6 +80,7 @@ func (s *Server) NewRouter(accountService account.Service, mw service.ClientComm v1.GET("/spaces", space.GetSpacesHandler(s.spaceService)) v1.GET("/spaces/:space_id", space.GetSpaceHandler(s.spaceService)) v1.GET("/spaces/:space_id/members", space.GetMembersHandler(s.spaceService)) + v1.GET("/spaces/:space_id/members/:member_id", space.GetMemberHandler(s.spaceService)) v1.POST("/spaces", s.rateLimit(maxWriteRequestsPerSecond), space.CreateSpaceHandler(s.spaceService)) // Type From 544d9488c7f8b4b7f42558348fb299e0bf1bc054 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 12 Feb 2025 12:17:47 +0100 Subject: [PATCH 009/132] GO-4459: Add handlers and routes for list endpoints --- core/api/docs/docs.go | 285 ++++++++++++++++++++++++++++ core/api/docs/swagger.json | 285 ++++++++++++++++++++++++++++ core/api/docs/swagger.yaml | 191 +++++++++++++++++++ core/api/internal/export/service.go | 3 +- core/api/internal/list/handler.go | 173 +++++++++++++++++ core/api/internal/list/service.go | 51 +++++ core/api/server/middleware.go | 1 - core/api/server/router.go | 7 + core/api/server/server.go | 3 + 9 files changed, 996 insertions(+), 3 deletions(-) create mode 100644 core/api/internal/list/handler.go create mode 100644 core/api/internal/list/service.go diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 79214ab94..8283877be 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -1063,6 +1063,291 @@ const docTemplate = `{ } } } + }, + "/v1/spaces/{space_id}/lists/{list_id}/objects": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "list" + ], + "summary": "Get objects in list", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "List ID", + "name": "list_id", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 0, + "description": "The number of items to skip before starting to collect the result set", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "description": "The number of items to return", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "List of objects", + "schema": { + "$ref": "#/definitions/pagination.PaginatedResponse-object_Object" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "404": { + "description": "Not found", + "schema": { + "$ref": "#/definitions/util.NotFoundError" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "list" + ], + "summary": "Add objects to list", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "List ID", + "name": "list_id", + "in": "path", + "required": true + }, + { + "description": "List of object IDs", + "name": "objects", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + ], + "responses": { + "200": { + "description": "Objects added successfully", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "#/definitions/util.ValidationError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "404": { + "description": "Not found", + "schema": { + "$ref": "#/definitions/util.NotFoundError" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + }, + "delete": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "list" + ], + "summary": "Remove objects from list", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "List ID", + "name": "list_id", + "in": "path", + "required": true + }, + { + "description": "List of object IDs", + "name": "objects", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + ], + "responses": { + "200": { + "description": "Objects removed successfully", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "#/definitions/util.ValidationError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "404": { + "description": "Not found", + "schema": { + "$ref": "#/definitions/util.NotFoundError" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "list" + ], + "summary": "Update object order in list", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "List ID", + "name": "list_id", + "in": "path", + "required": true + }, + { + "description": "List of object IDs", + "name": "objects", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + ], + "responses": { + "200": { + "description": "Objects updated successfully", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "#/definitions/util.ValidationError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "404": { + "description": "Not found", + "schema": { + "$ref": "#/definitions/util.NotFoundError" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + } } }, "definitions": { diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 7978d53c0..2de24feaf 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1057,6 +1057,291 @@ } } } + }, + "/v1/spaces/{space_id}/lists/{list_id}/objects": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "list" + ], + "summary": "Get objects in list", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "List ID", + "name": "list_id", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 0, + "description": "The number of items to skip before starting to collect the result set", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "description": "The number of items to return", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "List of objects", + "schema": { + "$ref": "#/definitions/pagination.PaginatedResponse-object_Object" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "404": { + "description": "Not found", + "schema": { + "$ref": "#/definitions/util.NotFoundError" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "list" + ], + "summary": "Add objects to list", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "List ID", + "name": "list_id", + "in": "path", + "required": true + }, + { + "description": "List of object IDs", + "name": "objects", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + ], + "responses": { + "200": { + "description": "Objects added successfully", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "#/definitions/util.ValidationError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "404": { + "description": "Not found", + "schema": { + "$ref": "#/definitions/util.NotFoundError" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + }, + "delete": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "list" + ], + "summary": "Remove objects from list", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "List ID", + "name": "list_id", + "in": "path", + "required": true + }, + { + "description": "List of object IDs", + "name": "objects", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + ], + "responses": { + "200": { + "description": "Objects removed successfully", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "#/definitions/util.ValidationError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "404": { + "description": "Not found", + "schema": { + "$ref": "#/definitions/util.NotFoundError" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "list" + ], + "summary": "Update object order in list", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "List ID", + "name": "list_id", + "in": "path", + "required": true + }, + { + "description": "List of object IDs", + "name": "objects", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + ], + "responses": { + "200": { + "description": "Objects updated successfully", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "#/definitions/util.ValidationError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "404": { + "description": "Not found", + "schema": { + "$ref": "#/definitions/util.NotFoundError" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + } } }, "definitions": { diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 1f1b9a769..61b43ac73 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -1328,6 +1328,197 @@ paths: summary: Get template tags: - types + /v1/spaces/{space_id}/lists/{list_id}/objects: + delete: + consumes: + - application/json + parameters: + - description: Space ID + in: path + name: space_id + required: true + type: string + - description: List ID + in: path + name: list_id + required: true + type: string + - description: List of object IDs + in: body + name: objects + required: true + schema: + items: + type: string + type: array + produces: + - application/json + responses: + "200": + description: Objects removed successfully + schema: + type: string + "400": + description: Bad request + schema: + $ref: '#/definitions/util.ValidationError' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/util.UnauthorizedError' + "404": + description: Not found + schema: + $ref: '#/definitions/util.NotFoundError' + "500": + description: Internal server error + schema: + $ref: '#/definitions/util.ServerError' + summary: Remove objects from list + tags: + - list + get: + consumes: + - application/json + parameters: + - description: Space ID + in: path + name: space_id + required: true + type: string + - description: List ID + in: path + name: list_id + required: true + type: string + - default: 0 + description: The number of items to skip before starting to collect the result + set + in: query + name: offset + type: integer + - description: The number of items to return + in: query + name: limit + type: integer + produces: + - application/json + responses: + "200": + description: List of objects + schema: + $ref: '#/definitions/pagination.PaginatedResponse-object_Object' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/util.UnauthorizedError' + "404": + description: Not found + schema: + $ref: '#/definitions/util.NotFoundError' + "500": + description: Internal server error + schema: + $ref: '#/definitions/util.ServerError' + summary: Get objects in list + tags: + - list + patch: + consumes: + - application/json + parameters: + - description: Space ID + in: path + name: space_id + required: true + type: string + - description: List ID + in: path + name: list_id + required: true + type: string + - description: List of object IDs + in: body + name: objects + required: true + schema: + items: + type: string + type: array + produces: + - application/json + responses: + "200": + description: Objects updated successfully + schema: + type: string + "400": + description: Bad request + schema: + $ref: '#/definitions/util.ValidationError' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/util.UnauthorizedError' + "404": + description: Not found + schema: + $ref: '#/definitions/util.NotFoundError' + "500": + description: Internal server error + schema: + $ref: '#/definitions/util.ServerError' + summary: Update object order in list + tags: + - list + post: + consumes: + - application/json + parameters: + - description: Space ID + in: path + name: space_id + required: true + type: string + - description: List ID + in: path + name: list_id + required: true + type: string + - description: List of object IDs + in: body + name: objects + required: true + schema: + items: + type: string + type: array + produces: + - application/json + responses: + "200": + description: Objects added successfully + schema: + type: string + "400": + description: Bad request + schema: + $ref: '#/definitions/util.ValidationError' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/util.UnauthorizedError' + "404": + description: Not found + schema: + $ref: '#/definitions/util.NotFoundError' + "500": + description: Internal server error + schema: + $ref: '#/definitions/util.ServerError' + summary: Add objects to list + tags: + - list securityDefinitions: BasicAuth: type: basic diff --git a/core/api/internal/export/service.go b/core/api/internal/export/service.go index b20361351..bcb4e4e33 100644 --- a/core/api/internal/export/service.go +++ b/core/api/internal/export/service.go @@ -19,8 +19,7 @@ type Service interface { } type ExportService struct { - mw service.ClientCommandsServer - AccountInfo *model.AccountInfo + mw service.ClientCommandsServer } func NewService(mw service.ClientCommandsServer) *ExportService { diff --git a/core/api/internal/list/handler.go b/core/api/internal/list/handler.go new file mode 100644 index 000000000..f7e6ad959 --- /dev/null +++ b/core/api/internal/list/handler.go @@ -0,0 +1,173 @@ +package list + +import ( + "net/http" + + "github.com/gin-gonic/gin" + + "github.com/anyproto/anytype-heart/core/api/pagination" + "github.com/anyproto/anytype-heart/core/api/util" +) + +// GetObjectsInListHandler +// +// @Summary Get objects in list +// @Tags list +// @Accept json +// @Produce json +// @Param space_id path string true "Space ID" +// @Param list_id path string true "List ID" +// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) +// @Param limit query int false "The number of items to return" +// @Success 200 {object} pagination.PaginatedResponse[object.Object] "List of objects" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Not found" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Router /v1/spaces/{space_id}/lists/{list_id}/objects [get] +func GetObjectsInListHandler(s *ListService) gin.HandlerFunc { + return func(c *gin.Context) { + spaceID := c.Param("space_id") + listID := c.Param("list_id") + offset := c.GetInt("offset") + limit := c.GetInt("limit") + + objects, total, hasMore, err := s.GetObjectsInList(c, spaceID, listID, offset, limit) + code := util.MapErrorCode(err, + util.ErrToCode(ErrFailedGetObjectsInList, http.StatusInternalServerError), + ) + + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) + return + } + + pagination.RespondWithPagination(c, http.StatusOK, objects, total, offset, limit, hasMore) + } +} + +// AddObjectsToListHandler +// +// @Summary Add objects to list +// @Tags list +// @Accept json +// @Produce json +// @Param space_id path string true "Space ID" +// @Param list_id path string true "List ID" +// @Param objects body []string true "List of object IDs" +// @Success 200 {object} string "Objects added successfully" +// @Failure 400 {object} util.ValidationError "Bad request" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Not found" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Router /v1/spaces/{space_id}/lists/{list_id}/objects [post] +func AddObjectsToListHandler(s *ListService) gin.HandlerFunc { + return func(c *gin.Context) { + spaceID := c.Param("space_id") + listID := c.Param("list_id") + + objects := []string{} + if err := c.ShouldBindJSON(&objects); err != nil { + apiErr := util.CodeToAPIError(http.StatusBadRequest, err.Error()) + c.JSON(http.StatusBadRequest, apiErr) + return + } + + err := s.AddObjectsToList(c, spaceID, listID, objects) + code := util.MapErrorCode(err, + util.ErrToCode(ErrFailedAddObjectsToList, http.StatusInternalServerError), + ) + + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) + return + } + + c.JSON(http.StatusOK, "Objects added successfully") + } +} + +// RemoveObjectsFromListHandler +// +// @Summary Remove objects from list +// @Tags list +// @Accept json +// @Produce json +// @Param space_id path string true "Space ID" +// @Param list_id path string true "List ID" +// @Param objects body []string true "List of object IDs" +// @Success 200 {object} string "Objects removed successfully" +// @Failure 400 {object} util.ValidationError "Bad request" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Not found" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Router /v1/spaces/{space_id}/lists/{list_id}/objects [delete] +func RemoveObjectsFromListHandler(s *ListService) gin.HandlerFunc { + return func(c *gin.Context) { + spaceID := c.Param("space_id") + listID := c.Param("list_id") + + objects := []string{} + if err := c.ShouldBindJSON(&objects); err != nil { + apiErr := util.CodeToAPIError(http.StatusBadRequest, err.Error()) + c.JSON(http.StatusBadRequest, apiErr) + return + } + + err := s.RemoveObjectsFromList(c, spaceID, listID, objects) + code := util.MapErrorCode(err, + util.ErrToCode(ErrFailedRemoveObjectsFromList, http.StatusInternalServerError), + ) + + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) + return + } + + c.JSON(http.StatusOK, "Objects removed successfully") + } +} + +// UpdateObjectsInListHandler +// +// @Summary Update object order in list +// @Tags list +// @Accept json +// @Produce json +// @Param space_id path string true "Space ID" +// @Param list_id path string true "List ID" +// @Param objects body []string true "List of object IDs" +// @Success 200 {object} string "Objects updated successfully" +// @Failure 400 {object} util.ValidationError "Bad request" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Not found" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Router /v1/spaces/{space_id}/lists/{list_id}/objects [patch] +func UpdateObjectsInListHandler(s *ListService) gin.HandlerFunc { + return func(c *gin.Context) { + spaceID := c.Param("space_id") + listID := c.Param("list_id") + + objects := []string{} + if err := c.ShouldBindJSON(&objects); err != nil { + apiErr := util.CodeToAPIError(http.StatusBadRequest, err.Error()) + c.JSON(http.StatusBadRequest, apiErr) + return + } + + err := s.UpdateObjectsInList(c, spaceID, listID, objects) + code := util.MapErrorCode(err, + util.ErrToCode(ErrFailedUpdateObjectsInList, http.StatusInternalServerError), + ) + + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) + return + } + + c.JSON(http.StatusOK, "Objects updated successfully") + } +} diff --git a/core/api/internal/list/service.go b/core/api/internal/list/service.go new file mode 100644 index 000000000..b55868718 --- /dev/null +++ b/core/api/internal/list/service.go @@ -0,0 +1,51 @@ +package list + +import ( + "context" + "errors" + + "github.com/anyproto/anytype-heart/pb/service" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" +) + +var ( + ErrFailedGetObjectsInList = errors.New("failed to get objects in list") + ErrFailedAddObjectsToList = errors.New("failed to add objects to list") + ErrFailedRemoveObjectsFromList = errors.New("failed to remove objects from list") + ErrFailedUpdateObjectsInList = errors.New("failed to update objects in list") +) + +type Service interface { + GetObjectsInList(ctx context.Context, spaceId string, listId string, offset, limit int) ([]*model.Object, int, bool, error) + AddObjectsToList(ctx context.Context, spaceId string, listId string, objectIDs []string) error + RemoveObjectsFromList(ctx context.Context, spaceId string, listId string, objectIDs []string) error + UpdateObjectsInList(ctx context.Context, spaceId string, listId string, objectIDs []string) error +} + +type ListService struct { + mw service.ClientCommandsServer +} + +func NewService(mw service.ClientCommandsServer) *ListService { + return &ListService{mw: mw} +} + +// GetObjectsInList retrieves objects in a list +func (s *ListService) GetObjectsInList(ctx context.Context, spaceId string, listId string, offset, limit int) ([]*model.Object, int, bool, error) { + return nil, 0, false, nil +} + +// AddObjectsToList adds objects to a list +func (s *ListService) AddObjectsToList(ctx context.Context, spaceId string, listId string, objectIDs []string) error { + return nil +} + +// RemoveObjectsFromList removes objects from a list +func (s *ListService) RemoveObjectsFromList(ctx context.Context, spaceId string, listId string, objectIDs []string) error { + return nil +} + +// UpdateObjectsInList updates an object in a list +func (s *ListService) UpdateObjectsInList(ctx context.Context, spaceId string, listId string, objectIDs []string) error { + return nil +} diff --git a/core/api/server/middleware.go b/core/api/server/middleware.go index d2a2d23c9..1313127f8 100644 --- a/core/api/server/middleware.go +++ b/core/api/server/middleware.go @@ -88,7 +88,6 @@ func (s *Server) ensureAccountInfo(accountService account.Service) gin.HandlerFu return } - s.exportService.AccountInfo = accInfo s.objectService.AccountInfo = accInfo s.spaceService.AccountInfo = accInfo s.searchService.AccountInfo = accInfo diff --git a/core/api/server/router.go b/core/api/server/router.go index ed1b00a99..f7aad0482 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -12,6 +12,7 @@ import ( "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/api/internal/auth" "github.com/anyproto/anytype-heart/core/api/internal/export" + "github.com/anyproto/anytype-heart/core/api/internal/list" "github.com/anyproto/anytype-heart/core/api/internal/object" "github.com/anyproto/anytype-heart/core/api/internal/search" "github.com/anyproto/anytype-heart/core/api/internal/space" @@ -66,6 +67,12 @@ func (s *Server) NewRouter(accountService account.Service, mw service.ClientComm // Export v1.POST("/spaces/:space_id/objects/:object_id/export/:format", export.GetObjectExportHandler(s.exportService)) + // List + v1.GET("/v1/spaces/:space_id/lists/:list_id/objects", list.GetObjectsInListHandler(s.listService)) + v1.POST("/v1/spaces/:space_id/lists/:list_id/objects", list.AddObjectsToListHandler(s.listService)) + v1.DELETE("/v1/spaces/:space_id/lists/:list_id/objects", list.RemoveObjectsFromListHandler(s.listService)) + v1.PATCH("/v1/spaces/:space_id/lists/:list_id/objects", list.UpdateObjectsInListHandler(s.listService)) + // Object v1.GET("/spaces/:space_id/objects", object.GetObjectsHandler(s.objectService)) v1.GET("/spaces/:space_id/objects/:object_id", object.GetObjectHandler(s.objectService)) diff --git a/core/api/server/server.go b/core/api/server/server.go index 78fb46793..56b312d69 100644 --- a/core/api/server/server.go +++ b/core/api/server/server.go @@ -8,6 +8,7 @@ import ( "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/api/internal/auth" "github.com/anyproto/anytype-heart/core/api/internal/export" + "github.com/anyproto/anytype-heart/core/api/internal/list" "github.com/anyproto/anytype-heart/core/api/internal/object" "github.com/anyproto/anytype-heart/core/api/internal/search" "github.com/anyproto/anytype-heart/core/api/internal/space" @@ -20,6 +21,7 @@ type Server struct { authService *auth.AuthService exportService *export.ExportService + listService *list.ListService objectService *object.ObjectService spaceService *space.SpaceService searchService *search.SearchService @@ -33,6 +35,7 @@ func NewServer(accountService account.Service, mw service.ClientCommandsServer) s := &Server{ authService: auth.NewService(mw), exportService: export.NewService(mw), + listService: list.NewService(mw), spaceService: space.NewService(mw), } From 526de3ccd31f407213316ab61867c3f0e39e186f Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 12 Feb 2025 15:47:05 +0100 Subject: [PATCH 010/132] GO-4459: Add initial list service implementation --- core/api/docs/docs.go | 8 +-- core/api/docs/swagger.json | 8 +-- core/api/docs/swagger.yaml | 8 +-- core/api/internal/list/handler.go | 32 ++++++------ core/api/internal/list/service.go | 85 +++++++++++++++++++++++++++---- core/api/server/server.go | 2 +- 6 files changed, 103 insertions(+), 40 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 8283877be..f158831eb 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -1073,7 +1073,7 @@ const docTemplate = `{ "application/json" ], "tags": [ - "list" + "lists" ], "summary": "Get objects in list", "parameters": [ @@ -1140,7 +1140,7 @@ const docTemplate = `{ "application/json" ], "tags": [ - "list" + "lists" ], "summary": "Add objects to list", "parameters": [ @@ -1212,7 +1212,7 @@ const docTemplate = `{ "application/json" ], "tags": [ - "list" + "lists" ], "summary": "Remove objects from list", "parameters": [ @@ -1284,7 +1284,7 @@ const docTemplate = `{ "application/json" ], "tags": [ - "list" + "lists" ], "summary": "Update object order in list", "parameters": [ diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 2de24feaf..0d063df11 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1067,7 +1067,7 @@ "application/json" ], "tags": [ - "list" + "lists" ], "summary": "Get objects in list", "parameters": [ @@ -1134,7 +1134,7 @@ "application/json" ], "tags": [ - "list" + "lists" ], "summary": "Add objects to list", "parameters": [ @@ -1206,7 +1206,7 @@ "application/json" ], "tags": [ - "list" + "lists" ], "summary": "Remove objects from list", "parameters": [ @@ -1278,7 +1278,7 @@ "application/json" ], "tags": [ - "list" + "lists" ], "summary": "Update object order in list", "parameters": [ diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 61b43ac73..5f31973fa 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -1376,7 +1376,7 @@ paths: $ref: '#/definitions/util.ServerError' summary: Remove objects from list tags: - - list + - lists get: consumes: - application/json @@ -1422,7 +1422,7 @@ paths: $ref: '#/definitions/util.ServerError' summary: Get objects in list tags: - - list + - lists patch: consumes: - application/json @@ -1470,7 +1470,7 @@ paths: $ref: '#/definitions/util.ServerError' summary: Update object order in list tags: - - list + - lists post: consumes: - application/json @@ -1518,7 +1518,7 @@ paths: $ref: '#/definitions/util.ServerError' summary: Add objects to list tags: - - list + - lists securityDefinitions: BasicAuth: type: basic diff --git a/core/api/internal/list/handler.go b/core/api/internal/list/handler.go index f7e6ad959..e1e7fbd75 100644 --- a/core/api/internal/list/handler.go +++ b/core/api/internal/list/handler.go @@ -12,7 +12,7 @@ import ( // GetObjectsInListHandler // // @Summary Get objects in list -// @Tags list +// @Tags lists // @Accept json // @Produce json // @Param space_id path string true "Space ID" @@ -26,12 +26,12 @@ import ( // @Router /v1/spaces/{space_id}/lists/{list_id}/objects [get] func GetObjectsInListHandler(s *ListService) gin.HandlerFunc { return func(c *gin.Context) { - spaceID := c.Param("space_id") - listID := c.Param("list_id") + spaceId := c.Param("space_id") + listId := c.Param("list_id") offset := c.GetInt("offset") limit := c.GetInt("limit") - objects, total, hasMore, err := s.GetObjectsInList(c, spaceID, listID, offset, limit) + objects, total, hasMore, err := s.GetObjectsInList(c, spaceId, listId, offset, limit) code := util.MapErrorCode(err, util.ErrToCode(ErrFailedGetObjectsInList, http.StatusInternalServerError), ) @@ -49,7 +49,7 @@ func GetObjectsInListHandler(s *ListService) gin.HandlerFunc { // AddObjectsToListHandler // // @Summary Add objects to list -// @Tags list +// @Tags lists // @Accept json // @Produce json // @Param space_id path string true "Space ID" @@ -63,8 +63,8 @@ func GetObjectsInListHandler(s *ListService) gin.HandlerFunc { // @Router /v1/spaces/{space_id}/lists/{list_id}/objects [post] func AddObjectsToListHandler(s *ListService) gin.HandlerFunc { return func(c *gin.Context) { - spaceID := c.Param("space_id") - listID := c.Param("list_id") + spaceId := c.Param("space_id") + listId := c.Param("list_id") objects := []string{} if err := c.ShouldBindJSON(&objects); err != nil { @@ -73,7 +73,7 @@ func AddObjectsToListHandler(s *ListService) gin.HandlerFunc { return } - err := s.AddObjectsToList(c, spaceID, listID, objects) + err := s.AddObjectsToList(c, spaceId, listId, objects) code := util.MapErrorCode(err, util.ErrToCode(ErrFailedAddObjectsToList, http.StatusInternalServerError), ) @@ -91,7 +91,7 @@ func AddObjectsToListHandler(s *ListService) gin.HandlerFunc { // RemoveObjectsFromListHandler // // @Summary Remove objects from list -// @Tags list +// @Tags lists // @Accept json // @Produce json // @Param space_id path string true "Space ID" @@ -105,8 +105,8 @@ func AddObjectsToListHandler(s *ListService) gin.HandlerFunc { // @Router /v1/spaces/{space_id}/lists/{list_id}/objects [delete] func RemoveObjectsFromListHandler(s *ListService) gin.HandlerFunc { return func(c *gin.Context) { - spaceID := c.Param("space_id") - listID := c.Param("list_id") + spaceId := c.Param("space_id") + listId := c.Param("list_id") objects := []string{} if err := c.ShouldBindJSON(&objects); err != nil { @@ -115,7 +115,7 @@ func RemoveObjectsFromListHandler(s *ListService) gin.HandlerFunc { return } - err := s.RemoveObjectsFromList(c, spaceID, listID, objects) + err := s.RemoveObjectsFromList(c, spaceId, listId, objects) code := util.MapErrorCode(err, util.ErrToCode(ErrFailedRemoveObjectsFromList, http.StatusInternalServerError), ) @@ -133,7 +133,7 @@ func RemoveObjectsFromListHandler(s *ListService) gin.HandlerFunc { // UpdateObjectsInListHandler // // @Summary Update object order in list -// @Tags list +// @Tags lists // @Accept json // @Produce json // @Param space_id path string true "Space ID" @@ -147,8 +147,8 @@ func RemoveObjectsFromListHandler(s *ListService) gin.HandlerFunc { // @Router /v1/spaces/{space_id}/lists/{list_id}/objects [patch] func UpdateObjectsInListHandler(s *ListService) gin.HandlerFunc { return func(c *gin.Context) { - spaceID := c.Param("space_id") - listID := c.Param("list_id") + spaceId := c.Param("space_id") + listId := c.Param("list_id") objects := []string{} if err := c.ShouldBindJSON(&objects); err != nil { @@ -157,7 +157,7 @@ func UpdateObjectsInListHandler(s *ListService) gin.HandlerFunc { return } - err := s.UpdateObjectsInList(c, spaceID, listID, objects) + err := s.UpdateObjectsInList(c, spaceId, listId, objects) code := util.MapErrorCode(err, util.ErrToCode(ErrFailedUpdateObjectsInList, http.StatusInternalServerError), ) diff --git a/core/api/internal/list/service.go b/core/api/internal/list/service.go index b55868718..943035c44 100644 --- a/core/api/internal/list/service.go +++ b/core/api/internal/list/service.go @@ -4,7 +4,11 @@ import ( "context" "errors" + "github.com/anyproto/anytype-heart/core/api/internal/object" + "github.com/anyproto/anytype-heart/core/api/pagination" + "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service" + "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) @@ -17,35 +21,94 @@ var ( type Service interface { GetObjectsInList(ctx context.Context, spaceId string, listId string, offset, limit int) ([]*model.Object, int, bool, error) - AddObjectsToList(ctx context.Context, spaceId string, listId string, objectIDs []string) error - RemoveObjectsFromList(ctx context.Context, spaceId string, listId string, objectIDs []string) error - UpdateObjectsInList(ctx context.Context, spaceId string, listId string, objectIDs []string) error + AddObjectsToList(ctx context.Context, spaceId string, listId string, objectIds []string) error + RemoveObjectsFromList(ctx context.Context, spaceId string, listId string, objectIds []string) error + UpdateObjectsInList(ctx context.Context, spaceId string, listId string, objectIds []string) error } type ListService struct { - mw service.ClientCommandsServer + mw service.ClientCommandsServer + objectService *object.ObjectService } -func NewService(mw service.ClientCommandsServer) *ListService { - return &ListService{mw: mw} +func NewService(mw service.ClientCommandsServer, objectService *object.ObjectService) *ListService { + return &ListService{mw: mw, objectService: objectService} } // GetObjectsInList retrieves objects in a list -func (s *ListService) GetObjectsInList(ctx context.Context, spaceId string, listId string, offset, limit int) ([]*model.Object, int, bool, error) { - return nil, 0, false, nil +func (s *ListService) GetObjectsInList(ctx context.Context, spaceId string, listId string, offset, limit int) ([]object.Object, int, bool, error) { + resp := s.mw.ObjectSearchSubscribe(ctx, &pb.RpcObjectSearchSubscribeRequest{ + SpaceId: spaceId, + Limit: int64(limit), // nolint: gosec + Offset: int64(offset), // nolint: gosec + Keys: []string{bundle.RelationKeyId.String()}, + CollectionId: listId, + }) + + if resp.Error.Code != pb.RpcObjectSearchSubscribeResponseError_NULL { + return nil, 0, false, ErrFailedGetObjectsInList + } + + total := int(resp.Counters.Total) + paginatedRecords, hasMore := pagination.Paginate(resp.Records, offset, limit) + + objects := make([]object.Object, 0, len(paginatedRecords)) + for _, record := range paginatedRecords { + object, err := s.objectService.GetObject(ctx, spaceId, record.Fields[bundle.RelationKeyId.String()].GetStringValue()) + if err != nil { + return nil, 0, false, err + } + objects = append(objects, object) + } + + return objects, total, hasMore, nil } // AddObjectsToList adds objects to a list -func (s *ListService) AddObjectsToList(ctx context.Context, spaceId string, listId string, objectIDs []string) error { +func (s *ListService) AddObjectsToList(ctx context.Context, spaceId string, listId string, objectIds []string) error { + resp := s.mw.ObjectCollectionAdd(ctx, &pb.RpcObjectCollectionAddRequest{ + ContextId: listId, + ObjectIds: objectIds, + }) + + if resp.Error.Code != pb.RpcObjectCollectionAddResponseError_NULL { + return ErrFailedAddObjectsToList + } + return nil } // RemoveObjectsFromList removes objects from a list -func (s *ListService) RemoveObjectsFromList(ctx context.Context, spaceId string, listId string, objectIDs []string) error { +func (s *ListService) RemoveObjectsFromList(ctx context.Context, spaceId string, listId string, objectIds []string) error { + resp := s.mw.ObjectCollectionRemove(ctx, &pb.RpcObjectCollectionRemoveRequest{ + ContextId: spaceId, + ObjectIds: objectIds, + }) + + if resp.Error.Code != pb.RpcObjectCollectionRemoveResponseError_NULL { + return ErrFailedRemoveObjectsFromList + } + return nil } // UpdateObjectsInList updates an object in a list -func (s *ListService) UpdateObjectsInList(ctx context.Context, spaceId string, listId string, objectIDs []string) error { +func (s *ListService) UpdateObjectsInList(ctx context.Context, spaceId string, listId string, objectIds []string) error { + resp := s.mw.BlockDataviewObjectOrderUpdate(ctx, &pb.RpcBlockDataviewObjectOrderUpdateRequest{ + ContextId: listId, + BlockId: "dataview", + ObjectOrders: []*model.BlockContentDataviewObjectOrder{ + { + ViewId: "", // TODO: handle viewId + GroupId: "", + ObjectIds: objectIds, + }, + }, + }) + + if resp.Error.Code != pb.RpcBlockDataviewObjectOrderUpdateResponseError_NULL { + return ErrFailedUpdateObjectsInList + } + return nil } diff --git a/core/api/server/server.go b/core/api/server/server.go index 56b312d69..f38dc6c7e 100644 --- a/core/api/server/server.go +++ b/core/api/server/server.go @@ -35,11 +35,11 @@ func NewServer(accountService account.Service, mw service.ClientCommandsServer) s := &Server{ authService: auth.NewService(mw), exportService: export.NewService(mw), - listService: list.NewService(mw), spaceService: space.NewService(mw), } s.objectService = object.NewService(mw, s.spaceService) + s.listService = list.NewService(mw, s.objectService) s.searchService = search.NewService(mw, s.spaceService, s.objectService) s.engine = s.NewRouter(accountService, mw) s.KeyToToken = make(map[string]string) From 44b1bcc1da15e4b40f87cc92f32534cb24ab9717 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 12 Feb 2025 15:47:16 +0100 Subject: [PATCH 011/132] GO-4459: Fix v1 route path for lists --- core/api/server/router.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/api/server/router.go b/core/api/server/router.go index f7aad0482..23d094bbb 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -68,10 +68,10 @@ func (s *Server) NewRouter(accountService account.Service, mw service.ClientComm v1.POST("/spaces/:space_id/objects/:object_id/export/:format", export.GetObjectExportHandler(s.exportService)) // List - v1.GET("/v1/spaces/:space_id/lists/:list_id/objects", list.GetObjectsInListHandler(s.listService)) - v1.POST("/v1/spaces/:space_id/lists/:list_id/objects", list.AddObjectsToListHandler(s.listService)) - v1.DELETE("/v1/spaces/:space_id/lists/:list_id/objects", list.RemoveObjectsFromListHandler(s.listService)) - v1.PATCH("/v1/spaces/:space_id/lists/:list_id/objects", list.UpdateObjectsInListHandler(s.listService)) + v1.GET("/spaces/:space_id/lists/:list_id/objects", list.GetObjectsInListHandler(s.listService)) + v1.POST("/spaces/:space_id/lists/:list_id/objects", list.AddObjectsToListHandler(s.listService)) + v1.DELETE("/spaces/:space_id/lists/:list_id/objects", list.RemoveObjectsFromListHandler(s.listService)) + v1.PATCH("/spaces/:space_id/lists/:list_id/objects", list.UpdateObjectsInListHandler(s.listService)) // Object v1.GET("/spaces/:space_id/objects", object.GetObjectsHandler(s.objectService)) From fd62a2571e39fb5b1c984868cecafb2f83648bf5 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 14 Feb 2025 16:04:56 +0100 Subject: [PATCH 012/132] GO-4459: Fix ObjectSearchSubscribe panic --- core/api/internal/list/service.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/api/internal/list/service.go b/core/api/internal/list/service.go index 943035c44..42be2f2f3 100644 --- a/core/api/internal/list/service.go +++ b/core/api/internal/list/service.go @@ -45,7 +45,8 @@ func (s *ListService) GetObjectsInList(ctx context.Context, spaceId string, list CollectionId: listId, }) - if resp.Error.Code != pb.RpcObjectSearchSubscribeResponseError_NULL { + // TODO: returned error from ObjectSearchSubscribe is inconsistent with other RPCs: Error is nil instead of Code being NULL + if resp.Error != nil && resp.Error.Code != pb.RpcObjectSearchSubscribeResponseError_NULL { return nil, 0, false, ErrFailedGetObjectsInList } From dcb8a992f1e58bc20b29bfd4fc7a8fecc369c1b7 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 14 Feb 2025 16:10:48 +0100 Subject: [PATCH 013/132] GO-4459: Remove UpdateObjectsInList handler and route --- core/api/docs/docs.go | 72 ------------------------------- core/api/docs/swagger.json | 72 ------------------------------- core/api/docs/swagger.yaml | 48 --------------------- core/api/internal/list/handler.go | 42 ------------------ core/api/internal/list/service.go | 26 +---------- core/api/server/router.go | 1 - 6 files changed, 1 insertion(+), 260 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index f158831eb..bc7016d05 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -1275,78 +1275,6 @@ const docTemplate = `{ } } } - }, - "patch": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "lists" - ], - "summary": "Update object order in list", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "List ID", - "name": "list_id", - "in": "path", - "required": true - }, - { - "description": "List of object IDs", - "name": "objects", - "in": "body", - "required": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - ], - "responses": { - "200": { - "description": "Objects updated successfully", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/util.ValidationError" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "404": { - "description": "Not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } } } }, diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 0d063df11..d8ba3d146 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1269,78 +1269,6 @@ } } } - }, - "patch": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "lists" - ], - "summary": "Update object order in list", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "List ID", - "name": "list_id", - "in": "path", - "required": true - }, - { - "description": "List of object IDs", - "name": "objects", - "in": "body", - "required": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - ], - "responses": { - "200": { - "description": "Objects updated successfully", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/util.ValidationError" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "404": { - "description": "Not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } } } }, diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 5f31973fa..46c1110f7 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -1423,54 +1423,6 @@ paths: summary: Get objects in list tags: - lists - patch: - consumes: - - application/json - parameters: - - description: Space ID - in: path - name: space_id - required: true - type: string - - description: List ID - in: path - name: list_id - required: true - type: string - - description: List of object IDs - in: body - name: objects - required: true - schema: - items: - type: string - type: array - produces: - - application/json - responses: - "200": - description: Objects updated successfully - schema: - type: string - "400": - description: Bad request - schema: - $ref: '#/definitions/util.ValidationError' - "401": - description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' - "404": - description: Not found - schema: - $ref: '#/definitions/util.NotFoundError' - "500": - description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' - summary: Update object order in list - tags: - - lists post: consumes: - application/json diff --git a/core/api/internal/list/handler.go b/core/api/internal/list/handler.go index e1e7fbd75..0830390f5 100644 --- a/core/api/internal/list/handler.go +++ b/core/api/internal/list/handler.go @@ -129,45 +129,3 @@ func RemoveObjectsFromListHandler(s *ListService) gin.HandlerFunc { c.JSON(http.StatusOK, "Objects removed successfully") } } - -// UpdateObjectsInListHandler -// -// @Summary Update object order in list -// @Tags lists -// @Accept json -// @Produce json -// @Param space_id path string true "Space ID" -// @Param list_id path string true "List ID" -// @Param objects body []string true "List of object IDs" -// @Success 200 {object} string "Objects updated successfully" -// @Failure 400 {object} util.ValidationError "Bad request" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 404 {object} util.NotFoundError "Not found" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Router /v1/spaces/{space_id}/lists/{list_id}/objects [patch] -func UpdateObjectsInListHandler(s *ListService) gin.HandlerFunc { - return func(c *gin.Context) { - spaceId := c.Param("space_id") - listId := c.Param("list_id") - - objects := []string{} - if err := c.ShouldBindJSON(&objects); err != nil { - apiErr := util.CodeToAPIError(http.StatusBadRequest, err.Error()) - c.JSON(http.StatusBadRequest, apiErr) - return - } - - err := s.UpdateObjectsInList(c, spaceId, listId, objects) - code := util.MapErrorCode(err, - util.ErrToCode(ErrFailedUpdateObjectsInList, http.StatusInternalServerError), - ) - - if code != http.StatusOK { - apiErr := util.CodeToAPIError(code, err.Error()) - c.JSON(code, apiErr) - return - } - - c.JSON(http.StatusOK, "Objects updated successfully") - } -} diff --git a/core/api/internal/list/service.go b/core/api/internal/list/service.go index 42be2f2f3..625e56050 100644 --- a/core/api/internal/list/service.go +++ b/core/api/internal/list/service.go @@ -9,21 +9,18 @@ import ( "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" - "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) var ( ErrFailedGetObjectsInList = errors.New("failed to get objects in list") ErrFailedAddObjectsToList = errors.New("failed to add objects to list") ErrFailedRemoveObjectsFromList = errors.New("failed to remove objects from list") - ErrFailedUpdateObjectsInList = errors.New("failed to update objects in list") ) type Service interface { - GetObjectsInList(ctx context.Context, spaceId string, listId string, offset, limit int) ([]*model.Object, int, bool, error) + GetObjectsInList(ctx context.Context, spaceId string, listId string, offset, limit int) ([]object.Object, int, bool, error) AddObjectsToList(ctx context.Context, spaceId string, listId string, objectIds []string) error RemoveObjectsFromList(ctx context.Context, spaceId string, listId string, objectIds []string) error - UpdateObjectsInList(ctx context.Context, spaceId string, listId string, objectIds []string) error } type ListService struct { @@ -92,24 +89,3 @@ func (s *ListService) RemoveObjectsFromList(ctx context.Context, spaceId string, return nil } - -// UpdateObjectsInList updates an object in a list -func (s *ListService) UpdateObjectsInList(ctx context.Context, spaceId string, listId string, objectIds []string) error { - resp := s.mw.BlockDataviewObjectOrderUpdate(ctx, &pb.RpcBlockDataviewObjectOrderUpdateRequest{ - ContextId: listId, - BlockId: "dataview", - ObjectOrders: []*model.BlockContentDataviewObjectOrder{ - { - ViewId: "", // TODO: handle viewId - GroupId: "", - ObjectIds: objectIds, - }, - }, - }) - - if resp.Error.Code != pb.RpcBlockDataviewObjectOrderUpdateResponseError_NULL { - return ErrFailedUpdateObjectsInList - } - - return nil -} diff --git a/core/api/server/router.go b/core/api/server/router.go index 23d094bbb..6bc017411 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -71,7 +71,6 @@ func (s *Server) NewRouter(accountService account.Service, mw service.ClientComm v1.GET("/spaces/:space_id/lists/:list_id/objects", list.GetObjectsInListHandler(s.listService)) v1.POST("/spaces/:space_id/lists/:list_id/objects", list.AddObjectsToListHandler(s.listService)) v1.DELETE("/spaces/:space_id/lists/:list_id/objects", list.RemoveObjectsFromListHandler(s.listService)) - v1.PATCH("/spaces/:space_id/lists/:list_id/objects", list.UpdateObjectsInListHandler(s.listService)) // Object v1.GET("/spaces/:space_id/objects", object.GetObjectsHandler(s.objectService)) From cd836a670f17f8979fb7c5af586c6e1a86ae38b2 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 14 Feb 2025 16:29:28 +0100 Subject: [PATCH 014/132] GO-4459: Return 404 for deleted object --- core/api/internal/object/service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 284a588ad..3a51a343f 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -117,7 +117,7 @@ func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId ObjectId: objectId, }) - if resp.Error.Code == pb.RpcObjectShowResponseError_NOT_FOUND { + if resp.Error.Code == pb.RpcObjectShowResponseError_NOT_FOUND || resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIsArchived.String()].GetBoolValue() { return Object{}, ErrObjectNotFound } From 40349517bc7a23b3134dd9b7deac48378d707dbe Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 14 Feb 2025 17:21:47 +0100 Subject: [PATCH 015/132] GO-4459: Refactor data models to include 'object' property and return entire type for object --- core/api/docs/docs.go | 46 ++++---- core/api/docs/swagger.json | 46 ++++---- core/api/docs/swagger.yaml | 36 ++++--- core/api/internal/object/model.go | 13 +-- core/api/internal/object/service.go | 25 ++--- core/api/internal/object/service_test.go | 129 +++++++++++++---------- core/api/internal/search/service_test.go | 72 ++++++------- core/api/internal/space/model.go | 4 +- core/api/internal/space/service.go | 6 +- core/api/util/util.go | 34 ------ 10 files changed, 203 insertions(+), 208 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index bc7016d05..0c3db26ba 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -1517,6 +1517,11 @@ const docTemplate = `{ "type": "string", "example": "My object" }, + "object": { + "description": "The data model of the object", + "type": "string", + "example": "object" + }, "root_id": { "description": "The id of the object's root", "type": "string", @@ -1534,8 +1539,11 @@ const docTemplate = `{ }, "type": { "description": "The type of the object", - "type": "string", - "example": "Page" + "allOf": [ + { + "$ref": "#/definitions/object.Type" + } + ] } } }, @@ -1570,8 +1578,8 @@ const docTemplate = `{ "type": "string", "example": "My template" }, - "type": { - "description": "The type of the object", + "object": { + "description": "The data model of the object", "type": "string", "example": "template" } @@ -1654,16 +1662,16 @@ const docTemplate = `{ "type": "string", "example": "Page" }, + "object": { + "description": "The data model of the object", + "type": "string", + "example": "type" + }, "recommended_layout": { "description": "The recommended layout of the type", "type": "string", "example": "todo" }, - "type": { - "description": "The type of the object", - "type": "string", - "example": "type" - }, "unique_key": { "description": "The unique key of the type", "type": "string", @@ -1902,6 +1910,11 @@ const docTemplate = `{ "type": "string", "example": "John Doe" }, + "object": { + "description": "The data model of the object", + "type": "string", + "example": "member" + }, "role": { "description": "The role of the member", "type": "string", @@ -1912,11 +1925,6 @@ const docTemplate = `{ "NoPermission" ], "example": "Owner" - }, - "type": { - "description": "The type of the object", - "type": "string", - "example": "member" } } }, @@ -1996,6 +2004,11 @@ const docTemplate = `{ "type": "string", "example": "N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU" }, + "object": { + "description": "The data model of the object", + "type": "string", + "example": "space" + }, "profile_object_id": { "description": "The id of the profile object", "type": "string", @@ -2016,11 +2029,6 @@ const docTemplate = `{ "type": "string", "example": "" }, - "type": { - "description": "The type of the object", - "type": "string", - "example": "space" - }, "widgets_id": { "description": "The id of the widgets", "type": "string", diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index d8ba3d146..223b83383 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1511,6 +1511,11 @@ "type": "string", "example": "My object" }, + "object": { + "description": "The data model of the object", + "type": "string", + "example": "object" + }, "root_id": { "description": "The id of the object's root", "type": "string", @@ -1528,8 +1533,11 @@ }, "type": { "description": "The type of the object", - "type": "string", - "example": "Page" + "allOf": [ + { + "$ref": "#/definitions/object.Type" + } + ] } } }, @@ -1564,8 +1572,8 @@ "type": "string", "example": "My template" }, - "type": { - "description": "The type of the object", + "object": { + "description": "The data model of the object", "type": "string", "example": "template" } @@ -1648,16 +1656,16 @@ "type": "string", "example": "Page" }, + "object": { + "description": "The data model of the object", + "type": "string", + "example": "type" + }, "recommended_layout": { "description": "The recommended layout of the type", "type": "string", "example": "todo" }, - "type": { - "description": "The type of the object", - "type": "string", - "example": "type" - }, "unique_key": { "description": "The unique key of the type", "type": "string", @@ -1896,6 +1904,11 @@ "type": "string", "example": "John Doe" }, + "object": { + "description": "The data model of the object", + "type": "string", + "example": "member" + }, "role": { "description": "The role of the member", "type": "string", @@ -1906,11 +1919,6 @@ "NoPermission" ], "example": "Owner" - }, - "type": { - "description": "The type of the object", - "type": "string", - "example": "member" } } }, @@ -1990,6 +1998,11 @@ "type": "string", "example": "N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU" }, + "object": { + "description": "The data model of the object", + "type": "string", + "example": "space" + }, "profile_object_id": { "description": "The id of the profile object", "type": "string", @@ -2010,11 +2023,6 @@ "type": "string", "example": "" }, - "type": { - "description": "The type of the object", - "type": "string", - "example": "space" - }, "widgets_id": { "description": "The id of the widgets", "type": "string", diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 46c1110f7..0dd2b302a 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -176,6 +176,10 @@ definitions: description: The name of the object example: My object type: string + object: + description: The data model of the object + example: object + type: string root_id: description: The id of the object's root example: bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u @@ -190,9 +194,9 @@ definitions: example: bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1 type: string type: + allOf: + - $ref: '#/definitions/object.Type' description: The type of the object - example: Page - type: string type: object object.ObjectResponse: properties: @@ -215,8 +219,8 @@ definitions: description: The name of the template example: My template type: string - type: - description: The type of the object + object: + description: The data model of the object example: template type: string type: object @@ -279,14 +283,14 @@ definitions: description: The name of the type example: Page type: string + object: + description: The data model of the object + example: type + type: string recommended_layout: description: The recommended layout of the type example: todo type: string - type: - description: The type of the object - example: type - type: string unique_key: description: The unique key of the type example: ot-page @@ -449,6 +453,10 @@ definitions: description: The name of the member example: John Doe type: string + object: + description: The data model of the object + example: member + type: string role: description: The role of the member enum: @@ -458,10 +466,6 @@ definitions: - NoPermission example: Owner type: string - type: - description: The type of the object - example: member - type: string type: object space.MemberResponse: properties: @@ -520,6 +524,10 @@ definitions: description: The network id of the space example: N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU type: string + object: + description: The data model of the object + example: space + type: string profile_object_id: description: The id of the profile object example: bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4 @@ -537,10 +545,6 @@ definitions: description: The timezone of the account example: "" type: string - type: - description: The type of the object - example: space - type: string widgets_id: description: The id of the widgets example: bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index d59121491..5846100ae 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -15,10 +15,11 @@ type ObjectResponse struct { } type Object struct { - Type string `json:"type" example:"Page"` // The type of the object + Object string `json:"object" example:"object"` // The data model of the object Id string `json:"id" example:"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ"` // The id of the object Name string `json:"name" example:"My object"` // The name of the object Icon string `json:"icon" example:"📄"` // The icon of the object + Type Type `json:"type"` // The type of the object Snippet string `json:"snippet" example:"The beginning of the object body..."` // The snippet of the object, especially important for notes as they don't have a name Layout string `json:"layout" example:"basic"` // The layout of the object SpaceId string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` // The id of the space the object is in @@ -73,7 +74,7 @@ type TypeResponse struct { } type Type struct { - Type string `json:"type" example:"type"` // The type of the object + Object string `json:"object" example:"type"` // The data model of the object Id string `json:"id" example:"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu"` // The id of the type UniqueKey string `json:"unique_key" example:"ot-page"` // The unique key of the type Name string `json:"name" example:"Page"` // The name of the type @@ -86,8 +87,8 @@ type TemplateResponse struct { } type Template struct { - Type string `json:"type" example:"template"` // The type of the object - Id string `json:"id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` // The id of the template - Name string `json:"name" example:"My template"` // The name of the template - Icon string `json:"icon" example:"📄"` // The icon of the template + Object string `json:"object" example:"template"` // The data model of the object + Id string `json:"id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` // The id of the template + Name string `json:"name" example:"My template"` // The name of the template + Icon string `json:"icon" example:"📄"` // The icon of the template } diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 3a51a343f..d979245d1 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -126,16 +126,17 @@ func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId } icon := util.GetIconFromEmojiOrImage(s.AccountInfo, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconImage.String()].GetStringValue()) - objectTypeName, err := util.ResolveTypeToName(s.mw, spaceId, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyType.String()].GetStringValue()) + objectType, err := s.GetType(ctx, spaceId, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyType.String()].GetStringValue()) if err != nil { return Object{}, err } object := Object{ - Type: objectTypeName, + Object: "object", Id: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyId.String()].GetStringValue(), Name: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), Icon: icon, + Type: objectType, Snippet: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySnippet.String()].GetStringValue(), Layout: model.ObjectTypeLayout_name[int32(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyLayout.String()].GetNumberValue())], SpaceId: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), @@ -299,7 +300,7 @@ func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset in for _, record := range paginatedTypes { types = append(types, Type{ - Type: "type", + Object: "type", Id: record.Fields[bundle.RelationKeyId.String()].GetStringValue(), UniqueKey: record.Fields[bundle.RelationKeyUniqueKey.String()].GetStringValue(), Name: record.Fields[bundle.RelationKeyName.String()].GetStringValue(), @@ -326,7 +327,7 @@ func (s *ObjectService) GetType(ctx context.Context, spaceId string, typeId stri } return Type{ - Type: "type", + Object: "type", Id: typeId, UniqueKey: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyUniqueKey.String()].GetStringValue(), Name: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), @@ -399,10 +400,10 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI } templates = append(templates, Template{ - Type: "template", - Id: templateId, - Name: templateResp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), - Icon: templateResp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), + Object: "template", + Id: templateId, + Name: templateResp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), + Icon: templateResp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), }) } @@ -425,10 +426,10 @@ func (s *ObjectService) GetTemplate(ctx context.Context, spaceId string, typeId } return Template{ - Type: "template", - Id: templateId, - Name: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), - Icon: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), + Object: "template", + Id: templateId, + Name: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), + Icon: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), }, nil } diff --git a/core/api/internal/object/service_test.go b/core/api/internal/object/service_test.go index 5ae1f6ba2..f865b96ea 100644 --- a/core/api/internal/object/service_test.go +++ b/core/api/internal/object/service_test.go @@ -23,7 +23,6 @@ const ( gatewayUrl = "http://localhost:31006" mockedSpaceId = "mocked-space-id" mockedObjectId = "mocked-object-id" - mockedObjectType = "mocked-object-type" mockedNewObjectId = "mocked-new-object-id" mockedObjectName = "mocked-object-name" mockedObjectSnippet = "mocked-object-snippet" @@ -99,7 +98,7 @@ func TestObjectService_ListObjects(t *testing.T) { bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), bundle.RelationKeySnippet.String(): pbtypes.String(mockedObjectSnippet), bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedObjectIcon), - bundle.RelationKeyType.String(): pbtypes.String(mockedObjectTypeUniqueKey), + bundle.RelationKeyType.String(): pbtypes.String(mockedTypeId), bundle.RelationKeyLayout.String(): pbtypes.Float64(float64(model.ObjectType_basic)), }, }, @@ -122,7 +121,7 @@ func TestObjectService_ListObjects(t *testing.T) { bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), bundle.RelationKeySnippet.String(): pbtypes.String(mockedObjectSnippet), bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedObjectIcon), - bundle.RelationKeyType.String(): pbtypes.String(mockedObjectTypeUniqueKey), + bundle.RelationKeyType.String(): pbtypes.String(mockedTypeId), bundle.RelationKeyCreatedDate.String(): pbtypes.Float64(888888), bundle.RelationKeyLastModifiedDate.String(): pbtypes.Float64(999999), bundle.RelationKeyLastOpenedDate.String(): pbtypes.Float64(0), @@ -136,25 +135,26 @@ func TestObjectService_ListObjects(t *testing.T) { }).Once() // Mock type resolution - fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ - SpaceId: mockedSpaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyUniqueKey.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(mockedObjectTypeUniqueKey), - }, - }, - Keys: []string{bundle.RelationKeyName.String()}, - }).Return(&pb.RpcObjectSearchResponse{ - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - bundle.RelationKeyName.String(): pbtypes.String(mockedObjectType), + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedTypeId, + }).Return(&pb.RpcObjectShowResponse{ + ObjectView: &model.ObjectView{ + RootId: mockedTypeId, + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String(mockedTypeId), + bundle.RelationKeyName.String(): pbtypes.String(mockedTypeName), + bundle.RelationKeyUniqueKey.String(): pbtypes.String(mockedTypeUniqueKey), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedTypeIcon), + }, + }, }, }, }, - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, }).Once() // Mock participant details @@ -190,7 +190,10 @@ func TestObjectService_ListObjects(t *testing.T) { // then require.NoError(t, err) require.Len(t, objects, 1) - require.Equal(t, mockedObjectType, objects[0].Type) + require.Equal(t, mockedTypeId, objects[0].Type.Id) + require.Equal(t, mockedTypeName, objects[0].Type.Name) + require.Equal(t, mockedTypeUniqueKey, objects[0].Type.UniqueKey) + require.Equal(t, mockedTypeIcon, objects[0].Type.Icon) require.Equal(t, mockedObjectId, objects[0].Id) require.Equal(t, mockedObjectName, objects[0].Name) require.Equal(t, mockedObjectSnippet, objects[0].Snippet) @@ -263,7 +266,7 @@ func TestObjectService_GetObject(t *testing.T) { bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), bundle.RelationKeySnippet.String(): pbtypes.String(mockedObjectSnippet), bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedObjectName), - bundle.RelationKeyType.String(): pbtypes.String(mockedObjectTypeUniqueKey), + bundle.RelationKeyType.String(): pbtypes.String(mockedTypeId), bundle.RelationKeyLastModifiedDate.String(): pbtypes.Float64(999999), bundle.RelationKeyCreatedDate.String(): pbtypes.Float64(888888), bundle.RelationKeyLastOpenedDate.String(): pbtypes.Float64(0), @@ -276,26 +279,27 @@ func TestObjectService_GetObject(t *testing.T) { }, nil).Once() // Mock type resolution - fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ - SpaceId: mockedSpaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyUniqueKey.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(mockedObjectTypeUniqueKey), - }, - }, - Keys: []string{bundle.RelationKeyName.String()}, - }).Return(&pb.RpcObjectSearchResponse{ - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - bundle.RelationKeyName.String(): pbtypes.String(mockedObjectType), + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedTypeId, + }).Return(&pb.RpcObjectShowResponse{ + ObjectView: &model.ObjectView{ + RootId: mockedTypeId, + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String(mockedTypeId), + bundle.RelationKeyName.String(): pbtypes.String(mockedTypeName), + bundle.RelationKeyUniqueKey.String(): pbtypes.String(mockedTypeUniqueKey), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedTypeIcon), + }, + }, }, }, }, - }, nil).Once() + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + }).Once() // Mock participant details fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ @@ -329,7 +333,11 @@ func TestObjectService_GetObject(t *testing.T) { // then require.NoError(t, err) - require.Equal(t, mockedObjectType, object.Type) + require.Equal(t, "object", object.Object) + require.Equal(t, mockedTypeId, object.Type.Id) + require.Equal(t, mockedTypeName, object.Type.Name) + require.Equal(t, mockedTypeUniqueKey, object.Type.UniqueKey) + require.Equal(t, mockedTypeIcon, object.Type.Icon) require.Equal(t, mockedObjectId, object.Id) require.Equal(t, mockedObjectName, object.Name) require.Equal(t, mockedObjectSnippet, object.Snippet) @@ -421,7 +429,7 @@ func TestObjectService_CreateObject(t *testing.T) { bundle.RelationKeyId.String(): pbtypes.String(mockedNewObjectId), bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), bundle.RelationKeyLayout.String(): pbtypes.Float64(float64(model.ObjectType_basic)), - bundle.RelationKeyType.String(): pbtypes.String(mockedObjectTypeUniqueKey), + bundle.RelationKeyType.String(): pbtypes.String(mockedTypeId), bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedObjectIcon), bundle.RelationKeySpaceId.String(): pbtypes.String(mockedSpaceId), }, @@ -433,25 +441,26 @@ func TestObjectService_CreateObject(t *testing.T) { }).Once() // Mock type resolution - fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ - SpaceId: mockedSpaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyUniqueKey.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(mockedObjectTypeUniqueKey), - }, - }, - Keys: []string{bundle.RelationKeyName.String()}, - }).Return(&pb.RpcObjectSearchResponse{ - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - bundle.RelationKeyName.String(): pbtypes.String(mockedObjectType), + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedTypeId, + }).Return(&pb.RpcObjectShowResponse{ + ObjectView: &model.ObjectView{ + RootId: mockedTypeId, + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String(mockedTypeId), + bundle.RelationKeyName.String(): pbtypes.String(mockedTypeName), + bundle.RelationKeyUniqueKey.String(): pbtypes.String(mockedTypeUniqueKey), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedTypeIcon), + }, + }, }, }, }, + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, }).Once() // Mock participant details @@ -491,7 +500,11 @@ func TestObjectService_CreateObject(t *testing.T) { // then require.NoError(t, err) - require.Equal(t, mockedObjectType, object.Type) + require.Equal(t, "object", object.Object) + require.Equal(t, mockedTypeId, object.Type.Id) + require.Equal(t, mockedTypeName, object.Type.Name) + require.Equal(t, mockedTypeUniqueKey, object.Type.UniqueKey) + require.Equal(t, mockedTypeIcon, object.Type.Icon) require.Equal(t, mockedNewObjectId, object.Id) require.Equal(t, mockedObjectName, object.Name) require.Equal(t, mockedObjectIcon, object.Icon) @@ -749,7 +762,7 @@ func TestObjectService_GetTemplate(t *testing.T) { }).Once() // when - template, err := fx.GetTemplate(ctx, mockedSpaceId, mockedObjectType, mockedTemplateId) + template, err := fx.GetTemplate(ctx, mockedSpaceId, mockedTypeId, mockedTemplateId) // then require.NoError(t, err) diff --git a/core/api/internal/search/service_test.go b/core/api/internal/search/service_test.go index 1f248690f..49e4567ab 100644 --- a/core/api/internal/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -35,7 +35,6 @@ const ( mockedTagId2 = "mocked-tag-id-2" mockedTagValue2 = "mocked-tag-value-2" mockedTagColor2 = "mocked-tag-color-2" - mockedObjectTypeName = "mocked-object-type-name" mockedParticipantName = "mocked-participant-name" mockedParticipantIcon = "mocked-participant-icon" mockedParticipantImage = "mocked-participant-image" @@ -282,26 +281,23 @@ func TestSearchService_GlobalSearch(t *testing.T) { }, nil).Once() // Mock type resolution - fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ - SpaceId: mockedSpaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyId.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(mockedType), - }, - }, - Keys: []string{bundle.RelationKeyName.String()}, - }).Return(&pb.RpcObjectSearchResponse{ - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - bundle.RelationKeyName.String(): pbtypes.String(mockedObjectTypeName), + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedType, + }).Return(&pb.RpcObjectShowResponse{ + ObjectView: &model.ObjectView{ + RootId: mockedType, + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String(mockedType), + }, + }, }, }, }, - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, }).Once() // Mock participant details @@ -346,10 +342,10 @@ func TestSearchService_GlobalSearch(t *testing.T) { // then require.NoError(t, err) require.Len(t, objects, 1) - require.Equal(t, mockedObjectTypeName, objects[0].Type) - require.Equal(t, mockedSpaceId, objects[0].SpaceId) - require.Equal(t, mockedObjectName, objects[0].Name) require.Equal(t, mockedObjectId, objects[0].Id) + require.Equal(t, mockedObjectName, objects[0].Name) + require.Equal(t, mockedType, objects[0].Type.Id) + require.Equal(t, mockedSpaceId, objects[0].SpaceId) require.Equal(t, model.ObjectTypeLayout_name[int32(model.ObjectType_basic)], objects[0].Layout) require.Equal(t, "🌐", objects[0].Icon) require.Equal(t, "This is a sample text block", objects[0].Blocks[2].Text.Text) @@ -494,26 +490,23 @@ func TestSearchService_Search(t *testing.T) { }).Once() // Mock type resolution - fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ - SpaceId: mockedSpaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyId.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(mockedType), - }, - }, - Keys: []string{bundle.RelationKeyName.String()}, - }).Return(&pb.RpcObjectSearchResponse{ - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - bundle.RelationKeyName.String(): pbtypes.String(mockedObjectTypeName), + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedType, + }).Return(&pb.RpcObjectShowResponse{ + ObjectView: &model.ObjectView{ + RootId: mockedType, + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String(mockedType), + }, + }, }, }, }, - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, }).Once() // Mock participant details @@ -546,8 +539,9 @@ func TestSearchService_Search(t *testing.T) { // then require.NoError(t, err) require.Len(t, objects, 1) - require.Equal(t, mockedObjectName, objects[0].Name) require.Equal(t, mockedObjectId, objects[0].Id) + require.Equal(t, mockedObjectName, objects[0].Name) + require.Equal(t, mockedType, objects[0].Type.Id) require.Equal(t, mockedSpaceId, objects[0].SpaceId) require.Equal(t, model.ObjectTypeLayout_name[int32(model.ObjectType_basic)], objects[0].Layout) diff --git a/core/api/internal/space/model.go b/core/api/internal/space/model.go index 6805de3cc..16ebe1fb5 100644 --- a/core/api/internal/space/model.go +++ b/core/api/internal/space/model.go @@ -9,7 +9,7 @@ type CreateSpaceRequest struct { } type Space struct { - Type string `json:"type" example:"space"` // The type of the object + Object string `json:"object" example:"space"` // The data model of the object Id string `json:"id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` // The id of the space Name string `json:"name" example:"My Space"` // The name of the space Icon string `json:"icon" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay"` // The icon of the space @@ -35,7 +35,7 @@ type MemberResponse struct { } type Member struct { - Type string `json:"type" example:"member"` // The type of the object + Object string `json:"object" example:"member"` // The data model of the object Id string `json:"id" example:"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ"` // The profile object id of the member Name string `json:"name" example:"John Doe"` // The name of the member Icon string `json:"icon" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100"` // The icon of the member diff --git a/core/api/internal/space/service.go b/core/api/internal/space/service.go index eb83f636c..1b36244e0 100644 --- a/core/api/internal/space/service.go +++ b/core/api/internal/space/service.go @@ -198,7 +198,7 @@ func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset i icon := util.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), record.Fields[bundle.RelationKeyIconImage.String()].GetStringValue()) member := Member{ - Type: "member", + Object: "member", Id: record.Fields[bundle.RelationKeyId.String()].GetStringValue(), Name: record.Fields[bundle.RelationKeyName.String()].GetStringValue(), Icon: icon, @@ -239,7 +239,7 @@ func (s *SpaceService) GetMember(ctx context.Context, spaceId string, memberId s icon := util.GetIconFromEmojiOrImage(s.AccountInfo, "", resp.Records[0].Fields[bundle.RelationKeyIconImage.String()].GetStringValue()) return Member{ - Type: "member", + Object: "member", Id: resp.Records[0].Fields[bundle.RelationKeyId.String()].GetStringValue(), Name: resp.Records[0].Fields[bundle.RelationKeyName.String()].GetStringValue(), Icon: icon, @@ -261,7 +261,7 @@ func (s *SpaceService) getWorkspaceInfo(spaceId string, name string, icon string } return Space{ - Type: "space", + Object: "space", Id: spaceId, Name: name, Icon: icon, diff --git a/core/api/util/util.go b/core/api/util/util.go index 6c5a74eb9..c8ce71dec 100644 --- a/core/api/util/util.go +++ b/core/api/util/util.go @@ -4,7 +4,6 @@ import ( "context" "errors" "fmt" - "strings" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service" @@ -31,39 +30,6 @@ func GetIconFromEmojiOrImage(accountInfo *model.AccountInfo, iconEmoji string, i return "" } -// ResolveTypeToName resolves the type ID to the name of the type, e.g. "ot-page" to "Page" or "bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu" to "Custom Type" -func ResolveTypeToName(mw service.ClientCommandsServer, spaceId string, typeId string) (typeName string, err error) { - // Can't look up preinstalled types based on relation key, therefore need to use unique key - relKey := bundle.RelationKeyId.String() - if strings.HasPrefix(typeId, "ot-") { - relKey = bundle.RelationKeyUniqueKey.String() - } - - // Call ObjectSearch for object of specified type and return the name - resp := mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ - SpaceId: spaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - Operator: model.BlockContentDataviewFilter_No, - RelationKey: relKey, - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(typeId), - }, - }, - Keys: []string{bundle.RelationKeyName.String()}, - }) - - if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { - return "", ErrFailedSearchType - } - - if len(resp.Records) == 0 { - return "", ErrorTypeNotFound - } - - return resp.Records[0].Fields[bundle.RelationKeyName.String()].GetStringValue(), nil -} - func ResolveUniqueKeyToTypeId(mw service.ClientCommandsServer, spaceId string, uniqueKey string) (typeId string, err error) { // Call ObjectSearch for type with unique key and return the type's ID resp := mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ From 81cdd2ee884709e0c856cc1d70da1a2488b29d5d Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 14 Feb 2025 18:44:25 +0100 Subject: [PATCH 016/132] GO-4459: Add relation format to detail entries --- core/api/internal/object/service.go | 29 ++++++++++++++++++++---- core/api/internal/object/service_test.go | 12 +++++----- core/api/internal/search/service_test.go | 6 ++--- 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index d979245d1..ab077f479 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -435,6 +435,7 @@ func (s *ObjectService) GetTemplate(ctx context.Context, spaceId string, typeId // GetDetails returns the list of details from the ObjectShowResponse. func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { + relationFormatMap := s.getRelationFormatMap(resp.ObjectView.RelationLinks) creator := resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyCreator.String()].GetStringValue() lastModifiedBy := resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyLastModifiedBy.String()].GetStringValue() @@ -462,42 +463,62 @@ func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { { Id: "last_modified_date", Details: map[string]interface{}{ - "last_modified_date": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyLastModifiedDate.String()].GetNumberValue()), + "type": relationFormatMap[bundle.RelationKeyLastModifiedDate.String()], + "date": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyLastModifiedDate.String()].GetNumberValue()), }, }, { Id: "last_modified_by", Details: map[string]interface{}{ + "type": relationFormatMap[bundle.RelationKeyLastModifiedBy.String()], "details": memberLastModifiedBy, }, }, { Id: "created_date", Details: map[string]interface{}{ - "created_date": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyCreatedDate.String()].GetNumberValue()), + "type": relationFormatMap[bundle.RelationKeyCreatedDate.String()], + "date": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyCreatedDate.String()].GetNumberValue()), }, }, { Id: "created_by", Details: map[string]interface{}{ + "type": relationFormatMap[bundle.RelationKeyCreator.String()], "details": memberCreator, }, }, { Id: "last_opened_date", Details: map[string]interface{}{ - "last_opened_date": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyLastOpenedDate.String()].GetNumberValue()), + "type": relationFormatMap[bundle.RelationKeyLastOpenedDate.String()], + "date": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyLastOpenedDate.String()].GetNumberValue()), }, }, { Id: "tags", Details: map[string]interface{}{ - "tags": s.getTags(resp), + "type": relationFormatMap[bundle.RelationKeyTag.String()], + "multi_select": s.getTags(resp), }, }, } } +// getRelationFormatMapFromResponse returns the map of relation key to relation format from the ObjectShowResponse. +func (s *ObjectService) getRelationFormatMap(relationLinks []*model.RelationLink) map[string]string { + var relationFormatToName = model.RelationFormat_name + relationFormatToName[int32(model.RelationFormat_tag)] = "multi_select" + relationFormatToName[int32(model.RelationFormat_status)] = "select" + + relationFormatMap := map[string]string{} + for _, detail := range relationLinks { + relationFormatMap[detail.Key] = relationFormatToName[int32(detail.Format)] + } + + return relationFormatMap +} + // getTags returns the list of tags from the ObjectShowResponse func (s *ObjectService) getTags(resp *pb.RpcObjectShowResponse) []Tag { tags := []Tag{} diff --git a/core/api/internal/object/service_test.go b/core/api/internal/object/service_test.go index f865b96ea..976b2f1ef 100644 --- a/core/api/internal/object/service_test.go +++ b/core/api/internal/object/service_test.go @@ -202,15 +202,15 @@ func TestObjectService_ListObjects(t *testing.T) { for _, detail := range objects[0].Details { if detail.Id == "created_date" { - require.Equal(t, "1970-01-11T06:54:48Z", detail.Details["created_date"]) + require.Equal(t, "1970-01-11T06:54:48Z", detail.Details["date"]) } else if detail.Id == "created_by" { require.Empty(t, detail.Details["created_by"]) } else if detail.Id == "last_modified_date" { - require.Equal(t, "1970-01-12T13:46:39Z", detail.Details["last_modified_date"]) + require.Equal(t, "1970-01-12T13:46:39Z", detail.Details["date"]) } else if detail.Id == "last_modified_by" { require.Empty(t, detail.Details["last_modified_by"]) } else if detail.Id == "last_opened_date" { - require.Equal(t, "1970-01-01T00:00:00Z", detail.Details["last_opened_date"]) + require.Equal(t, "1970-01-01T00:00:00Z", detail.Details["date"]) } else if detail.Id == "tags" { require.Empty(t, detail.Details["tags"]) } else { @@ -346,15 +346,15 @@ func TestObjectService_GetObject(t *testing.T) { for _, detail := range object.Details { if detail.Id == "created_date" { - require.Equal(t, "1970-01-11T06:54:48Z", detail.Details["created_date"]) + require.Equal(t, "1970-01-11T06:54:48Z", detail.Details["date"]) } else if detail.Id == "created_by" { require.Empty(t, detail.Details["created_by"]) } else if detail.Id == "last_modified_date" { - require.Equal(t, "1970-01-12T13:46:39Z", detail.Details["last_modified_date"]) + require.Equal(t, "1970-01-12T13:46:39Z", detail.Details["date"]) } else if detail.Id == "last_modified_by" { require.Empty(t, detail.Details["last_modified_by"]) } else if detail.Id == "last_opened_date" { - require.Equal(t, "1970-01-01T00:00:00Z", detail.Details["last_opened_date"]) + require.Equal(t, "1970-01-01T00:00:00Z", detail.Details["date"]) } else if detail.Id == "tags" { require.Empty(t, detail.Details["tags"]) } else { diff --git a/core/api/internal/search/service_test.go b/core/api/internal/search/service_test.go index 49e4567ab..8a55a0b9b 100644 --- a/core/api/internal/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -353,9 +353,9 @@ func TestSearchService_GlobalSearch(t *testing.T) { // check details for _, detail := range objects[0].Details { if detail.Id == "created_date" { - require.Equal(t, "1970-01-11T06:54:48Z", detail.Details["created_date"]) + require.Equal(t, "1970-01-11T06:54:48Z", detail.Details["date"]) } else if detail.Id == "last_modified_date" { - require.Equal(t, "1970-01-12T13:46:39Z", detail.Details["last_modified_date"]) + require.Equal(t, "1970-01-12T13:46:39Z", detail.Details["date"]) } else if detail.Id == "created_by" { require.Equal(t, mockedParticipantId, detail.Details["details"].(space.Member).Id) require.Equal(t, mockedParticipantName, detail.Details["details"].(space.Member).Name) @@ -370,7 +370,7 @@ func TestSearchService_GlobalSearch(t *testing.T) { // check tags tags := []object.Tag{} for _, detail := range objects[0].Details { - if tagList, ok := detail.Details["tags"].([]object.Tag); ok { + if tagList, ok := detail.Details["multi_select"].([]object.Tag); ok { for _, tag := range tagList { tags = append(tags, tag) } From 039739fce727f24df17056f8bd747db61eb390d6 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 14 Feb 2025 19:32:19 +0100 Subject: [PATCH 017/132] GO-4459: Get type directly from details in GetObject and fix detail key for object relation value --- core/api/internal/object/service.go | 55 +++++++++++++++------ core/api/internal/object/service_test.go | 63 ++++++------------------ core/api/internal/search/service_test.go | 43 ++++------------ 3 files changed, 65 insertions(+), 96 deletions(-) diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index ab077f479..10b074bd5 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -3,6 +3,7 @@ package object import ( "context" "errors" + "sync" "time" "github.com/gogo/protobuf/types" @@ -126,23 +127,19 @@ func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId } icon := util.GetIconFromEmojiOrImage(s.AccountInfo, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconImage.String()].GetStringValue()) - objectType, err := s.GetType(ctx, spaceId, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyType.String()].GetStringValue()) - if err != nil { - return Object{}, err - } object := Object{ Object: "object", Id: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyId.String()].GetStringValue(), Name: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), Icon: icon, - Type: objectType, + Type: s.getTypeFromDetails(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyType.String()].GetStringValue(), resp.ObjectView.Details), Snippet: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySnippet.String()].GetStringValue(), Layout: model.ObjectTypeLayout_name[int32(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyLayout.String()].GetNumberValue())], SpaceId: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), RootId: resp.ObjectView.RootId, - Blocks: s.GetBlocks(resp), - Details: s.GetDetails(resp), + Blocks: s.getBlocks(resp), + Details: s.getDetails(resp), } return object, nil @@ -433,8 +430,32 @@ func (s *ObjectService) GetTemplate(ctx context.Context, spaceId string, typeId }, nil } -// GetDetails returns the list of details from the ObjectShowResponse. -func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { +// getTypeFromDetails returns the type from the details of the ObjectShowResponse. +func (s *ObjectService) getTypeFromDetails(typeId string, details []*model.ObjectViewDetailsSet) Type { + var objectTypeDetail *types.Struct + for _, detail := range details { + if detail.Id == typeId { + objectTypeDetail = detail.GetDetails() + break + } + } + + if objectTypeDetail == nil { + return Type{} + } + + return Type{ + Object: "type", + Id: typeId, + UniqueKey: objectTypeDetail.Fields[bundle.RelationKeyUniqueKey.String()].GetStringValue(), + Name: objectTypeDetail.Fields[bundle.RelationKeyName.String()].GetStringValue(), + Icon: objectTypeDetail.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), + RecommendedLayout: model.ObjectTypeLayout_name[int32(objectTypeDetail.Fields[bundle.RelationKeyRecommendedLayout.String()].GetNumberValue())], + } +} + +// getDetails returns the list of details from the ObjectShowResponse. +func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { relationFormatMap := s.getRelationFormatMap(resp.ObjectView.RelationLinks) creator := resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyCreator.String()].GetStringValue() lastModifiedBy := resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyLastModifiedBy.String()].GetStringValue() @@ -470,8 +491,8 @@ func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { { Id: "last_modified_by", Details: map[string]interface{}{ - "type": relationFormatMap[bundle.RelationKeyLastModifiedBy.String()], - "details": memberLastModifiedBy, + "type": relationFormatMap[bundle.RelationKeyLastModifiedBy.String()], + "object": memberLastModifiedBy, }, }, { @@ -484,8 +505,8 @@ func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { { Id: "created_by", Details: map[string]interface{}{ - "type": relationFormatMap[bundle.RelationKeyCreator.String()], - "details": memberCreator, + "type": relationFormatMap[bundle.RelationKeyCreator.String()], + "object": memberCreator, }, }, { @@ -508,6 +529,9 @@ func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { // getRelationFormatMapFromResponse returns the map of relation key to relation format from the ObjectShowResponse. func (s *ObjectService) getRelationFormatMap(relationLinks []*model.RelationLink) map[string]string { var relationFormatToName = model.RelationFormat_name + var mu sync.Mutex + + mu.Lock() relationFormatToName[int32(model.RelationFormat_tag)] = "multi_select" relationFormatToName[int32(model.RelationFormat_status)] = "select" @@ -515,6 +539,7 @@ func (s *ObjectService) getRelationFormatMap(relationLinks []*model.RelationLink for _, detail := range relationLinks { relationFormatMap[detail.Key] = relationFormatToName[int32(detail.Format)] } + mu.Unlock() return relationFormatMap } @@ -544,8 +569,8 @@ func (s *ObjectService) getTags(resp *pb.RpcObjectShowResponse) []Tag { return tags } -// GetBlocks returns the list of blocks from the ObjectShowResponse. -func (s *ObjectService) GetBlocks(resp *pb.RpcObjectShowResponse) []Block { +// getBlocks returns the list of blocks from the ObjectShowResponse. +func (s *ObjectService) getBlocks(resp *pb.RpcObjectShowResponse) []Block { blocks := []Block{} for _, block := range resp.ObjectView.Blocks { diff --git a/core/api/internal/object/service_test.go b/core/api/internal/object/service_test.go index 976b2f1ef..ed40c5b5e 100644 --- a/core/api/internal/object/service_test.go +++ b/core/api/internal/object/service_test.go @@ -115,6 +115,7 @@ func TestObjectService_ListObjects(t *testing.T) { RootId: mockedObjectId, Details: []*model.ObjectViewDetailsSet{ { + Id: mockedObjectId, Details: &types.Struct{ Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), @@ -129,20 +130,8 @@ func TestObjectService_ListObjects(t *testing.T) { }, }, }, - }, - }, - Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, - }).Once() - - // Mock type resolution - fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ - SpaceId: mockedSpaceId, - ObjectId: mockedTypeId, - }).Return(&pb.RpcObjectShowResponse{ - ObjectView: &model.ObjectView{ - RootId: mockedTypeId, - Details: []*model.ObjectViewDetailsSet{ { + Id: mockedTypeId, Details: &types.Struct{ Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String(mockedTypeId), @@ -260,6 +249,7 @@ func TestObjectService_GetObject(t *testing.T) { RootId: mockedObjectId, Details: []*model.ObjectViewDetailsSet{ { + Id: mockedObjectId, Details: &types.Struct{ Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), @@ -274,32 +264,20 @@ func TestObjectService_GetObject(t *testing.T) { }, }, }, - }, - }, - }, nil).Once() - - // Mock type resolution - fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ - SpaceId: mockedSpaceId, - ObjectId: mockedTypeId, - }).Return(&pb.RpcObjectShowResponse{ - ObjectView: &model.ObjectView{ - RootId: mockedTypeId, - Details: []*model.ObjectViewDetailsSet{ - { - Details: &types.Struct{ - Fields: map[string]*types.Value{ - bundle.RelationKeyId.String(): pbtypes.String(mockedTypeId), - bundle.RelationKeyName.String(): pbtypes.String(mockedTypeName), - bundle.RelationKeyUniqueKey.String(): pbtypes.String(mockedTypeUniqueKey), - bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedTypeIcon), + { + Id: mockedTypeId, + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String(mockedTypeId), + bundle.RelationKeyName.String(): pbtypes.String(mockedTypeName), + bundle.RelationKeyUniqueKey.String(): pbtypes.String(mockedTypeUniqueKey), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedTypeIcon), + }, }, }, }, }, - }, - Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, - }).Once() + }, nil).Once() // Mock participant details fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ @@ -424,6 +402,7 @@ func TestObjectService_CreateObject(t *testing.T) { RootId: mockedNewObjectId, Details: []*model.ObjectViewDetailsSet{ { + Id: mockedNewObjectId, Details: &types.Struct{ Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String(mockedNewObjectId), @@ -435,20 +414,8 @@ func TestObjectService_CreateObject(t *testing.T) { }, }, }, - }, - }, - Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, - }).Once() - - // Mock type resolution - fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ - SpaceId: mockedSpaceId, - ObjectId: mockedTypeId, - }).Return(&pb.RpcObjectShowResponse{ - ObjectView: &model.ObjectView{ - RootId: mockedTypeId, - Details: []*model.ObjectViewDetailsSet{ { + Id: mockedTypeId, Details: &types.Struct{ Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String(mockedTypeId), diff --git a/core/api/internal/search/service_test.go b/core/api/internal/search/service_test.go index 8a55a0b9b..233b6ee4f 100644 --- a/core/api/internal/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -275,20 +275,8 @@ func TestSearchService_GlobalSearch(t *testing.T) { }, }, }, - }, - }, - Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, - }, nil).Once() - - // Mock type resolution - fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ - SpaceId: mockedSpaceId, - ObjectId: mockedType, - }).Return(&pb.RpcObjectShowResponse{ - ObjectView: &model.ObjectView{ - RootId: mockedType, - Details: []*model.ObjectViewDetailsSet{ { + Id: mockedType, Details: &types.Struct{ Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String(mockedType), @@ -298,7 +286,7 @@ func TestSearchService_GlobalSearch(t *testing.T) { }, }, Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, - }).Once() + }, nil).Once() // Mock participant details fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ @@ -357,13 +345,13 @@ func TestSearchService_GlobalSearch(t *testing.T) { } else if detail.Id == "last_modified_date" { require.Equal(t, "1970-01-12T13:46:39Z", detail.Details["date"]) } else if detail.Id == "created_by" { - require.Equal(t, mockedParticipantId, detail.Details["details"].(space.Member).Id) - require.Equal(t, mockedParticipantName, detail.Details["details"].(space.Member).Name) - require.Equal(t, gatewayUrl+"/image/"+mockedParticipantImage, detail.Details["details"].(space.Member).Icon) - require.Equal(t, mockedParticipantIdentity, detail.Details["details"].(space.Member).Identity) - require.Equal(t, mockedParticipantGlobalName, detail.Details["details"].(space.Member).GlobalName) + require.Equal(t, mockedParticipantId, detail.Details["object"].(space.Member).Id) + require.Equal(t, mockedParticipantName, detail.Details["object"].(space.Member).Name) + require.Equal(t, gatewayUrl+"/image/"+mockedParticipantImage, detail.Details["object"].(space.Member).Icon) + require.Equal(t, mockedParticipantIdentity, detail.Details["object"].(space.Member).Identity) + require.Equal(t, mockedParticipantGlobalName, detail.Details["object"].(space.Member).GlobalName) } else if detail.Id == "last_modified_by" { - require.Equal(t, mockedParticipantId, detail.Details["details"].(space.Member).Id) + require.Equal(t, mockedParticipantId, detail.Details["object"].(space.Member).Id) } } @@ -473,6 +461,7 @@ func TestSearchService_Search(t *testing.T) { RootId: mockedRootId, Details: []*model.ObjectViewDetailsSet{ { + Id: mockedRootId, Details: &types.Struct{ Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), @@ -484,20 +473,8 @@ func TestSearchService_Search(t *testing.T) { }, }, }, - }, - }, - Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, - }).Once() - - // Mock type resolution - fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ - SpaceId: mockedSpaceId, - ObjectId: mockedType, - }).Return(&pb.RpcObjectShowResponse{ - ObjectView: &model.ObjectView{ - RootId: mockedType, - Details: []*model.ObjectViewDetailsSet{ { + Id: mockedType, Details: &types.Struct{ Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String(mockedType), From 280d63ccd00c1306ef910571f74f0654ab05f163 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sat, 15 Feb 2025 13:29:43 +0100 Subject: [PATCH 018/132] GO-4459: Return custom relations in details of object response --- core/api/internal/object/model.go | 20 +-- core/api/internal/object/service.go | 149 ++++++++++++++--------- core/api/internal/object/service_test.go | 135 ++++++++++---------- core/api/internal/search/service_test.go | 47 ++++--- core/api/util/util.go | 26 ++++ 5 files changed, 225 insertions(+), 152 deletions(-) diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index 5846100ae..b83284b3c 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -29,13 +29,14 @@ type Object struct { } type Block struct { - Id string `json:"id" example:"64394517de52ad5acb89c66c"` // The id of the block - ChildrenIds []string `json:"children_ids" example:"['6797ce8ecda913cde14b02dc']"` // The ids of the block's children - BackgroundColor string `json:"background_color" example:"red"` // The background color of the block - Align string `json:"align" enums:"AlignLeft,AlignCenter,AlignRight,AlignJustify" example:"AlignLeft"` // The alignment of the block - VerticalAlign string `json:"vertical_align" enums:"VerticalAlignTop,VerticalAlignMiddle,VerticalAlignBottom" example:"VerticalAlignTop"` // The vertical alignment of the block - Text *Text `json:"text,omitempty"` // The text of the block, if applicable - File *File `json:"file,omitempty"` // The file of the block, if applicable + Id string `json:"id" example:"64394517de52ad5acb89c66c"` // The id of the block + ChildrenIds []string `json:"children_ids" example:"['6797ce8ecda913cde14b02dc']"` // The ids of the block's children + BackgroundColor string `json:"background_color" example:"red"` // The background color of the block + Align string `json:"align" enums:"AlignLeft,AlignCenter,AlignRight,AlignJustify" example:"AlignLeft"` // The alignment of the block + VerticalAlign string `json:"vertical_align" enums:"VerticalAlignTop,VerticalAlignMiddle,VerticalAlignBottom" example:"VerticalAlignTop"` // The vertical alignment of the block + Text *Text `json:"text,omitempty"` // The text of the block, if applicable + File *File `json:"file,omitempty"` // The file of the block, if applicable + Relation *Relation `json:"relation,omitempty"` // The relation of the block, if applicable } type Text struct { @@ -58,6 +59,11 @@ type File struct { Style string `json:"style"` // The style of the file } +// TODO: fill in the relation struct +type Relation struct { + Id string +} + type Detail struct { Id string `json:"id" enums:"last_modified_date,last_modified_by,created_date,created_by,last_opened_date,tags" example:"last_modified_date"` // The id of the detail Details map[string]interface{} `json:"details"` // The details diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 10b074bd5..2ec4ba64b 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -7,10 +7,12 @@ import ( "time" "github.com/gogo/protobuf/types" + "github.com/iancoleman/strcase" "github.com/anyproto/anytype-heart/core/api/internal/space" "github.com/anyproto/anytype-heart/core/api/pagination" "github.com/anyproto/anytype-heart/core/api/util" + "github.com/anyproto/anytype-heart/core/domain" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" @@ -454,75 +456,94 @@ func (s *ObjectService) getTypeFromDetails(typeId string, details []*model.Objec } } -// getDetails returns the list of details from the ObjectShowResponse. +// getDetails returns a list of details by iterating over all relations found in the RelationLinks and mapping their format and value. func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { relationFormatMap := s.getRelationFormatMap(resp.ObjectView.RelationLinks) - creator := resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyCreator.String()].GetStringValue() - lastModifiedBy := resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyLastModifiedBy.String()].GetStringValue() + linkedRelations := resp.ObjectView.RelationLinks + primaryDetailFields := resp.ObjectView.Details[0].Details.Fields - var creatorId, lastModifiedById string - for _, detail := range resp.ObjectView.Details { - if detail.Id == creator { - creatorId = detail.Id + var details []Detail + for _, r := range linkedRelations { + if val, ok := primaryDetailFields[r.Key]; ok { + relName := s.getRelationName(r.Key, resp) + format := relationFormatMap[r.Key] + details = append(details, Detail{ + Id: strcase.ToSnake(relName), + Details: map[string]interface{}{ + "name": relName, + "type": format, + format: s.convertValue(val, format, r.Key, resp.ObjectView.Details), + }, + }) } - if detail.Id == lastModifiedBy { - lastModifiedById = detail.Id + } + return details +} + +// getRelationName returns the relation name from the RelationKey or the resolved relation name. +func (s *ObjectService) getRelationName(key string, resp *pb.RpcObjectShowResponse) string { + relation, err := bundle.GetRelation(domain.RelationKey(key)) + if err != nil { + relation, err = util.ResolveRelationKeyToRelationName(s.mw, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), key) + if err != nil { + return key } } - memberLastModifiedBy, err := s.spaceService.GetMember(context.Background(), resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), lastModifiedById) - if err != nil { - memberLastModifiedBy = space.Member{} + // custom relation names + if key == bundle.RelationKeyCreator.String() { + return "Created By" + } else if key == bundle.RelationKeyCreatedDate.String() { + return "Created Date" } - memberCreator, err := s.spaceService.GetMember(context.Background(), resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), creatorId) - if err != nil { - memberCreator = space.Member{} - } + return relation.Name +} - return []Detail{ - { - Id: "last_modified_date", - Details: map[string]interface{}{ - "type": relationFormatMap[bundle.RelationKeyLastModifiedDate.String()], - "date": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyLastModifiedDate.String()].GetNumberValue()), - }, - }, - { - Id: "last_modified_by", - Details: map[string]interface{}{ - "type": relationFormatMap[bundle.RelationKeyLastModifiedBy.String()], - "object": memberLastModifiedBy, - }, - }, - { - Id: "created_date", - Details: map[string]interface{}{ - "type": relationFormatMap[bundle.RelationKeyCreatedDate.String()], - "date": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyCreatedDate.String()].GetNumberValue()), - }, - }, - { - Id: "created_by", - Details: map[string]interface{}{ - "type": relationFormatMap[bundle.RelationKeyCreator.String()], - "object": memberCreator, - }, - }, - { - Id: "last_opened_date", - Details: map[string]interface{}{ - "type": relationFormatMap[bundle.RelationKeyLastOpenedDate.String()], - "date": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyLastOpenedDate.String()].GetNumberValue()), - }, - }, - { - Id: "tags", - Details: map[string]interface{}{ - "type": relationFormatMap[bundle.RelationKeyTag.String()], - "multi_select": s.getTags(resp), - }, - }, +// convertValue converts a protobuf types.Value into a native Go value. +func (s *ObjectService) convertValue(value *types.Value, format string, key string, details []*model.ObjectViewDetailsSet) interface{} { + switch kind := value.Kind.(type) { + case *types.Value_NullValue: + return nil + case *types.Value_NumberValue: + if format == "date" { + return PosixToISO8601(kind.NumberValue) + } + return kind.NumberValue + case *types.Value_StringValue: + if key == bundle.RelationKeyCreator.String() || key == bundle.RelationKeyLastModifiedBy.String() { + member, err := s.spaceService.GetMember(context.Background(), details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), kind.StringValue) + if err != nil { + return nil + } + return member + } + return kind.StringValue + case *types.Value_BoolValue: + return kind.BoolValue + case *types.Value_StructValue: + m := make(map[string]interface{}) + for k, v := range kind.StructValue.Fields { + m[k] = s.convertValue(v, format, key, details) + } + return m + case *types.Value_ListValue: + var list []interface{} + for _, v := range kind.ListValue.Values { + list = append(list, s.convertValue(v, format, key, details)) + } + + if format == "select" || format == "multi_select" { + return s.getTags(&pb.RpcObjectShowResponse{ + ObjectView: &model.ObjectView{ + Details: details, + }, + }) + } + + return list + default: + return nil } } @@ -532,6 +553,8 @@ func (s *ObjectService) getRelationFormatMap(relationLinks []*model.RelationLink var mu sync.Mutex mu.Lock() + relationFormatToName[int32(model.RelationFormat_longtext)] = "text" + relationFormatToName[int32(model.RelationFormat_shorttext)] = "text" relationFormatToName[int32(model.RelationFormat_tag)] = "multi_select" relationFormatToName[int32(model.RelationFormat_status)] = "select" @@ -576,6 +599,7 @@ func (s *ObjectService) getBlocks(resp *pb.RpcObjectShowResponse) []Block { for _, block := range resp.ObjectView.Blocks { var text *Text var file *File + var relation *Relation switch content := block.Content.(type) { case *model.BlockContentOfText: @@ -598,8 +622,12 @@ func (s *ObjectService) getBlocks(resp *pb.RpcObjectShowResponse) []Block { State: model.BlockContentFileState_name[int32(content.File.State)], Style: model.BlockContentFileStyle_name[int32(content.File.Style)], } - // TODO: other content types? + case *model.BlockContentOfRelation: + relation = &Relation{ + Id: content.Relation.Key, + } } + // TODO: other content types? blocks = append(blocks, Block{ Id: block.Id, @@ -609,6 +637,7 @@ func (s *ObjectService) getBlocks(resp *pb.RpcObjectShowResponse) []Block { VerticalAlign: model.BlockVerticalAlign_name[int32(block.VerticalAlign)], Text: text, File: file, + Relation: relation, }) } diff --git a/core/api/internal/object/service_test.go b/core/api/internal/object/service_test.go index ed40c5b5e..447f2f691 100644 --- a/core/api/internal/object/service_test.go +++ b/core/api/internal/object/service_test.go @@ -27,6 +27,7 @@ const ( mockedObjectName = "mocked-object-name" mockedObjectSnippet = "mocked-object-snippet" mockedObjectIcon = "🔍" + mockedParticipantId = "mocked-participant-id" mockedObjectTypeUniqueKey = "ot-page" mockedTypeId = "mocked-type-id" mockedTypeName = "mocked-type-name" @@ -122,11 +123,21 @@ func TestObjectService_ListObjects(t *testing.T) { bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), bundle.RelationKeySnippet.String(): pbtypes.String(mockedObjectSnippet), bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedObjectIcon), - bundle.RelationKeyType.String(): pbtypes.String(mockedTypeId), bundle.RelationKeyCreatedDate.String(): pbtypes.Float64(888888), + bundle.RelationKeyLastModifiedBy.String(): pbtypes.String(mockedParticipantId), bundle.RelationKeyLastModifiedDate.String(): pbtypes.Float64(999999), + bundle.RelationKeyCreator.String(): pbtypes.String(mockedParticipantId), bundle.RelationKeyLastOpenedDate.String(): pbtypes.Float64(0), bundle.RelationKeySpaceId.String(): pbtypes.String(mockedSpaceId), + bundle.RelationKeyType.String(): pbtypes.String(mockedTypeId), + }, + }, + }, + { + Id: mockedParticipantId, + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String(mockedParticipantId), }, }, }, @@ -142,6 +153,32 @@ func TestObjectService_ListObjects(t *testing.T) { }, }, }, + RelationLinks: []*model.RelationLink{ + { + Key: bundle.RelationKeyLastModifiedDate.String(), + Format: model.RelationFormat_date, + }, + { + Key: bundle.RelationKeyLastModifiedBy.String(), + Format: model.RelationFormat_object, + }, + { + Key: bundle.RelationKeyCreatedDate.String(), + Format: model.RelationFormat_date, + }, + { + Key: bundle.RelationKeyCreator.String(), + Format: model.RelationFormat_object, + }, + { + Key: bundle.RelationKeyLastOpenedDate.String(), + Format: model.RelationFormat_date, + }, + { + Key: bundle.RelationKeyTag.String(), + Format: model.RelationFormat_tag, + }, + }, }, Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, }).Once() @@ -154,7 +191,7 @@ func TestObjectService_ListObjects(t *testing.T) { Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeyId.String(), Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(""), + Value: pbtypes.String(mockedParticipantId), }, }, Keys: []string{ @@ -169,7 +206,11 @@ func TestObjectService_ListObjects(t *testing.T) { }).Return(&pb.RpcObjectSearchResponse{ Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, Records: []*types.Struct{ - {}, + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String(mockedParticipantId), + }, + }, }, }).Twice() @@ -187,17 +228,17 @@ func TestObjectService_ListObjects(t *testing.T) { require.Equal(t, mockedObjectName, objects[0].Name) require.Equal(t, mockedObjectSnippet, objects[0].Snippet) require.Equal(t, mockedObjectIcon, objects[0].Icon) - require.Equal(t, 6, len(objects[0].Details)) + require.Equal(t, 5, len(objects[0].Details)) for _, detail := range objects[0].Details { if detail.Id == "created_date" { require.Equal(t, "1970-01-11T06:54:48Z", detail.Details["date"]) } else if detail.Id == "created_by" { - require.Empty(t, detail.Details["created_by"]) + require.Equal(t, mockedParticipantId, detail.Details["object"].(space.Member).Id) } else if detail.Id == "last_modified_date" { require.Equal(t, "1970-01-12T13:46:39Z", detail.Details["date"]) } else if detail.Id == "last_modified_by" { - require.Empty(t, detail.Details["last_modified_by"]) + require.Equal(t, mockedParticipantId, detail.Details["object"].(space.Member).Id) } else if detail.Id == "last_opened_date" { require.Equal(t, "1970-01-01T00:00:00Z", detail.Details["date"]) } else if detail.Id == "tags" { @@ -276,36 +317,35 @@ func TestObjectService_GetObject(t *testing.T) { }, }, }, + RelationLinks: []*model.RelationLink{ + { + Key: bundle.RelationKeyLastModifiedDate.String(), + Format: model.RelationFormat_date, + }, + { + Key: bundle.RelationKeyLastModifiedBy.String(), + Format: model.RelationFormat_object, + }, + { + Key: bundle.RelationKeyCreatedDate.String(), + Format: model.RelationFormat_date, + }, + { + Key: bundle.RelationKeyCreator.String(), + Format: model.RelationFormat_object, + }, + { + Key: bundle.RelationKeyLastOpenedDate.String(), + Format: model.RelationFormat_date, + }, + { + Key: bundle.RelationKeyTag.String(), + Format: model.RelationFormat_tag, + }, + }, }, }, nil).Once() - // Mock participant details - fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ - SpaceId: mockedSpaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyId.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(""), - }, - }, - Keys: []string{ - bundle.RelationKeyId.String(), - bundle.RelationKeyName.String(), - bundle.RelationKeyIconEmoji.String(), - bundle.RelationKeyIconImage.String(), - bundle.RelationKeyIdentity.String(), - bundle.RelationKeyGlobalName.String(), - bundle.RelationKeyParticipantPermissions.String(), - }, - }).Return(&pb.RpcObjectSearchResponse{ - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - Records: []*types.Struct{ - {}, - }, - }).Twice() - // when object, err := fx.GetObject(ctx, mockedSpaceId, mockedObjectId) @@ -320,7 +360,7 @@ func TestObjectService_GetObject(t *testing.T) { require.Equal(t, mockedObjectName, object.Name) require.Equal(t, mockedObjectSnippet, object.Snippet) require.Equal(t, mockedObjectName, object.Icon) - require.Equal(t, 6, len(object.Details)) + require.Equal(t, 3, len(object.Details)) for _, detail := range object.Details { if detail.Id == "created_date" { @@ -430,33 +470,6 @@ func TestObjectService_CreateObject(t *testing.T) { Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, }).Once() - // Mock participant details - fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ - SpaceId: mockedSpaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyId.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(""), - }, - }, - Keys: []string{ - bundle.RelationKeyId.String(), - bundle.RelationKeyName.String(), - bundle.RelationKeyIconEmoji.String(), - bundle.RelationKeyIconImage.String(), - bundle.RelationKeyIdentity.String(), - bundle.RelationKeyGlobalName.String(), - bundle.RelationKeyParticipantPermissions.String(), - }, - }).Return(&pb.RpcObjectSearchResponse{ - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - Records: []*types.Struct{ - {}, - }, - }).Twice() - // when object, err := fx.CreateObject(ctx, mockedSpaceId, CreateObjectRequest{ Name: mockedObjectName, diff --git a/core/api/internal/search/service_test.go b/core/api/internal/search/service_test.go index 233b6ee4f..c6d1e023a 100644 --- a/core/api/internal/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -284,7 +284,30 @@ func TestSearchService_GlobalSearch(t *testing.T) { }, }, }, + RelationLinks: []*model.RelationLink{ + { + Key: bundle.RelationKeyLastModifiedDate.String(), + Format: model.RelationFormat_date, + }, + { + Key: bundle.RelationKeyLastModifiedBy.String(), + Format: model.RelationFormat_object, + }, + { + Key: bundle.RelationKeyCreatedDate.String(), + Format: model.RelationFormat_date, + }, + { + Key: bundle.RelationKeyCreator.String(), + Format: model.RelationFormat_object, + }, + { + Key: bundle.RelationKeyTag.String(), + Format: model.RelationFormat_tag, + }, + }, }, + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, }, nil).Once() @@ -486,30 +509,6 @@ func TestSearchService_Search(t *testing.T) { Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, }).Once() - // Mock participant details - fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ - SpaceId: mockedSpaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyId.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(""), - }, - }, - Keys: []string{bundle.RelationKeyId.String(), - bundle.RelationKeyName.String(), - bundle.RelationKeyIconEmoji.String(), - bundle.RelationKeyIconImage.String(), - bundle.RelationKeyIdentity.String(), - bundle.RelationKeyGlobalName.String(), - bundle.RelationKeyParticipantPermissions.String(), - }, - }).Return(&pb.RpcObjectSearchResponse{ - Records: []*types.Struct{}, - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - }).Twice() - // when objects, total, hasMore, err := fx.Search(ctx, mockedSpaceId, SearchRequest{Query: mockedSearchTerm, Types: []string{}, Sort: SortOptions{Direction: "desc", Timestamp: "last_modified_date"}}, offset, limit) diff --git a/core/api/util/util.go b/core/api/util/util.go index c8ce71dec..db6e3e427 100644 --- a/core/api/util/util.go +++ b/core/api/util/util.go @@ -54,3 +54,29 @@ func ResolveUniqueKeyToTypeId(mw service.ClientCommandsServer, spaceId string, u return resp.Records[0].Fields[bundle.RelationKeyId.String()].GetStringValue(), nil } + +func ResolveRelationKeyToRelationName(mw service.ClientCommandsServer, spaceId string, relationKey string) (relation *model.Relation, err error) { + resp := mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + SpaceId: spaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyRelationKey.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(relationKey), + }, + }, + Keys: []string{bundle.RelationKeyId.String()}, + }) + + if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + return &model.Relation{}, ErrFailedSearchType + } + + if len(resp.Records) == 0 { + return &model.Relation{}, ErrorTypeNotFound + } + + return &model.Relation{ + Name: resp.Records[0].Fields[bundle.RelationKeyName.String()].GetStringValue(), + }, nil +} From 820a894bf135b5fb815c8903623109c93236b888 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sat, 15 Feb 2025 20:07:13 +0100 Subject: [PATCH 019/132] GO-4459: Add exclusion of system relations in object details --- core/api/internal/object/service.go | 94 +++++++++++++++++++---------- core/api/util/util.go | 8 ++- 2 files changed, 70 insertions(+), 32 deletions(-) diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 2ec4ba64b..0079b9095 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -3,8 +3,6 @@ package object import ( "context" "errors" - "sync" - "time" "github.com/gogo/protobuf/types" "github.com/iancoleman/strcase" @@ -462,15 +460,58 @@ func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { linkedRelations := resp.ObjectView.RelationLinks primaryDetailFields := resp.ObjectView.Details[0].Details.Fields + // system relations to be excluded + excludeRelations := map[string]bool{ + bundle.RelationKeyId.String(): true, + bundle.RelationKeySpaceId.String(): true, + bundle.RelationKeyName.String(): true, + bundle.RelationKeyIconEmoji.String(): true, + bundle.RelationKeyIconImage.String(): true, + bundle.RelationKeyType.String(): true, + bundle.RelationKeyLayout.String(): true, + bundle.RelationKeyIsFavorite.String(): true, + bundle.RelationKeyIsArchived.String(): true, + bundle.RelationKeyIsDeleted.String(): true, + bundle.RelationKeyIsHidden.String(): true, + bundle.RelationKeyWorkspaceId.String(): true, + bundle.RelationKeyInternalFlags.String(): true, + bundle.RelationKeyRestrictions.String(): true, + bundle.RelationKeyOrigin.String(): true, + bundle.RelationKeySnippet.String(): true, + bundle.RelationKeySyncStatus.String(): true, + bundle.RelationKeySyncError.String(): true, + bundle.RelationKeySyncDate.String(): true, + bundle.RelationKeyCoverId.String(): true, + bundle.RelationKeyCoverType.String(): true, + bundle.RelationKeyCoverScale.String(): true, + bundle.RelationKeyCoverX.String(): true, + bundle.RelationKeyCoverY.String(): true, + bundle.RelationKeyMentions.String(): true, + bundle.RelationKeyOldAnytypeID.String(): true, + bundle.RelationKeySource.String(): true, + bundle.RelationKeySourceFilePath.String(): true, + bundle.RelationKeyImportType.String(): true, + bundle.RelationKeyTargetObjectType.String(): true, + bundle.RelationKeyFeaturedRelations.String(): true, + bundle.RelationKeySetOf.String(): true, + bundle.RelationKeyLinks.String(): true, + bundle.RelationKeyBacklinks.String(): true, + bundle.RelationKeySourceObject.String(): true, + } + var details []Detail for _, r := range linkedRelations { + if _, isExcluded := excludeRelations[r.Key]; isExcluded { + continue + } + if val, ok := primaryDetailFields[r.Key]; ok { - relName := s.getRelationName(r.Key, resp) + id, name := s.getRelation(r.Key, resp) format := relationFormatMap[r.Key] details = append(details, Detail{ - Id: strcase.ToSnake(relName), + Id: id, Details: map[string]interface{}{ - "name": relName, + "name": name, "type": format, format: s.convertValue(val, format, r.Key, resp.ObjectView.Details), }, @@ -480,24 +521,25 @@ func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { return details } -// getRelationName returns the relation name from the RelationKey or the resolved relation name. -func (s *ObjectService) getRelationName(key string, resp *pb.RpcObjectShowResponse) string { +// getRelationName returns the relation id and relation name from the ObjectShowResponse. +func (s *ObjectService) getRelation(key string, resp *pb.RpcObjectShowResponse) (id string, name string) { relation, err := bundle.GetRelation(domain.RelationKey(key)) if err != nil { relation, err = util.ResolveRelationKeyToRelationName(s.mw, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), key) if err != nil { - return key + return strcase.ToSnake(key), key } + return key, relation.Name } - // custom relation names + // special cases of relation keys and names if key == bundle.RelationKeyCreator.String() { - return "Created By" + return "created_by", "Created By" } else if key == bundle.RelationKeyCreatedDate.String() { - return "Created Date" + return "created_date", "Created Date" } - return relation.Name + return strcase.ToSnake(key), relation.Name } // convertValue converts a protobuf types.Value into a native Go value. @@ -507,7 +549,7 @@ func (s *ObjectService) convertValue(value *types.Value, format string, key stri return nil case *types.Value_NumberValue: if format == "date" { - return PosixToISO8601(kind.NumberValue) + return util.PosixToISO8601(kind.NumberValue) } return kind.NumberValue case *types.Value_StringValue: @@ -534,11 +576,7 @@ func (s *ObjectService) convertValue(value *types.Value, format string, key stri } if format == "select" || format == "multi_select" { - return s.getTags(&pb.RpcObjectShowResponse{ - ObjectView: &model.ObjectView{ - Details: details, - }, - }) + return s.getTags(key, details) } return list @@ -549,10 +587,10 @@ func (s *ObjectService) convertValue(value *types.Value, format string, key stri // getRelationFormatMapFromResponse returns the map of relation key to relation format from the ObjectShowResponse. func (s *ObjectService) getRelationFormatMap(relationLinks []*model.RelationLink) map[string]string { - var relationFormatToName = model.RelationFormat_name - var mu sync.Mutex - - mu.Lock() + relationFormatToName := make(map[int32]string, len(model.RelationFormat_name)) + for k, v := range model.RelationFormat_name { + relationFormatToName[k] = v + } relationFormatToName[int32(model.RelationFormat_longtext)] = "text" relationFormatToName[int32(model.RelationFormat_shorttext)] = "text" relationFormatToName[int32(model.RelationFormat_tag)] = "multi_select" @@ -562,23 +600,22 @@ func (s *ObjectService) getRelationFormatMap(relationLinks []*model.RelationLink for _, detail := range relationLinks { relationFormatMap[detail.Key] = relationFormatToName[int32(detail.Format)] } - mu.Unlock() return relationFormatMap } // getTags returns the list of tags from the ObjectShowResponse -func (s *ObjectService) getTags(resp *pb.RpcObjectShowResponse) []Tag { +func (s *ObjectService) getTags(key string, details []*model.ObjectViewDetailsSet) []Tag { tags := []Tag{} - tagField, ok := resp.ObjectView.Details[0].Details.Fields["tag"] + tagField, ok := details[0].Details.Fields[key] if !ok || tagField.GetListValue() == nil { return tags } for _, tagId := range tagField.GetListValue().Values { id := tagId.GetStringValue() - for _, detail := range resp.ObjectView.Details { + for _, detail := range details { if detail.Id == id { tags = append(tags, Tag{ Id: id, @@ -643,8 +680,3 @@ func (s *ObjectService) getBlocks(resp *pb.RpcObjectShowResponse) []Block { return blocks } - -func PosixToISO8601(posix float64) string { - t := time.Unix(int64(posix), 0).UTC() - return t.Format(time.RFC3339) -} diff --git a/core/api/util/util.go b/core/api/util/util.go index db6e3e427..25eacf1d2 100644 --- a/core/api/util/util.go +++ b/core/api/util/util.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "time" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service" @@ -17,6 +18,11 @@ var ( ErrorTypeNotFound = errors.New("type not found") ) +func PosixToISO8601(posix float64) string { + t := time.Unix(int64(posix), 0).UTC() + return t.Format(time.RFC3339) +} + // GetIconFromEmojiOrImage returns the icon to use for the object, which can be either an emoji or an image url func GetIconFromEmojiOrImage(accountInfo *model.AccountInfo, iconEmoji string, iconImage string) string { if iconEmoji != "" { @@ -65,7 +71,7 @@ func ResolveRelationKeyToRelationName(mw service.ClientCommandsServer, spaceId s Value: pbtypes.String(relationKey), }, }, - Keys: []string{bundle.RelationKeyId.String()}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String()}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { From ce783a72e31b470cc306ba3d5d43cf422855af62 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 16 Feb 2025 12:00:47 +0100 Subject: [PATCH 020/132] GO-4459: Fix security definition to ApiKey auth --- core/api/docs/docs.go | 26 ++++++++++++++++++++------ core/api/docs/swagger.json | 26 ++++++++++++++++++++------ core/api/docs/swagger.yaml | 18 +++++++++++++----- core/api/service.go | 4 +++- 4 files changed, 56 insertions(+), 18 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 0c3db26ba..019faf5d9 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -1356,6 +1356,14 @@ const docTemplate = `{ "type": "string", "example": "64394517de52ad5acb89c66c" }, + "relation": { + "description": "The relation of the block, if applicable", + "allOf": [ + { + "$ref": "#/definitions/object.Relation" + } + ] + }, "text": { "description": "The text of the block, if applicable", "allOf": [ @@ -1560,6 +1568,14 @@ const docTemplate = `{ } } }, + "object.Relation": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + } + }, "object.Template": { "type": "object", "properties": { @@ -2140,13 +2156,11 @@ const docTemplate = `{ } }, "securityDefinitions": { - "BasicAuth": { - "type": "basic" + "ApiKeyAuth": { + "type": "apiKey", + "name": "Authorization", + "in": "header" } - }, - "externalDocs": { - "description": "OpenAPI", - "url": "https://swagger.io/resources/open-api/" } }` diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 223b83383..f0af08881 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1350,6 +1350,14 @@ "type": "string", "example": "64394517de52ad5acb89c66c" }, + "relation": { + "description": "The relation of the block, if applicable", + "allOf": [ + { + "$ref": "#/definitions/object.Relation" + } + ] + }, "text": { "description": "The text of the block, if applicable", "allOf": [ @@ -1554,6 +1562,14 @@ } } }, + "object.Relation": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + } + }, "object.Template": { "type": "object", "properties": { @@ -2134,12 +2150,10 @@ } }, "securityDefinitions": { - "BasicAuth": { - "type": "basic" + "ApiKeyAuth": { + "type": "apiKey", + "name": "Authorization", + "in": "header" } - }, - "externalDocs": { - "description": "OpenAPI", - "url": "https://swagger.io/resources/open-api/" } } \ No newline at end of file diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 0dd2b302a..c4dfe63d1 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -56,6 +56,10 @@ definitions: description: The id of the block example: 64394517de52ad5acb89c66c type: string + relation: + allOf: + - $ref: '#/definitions/object.Relation' + description: The relation of the block, if applicable text: allOf: - $ref: '#/definitions/object.Text' @@ -205,6 +209,11 @@ definitions: - $ref: '#/definitions/object.Object' description: The object type: object + object.Relation: + properties: + id: + type: string + type: object object.Template: properties: icon: @@ -615,9 +624,6 @@ definitions: type: string type: object type: object -externalDocs: - description: OpenAPI - url: https://swagger.io/resources/open-api/ host: localhost:31009 info: contact: @@ -1476,6 +1482,8 @@ paths: tags: - lists securityDefinitions: - BasicAuth: - type: basic + ApiKeyAuth: + in: header + name: Authorization + type: apiKey swagger: "2.0" diff --git a/core/api/service.go b/core/api/service.go index 6027337b6..d6cb17d47 100644 --- a/core/api/service.go +++ b/core/api/service.go @@ -60,7 +60,9 @@ func (s *apiService) Name() (name string) { // @license.url https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md // @host localhost:31009 // @BasePath /v1 -// @securityDefinitions.basic BasicAuth +// @securityDefinitions.apikey ApiKeyAuth +// @in header +// @name Authorization // @externalDocs.description OpenAPI // @externalDocs.url https://swagger.io/resources/open-api/ func (s *apiService) Init(a *app.App) (err error) { From 0a0ef5317dcd2dd0b706509cba51a5a0d60ea51c Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 16 Feb 2025 12:59:37 +0100 Subject: [PATCH 021/132] GO-4459: Upgrade to OpenAPI specification v3.1 and swaggo/swag v2 --- core/api/docs/docs.go | 2173 +------------------------- core/api/docs/swagger.json | 2165 +------------------------- core/api/docs/swagger.yaml | 2226 +++++++++++++++------------ core/api/internal/export/handler.go | 1 + core/api/internal/list/handler.go | 25 +- core/api/internal/list/service.go | 8 +- core/api/internal/object/handler.go | 15 +- core/api/internal/search/handler.go | 2 + core/api/internal/space/handler.go | 9 +- core/api/server/router.go | 2 +- core/api/service.go | 30 +- go.mod | 12 +- go.sum | 16 + 13 files changed, 1287 insertions(+), 5397 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 019faf5d9..2faeb5526 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -1,2175 +1,24 @@ -// Package docs Code generated by swaggo/swag. DO NOT EDIT +// Code generated by swaggo/swag. DO NOT EDIT. + package docs -import "github.com/swaggo/swag" +import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "swagger": "2.0", - "info": { - "description": "{{escape .Description}}", - "title": "{{.Title}}", - "termsOfService": "https://anytype.io/terms_of_use", - "contact": { - "name": "Anytype Support", - "url": "https://anytype.io/contact", - "email": "support@anytype.io" - }, - "license": { - "name": "Any Source Available License 1.0", - "url": "https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md" - }, - "version": "{{.Version}}" - }, - "host": "{{.Host}}", - "basePath": "{{.BasePath}}", - "paths": { - "/auth/display_code": { - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "auth" - ], - "summary": "Start new challenge", - "parameters": [ - { - "type": "string", - "description": "App name requesting the challenge", - "name": "app_name", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Challenge ID", - "schema": { - "$ref": "#/definitions/auth.DisplayCodeResponse" - } - }, - "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/util.ValidationError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/auth/token": { - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "auth" - ], - "summary": "Retrieve token", - "parameters": [ - { - "type": "string", - "description": "Challenge ID", - "name": "challenge_id", - "in": "query", - "required": true - }, - { - "type": "string", - "description": "4-digit code retrieved from Anytype Desktop app", - "name": "code", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Authentication token", - "schema": { - "$ref": "#/definitions/auth.TokenResponse" - } - }, - "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/util.ValidationError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/search": { - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "search" - ], - "summary": "Search objects across all spaces", - "parameters": [ - { - "type": "integer", - "default": 0, - "description": "The number of items to skip before starting to collect the result set", - "name": "offset", - "in": "query" - }, - { - "maximum": 1000, - "type": "integer", - "default": 100, - "description": "The number of items to return", - "name": "limit", - "in": "query" - }, - { - "description": "Search parameters", - "name": "request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/search.SearchRequest" - } - } - ], - "responses": { - "200": { - "description": "List of objects", - "schema": { - "$ref": "#/definitions/pagination.PaginatedResponse-object_Object" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "spaces" - ], - "summary": "List spaces", - "parameters": [ - { - "type": "integer", - "default": 0, - "description": "The number of items to skip before starting to collect the result set", - "name": "offset", - "in": "query" - }, - { - "maximum": 1000, - "type": "integer", - "default": 100, - "description": "The number of items to return", - "name": "limit", - "in": "query" - } - ], - "responses": { - "200": { - "description": "List of spaces", - "schema": { - "$ref": "#/definitions/pagination.PaginatedResponse-space_Space" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - }, - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "spaces" - ], - "summary": "Create space", - "parameters": [ - { - "description": "Space to create", - "name": "name", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/space.CreateSpaceRequest" - } - } - ], - "responses": { - "200": { - "description": "Space created successfully", - "schema": { - "$ref": "#/definitions/space.SpaceResponse" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/util.ValidationError" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "423": { - "description": "Rate limit exceeded", - "schema": { - "$ref": "#/definitions/util.RateLimitError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "spaces" - ], - "summary": "Get space", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "Space", - "schema": { - "$ref": "#/definitions/space.SpaceResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "404": { - "description": "Space not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}/members": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "spaces" - ], - "summary": "List members", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "integer", - "default": 0, - "description": "The number of items to skip before starting to collect the result set", - "name": "offset", - "in": "query" - }, - { - "maximum": 1000, - "type": "integer", - "default": 100, - "description": "The number of items to return", - "name": "limit", - "in": "query" - } - ], - "responses": { - "200": { - "description": "List of members", - "schema": { - "$ref": "#/definitions/pagination.PaginatedResponse-space_Member" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}/members/{member_id}": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "spaces" - ], - "summary": "Get member", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Member ID", - "name": "member_id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "Member", - "schema": { - "$ref": "#/definitions/space.MemberResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "404": { - "description": "Member not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}/objects": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "objects" - ], - "summary": "List objects", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "integer", - "default": 0, - "description": "The number of items to skip before starting to collect the result set", - "name": "offset", - "in": "query" - }, - { - "maximum": 1000, - "type": "integer", - "default": 100, - "description": "The number of items to return", - "name": "limit", - "in": "query" - } - ], - "responses": { - "200": { - "description": "List of objects", - "schema": { - "$ref": "#/definitions/pagination.PaginatedResponse-object_Object" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - }, - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "objects" - ], - "summary": "Create object", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "description": "Object to create", - "name": "object", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/object.CreateObjectRequest" - } - } - ], - "responses": { - "200": { - "description": "The created object", - "schema": { - "$ref": "#/definitions/object.ObjectResponse" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/util.ValidationError" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "423": { - "description": "Rate limit exceeded", - "schema": { - "$ref": "#/definitions/util.RateLimitError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}/objects/{object_id}": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "objects" - ], - "summary": "Get object", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Object ID", - "name": "object_id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "The requested object", - "schema": { - "$ref": "#/definitions/object.ObjectResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - }, - "delete": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "objects" - ], - "summary": "Delete object", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Object ID", - "name": "object_id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "The deleted object", - "schema": { - "$ref": "#/definitions/object.ObjectResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "403": { - "description": "Forbidden", - "schema": { - "$ref": "#/definitions/util.ForbiddenError" - } - }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "423": { - "description": "Rate limit exceeded", - "schema": { - "$ref": "#/definitions/util.RateLimitError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}/objects/{object_id}/export/{format}": { - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "export" - ], - "summary": "Export object", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Object ID", - "name": "object_id", - "in": "path", - "required": true - }, - { - "enum": [ - "markdown", - "protobuf" - ], - "type": "string", - "description": "Export format", - "name": "format", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "Object exported successfully", - "schema": { - "$ref": "#/definitions/export.ObjectExportResponse" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/util.ValidationError" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}/search": { - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "search" - ], - "summary": "Search objects within a space", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "integer", - "default": 0, - "description": "The number of items to skip before starting to collect the result set", - "name": "offset", - "in": "query" - }, - { - "maximum": 1000, - "type": "integer", - "default": 100, - "description": "The number of items to return", - "name": "limit", - "in": "query" - }, - { - "description": "Search parameters", - "name": "request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/search.SearchRequest" - } - } - ], - "responses": { - "200": { - "description": "List of objects", - "schema": { - "$ref": "#/definitions/pagination.PaginatedResponse-object_Object" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}/types": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "types" - ], - "summary": "List types", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "integer", - "default": 0, - "description": "The number of items to skip before starting to collect the result set", - "name": "offset", - "in": "query" - }, - { - "maximum": 1000, - "type": "integer", - "default": 100, - "description": "The number of items to return", - "name": "limit", - "in": "query" - } - ], - "responses": { - "200": { - "description": "List of types", - "schema": { - "$ref": "#/definitions/pagination.PaginatedResponse-object_Type" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}/types/{type_id}": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "types" - ], - "summary": "Get type", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Type ID", - "name": "type_id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "The requested type", - "schema": { - "$ref": "#/definitions/object.TypeResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}/types/{type_id}/templates": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "types" - ], - "summary": "List templates", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Type ID", - "name": "type_id", - "in": "path", - "required": true - }, - { - "type": "integer", - "default": 0, - "description": "The number of items to skip before starting to collect the result set", - "name": "offset", - "in": "query" - }, - { - "maximum": 1000, - "type": "integer", - "default": 100, - "description": "The number of items to return", - "name": "limit", - "in": "query" - } - ], - "responses": { - "200": { - "description": "List of templates", - "schema": { - "$ref": "#/definitions/pagination.PaginatedResponse-object_Template" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}/types/{type_id}/templates/{template_id}": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "types" - ], - "summary": "Get template", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Type ID", - "name": "type_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Template ID", - "name": "template_id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "The requested template", - "schema": { - "$ref": "#/definitions/object.TemplateResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/v1/spaces/{space_id}/lists/{list_id}/objects": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "lists" - ], - "summary": "Get objects in list", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "List ID", - "name": "list_id", - "in": "path", - "required": true - }, - { - "type": "integer", - "default": 0, - "description": "The number of items to skip before starting to collect the result set", - "name": "offset", - "in": "query" - }, - { - "type": "integer", - "description": "The number of items to return", - "name": "limit", - "in": "query" - } - ], - "responses": { - "200": { - "description": "List of objects", - "schema": { - "$ref": "#/definitions/pagination.PaginatedResponse-object_Object" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "404": { - "description": "Not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - }, - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "lists" - ], - "summary": "Add objects to list", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "List ID", - "name": "list_id", - "in": "path", - "required": true - }, - { - "description": "List of object IDs", - "name": "objects", - "in": "body", - "required": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - ], - "responses": { - "200": { - "description": "Objects added successfully", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/util.ValidationError" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "404": { - "description": "Not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - }, - "delete": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "lists" - ], - "summary": "Remove objects from list", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "List ID", - "name": "list_id", - "in": "path", - "required": true - }, - { - "description": "List of object IDs", - "name": "objects", - "in": "body", - "required": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - ], - "responses": { - "200": { - "description": "Objects removed successfully", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/util.ValidationError" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "404": { - "description": "Not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - } - }, - "definitions": { - "auth.DisplayCodeResponse": { - "type": "object", - "properties": { - "challenge_id": { - "description": "The challenge id associated with the displayed code and needed to solve the challenge for token", - "type": "string", - "example": "67647f5ecda913e9a2e11b26" - } - } - }, - "auth.TokenResponse": { - "type": "object", - "properties": { - "app_key": { - "description": "The permanent app key", - "type": "string", - "example": "zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=" - }, - "session_token": { - "description": "The ephemeral session token", - "type": "string", - "example": "eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII" - } - } - }, - "export.ObjectExportResponse": { - "type": "object", - "properties": { - "path": { - "description": "The path the object was exported to", - "type": "string", - "example": "/path/to/export" - } - } - }, - "object.Block": { - "type": "object", - "properties": { - "align": { - "description": "The alignment of the block", - "type": "string", - "enum": [ - "AlignLeft", - "AlignCenter", - "AlignRight", - "AlignJustify" - ], - "example": "AlignLeft" - }, - "background_color": { - "description": "The background color of the block", - "type": "string", - "example": "red" - }, - "children_ids": { - "description": "The ids of the block's children", - "type": "array", - "items": { - "type": "string" - }, - "example": [ - "['6797ce8ecda913cde14b02dc']" - ] - }, - "file": { - "description": "The file of the block, if applicable", - "allOf": [ - { - "$ref": "#/definitions/object.File" - } - ] - }, - "id": { - "description": "The id of the block", - "type": "string", - "example": "64394517de52ad5acb89c66c" - }, - "relation": { - "description": "The relation of the block, if applicable", - "allOf": [ - { - "$ref": "#/definitions/object.Relation" - } - ] - }, - "text": { - "description": "The text of the block, if applicable", - "allOf": [ - { - "$ref": "#/definitions/object.Text" - } - ] - }, - "vertical_align": { - "description": "The vertical alignment of the block", - "type": "string", - "enum": [ - "VerticalAlignTop", - "VerticalAlignMiddle", - "VerticalAlignBottom" - ], - "example": "VerticalAlignTop" - } - } - }, - "object.CreateObjectRequest": { - "type": "object", - "properties": { - "body": { - "description": "The body of the object", - "type": "string", - "example": "This is the body of the object. Markdown syntax is supported here." - }, - "description": { - "description": "The description of the object", - "type": "string", - "example": "This is a description of the object." - }, - "icon": { - "description": "The icon of the object", - "type": "string", - "example": "📄" - }, - "name": { - "description": "The name of the object", - "type": "string", - "example": "My object" - }, - "object_type_unique_key": { - "description": "The unique key of the object type", - "type": "string", - "example": "ot-page" - }, - "source": { - "description": "The source url, only applicable for bookmarks", - "type": "string", - "example": "https://bookmark-source.com" - }, - "template_id": { - "description": "The id of the template to use", - "type": "string", - "example": "bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge" - } - } - }, - "object.Detail": { - "type": "object", - "properties": { - "details": { - "description": "The details", - "type": "object", - "additionalProperties": true - }, - "id": { - "description": "The id of the detail", - "type": "string", - "enum": [ - "last_modified_date", - "last_modified_by", - "created_date", - "created_by", - "last_opened_date", - "tags" - ], - "example": "last_modified_date" - } - } - }, - "object.File": { - "type": "object", - "properties": { - "added_at": { - "description": "The added at of the file", - "type": "integer" - }, - "hash": { - "description": "The hash of the file", - "type": "string" - }, - "mime": { - "description": "The mime of the file", - "type": "string" - }, - "name": { - "description": "The name of the file", - "type": "string" - }, - "size": { - "description": "The size of the file", - "type": "integer" - }, - "state": { - "description": "The state of the file", - "type": "string" - }, - "style": { - "description": "The style of the file", - "type": "string" - }, - "target_object_id": { - "description": "The target object id of the file", - "type": "string" - }, - "type": { - "description": "The type of the file", - "type": "string" - } - } - }, - "object.Object": { - "type": "object", - "properties": { - "blocks": { - "description": "The blocks of the object", - "type": "array", - "items": { - "$ref": "#/definitions/object.Block" - } - }, - "details": { - "description": "The details of the object", - "type": "array", - "items": { - "$ref": "#/definitions/object.Detail" - } - }, - "icon": { - "description": "The icon of the object", - "type": "string", - "example": "📄" - }, - "id": { - "description": "The id of the object", - "type": "string", - "example": "bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ" - }, - "layout": { - "description": "The layout of the object", - "type": "string", - "example": "basic" - }, - "name": { - "description": "The name of the object", - "type": "string", - "example": "My object" - }, - "object": { - "description": "The data model of the object", - "type": "string", - "example": "object" - }, - "root_id": { - "description": "The id of the object's root", - "type": "string", - "example": "bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u" - }, - "snippet": { - "description": "The snippet of the object, especially important for notes as they don't have a name", - "type": "string", - "example": "The beginning of the object body..." - }, - "space_id": { - "description": "The id of the space the object is in", - "type": "string", - "example": "bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1" - }, - "type": { - "description": "The type of the object", - "allOf": [ - { - "$ref": "#/definitions/object.Type" - } - ] - } - } - }, - "object.ObjectResponse": { - "type": "object", - "properties": { - "object": { - "description": "The object", - "allOf": [ - { - "$ref": "#/definitions/object.Object" - } - ] - } - } - }, - "object.Relation": { - "type": "object", - "properties": { - "id": { - "type": "string" - } - } - }, - "object.Template": { - "type": "object", - "properties": { - "icon": { - "description": "The icon of the template", - "type": "string", - "example": "📄" - }, - "id": { - "description": "The id of the template", - "type": "string", - "example": "bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge" - }, - "name": { - "description": "The name of the template", - "type": "string", - "example": "My template" - }, - "object": { - "description": "The data model of the object", - "type": "string", - "example": "template" - } - } - }, - "object.TemplateResponse": { - "type": "object", - "properties": { - "template": { - "description": "The template", - "allOf": [ - { - "$ref": "#/definitions/object.Template" - } - ] - } - } - }, - "object.Text": { - "type": "object", - "properties": { - "checked": { - "description": "Whether the text is checked", - "type": "boolean", - "example": true - }, - "color": { - "description": "The color of the text", - "type": "string", - "example": "red" - }, - "icon": { - "description": "The icon of the text", - "type": "string", - "example": "📄" - }, - "style": { - "description": "The style of the text", - "type": "string", - "enum": [ - "Paragraph", - "Header1", - "Header2", - "Header3", - "Header4", - "Quote", - "Code", - "Title", - "Checkbox", - "Marked", - "Numbered", - "Toggle", - "Description", - "Callout" - ], - "example": "Paragraph" - }, - "text": { - "description": "The text", - "type": "string", - "example": "Some text..." - } - } - }, - "object.Type": { - "type": "object", - "properties": { - "icon": { - "description": "The icon of the type", - "type": "string", - "example": "📄" - }, - "id": { - "description": "The id of the type", - "type": "string", - "example": "bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu" - }, - "name": { - "description": "The name of the type", - "type": "string", - "example": "Page" - }, - "object": { - "description": "The data model of the object", - "type": "string", - "example": "type" - }, - "recommended_layout": { - "description": "The recommended layout of the type", - "type": "string", - "example": "todo" - }, - "unique_key": { - "description": "The unique key of the type", - "type": "string", - "example": "ot-page" - } - } - }, - "object.TypeResponse": { - "type": "object", - "properties": { - "type": { - "description": "The type", - "allOf": [ - { - "$ref": "#/definitions/object.Type" - } - ] - } - } - }, - "pagination.PaginatedResponse-object_Object": { - "type": "object", - "properties": { - "data": { - "description": "The list of items in the current result set", - "type": "array", - "items": { - "$ref": "#/definitions/object.Object" - } - }, - "pagination": { - "description": "The pagination metadata for the response", - "allOf": [ - { - "$ref": "#/definitions/pagination.PaginationMeta" - } - ] - } - } - }, - "pagination.PaginatedResponse-object_Template": { - "type": "object", - "properties": { - "data": { - "description": "The list of items in the current result set", - "type": "array", - "items": { - "$ref": "#/definitions/object.Template" - } - }, - "pagination": { - "description": "The pagination metadata for the response", - "allOf": [ - { - "$ref": "#/definitions/pagination.PaginationMeta" - } - ] - } - } - }, - "pagination.PaginatedResponse-object_Type": { - "type": "object", - "properties": { - "data": { - "description": "The list of items in the current result set", - "type": "array", - "items": { - "$ref": "#/definitions/object.Type" - } - }, - "pagination": { - "description": "The pagination metadata for the response", - "allOf": [ - { - "$ref": "#/definitions/pagination.PaginationMeta" - } - ] - } - } - }, - "pagination.PaginatedResponse-space_Member": { - "type": "object", - "properties": { - "data": { - "description": "The list of items in the current result set", - "type": "array", - "items": { - "$ref": "#/definitions/space.Member" - } - }, - "pagination": { - "description": "The pagination metadata for the response", - "allOf": [ - { - "$ref": "#/definitions/pagination.PaginationMeta" - } - ] - } - } - }, - "pagination.PaginatedResponse-space_Space": { - "type": "object", - "properties": { - "data": { - "description": "The list of items in the current result set", - "type": "array", - "items": { - "$ref": "#/definitions/space.Space" - } - }, - "pagination": { - "description": "The pagination metadata for the response", - "allOf": [ - { - "$ref": "#/definitions/pagination.PaginationMeta" - } - ] - } - } - }, - "pagination.PaginationMeta": { - "type": "object", - "properties": { - "has_more": { - "description": "Indicates if there are more items available beyond the current result set", - "type": "boolean", - "example": true - }, - "limit": { - "description": "The maximum number of items returned in the result set", - "type": "integer", - "example": 100 - }, - "offset": { - "description": "The number of items skipped before starting to collect the result set", - "type": "integer", - "example": 0 - }, - "total": { - "description": "The total number of items available for the endpoint", - "type": "integer", - "example": 1024 - } - } - }, - "search.SearchRequest": { - "type": "object", - "properties": { - "query": { - "description": "The search term to look for in object names and snippets", - "type": "string", - "example": "test" - }, - "sort": { - "description": "The sorting criteria and direction for the search results", - "allOf": [ - { - "$ref": "#/definitions/search.SortOptions" - } - ] - }, - "types": { - "description": "The types of objects to search for, specified by unique key or ID", - "type": "array", - "items": { - "type": "string" - }, - "example": [ - "ot-note", - "ot-page", - "ot-678043f0cda9133be777049f", - "bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q" - ] - } - } - }, - "search.SortOptions": { - "type": "object", - "properties": { - "direction": { - "description": "The direction to sort the search results", - "type": "string", - "default": "desc", - "enum": [ - "asc", - "desc" - ] - }, - "timestamp": { - "description": "The timestamp to sort the search results by", - "type": "string", - "default": "last_modified_date", - "enum": [ - "created_date", - "last_modified_date", - "last_opened_date" - ] - } - } - }, - "space.CreateSpaceRequest": { - "type": "object", - "properties": { - "name": { - "description": "The name of the space", - "type": "string", - "example": "New Space" - } - } - }, - "space.Member": { - "type": "object", - "properties": { - "global_name": { - "description": "The global name of the member in the network", - "type": "string", - "example": "john.any" - }, - "icon": { - "description": "The icon of the member", - "type": "string", - "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100" - }, - "id": { - "description": "The profile object id of the member", - "type": "string", - "example": "_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ" - }, - "identity": { - "description": "The identity of the member in the network", - "type": "string", - "example": "AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ" - }, - "name": { - "description": "The name of the member", - "type": "string", - "example": "John Doe" - }, - "object": { - "description": "The data model of the object", - "type": "string", - "example": "member" - }, - "role": { - "description": "The role of the member", - "type": "string", - "enum": [ - "Reader", - "Writer", - "Owner", - "NoPermission" - ], - "example": "Owner" - } - } - }, - "space.MemberResponse": { - "type": "object", - "properties": { - "member": { - "description": "The member", - "allOf": [ - { - "$ref": "#/definitions/space.Member" - } - ] - } - } - }, - "space.Space": { - "type": "object", - "properties": { - "account_space_id": { - "description": "The id of the account space", - "type": "string", - "example": "bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1" - }, - "analytics_id": { - "description": "The analytics id of the account", - "type": "string", - "example": "624aecdd-4797-4611-9d61-a2ae5f53cf1c" - }, - "archive_object_id": { - "description": "The id of the archive object", - "type": "string", - "example": "bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri" - }, - "device_id": { - "description": "The id of the device", - "type": "string", - "example": "12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF" - }, - "gateway_url": { - "description": "The gateway url to serve files and media", - "type": "string", - "example": "http://127.0.0.1:31006" - }, - "home_object_id": { - "description": "The id of the home object", - "type": "string", - "example": "bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya" - }, - "icon": { - "description": "The icon of the space", - "type": "string", - "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay" - }, - "id": { - "description": "The id of the space", - "type": "string", - "example": "bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1" - }, - "local_storage_path": { - "description": "The local storage path of the account", - "type": "string", - "example": "/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha" - }, - "marketplace_workspace_id": { - "description": "The id of the marketplace workspace", - "type": "string", - "example": "_anytype_marketplace" - }, - "name": { - "description": "The name of the space", - "type": "string", - "example": "My Space" - }, - "network_id": { - "description": "The network id of the space", - "type": "string", - "example": "N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU" - }, - "object": { - "description": "The data model of the object", - "type": "string", - "example": "space" - }, - "profile_object_id": { - "description": "The id of the profile object", - "type": "string", - "example": "bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4" - }, - "space_view_id": { - "description": "The id of the space view", - "type": "string", - "example": "bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy" - }, - "tech_space_id": { - "description": "The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself", - "type": "string", - "example": "bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1" - }, - "timezone": { - "description": "The timezone of the account", - "type": "string", - "example": "" - }, - "widgets_id": { - "description": "The id of the widgets", - "type": "string", - "example": "bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva" - }, - "workspace_object_id": { - "description": "The id of the workspace object", - "type": "string", - "example": "bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y" - } - } - }, - "space.SpaceResponse": { - "type": "object", - "properties": { - "space": { - "description": "The space", - "allOf": [ - { - "$ref": "#/definitions/space.Space" - } - ] - } - } - }, - "util.ForbiddenError": { - "type": "object", - "properties": { - "error": { - "type": "object", - "properties": { - "message": { - "type": "string", - "example": "Forbidden" - } - } - } - } - }, - "util.NotFoundError": { - "type": "object", - "properties": { - "error": { - "type": "object", - "properties": { - "message": { - "type": "string", - "example": "Resource not found" - } - } - } - } - }, - "util.RateLimitError": { - "type": "object", - "properties": { - "error": { - "type": "object", - "properties": { - "message": { - "type": "string", - "example": "Rate limit exceeded" - } - } - } - } - }, - "util.ServerError": { - "type": "object", - "properties": { - "error": { - "type": "object", - "properties": { - "message": { - "type": "string", - "example": "Internal server error" - } - } - } - } - }, - "util.UnauthorizedError": { - "type": "object", - "properties": { - "error": { - "type": "object", - "properties": { - "message": { - "type": "string", - "example": "Unauthorized" - } - } - } - } - }, - "util.ValidationError": { - "type": "object", - "properties": { - "error": { - "type": "object", - "properties": { - "message": { - "type": "string", - "example": "Bad request" - } - } - } - } - } - }, - "securityDefinitions": { - "ApiKeyAuth": { - "type": "apiKey", - "name": "Authorization", - "in": "header" - } - } + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"additionalProperties":{},"description":"The details","type":"object"},"id":{"description":"The id of the detail","enum":["last_modified_date","last_modified_by","created_date","created_by","last_opened_date","tags"],"example":"last_modified_date","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"description":"The icon of the template","example":"📄","type":"string"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"description":"The icon of the text","example":"📄","type":"string"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"description":"The icon of the type","example":"📄","type":"string"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-note","ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"description":"The icon of the member","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100","type":"string"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"description":"The icon of the space","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, + "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, + "paths": {"/auth/display_code":{"post":{"parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["spaces"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["spaces"]}},"/spaces/{space_id}/objects":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["types"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, + "openapi": "3.1.0", + "servers": [ + {"url":"localhost:31009/v1"} + ] }` // SwaggerInfo holds exported Swagger Info so clients can modify it var SwaggerInfo = &swag.Spec{ Version: "1.0", - Host: "localhost:31009", - BasePath: "/v1", - Schemes: []string{}, Title: "Anytype API", Description: "This API allows interaction with Anytype resources such as spaces, objects and types.", InfoInstanceName: "swagger", diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index f0af08881..c79693d6b 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,2159 +1,10 @@ { - "swagger": "2.0", - "info": { - "description": "This API allows interaction with Anytype resources such as spaces, objects and types.", - "title": "Anytype API", - "termsOfService": "https://anytype.io/terms_of_use", - "contact": { - "name": "Anytype Support", - "url": "https://anytype.io/contact", - "email": "support@anytype.io" - }, - "license": { - "name": "Any Source Available License 1.0", - "url": "https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md" - }, - "version": "1.0" - }, - "host": "localhost:31009", - "basePath": "/v1", - "paths": { - "/auth/display_code": { - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "auth" - ], - "summary": "Start new challenge", - "parameters": [ - { - "type": "string", - "description": "App name requesting the challenge", - "name": "app_name", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Challenge ID", - "schema": { - "$ref": "#/definitions/auth.DisplayCodeResponse" - } - }, - "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/util.ValidationError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/auth/token": { - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "auth" - ], - "summary": "Retrieve token", - "parameters": [ - { - "type": "string", - "description": "Challenge ID", - "name": "challenge_id", - "in": "query", - "required": true - }, - { - "type": "string", - "description": "4-digit code retrieved from Anytype Desktop app", - "name": "code", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Authentication token", - "schema": { - "$ref": "#/definitions/auth.TokenResponse" - } - }, - "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/util.ValidationError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/search": { - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "search" - ], - "summary": "Search objects across all spaces", - "parameters": [ - { - "type": "integer", - "default": 0, - "description": "The number of items to skip before starting to collect the result set", - "name": "offset", - "in": "query" - }, - { - "maximum": 1000, - "type": "integer", - "default": 100, - "description": "The number of items to return", - "name": "limit", - "in": "query" - }, - { - "description": "Search parameters", - "name": "request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/search.SearchRequest" - } - } - ], - "responses": { - "200": { - "description": "List of objects", - "schema": { - "$ref": "#/definitions/pagination.PaginatedResponse-object_Object" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "spaces" - ], - "summary": "List spaces", - "parameters": [ - { - "type": "integer", - "default": 0, - "description": "The number of items to skip before starting to collect the result set", - "name": "offset", - "in": "query" - }, - { - "maximum": 1000, - "type": "integer", - "default": 100, - "description": "The number of items to return", - "name": "limit", - "in": "query" - } - ], - "responses": { - "200": { - "description": "List of spaces", - "schema": { - "$ref": "#/definitions/pagination.PaginatedResponse-space_Space" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - }, - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "spaces" - ], - "summary": "Create space", - "parameters": [ - { - "description": "Space to create", - "name": "name", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/space.CreateSpaceRequest" - } - } - ], - "responses": { - "200": { - "description": "Space created successfully", - "schema": { - "$ref": "#/definitions/space.SpaceResponse" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/util.ValidationError" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "423": { - "description": "Rate limit exceeded", - "schema": { - "$ref": "#/definitions/util.RateLimitError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "spaces" - ], - "summary": "Get space", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "Space", - "schema": { - "$ref": "#/definitions/space.SpaceResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "404": { - "description": "Space not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}/members": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "spaces" - ], - "summary": "List members", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "integer", - "default": 0, - "description": "The number of items to skip before starting to collect the result set", - "name": "offset", - "in": "query" - }, - { - "maximum": 1000, - "type": "integer", - "default": 100, - "description": "The number of items to return", - "name": "limit", - "in": "query" - } - ], - "responses": { - "200": { - "description": "List of members", - "schema": { - "$ref": "#/definitions/pagination.PaginatedResponse-space_Member" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}/members/{member_id}": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "spaces" - ], - "summary": "Get member", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Member ID", - "name": "member_id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "Member", - "schema": { - "$ref": "#/definitions/space.MemberResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "404": { - "description": "Member not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}/objects": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "objects" - ], - "summary": "List objects", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "integer", - "default": 0, - "description": "The number of items to skip before starting to collect the result set", - "name": "offset", - "in": "query" - }, - { - "maximum": 1000, - "type": "integer", - "default": 100, - "description": "The number of items to return", - "name": "limit", - "in": "query" - } - ], - "responses": { - "200": { - "description": "List of objects", - "schema": { - "$ref": "#/definitions/pagination.PaginatedResponse-object_Object" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - }, - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "objects" - ], - "summary": "Create object", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "description": "Object to create", - "name": "object", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/object.CreateObjectRequest" - } - } - ], - "responses": { - "200": { - "description": "The created object", - "schema": { - "$ref": "#/definitions/object.ObjectResponse" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/util.ValidationError" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "423": { - "description": "Rate limit exceeded", - "schema": { - "$ref": "#/definitions/util.RateLimitError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}/objects/{object_id}": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "objects" - ], - "summary": "Get object", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Object ID", - "name": "object_id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "The requested object", - "schema": { - "$ref": "#/definitions/object.ObjectResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - }, - "delete": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "objects" - ], - "summary": "Delete object", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Object ID", - "name": "object_id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "The deleted object", - "schema": { - "$ref": "#/definitions/object.ObjectResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "403": { - "description": "Forbidden", - "schema": { - "$ref": "#/definitions/util.ForbiddenError" - } - }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "423": { - "description": "Rate limit exceeded", - "schema": { - "$ref": "#/definitions/util.RateLimitError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}/objects/{object_id}/export/{format}": { - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "export" - ], - "summary": "Export object", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Object ID", - "name": "object_id", - "in": "path", - "required": true - }, - { - "enum": [ - "markdown", - "protobuf" - ], - "type": "string", - "description": "Export format", - "name": "format", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "Object exported successfully", - "schema": { - "$ref": "#/definitions/export.ObjectExportResponse" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/util.ValidationError" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}/search": { - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "search" - ], - "summary": "Search objects within a space", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "integer", - "default": 0, - "description": "The number of items to skip before starting to collect the result set", - "name": "offset", - "in": "query" - }, - { - "maximum": 1000, - "type": "integer", - "default": 100, - "description": "The number of items to return", - "name": "limit", - "in": "query" - }, - { - "description": "Search parameters", - "name": "request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/search.SearchRequest" - } - } - ], - "responses": { - "200": { - "description": "List of objects", - "schema": { - "$ref": "#/definitions/pagination.PaginatedResponse-object_Object" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}/types": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "types" - ], - "summary": "List types", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "integer", - "default": 0, - "description": "The number of items to skip before starting to collect the result set", - "name": "offset", - "in": "query" - }, - { - "maximum": 1000, - "type": "integer", - "default": 100, - "description": "The number of items to return", - "name": "limit", - "in": "query" - } - ], - "responses": { - "200": { - "description": "List of types", - "schema": { - "$ref": "#/definitions/pagination.PaginatedResponse-object_Type" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}/types/{type_id}": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "types" - ], - "summary": "Get type", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Type ID", - "name": "type_id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "The requested type", - "schema": { - "$ref": "#/definitions/object.TypeResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}/types/{type_id}/templates": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "types" - ], - "summary": "List templates", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Type ID", - "name": "type_id", - "in": "path", - "required": true - }, - { - "type": "integer", - "default": 0, - "description": "The number of items to skip before starting to collect the result set", - "name": "offset", - "in": "query" - }, - { - "maximum": 1000, - "type": "integer", - "default": 100, - "description": "The number of items to return", - "name": "limit", - "in": "query" - } - ], - "responses": { - "200": { - "description": "List of templates", - "schema": { - "$ref": "#/definitions/pagination.PaginatedResponse-object_Template" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}/types/{type_id}/templates/{template_id}": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "types" - ], - "summary": "Get template", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Type ID", - "name": "type_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Template ID", - "name": "template_id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "The requested template", - "schema": { - "$ref": "#/definitions/object.TemplateResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/v1/spaces/{space_id}/lists/{list_id}/objects": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "lists" - ], - "summary": "Get objects in list", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "List ID", - "name": "list_id", - "in": "path", - "required": true - }, - { - "type": "integer", - "default": 0, - "description": "The number of items to skip before starting to collect the result set", - "name": "offset", - "in": "query" - }, - { - "type": "integer", - "description": "The number of items to return", - "name": "limit", - "in": "query" - } - ], - "responses": { - "200": { - "description": "List of objects", - "schema": { - "$ref": "#/definitions/pagination.PaginatedResponse-object_Object" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "404": { - "description": "Not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - }, - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "lists" - ], - "summary": "Add objects to list", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "List ID", - "name": "list_id", - "in": "path", - "required": true - }, - { - "description": "List of object IDs", - "name": "objects", - "in": "body", - "required": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - ], - "responses": { - "200": { - "description": "Objects added successfully", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/util.ValidationError" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "404": { - "description": "Not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - }, - "delete": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "lists" - ], - "summary": "Remove objects from list", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "List ID", - "name": "list_id", - "in": "path", - "required": true - }, - { - "description": "List of object IDs", - "name": "objects", - "in": "body", - "required": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - ], - "responses": { - "200": { - "description": "Objects removed successfully", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/util.ValidationError" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "404": { - "description": "Not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - } - }, - "definitions": { - "auth.DisplayCodeResponse": { - "type": "object", - "properties": { - "challenge_id": { - "description": "The challenge id associated with the displayed code and needed to solve the challenge for token", - "type": "string", - "example": "67647f5ecda913e9a2e11b26" - } - } - }, - "auth.TokenResponse": { - "type": "object", - "properties": { - "app_key": { - "description": "The permanent app key", - "type": "string", - "example": "zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=" - }, - "session_token": { - "description": "The ephemeral session token", - "type": "string", - "example": "eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII" - } - } - }, - "export.ObjectExportResponse": { - "type": "object", - "properties": { - "path": { - "description": "The path the object was exported to", - "type": "string", - "example": "/path/to/export" - } - } - }, - "object.Block": { - "type": "object", - "properties": { - "align": { - "description": "The alignment of the block", - "type": "string", - "enum": [ - "AlignLeft", - "AlignCenter", - "AlignRight", - "AlignJustify" - ], - "example": "AlignLeft" - }, - "background_color": { - "description": "The background color of the block", - "type": "string", - "example": "red" - }, - "children_ids": { - "description": "The ids of the block's children", - "type": "array", - "items": { - "type": "string" - }, - "example": [ - "['6797ce8ecda913cde14b02dc']" - ] - }, - "file": { - "description": "The file of the block, if applicable", - "allOf": [ - { - "$ref": "#/definitions/object.File" - } - ] - }, - "id": { - "description": "The id of the block", - "type": "string", - "example": "64394517de52ad5acb89c66c" - }, - "relation": { - "description": "The relation of the block, if applicable", - "allOf": [ - { - "$ref": "#/definitions/object.Relation" - } - ] - }, - "text": { - "description": "The text of the block, if applicable", - "allOf": [ - { - "$ref": "#/definitions/object.Text" - } - ] - }, - "vertical_align": { - "description": "The vertical alignment of the block", - "type": "string", - "enum": [ - "VerticalAlignTop", - "VerticalAlignMiddle", - "VerticalAlignBottom" - ], - "example": "VerticalAlignTop" - } - } - }, - "object.CreateObjectRequest": { - "type": "object", - "properties": { - "body": { - "description": "The body of the object", - "type": "string", - "example": "This is the body of the object. Markdown syntax is supported here." - }, - "description": { - "description": "The description of the object", - "type": "string", - "example": "This is a description of the object." - }, - "icon": { - "description": "The icon of the object", - "type": "string", - "example": "📄" - }, - "name": { - "description": "The name of the object", - "type": "string", - "example": "My object" - }, - "object_type_unique_key": { - "description": "The unique key of the object type", - "type": "string", - "example": "ot-page" - }, - "source": { - "description": "The source url, only applicable for bookmarks", - "type": "string", - "example": "https://bookmark-source.com" - }, - "template_id": { - "description": "The id of the template to use", - "type": "string", - "example": "bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge" - } - } - }, - "object.Detail": { - "type": "object", - "properties": { - "details": { - "description": "The details", - "type": "object", - "additionalProperties": true - }, - "id": { - "description": "The id of the detail", - "type": "string", - "enum": [ - "last_modified_date", - "last_modified_by", - "created_date", - "created_by", - "last_opened_date", - "tags" - ], - "example": "last_modified_date" - } - } - }, - "object.File": { - "type": "object", - "properties": { - "added_at": { - "description": "The added at of the file", - "type": "integer" - }, - "hash": { - "description": "The hash of the file", - "type": "string" - }, - "mime": { - "description": "The mime of the file", - "type": "string" - }, - "name": { - "description": "The name of the file", - "type": "string" - }, - "size": { - "description": "The size of the file", - "type": "integer" - }, - "state": { - "description": "The state of the file", - "type": "string" - }, - "style": { - "description": "The style of the file", - "type": "string" - }, - "target_object_id": { - "description": "The target object id of the file", - "type": "string" - }, - "type": { - "description": "The type of the file", - "type": "string" - } - } - }, - "object.Object": { - "type": "object", - "properties": { - "blocks": { - "description": "The blocks of the object", - "type": "array", - "items": { - "$ref": "#/definitions/object.Block" - } - }, - "details": { - "description": "The details of the object", - "type": "array", - "items": { - "$ref": "#/definitions/object.Detail" - } - }, - "icon": { - "description": "The icon of the object", - "type": "string", - "example": "📄" - }, - "id": { - "description": "The id of the object", - "type": "string", - "example": "bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ" - }, - "layout": { - "description": "The layout of the object", - "type": "string", - "example": "basic" - }, - "name": { - "description": "The name of the object", - "type": "string", - "example": "My object" - }, - "object": { - "description": "The data model of the object", - "type": "string", - "example": "object" - }, - "root_id": { - "description": "The id of the object's root", - "type": "string", - "example": "bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u" - }, - "snippet": { - "description": "The snippet of the object, especially important for notes as they don't have a name", - "type": "string", - "example": "The beginning of the object body..." - }, - "space_id": { - "description": "The id of the space the object is in", - "type": "string", - "example": "bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1" - }, - "type": { - "description": "The type of the object", - "allOf": [ - { - "$ref": "#/definitions/object.Type" - } - ] - } - } - }, - "object.ObjectResponse": { - "type": "object", - "properties": { - "object": { - "description": "The object", - "allOf": [ - { - "$ref": "#/definitions/object.Object" - } - ] - } - } - }, - "object.Relation": { - "type": "object", - "properties": { - "id": { - "type": "string" - } - } - }, - "object.Template": { - "type": "object", - "properties": { - "icon": { - "description": "The icon of the template", - "type": "string", - "example": "📄" - }, - "id": { - "description": "The id of the template", - "type": "string", - "example": "bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge" - }, - "name": { - "description": "The name of the template", - "type": "string", - "example": "My template" - }, - "object": { - "description": "The data model of the object", - "type": "string", - "example": "template" - } - } - }, - "object.TemplateResponse": { - "type": "object", - "properties": { - "template": { - "description": "The template", - "allOf": [ - { - "$ref": "#/definitions/object.Template" - } - ] - } - } - }, - "object.Text": { - "type": "object", - "properties": { - "checked": { - "description": "Whether the text is checked", - "type": "boolean", - "example": true - }, - "color": { - "description": "The color of the text", - "type": "string", - "example": "red" - }, - "icon": { - "description": "The icon of the text", - "type": "string", - "example": "📄" - }, - "style": { - "description": "The style of the text", - "type": "string", - "enum": [ - "Paragraph", - "Header1", - "Header2", - "Header3", - "Header4", - "Quote", - "Code", - "Title", - "Checkbox", - "Marked", - "Numbered", - "Toggle", - "Description", - "Callout" - ], - "example": "Paragraph" - }, - "text": { - "description": "The text", - "type": "string", - "example": "Some text..." - } - } - }, - "object.Type": { - "type": "object", - "properties": { - "icon": { - "description": "The icon of the type", - "type": "string", - "example": "📄" - }, - "id": { - "description": "The id of the type", - "type": "string", - "example": "bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu" - }, - "name": { - "description": "The name of the type", - "type": "string", - "example": "Page" - }, - "object": { - "description": "The data model of the object", - "type": "string", - "example": "type" - }, - "recommended_layout": { - "description": "The recommended layout of the type", - "type": "string", - "example": "todo" - }, - "unique_key": { - "description": "The unique key of the type", - "type": "string", - "example": "ot-page" - } - } - }, - "object.TypeResponse": { - "type": "object", - "properties": { - "type": { - "description": "The type", - "allOf": [ - { - "$ref": "#/definitions/object.Type" - } - ] - } - } - }, - "pagination.PaginatedResponse-object_Object": { - "type": "object", - "properties": { - "data": { - "description": "The list of items in the current result set", - "type": "array", - "items": { - "$ref": "#/definitions/object.Object" - } - }, - "pagination": { - "description": "The pagination metadata for the response", - "allOf": [ - { - "$ref": "#/definitions/pagination.PaginationMeta" - } - ] - } - } - }, - "pagination.PaginatedResponse-object_Template": { - "type": "object", - "properties": { - "data": { - "description": "The list of items in the current result set", - "type": "array", - "items": { - "$ref": "#/definitions/object.Template" - } - }, - "pagination": { - "description": "The pagination metadata for the response", - "allOf": [ - { - "$ref": "#/definitions/pagination.PaginationMeta" - } - ] - } - } - }, - "pagination.PaginatedResponse-object_Type": { - "type": "object", - "properties": { - "data": { - "description": "The list of items in the current result set", - "type": "array", - "items": { - "$ref": "#/definitions/object.Type" - } - }, - "pagination": { - "description": "The pagination metadata for the response", - "allOf": [ - { - "$ref": "#/definitions/pagination.PaginationMeta" - } - ] - } - } - }, - "pagination.PaginatedResponse-space_Member": { - "type": "object", - "properties": { - "data": { - "description": "The list of items in the current result set", - "type": "array", - "items": { - "$ref": "#/definitions/space.Member" - } - }, - "pagination": { - "description": "The pagination metadata for the response", - "allOf": [ - { - "$ref": "#/definitions/pagination.PaginationMeta" - } - ] - } - } - }, - "pagination.PaginatedResponse-space_Space": { - "type": "object", - "properties": { - "data": { - "description": "The list of items in the current result set", - "type": "array", - "items": { - "$ref": "#/definitions/space.Space" - } - }, - "pagination": { - "description": "The pagination metadata for the response", - "allOf": [ - { - "$ref": "#/definitions/pagination.PaginationMeta" - } - ] - } - } - }, - "pagination.PaginationMeta": { - "type": "object", - "properties": { - "has_more": { - "description": "Indicates if there are more items available beyond the current result set", - "type": "boolean", - "example": true - }, - "limit": { - "description": "The maximum number of items returned in the result set", - "type": "integer", - "example": 100 - }, - "offset": { - "description": "The number of items skipped before starting to collect the result set", - "type": "integer", - "example": 0 - }, - "total": { - "description": "The total number of items available for the endpoint", - "type": "integer", - "example": 1024 - } - } - }, - "search.SearchRequest": { - "type": "object", - "properties": { - "query": { - "description": "The search term to look for in object names and snippets", - "type": "string", - "example": "test" - }, - "sort": { - "description": "The sorting criteria and direction for the search results", - "allOf": [ - { - "$ref": "#/definitions/search.SortOptions" - } - ] - }, - "types": { - "description": "The types of objects to search for, specified by unique key or ID", - "type": "array", - "items": { - "type": "string" - }, - "example": [ - "ot-note", - "ot-page", - "ot-678043f0cda9133be777049f", - "bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q" - ] - } - } - }, - "search.SortOptions": { - "type": "object", - "properties": { - "direction": { - "description": "The direction to sort the search results", - "type": "string", - "default": "desc", - "enum": [ - "asc", - "desc" - ] - }, - "timestamp": { - "description": "The timestamp to sort the search results by", - "type": "string", - "default": "last_modified_date", - "enum": [ - "created_date", - "last_modified_date", - "last_opened_date" - ] - } - } - }, - "space.CreateSpaceRequest": { - "type": "object", - "properties": { - "name": { - "description": "The name of the space", - "type": "string", - "example": "New Space" - } - } - }, - "space.Member": { - "type": "object", - "properties": { - "global_name": { - "description": "The global name of the member in the network", - "type": "string", - "example": "john.any" - }, - "icon": { - "description": "The icon of the member", - "type": "string", - "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100" - }, - "id": { - "description": "The profile object id of the member", - "type": "string", - "example": "_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ" - }, - "identity": { - "description": "The identity of the member in the network", - "type": "string", - "example": "AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ" - }, - "name": { - "description": "The name of the member", - "type": "string", - "example": "John Doe" - }, - "object": { - "description": "The data model of the object", - "type": "string", - "example": "member" - }, - "role": { - "description": "The role of the member", - "type": "string", - "enum": [ - "Reader", - "Writer", - "Owner", - "NoPermission" - ], - "example": "Owner" - } - } - }, - "space.MemberResponse": { - "type": "object", - "properties": { - "member": { - "description": "The member", - "allOf": [ - { - "$ref": "#/definitions/space.Member" - } - ] - } - } - }, - "space.Space": { - "type": "object", - "properties": { - "account_space_id": { - "description": "The id of the account space", - "type": "string", - "example": "bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1" - }, - "analytics_id": { - "description": "The analytics id of the account", - "type": "string", - "example": "624aecdd-4797-4611-9d61-a2ae5f53cf1c" - }, - "archive_object_id": { - "description": "The id of the archive object", - "type": "string", - "example": "bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri" - }, - "device_id": { - "description": "The id of the device", - "type": "string", - "example": "12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF" - }, - "gateway_url": { - "description": "The gateway url to serve files and media", - "type": "string", - "example": "http://127.0.0.1:31006" - }, - "home_object_id": { - "description": "The id of the home object", - "type": "string", - "example": "bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya" - }, - "icon": { - "description": "The icon of the space", - "type": "string", - "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay" - }, - "id": { - "description": "The id of the space", - "type": "string", - "example": "bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1" - }, - "local_storage_path": { - "description": "The local storage path of the account", - "type": "string", - "example": "/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha" - }, - "marketplace_workspace_id": { - "description": "The id of the marketplace workspace", - "type": "string", - "example": "_anytype_marketplace" - }, - "name": { - "description": "The name of the space", - "type": "string", - "example": "My Space" - }, - "network_id": { - "description": "The network id of the space", - "type": "string", - "example": "N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU" - }, - "object": { - "description": "The data model of the object", - "type": "string", - "example": "space" - }, - "profile_object_id": { - "description": "The id of the profile object", - "type": "string", - "example": "bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4" - }, - "space_view_id": { - "description": "The id of the space view", - "type": "string", - "example": "bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy" - }, - "tech_space_id": { - "description": "The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself", - "type": "string", - "example": "bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1" - }, - "timezone": { - "description": "The timezone of the account", - "type": "string", - "example": "" - }, - "widgets_id": { - "description": "The id of the widgets", - "type": "string", - "example": "bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva" - }, - "workspace_object_id": { - "description": "The id of the workspace object", - "type": "string", - "example": "bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y" - } - } - }, - "space.SpaceResponse": { - "type": "object", - "properties": { - "space": { - "description": "The space", - "allOf": [ - { - "$ref": "#/definitions/space.Space" - } - ] - } - } - }, - "util.ForbiddenError": { - "type": "object", - "properties": { - "error": { - "type": "object", - "properties": { - "message": { - "type": "string", - "example": "Forbidden" - } - } - } - } - }, - "util.NotFoundError": { - "type": "object", - "properties": { - "error": { - "type": "object", - "properties": { - "message": { - "type": "string", - "example": "Resource not found" - } - } - } - } - }, - "util.RateLimitError": { - "type": "object", - "properties": { - "error": { - "type": "object", - "properties": { - "message": { - "type": "string", - "example": "Rate limit exceeded" - } - } - } - } - }, - "util.ServerError": { - "type": "object", - "properties": { - "error": { - "type": "object", - "properties": { - "message": { - "type": "string", - "example": "Internal server error" - } - } - } - } - }, - "util.UnauthorizedError": { - "type": "object", - "properties": { - "error": { - "type": "object", - "properties": { - "message": { - "type": "string", - "example": "Unauthorized" - } - } - } - } - }, - "util.ValidationError": { - "type": "object", - "properties": { - "error": { - "type": "object", - "properties": { - "message": { - "type": "string", - "example": "Bad request" - } - } - } - } - } - }, - "securityDefinitions": { - "ApiKeyAuth": { - "type": "apiKey", - "name": "Authorization", - "in": "header" - } - } + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"additionalProperties":{},"description":"The details","type":"object"},"id":{"description":"The id of the detail","enum":["last_modified_date","last_modified_by","created_date","created_by","last_opened_date","tags"],"example":"last_modified_date","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"description":"The icon of the template","example":"📄","type":"string"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"description":"The icon of the text","example":"📄","type":"string"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"description":"The icon of the type","example":"📄","type":"string"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-note","ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"description":"The icon of the member","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100","type":"string"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"description":"The icon of the space","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, + "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, + "paths": {"/auth/display_code":{"post":{"parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["spaces"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["spaces"]}},"/spaces/{space_id}/objects":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["types"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, + "openapi": "3.1.0", + "servers": [ + {"url":"localhost:31009/v1"} + ] } \ No newline at end of file diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index c4dfe63d1..deb31aec2 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -1,630 +1,626 @@ -basePath: /v1 -definitions: - auth.DisplayCodeResponse: - properties: - challenge_id: - description: The challenge id associated with the displayed code and needed - to solve the challenge for token - example: 67647f5ecda913e9a2e11b26 - type: string - type: object - auth.TokenResponse: - properties: - app_key: - description: The permanent app key - example: zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6= - type: string - session_token: - description: The ephemeral session token - example: eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII - type: string - type: object - export.ObjectExportResponse: - properties: - path: - description: The path the object was exported to - example: /path/to/export - type: string - type: object - object.Block: - properties: - align: - description: The alignment of the block - enum: - - AlignLeft - - AlignCenter - - AlignRight - - AlignJustify - example: AlignLeft - type: string - background_color: - description: The background color of the block - example: red - type: string - children_ids: - description: The ids of the block's children - example: - - '[''6797ce8ecda913cde14b02dc'']' - items: +components: + schemas: + auth.DisplayCodeResponse: + properties: + challenge_id: + description: The challenge id associated with the displayed code and needed + to solve the challenge for token + example: 67647f5ecda913e9a2e11b26 type: string - type: array - file: - allOf: - - $ref: '#/definitions/object.File' - description: The file of the block, if applicable - id: - description: The id of the block - example: 64394517de52ad5acb89c66c - type: string - relation: - allOf: - - $ref: '#/definitions/object.Relation' - description: The relation of the block, if applicable - text: - allOf: - - $ref: '#/definitions/object.Text' - description: The text of the block, if applicable - vertical_align: - description: The vertical alignment of the block - enum: - - VerticalAlignTop - - VerticalAlignMiddle - - VerticalAlignBottom - example: VerticalAlignTop - type: string - type: object - object.CreateObjectRequest: - properties: - body: - description: The body of the object - example: This is the body of the object. Markdown syntax is supported here. - type: string - description: - description: The description of the object - example: This is a description of the object. - type: string - icon: - description: The icon of the object - example: "\U0001F4C4" - type: string - name: - description: The name of the object - example: My object - type: string - object_type_unique_key: - description: The unique key of the object type - example: ot-page - type: string - source: - description: The source url, only applicable for bookmarks - example: https://bookmark-source.com - type: string - template_id: - description: The id of the template to use - example: bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge - type: string - type: object - object.Detail: - properties: - details: - additionalProperties: true - description: The details - type: object - id: - description: The id of the detail - enum: - - last_modified_date - - last_modified_by - - created_date - - created_by - - last_opened_date - - tags - example: last_modified_date - type: string - type: object - object.File: - properties: - added_at: - description: The added at of the file - type: integer - hash: - description: The hash of the file - type: string - mime: - description: The mime of the file - type: string - name: - description: The name of the file - type: string - size: - description: The size of the file - type: integer - state: - description: The state of the file - type: string - style: - description: The style of the file - type: string - target_object_id: - description: The target object id of the file - type: string - type: - description: The type of the file - type: string - type: object - object.Object: - properties: - blocks: - description: The blocks of the object - items: - $ref: '#/definitions/object.Block' - type: array - details: - description: The details of the object - items: - $ref: '#/definitions/object.Detail' - type: array - icon: - description: The icon of the object - example: "\U0001F4C4" - type: string - id: - description: The id of the object - example: bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ - type: string - layout: - description: The layout of the object - example: basic - type: string - name: - description: The name of the object - example: My object - type: string - object: - description: The data model of the object - example: object - type: string - root_id: - description: The id of the object's root - example: bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u - type: string - snippet: - description: The snippet of the object, especially important for notes as - they don't have a name - example: The beginning of the object body... - type: string - space_id: - description: The id of the space the object is in - example: bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1 - type: string - type: - allOf: - - $ref: '#/definitions/object.Type' - description: The type of the object - type: object - object.ObjectResponse: - properties: - object: - allOf: - - $ref: '#/definitions/object.Object' - description: The object - type: object - object.Relation: - properties: - id: - type: string - type: object - object.Template: - properties: - icon: - description: The icon of the template - example: "\U0001F4C4" - type: string - id: - description: The id of the template - example: bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge - type: string - name: - description: The name of the template - example: My template - type: string - object: - description: The data model of the object - example: template - type: string - type: object - object.TemplateResponse: - properties: - template: - allOf: - - $ref: '#/definitions/object.Template' - description: The template - type: object - object.Text: - properties: - checked: - description: Whether the text is checked - example: true - type: boolean - color: - description: The color of the text - example: red - type: string - icon: - description: The icon of the text - example: "\U0001F4C4" - type: string - style: - description: The style of the text - enum: - - Paragraph - - Header1 - - Header2 - - Header3 - - Header4 - - Quote - - Code - - Title - - Checkbox - - Marked - - Numbered - - Toggle - - Description - - Callout - example: Paragraph - type: string - text: - description: The text - example: Some text... - type: string - type: object - object.Type: - properties: - icon: - description: The icon of the type - example: "\U0001F4C4" - type: string - id: - description: The id of the type - example: bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu - type: string - name: - description: The name of the type - example: Page - type: string - object: - description: The data model of the object - example: type - type: string - recommended_layout: - description: The recommended layout of the type - example: todo - type: string - unique_key: - description: The unique key of the type - example: ot-page - type: string - type: object - object.TypeResponse: - properties: - type: - allOf: - - $ref: '#/definitions/object.Type' - description: The type - type: object - pagination.PaginatedResponse-object_Object: - properties: - data: - description: The list of items in the current result set - items: - $ref: '#/definitions/object.Object' - type: array - pagination: - allOf: - - $ref: '#/definitions/pagination.PaginationMeta' - description: The pagination metadata for the response - type: object - pagination.PaginatedResponse-object_Template: - properties: - data: - description: The list of items in the current result set - items: - $ref: '#/definitions/object.Template' - type: array - pagination: - allOf: - - $ref: '#/definitions/pagination.PaginationMeta' - description: The pagination metadata for the response - type: object - pagination.PaginatedResponse-object_Type: - properties: - data: - description: The list of items in the current result set - items: - $ref: '#/definitions/object.Type' - type: array - pagination: - allOf: - - $ref: '#/definitions/pagination.PaginationMeta' - description: The pagination metadata for the response - type: object - pagination.PaginatedResponse-space_Member: - properties: - data: - description: The list of items in the current result set - items: - $ref: '#/definitions/space.Member' - type: array - pagination: - allOf: - - $ref: '#/definitions/pagination.PaginationMeta' - description: The pagination metadata for the response - type: object - pagination.PaginatedResponse-space_Space: - properties: - data: - description: The list of items in the current result set - items: - $ref: '#/definitions/space.Space' - type: array - pagination: - allOf: - - $ref: '#/definitions/pagination.PaginationMeta' - description: The pagination metadata for the response - type: object - pagination.PaginationMeta: - properties: - has_more: - description: Indicates if there are more items available beyond the current - result set - example: true - type: boolean - limit: - description: The maximum number of items returned in the result set - example: 100 - type: integer - offset: - description: The number of items skipped before starting to collect the result - set - example: 0 - type: integer - total: - description: The total number of items available for the endpoint - example: 1024 - type: integer - type: object - search.SearchRequest: - properties: - query: - description: The search term to look for in object names and snippets - example: test - type: string - sort: - allOf: - - $ref: '#/definitions/search.SortOptions' - description: The sorting criteria and direction for the search results - types: - description: The types of objects to search for, specified by unique key or - ID - example: - - ot-note - - ot-page - - ot-678043f0cda9133be777049f - - bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q - items: + type: object + auth.TokenResponse: + properties: + app_key: + description: The permanent app key + example: zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6= type: string - type: array - type: object - search.SortOptions: - properties: - direction: - default: desc - description: The direction to sort the search results - enum: - - asc - - desc - type: string - timestamp: - default: last_modified_date - description: The timestamp to sort the search results by - enum: - - created_date - - last_modified_date - - last_opened_date - type: string - type: object - space.CreateSpaceRequest: - properties: - name: - description: The name of the space - example: New Space - type: string - type: object - space.Member: - properties: - global_name: - description: The global name of the member in the network - example: john.any - type: string - icon: - description: The icon of the member - example: http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100 - type: string - id: - description: The profile object id of the member - example: _participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ - type: string - identity: - description: The identity of the member in the network - example: AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ - type: string - name: - description: The name of the member - example: John Doe - type: string - object: - description: The data model of the object - example: member - type: string - role: - description: The role of the member - enum: - - Reader - - Writer - - Owner - - NoPermission - example: Owner - type: string - type: object - space.MemberResponse: - properties: - member: - allOf: - - $ref: '#/definitions/space.Member' - description: The member - type: object - space.Space: - properties: - account_space_id: - description: The id of the account space - example: bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1 - type: string - analytics_id: - description: The analytics id of the account - example: 624aecdd-4797-4611-9d61-a2ae5f53cf1c - type: string - archive_object_id: - description: The id of the archive object - example: bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri - type: string - device_id: - description: The id of the device - example: 12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF - type: string - gateway_url: - description: The gateway url to serve files and media - example: http://127.0.0.1:31006 - type: string - home_object_id: - description: The id of the home object - example: bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya - type: string - icon: - description: The icon of the space - example: http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay - type: string - id: - description: The id of the space - example: bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1 - type: string - local_storage_path: - description: The local storage path of the account - example: /Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha - type: string - marketplace_workspace_id: - description: The id of the marketplace workspace - example: _anytype_marketplace - type: string - name: - description: The name of the space - example: My Space - type: string - network_id: - description: The network id of the space - example: N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU - type: string - object: - description: The data model of the object - example: space - type: string - profile_object_id: - description: The id of the profile object - example: bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4 - type: string - space_view_id: - description: The id of the space view - example: bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy - type: string - tech_space_id: - description: The id of tech space, where objects outside of user's actual - spaces are stored, e.g. spaces itself - example: bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1 - type: string - timezone: - description: The timezone of the account - example: "" - type: string - widgets_id: - description: The id of the widgets - example: bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva - type: string - workspace_object_id: - description: The id of the workspace object - example: bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y - type: string - type: object - space.SpaceResponse: - properties: - space: - allOf: - - $ref: '#/definitions/space.Space' - description: The space - type: object - util.ForbiddenError: - properties: - error: - properties: - message: - example: Forbidden + session_token: + description: The ephemeral session token + example: eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII + type: string + type: object + export.ObjectExportResponse: + properties: + path: + description: The path the object was exported to + example: /path/to/export + type: string + type: object + object.Block: + properties: + align: + description: The alignment of the block + enum: + - AlignLeft + - AlignCenter + - AlignRight + - AlignJustify + example: AlignLeft + type: string + background_color: + description: The background color of the block + example: red + type: string + children_ids: + description: The ids of the block's children + example: + - '[''6797ce8ecda913cde14b02dc'']' + items: type: string - type: object - type: object - util.NotFoundError: - properties: - error: - properties: - message: - example: Resource not found + type: array + uniqueItems: false + file: + $ref: '#/components/schemas/object.File' + id: + description: The id of the block + example: 64394517de52ad5acb89c66c + type: string + relation: + $ref: '#/components/schemas/object.Relation' + text: + $ref: '#/components/schemas/object.Text' + vertical_align: + description: The vertical alignment of the block + enum: + - VerticalAlignTop + - VerticalAlignMiddle + - VerticalAlignBottom + example: VerticalAlignTop + type: string + type: object + object.CreateObjectRequest: + properties: + body: + description: The body of the object + example: This is the body of the object. Markdown syntax is supported here. + type: string + description: + description: The description of the object + example: This is a description of the object. + type: string + icon: + description: The icon of the object + example: "\U0001F4C4" + type: string + name: + description: The name of the object + example: My object + type: string + object_type_unique_key: + description: The unique key of the object type + example: ot-page + type: string + source: + description: The source url, only applicable for bookmarks + example: https://bookmark-source.com + type: string + template_id: + description: The id of the template to use + example: bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge + type: string + type: object + object.Detail: + properties: + details: + additionalProperties: {} + description: The details + type: object + id: + description: The id of the detail + enum: + - last_modified_date + - last_modified_by + - created_date + - created_by + - last_opened_date + - tags + example: last_modified_date + type: string + type: object + object.File: + description: The file of the block, if applicable + properties: + added_at: + description: The added at of the file + type: integer + hash: + description: The hash of the file + type: string + mime: + description: The mime of the file + type: string + name: + description: The name of the file + type: string + size: + description: The size of the file + type: integer + state: + description: The state of the file + type: string + style: + description: The style of the file + type: string + target_object_id: + description: The target object id of the file + type: string + type: + description: The type of the file + type: string + type: object + object.Object: + description: The object + properties: + blocks: + description: The blocks of the object + items: + $ref: '#/components/schemas/object.Block' + type: array + uniqueItems: false + details: + description: The details of the object + items: + $ref: '#/components/schemas/object.Detail' + type: array + uniqueItems: false + icon: + description: The icon of the object + example: "\U0001F4C4" + type: string + id: + description: The id of the object + example: bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ + type: string + layout: + description: The layout of the object + example: basic + type: string + name: + description: The name of the object + example: My object + type: string + object: + description: The data model of the object + example: object + type: string + root_id: + description: The id of the object's root + example: bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u + type: string + snippet: + description: The snippet of the object, especially important for notes as + they don't have a name + example: The beginning of the object body... + type: string + space_id: + description: The id of the space the object is in + example: bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1 + type: string + type: + $ref: '#/components/schemas/object.Type' + type: object + object.ObjectResponse: + properties: + object: + $ref: '#/components/schemas/object.Object' + type: object + object.Relation: + description: The relation of the block, if applicable + properties: + id: + type: string + type: object + object.Template: + description: The template + properties: + icon: + description: The icon of the template + example: "\U0001F4C4" + type: string + id: + description: The id of the template + example: bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge + type: string + name: + description: The name of the template + example: My template + type: string + object: + description: The data model of the object + example: template + type: string + type: object + object.TemplateResponse: + properties: + template: + $ref: '#/components/schemas/object.Template' + type: object + object.Text: + description: The text of the block, if applicable + properties: + checked: + description: Whether the text is checked + example: true + type: boolean + color: + description: The color of the text + example: red + type: string + icon: + description: The icon of the text + example: "\U0001F4C4" + type: string + style: + description: The style of the text + enum: + - Paragraph + - Header1 + - Header2 + - Header3 + - Header4 + - Quote + - Code + - Title + - Checkbox + - Marked + - Numbered + - Toggle + - Description + - Callout + example: Paragraph + type: string + text: + description: The text + example: Some text... + type: string + type: object + object.Type: + description: The type of the object + properties: + icon: + description: The icon of the type + example: "\U0001F4C4" + type: string + id: + description: The id of the type + example: bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu + type: string + name: + description: The name of the type + example: Page + type: string + object: + description: The data model of the object + example: type + type: string + recommended_layout: + description: The recommended layout of the type + example: todo + type: string + unique_key: + description: The unique key of the type + example: ot-page + type: string + type: object + object.TypeResponse: + properties: + type: + $ref: '#/components/schemas/object.Type' + type: object + pagination.PaginatedResponse-object_Object: + properties: + data: + description: The list of items in the current result set + items: + $ref: '#/components/schemas/object.Object' + type: array + uniqueItems: false + pagination: + $ref: '#/components/schemas/pagination.PaginationMeta' + type: object + pagination.PaginatedResponse-object_Template: + properties: + data: + description: The list of items in the current result set + items: + $ref: '#/components/schemas/object.Template' + type: array + uniqueItems: false + pagination: + $ref: '#/components/schemas/pagination.PaginationMeta' + type: object + pagination.PaginatedResponse-object_Type: + properties: + data: + description: The list of items in the current result set + items: + $ref: '#/components/schemas/object.Type' + type: array + uniqueItems: false + pagination: + $ref: '#/components/schemas/pagination.PaginationMeta' + type: object + pagination.PaginatedResponse-space_Member: + properties: + data: + description: The list of items in the current result set + items: + $ref: '#/components/schemas/space.Member' + type: array + uniqueItems: false + pagination: + $ref: '#/components/schemas/pagination.PaginationMeta' + type: object + pagination.PaginatedResponse-space_Space: + properties: + data: + description: The list of items in the current result set + items: + $ref: '#/components/schemas/space.Space' + type: array + uniqueItems: false + pagination: + $ref: '#/components/schemas/pagination.PaginationMeta' + type: object + pagination.PaginationMeta: + description: The pagination metadata for the response + properties: + has_more: + description: Indicates if there are more items available beyond the current + result set + example: true + type: boolean + limit: + description: The maximum number of items returned in the result set + example: 100 + type: integer + offset: + description: The number of items skipped before starting to collect the + result set + example: 0 + type: integer + total: + description: The total number of items available for the endpoint + example: 1024 + type: integer + type: object + search.SearchRequest: + properties: + query: + description: The search term to look for in object names and snippets + example: test + type: string + sort: + $ref: '#/components/schemas/search.SortOptions' + types: + description: The types of objects to search for, specified by unique key + or ID + example: + - ot-note + - ot-page + - ot-678043f0cda9133be777049f + - bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q + items: type: string - type: object - type: object - util.RateLimitError: - properties: - error: - properties: - message: - example: Rate limit exceeded - type: string - type: object - type: object - util.ServerError: - properties: - error: - properties: - message: - example: Internal server error - type: string - type: object - type: object - util.UnauthorizedError: - properties: - error: - properties: - message: - example: Unauthorized - type: string - type: object - type: object - util.ValidationError: - properties: - error: - properties: - message: - example: Bad request - type: string - type: object - type: object -host: localhost:31009 + type: array + uniqueItems: false + type: object + search.SortOptions: + description: The sorting criteria and direction for the search results + properties: + direction: + default: desc + description: The direction to sort the search results + enum: + - asc + - desc + type: string + timestamp: + default: last_modified_date + description: The timestamp to sort the search results by + enum: + - created_date + - last_modified_date + - last_opened_date + type: string + type: object + space.CreateSpaceRequest: + properties: + name: + description: The name of the space + example: New Space + type: string + type: object + space.Member: + description: The member + properties: + global_name: + description: The global name of the member in the network + example: john.any + type: string + icon: + description: The icon of the member + example: http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100 + type: string + id: + description: The profile object id of the member + example: _participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ + type: string + identity: + description: The identity of the member in the network + example: AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ + type: string + name: + description: The name of the member + example: John Doe + type: string + object: + description: The data model of the object + example: member + type: string + role: + description: The role of the member + enum: + - Reader + - Writer + - Owner + - NoPermission + example: Owner + type: string + type: object + space.MemberResponse: + properties: + member: + $ref: '#/components/schemas/space.Member' + type: object + space.Space: + description: The space + properties: + account_space_id: + description: The id of the account space + example: bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1 + type: string + analytics_id: + description: The analytics id of the account + example: 624aecdd-4797-4611-9d61-a2ae5f53cf1c + type: string + archive_object_id: + description: The id of the archive object + example: bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri + type: string + device_id: + description: The id of the device + example: 12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF + type: string + gateway_url: + description: The gateway url to serve files and media + example: http://127.0.0.1:31006 + type: string + home_object_id: + description: The id of the home object + example: bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya + type: string + icon: + description: The icon of the space + example: http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay + type: string + id: + description: The id of the space + example: bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1 + type: string + local_storage_path: + description: The local storage path of the account + example: /Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha + type: string + marketplace_workspace_id: + description: The id of the marketplace workspace + example: _anytype_marketplace + type: string + name: + description: The name of the space + example: My Space + type: string + network_id: + description: The network id of the space + example: N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU + type: string + object: + description: The data model of the object + example: space + type: string + profile_object_id: + description: The id of the profile object + example: bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4 + type: string + space_view_id: + description: The id of the space view + example: bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy + type: string + tech_space_id: + description: The id of tech space, where objects outside of user's actual + spaces are stored, e.g. spaces itself + example: bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1 + type: string + timezone: + description: The timezone of the account + example: "" + type: string + widgets_id: + description: The id of the widgets + example: bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva + type: string + workspace_object_id: + description: The id of the workspace object + example: bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y + type: string + type: object + space.SpaceResponse: + properties: + space: + $ref: '#/components/schemas/space.Space' + type: object + util.ForbiddenError: + properties: + error: + properties: + message: + example: Forbidden + type: string + type: object + type: object + util.NotFoundError: + properties: + error: + properties: + message: + example: Resource not found + type: string + type: object + type: object + util.RateLimitError: + properties: + error: + properties: + message: + example: Rate limit exceeded + type: string + type: object + type: object + util.ServerError: + properties: + error: + properties: + message: + example: Internal server error + type: string + type: object + type: object + util.UnauthorizedError: + properties: + error: + properties: + message: + example: Unauthorized + type: string + type: object + type: object + util.ValidationError: + properties: + error: + properties: + message: + example: Bad request + type: string + type: object + type: object + securitySchemes: + bearerauth: + bearerFormat: JWT + scheme: bearer + type: http +externalDocs: + description: OpenAPI + url: https://swagger.io/resources/open-api/ info: contact: email: support@anytype.io @@ -638,852 +634,1030 @@ info: termsOfService: https://anytype.io/terms_of_use title: Anytype API version: "1.0" +openapi: 3.1.0 paths: /auth/display_code: post: - consumes: - - application/json parameters: - description: App name requesting the challenge in: query name: app_name required: true - type: string - produces: - - application/json + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object responses: "200": + content: + application/json: + schema: + $ref: '#/components/schemas/auth.DisplayCodeResponse' description: Challenge ID - schema: - $ref: '#/definitions/auth.DisplayCodeResponse' "400": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ValidationError' description: Invalid input - schema: - $ref: '#/definitions/util.ValidationError' "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' summary: Start new challenge tags: - auth /auth/token: post: - consumes: - - application/json parameters: - description: Challenge ID in: query name: challenge_id required: true - type: string + schema: + type: string - description: 4-digit code retrieved from Anytype Desktop app in: query name: code required: true - type: string - produces: - - application/json + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object responses: "200": + content: + application/json: + schema: + $ref: '#/components/schemas/auth.TokenResponse' description: Authentication token - schema: - $ref: '#/definitions/auth.TokenResponse' "400": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ValidationError' description: Invalid input - schema: - $ref: '#/definitions/util.ValidationError' "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' summary: Retrieve token tags: - auth /search: post: - consumes: - - application/json parameters: - - default: 0 - description: The number of items to skip before starting to collect the result + - description: The number of items to skip before starting to collect the result set in: query name: offset - type: integer - - default: 100 - description: The number of items to return - in: query - maximum: 1000 - name: limit - type: integer - - description: Search parameters - in: body - name: request - required: true schema: - $ref: '#/definitions/search.SearchRequest' - produces: - - application/json + default: 0 + type: integer + - description: The number of items to return + in: query + name: limit + schema: + default: 100 + maximum: 1000 + type: integer + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/search.SearchRequest' + description: Search parameters + required: true responses: "200": + content: + application/json: + schema: + $ref: '#/components/schemas/pagination.PaginatedResponse-object_Object' description: List of objects - schema: - $ref: '#/definitions/pagination.PaginatedResponse-object_Object' "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' + security: + - bearerauth: [] summary: Search objects across all spaces tags: - search /spaces: get: - consumes: - - application/json parameters: - - default: 0 - description: The number of items to skip before starting to collect the result + - description: The number of items to skip before starting to collect the result set in: query name: offset - type: integer - - default: 100 - description: The number of items to return + schema: + default: 0 + type: integer + - description: The number of items to return in: query - maximum: 1000 name: limit - type: integer - produces: - - application/json + schema: + default: 100 + maximum: 1000 + type: integer responses: "200": + content: + application/json: + schema: + $ref: '#/components/schemas/pagination.PaginatedResponse-space_Space' description: List of spaces - schema: - $ref: '#/definitions/pagination.PaginatedResponse-space_Space' "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' + security: + - bearerauth: [] summary: List spaces tags: - spaces post: - consumes: - - application/json - parameters: - - description: Space to create - in: body - name: name + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/space.CreateSpaceRequest' + description: Space to create required: true - schema: - $ref: '#/definitions/space.CreateSpaceRequest' - produces: - - application/json responses: "200": + content: + application/json: + schema: + $ref: '#/components/schemas/space.SpaceResponse' description: Space created successfully - schema: - $ref: '#/definitions/space.SpaceResponse' "400": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ValidationError' description: Bad request - schema: - $ref: '#/definitions/util.ValidationError' "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' "423": + content: + application/json: + schema: + $ref: '#/components/schemas/util.RateLimitError' description: Rate limit exceeded - schema: - $ref: '#/definitions/util.RateLimitError' "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' + security: + - bearerauth: [] summary: Create space tags: - spaces /spaces/{space_id}: get: - consumes: - - application/json parameters: - description: Space ID in: path name: space_id required: true - type: string - produces: - - application/json + schema: + type: string responses: "200": + content: + application/json: + schema: + $ref: '#/components/schemas/space.SpaceResponse' description: Space - schema: - $ref: '#/definitions/space.SpaceResponse' "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' "404": + content: + application/json: + schema: + $ref: '#/components/schemas/util.NotFoundError' description: Space not found - schema: - $ref: '#/definitions/util.NotFoundError' "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' + security: + - bearerauth: [] summary: Get space tags: - spaces /spaces/{space_id}/members: get: - consumes: - - application/json parameters: - description: Space ID in: path name: space_id required: true - type: string - - default: 0 - description: The number of items to skip before starting to collect the result + schema: + type: string + - description: The number of items to skip before starting to collect the result set in: query name: offset - type: integer - - default: 100 - description: The number of items to return + schema: + default: 0 + type: integer + - description: The number of items to return in: query - maximum: 1000 name: limit - type: integer - produces: - - application/json + schema: + default: 100 + maximum: 1000 + type: integer responses: "200": + content: + application/json: + schema: + $ref: '#/components/schemas/pagination.PaginatedResponse-space_Member' description: List of members - schema: - $ref: '#/definitions/pagination.PaginatedResponse-space_Member' "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' + security: + - bearerauth: [] summary: List members tags: - spaces /spaces/{space_id}/members/{member_id}: get: - consumes: - - application/json parameters: - description: Space ID in: path name: space_id required: true - type: string + schema: + type: string - description: Member ID in: path name: member_id required: true - type: string - produces: - - application/json + schema: + type: string responses: "200": + content: + application/json: + schema: + $ref: '#/components/schemas/space.MemberResponse' description: Member - schema: - $ref: '#/definitions/space.MemberResponse' "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' "404": + content: + application/json: + schema: + $ref: '#/components/schemas/util.NotFoundError' description: Member not found - schema: - $ref: '#/definitions/util.NotFoundError' "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' + security: + - bearerauth: [] summary: Get member tags: - spaces /spaces/{space_id}/objects: get: - consumes: - - application/json parameters: - description: Space ID in: path name: space_id required: true - type: string - - default: 0 - description: The number of items to skip before starting to collect the result + schema: + type: string + - description: The number of items to skip before starting to collect the result set in: query name: offset - type: integer - - default: 100 - description: The number of items to return + schema: + default: 0 + type: integer + - description: The number of items to return in: query - maximum: 1000 name: limit - type: integer - produces: - - application/json + schema: + default: 100 + maximum: 1000 + type: integer responses: "200": + content: + application/json: + schema: + $ref: '#/components/schemas/pagination.PaginatedResponse-object_Object' description: List of objects - schema: - $ref: '#/definitions/pagination.PaginatedResponse-object_Object' "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' + security: + - bearerauth: [] summary: List objects tags: - objects post: - consumes: - - application/json parameters: - description: Space ID in: path name: space_id required: true - type: string - - description: Object to create - in: body - name: object - required: true schema: - $ref: '#/definitions/object.CreateObjectRequest' - produces: - - application/json + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/object.CreateObjectRequest' + description: Object to create + required: true responses: "200": + content: + application/json: + schema: + $ref: '#/components/schemas/object.ObjectResponse' description: The created object - schema: - $ref: '#/definitions/object.ObjectResponse' "400": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ValidationError' description: Bad request - schema: - $ref: '#/definitions/util.ValidationError' "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' "423": + content: + application/json: + schema: + $ref: '#/components/schemas/util.RateLimitError' description: Rate limit exceeded - schema: - $ref: '#/definitions/util.RateLimitError' "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' + security: + - bearerauth: [] summary: Create object tags: - objects /spaces/{space_id}/objects/{object_id}: delete: - consumes: - - application/json parameters: - description: Space ID in: path name: space_id required: true - type: string + schema: + type: string - description: Object ID in: path name: object_id required: true - type: string - produces: - - application/json + schema: + type: string responses: "200": + content: + application/json: + schema: + $ref: '#/components/schemas/object.ObjectResponse' description: The deleted object - schema: - $ref: '#/definitions/object.ObjectResponse' "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' "403": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ForbiddenError' description: Forbidden - schema: - $ref: '#/definitions/util.ForbiddenError' "404": + content: + application/json: + schema: + $ref: '#/components/schemas/util.NotFoundError' description: Resource not found - schema: - $ref: '#/definitions/util.NotFoundError' "423": + content: + application/json: + schema: + $ref: '#/components/schemas/util.RateLimitError' description: Rate limit exceeded - schema: - $ref: '#/definitions/util.RateLimitError' "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' + security: + - bearerauth: [] summary: Delete object tags: - objects get: - consumes: - - application/json parameters: - description: Space ID in: path name: space_id required: true - type: string + schema: + type: string - description: Object ID in: path name: object_id required: true - type: string - produces: - - application/json + schema: + type: string responses: "200": + content: + application/json: + schema: + $ref: '#/components/schemas/object.ObjectResponse' description: The requested object - schema: - $ref: '#/definitions/object.ObjectResponse' "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' "404": + content: + application/json: + schema: + $ref: '#/components/schemas/util.NotFoundError' description: Resource not found - schema: - $ref: '#/definitions/util.NotFoundError' "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' + security: + - bearerauth: [] summary: Get object tags: - objects /spaces/{space_id}/objects/{object_id}/export/{format}: post: - consumes: - - application/json parameters: - description: Space ID in: path name: space_id required: true - type: string + schema: + type: string - description: Object ID in: path name: object_id required: true - type: string + schema: + type: string - description: Export format - enum: - - markdown - - protobuf in: path name: format required: true - type: string - produces: - - application/json + schema: + enum: + - markdown + - protobuf + type: string + requestBody: + content: + application/json: + schema: + type: object responses: "200": + content: + application/json: + schema: + $ref: '#/components/schemas/export.ObjectExportResponse' description: Object exported successfully - schema: - $ref: '#/definitions/export.ObjectExportResponse' "400": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ValidationError' description: Bad request - schema: - $ref: '#/definitions/util.ValidationError' "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' + security: + - bearerauth: [] summary: Export object tags: - export /spaces/{space_id}/search: post: - consumes: - - application/json parameters: - description: Space ID in: path name: space_id required: true - type: string - - default: 0 - description: The number of items to skip before starting to collect the result + schema: + type: string + - description: The number of items to skip before starting to collect the result set in: query name: offset - type: integer - - default: 100 - description: The number of items to return - in: query - maximum: 1000 - name: limit - type: integer - - description: Search parameters - in: body - name: request - required: true schema: - $ref: '#/definitions/search.SearchRequest' - produces: - - application/json + default: 0 + type: integer + - description: The number of items to return + in: query + name: limit + schema: + default: 100 + maximum: 1000 + type: integer + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/search.SearchRequest' + description: Search parameters + required: true responses: "200": + content: + application/json: + schema: + $ref: '#/components/schemas/pagination.PaginatedResponse-object_Object' description: List of objects - schema: - $ref: '#/definitions/pagination.PaginatedResponse-object_Object' "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' + security: + - bearerauth: [] summary: Search objects within a space tags: - search /spaces/{space_id}/types: get: - consumes: - - application/json parameters: - description: Space ID in: path name: space_id required: true - type: string - - default: 0 - description: The number of items to skip before starting to collect the result + schema: + type: string + - description: The number of items to skip before starting to collect the result set in: query name: offset - type: integer - - default: 100 - description: The number of items to return + schema: + default: 0 + type: integer + - description: The number of items to return in: query - maximum: 1000 name: limit - type: integer - produces: - - application/json + schema: + default: 100 + maximum: 1000 + type: integer responses: "200": + content: + application/json: + schema: + $ref: '#/components/schemas/pagination.PaginatedResponse-object_Type' description: List of types - schema: - $ref: '#/definitions/pagination.PaginatedResponse-object_Type' "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' + security: + - bearerauth: [] summary: List types tags: - types /spaces/{space_id}/types/{type_id}: get: - consumes: - - application/json parameters: - description: Space ID in: path name: space_id required: true - type: string + schema: + type: string - description: Type ID in: path name: type_id required: true - type: string - produces: - - application/json + schema: + type: string responses: "200": + content: + application/json: + schema: + $ref: '#/components/schemas/object.TypeResponse' description: The requested type - schema: - $ref: '#/definitions/object.TypeResponse' "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' "404": + content: + application/json: + schema: + $ref: '#/components/schemas/util.NotFoundError' description: Resource not found - schema: - $ref: '#/definitions/util.NotFoundError' "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' + security: + - bearerauth: [] summary: Get type tags: - types /spaces/{space_id}/types/{type_id}/templates: get: - consumes: - - application/json parameters: - description: Space ID in: path name: space_id required: true - type: string + schema: + type: string - description: Type ID in: path name: type_id required: true - type: string - - default: 0 - description: The number of items to skip before starting to collect the result + schema: + type: string + - description: The number of items to skip before starting to collect the result set in: query name: offset - type: integer - - default: 100 - description: The number of items to return + schema: + default: 0 + type: integer + - description: The number of items to return in: query - maximum: 1000 name: limit - type: integer - produces: - - application/json + schema: + default: 100 + maximum: 1000 + type: integer responses: "200": + content: + application/json: + schema: + $ref: '#/components/schemas/pagination.PaginatedResponse-object_Template' description: List of templates - schema: - $ref: '#/definitions/pagination.PaginatedResponse-object_Template' "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' + security: + - bearerauth: [] summary: List templates tags: - types /spaces/{space_id}/types/{type_id}/templates/{template_id}: get: - consumes: - - application/json parameters: - description: Space ID in: path name: space_id required: true - type: string + schema: + type: string - description: Type ID in: path name: type_id required: true - type: string + schema: + type: string - description: Template ID in: path name: template_id required: true - type: string - produces: - - application/json + schema: + type: string responses: "200": + content: + application/json: + schema: + $ref: '#/components/schemas/object.TemplateResponse' description: The requested template - schema: - $ref: '#/definitions/object.TemplateResponse' "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' "404": + content: + application/json: + schema: + $ref: '#/components/schemas/util.NotFoundError' description: Resource not found - schema: - $ref: '#/definitions/util.NotFoundError' "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' + security: + - bearerauth: [] summary: Get template tags: - types /v1/spaces/{space_id}/lists/{list_id}/objects: - delete: - consumes: - - application/json + get: parameters: - description: Space ID in: path name: space_id required: true - type: string - - description: List ID - in: path - name: list_id - required: true - type: string - - description: List of object IDs - in: body - name: objects - required: true schema: - items: - type: string - type: array - produces: - - application/json - responses: - "200": - description: Objects removed successfully - schema: - type: string - "400": - description: Bad request - schema: - $ref: '#/definitions/util.ValidationError' - "401": - description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' - "404": - description: Not found - schema: - $ref: '#/definitions/util.NotFoundError' - "500": - description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' - summary: Remove objects from list - tags: - - lists - get: - consumes: - - application/json - parameters: - - description: Space ID - in: path - name: space_id - required: true - type: string + type: string - description: List ID in: path name: list_id required: true - type: string - - default: 0 - description: The number of items to skip before starting to collect the result + schema: + type: string + - description: The number of items to skip before starting to collect the result set in: query name: offset - type: integer + schema: + default: 0 + type: integer - description: The number of items to return in: query name: limit - type: integer - produces: - - application/json + schema: + type: integer responses: "200": + content: + application/json: + schema: + $ref: '#/components/schemas/pagination.PaginatedResponse-object_Object' description: List of objects - schema: - $ref: '#/definitions/pagination.PaginatedResponse-object_Object' "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' "404": + content: + application/json: + schema: + $ref: '#/components/schemas/util.NotFoundError' description: Not found - schema: - $ref: '#/definitions/util.NotFoundError' "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' + security: + - bearerauth: [] summary: Get objects in list tags: - lists post: - consumes: - - application/json parameters: - description: Space ID in: path name: space_id required: true - type: string + schema: + type: string - description: List ID in: path name: list_id required: true - type: string - - description: List of object IDs - in: body - name: objects - required: true schema: - items: - type: string - type: array - produces: - - application/json + type: string + requestBody: + content: + application/json: + schema: + items: + type: string + type: array + description: List of object IDs + required: true responses: "200": + content: + application/json: + schema: + type: string description: Objects added successfully - schema: - type: string "400": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ValidationError' description: Bad request - schema: - $ref: '#/definitions/util.ValidationError' "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' "404": + content: + application/json: + schema: + $ref: '#/components/schemas/util.NotFoundError' description: Not found - schema: - $ref: '#/definitions/util.NotFoundError' "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' + security: + - bearerauth: [] summary: Add objects to list tags: - lists -securityDefinitions: - ApiKeyAuth: - in: header - name: Authorization - type: apiKey -swagger: "2.0" + /v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}: + delete: + parameters: + - description: Space ID + in: path + name: space_id + required: true + schema: + type: string + - description: List ID + in: path + name: list_id + required: true + schema: + type: string + - description: Object ID + in: path + name: object_id + required: true + schema: + type: string + responses: + "200": + content: + application/json: + schema: + type: string + description: Objects removed successfully + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ValidationError' + description: Bad request + "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' + description: Unauthorized + "404": + content: + application/json: + schema: + $ref: '#/components/schemas/util.NotFoundError' + description: Not found + "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' + description: Internal server error + security: + - bearerauth: [] + summary: Remove object from list + tags: + - lists +servers: +- url: localhost:31009/v1 diff --git a/core/api/internal/export/handler.go b/core/api/internal/export/handler.go index c2ae3a2f8..b0a2813a4 100644 --- a/core/api/internal/export/handler.go +++ b/core/api/internal/export/handler.go @@ -21,6 +21,7 @@ import ( // @Failure 400 {object} util.ValidationError "Bad request" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth // @Router /spaces/{space_id}/objects/{object_id}/export/{format} [post] func GetObjectExportHandler(s *ExportService) gin.HandlerFunc { return func(c *gin.Context) { diff --git a/core/api/internal/list/handler.go b/core/api/internal/list/handler.go index 0830390f5..c5c6871ae 100644 --- a/core/api/internal/list/handler.go +++ b/core/api/internal/list/handler.go @@ -13,7 +13,6 @@ import ( // // @Summary Get objects in list // @Tags lists -// @Accept json // @Produce json // @Param space_id path string true "Space ID" // @Param list_id path string true "List ID" @@ -23,6 +22,7 @@ import ( // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 404 {object} util.NotFoundError "Not found" // @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth // @Router /v1/spaces/{space_id}/lists/{list_id}/objects [get] func GetObjectsInListHandler(s *ListService) gin.HandlerFunc { return func(c *gin.Context) { @@ -60,6 +60,7 @@ func GetObjectsInListHandler(s *ListService) gin.HandlerFunc { // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 404 {object} util.NotFoundError "Not found" // @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth // @Router /v1/spaces/{space_id}/lists/{list_id}/objects [post] func AddObjectsToListHandler(s *ListService) gin.HandlerFunc { return func(c *gin.Context) { @@ -88,34 +89,28 @@ func AddObjectsToListHandler(s *ListService) gin.HandlerFunc { } } -// RemoveObjectsFromListHandler +// RemoveObjectFromListHandler // -// @Summary Remove objects from list +// @Summary Remove object from list // @Tags lists -// @Accept json // @Produce json // @Param space_id path string true "Space ID" // @Param list_id path string true "List ID" -// @Param objects body []string true "List of object IDs" +// @Param object_id path string true "Object ID" // @Success 200 {object} string "Objects removed successfully" // @Failure 400 {object} util.ValidationError "Bad request" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 404 {object} util.NotFoundError "Not found" // @Failure 500 {object} util.ServerError "Internal server error" -// @Router /v1/spaces/{space_id}/lists/{list_id}/objects [delete] -func RemoveObjectsFromListHandler(s *ListService) gin.HandlerFunc { +// @Security bearerauth +// @Router /v1/spaces/{space_id}/lists/{list_id}/objects/{object_id} [delete] +func RemoveObjectFromListHandler(s *ListService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") listId := c.Param("list_id") + objectId := c.Param("object_id") - objects := []string{} - if err := c.ShouldBindJSON(&objects); err != nil { - apiErr := util.CodeToAPIError(http.StatusBadRequest, err.Error()) - c.JSON(http.StatusBadRequest, apiErr) - return - } - - err := s.RemoveObjectsFromList(c, spaceId, listId, objects) + err := s.RemoveObjectFromList(c, spaceId, listId, objectId) code := util.MapErrorCode(err, util.ErrToCode(ErrFailedRemoveObjectsFromList, http.StatusInternalServerError), ) diff --git a/core/api/internal/list/service.go b/core/api/internal/list/service.go index 625e56050..75e6f8407 100644 --- a/core/api/internal/list/service.go +++ b/core/api/internal/list/service.go @@ -20,7 +20,7 @@ var ( type Service interface { GetObjectsInList(ctx context.Context, spaceId string, listId string, offset, limit int) ([]object.Object, int, bool, error) AddObjectsToList(ctx context.Context, spaceId string, listId string, objectIds []string) error - RemoveObjectsFromList(ctx context.Context, spaceId string, listId string, objectIds []string) error + RemoveObjectFromList(ctx context.Context, spaceId string, listId string, objectIds []string) error } type ListService struct { @@ -76,11 +76,11 @@ func (s *ListService) AddObjectsToList(ctx context.Context, spaceId string, list return nil } -// RemoveObjectsFromList removes objects from a list -func (s *ListService) RemoveObjectsFromList(ctx context.Context, spaceId string, listId string, objectIds []string) error { +// RemoveObjectFromList removes objects from a list +func (s *ListService) RemoveObjectFromList(ctx context.Context, spaceId string, listId string, objectId string) error { resp := s.mw.ObjectCollectionRemove(ctx, &pb.RpcObjectCollectionRemoveRequest{ ContextId: spaceId, - ObjectIds: objectIds, + ObjectIds: []string{objectId}, }) if resp.Error.Code != pb.RpcObjectCollectionRemoveResponseError_NULL { diff --git a/core/api/internal/object/handler.go b/core/api/internal/object/handler.go index 57c1e2e87..a8a0aa25d 100644 --- a/core/api/internal/object/handler.go +++ b/core/api/internal/object/handler.go @@ -13,7 +13,6 @@ import ( // // @Summary List objects // @Tags objects -// @Accept json // @Produce json // @Param space_id path string true "Space ID" // @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) @@ -21,6 +20,7 @@ import ( // @Success 200 {object} pagination.PaginatedResponse[Object] "List of objects" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth // @Router /spaces/{space_id}/objects [get] func GetObjectsHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { @@ -49,7 +49,6 @@ func GetObjectsHandler(s *ObjectService) gin.HandlerFunc { // // @Summary Get object // @Tags objects -// @Accept json // @Produce json // @Param space_id path string true "Space ID" // @Param object_id path string true "Object ID" @@ -57,6 +56,7 @@ func GetObjectsHandler(s *ObjectService) gin.HandlerFunc { // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 404 {object} util.NotFoundError "Resource not found" // @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth // @Router /spaces/{space_id}/objects/{object_id} [get] func GetObjectHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { @@ -83,7 +83,6 @@ func GetObjectHandler(s *ObjectService) gin.HandlerFunc { // // @Summary Delete object // @Tags objects -// @Accept json // @Produce json // @Param space_id path string true "Space ID" // @Param object_id path string true "Object ID" @@ -93,6 +92,7 @@ func GetObjectHandler(s *ObjectService) gin.HandlerFunc { // @Failure 404 {object} util.NotFoundError "Resource not found" // @Failure 423 {object} util.RateLimitError "Rate limit exceeded" // @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth // @Router /spaces/{space_id}/objects/{object_id} [delete] func DeleteObjectHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { @@ -129,6 +129,7 @@ func DeleteObjectHandler(s *ObjectService) gin.HandlerFunc { // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 423 {object} util.RateLimitError "Rate limit exceeded" // @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth // @Router /spaces/{space_id}/objects [post] func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { @@ -165,7 +166,6 @@ func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { // // @Summary List types // @Tags types -// @Accept json // @Produce json // @Param space_id path string true "Space ID" // @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) @@ -173,6 +173,7 @@ func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { // @Success 200 {object} pagination.PaginatedResponse[Type] "List of types" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth // @Router /spaces/{space_id}/types [get] func GetTypesHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { @@ -199,7 +200,6 @@ func GetTypesHandler(s *ObjectService) gin.HandlerFunc { // // @Summary Get type // @Tags types -// @Accept json // @Produce json // @Param space_id path string true "Space ID" // @Param type_id path string true "Type ID" @@ -207,6 +207,7 @@ func GetTypesHandler(s *ObjectService) gin.HandlerFunc { // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 404 {object} util.NotFoundError "Resource not found" // @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth // @Router /spaces/{space_id}/types/{type_id} [get] func GetTypeHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { @@ -233,7 +234,6 @@ func GetTypeHandler(s *ObjectService) gin.HandlerFunc { // // @Summary List templates // @Tags types -// @Accept json // @Produce json // @Param space_id path string true "Space ID" // @Param type_id path string true "Type ID" @@ -242,6 +242,7 @@ func GetTypeHandler(s *ObjectService) gin.HandlerFunc { // @Success 200 {object} pagination.PaginatedResponse[Template] "List of templates" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth // @Router /spaces/{space_id}/types/{type_id}/templates [get] func GetTemplatesHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { @@ -272,7 +273,6 @@ func GetTemplatesHandler(s *ObjectService) gin.HandlerFunc { // // @Summary Get template // @Tags types -// @Accept json // @Produce json // @Param space_id path string true "Space ID" // @Param type_id path string true "Type ID" @@ -281,6 +281,7 @@ func GetTemplatesHandler(s *ObjectService) gin.HandlerFunc { // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 404 {object} util.NotFoundError "Resource not found" // @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth // @Router /spaces/{space_id}/types/{type_id}/templates/{template_id} [get] func GetTemplateHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { diff --git a/core/api/internal/search/handler.go b/core/api/internal/search/handler.go index e3ffe62ed..57bbe3318 100644 --- a/core/api/internal/search/handler.go +++ b/core/api/internal/search/handler.go @@ -21,6 +21,7 @@ import ( // @Success 200 {object} pagination.PaginatedResponse[object.Object] "List of objects" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth // @Router /search [post] func GlobalSearchHandler(s *SearchService) gin.HandlerFunc { return func(c *gin.Context) { @@ -62,6 +63,7 @@ func GlobalSearchHandler(s *SearchService) gin.HandlerFunc { // @Success 200 {object} pagination.PaginatedResponse[object.Object] "List of objects" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth // @Router /spaces/{space_id}/search [post] func SearchHandler(s *SearchService) gin.HandlerFunc { return func(c *gin.Context) { diff --git a/core/api/internal/space/handler.go b/core/api/internal/space/handler.go index 5dbbd2cd8..8c67c671b 100644 --- a/core/api/internal/space/handler.go +++ b/core/api/internal/space/handler.go @@ -13,13 +13,13 @@ import ( // // @Summary List spaces // @Tags spaces -// @Accept json // @Produce json // @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) // @Param limit query int false "The number of items to return" default(100) maximum(1000) // @Success 200 {object} pagination.PaginatedResponse[Space] "List of spaces" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth // @Router /spaces [get] func GetSpacesHandler(s *SpaceService) gin.HandlerFunc { return func(c *gin.Context) { @@ -46,13 +46,13 @@ func GetSpacesHandler(s *SpaceService) gin.HandlerFunc { // // @Summary Get space // @Tags spaces -// @Accept json // @Produce json // @Param space_id path string true "Space ID" // @Success 200 {object} SpaceResponse "Space" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 404 {object} util.NotFoundError "Space not found" // @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth // @Router /spaces/{space_id} [get] func GetSpaceHandler(s *SpaceService) gin.HandlerFunc { return func(c *gin.Context) { @@ -86,6 +86,7 @@ func GetSpaceHandler(s *SpaceService) gin.HandlerFunc { // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 423 {object} util.RateLimitError "Rate limit exceeded" // @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth // @Router /spaces [post] func CreateSpaceHandler(s *SpaceService) gin.HandlerFunc { return func(c *gin.Context) { @@ -115,7 +116,6 @@ func CreateSpaceHandler(s *SpaceService) gin.HandlerFunc { // // @Summary List members // @Tags spaces -// @Accept json // @Produce json // @Param space_id path string true "Space ID" // @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) @@ -123,6 +123,7 @@ func CreateSpaceHandler(s *SpaceService) gin.HandlerFunc { // @Success 200 {object} pagination.PaginatedResponse[Member] "List of members" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth // @Router /spaces/{space_id}/members [get] func GetMembersHandler(s *SpaceService) gin.HandlerFunc { return func(c *gin.Context) { @@ -149,7 +150,6 @@ func GetMembersHandler(s *SpaceService) gin.HandlerFunc { // // @Summary Get member // @Tags spaces -// @Accept json // @Produce json // @Param space_id path string true "Space ID" // @Param member_id path string true "Member ID" @@ -157,6 +157,7 @@ func GetMembersHandler(s *SpaceService) gin.HandlerFunc { // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 404 {object} util.NotFoundError "Member not found" // @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth // @Router /spaces/{space_id}/members/{member_id} [get] func GetMemberHandler(s *SpaceService) gin.HandlerFunc { return func(c *gin.Context) { diff --git a/core/api/server/router.go b/core/api/server/router.go index 6bc017411..f3397da1c 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -70,7 +70,7 @@ func (s *Server) NewRouter(accountService account.Service, mw service.ClientComm // List v1.GET("/spaces/:space_id/lists/:list_id/objects", list.GetObjectsInListHandler(s.listService)) v1.POST("/spaces/:space_id/lists/:list_id/objects", list.AddObjectsToListHandler(s.listService)) - v1.DELETE("/spaces/:space_id/lists/:list_id/objects", list.RemoveObjectsFromListHandler(s.listService)) + v1.DELETE("/spaces/:space_id/lists/:list_id/objects/:object_id", s.rateLimit(maxWriteRequestsPerSecond), list.RemoveObjectFromListHandler(s.listService)) // Object v1.GET("/spaces/:space_id/objects", object.GetObjectsHandler(s.objectService)) diff --git a/core/api/service.go b/core/api/service.go index d6cb17d47..4917f51d8 100644 --- a/core/api/service.go +++ b/core/api/service.go @@ -49,22 +49,20 @@ func (s *apiService) Name() (name string) { // Init initializes the API service. // -// @title Anytype API -// @version 1.0 -// @description This API allows interaction with Anytype resources such as spaces, objects and types. -// @termsOfService https://anytype.io/terms_of_use -// @contact.name Anytype Support -// @contact.url https://anytype.io/contact -// @contact.email support@anytype.io -// @license.name Any Source Available License 1.0 -// @license.url https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md -// @host localhost:31009 -// @BasePath /v1 -// @securityDefinitions.apikey ApiKeyAuth -// @in header -// @name Authorization -// @externalDocs.description OpenAPI -// @externalDocs.url https://swagger.io/resources/open-api/ +// @title Anytype API +// @version 1.0 +// @description This API allows interaction with Anytype resources such as spaces, objects and types. +// @termsOfService https://anytype.io/terms_of_use +// @contact.name Anytype Support +// @contact.url https://anytype.io/contact +// @contact.email support@anytype.io +// @license.name Any Source Available License 1.0 +// @license.url https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md +// @host localhost:31009 +// @BasePath /v1 +// @securitydefinitions.bearerauth BearerAuth +// @externalDocs.description OpenAPI +// @externalDocs.url https://swagger.io/resources/open-api/ func (s *apiService) Init(a *app.App) (err error) { s.listenAddr = a.MustComponent(config.CName).(*config.Config).JsonApiListenAddr s.accountService = a.MustComponent(account.CName).(account.Service) diff --git a/go.mod b/go.mod index 829142b21..bfba1e94a 100644 --- a/go.mod +++ b/go.mod @@ -169,10 +169,10 @@ require ( github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.6 // indirect - github.com/go-openapi/spec v0.20.4 // indirect - github.com/go-openapi/swag v0.19.15 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/spec v0.20.9 // indirect + github.com/go-openapi/swag v0.22.3 // indirect github.com/go-pkgz/expirable-cache/v3 v3.0.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect @@ -220,7 +220,7 @@ require ( github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-libp2p v0.38.2 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect - github.com/mailru/easyjson v0.7.6 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/miekg/dns v1.1.62 // indirect @@ -265,6 +265,8 @@ require ( github.com/spf13/viper v1.15.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.4.2 // indirect + github.com/sv-tools/openapi v0.2.1 // indirect + github.com/swaggo/swag/v2 v2.0.0-rc4 // indirect github.com/tetratelabs/wazero v1.8.1 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect diff --git a/go.sum b/go.sum index 99d0be11d..dbfd5264e 100644 --- a/go.sum +++ b/go.sum @@ -353,13 +353,22 @@ github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= +github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M= github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= +github.com/go-openapi/spec v0.20.9 h1:xnlYNQAwKd2VQRRfwTEI0DcK+2cbuvI/0c7jx3gA8/8= +github.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-pkgz/expirable-cache/v3 v3.0.0 h1:u3/gcu3sabLYiTCevoRKv+WzjIn5oo7P8XtiXBeRDLw= github.com/go-pkgz/expirable-cache/v3 v3.0.0/go.mod h1:2OQiDyEGQalYecLWmXprm3maPXeVb5/6/X7yRPYTzec= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= @@ -684,6 +693,7 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -728,6 +738,8 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/matishsiao/goInfo v0.0.0-20240924010139-10388a85396f h1:XDrsC/9hdgiU9ecceSmYsS2E3fBtFiYc34dAMFgegnM= github.com/matishsiao/goInfo v0.0.0-20240924010139-10388a85396f/go.mod h1:aEt7p9Rvh67BYApmZwNDPpgircTO2kgdmDUoF/1QmwA= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -1056,12 +1068,16 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/sv-tools/openapi v0.2.1 h1:ES1tMQMJFGibWndMagvdoo34T1Vllxr1Nlm5wz6b1aA= +github.com/sv-tools/openapi v0.2.1/go.mod h1:k5VuZamTw1HuiS9p2Wl5YIDWzYnHG6/FgPOSFXLAhGg= github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE= github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg= github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M= github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo= github.com/swaggo/swag v1.16.4 h1:clWJtd9LStiG3VeijiCfOVODP6VpHtKdQy9ELFG3s1A= github.com/swaggo/swag v1.16.4/go.mod h1:VBsHJRsDvfYvqoiMKnsdwhNV9LEMHgEDZcyVYX0sxPg= +github.com/swaggo/swag/v2 v2.0.0-rc4 h1:SZ8cK68gcV6cslwrJMIOqPkJELRwq4gmjvk77MrvHvY= +github.com/swaggo/swag/v2 v2.0.0-rc4/go.mod h1:Ow7Y8gF16BTCDn8YxZbyKn8FkMLRUHekv1kROJZpbvE= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tetratelabs/wazero v1.8.1 h1:NrcgVbWfkWvVc4UtT4LRLDf91PsOzDzefMdwhLfA550= github.com/tetratelabs/wazero v1.8.1/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs= From 1c87b864a51baa828c0f993320d30f334efec40b Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 16 Feb 2025 13:56:17 +0100 Subject: [PATCH 022/132] GO-4459: Add http prefix to host --- core/api/docs/docs.go | 2 +- core/api/docs/swagger.json | 2 +- core/api/docs/swagger.yaml | 2 +- core/api/service.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 2faeb5526..01dd8e76e 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -12,7 +12,7 @@ const docTemplate = `{ "paths": {"/auth/display_code":{"post":{"parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["spaces"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["spaces"]}},"/spaces/{space_id}/objects":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["types"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, "openapi": "3.1.0", "servers": [ - {"url":"localhost:31009/v1"} + {"url":"http://localhost:31009/v1"} ] }` diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index c79693d6b..3247b1acf 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -5,6 +5,6 @@ "paths": {"/auth/display_code":{"post":{"parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["spaces"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["spaces"]}},"/spaces/{space_id}/objects":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["types"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, "openapi": "3.1.0", "servers": [ - {"url":"localhost:31009/v1"} + {"url":"http://localhost:31009/v1"} ] } \ No newline at end of file diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index deb31aec2..2c3ff7a8e 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -1660,4 +1660,4 @@ paths: tags: - lists servers: -- url: localhost:31009/v1 +- url: http://localhost:31009/v1 diff --git a/core/api/service.go b/core/api/service.go index 4917f51d8..4d98e334d 100644 --- a/core/api/service.go +++ b/core/api/service.go @@ -58,7 +58,7 @@ func (s *apiService) Name() (name string) { // @contact.email support@anytype.io // @license.name Any Source Available License 1.0 // @license.url https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md -// @host localhost:31009 +// @host http://localhost:31009 // @BasePath /v1 // @securitydefinitions.bearerauth BearerAuth // @externalDocs.description OpenAPI From 5b5da7d7071f152e2844cf03b82b11304aceb0a6 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 16 Feb 2025 18:21:41 +0100 Subject: [PATCH 023/132] GO-4459: Add `swagger` Make target to generate and format swagger docs --- Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Makefile b/Makefile index cffe39487..2927a6e10 100644 --- a/Makefile +++ b/Makefile @@ -338,6 +338,12 @@ else @golangci-lint run -v ./... --new-from-rev=origin/main --timeout 15m --fix endif +swagger: + @echo 'Generating swagger docs...' + @swag init --v3.1 -q -d core/api -g service.go -o core/api/docs + @echo 'Formatting swagger docs...' + @swag fmt -d core/api + ### Tantivy Section REPO := anyproto/tantivy-go From fd66a264f83c5c56194897b542fd927d57d752aa Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 16 Feb 2025 19:14:18 +0100 Subject: [PATCH 024/132] GO-4459: Add resolveTag method to handle tag/status option as string instead of list bug --- core/api/internal/object/service.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 0079b9095..ad86898c7 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -560,6 +560,12 @@ func (s *ObjectService) convertValue(value *types.Value, format string, key stri } return member } + + // TODO: investigate how this is possible? select option not list and not returned in further details + if format == "select" || format == "multi_select" { + return s.resolveTag(details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), kind.StringValue) + } + return kind.StringValue case *types.Value_BoolValue: return kind.BoolValue @@ -604,6 +610,28 @@ func (s *ObjectService) getRelationFormatMap(relationLinks []*model.RelationLink return relationFormatMap } +// TODO: remove once bug of select option not being returned in details is fixed +func (s *ObjectService) resolveTag(spaceId, tagId string) Tag { + if tagId == "" { + return Tag{} + } + + resp := s.mw.ObjectShow(context.Background(), &pb.RpcObjectShowRequest{ + SpaceId: spaceId, + ObjectId: tagId, + }) + + if resp.Error.Code != pb.RpcObjectShowResponseError_NULL { + return Tag{} + } + + return Tag{ + Id: tagId, + Name: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), + Color: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyRelationOptionColor.String()].GetStringValue(), + } +} + // getTags returns the list of tags from the ObjectShowResponse func (s *ObjectService) getTags(key string, details []*model.ObjectViewDetailsSet) []Tag { tags := []Tag{} From cdf1787bf1e341bb8941db4f6e54e4c8554e266c Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 17 Feb 2025 13:54:41 +0100 Subject: [PATCH 025/132] GO-4459: Add layout align to excluded relations --- core/api/internal/object/service.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index ad86898c7..420e2824d 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -497,6 +497,7 @@ func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { bundle.RelationKeyLinks.String(): true, bundle.RelationKeyBacklinks.String(): true, bundle.RelationKeySourceObject.String(): true, + bundle.RelationKeyLayoutAlign.String(): true, } var details []Detail From ff88402e626dee7aed230b9673794d0e04b29fe8 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 17 Feb 2025 15:50:38 +0100 Subject: [PATCH 026/132] GO-4459: Add missing filter condition for relation name resolution --- core/api/internal/object/service.go | 6 +++--- core/api/util/util.go | 17 ++++++++++------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 420e2824d..3565976a7 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -526,11 +526,11 @@ func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { func (s *ObjectService) getRelation(key string, resp *pb.RpcObjectShowResponse) (id string, name string) { relation, err := bundle.GetRelation(domain.RelationKey(key)) if err != nil { - relation, err = util.ResolveRelationKeyToRelationName(s.mw, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), key) + name, err = util.ResolveRelationKeyToRelationName(s.mw, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), key) if err != nil { - return strcase.ToSnake(key), key + return key, key } - return key, relation.Name + return key, name } // special cases of relation keys and names diff --git a/core/api/util/util.go b/core/api/util/util.go index 25eacf1d2..568a5c3bc 100644 --- a/core/api/util/util.go +++ b/core/api/util/util.go @@ -61,7 +61,7 @@ func ResolveUniqueKeyToTypeId(mw service.ClientCommandsServer, spaceId string, u return resp.Records[0].Fields[bundle.RelationKeyId.String()].GetStringValue(), nil } -func ResolveRelationKeyToRelationName(mw service.ClientCommandsServer, spaceId string, relationKey string) (relation *model.Relation, err error) { +func ResolveRelationKeyToRelationName(mw service.ClientCommandsServer, spaceId string, relationKey string) (relation string, err error) { resp := mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ @@ -70,19 +70,22 @@ func ResolveRelationKeyToRelationName(mw service.ClientCommandsServer, spaceId s Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.String(relationKey), }, + { + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.ObjectType_relation)), + }, }, - Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String()}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String(), bundle.RelationKeyLayout.String()}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { - return &model.Relation{}, ErrFailedSearchType + return "", ErrFailedSearchType } if len(resp.Records) == 0 { - return &model.Relation{}, ErrorTypeNotFound + return "", ErrorTypeNotFound } - return &model.Relation{ - Name: resp.Records[0].Fields[bundle.RelationKeyName.String()].GetStringValue(), - }, nil + return resp.Records[0].Fields[bundle.RelationKeyName.String()].GetStringValue(), nil } From 394922dae773ae221137d7283a2c0dd288372d7e Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 17 Feb 2025 17:05:45 +0100 Subject: [PATCH 027/132] GO-4459: Fix tests for space and object --- core/api/internal/object/service_test.go | 107 +++++++++++++++++++++-- core/api/internal/search/service_test.go | 100 +++++++++++++++++++++ 2 files changed, 201 insertions(+), 6 deletions(-) diff --git a/core/api/internal/object/service_test.go b/core/api/internal/object/service_test.go index 447f2f691..1c7838632 100644 --- a/core/api/internal/object/service_test.go +++ b/core/api/internal/object/service_test.go @@ -65,6 +65,29 @@ func TestObjectService_ListObjects(t *testing.T) { ctx := context.Background() fx := newFixture(t) + // Mock template type resolution + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: mockedSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyUniqueKey.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("ot-template"), + }, + }, + Keys: []string{bundle.RelationKeyId.String()}, + }).Return(&pb.RpcObjectSearchResponse{ + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String(mockedTypeId), + }, + }, + }, + }).Once() + + // Mock object search fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ SpaceId: mockedSpaceId, Filters: []*model.BlockContentDataviewFilter{ @@ -82,6 +105,18 @@ func TestObjectService_ListObjects(t *testing.T) { int(model.ObjectType_participant), }...), }, + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyType.String(), + Condition: model.BlockContentDataviewFilter_NotEqual, + Value: pbtypes.String(mockedTypeId), + }, + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyIsHidden.String(), + Condition: model.BlockContentDataviewFilter_NotEqual, + Value: pbtypes.Bool(true), + }, }, Sorts: []*model.BlockContentDataviewSort{{ RelationKey: bundle.RelationKeyLastModifiedDate.String(), @@ -257,14 +292,74 @@ func TestObjectService_ListObjects(t *testing.T) { ctx := context.Background() fx := newFixture(t) - fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). - Return(&pb.RpcObjectSearchResponse{ - Records: []*types.Struct{}, - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - }).Once() + // Mock template type resolution + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: mockedSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyUniqueKey.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("ot-template"), + }, + }, + Keys: []string{bundle.RelationKeyId.String()}, + }).Return(&pb.RpcObjectSearchResponse{ + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String(mockedTypeId), + }, + }, + }, + }).Once() + + // Mock object search + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: mockedSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_In, + Value: pbtypes.IntList([]int{ + int(model.ObjectType_basic), + int(model.ObjectType_profile), + int(model.ObjectType_todo), + int(model.ObjectType_note), + int(model.ObjectType_bookmark), + int(model.ObjectType_set), + int(model.ObjectType_collection), + int(model.ObjectType_participant), + }...), + }, + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyType.String(), + Condition: model.BlockContentDataviewFilter_NotEqual, + Value: pbtypes.String(mockedTypeId), + }, + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyIsHidden.String(), + Condition: model.BlockContentDataviewFilter_NotEqual, + Value: pbtypes.Bool(true), + }, + }, + Sorts: []*model.BlockContentDataviewSort{{ + RelationKey: bundle.RelationKeyLastModifiedDate.String(), + Type: model.BlockContentDataviewSort_Desc, + Format: model.RelationFormat_longtext, + IncludeTime: true, + EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, + }}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String()}, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{}, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() // when - objects, total, hasMore, err := fx.ListObjects(ctx, "empty-space", offset, limit) + objects, total, hasMore, err := fx.ListObjects(ctx, mockedSpaceId, offset, limit) // then require.NoError(t, err) diff --git a/core/api/internal/search/service_test.go b/core/api/internal/search/service_test.go index c6d1e023a..f7e3eb288 100644 --- a/core/api/internal/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -120,6 +120,28 @@ func TestSearchService_GlobalSearch(t *testing.T) { Error: &pb.RpcWorkspaceOpenResponseError{Code: pb.RpcWorkspaceOpenResponseError_NULL}, }).Once() + // Mock template type resolution + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: mockedSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyUniqueKey.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("ot-template"), + }, + }, + Keys: []string{bundle.RelationKeyId.String()}, + }).Return(&pb.RpcObjectSearchResponse{ + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String(mockedType), + }, + }, + }, + }).Once() + // Mock objects in space fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ SpaceId: mockedSpaceId, @@ -148,6 +170,12 @@ func TestSearchService_GlobalSearch(t *testing.T) { Condition: model.BlockContentDataviewFilter_NotEqual, Value: pbtypes.Bool(true), }, + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyType.String(), + Condition: model.BlockContentDataviewFilter_NotEqual, + Value: pbtypes.String(mockedType), + }, { Operator: model.BlockContentDataviewFilter_Or, NestedFilters: []*model.BlockContentDataviewFilter{ @@ -406,6 +434,28 @@ func TestSearchService_Search(t *testing.T) { ctx := context.Background() fx := newFixture(t) + // Mock template type resolution + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: mockedSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyUniqueKey.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("ot-template"), + }, + }, + Keys: []string{bundle.RelationKeyId.String()}, + }).Return(&pb.RpcObjectSearchResponse{ + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String(mockedType), + }, + }, + }, + }).Once() + // Mock objects in space fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ SpaceId: mockedSpaceId, @@ -434,6 +484,12 @@ func TestSearchService_Search(t *testing.T) { Condition: model.BlockContentDataviewFilter_NotEqual, Value: pbtypes.Bool(true), }, + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyType.String(), + Condition: model.BlockContentDataviewFilter_NotEqual, + Value: pbtypes.String(mockedType), + }, { Operator: model.BlockContentDataviewFilter_Or, NestedFilters: []*model.BlockContentDataviewFilter{ @@ -530,6 +586,28 @@ func TestSearchService_Search(t *testing.T) { ctx := context.Background() fx := newFixture(t) + // Mock template type resolution + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: mockedSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyUniqueKey.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("ot-template"), + }, + }, + Keys: []string{bundle.RelationKeyId.String()}, + }).Return(&pb.RpcObjectSearchResponse{ + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String(mockedType), + }, + }, + }, + }).Once() + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{}, Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, @@ -550,6 +628,28 @@ func TestSearchService_Search(t *testing.T) { ctx := context.Background() fx := newFixture(t) + // Mock template type resolution + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: mockedSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyUniqueKey.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("ot-template"), + }, + }, + Keys: []string{bundle.RelationKeyId.String()}, + }).Return(&pb.RpcObjectSearchResponse{ + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String(mockedType), + }, + }, + }, + }).Once() + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_UNKNOWN_ERROR}, }).Once() From 79e72a51fe1bfb9c98b2a86a888a6f8cbd66bc87 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 17 Feb 2025 17:06:50 +0100 Subject: [PATCH 028/132] GO-4459: Remove templates from search and object list results --- core/api/internal/object/service.go | 19 +++++++++++++++++++ core/api/internal/search/service.go | 27 +++++++++++++++++++++++---- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 3565976a7..acc74b2a5 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -64,10 +64,13 @@ func NewService(mw service.ClientCommandsServer, spaceService *space.SpaceServic // ListObjects retrieves a paginated list of objects in a specific space. func (s *ObjectService) ListObjects(ctx context.Context, spaceId string, offset int, limit int) (objects []Object, total int, hasMore bool, err error) { + typeId, err := util.ResolveUniqueKeyToTypeId(s.mw, spaceId, "ot-template") + resp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ { + Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeyLayout.String(), Condition: model.BlockContentDataviewFilter_In, Value: pbtypes.IntList([]int{ @@ -81,6 +84,18 @@ func (s *ObjectService) ListObjects(ctx context.Context, spaceId string, offset int(model.ObjectType_participant), }...), }, + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyType.String(), + Condition: model.BlockContentDataviewFilter_NotEqual, + Value: pbtypes.String(typeId), + }, + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyIsHidden.String(), + Condition: model.BlockContentDataviewFilter_NotEqual, + Value: pbtypes.Bool(true), + }, }, Sorts: []*model.BlockContentDataviewSort{{ RelationKey: bundle.RelationKeyLastModifiedDate.String(), @@ -268,11 +283,13 @@ func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset in SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ { + Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeyLayout.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.Int64(int64(model.ObjectType_objectType)), }, { + Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeyIsHidden.String(), Condition: model.BlockContentDataviewFilter_NotEqual, Value: pbtypes.Bool(true), @@ -340,6 +357,7 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ { + Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeyUniqueKey.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.String("ot-template"), @@ -362,6 +380,7 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ { + Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeyType.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.String(templateTypeId), diff --git a/core/api/internal/search/service.go b/core/api/internal/search/service.go index ecd240871..c325560e3 100644 --- a/core/api/internal/search/service.go +++ b/core/api/internal/search/service.go @@ -52,9 +52,10 @@ func (s *SearchService) GlobalSearch(ctx context.Context, request SearchRequest, allResponses := make([]*pb.RpcObjectSearchResponse, 0, len(spaces)) for _, space := range spaces { - // Resolve object type IDs per space, as they are unique per space + // Resolve template type and object type IDs per space, as they are unique per space + templateFilter := s.prepareTemplateFilter(space.Id) typeFilters := s.prepareObjectTypeFilters(space.Id, request.Types) - filters := s.combineFilters(model.BlockContentDataviewFilter_And, baseFilters, queryFilters, typeFilters) + filters := s.combineFilters(model.BlockContentDataviewFilter_And, baseFilters, templateFilter, queryFilters, typeFilters) objResp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ SpaceId: space.Id, @@ -113,9 +114,10 @@ func (s *SearchService) GlobalSearch(ctx context.Context, request SearchRequest, // Search retrieves a paginated list of objects from a specific space that match the search parameters. func (s *SearchService) Search(ctx context.Context, spaceId string, request SearchRequest, offset int, limit int) (objects []object.Object, total int, hasMore bool, err error) { baseFilters := s.prepareBaseFilters() + templateFilter := s.prepareTemplateFilter(spaceId) queryFilters := s.prepareQueryFilter(request.Query) typeFilters := s.prepareObjectTypeFilters(spaceId, request.Types) - filters := s.combineFilters(model.BlockContentDataviewFilter_And, baseFilters, queryFilters, typeFilters) + filters := s.combineFilters(model.BlockContentDataviewFilter_And, baseFilters, templateFilter, queryFilters, typeFilters) sorts := s.prepareSorts(request.Sort) dateToSortAfter := sorts[0].RelationKey @@ -194,6 +196,23 @@ func (s *SearchService) prepareBaseFilters() []*model.BlockContentDataviewFilter } } +// prepareTemplateFilter returns a filter that excludes templates from the search results. +func (s *SearchService) prepareTemplateFilter(spaceId string) []*model.BlockContentDataviewFilter { + typeId, err := util.ResolveUniqueKeyToTypeId(s.mw, spaceId, "ot-template") + if err != nil { + return nil + } + + return []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyType.String(), + Condition: model.BlockContentDataviewFilter_NotEqual, + Value: pbtypes.String(typeId), + }, + } +} + // prepareQueryFilter combines object name and snippet filters with an OR condition. func (s *SearchService) prepareQueryFilter(searchQuery string) []*model.BlockContentDataviewFilter { if searchQuery == "" { @@ -243,7 +262,7 @@ func (s *SearchService) prepareObjectTypeFilters(spaceId string, objectTypes []s nestedFilters = append(nestedFilters, &model.BlockContentDataviewFilter{ Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeyType.String(), - Condition: model.BlockContentDataviewFilter_Equal, + Condition: model.BlockContentDataviewFilter_NotEqual, Value: pbtypes.String(typeId), }) } From fefb3b8b7d17d6d05c2007f2639802670f9cd744 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 17 Feb 2025 17:24:51 +0100 Subject: [PATCH 029/132] GO-4459: Fix tags in search test --- core/api/internal/object/service.go | 17 +++++----- core/api/internal/search/service_test.go | 40 ++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 8 deletions(-) diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index acc74b2a5..9fdc62440 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -521,19 +521,20 @@ func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { var details []Detail for _, r := range linkedRelations { - if _, isExcluded := excludeRelations[r.Key]; isExcluded { + key := r.Key + if _, isExcluded := excludeRelations[key]; isExcluded { continue } - if val, ok := primaryDetailFields[r.Key]; ok { - id, name := s.getRelation(r.Key, resp) - format := relationFormatMap[r.Key] + if val, ok := primaryDetailFields[key]; ok { + id, name := s.getRelation(key, resp) + format := relationFormatMap[key] details = append(details, Detail{ Id: id, Details: map[string]interface{}{ "name": name, "type": format, - format: s.convertValue(val, format, r.Key, resp.ObjectView.Details), + format: s.convertValue(key, val, format, resp.ObjectView.Details), }, }) } @@ -563,7 +564,7 @@ func (s *ObjectService) getRelation(key string, resp *pb.RpcObjectShowResponse) } // convertValue converts a protobuf types.Value into a native Go value. -func (s *ObjectService) convertValue(value *types.Value, format string, key string, details []*model.ObjectViewDetailsSet) interface{} { +func (s *ObjectService) convertValue(key string, value *types.Value, format string, details []*model.ObjectViewDetailsSet) interface{} { switch kind := value.Kind.(type) { case *types.Value_NullValue: return nil @@ -592,13 +593,13 @@ func (s *ObjectService) convertValue(value *types.Value, format string, key stri case *types.Value_StructValue: m := make(map[string]interface{}) for k, v := range kind.StructValue.Fields { - m[k] = s.convertValue(v, format, key, details) + m[k] = s.convertValue(key, v, format, details) } return m case *types.Value_ListValue: var list []interface{} for _, v := range kind.ListValue.Values { - list = append(list, s.convertValue(v, format, key, details)) + list = append(list, s.convertValue(key, v, format, details)) } if format == "select" || format == "multi_select" { diff --git a/core/api/internal/search/service_test.go b/core/api/internal/search/service_test.go index f7e3eb288..2e0eac3ee 100644 --- a/core/api/internal/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -375,6 +375,46 @@ func TestSearchService_GlobalSearch(t *testing.T) { Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, }).Twice() + // Mock tag-1 open + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedTagId1, + }).Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyName.String(): pbtypes.String(mockedTagValue1), + bundle.RelationKeyRelationOptionColor.String(): pbtypes.String(mockedTagColor1), + }, + }, + }, + }, + }, + }, nil).Once() + + // Mock tag-2 open + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedTagId2, + }).Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyName.String(): pbtypes.String(mockedTagValue2), + bundle.RelationKeyRelationOptionColor.String(): pbtypes.String(mockedTagColor2), + }, + }, + }, + }, + }, + }, nil).Once() + // when objects, total, hasMore, err := fx.GlobalSearch(ctx, SearchRequest{Query: mockedSearchTerm, Types: []string{}, Sort: SortOptions{Direction: "desc", Timestamp: "last_modified_date"}}, offset, limit) From 4df66f60ce3095ceab99dc3931b3855053e61521 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 20 Feb 2025 17:41:27 +0100 Subject: [PATCH 030/132] GO-4459: Add endpoint descriptions --- core/api/docs/docs.go | 2 +- core/api/docs/swagger.json | 2 +- core/api/docs/swagger.yaml | 115 ++++++++++++++++ core/api/internal/auth/handler.go | 40 +++--- core/api/internal/export/handler.go | 27 ++-- core/api/internal/list/handler.go | 83 ++++++------ core/api/internal/object/handler.go | 196 +++++++++++++++------------- core/api/internal/search/handler.go | 52 ++++---- core/api/internal/space/handler.go | 113 ++++++++-------- 9 files changed, 383 insertions(+), 247 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 01dd8e76e..5698574b8 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -9,7 +9,7 @@ const docTemplate = `{ "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"additionalProperties":{},"description":"The details","type":"object"},"id":{"description":"The id of the detail","enum":["last_modified_date","last_modified_by","created_date","created_by","last_opened_date","tags"],"example":"last_modified_date","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"description":"The icon of the template","example":"📄","type":"string"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"description":"The icon of the text","example":"📄","type":"string"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"description":"The icon of the type","example":"📄","type":"string"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-note","ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"description":"The icon of the member","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100","type":"string"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"description":"The icon of the space","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["spaces"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["spaces"]}},"/spaces/{space_id}/objects":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["types"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["spaces"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["spaces"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["types"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 3247b1acf..903f69158 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -2,7 +2,7 @@ "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"additionalProperties":{},"description":"The details","type":"object"},"id":{"description":"The id of the detail","enum":["last_modified_date","last_modified_by","created_date","created_by","last_opened_date","tags"],"example":"last_modified_date","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"description":"The icon of the template","example":"📄","type":"string"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"description":"The icon of the text","example":"📄","type":"string"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"description":"The icon of the type","example":"📄","type":"string"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-note","ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"description":"The icon of the member","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100","type":"string"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"description":"The icon of the space","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["spaces"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["spaces"]}},"/spaces/{space_id}/objects":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["types"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["spaces"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["spaces"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["types"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 2c3ff7a8e..13e0363eb 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -638,6 +638,13 @@ openapi: 3.1.0 paths: /auth/display_code: post: + description: This endpoint initiates a secure authentication flow by generating + a new challenge. Clients must supply the name of the application (via a query + parameter) that is requesting authentication. On success, the service returns + a unique challenge ID. This challenge ID must then be used with the token + endpoint (see below) to solve the challenge and retrieve an authentication + token. In essence, this endpoint “boots up” the login process and is the first + step in a multi-phase authentication sequence. parameters: - description: App name requesting the challenge in: query @@ -674,6 +681,13 @@ paths: - auth /auth/token: post: + description: After receiving a challenge ID from the display_code endpoint, + the client calls this endpoint to provide the corresponding 4-digit code (also + via a query parameter) along with the challenge ID. The endpoint verifies + that the challenge solution is correct and, if it is, returns an ephemeral + session token together with a permanent app key. These tokens are then used + in subsequent API requests to authorize access. This endpoint is central to + ensuring that only properly authenticated sessions can access further resources. parameters: - description: Challenge ID in: query @@ -716,6 +730,14 @@ paths: - auth /search: post: + description: This endpoint executes a global search over every space the user + has access to. It accepts pagination parameters (offset and limit) and a JSON + body containing search criteria. The criteria include a search query string, + an optional list of object types, and sort options (e.g. ascending/descending + by creation, modification, or last opened dates). Internally, the endpoint + aggregates results from each space, merges and sorts them (after last modified + date by default), and returns a unified, paginated list of objects that match + the search parameters. parameters: - description: The number of items to skip before starting to collect the result set @@ -764,6 +786,10 @@ paths: - search /spaces: get: + description: Retrieves a paginated list of all spaces that are accessible by + the authenticated user. Each space record contains detailed information such + as the space ID, name, icon (derived either from an emoji or image URL), and + additional metadata. This endpoint is key to displaying a user’s workspaces. parameters: - description: The number of items to skip before starting to collect the result set @@ -804,6 +830,12 @@ paths: tags: - spaces post: + description: Creates a new workspace (or space) based on a supplied name in + the JSON request body. The endpoint is subject to rate limiting and automatically + applies default configurations such as generating a random icon and initializing + the workspace with default settings (for example, a default dashboard or home + page). On success, the new space’s full metadata is returned, enabling the + client to immediately switch context to the new space. requestBody: content: application/json: @@ -849,6 +881,10 @@ paths: - spaces /spaces/{space_id}: get: + description: Fetches full details about a single space identified by its space + ID. The response includes metadata such as the space name, icon, and various + workspace IDs (home, archive, profile, etc.). This detailed view supports + use cases such as displaying space-specific settings. parameters: - description: Space ID in: path @@ -888,6 +924,11 @@ paths: - spaces /spaces/{space_id}/members: get: + description: Returns a paginated list of members belonging to the specified + space. Each member record includes the member’s profile ID, name, icon (which + may be derived from an emoji or image), network identity, global name, and + role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features + by allowing clients to show who is in a space and manage access rights. parameters: - description: Space ID in: path @@ -935,6 +976,10 @@ paths: - spaces /spaces/{space_id}/members/{member_id}: get: + description: Fetches detailed information about a single member within a space. + The endpoint returns the member’s identifier, name, icon, identity, global + name, and role. This is useful for user profile pages, permission management, + and displaying member-specific information in collaborative environments. parameters: - description: Space ID in: path @@ -980,6 +1025,12 @@ paths: - spaces /spaces/{space_id}/objects: get: + description: Retrieves a paginated list of objects in the given space. The endpoint + takes query parameters for pagination (offset and limit) and returns detailed + data about each object including its ID, name, icon, type information, a snippet + of the content (if applicable), layout, space ID, blocks and details. It is + intended for building views where users can see all objects in a space at + a glance. parameters: - description: Space ID in: path @@ -1026,6 +1077,14 @@ paths: tags: - objects post: + description: Creates a new object in the specified space using a JSON payload. + The creation process is subject to rate limiting. The payload must include + key details such as the object name, icon, description, body content (which + may support Markdown), source URL (required for bookmark objects), template + identifier, and the unique key for the object type. Post-creation, additional + operations (like setting featured relations or fetching bookmark metadata) + may occur. The endpoint then returns the full object data, ready for further + interactions. parameters: - description: Space ID in: path @@ -1078,6 +1137,11 @@ paths: - objects /spaces/{space_id}/objects/{object_id}: delete: + description: This endpoint “deletes” an object by marking it as archived. The + deletion process is performed safely and is subject to rate limiting. It returns + the object’s details after it has been archived. Proper error handling is + in place for situations such as when the object isn’t found or the deletion + cannot be performed because of permission issues. parameters: - description: Space ID in: path @@ -1134,6 +1198,12 @@ paths: tags: - objects get: + description: Fetches the full details of a single object identified by the object + ID within the specified space. The response includes not only basic metadata + (ID, name, icon, type) but also the complete set of blocks (which may include + text, files, and relations) and extra details (such as timestamps and linked + member information). This endpoint is essential when a client needs to render + or edit the full object view. parameters: - description: Space ID in: path @@ -1179,6 +1249,13 @@ paths: - objects /spaces/{space_id}/objects/{object_id}/export/{format}: post: + description: This endpoint exports a single object from the specified space + into a desired format. The export format is provided as a path parameter (currently + supporting “markdown” and “protobuf”), and clients can optionally specify + an export path in the request body. The endpoint calls an export service which + converts the object’s content into the requested format and returns the file + path where the exported data is stored. It is useful for data backup, sharing, + or further processing. parameters: - description: Space ID in: path @@ -1238,6 +1315,12 @@ paths: - export /spaces/{space_id}/search: post: + description: This endpoint performs a focused search within a single space (specified + by the space_id path parameter). Like the global search, it accepts pagination + parameters and a JSON payload containing the search query, object types, and + sorting preferences. The search is limited to the provided space and returns + a list of objects that match the query. This allows clients to implement space‑specific + filtering without having to process extraneous results. parameters: - description: Space ID in: path @@ -1292,6 +1375,11 @@ paths: - search /spaces/{space_id}/types: get: + description: This endpoint retrieves a paginated list of object types (e.g. + 'Page', 'Note', 'Task') available within the specified space. Each type’s + record includes its unique identifier, unique key, display name, icon, and + a recommended layout. Clients use this information when offering choices for + object creation or for filtering objects by type. parameters: - description: Space ID in: path @@ -1339,6 +1427,11 @@ paths: - types /spaces/{space_id}/types/{type_id}: get: + description: Fetches detailed information about one specific object type by + its ID. This includes the type’s unique key, name, icon, and recommended layout. + This detailed view assists clients in understanding the expected structure + and style for objects of that type and in guiding the user interface (such + as displaying appropriate icons or layout hints). parameters: - description: Space ID in: path @@ -1384,6 +1477,11 @@ paths: - types /spaces/{space_id}/types/{type_id}/templates: get: + description: This endpoint returns a paginated list of templates that are associated + with a specific object type within a space. Templates provide pre‑configured + structures for creating new objects. Each template record contains its identifier, + name, and icon, so that clients can offer users a selection of templates when + creating objects. parameters: - description: Space ID in: path @@ -1437,6 +1535,10 @@ paths: - types /spaces/{space_id}/types/{type_id}/templates/{template_id}: get: + description: Fetches full details for one template associated with a particular + object type in a space. The response provides the template’s identifier, name, + icon, and any other relevant metadata. This endpoint is useful when a client + needs to preview or apply a template to prefill object creation fields. parameters: - description: Space ID in: path @@ -1488,6 +1590,10 @@ paths: - types /v1/spaces/{space_id}/lists/{list_id}/objects: get: + description: Returns a paginated list of objects that are associated with a + specific list (or collection) within a space. This endpoint helps clients + to manage grouped objects (for example, tasks within a list) by returning + detailed object information for each item of the list. parameters: - description: Space ID in: path @@ -1544,6 +1650,10 @@ paths: tags: - lists post: + description: Enables clients to add one or more objects to a specific list by + submitting a JSON array of object IDs. Upon success, the endpoint returns + a confirmation message. This endpoint is vital for building user interfaces + that allow drag‑and‑drop or multi‑select additions to collections. parameters: - description: Space ID in: path @@ -1604,6 +1714,11 @@ paths: - lists /v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}: delete: + description: Removes a given object from the specified list in a space. The + endpoint takes the space, list, and object identifiers as path parameters. + It's subject to rate limiting and returns a success message on completion. + It is used for dynamically managing collections without affecting the underlying + object data. parameters: - description: Space ID in: path diff --git a/core/api/internal/auth/handler.go b/core/api/internal/auth/handler.go index 21900c994..46cdbb188 100644 --- a/core/api/internal/auth/handler.go +++ b/core/api/internal/auth/handler.go @@ -10,15 +10,16 @@ import ( // DisplayCodeHandler starts a new challenge and returns the challenge ID // -// @Summary Start new challenge -// @Tags auth -// @Accept json -// @Produce json -// @Param app_name query string true "App name requesting the challenge" -// @Success 200 {object} DisplayCodeResponse "Challenge ID" -// @Failure 400 {object} util.ValidationError "Invalid input" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Router /auth/display_code [post] +// @Summary Start new challenge +// @Description This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence. +// @Tags auth +// @Accept json +// @Produce json +// @Param app_name query string true "App name requesting the challenge" +// @Success 200 {object} DisplayCodeResponse "Challenge ID" +// @Failure 400 {object} util.ValidationError "Invalid input" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Router /auth/display_code [post] func DisplayCodeHandler(s *AuthService) gin.HandlerFunc { return func(c *gin.Context) { appName := c.Query("app_name") @@ -40,16 +41,17 @@ func DisplayCodeHandler(s *AuthService) gin.HandlerFunc { // TokenHandler retrieves an authentication token using a code and challenge ID // -// @Summary Retrieve token -// @Tags auth -// @Accept json -// @Produce json -// @Param challenge_id query string true "Challenge ID" -// @Param code query string true "4-digit code retrieved from Anytype Desktop app" -// @Success 200 {object} TokenResponse "Authentication token" -// @Failure 400 {object} util.ValidationError "Invalid input" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Router /auth/token [post] +// @Summary Retrieve token +// @Description After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources. +// @Tags auth +// @Accept json +// @Produce json +// @Param challenge_id query string true "Challenge ID" +// @Param code query string true "4-digit code retrieved from Anytype Desktop app" +// @Success 200 {object} TokenResponse "Authentication token" +// @Failure 400 {object} util.ValidationError "Invalid input" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Router /auth/token [post] func TokenHandler(s *AuthService) gin.HandlerFunc { return func(c *gin.Context) { challengeId := c.Query("challenge_id") diff --git a/core/api/internal/export/handler.go b/core/api/internal/export/handler.go index b0a2813a4..cc4c05813 100644 --- a/core/api/internal/export/handler.go +++ b/core/api/internal/export/handler.go @@ -10,19 +10,20 @@ import ( // GetObjectExportHandler exports an object in specified format // -// @Summary Export object -// @Tags export -// @Accept json -// @Produce json -// @Param space_id path string true "Space ID" -// @Param object_id path string true "Object ID" -// @Param format path string true "Export format" Enums(markdown,protobuf) -// @Success 200 {object} ObjectExportResponse "Object exported successfully" -// @Failure 400 {object} util.ValidationError "Bad request" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Security bearerauth -// @Router /spaces/{space_id}/objects/{object_id}/export/{format} [post] +// @Summary Export object +// @Description This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing. +// @Tags export +// @Accept json +// @Produce json +// @Param space_id path string true "Space ID" +// @Param object_id path string true "Object ID" +// @Param format path string true "Export format" Enums(markdown,protobuf) +// @Success 200 {object} ObjectExportResponse "Object exported successfully" +// @Failure 400 {object} util.ValidationError "Bad request" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth +// @Router /spaces/{space_id}/objects/{object_id}/export/{format} [post] func GetObjectExportHandler(s *ExportService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") diff --git a/core/api/internal/list/handler.go b/core/api/internal/list/handler.go index c5c6871ae..761795a11 100644 --- a/core/api/internal/list/handler.go +++ b/core/api/internal/list/handler.go @@ -11,19 +11,20 @@ import ( // GetObjectsInListHandler // -// @Summary Get objects in list -// @Tags lists -// @Produce json -// @Param space_id path string true "Space ID" -// @Param list_id path string true "List ID" -// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) -// @Param limit query int false "The number of items to return" -// @Success 200 {object} pagination.PaginatedResponse[object.Object] "List of objects" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 404 {object} util.NotFoundError "Not found" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Security bearerauth -// @Router /v1/spaces/{space_id}/lists/{list_id}/objects [get] +// @Summary Get objects in list +// @Description Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list. +// @Tags lists +// @Produce json +// @Param space_id path string true "Space ID" +// @Param list_id path string true "List ID" +// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) +// @Param limit query int false "The number of items to return" +// @Success 200 {object} pagination.PaginatedResponse[object.Object] "List of objects" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Not found" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth +// @Router /v1/spaces/{space_id}/lists/{list_id}/objects [get] func GetObjectsInListHandler(s *ListService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") @@ -48,20 +49,21 @@ func GetObjectsInListHandler(s *ListService) gin.HandlerFunc { // AddObjectsToListHandler // -// @Summary Add objects to list -// @Tags lists -// @Accept json -// @Produce json -// @Param space_id path string true "Space ID" -// @Param list_id path string true "List ID" -// @Param objects body []string true "List of object IDs" -// @Success 200 {object} string "Objects added successfully" -// @Failure 400 {object} util.ValidationError "Bad request" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 404 {object} util.NotFoundError "Not found" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Security bearerauth -// @Router /v1/spaces/{space_id}/lists/{list_id}/objects [post] +// @Summary Add objects to list +// @Description Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections. +// @Tags lists +// @Accept json +// @Produce json +// @Param space_id path string true "Space ID" +// @Param list_id path string true "List ID" +// @Param objects body []string true "List of object IDs" +// @Success 200 {object} string "Objects added successfully" +// @Failure 400 {object} util.ValidationError "Bad request" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Not found" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth +// @Router /v1/spaces/{space_id}/lists/{list_id}/objects [post] func AddObjectsToListHandler(s *ListService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") @@ -91,19 +93,20 @@ func AddObjectsToListHandler(s *ListService) gin.HandlerFunc { // RemoveObjectFromListHandler // -// @Summary Remove object from list -// @Tags lists -// @Produce json -// @Param space_id path string true "Space ID" -// @Param list_id path string true "List ID" -// @Param object_id path string true "Object ID" -// @Success 200 {object} string "Objects removed successfully" -// @Failure 400 {object} util.ValidationError "Bad request" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 404 {object} util.NotFoundError "Not found" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Security bearerauth -// @Router /v1/spaces/{space_id}/lists/{list_id}/objects/{object_id} [delete] +// @Summary Remove object from list +// @Description Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data. +// @Tags lists +// @Produce json +// @Param space_id path string true "Space ID" +// @Param list_id path string true "List ID" +// @Param object_id path string true "Object ID" +// @Success 200 {object} string "Objects removed successfully" +// @Failure 400 {object} util.ValidationError "Bad request" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Not found" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth +// @Router /v1/spaces/{space_id}/lists/{list_id}/objects/{object_id} [delete] func RemoveObjectFromListHandler(s *ListService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") diff --git a/core/api/internal/object/handler.go b/core/api/internal/object/handler.go index a8a0aa25d..c62f18768 100644 --- a/core/api/internal/object/handler.go +++ b/core/api/internal/object/handler.go @@ -11,17 +11,18 @@ import ( // GetObjectsHandler retrieves a list of objects in a space // -// @Summary List objects -// @Tags objects -// @Produce json -// @Param space_id path string true "Space ID" -// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) -// @Param limit query int false "The number of items to return" default(100) maximum(1000) -// @Success 200 {object} pagination.PaginatedResponse[Object] "List of objects" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Security bearerauth -// @Router /spaces/{space_id}/objects [get] +// @Summary List objects +// @Description Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance. +// @Tags objects +// @Produce json +// @Param space_id path string true "Space ID" +// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) +// @Param limit query int false "The number of items to return" default(100) maximum(1000) +// @Success 200 {object} pagination.PaginatedResponse[Object] "List of objects" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth +// @Router /spaces/{space_id}/objects [get] func GetObjectsHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") @@ -47,17 +48,18 @@ func GetObjectsHandler(s *ObjectService) gin.HandlerFunc { // GetObjectHandler retrieves an object in a space // -// @Summary Get object -// @Tags objects -// @Produce json -// @Param space_id path string true "Space ID" -// @Param object_id path string true "Object ID" -// @Success 200 {object} ObjectResponse "The requested object" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 404 {object} util.NotFoundError "Resource not found" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Security bearerauth -// @Router /spaces/{space_id}/objects/{object_id} [get] +// @Summary Get object +// @Description Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view. +// @Tags objects +// @Produce json +// @Param space_id path string true "Space ID" +// @Param object_id path string true "Object ID" +// @Success 200 {object} ObjectResponse "The requested object" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Resource not found" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth +// @Router /spaces/{space_id}/objects/{object_id} [get] func GetObjectHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") @@ -81,19 +83,20 @@ func GetObjectHandler(s *ObjectService) gin.HandlerFunc { // DeleteObjectHandler deletes an object in a space // -// @Summary Delete object -// @Tags objects -// @Produce json -// @Param space_id path string true "Space ID" -// @Param object_id path string true "Object ID" -// @Success 200 {object} ObjectResponse "The deleted object" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 403 {object} util.ForbiddenError "Forbidden" -// @Failure 404 {object} util.NotFoundError "Resource not found" -// @Failure 423 {object} util.RateLimitError "Rate limit exceeded" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Security bearerauth -// @Router /spaces/{space_id}/objects/{object_id} [delete] +// @Summary Delete object +// @Description This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues. +// @Tags objects +// @Produce json +// @Param space_id path string true "Space ID" +// @Param object_id path string true "Object ID" +// @Success 200 {object} ObjectResponse "The deleted object" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 403 {object} util.ForbiddenError "Forbidden" +// @Failure 404 {object} util.NotFoundError "Resource not found" +// @Failure 423 {object} util.RateLimitError "Rate limit exceeded" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth +// @Router /spaces/{space_id}/objects/{object_id} [delete] func DeleteObjectHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") @@ -118,19 +121,20 @@ func DeleteObjectHandler(s *ObjectService) gin.HandlerFunc { // CreateObjectHandler creates a new object in a space // -// @Summary Create object -// @Tags objects -// @Accept json -// @Produce json -// @Param space_id path string true "Space ID" -// @Param object body CreateObjectRequest true "Object to create" -// @Success 200 {object} ObjectResponse "The created object" -// @Failure 400 {object} util.ValidationError "Bad request" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 423 {object} util.RateLimitError "Rate limit exceeded" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Security bearerauth -// @Router /spaces/{space_id}/objects [post] +// @Summary Create object +// @Description Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions. +// @Tags objects +// @Accept json +// @Produce json +// @Param space_id path string true "Space ID" +// @Param object body CreateObjectRequest true "Object to create" +// @Success 200 {object} ObjectResponse "The created object" +// @Failure 400 {object} util.ValidationError "Bad request" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 423 {object} util.RateLimitError "Rate limit exceeded" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth +// @Router /spaces/{space_id}/objects [post] func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") @@ -164,17 +168,18 @@ func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { // GetTypesHandler retrieves a list of types in a space // -// @Summary List types -// @Tags types -// @Produce json -// @Param space_id path string true "Space ID" -// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) -// @Param limit query int false "The number of items to return" default(100) maximum(1000) -// @Success 200 {object} pagination.PaginatedResponse[Type] "List of types" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Security bearerauth -// @Router /spaces/{space_id}/types [get] +// @Summary List types +// @Description This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type. +// @Tags types +// @Produce json +// @Param space_id path string true "Space ID" +// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) +// @Param limit query int false "The number of items to return" default(100) maximum(1000) +// @Success 200 {object} pagination.PaginatedResponse[Type] "List of types" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth +// @Router /spaces/{space_id}/types [get] func GetTypesHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") @@ -198,17 +203,18 @@ func GetTypesHandler(s *ObjectService) gin.HandlerFunc { // GetTypeHandler retrieves a type in a space // -// @Summary Get type -// @Tags types -// @Produce json -// @Param space_id path string true "Space ID" -// @Param type_id path string true "Type ID" -// @Success 200 {object} TypeResponse "The requested type" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 404 {object} util.NotFoundError "Resource not found" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Security bearerauth -// @Router /spaces/{space_id}/types/{type_id} [get] +// @Summary Get type +// @Description Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints). +// @Tags types +// @Produce json +// @Param space_id path string true "Space ID" +// @Param type_id path string true "Type ID" +// @Success 200 {object} TypeResponse "The requested type" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Resource not found" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth +// @Router /spaces/{space_id}/types/{type_id} [get] func GetTypeHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") @@ -232,18 +238,19 @@ func GetTypeHandler(s *ObjectService) gin.HandlerFunc { // GetTemplatesHandler retrieves a list of templates for a type in a space // -// @Summary List templates -// @Tags types -// @Produce json -// @Param space_id path string true "Space ID" -// @Param type_id path string true "Type ID" -// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) -// @Param limit query int false "The number of items to return" default(100) maximum(1000) -// @Success 200 {object} pagination.PaginatedResponse[Template] "List of templates" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Security bearerauth -// @Router /spaces/{space_id}/types/{type_id}/templates [get] +// @Summary List templates +// @Description This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects. +// @Tags types +// @Produce json +// @Param space_id path string true "Space ID" +// @Param type_id path string true "Type ID" +// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) +// @Param limit query int false "The number of items to return" default(100) maximum(1000) +// @Success 200 {object} pagination.PaginatedResponse[Template] "List of templates" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth +// @Router /spaces/{space_id}/types/{type_id}/templates [get] func GetTemplatesHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") @@ -271,18 +278,19 @@ func GetTemplatesHandler(s *ObjectService) gin.HandlerFunc { // GetTemplateHandler retrieves a template for a type in a space // -// @Summary Get template -// @Tags types -// @Produce json -// @Param space_id path string true "Space ID" -// @Param type_id path string true "Type ID" -// @Param template_id path string true "Template ID" -// @Success 200 {object} TemplateResponse "The requested template" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 404 {object} util.NotFoundError "Resource not found" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Security bearerauth -// @Router /spaces/{space_id}/types/{type_id}/templates/{template_id} [get] +// @Summary Get template +// @Description Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields. +// @Tags types +// @Produce json +// @Param space_id path string true "Space ID" +// @Param type_id path string true "Type ID" +// @Param template_id path string true "Template ID" +// @Success 200 {object} TemplateResponse "The requested template" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Resource not found" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth +// @Router /spaces/{space_id}/types/{type_id}/templates/{template_id} [get] func GetTemplateHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") diff --git a/core/api/internal/search/handler.go b/core/api/internal/search/handler.go index 57bbe3318..9113b30e2 100644 --- a/core/api/internal/search/handler.go +++ b/core/api/internal/search/handler.go @@ -11,18 +11,19 @@ import ( // GlobalSearchHandler searches and retrieves objects across all spaces // -// @Summary Search objects across all spaces -// @Tags search -// @Accept json -// @Produce json -// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) -// @Param limit query int false "The number of items to return" default(100) maximum(1000) -// @Param request body SearchRequest true "Search parameters" -// @Success 200 {object} pagination.PaginatedResponse[object.Object] "List of objects" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Security bearerauth -// @Router /search [post] +// @Summary Search objects across all spaces +// @Description This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters. +// @Tags search +// @Accept json +// @Produce json +// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) +// @Param limit query int false "The number of items to return" default(100) maximum(1000) +// @Param request body SearchRequest true "Search parameters" +// @Success 200 {object} pagination.PaginatedResponse[object.Object] "List of objects" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth +// @Router /search [post] func GlobalSearchHandler(s *SearchService) gin.HandlerFunc { return func(c *gin.Context) { offset := c.GetInt("offset") @@ -52,19 +53,20 @@ func GlobalSearchHandler(s *SearchService) gin.HandlerFunc { // SearchHandler searches and retrieves objects within a space // -// @Summary Search objects within a space -// @Tags search -// @Accept json -// @Produce json -// @Param space_id path string true "Space ID" -// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) -// @Param limit query int false "The number of items to return" default(100) maximum(1000) -// @Param request body SearchRequest true "Search parameters" -// @Success 200 {object} pagination.PaginatedResponse[object.Object] "List of objects" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Security bearerauth -// @Router /spaces/{space_id}/search [post] +// @Summary Search objects within a space +// @Description This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results. +// @Tags search +// @Accept json +// @Produce json +// @Param space_id path string true "Space ID" +// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) +// @Param limit query int false "The number of items to return" default(100) maximum(1000) +// @Param request body SearchRequest true "Search parameters" +// @Success 200 {object} pagination.PaginatedResponse[object.Object] "List of objects" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth +// @Router /spaces/{space_id}/search [post] func SearchHandler(s *SearchService) gin.HandlerFunc { return func(c *gin.Context) { spaceID := c.Param("space_id") diff --git a/core/api/internal/space/handler.go b/core/api/internal/space/handler.go index 8c67c671b..e52dcb2f6 100644 --- a/core/api/internal/space/handler.go +++ b/core/api/internal/space/handler.go @@ -11,16 +11,17 @@ import ( // GetSpacesHandler retrieves a list of spaces // -// @Summary List spaces -// @Tags spaces -// @Produce json -// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) -// @Param limit query int false "The number of items to return" default(100) maximum(1000) -// @Success 200 {object} pagination.PaginatedResponse[Space] "List of spaces" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Security bearerauth -// @Router /spaces [get] +// @Summary List spaces +// @Description Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces. +// @Tags spaces +// @Produce json +// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) +// @Param limit query int false "The number of items to return" default(100) maximum(1000) +// @Success 200 {object} pagination.PaginatedResponse[Space] "List of spaces" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth +// @Router /spaces [get] func GetSpacesHandler(s *SpaceService) gin.HandlerFunc { return func(c *gin.Context) { offset := c.GetInt("offset") @@ -44,16 +45,17 @@ func GetSpacesHandler(s *SpaceService) gin.HandlerFunc { // GetSpaceHandler retrieves a space // -// @Summary Get space -// @Tags spaces -// @Produce json -// @Param space_id path string true "Space ID" -// @Success 200 {object} SpaceResponse "Space" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 404 {object} util.NotFoundError "Space not found" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Security bearerauth -// @Router /spaces/{space_id} [get] +// @Summary Get space +// @Description Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings. +// @Tags spaces +// @Produce json +// @Param space_id path string true "Space ID" +// @Success 200 {object} SpaceResponse "Space" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Space not found" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth +// @Router /spaces/{space_id} [get] func GetSpaceHandler(s *SpaceService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") @@ -76,18 +78,19 @@ func GetSpaceHandler(s *SpaceService) gin.HandlerFunc { // CreateSpaceHandler creates a new space // -// @Summary Create space -// @Tags spaces -// @Accept json -// @Produce json -// @Param name body CreateSpaceRequest true "Space to create" -// @Success 200 {object} SpaceResponse "Space created successfully" -// @Failure 400 {object} util.ValidationError "Bad request" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 423 {object} util.RateLimitError "Rate limit exceeded" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Security bearerauth -// @Router /spaces [post] +// @Summary Create space +// @Description Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space. +// @Tags spaces +// @Accept json +// @Produce json +// @Param name body CreateSpaceRequest true "Space to create" +// @Success 200 {object} SpaceResponse "Space created successfully" +// @Failure 400 {object} util.ValidationError "Bad request" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 423 {object} util.RateLimitError "Rate limit exceeded" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth +// @Router /spaces [post] func CreateSpaceHandler(s *SpaceService) gin.HandlerFunc { return func(c *gin.Context) { nameRequest := CreateSpaceRequest{} @@ -114,17 +117,18 @@ func CreateSpaceHandler(s *SpaceService) gin.HandlerFunc { // GetMembersHandler retrieves a list of members in a space // -// @Summary List members -// @Tags spaces -// @Produce json -// @Param space_id path string true "Space ID" -// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) -// @Param limit query int false "The number of items to return" default(100) maximum(1000) -// @Success 200 {object} pagination.PaginatedResponse[Member] "List of members" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Security bearerauth -// @Router /spaces/{space_id}/members [get] +// @Summary List members +// @Description Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights. +// @Tags spaces +// @Produce json +// @Param space_id path string true "Space ID" +// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) +// @Param limit query int false "The number of items to return" default(100) maximum(1000) +// @Success 200 {object} pagination.PaginatedResponse[Member] "List of members" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth +// @Router /spaces/{space_id}/members [get] func GetMembersHandler(s *SpaceService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") @@ -148,17 +152,18 @@ func GetMembersHandler(s *SpaceService) gin.HandlerFunc { // GetMemberHandler retrieves a member in a space // -// @Summary Get member -// @Tags spaces -// @Produce json -// @Param space_id path string true "Space ID" -// @Param member_id path string true "Member ID" -// @Success 200 {object} MemberResponse "Member" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 404 {object} util.NotFoundError "Member not found" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Security bearerauth -// @Router /spaces/{space_id}/members/{member_id} [get] +// @Summary Get member +// @Description Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments. +// @Tags spaces +// @Produce json +// @Param space_id path string true "Space ID" +// @Param member_id path string true "Member ID" +// @Success 200 {object} MemberResponse "Member" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Member not found" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth +// @Router /spaces/{space_id}/members/{member_id} [get] func GetMemberHandler(s *SpaceService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") From 8935a5bb112724806115a94ca811e9adfaaa9e79 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 21 Feb 2025 13:34:06 +0100 Subject: [PATCH 031/132] GO-4459: Set metadata header with API version --- core/api/server/middleware.go | 8 ++++++++ core/api/server/router.go | 1 + 2 files changed, 9 insertions(+) diff --git a/core/api/server/middleware.go b/core/api/server/middleware.go index 1313127f8..2317c935f 100644 --- a/core/api/server/middleware.go +++ b/core/api/server/middleware.go @@ -95,3 +95,11 @@ func (s *Server) ensureAccountInfo(accountService account.Service) gin.HandlerFu c.Next() } } + +// ensureMetadataHeader is a middleware that ensures the metadata header is set. +func (s *Server) ensureMetadataHeader() gin.HandlerFunc { + return func(c *gin.Context) { + c.Writer.Header().Set("X-API-Version", "0.0.2") + c.Next() + } +} diff --git a/core/api/server/router.go b/core/api/server/router.go index f3397da1c..67237092c 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -37,6 +37,7 @@ func (s *Server) NewRouter(accountService account.Service, mw service.ClientComm router := gin.New() router.Use(gin.Recovery()) + router.Use(s.ensureMetadataHeader()) if debug { router.Use(gin.Logger()) From 6879cc671b16b123b2b14b0218ea240c1c36869d Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 24 Feb 2025 19:40:41 +0100 Subject: [PATCH 032/132] GO-4459 Add swagger to makefile --- makefiles/tools.mk | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/makefiles/tools.mk b/makefiles/tools.mk index e0c4c3439..81ec1c41a 100644 --- a/makefiles/tools.mk +++ b/makefiles/tools.mk @@ -9,3 +9,9 @@ lint: @npx prettier --check "./**" 2> /dev/null || true @echo 'Linting with golint...' @golint `go list ./... | grep -v /vendor/` + +swagger: + @echo 'Generating swagger docs...' + @swag init --v3.1 -q -d core/api -g service.go -o core/api/docs + @echo 'Formatting swagger docs...' + @swag fmt -d core/api From 9655704e021720900f7d9e20c40e20ecbcb04b45 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 24 Feb 2025 19:42:45 +0100 Subject: [PATCH 033/132] GO-4459: Fix condition in object type filter for search --- core/api/internal/search/service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/api/internal/search/service.go b/core/api/internal/search/service.go index c325560e3..8536097dc 100644 --- a/core/api/internal/search/service.go +++ b/core/api/internal/search/service.go @@ -262,7 +262,7 @@ func (s *SearchService) prepareObjectTypeFilters(spaceId string, objectTypes []s nestedFilters = append(nestedFilters, &model.BlockContentDataviewFilter{ Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeyType.String(), - Condition: model.BlockContentDataviewFilter_NotEqual, + Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.String(typeId), }) } From 84ee21b717845c3255a625da0a463384ce479451 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 24 Feb 2025 20:07:50 +0100 Subject: [PATCH 034/132] GO-4459: Update relation key from Layout to ResolvedLayout in filters --- core/api/internal/object/service.go | 8 +++---- core/api/internal/object/service_test.go | 28 ++++++++++++------------ core/api/internal/search/service.go | 2 +- core/api/internal/search/service_test.go | 10 ++++----- core/api/internal/space/service.go | 4 ++-- core/api/internal/space/service_test.go | 2 +- core/api/util/util.go | 4 ++-- 7 files changed, 29 insertions(+), 29 deletions(-) diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 9fdc62440..55944b0c2 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -71,7 +71,7 @@ func (s *ObjectService) ListObjects(ctx context.Context, spaceId string, offset Filters: []*model.BlockContentDataviewFilter{ { Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyLayout.String(), + RelationKey: bundle.RelationKeyResolvedLayout.String(), Condition: model.BlockContentDataviewFilter_In, Value: pbtypes.IntList([]int{ int(model.ObjectType_basic), @@ -150,7 +150,7 @@ func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId Icon: icon, Type: s.getTypeFromDetails(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyType.String()].GetStringValue(), resp.ObjectView.Details), Snippet: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySnippet.String()].GetStringValue(), - Layout: model.ObjectTypeLayout_name[int32(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyLayout.String()].GetNumberValue())], + Layout: model.ObjectTypeLayout_name[int32(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyResolvedLayout.String()].GetNumberValue())], SpaceId: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), RootId: resp.ObjectView.RootId, Blocks: s.getBlocks(resp), @@ -284,7 +284,7 @@ func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset in Filters: []*model.BlockContentDataviewFilter{ { Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyLayout.String(), + RelationKey: bundle.RelationKeyResolvedLayout.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.Int64(int64(model.ObjectType_objectType)), }, @@ -487,7 +487,7 @@ func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { bundle.RelationKeyIconEmoji.String(): true, bundle.RelationKeyIconImage.String(): true, bundle.RelationKeyType.String(): true, - bundle.RelationKeyLayout.String(): true, + bundle.RelationKeyResolvedLayout.String(): true, bundle.RelationKeyIsFavorite.String(): true, bundle.RelationKeyIsArchived.String(): true, bundle.RelationKeyIsDeleted.String(): true, diff --git a/core/api/internal/object/service_test.go b/core/api/internal/object/service_test.go index 1c7838632..3df35acb7 100644 --- a/core/api/internal/object/service_test.go +++ b/core/api/internal/object/service_test.go @@ -92,7 +92,7 @@ func TestObjectService_ListObjects(t *testing.T) { SpaceId: mockedSpaceId, Filters: []*model.BlockContentDataviewFilter{ { - RelationKey: bundle.RelationKeyLayout.String(), + RelationKey: bundle.RelationKeyResolvedLayout.String(), Condition: model.BlockContentDataviewFilter_In, Value: pbtypes.IntList([]int{ int(model.ObjectType_basic), @@ -130,12 +130,12 @@ func TestObjectService_ListObjects(t *testing.T) { Records: []*types.Struct{ { Fields: map[string]*types.Value{ - bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), - bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), - bundle.RelationKeySnippet.String(): pbtypes.String(mockedObjectSnippet), - bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedObjectIcon), - bundle.RelationKeyType.String(): pbtypes.String(mockedTypeId), - bundle.RelationKeyLayout.String(): pbtypes.Float64(float64(model.ObjectType_basic)), + bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), + bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), + bundle.RelationKeySnippet.String(): pbtypes.String(mockedObjectSnippet), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedObjectIcon), + bundle.RelationKeyType.String(): pbtypes.String(mockedTypeId), + bundle.RelationKeyResolvedLayout.String(): pbtypes.Float64(float64(model.ObjectType_basic)), }, }, }, @@ -319,7 +319,7 @@ func TestObjectService_ListObjects(t *testing.T) { SpaceId: mockedSpaceId, Filters: []*model.BlockContentDataviewFilter{ { - RelationKey: bundle.RelationKeyLayout.String(), + RelationKey: bundle.RelationKeyResolvedLayout.String(), Condition: model.BlockContentDataviewFilter_In, Value: pbtypes.IntList([]int{ int(model.ObjectType_basic), @@ -540,12 +540,12 @@ func TestObjectService_CreateObject(t *testing.T) { Id: mockedNewObjectId, Details: &types.Struct{ Fields: map[string]*types.Value{ - bundle.RelationKeyId.String(): pbtypes.String(mockedNewObjectId), - bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), - bundle.RelationKeyLayout.String(): pbtypes.Float64(float64(model.ObjectType_basic)), - bundle.RelationKeyType.String(): pbtypes.String(mockedTypeId), - bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedObjectIcon), - bundle.RelationKeySpaceId.String(): pbtypes.String(mockedSpaceId), + bundle.RelationKeyId.String(): pbtypes.String(mockedNewObjectId), + bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), + bundle.RelationKeyResolvedLayout.String(): pbtypes.Float64(float64(model.ObjectType_basic)), + bundle.RelationKeyType.String(): pbtypes.String(mockedTypeId), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedObjectIcon), + bundle.RelationKeySpaceId.String(): pbtypes.String(mockedSpaceId), }, }, }, diff --git a/core/api/internal/search/service.go b/core/api/internal/search/service.go index 8536097dc..b0af8641a 100644 --- a/core/api/internal/search/service.go +++ b/core/api/internal/search/service.go @@ -174,7 +174,7 @@ func (s *SearchService) prepareBaseFilters() []*model.BlockContentDataviewFilter return []*model.BlockContentDataviewFilter{ { Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyLayout.String(), + RelationKey: bundle.RelationKeyResolvedLayout.String(), Condition: model.BlockContentDataviewFilter_In, Value: pbtypes.IntList([]int{ int(model.ObjectType_basic), diff --git a/core/api/internal/search/service_test.go b/core/api/internal/search/service_test.go index 2e0eac3ee..3b9d62aef 100644 --- a/core/api/internal/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -78,7 +78,7 @@ func TestSearchService_GlobalSearch(t *testing.T) { Filters: []*model.BlockContentDataviewFilter{ { Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyLayout.String(), + RelationKey: bundle.RelationKeyResolvedLayout.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.Int64(int64(model.ObjectType_spaceView)), }, @@ -151,7 +151,7 @@ func TestSearchService_GlobalSearch(t *testing.T) { NestedFilters: []*model.BlockContentDataviewFilter{ { Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyLayout.String(), + RelationKey: bundle.RelationKeyResolvedLayout.String(), Condition: model.BlockContentDataviewFilter_In, Value: pbtypes.IntList([]int{ int(model.ObjectType_basic), @@ -265,7 +265,7 @@ func TestSearchService_GlobalSearch(t *testing.T) { Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), - bundle.RelationKeyLayout.String(): pbtypes.Int64(int64(model.ObjectType_basic)), + bundle.RelationKeyResolvedLayout.String(): pbtypes.Int64(int64(model.ObjectType_basic)), bundle.RelationKeyIconEmoji.String(): pbtypes.String("🌐"), bundle.RelationKeyLastModifiedDate.String(): pbtypes.Float64(999999), bundle.RelationKeyLastModifiedBy.String(): pbtypes.String(mockedParticipantId), @@ -505,7 +505,7 @@ func TestSearchService_Search(t *testing.T) { NestedFilters: []*model.BlockContentDataviewFilter{ { Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyLayout.String(), + RelationKey: bundle.RelationKeyResolvedLayout.String(), Condition: model.BlockContentDataviewFilter_In, Value: pbtypes.IntList([]int{ int(model.ObjectType_basic), @@ -585,7 +585,7 @@ func TestSearchService_Search(t *testing.T) { Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), - bundle.RelationKeyLayout.String(): pbtypes.Int64(int64(model.ObjectType_basic)), + bundle.RelationKeyResolvedLayout.String(): pbtypes.Int64(int64(model.ObjectType_basic)), bundle.RelationKeyLastModifiedDate.String(): pbtypes.Float64(999999), bundle.RelationKeySpaceId.String(): pbtypes.String(mockedSpaceId), bundle.RelationKeyType.String(): pbtypes.String(mockedType), diff --git a/core/api/internal/space/service.go b/core/api/internal/space/service.go index 1b36244e0..c604c863a 100644 --- a/core/api/internal/space/service.go +++ b/core/api/internal/space/service.go @@ -52,7 +52,7 @@ func (s *SpaceService) ListSpaces(ctx context.Context, offset int, limit int) (s Filters: []*model.BlockContentDataviewFilter{ { Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyLayout.String(), + RelationKey: bundle.RelationKeyResolvedLayout.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.Int64(int64(model.ObjectType_spaceView)), }, @@ -166,7 +166,7 @@ func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset i Filters: []*model.BlockContentDataviewFilter{ { Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyLayout.String(), + RelationKey: bundle.RelationKeyResolvedLayout.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.Int64(int64(model.ObjectType_participant)), }, diff --git a/core/api/internal/space/service_test.go b/core/api/internal/space/service_test.go index d68a3cdce..6fc47af5c 100644 --- a/core/api/internal/space/service_test.go +++ b/core/api/internal/space/service_test.go @@ -53,7 +53,7 @@ func TestSpaceService_ListSpaces(t *testing.T) { Filters: []*model.BlockContentDataviewFilter{ { Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyLayout.String(), + RelationKey: bundle.RelationKeyResolvedLayout.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.Int64(int64(model.ObjectType_spaceView)), }, diff --git a/core/api/util/util.go b/core/api/util/util.go index 568a5c3bc..fdb9de1a2 100644 --- a/core/api/util/util.go +++ b/core/api/util/util.go @@ -71,12 +71,12 @@ func ResolveRelationKeyToRelationName(mw service.ClientCommandsServer, spaceId s Value: pbtypes.String(relationKey), }, { - RelationKey: bundle.RelationKeyLayout.String(), + RelationKey: bundle.RelationKeyResolvedLayout.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.Int64(int64(model.ObjectType_relation)), }, }, - Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String(), bundle.RelationKeyLayout.String()}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String(), bundle.RelationKeyResolvedLayout.String()}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { From bf9131a949be4ad06d0c72da098c930b2f969674 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 24 Feb 2025 20:08:15 +0100 Subject: [PATCH 035/132] GO-4459: Handle error in ListObjects when resolving unique key to type ID --- core/api/internal/object/service.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 55944b0c2..b3fd83b8b 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -65,6 +65,9 @@ func NewService(mw service.ClientCommandsServer, spaceService *space.SpaceServic // ListObjects retrieves a paginated list of objects in a specific space. func (s *ObjectService) ListObjects(ctx context.Context, spaceId string, offset int, limit int) (objects []Object, total int, hasMore bool, err error) { typeId, err := util.ResolveUniqueKeyToTypeId(s.mw, spaceId, "ot-template") + if err != nil { + return nil, 0, false, err + } resp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ SpaceId: spaceId, From 8ca15e3b686dd9fb5cd610d6989b1032ce0e98f3 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 28 Feb 2025 15:26:05 +0100 Subject: [PATCH 036/132] GO-4459: Refactor list object removal and improve sorting error handling --- core/api/internal/list/handler.go | 2 +- core/api/internal/list/service.go | 10 +++++----- core/api/internal/search/service.go | 6 ++++++ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/core/api/internal/list/handler.go b/core/api/internal/list/handler.go index 761795a11..923787df3 100644 --- a/core/api/internal/list/handler.go +++ b/core/api/internal/list/handler.go @@ -113,7 +113,7 @@ func RemoveObjectFromListHandler(s *ListService) gin.HandlerFunc { listId := c.Param("list_id") objectId := c.Param("object_id") - err := s.RemoveObjectFromList(c, spaceId, listId, objectId) + err := s.RemoveObjectsFromList(c, spaceId, listId, []string{objectId}) code := util.MapErrorCode(err, util.ErrToCode(ErrFailedRemoveObjectsFromList, http.StatusInternalServerError), ) diff --git a/core/api/internal/list/service.go b/core/api/internal/list/service.go index 75e6f8407..9a5e2c15c 100644 --- a/core/api/internal/list/service.go +++ b/core/api/internal/list/service.go @@ -20,7 +20,7 @@ var ( type Service interface { GetObjectsInList(ctx context.Context, spaceId string, listId string, offset, limit int) ([]object.Object, int, bool, error) AddObjectsToList(ctx context.Context, spaceId string, listId string, objectIds []string) error - RemoveObjectFromList(ctx context.Context, spaceId string, listId string, objectIds []string) error + RemoveObjectsFromList(ctx context.Context, spaceId string, listId string, objectIds []string) error } type ListService struct { @@ -76,11 +76,11 @@ func (s *ListService) AddObjectsToList(ctx context.Context, spaceId string, list return nil } -// RemoveObjectFromList removes objects from a list -func (s *ListService) RemoveObjectFromList(ctx context.Context, spaceId string, listId string, objectId string) error { +// RemoveObjectsFromList removes objects from a list +func (s *ListService) RemoveObjectsFromList(ctx context.Context, spaceId string, listId string, objectIds []string) error { resp := s.mw.ObjectCollectionRemove(ctx, &pb.RpcObjectCollectionRemoveRequest{ - ContextId: spaceId, - ObjectIds: []string{objectId}, + ContextId: listId, + ObjectIds: objectIds, }) if resp.Error.Code != pb.RpcObjectCollectionRemoveResponseError_NULL { diff --git a/core/api/internal/search/service.go b/core/api/internal/search/service.go index b0af8641a..dcc14c89a 100644 --- a/core/api/internal/search/service.go +++ b/core/api/internal/search/service.go @@ -48,6 +48,9 @@ func (s *SearchService) GlobalSearch(ctx context.Context, request SearchRequest, baseFilters := s.prepareBaseFilters() queryFilters := s.prepareQueryFilter(request.Query) sorts := s.prepareSorts(request.Sort) + if len(sorts) == 0 { + return nil, 0, false, errors.New("no sort criteria provided") + } dateToSortAfter := sorts[0].RelationKey allResponses := make([]*pb.RpcObjectSearchResponse, 0, len(spaces)) @@ -120,6 +123,9 @@ func (s *SearchService) Search(ctx context.Context, spaceId string, request Sear filters := s.combineFilters(model.BlockContentDataviewFilter_And, baseFilters, templateFilter, queryFilters, typeFilters) sorts := s.prepareSorts(request.Sort) + if len(sorts) == 0 { + return nil, 0, false, errors.New("no sort criteria provided") + } dateToSortAfter := sorts[0].RelationKey resp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ From ddb528d37ad64931c3a04ab9fcf1f5d292fe57e3 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 28 Feb 2025 18:44:27 +0100 Subject: [PATCH 037/132] GO-4459: Add block creation error in object service --- core/api/internal/object/service.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index b3fd83b8b..30844316b 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -28,6 +28,7 @@ var ( ErrInputMissingSource = errors.New("source is missing for bookmark") ErrFailedSetRelationFeatured = errors.New("failed to set relation featured") ErrFailedFetchBookmark = errors.New("failed to fetch bookmark") + ErrFailedCreateBlock = errors.New("failed to create block") ErrFailedPasteBody = errors.New("failed to paste body") // types @@ -262,7 +263,7 @@ func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, reques if blockCreateResp.Error.Code != pb.RpcBlockCreateResponseError_NULL { object, _ := s.GetObject(ctx, spaceId, resp.ObjectId) // nolint:errcheck - return object, ErrFailedCreateObject + return object, ErrFailedCreateBlock } blockPasteResp := s.mw.BlockPaste(ctx, &pb.RpcBlockPasteRequest{ From 45d4c1062c9bf4eba871f6c7b85092098918d60e Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 9 Mar 2025 13:52:59 +0100 Subject: [PATCH 038/132] GO-4459: Return only object id in details --- core/api/internal/object/service.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 30844316b..59507f41d 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -578,14 +578,6 @@ func (s *ObjectService) convertValue(key string, value *types.Value, format stri } return kind.NumberValue case *types.Value_StringValue: - if key == bundle.RelationKeyCreator.String() || key == bundle.RelationKeyLastModifiedBy.String() { - member, err := s.spaceService.GetMember(context.Background(), details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), kind.StringValue) - if err != nil { - return nil - } - return member - } - // TODO: investigate how this is possible? select option not list and not returned in further details if format == "select" || format == "multi_select" { return s.resolveTag(details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), kind.StringValue) From 1568ce3e41cded3327d64f809d01a8176b451bd8 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 9 Mar 2025 13:53:34 +0100 Subject: [PATCH 039/132] GO-4459: Fix error handling in system object retrieval --- core/api/internal/object/service.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 59507f41d..656697268 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -137,11 +137,11 @@ func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId ObjectId: objectId, }) - if resp.Error.Code == pb.RpcObjectShowResponseError_NOT_FOUND || resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIsArchived.String()].GetBoolValue() { + if resp.Error != nil && resp.Error.Code == pb.RpcObjectShowResponseError_NOT_FOUND || resp.ObjectView != nil && resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIsArchived.String()].GetBoolValue() { return Object{}, ErrObjectNotFound } - if resp.Error.Code != pb.RpcObjectShowResponseError_NULL { + if resp.Error != nil && resp.Error.Code != pb.RpcObjectShowResponseError_NULL { return Object{}, ErrFailedRetrieveObject } @@ -521,6 +521,8 @@ func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { bundle.RelationKeyBacklinks.String(): true, bundle.RelationKeySourceObject.String(): true, bundle.RelationKeyLayoutAlign.String(): true, + bundle.RelationKeyIsHiddenDiscovery.String(): true, + bundle.RelationKeyLayout.String(): true, } var details []Detail From 9a58c7947bbc718c36b3d5bbc4debbedec587227 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 10 Mar 2025 19:53:08 +0100 Subject: [PATCH 040/132] GO-4459: Structure icon in space, member, object, type, template --- core/api/docs/docs.go | 2 +- core/api/docs/swagger.json | 2 +- core/api/docs/swagger.yaml | 44 +++++++----- core/api/internal/object/model.go | 54 ++++++++------- core/api/internal/object/service.go | 39 ++++++----- core/api/internal/object/service_test.go | 58 ++++------------ core/api/internal/search/service_test.go | 86 ++++++------------------ core/api/internal/space/model.go | 56 ++++++++------- core/api/internal/space/service.go | 12 ++-- core/api/internal/space/service_test.go | 5 +- core/api/util/util.go | 46 ++++++++++--- 11 files changed, 191 insertions(+), 213 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 5698574b8..aeda32eb3 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -6,7 +6,7 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"additionalProperties":{},"description":"The details","type":"object"},"id":{"description":"The id of the detail","enum":["last_modified_date","last_modified_by","created_date","created_by","last_opened_date","tags"],"example":"last_modified_date","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"description":"The icon of the template","example":"📄","type":"string"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"description":"The icon of the text","example":"📄","type":"string"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"description":"The icon of the type","example":"📄","type":"string"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-note","ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"description":"The icon of the member","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100","type":"string"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"description":"The icon of the space","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"additionalProperties":{},"description":"The details","type":"object"},"id":{"description":"The id of the detail","enum":["last_modified_date","last_modified_by","created_date","created_by","last_opened_date","tags"],"example":"last_modified_date","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"description":"The icon of the text","example":"📄","type":"string"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-note","ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.FileReference":{"description":"The file of the icon","properties":{"url":{"example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"$ref":"#/components/schemas/util.FileReference"},"type":{"description":"The type of the icon","enum":["emoji","file"],"example":"emoji","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["spaces"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["spaces"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["types"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 903f69158..209a9fb85 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,5 +1,5 @@ { - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"additionalProperties":{},"description":"The details","type":"object"},"id":{"description":"The id of the detail","enum":["last_modified_date","last_modified_by","created_date","created_by","last_opened_date","tags"],"example":"last_modified_date","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"description":"The icon of the template","example":"📄","type":"string"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"description":"The icon of the text","example":"📄","type":"string"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"description":"The icon of the type","example":"📄","type":"string"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-note","ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"description":"The icon of the member","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100","type":"string"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"description":"The icon of the space","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"additionalProperties":{},"description":"The details","type":"object"},"id":{"description":"The id of the detail","enum":["last_modified_date","last_modified_by","created_date","created_by","last_opened_date","tags"],"example":"last_modified_date","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"description":"The icon of the text","example":"📄","type":"string"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-note","ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.FileReference":{"description":"The file of the icon","properties":{"url":{"example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"$ref":"#/components/schemas/util.FileReference"},"type":{"description":"The type of the icon","enum":["emoji","file"],"example":"emoji","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["spaces"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["spaces"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["types"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 13e0363eb..6f963b184 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -164,9 +164,7 @@ components: type: array uniqueItems: false icon: - description: The icon of the object - example: "\U0001F4C4" - type: string + $ref: '#/components/schemas/util.Icon' id: description: The id of the object example: bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ @@ -214,9 +212,7 @@ components: description: The template properties: icon: - description: The icon of the template - example: "\U0001F4C4" - type: string + $ref: '#/components/schemas/util.Icon' id: description: The id of the template example: bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge @@ -278,9 +274,7 @@ components: description: The type of the object properties: icon: - description: The icon of the type - example: "\U0001F4C4" - type: string + $ref: '#/components/schemas/util.Icon' id: description: The id of the type example: bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu @@ -439,9 +433,7 @@ components: example: john.any type: string icon: - description: The icon of the member - example: http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100 - type: string + $ref: '#/components/schemas/util.Icon' id: description: The profile object id of the member example: _participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ @@ -501,9 +493,7 @@ components: example: bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya type: string icon: - description: The icon of the space - example: http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay - type: string + $ref: '#/components/schemas/util.Icon' id: description: The id of the space example: bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1 @@ -559,6 +549,13 @@ components: space: $ref: '#/components/schemas/space.Space' type: object + util.FileReference: + description: The file of the icon + properties: + url: + example: http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay + type: string + type: object util.ForbiddenError: properties: error: @@ -568,6 +565,23 @@ components: type: string type: object type: object + util.Icon: + description: The icon of the object + properties: + emoji: + description: The emoji of the icon + example: "\U0001F4C4" + type: string + file: + $ref: '#/components/schemas/util.FileReference' + type: + description: The type of the icon + enum: + - emoji + - file + example: emoji + type: string + type: object util.NotFoundError: properties: error: diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index b83284b3c..39a1411ba 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -1,5 +1,7 @@ package object +import "github.com/anyproto/anytype-heart/core/api/util" + type CreateObjectRequest struct { Name string `json:"name" example:"My object"` // The name of the object Icon string `json:"icon" example:"📄"` // The icon of the object @@ -15,17 +17,17 @@ type ObjectResponse struct { } type Object struct { - Object string `json:"object" example:"object"` // The data model of the object - Id string `json:"id" example:"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ"` // The id of the object - Name string `json:"name" example:"My object"` // The name of the object - Icon string `json:"icon" example:"📄"` // The icon of the object - Type Type `json:"type"` // The type of the object - Snippet string `json:"snippet" example:"The beginning of the object body..."` // The snippet of the object, especially important for notes as they don't have a name - Layout string `json:"layout" example:"basic"` // The layout of the object - SpaceId string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` // The id of the space the object is in - RootId string `json:"root_id" example:"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u"` // The id of the object's root - Blocks []Block `json:"blocks"` // The blocks of the object - Details []Detail `json:"details"` // The details of the object + Object string `json:"object" example:"object"` // The data model of the object + Id string `json:"id" example:"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ"` // The id of the object + Name string `json:"name" example:"My object"` // The name of the object + Icon util.Icon `json:"icon"` // The icon of the object + Type Type `json:"type"` // The type of the object + Snippet string `json:"snippet" example:"The beginning of the object body..."` // The snippet of the object, especially important for notes as they don't have a name + Layout string `json:"layout" example:"basic"` // The layout of the object + SpaceId string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` // The id of the space the object is in + RootId string `json:"root_id" example:"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u"` // The id of the object's root + Blocks []Block `json:"blocks"` // The blocks of the object + Details []Detail `json:"details"` // The details of the object } type Block struct { @@ -40,11 +42,11 @@ type Block struct { } type Text struct { - Text string `json:"text" example:"Some text..."` // The text - Style string `json:"style" enums:"Paragraph,Header1,Header2,Header3,Header4,Quote,Code,Title,Checkbox,Marked,Numbered,Toggle,Description,Callout" example:"Paragraph"` // The style of the text - Checked bool `json:"checked" example:"true"` // Whether the text is checked - Color string `json:"color" example:"red"` // The color of the text - Icon string `json:"icon" example:"📄"` // The icon of the text + Text string `json:"text" example:"Some text..."` // The text + Style string `json:"style" enums:"Paragraph,Header1,Header2,Header3,Header4,Quote,Code,Title,Checkbox,Marked,Numbered,Toggle,Description,Callout" example:"Paragraph"` // The style of the text + Checked bool `json:"checked" example:"true"` // Whether the text is checked + Color string `json:"color" example:"red"` // The color of the text + Icon util.Icon `json:"icon"` // The icon of the text } type File struct { @@ -80,12 +82,12 @@ type TypeResponse struct { } type Type struct { - Object string `json:"object" example:"type"` // The data model of the object - Id string `json:"id" example:"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu"` // The id of the type - UniqueKey string `json:"unique_key" example:"ot-page"` // The unique key of the type - Name string `json:"name" example:"Page"` // The name of the type - Icon string `json:"icon" example:"📄"` // The icon of the type - RecommendedLayout string `json:"recommended_layout" example:"todo"` // The recommended layout of the type + Object string `json:"object" example:"type"` // The data model of the object + Id string `json:"id" example:"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu"` // The id of the type + UniqueKey string `json:"unique_key" example:"ot-page"` // The unique key of the type + Name string `json:"name" example:"Page"` // The name of the type + Icon util.Icon `json:"icon"` // The icon of the type + RecommendedLayout string `json:"recommended_layout" example:"todo"` // The recommended layout of the type } type TemplateResponse struct { @@ -93,8 +95,8 @@ type TemplateResponse struct { } type Template struct { - Object string `json:"object" example:"template"` // The data model of the object - Id string `json:"id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` // The id of the template - Name string `json:"name" example:"My template"` // The name of the template - Icon string `json:"icon" example:"📄"` // The icon of the template + Object string `json:"object" example:"template"` // The data model of the object + Id string `json:"id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` // The id of the template + Name string `json:"name" example:"My template"` // The name of the template + Icon util.Icon `json:"icon"` // The icon of the template } diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 656697268..cecfe461f 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -3,6 +3,7 @@ package object import ( "context" "errors" + "time" "github.com/gogo/protobuf/types" "github.com/iancoleman/strcase" @@ -145,17 +146,18 @@ func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId return Object{}, ErrFailedRetrieveObject } - icon := util.GetIconFromEmojiOrImage(s.AccountInfo, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconImage.String()].GetStringValue()) + details := resp.ObjectView.Details[0].Details.Fields + icon := util.GetIcon(s.AccountInfo, details[bundle.RelationKeyIconEmoji.String()].GetStringValue(), details[bundle.RelationKeyIconImage.String()].GetStringValue(), details[bundle.RelationKeyIconName.String()].GetStringValue(), details[bundle.RelationKeyIconOption.String()].GetNumberValue()) object := Object{ Object: "object", - Id: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyId.String()].GetStringValue(), - Name: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), + Id: details[bundle.RelationKeyId.String()].GetStringValue(), + Name: details[bundle.RelationKeyName.String()].GetStringValue(), Icon: icon, - Type: s.getTypeFromDetails(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyType.String()].GetStringValue(), resp.ObjectView.Details), - Snippet: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySnippet.String()].GetStringValue(), - Layout: model.ObjectTypeLayout_name[int32(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyResolvedLayout.String()].GetNumberValue())], - SpaceId: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), + Type: s.getTypeFromDetails(details[bundle.RelationKeyType.String()].GetStringValue(), resp.ObjectView.Details), + Snippet: details[bundle.RelationKeySnippet.String()].GetStringValue(), + Layout: model.ObjectTypeLayout_name[int32(details[bundle.RelationKeyResolvedLayout.String()].GetNumberValue())], + SpaceId: details[bundle.RelationKeySpaceId.String()].GetStringValue(), RootId: resp.ObjectView.RootId, Blocks: s.getBlocks(resp), Details: s.getDetails(resp), @@ -305,7 +307,7 @@ func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset in Type: model.BlockContentDataviewSort_Asc, }, }, - Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyUniqueKey.String(), bundle.RelationKeyName.String(), bundle.RelationKeyIconEmoji.String(), bundle.RelationKeyRecommendedLayout.String()}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyUniqueKey.String(), bundle.RelationKeyName.String(), bundle.RelationKeyIconEmoji.String(), bundle.RelationKeyIconName.String(), bundle.RelationKeyIconOption.String(), bundle.RelationKeyRecommendedLayout.String()}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -322,7 +324,7 @@ func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset in Id: record.Fields[bundle.RelationKeyId.String()].GetStringValue(), UniqueKey: record.Fields[bundle.RelationKeyUniqueKey.String()].GetStringValue(), Name: record.Fields[bundle.RelationKeyName.String()].GetStringValue(), - Icon: record.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), + Icon: util.GetIcon(s.AccountInfo, record.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), "", record.Fields[bundle.RelationKeyIconName.String()].GetStringValue(), record.Fields[bundle.RelationKeyIconOption.String()].GetNumberValue()), RecommendedLayout: model.ObjectTypeLayout_name[int32(record.Fields[bundle.RelationKeyRecommendedLayout.String()].GetNumberValue())], }) } @@ -344,13 +346,14 @@ func (s *ObjectService) GetType(ctx context.Context, spaceId string, typeId stri return Type{}, ErrFailedRetrieveType } + details := resp.ObjectView.Details[0].Details.Fields return Type{ Object: "type", Id: typeId, - UniqueKey: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyUniqueKey.String()].GetStringValue(), - Name: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), - Icon: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), - RecommendedLayout: model.ObjectTypeLayout_name[int32(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyRecommendedLayout.String()].GetNumberValue())], + UniqueKey: details[bundle.RelationKeyUniqueKey.String()].GetStringValue(), + Name: details[bundle.RelationKeyName.String()].GetStringValue(), + Icon: util.GetIcon(s.AccountInfo, details[bundle.RelationKeyIconEmoji.String()].GetStringValue(), "", details[bundle.RelationKeyIconName.String()].GetStringValue(), details[bundle.RelationKeyIconOption.String()].GetNumberValue()), + RecommendedLayout: model.ObjectTypeLayout_name[int32(details[bundle.RelationKeyRecommendedLayout.String()].GetNumberValue())], }, nil } @@ -423,7 +426,7 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI Object: "template", Id: templateId, Name: templateResp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), - Icon: templateResp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), + Icon: util.GetIcon(s.AccountInfo, templateResp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), "", "", 0), }) } @@ -449,7 +452,7 @@ func (s *ObjectService) GetTemplate(ctx context.Context, spaceId string, typeId Object: "template", Id: templateId, Name: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), - Icon: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), + Icon: util.GetIcon(s.AccountInfo, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), "", "", 0), }, nil } @@ -472,7 +475,7 @@ func (s *ObjectService) getTypeFromDetails(typeId string, details []*model.Objec Id: typeId, UniqueKey: objectTypeDetail.Fields[bundle.RelationKeyUniqueKey.String()].GetStringValue(), Name: objectTypeDetail.Fields[bundle.RelationKeyName.String()].GetStringValue(), - Icon: objectTypeDetail.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), + Icon: util.GetIcon(s.AccountInfo, objectTypeDetail.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), "", objectTypeDetail.Fields[bundle.RelationKeyIconName.String()].GetStringValue(), objectTypeDetail.Fields[bundle.RelationKeyIconOption.String()].GetNumberValue()), RecommendedLayout: model.ObjectTypeLayout_name[int32(objectTypeDetail.Fields[bundle.RelationKeyRecommendedLayout.String()].GetNumberValue())], } } @@ -576,7 +579,7 @@ func (s *ObjectService) convertValue(key string, value *types.Value, format stri return nil case *types.Value_NumberValue: if format == "date" { - return util.PosixToISO8601(kind.NumberValue) + return time.Unix(int64(kind.NumberValue), 0).UTC().Format(time.RFC3339) } return kind.NumberValue case *types.Value_StringValue: @@ -692,7 +695,7 @@ func (s *ObjectService) getBlocks(resp *pb.RpcObjectShowResponse) []Block { Style: model.BlockContentTextStyle_name[int32(content.Text.Style)], Checked: content.Text.Checked, Color: content.Text.Color, - Icon: util.GetIconFromEmojiOrImage(s.AccountInfo, content.Text.IconEmoji, content.Text.IconImage), + Icon: util.GetIcon(s.AccountInfo, content.Text.IconEmoji, content.Text.IconImage, "", 0), } case *model.BlockContentOfFile: file = &File{ diff --git a/core/api/internal/object/service_test.go b/core/api/internal/object/service_test.go index 3df35acb7..5fc706dc7 100644 --- a/core/api/internal/object/service_test.go +++ b/core/api/internal/object/service_test.go @@ -9,6 +9,7 @@ import ( "github.com/stretchr/testify/require" "github.com/anyproto/anytype-heart/core/api/internal/space" + "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service/mock_service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" @@ -218,37 +219,6 @@ func TestObjectService_ListObjects(t *testing.T) { Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, }).Once() - // Mock participant details - fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ - SpaceId: mockedSpaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyId.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(mockedParticipantId), - }, - }, - Keys: []string{ - bundle.RelationKeyId.String(), - bundle.RelationKeyName.String(), - bundle.RelationKeyIconEmoji.String(), - bundle.RelationKeyIconImage.String(), - bundle.RelationKeyIdentity.String(), - bundle.RelationKeyGlobalName.String(), - bundle.RelationKeyParticipantPermissions.String(), - }, - }).Return(&pb.RpcObjectSearchResponse{ - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - bundle.RelationKeyId.String(): pbtypes.String(mockedParticipantId), - }, - }, - }, - }).Twice() - // when objects, total, hasMore, err := fx.ListObjects(ctx, mockedSpaceId, offset, limit) @@ -258,22 +228,22 @@ func TestObjectService_ListObjects(t *testing.T) { require.Equal(t, mockedTypeId, objects[0].Type.Id) require.Equal(t, mockedTypeName, objects[0].Type.Name) require.Equal(t, mockedTypeUniqueKey, objects[0].Type.UniqueKey) - require.Equal(t, mockedTypeIcon, objects[0].Type.Icon) + require.Equal(t, util.Icon{Type: "emoji", Emoji: mockedTypeIcon}, objects[0].Type.Icon) require.Equal(t, mockedObjectId, objects[0].Id) require.Equal(t, mockedObjectName, objects[0].Name) require.Equal(t, mockedObjectSnippet, objects[0].Snippet) - require.Equal(t, mockedObjectIcon, objects[0].Icon) + require.Equal(t, util.Icon{Type: "emoji", Emoji: mockedObjectIcon}, objects[0].Icon) require.Equal(t, 5, len(objects[0].Details)) for _, detail := range objects[0].Details { if detail.Id == "created_date" { require.Equal(t, "1970-01-11T06:54:48Z", detail.Details["date"]) } else if detail.Id == "created_by" { - require.Equal(t, mockedParticipantId, detail.Details["object"].(space.Member).Id) + require.Equal(t, mockedParticipantId, detail.Details["object"]) } else if detail.Id == "last_modified_date" { require.Equal(t, "1970-01-12T13:46:39Z", detail.Details["date"]) } else if detail.Id == "last_modified_by" { - require.Equal(t, mockedParticipantId, detail.Details["object"].(space.Member).Id) + require.Equal(t, mockedParticipantId, detail.Details["object"]) } else if detail.Id == "last_opened_date" { require.Equal(t, "1970-01-01T00:00:00Z", detail.Details["date"]) } else if detail.Id == "tags" { @@ -391,7 +361,7 @@ func TestObjectService_GetObject(t *testing.T) { bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), bundle.RelationKeySnippet.String(): pbtypes.String(mockedObjectSnippet), - bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedObjectName), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedObjectIcon), bundle.RelationKeyType.String(): pbtypes.String(mockedTypeId), bundle.RelationKeyLastModifiedDate.String(): pbtypes.Float64(999999), bundle.RelationKeyCreatedDate.String(): pbtypes.Float64(888888), @@ -450,11 +420,11 @@ func TestObjectService_GetObject(t *testing.T) { require.Equal(t, mockedTypeId, object.Type.Id) require.Equal(t, mockedTypeName, object.Type.Name) require.Equal(t, mockedTypeUniqueKey, object.Type.UniqueKey) - require.Equal(t, mockedTypeIcon, object.Type.Icon) + require.Equal(t, util.Icon{Type: "emoji", Emoji: mockedTypeIcon}, object.Type.Icon) require.Equal(t, mockedObjectId, object.Id) require.Equal(t, mockedObjectName, object.Name) require.Equal(t, mockedObjectSnippet, object.Snippet) - require.Equal(t, mockedObjectName, object.Icon) + require.Equal(t, util.Icon{Type: "emoji", Emoji: mockedObjectIcon}, object.Icon) require.Equal(t, 3, len(object.Details)) for _, detail := range object.Details { @@ -579,10 +549,10 @@ func TestObjectService_CreateObject(t *testing.T) { require.Equal(t, mockedTypeId, object.Type.Id) require.Equal(t, mockedTypeName, object.Type.Name) require.Equal(t, mockedTypeUniqueKey, object.Type.UniqueKey) - require.Equal(t, mockedTypeIcon, object.Type.Icon) + require.Equal(t, util.Icon{Type: "emoji", Emoji: mockedTypeIcon}, object.Type.Icon) require.Equal(t, mockedNewObjectId, object.Id) require.Equal(t, mockedObjectName, object.Name) - require.Equal(t, mockedObjectIcon, object.Icon) + require.Equal(t, util.Icon{Type: "emoji", Emoji: mockedObjectIcon}, object.Icon) require.Equal(t, mockedSpaceId, object.SpaceId) }) @@ -638,7 +608,7 @@ func TestObjectService_ListTypes(t *testing.T) { require.Equal(t, "type-1", types[0].Id) require.Equal(t, "Type One", types[0].Name) require.Equal(t, "type-one-key", types[0].UniqueKey) - require.Equal(t, "🗂️", types[0].Icon) + require.Equal(t, util.Icon{Type: "emoji", Emoji: "🗂️"}, types[0].Icon) require.Equal(t, 1, total) require.False(t, hasMore) }) @@ -701,7 +671,7 @@ func TestObjectService_GetType(t *testing.T) { require.Equal(t, mockedTypeId, objType.Id) require.Equal(t, mockedTypeName, objType.Name) require.Equal(t, mockedTypeUniqueKey, objType.UniqueKey) - require.Equal(t, mockedTypeIcon, objType.Icon) + require.Equal(t, util.Icon{Type: "emoji", Emoji: mockedTypeIcon}, objType.Icon) require.Equal(t, model.ObjectTypeLayout_name[int32(model.ObjectType_basic)], objType.RecommendedLayout) }) @@ -783,7 +753,7 @@ func TestObjectService_ListTemplates(t *testing.T) { require.Len(t, templates, 1) require.Equal(t, "template-1", templates[0].Id) require.Equal(t, "Template Name", templates[0].Name) - require.Equal(t, "📝", templates[0].Icon) + require.Equal(t, util.Icon{Type: "emoji", Emoji: "📝"}, templates[0].Icon) require.Equal(t, 1, total) require.False(t, hasMore) }) @@ -843,7 +813,7 @@ func TestObjectService_GetTemplate(t *testing.T) { require.NoError(t, err) require.Equal(t, mockedTemplateId, template.Id) require.Equal(t, mockedTemplateName, template.Name) - require.Equal(t, mockedTemplateIcon, template.Icon) + require.Equal(t, util.Icon{Type: "emoji", Emoji: mockedTemplateIcon}, template.Icon) }) t.Run("template not found", func(t *testing.T) { diff --git a/core/api/internal/search/service_test.go b/core/api/internal/search/service_test.go index 3b9d62aef..c5bcbe10f 100644 --- a/core/api/internal/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -10,6 +10,7 @@ import ( "github.com/anyproto/anytype-heart/core/api/internal/object" "github.com/anyproto/anytype-heart/core/api/internal/space" + "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service/mock_service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" @@ -18,28 +19,23 @@ import ( ) const ( - offset = 0 - limit = 100 - techSpaceId = "tech-space-id" - gatewayUrl = "http://localhost:31006" - mockedSpaceId = "mocked-space-id" - mockedSearchTerm = "mocked-search-term" - mockedObjectId = "mocked-object-id" - mockedObjectName = "mocked-object-name" - mockedRootId = "mocked-root-id" - mockedParticipantId = "mocked-participant-id" - mockedType = "mocked-type" - mockedTagId1 = "mocked-tag-id-1" - mockedTagValue1 = "mocked-tag-value-1" - mockedTagColor1 = "mocked-tag-color-1" - mockedTagId2 = "mocked-tag-id-2" - mockedTagValue2 = "mocked-tag-value-2" - mockedTagColor2 = "mocked-tag-color-2" - mockedParticipantName = "mocked-participant-name" - mockedParticipantIcon = "mocked-participant-icon" - mockedParticipantImage = "mocked-participant-image" - mockedParticipantIdentity = "mocked-participant-identity" - mockedParticipantGlobalName = "mocked-participant-global-name" + offset = 0 + limit = 100 + techSpaceId = "tech-space-id" + gatewayUrl = "http://localhost:31006" + mockedSpaceId = "mocked-space-id" + mockedSearchTerm = "mocked-search-term" + mockedObjectId = "mocked-object-id" + mockedObjectName = "mocked-object-name" + mockedRootId = "mocked-root-id" + mockedParticipantId = "mocked-participant-id" + mockedType = "mocked-type" + mockedTagId1 = "mocked-tag-id-1" + mockedTagValue1 = "mocked-tag-value-1" + mockedTagColor1 = "mocked-tag-color-1" + mockedTagId2 = "mocked-tag-id-2" + mockedTagValue2 = "mocked-tag-value-2" + mockedTagColor2 = "mocked-tag-color-2" ) type fixture struct { @@ -339,42 +335,6 @@ func TestSearchService_GlobalSearch(t *testing.T) { Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, }, nil).Once() - // Mock participant details - fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ - SpaceId: mockedSpaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyId.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(mockedParticipantId), - }, - }, - Keys: []string{bundle.RelationKeyId.String(), - bundle.RelationKeyName.String(), - bundle.RelationKeyIconEmoji.String(), - bundle.RelationKeyIconImage.String(), - bundle.RelationKeyIdentity.String(), - bundle.RelationKeyGlobalName.String(), - bundle.RelationKeyParticipantPermissions.String(), - }, - }).Return(&pb.RpcObjectSearchResponse{ - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - bundle.RelationKeyId.String(): pbtypes.String(mockedParticipantId), - bundle.RelationKeyName.String(): pbtypes.String(mockedParticipantName), - bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedParticipantIcon), - bundle.RelationKeyIconImage.String(): pbtypes.String(mockedParticipantImage), - bundle.RelationKeyIdentity.String(): pbtypes.String(mockedParticipantIdentity), - bundle.RelationKeyGlobalName.String(): pbtypes.String(mockedParticipantGlobalName), - bundle.RelationKeyParticipantPermissions.String(): pbtypes.Int64(int64(model.ParticipantPermissions_Reader)), - }, - }, - }, - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - }).Twice() - // Mock tag-1 open fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ SpaceId: mockedSpaceId, @@ -426,7 +386,7 @@ func TestSearchService_GlobalSearch(t *testing.T) { require.Equal(t, mockedType, objects[0].Type.Id) require.Equal(t, mockedSpaceId, objects[0].SpaceId) require.Equal(t, model.ObjectTypeLayout_name[int32(model.ObjectType_basic)], objects[0].Layout) - require.Equal(t, "🌐", objects[0].Icon) + require.Equal(t, util.Icon{Type: "emoji", Emoji: "🌐"}, objects[0].Icon) require.Equal(t, "This is a sample text block", objects[0].Blocks[2].Text.Text) // check details @@ -436,13 +396,9 @@ func TestSearchService_GlobalSearch(t *testing.T) { } else if detail.Id == "last_modified_date" { require.Equal(t, "1970-01-12T13:46:39Z", detail.Details["date"]) } else if detail.Id == "created_by" { - require.Equal(t, mockedParticipantId, detail.Details["object"].(space.Member).Id) - require.Equal(t, mockedParticipantName, detail.Details["object"].(space.Member).Name) - require.Equal(t, gatewayUrl+"/image/"+mockedParticipantImage, detail.Details["object"].(space.Member).Icon) - require.Equal(t, mockedParticipantIdentity, detail.Details["object"].(space.Member).Identity) - require.Equal(t, mockedParticipantGlobalName, detail.Details["object"].(space.Member).GlobalName) + require.Equal(t, mockedParticipantId, detail.Details["object"]) } else if detail.Id == "last_modified_by" { - require.Equal(t, mockedParticipantId, detail.Details["object"].(space.Member).Id) + require.Equal(t, mockedParticipantId, detail.Details["object"]) } } diff --git a/core/api/internal/space/model.go b/core/api/internal/space/model.go index 16ebe1fb5..2edf130db 100644 --- a/core/api/internal/space/model.go +++ b/core/api/internal/space/model.go @@ -1,5 +1,9 @@ package space +import ( + "github.com/anyproto/anytype-heart/core/api/util" +) + type SpaceResponse struct { Space Space `json:"space"` // The space } @@ -9,25 +13,25 @@ type CreateSpaceRequest struct { } type Space struct { - Object string `json:"object" example:"space"` // The data model of the object - Id string `json:"id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` // The id of the space - Name string `json:"name" example:"My Space"` // The name of the space - Icon string `json:"icon" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay"` // The icon of the space - HomeObjectId string `json:"home_object_id" example:"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya"` // The id of the home object - ArchiveObjectId string `json:"archive_object_id" example:"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri"` // The id of the archive object - ProfileObjectId string `json:"profile_object_id" example:"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4"` // The id of the profile object - MarketplaceWorkspaceId string `json:"marketplace_workspace_id" example:"_anytype_marketplace"` // The id of the marketplace workspace - WorkspaceObjectId string `json:"workspace_object_id" example:"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y"` // The id of the workspace object - DeviceId string `json:"device_id" example:"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF"` // The id of the device - AccountSpaceId string `json:"account_space_id" example:"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1"` // The id of the account space - WidgetsId string `json:"widgets_id" example:"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva"` // The id of the widgets - SpaceViewId string `json:"space_view_id" example:"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy"` // The id of the space view - TechSpaceId string `json:"tech_space_id" example:"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1"` // The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself - GatewayUrl string `json:"gateway_url" example:"http://127.0.0.1:31006"` // The gateway url to serve files and media - LocalStoragePath string `json:"local_storage_path" example:"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha"` // The local storage path of the account - Timezone string `json:"timezone" example:""` // The timezone of the account - AnalyticsId string `json:"analytics_id" example:"624aecdd-4797-4611-9d61-a2ae5f53cf1c"` // The analytics id of the account - NetworkId string `json:"network_id" example:"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU"` // The network id of the space + Object string `json:"object" example:"space"` // The data model of the object + Id string `json:"id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` // The id of the space + Name string `json:"name" example:"My Space"` // The name of the space + Icon util.Icon `json:"icon"` // The icon of the space + HomeObjectId string `json:"home_object_id" example:"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya"` // The id of the home object + ArchiveObjectId string `json:"archive_object_id" example:"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri"` // The id of the archive object + ProfileObjectId string `json:"profile_object_id" example:"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4"` // The id of the profile object + MarketplaceWorkspaceId string `json:"marketplace_workspace_id" example:"_anytype_marketplace"` // The id of the marketplace workspace + WorkspaceObjectId string `json:"workspace_object_id" example:"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y"` // The id of the workspace object + DeviceId string `json:"device_id" example:"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF"` // The id of the device + AccountSpaceId string `json:"account_space_id" example:"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1"` // The id of the account space + WidgetsId string `json:"widgets_id" example:"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva"` // The id of the widgets + SpaceViewId string `json:"space_view_id" example:"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy"` // The id of the space view + TechSpaceId string `json:"tech_space_id" example:"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1"` // The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself + GatewayUrl string `json:"gateway_url" example:"http://127.0.0.1:31006"` // The gateway url to serve files and media + LocalStoragePath string `json:"local_storage_path" example:"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha"` // The local storage path of the account + Timezone string `json:"timezone" example:""` // The timezone of the account + AnalyticsId string `json:"analytics_id" example:"624aecdd-4797-4611-9d61-a2ae5f53cf1c"` // The analytics id of the account + NetworkId string `json:"network_id" example:"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU"` // The network id of the space } type MemberResponse struct { @@ -35,11 +39,11 @@ type MemberResponse struct { } type Member struct { - Object string `json:"object" example:"member"` // The data model of the object - Id string `json:"id" example:"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ"` // The profile object id of the member - Name string `json:"name" example:"John Doe"` // The name of the member - Icon string `json:"icon" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100"` // The icon of the member - Identity string `json:"identity" example:"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"` // The identity of the member in the network - GlobalName string `json:"global_name" example:"john.any"` // The global name of the member in the network - Role string `json:"role" enums:"Reader,Writer,Owner,NoPermission" example:"Owner"` // The role of the member + Object string `json:"object" example:"member"` // The data model of the object + Id string `json:"id" example:"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ"` // The profile object id of the member + Name string `json:"name" example:"John Doe"` // The name of the member + Icon util.Icon `json:"icon"` // The icon of the member + Identity string `json:"identity" example:"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"` // The identity of the member in the network + GlobalName string `json:"global_name" example:"john.any"` // The global name of the member in the network + Role string `json:"role" enums:"Reader,Writer,Owner,NoPermission" example:"Owner"` // The role of the member } diff --git a/core/api/internal/space/service.go b/core/api/internal/space/service.go index c604c863a..dfd9f4457 100644 --- a/core/api/internal/space/service.go +++ b/core/api/internal/space/service.go @@ -84,7 +84,7 @@ func (s *SpaceService) ListSpaces(ctx context.Context, offset int, limit int) (s for _, record := range paginatedRecords { name := record.Fields[bundle.RelationKeyName.String()].GetStringValue() - icon := util.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), record.Fields[bundle.RelationKeyIconImage.String()].GetStringValue()) + icon := util.GetIcon(s.AccountInfo, record.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), record.Fields[bundle.RelationKeyIconImage.String()].GetStringValue(), "", 0) workspace, err := s.getWorkspaceInfo(record.Fields[bundle.RelationKeyTargetSpaceId.String()].GetStringValue(), name, icon) if err != nil { @@ -128,7 +128,7 @@ func (s *SpaceService) GetSpace(ctx context.Context, spaceId string) (Space, err } name := resp.Records[0].Fields[bundle.RelationKeyName.String()].GetStringValue() - icon := util.GetIconFromEmojiOrImage(s.AccountInfo, resp.Records[0].Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), resp.Records[0].Fields[bundle.RelationKeyIconImage.String()].GetStringValue()) + icon := util.GetIcon(s.AccountInfo, resp.Records[0].Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), resp.Records[0].Fields[bundle.RelationKeyIconImage.String()].GetStringValue(), "", 0) return s.getWorkspaceInfo(spaceId, name, icon) } @@ -156,7 +156,7 @@ func (s *SpaceService) CreateSpace(ctx context.Context, name string) (Space, err return Space{}, ErrFailedCreateSpace } - return s.getWorkspaceInfo(resp.SpaceId, name, "") + return s.getWorkspaceInfo(resp.SpaceId, name, util.Icon{}) } // ListMembers returns a paginated list of members in the space with the given ID. @@ -195,7 +195,7 @@ func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset i members = make([]Member, 0, len(paginatedMembers)) for _, record := range paginatedMembers { - icon := util.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), record.Fields[bundle.RelationKeyIconImage.String()].GetStringValue()) + icon := util.GetIcon(s.AccountInfo, record.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), record.Fields[bundle.RelationKeyIconImage.String()].GetStringValue(), "", 0) member := Member{ Object: "member", @@ -236,7 +236,7 @@ func (s *SpaceService) GetMember(ctx context.Context, spaceId string, memberId s return Member{}, ErrMemberNotFound } - icon := util.GetIconFromEmojiOrImage(s.AccountInfo, "", resp.Records[0].Fields[bundle.RelationKeyIconImage.String()].GetStringValue()) + icon := util.GetIcon(s.AccountInfo, "", resp.Records[0].Fields[bundle.RelationKeyIconImage.String()].GetStringValue(), "", 0) return Member{ Object: "member", @@ -250,7 +250,7 @@ func (s *SpaceService) GetMember(ctx context.Context, spaceId string, memberId s } // getWorkspaceInfo returns the workspace info for the space with the given ID. -func (s *SpaceService) getWorkspaceInfo(spaceId string, name string, icon string) (space Space, err error) { +func (s *SpaceService) getWorkspaceInfo(spaceId string, name string, icon util.Icon) (space Space, err error) { workspaceResponse := s.mw.WorkspaceOpen(context.Background(), &pb.RpcWorkspaceOpenRequest{ SpaceId: spaceId, WithChat: true, diff --git a/core/api/internal/space/service_test.go b/core/api/internal/space/service_test.go index 6fc47af5c..267c3a3b2 100644 --- a/core/api/internal/space/service_test.go +++ b/core/api/internal/space/service_test.go @@ -9,6 +9,7 @@ import ( "github.com/gogo/protobuf/types" + "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service/mock_service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" @@ -127,7 +128,7 @@ func TestSpaceService_ListSpaces(t *testing.T) { require.Regexpf(t, regexp.MustCompile(gatewayUrl+`/image/`+iconImage), spaces[0].Icon, "Icon URL does not match") require.Equal(t, "My Workspace", spaces[1].Name) require.Equal(t, "my-space-id", spaces[1].Id) - require.Equal(t, "🚀", spaces[1].Icon) + require.Equal(t, util.Icon{Type: "emoji", Emoji: "🚀"}, spaces[1].Icon) require.Equal(t, 2, total) require.False(t, hasMore) }) @@ -281,7 +282,7 @@ func TestSpaceService_ListMembers(t *testing.T) { require.Len(t, members, 2) require.Equal(t, "member-1", members[0].Id) require.Equal(t, "John Doe", members[0].Name) - require.Equal(t, "👤", members[0].Icon) + require.Equal(t, util.Icon{Type: "emoji", Emoji: "👤"}, members[0].Icon) require.Equal(t, "john.any", members[0].GlobalName) require.Equal(t, "member-2", members[1].Id) require.Equal(t, "Jane Doe", members[1].Name) diff --git a/core/api/util/util.go b/core/api/util/util.go index fdb9de1a2..cf2f8181c 100644 --- a/core/api/util/util.go +++ b/core/api/util/util.go @@ -4,7 +4,6 @@ import ( "context" "errors" "fmt" - "time" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service" @@ -16,24 +15,53 @@ import ( var ( ErrFailedSearchType = errors.New("failed to search for type") ErrorTypeNotFound = errors.New("type not found") + iconOptionToColor = map[float64]string{ + 1: "grey", + 2: "yellow", + 3: "orange", + 4: "red", + 5: "pink", + 6: "purple", + 7: "blue", + 8: "ice", + 9: "teal", + 10: "lime", + } ) -func PosixToISO8601(posix float64) string { - t := time.Unix(int64(posix), 0).UTC() - return t.Format(time.RFC3339) +type Icon struct { + Type string `json:"type" enums:"emoji,file,icon" example:"emoji"` // The type of the icon + Emoji string `json:"emoji,omitempty" example:"📄"` // The emoji of the icon + File string `json:"file,omitempty" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay"` // The file of the icon + Name string `json:"name,omitempty" example:"document"` // The name of the icon + Color string `json:"color,omitempty" example:"red"` // The color of the icon } -// GetIconFromEmojiOrImage returns the icon to use for the object, which can be either an emoji or an image url -func GetIconFromEmojiOrImage(accountInfo *model.AccountInfo, iconEmoji string, iconImage string) string { +// GetIcon returns the icon to use for the object, which can be builtin icon, emoji or file +func GetIcon(accountInfo *model.AccountInfo, iconEmoji string, iconImage string, iconName string, iconOption float64) Icon { + if iconName != "" { + return Icon{ + Type: "icon", + Name: iconName, + Color: iconOptionToColor[iconOption], + } + } + if iconEmoji != "" { - return iconEmoji + return Icon{ + Type: "emoji", + Emoji: iconEmoji, + } } if iconImage != "" { - return fmt.Sprintf("%s/image/%s", accountInfo.GatewayUrl, iconImage) + return Icon{ + Type: "file", + File: fmt.Sprintf("%s/image/%s", accountInfo.GatewayUrl, iconImage), + } } - return "" + return Icon{} } func ResolveUniqueKeyToTypeId(mw service.ClientCommandsServer, spaceId string, uniqueKey string) (typeId string, err error) { From 440b35e846fdc5e65d7ac45d51445bb72ce36f7e Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 11 Mar 2025 13:57:35 +0100 Subject: [PATCH 041/132] GO-4459: Refactor details structure to use DetailEntry for typed representation --- core/api/docs/docs.go | 2 +- core/api/docs/swagger.json | 2 +- core/api/docs/swagger.yaml | 117 +++++++++++++++++++++----- core/api/internal/object/model.go | 20 ++++- core/api/internal/object/service.go | 123 ++++++++++++++++++++++------ core/api/internal/search/model.go | 6 +- 6 files changed, 217 insertions(+), 53 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index aeda32eb3..2b8f6250e 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -6,7 +6,7 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"additionalProperties":{},"description":"The details","type":"object"},"id":{"description":"The id of the detail","enum":["last_modified_date","last_modified_by","created_date","created_by","last_opened_date","tags"],"example":"last_modified_date","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"description":"The icon of the text","example":"📄","type":"string"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-note","ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.FileReference":{"description":"The file of the icon","properties":{"url":{"example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"$ref":"#/components/schemas/util.FileReference"},"type":{"description":"The type of the icon","enum":["emoji","file"],"example":"emoji","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"$ref":"#/components/schemas/object.DetailEntry"},"id":{"description":"The id of the detail","example":"last_modified_date","type":"string"}},"type":"object"},"object.DetailEntry":{"description":"The details","properties":{"checkbox":{"description":"For checkbox details","example":true,"type":"boolean"},"date":{"description":"For date details","example":"2024-02-14T12:34:56Z","type":"string"},"email":{"description":"For email details","example":"example@example.com","type":"string"},"file":{"description":"For file details","example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"multi_select":{"description":"For multi-select details","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the detail","example":"Last modified date","type":"string"},"number":{"description":"For number details","example":42,"type":"number"},"object":{"description":"For object details","example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"For phone details","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"For text details","example":"Some text","type":"string"},"type":{"description":"The type of the detail, which should correspond to the field that is set","example":"date","type":"string"},"url":{"description":"For URL details","example":"https://example.com","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Tag":{"description":"For select details","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"},"type":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["spaces"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["spaces"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["types"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 209a9fb85..bdb6f7a01 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,5 +1,5 @@ { - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"additionalProperties":{},"description":"The details","type":"object"},"id":{"description":"The id of the detail","enum":["last_modified_date","last_modified_by","created_date","created_by","last_opened_date","tags"],"example":"last_modified_date","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"description":"The icon of the text","example":"📄","type":"string"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-note","ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.FileReference":{"description":"The file of the icon","properties":{"url":{"example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"$ref":"#/components/schemas/util.FileReference"},"type":{"description":"The type of the icon","enum":["emoji","file"],"example":"emoji","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"$ref":"#/components/schemas/object.DetailEntry"},"id":{"description":"The id of the detail","example":"last_modified_date","type":"string"}},"type":"object"},"object.DetailEntry":{"description":"The details","properties":{"checkbox":{"description":"For checkbox details","example":true,"type":"boolean"},"date":{"description":"For date details","example":"2024-02-14T12:34:56Z","type":"string"},"email":{"description":"For email details","example":"example@example.com","type":"string"},"file":{"description":"For file details","example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"multi_select":{"description":"For multi-select details","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the detail","example":"Last modified date","type":"string"},"number":{"description":"For number details","example":42,"type":"number"},"object":{"description":"For object details","example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"For phone details","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"For text details","example":"Some text","type":"string"},"type":{"description":"The type of the detail, which should correspond to the field that is set","example":"date","type":"string"},"url":{"description":"For URL details","example":"https://example.com","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Tag":{"description":"For select details","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"},"type":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["spaces"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["spaces"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["types"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 6f963b184..b3a7b9b8d 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -102,21 +102,77 @@ components: object.Detail: properties: details: - additionalProperties: {} - description: The details - type: object + $ref: '#/components/schemas/object.DetailEntry' id: description: The id of the detail - enum: - - last_modified_date - - last_modified_by - - created_date - - created_by - - last_opened_date - - tags example: last_modified_date type: string type: object + object.DetailEntry: + description: The details + properties: + checkbox: + description: For checkbox details + example: true + type: boolean + date: + description: For date details + example: "2024-02-14T12:34:56Z" + type: string + email: + description: For email details + example: example@example.com + type: string + file: + description: For file details + example: + - '[''bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge'']' + items: + type: string + type: array + uniqueItems: false + multi_select: + description: For multi-select details + items: + $ref: '#/components/schemas/object.Tag' + type: array + uniqueItems: false + name: + description: The name of the detail + example: Last modified date + type: string + number: + description: For number details + example: 42 + type: number + object: + description: For object details + example: + - '[''bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge'']' + items: + type: string + type: array + uniqueItems: false + phone: + description: For phone details + example: "+1234567890" + type: string + select: + $ref: '#/components/schemas/object.Tag' + text: + description: For text details + example: Some text + type: string + type: + description: The type of the detail, which should correspond to the field + that is set + example: date + type: string + url: + description: For URL details + example: https://example.com + type: string + type: object object.File: description: The file of the block, if applicable properties: @@ -208,6 +264,22 @@ components: id: type: string type: object + object.Tag: + description: For select details + properties: + color: + description: The color of the tag + example: yellow + type: string + id: + description: The id of the tag + example: bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq + type: string + name: + description: The name of the tag + example: in-progress + type: string + type: object object.Template: description: The template properties: @@ -243,9 +315,7 @@ components: example: red type: string icon: - description: The icon of the text - example: "\U0001F4C4" - type: string + $ref: '#/components/schemas/util.Icon' style: description: The style of the text enum: @@ -390,7 +460,6 @@ components: description: The types of objects to search for, specified by unique key or ID example: - - ot-note - ot-page - ot-678043f0cda9133be777049f - bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q @@ -549,13 +618,6 @@ components: space: $ref: '#/components/schemas/space.Space' type: object - util.FileReference: - description: The file of the icon - properties: - url: - example: http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay - type: string - type: object util.ForbiddenError: properties: error: @@ -568,17 +630,28 @@ components: util.Icon: description: The icon of the object properties: + color: + description: The color of the icon + example: red + type: string emoji: description: The emoji of the icon example: "\U0001F4C4" type: string file: - $ref: '#/components/schemas/util.FileReference' + description: The file of the icon + example: http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay + type: string + name: + description: The name of the icon + example: document + type: string type: description: The type of the icon enum: - emoji - file + - icon example: emoji type: string type: object diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index 39a1411ba..396803532 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -67,8 +67,24 @@ type Relation struct { } type Detail struct { - Id string `json:"id" enums:"last_modified_date,last_modified_by,created_date,created_by,last_opened_date,tags" example:"last_modified_date"` // The id of the detail - Details map[string]interface{} `json:"details"` // The details + Id string `json:"id" example:"last_modified_date"` // The id of the detail + Details DetailEntry `json:"details"` // The details +} + +type DetailEntry struct { + Name string `json:"name" example:"Last modified date"` // The name of the detail + Type string `json:"type" example:"date"` // The type of the detail, which should correspond to the field that is set + Text string `json:"text,omitempty" example:"Some text"` // For text details + Number float64 `json:"number,omitempty" example:"42"` // For number details + Select *Tag `json:"select,omitempty"` // For select details + MultiSelect []Tag `json:"multi_select,omitempty"` // For multi-select details + Date string `json:"date,omitempty" example:"2024-02-14T12:34:56Z"` // For date details + File []string `json:"file,omitempty" example:"['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"` // For file details + Checkbox bool `json:"checkbox,omitempty" example:"true"` // For checkbox details + Url string `json:"url,omitempty" example:"https://example.com"` // For URL details + Email string `json:"email,omitempty" example:"example@example.com"` // For email details + Phone string `json:"phone,omitempty" example:"+1234567890"` // For phone details + Object []string `json:"object,omitempty" example:"['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"` // For object details } type Tag struct { diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index cecfe461f..6cbed6f16 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -538,13 +538,80 @@ func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { if val, ok := primaryDetailFields[key]; ok { id, name := s.getRelation(key, resp) format := relationFormatMap[key] + convertedVal := s.convertValue(key, val, format, resp.ObjectView.Details) + + var entry DetailEntry + entry.Name = name + entry.Type = format + + switch format { + case "text": + if str, ok := convertedVal.(string); ok { + entry.Text = str + } + case "number": + if num, ok := convertedVal.(float64); ok { + entry.Number = num + } + case "select": + if sel, ok := convertedVal.(Tag); ok { + entry.Select = &sel + } + case "multi_select": + if ms, ok := convertedVal.([]Tag); ok { + entry.MultiSelect = ms + } + case "date": + if dateStr, ok := convertedVal.(string); ok { + entry.Date = dateStr + } + case "file": + if file, ok := convertedVal.([]interface{}); ok { + var files []string + for _, v := range file { + if str, ok := v.(string); ok { + files = append(files, str) + } + } + entry.File = files + } + case "checkbox": + if cb, ok := convertedVal.(bool); ok { + entry.Checkbox = cb + } + case "url": + if url, ok := convertedVal.(string); ok { + entry.Url = url + } + case "email": + if email, ok := convertedVal.(string); ok { + entry.Email = email + } + case "phone": + if phone, ok := convertedVal.(string); ok { + entry.Phone = phone + } + case "object": + if obj, ok := convertedVal.(string); ok { + entry.Object = []string{obj} + } else if objSlice, ok := convertedVal.([]interface{}); ok { + var objects []string + for _, v := range objSlice { + if str, ok := v.(string); ok { + objects = append(objects, str) + } + } + entry.Object = objects + } + default: + if str, ok := convertedVal.(string); ok { + entry.Text = str + } + } + details = append(details, Detail{ - Id: id, - Details: map[string]interface{}{ - "name": name, - "type": format, - format: s.convertValue(key, val, format, resp.ObjectView.Details), - }, + Id: id, + Details: entry, }) } } @@ -553,23 +620,24 @@ func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { // getRelationName returns the relation id and relation name from the ObjectShowResponse. func (s *ObjectService) getRelation(key string, resp *pb.RpcObjectShowResponse) (id string, name string) { - relation, err := bundle.GetRelation(domain.RelationKey(key)) - if err != nil { - name, err = util.ResolveRelationKeyToRelationName(s.mw, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), key) - if err != nil { - return key, key - } - return key, name - } - - // special cases of relation keys and names - if key == bundle.RelationKeyCreator.String() { + // Handle special cases first + switch key { + case bundle.RelationKeyCreator.String(): return "created_by", "Created By" - } else if key == bundle.RelationKeyCreatedDate.String() { + case bundle.RelationKeyCreatedDate.String(): return "created_date", "Created Date" } - return strcase.ToSnake(key), relation.Name + if relation, err := bundle.GetRelation(domain.RelationKey(key)); err == nil { + return strcase.ToSnake(key), relation.Name + } + + // Fallback to resolving the relation name + spaceId := resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue() + if name, err := util.ResolveRelationKeyToRelationName(s.mw, spaceId, key); err == nil { + return key, name + } + return key, key } // convertValue converts a protobuf types.Value into a native Go value. @@ -584,10 +652,12 @@ func (s *ObjectService) convertValue(key string, value *types.Value, format stri return kind.NumberValue case *types.Value_StringValue: // TODO: investigate how this is possible? select option not list and not returned in further details - if format == "select" || format == "multi_select" { + if format == "select" { return s.resolveTag(details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), kind.StringValue) } - + if format == "multi_select" { + return []Tag{s.resolveTag(details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), kind.StringValue)} + } return kind.StringValue case *types.Value_BoolValue: return kind.BoolValue @@ -602,11 +672,16 @@ func (s *ObjectService) convertValue(key string, value *types.Value, format stri for _, v := range kind.ListValue.Values { list = append(list, s.convertValue(key, v, format, details)) } - - if format == "select" || format == "multi_select" { + if format == "select" { + tags := s.getTags(key, details) + if len(tags) > 0 { + return tags[0] + } + return nil + } + if format == "multi_select" { return s.getTags(key, details) } - return list default: return nil diff --git a/core/api/internal/search/model.go b/core/api/internal/search/model.go index 170933841..5cf874790 100644 --- a/core/api/internal/search/model.go +++ b/core/api/internal/search/model.go @@ -1,9 +1,9 @@ package search type SearchRequest struct { - Query string `json:"query" example:"test"` // The search term to look for in object names and snippets - Types []string `json:"types" example:"ot-note,ot-page,ot-678043f0cda9133be777049f,bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"` // The types of objects to search for, specified by unique key or ID - Sort SortOptions `json:"sort"` // The sorting criteria and direction for the search results + Query string `json:"query" example:"test"` // The search term to look for in object names and snippets + Types []string `json:"types" example:"ot-page,ot-678043f0cda9133be777049f,bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"` // The types of objects to search for, specified by unique key or ID + Sort SortOptions `json:"sort"` // The sorting criteria and direction for the search results } type SortOptions struct { From 1a46c5b213c6bada9a424ee95b7f12fdf6ae5698 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 11 Mar 2025 14:13:38 +0100 Subject: [PATCH 042/132] GO-4459: Refactor DetailEntry struct to use a oneOf Value field for detail types --- core/api/docs/docs.go | 2 +- core/api/docs/swagger.json | 2 +- core/api/docs/swagger.yaml | 152 ++++++++++++++++++---------- core/api/internal/object/model.go | 60 ++++++++--- core/api/internal/object/service.go | 26 ++--- 5 files changed, 162 insertions(+), 80 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 2b8f6250e..77143d82c 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -6,7 +6,7 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"$ref":"#/components/schemas/object.DetailEntry"},"id":{"description":"The id of the detail","example":"last_modified_date","type":"string"}},"type":"object"},"object.DetailEntry":{"description":"The details","properties":{"checkbox":{"description":"For checkbox details","example":true,"type":"boolean"},"date":{"description":"For date details","example":"2024-02-14T12:34:56Z","type":"string"},"email":{"description":"For email details","example":"example@example.com","type":"string"},"file":{"description":"For file details","example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"multi_select":{"description":"For multi-select details","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the detail","example":"Last modified date","type":"string"},"number":{"description":"For number details","example":42,"type":"number"},"object":{"description":"For object details","example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"For phone details","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"For text details","example":"Some text","type":"string"},"type":{"description":"The type of the detail, which should correspond to the field that is set","example":"date","type":"string"},"url":{"description":"For URL details","example":"https://example.com","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Tag":{"description":"For select details","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"},"type":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CheckboxDetail":{"properties":{"checkbox":{"example":true,"type":"boolean"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.DateDetail":{"properties":{"date":{"example":"2024-02-14T12:34:56Z","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"$ref":"#/components/schemas/object.DetailEntry"},"id":{"description":"The id of the detail","example":"last_modified_date","type":"string"}},"type":"object"},"object.DetailEntry":{"description":"The details","properties":{"name":{"description":"The name of the detail","example":"Last modified date","type":"string"},"type":{"description":"The type of the detail, which should correspond to the field that is set","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"value":{"description":"The value of the detail","oneOf":[{"$ref":"#/components/schemas/object.TextDetail"},{"$ref":"#/components/schemas/object.NumberDetail"},{"$ref":"#/components/schemas/object.SelectDetail"},{"$ref":"#/components/schemas/object.MultiSelectDetail"},{"$ref":"#/components/schemas/object.DateDetail"},{"$ref":"#/components/schemas/object.FileDetail"},{"$ref":"#/components/schemas/object.CheckboxDetail"},{"$ref":"#/components/schemas/object.UrlDetail"},{"$ref":"#/components/schemas/object.EmailDetail"},{"$ref":"#/components/schemas/object.PhoneDetail"},{"$ref":"#/components/schemas/object.ObjectDetail"}]}},"type":"object"},"object.EmailDetail":{"properties":{"email":{"example":"example@example.com","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.FileDetail":{"properties":{"file":{"example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"object.MultiSelectDetail":{"properties":{"multi_select":{"items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false}},"type":"object"},"object.NumberDetail":{"properties":{"number":{"example":42,"type":"number"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectDetail":{"properties":{"object":{"example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.PhoneDetail":{"properties":{"phone":{"example":"+1234567890","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.SelectDetail":{"properties":{"select":{"$ref":"#/components/schemas/object.Tag"}},"type":"object"},"object.Tag":{"properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.TextDetail":{"properties":{"text":{"example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.UrlDetail":{"properties":{"url":{"example":"https://example.com","type":"string"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"},"type":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["spaces"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["spaces"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["types"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index bdb6f7a01..c4920f5e9 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,5 +1,5 @@ { - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"$ref":"#/components/schemas/object.DetailEntry"},"id":{"description":"The id of the detail","example":"last_modified_date","type":"string"}},"type":"object"},"object.DetailEntry":{"description":"The details","properties":{"checkbox":{"description":"For checkbox details","example":true,"type":"boolean"},"date":{"description":"For date details","example":"2024-02-14T12:34:56Z","type":"string"},"email":{"description":"For email details","example":"example@example.com","type":"string"},"file":{"description":"For file details","example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"multi_select":{"description":"For multi-select details","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the detail","example":"Last modified date","type":"string"},"number":{"description":"For number details","example":42,"type":"number"},"object":{"description":"For object details","example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"For phone details","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"For text details","example":"Some text","type":"string"},"type":{"description":"The type of the detail, which should correspond to the field that is set","example":"date","type":"string"},"url":{"description":"For URL details","example":"https://example.com","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Tag":{"description":"For select details","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"},"type":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CheckboxDetail":{"properties":{"checkbox":{"example":true,"type":"boolean"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.DateDetail":{"properties":{"date":{"example":"2024-02-14T12:34:56Z","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"$ref":"#/components/schemas/object.DetailEntry"},"id":{"description":"The id of the detail","example":"last_modified_date","type":"string"}},"type":"object"},"object.DetailEntry":{"description":"The details","properties":{"name":{"description":"The name of the detail","example":"Last modified date","type":"string"},"type":{"description":"The type of the detail, which should correspond to the field that is set","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"value":{"description":"The value of the detail","oneOf":[{"$ref":"#/components/schemas/object.TextDetail"},{"$ref":"#/components/schemas/object.NumberDetail"},{"$ref":"#/components/schemas/object.SelectDetail"},{"$ref":"#/components/schemas/object.MultiSelectDetail"},{"$ref":"#/components/schemas/object.DateDetail"},{"$ref":"#/components/schemas/object.FileDetail"},{"$ref":"#/components/schemas/object.CheckboxDetail"},{"$ref":"#/components/schemas/object.UrlDetail"},{"$ref":"#/components/schemas/object.EmailDetail"},{"$ref":"#/components/schemas/object.PhoneDetail"},{"$ref":"#/components/schemas/object.ObjectDetail"}]}},"type":"object"},"object.EmailDetail":{"properties":{"email":{"example":"example@example.com","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.FileDetail":{"properties":{"file":{"example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"object.MultiSelectDetail":{"properties":{"multi_select":{"items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false}},"type":"object"},"object.NumberDetail":{"properties":{"number":{"example":42,"type":"number"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectDetail":{"properties":{"object":{"example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.PhoneDetail":{"properties":{"phone":{"example":"+1234567890","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.SelectDetail":{"properties":{"select":{"$ref":"#/components/schemas/object.Tag"}},"type":"object"},"object.Tag":{"properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.TextDetail":{"properties":{"text":{"example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.UrlDetail":{"properties":{"url":{"example":"https://example.com","type":"string"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"},"type":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["spaces"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["spaces"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["types"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index b3a7b9b8d..94a52113b 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -68,6 +68,12 @@ components: example: VerticalAlignTop type: string type: object + object.CheckboxDetail: + properties: + checkbox: + example: true + type: boolean + type: object object.CreateObjectRequest: properties: body: @@ -99,6 +105,12 @@ components: example: bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge type: string type: object + object.DateDetail: + properties: + date: + example: "2024-02-14T12:34:56Z" + type: string + type: object object.Detail: properties: details: @@ -111,66 +123,46 @@ components: object.DetailEntry: description: The details properties: - checkbox: - description: For checkbox details - example: true - type: boolean - date: - description: For date details - example: "2024-02-14T12:34:56Z" - type: string - email: - description: For email details - example: example@example.com - type: string - file: - description: For file details - example: - - '[''bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge'']' - items: - type: string - type: array - uniqueItems: false - multi_select: - description: For multi-select details - items: - $ref: '#/components/schemas/object.Tag' - type: array - uniqueItems: false name: description: The name of the detail example: Last modified date type: string - number: - description: For number details - example: 42 - type: number - object: - description: For object details - example: - - '[''bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge'']' - items: - type: string - type: array - uniqueItems: false - phone: - description: For phone details - example: "+1234567890" - type: string - select: - $ref: '#/components/schemas/object.Tag' - text: - description: For text details - example: Some text - type: string type: description: The type of the detail, which should correspond to the field that is set + enum: + - text + - number + - select + - multi_select + - date + - file + - checkbox + - url + - email + - phone + - object example: date type: string - url: - description: For URL details - example: https://example.com + value: + description: The value of the detail + oneOf: + - $ref: '#/components/schemas/object.TextDetail' + - $ref: '#/components/schemas/object.NumberDetail' + - $ref: '#/components/schemas/object.SelectDetail' + - $ref: '#/components/schemas/object.MultiSelectDetail' + - $ref: '#/components/schemas/object.DateDetail' + - $ref: '#/components/schemas/object.FileDetail' + - $ref: '#/components/schemas/object.CheckboxDetail' + - $ref: '#/components/schemas/object.UrlDetail' + - $ref: '#/components/schemas/object.EmailDetail' + - $ref: '#/components/schemas/object.PhoneDetail' + - $ref: '#/components/schemas/object.ObjectDetail' + type: object + object.EmailDetail: + properties: + email: + example: example@example.com type: string type: object object.File: @@ -204,6 +196,30 @@ components: description: The type of the file type: string type: object + object.FileDetail: + properties: + file: + example: + - '[''bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge'']' + items: + type: string + type: array + uniqueItems: false + type: object + object.MultiSelectDetail: + properties: + multi_select: + items: + $ref: '#/components/schemas/object.Tag' + type: array + uniqueItems: false + type: object + object.NumberDetail: + properties: + number: + example: 42 + type: number + type: object object.Object: description: The object properties: @@ -253,19 +269,39 @@ components: type: $ref: '#/components/schemas/object.Type' type: object + object.ObjectDetail: + properties: + object: + example: + - '[''bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge'']' + items: + type: string + type: array + uniqueItems: false + type: object object.ObjectResponse: properties: object: $ref: '#/components/schemas/object.Object' type: object + object.PhoneDetail: + properties: + phone: + example: "+1234567890" + type: string + type: object object.Relation: description: The relation of the block, if applicable properties: id: type: string type: object + object.SelectDetail: + properties: + select: + $ref: '#/components/schemas/object.Tag' + type: object object.Tag: - description: For select details properties: color: description: The color of the tag @@ -340,6 +376,12 @@ components: example: Some text... type: string type: object + object.TextDetail: + properties: + text: + example: Some text... + type: string + type: object object.Type: description: The type of the object properties: @@ -371,6 +413,12 @@ components: type: $ref: '#/components/schemas/object.Type' type: object + object.UrlDetail: + properties: + url: + example: https://example.com + type: string + type: object pagination.PaginatedResponse-object_Object: properties: data: diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index 396803532..7fd24a19f 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -72,19 +72,53 @@ type Detail struct { } type DetailEntry struct { - Name string `json:"name" example:"Last modified date"` // The name of the detail - Type string `json:"type" example:"date"` // The type of the detail, which should correspond to the field that is set - Text string `json:"text,omitempty" example:"Some text"` // For text details - Number float64 `json:"number,omitempty" example:"42"` // For number details - Select *Tag `json:"select,omitempty"` // For select details - MultiSelect []Tag `json:"multi_select,omitempty"` // For multi-select details - Date string `json:"date,omitempty" example:"2024-02-14T12:34:56Z"` // For date details - File []string `json:"file,omitempty" example:"['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"` // For file details - Checkbox bool `json:"checkbox,omitempty" example:"true"` // For checkbox details - Url string `json:"url,omitempty" example:"https://example.com"` // For URL details - Email string `json:"email,omitempty" example:"example@example.com"` // For email details - Phone string `json:"phone,omitempty" example:"+1234567890"` // For phone details - Object []string `json:"object,omitempty" example:"['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"` // For object details + Name string `json:"name" example:"Last modified date"` // The name of the detail + Type string `json:"type" enums:"text,number,select,multi_select,date,file,checkbox,url,email,phone,object" example:"date"` // The type of the detail, which should correspond to the field that is set + Value any `json:"value" oneOf:"TextDetail,NumberDetail,SelectDetail,MultiSelectDetail,DateDetail,FileDetail,CheckboxDetail,UrlDetail,EmailDetail,PhoneDetail,ObjectDetail"` // The value of the detail +} + +type TextDetail struct { + Text string `json:"text" example:"Some text..."` +} + +type NumberDetail struct { + Number float64 `json:"number" example:"42"` +} + +type SelectDetail struct { + Select *Tag `json:"select"` +} + +type MultiSelectDetail struct { + MultiSelect []Tag `json:"multi_select"` +} + +type DateDetail struct { + Date string `json:"date" example:"2024-02-14T12:34:56Z"` +} + +type FileDetail struct { + File []string `json:"file" example:"['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"` +} + +type CheckboxDetail struct { + Checkbox bool `json:"checkbox" example:"true"` +} + +type UrlDetail struct { + Url string `json:"url" example:"https://example.com"` +} + +type EmailDetail struct { + Email string `json:"email" example:"example@example.com"` +} + +type PhoneDetail struct { + Phone string `json:"phone" example:"+1234567890"` +} + +type ObjectDetail struct { + Object []string `json:"object" example:"['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"` } type Tag struct { diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 6cbed6f16..58a5e535b 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -547,23 +547,23 @@ func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { switch format { case "text": if str, ok := convertedVal.(string); ok { - entry.Text = str + entry.Value = TextDetail{Text: str} } case "number": if num, ok := convertedVal.(float64); ok { - entry.Number = num + entry.Value = NumberDetail{Number: num} } case "select": if sel, ok := convertedVal.(Tag); ok { - entry.Select = &sel + entry.Value = SelectDetail{Select: &sel} } case "multi_select": if ms, ok := convertedVal.([]Tag); ok { - entry.MultiSelect = ms + entry.Value = MultiSelectDetail{MultiSelect: ms} } case "date": if dateStr, ok := convertedVal.(string); ok { - entry.Date = dateStr + entry.Value = DateDetail{Date: dateStr} } case "file": if file, ok := convertedVal.([]interface{}); ok { @@ -573,27 +573,27 @@ func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { files = append(files, str) } } - entry.File = files + entry.Value = FileDetail{File: files} } case "checkbox": if cb, ok := convertedVal.(bool); ok { - entry.Checkbox = cb + entry.Value = CheckboxDetail{Checkbox: cb} } case "url": if url, ok := convertedVal.(string); ok { - entry.Url = url + entry.Value = UrlDetail{Url: url} } case "email": if email, ok := convertedVal.(string); ok { - entry.Email = email + entry.Value = EmailDetail{Email: email} } case "phone": if phone, ok := convertedVal.(string); ok { - entry.Phone = phone + entry.Value = PhoneDetail{Phone: phone} } case "object": if obj, ok := convertedVal.(string); ok { - entry.Object = []string{obj} + entry.Value = ObjectDetail{Object: []string{obj}} } else if objSlice, ok := convertedVal.([]interface{}); ok { var objects []string for _, v := range objSlice { @@ -601,11 +601,11 @@ func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { objects = append(objects, str) } } - entry.Object = objects + entry.Value = ObjectDetail{Object: objects} } default: if str, ok := convertedVal.(string); ok { - entry.Text = str + entry.Value = TextDetail{Text: str} } } From 93d0bf96b1056864e3258bc0c280e9db68fc8079 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 11 Mar 2025 14:56:16 +0100 Subject: [PATCH 043/132] GO-4459: Flatten detail values in DetailEntry --- core/api/docs/docs.go | 2 +- core/api/docs/swagger.json | 2 +- core/api/docs/swagger.yaml | 163 +++++++++++++++++++--------- core/api/internal/object/model.go | 84 ++++++++++---- core/api/internal/object/service.go | 91 ++++++++++++---- 5 files changed, 248 insertions(+), 94 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 77143d82c..a119d6eba 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -6,7 +6,7 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CheckboxDetail":{"properties":{"checkbox":{"example":true,"type":"boolean"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.DateDetail":{"properties":{"date":{"example":"2024-02-14T12:34:56Z","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"$ref":"#/components/schemas/object.DetailEntry"},"id":{"description":"The id of the detail","example":"last_modified_date","type":"string"}},"type":"object"},"object.DetailEntry":{"description":"The details","properties":{"name":{"description":"The name of the detail","example":"Last modified date","type":"string"},"type":{"description":"The type of the detail, which should correspond to the field that is set","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"value":{"description":"The value of the detail","oneOf":[{"$ref":"#/components/schemas/object.TextDetail"},{"$ref":"#/components/schemas/object.NumberDetail"},{"$ref":"#/components/schemas/object.SelectDetail"},{"$ref":"#/components/schemas/object.MultiSelectDetail"},{"$ref":"#/components/schemas/object.DateDetail"},{"$ref":"#/components/schemas/object.FileDetail"},{"$ref":"#/components/schemas/object.CheckboxDetail"},{"$ref":"#/components/schemas/object.UrlDetail"},{"$ref":"#/components/schemas/object.EmailDetail"},{"$ref":"#/components/schemas/object.PhoneDetail"},{"$ref":"#/components/schemas/object.ObjectDetail"}]}},"type":"object"},"object.EmailDetail":{"properties":{"email":{"example":"example@example.com","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.FileDetail":{"properties":{"file":{"example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"object.MultiSelectDetail":{"properties":{"multi_select":{"items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false}},"type":"object"},"object.NumberDetail":{"properties":{"number":{"example":42,"type":"number"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectDetail":{"properties":{"object":{"example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.PhoneDetail":{"properties":{"phone":{"example":"+1234567890","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.SelectDetail":{"properties":{"select":{"$ref":"#/components/schemas/object.Tag"}},"type":"object"},"object.Tag":{"properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.TextDetail":{"properties":{"text":{"example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.UrlDetail":{"properties":{"url":{"example":"https://example.com","type":"string"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"},"type":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CheckboxDetailEntry":{"properties":{"checkbox":{"example":true,"type":"boolean"},"name":{"example":"Done","type":"string"},"type":{"enum":["checkbox"],"example":"checkbox","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.DateDetailEntry":{"properties":{"date":{"example":"2024-02-14T12:34:56Z","type":"string"},"name":{"example":"Last modified date","type":"string"},"type":{"enum":["date"],"example":"date","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"oneOf":[{"$ref":"#/components/schemas/object.TextDetailEntry"},{"$ref":"#/components/schemas/object.NumberDetailEntry"},{"$ref":"#/components/schemas/object.SelectDetailEntry"},{"$ref":"#/components/schemas/object.MultiSelectDetailEntry"},{"$ref":"#/components/schemas/object.DateDetailEntry"},{"$ref":"#/components/schemas/object.FileDetailEntry"},{"$ref":"#/components/schemas/object.CheckboxDetailEntry"},{"$ref":"#/components/schemas/object.UrlDetailEntry"},{"$ref":"#/components/schemas/object.EmailDetailEntry"},{"$ref":"#/components/schemas/object.PhoneDetailEntry"},{"$ref":"#/components/schemas/object.ObjectDetailEntry"}]},"id":{"example":"last_modified_date","type":"string"}},"type":"object"},"object.EmailDetailEntry":{"properties":{"email":{"example":"example@example.com","type":"string"},"name":{"example":"Email","type":"string"},"type":{"enum":["email"],"example":"email","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.FileDetailEntry":{"properties":{"file":{"example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"name":{"example":"File","type":"string"},"type":{"enum":["file"],"example":"file","type":"string"}},"type":"object"},"object.MultiSelectDetailEntry":{"properties":{"multi_select":{"items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"example":"Tag","type":"string"},"type":{"enum":["multi_select"],"example":"multi_select","type":"string"}},"type":"object"},"object.NumberDetailEntry":{"properties":{"name":{"example":"Size","type":"string"},"number":{"example":42,"type":"number"},"type":{"enum":["number"],"example":"number","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectDetailEntry":{"properties":{"name":{"example":"Assignee","type":"string"},"object":{"example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"type":{"enum":["object"],"example":"object","type":"string"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.PhoneDetailEntry":{"properties":{"name":{"example":"Phone","type":"string"},"phone":{"example":"+1234567890","type":"string"},"type":{"enum":["phone"],"example":"phone","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.SelectDetailEntry":{"properties":{"name":{"example":"Status","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"type":{"enum":["select"],"example":"select","type":"string"}},"type":"object"},"object.Tag":{"properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.TextDetailEntry":{"properties":{"name":{"example":"Description","type":"string"},"text":{"example":"Some text...","type":"string"},"type":{"enum":["text"],"example":"text","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.UrlDetailEntry":{"properties":{"name":{"example":"URL","type":"string"},"type":{"enum":["url"],"example":"url","type":"string"},"url":{"example":"https://example.com","type":"string"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"},"type":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["spaces"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["spaces"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["types"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index c4920f5e9..b73a1048d 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,5 +1,5 @@ { - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CheckboxDetail":{"properties":{"checkbox":{"example":true,"type":"boolean"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.DateDetail":{"properties":{"date":{"example":"2024-02-14T12:34:56Z","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"$ref":"#/components/schemas/object.DetailEntry"},"id":{"description":"The id of the detail","example":"last_modified_date","type":"string"}},"type":"object"},"object.DetailEntry":{"description":"The details","properties":{"name":{"description":"The name of the detail","example":"Last modified date","type":"string"},"type":{"description":"The type of the detail, which should correspond to the field that is set","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"value":{"description":"The value of the detail","oneOf":[{"$ref":"#/components/schemas/object.TextDetail"},{"$ref":"#/components/schemas/object.NumberDetail"},{"$ref":"#/components/schemas/object.SelectDetail"},{"$ref":"#/components/schemas/object.MultiSelectDetail"},{"$ref":"#/components/schemas/object.DateDetail"},{"$ref":"#/components/schemas/object.FileDetail"},{"$ref":"#/components/schemas/object.CheckboxDetail"},{"$ref":"#/components/schemas/object.UrlDetail"},{"$ref":"#/components/schemas/object.EmailDetail"},{"$ref":"#/components/schemas/object.PhoneDetail"},{"$ref":"#/components/schemas/object.ObjectDetail"}]}},"type":"object"},"object.EmailDetail":{"properties":{"email":{"example":"example@example.com","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.FileDetail":{"properties":{"file":{"example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"object.MultiSelectDetail":{"properties":{"multi_select":{"items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false}},"type":"object"},"object.NumberDetail":{"properties":{"number":{"example":42,"type":"number"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectDetail":{"properties":{"object":{"example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.PhoneDetail":{"properties":{"phone":{"example":"+1234567890","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.SelectDetail":{"properties":{"select":{"$ref":"#/components/schemas/object.Tag"}},"type":"object"},"object.Tag":{"properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.TextDetail":{"properties":{"text":{"example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.UrlDetail":{"properties":{"url":{"example":"https://example.com","type":"string"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"},"type":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CheckboxDetailEntry":{"properties":{"checkbox":{"example":true,"type":"boolean"},"name":{"example":"Done","type":"string"},"type":{"enum":["checkbox"],"example":"checkbox","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.DateDetailEntry":{"properties":{"date":{"example":"2024-02-14T12:34:56Z","type":"string"},"name":{"example":"Last modified date","type":"string"},"type":{"enum":["date"],"example":"date","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"oneOf":[{"$ref":"#/components/schemas/object.TextDetailEntry"},{"$ref":"#/components/schemas/object.NumberDetailEntry"},{"$ref":"#/components/schemas/object.SelectDetailEntry"},{"$ref":"#/components/schemas/object.MultiSelectDetailEntry"},{"$ref":"#/components/schemas/object.DateDetailEntry"},{"$ref":"#/components/schemas/object.FileDetailEntry"},{"$ref":"#/components/schemas/object.CheckboxDetailEntry"},{"$ref":"#/components/schemas/object.UrlDetailEntry"},{"$ref":"#/components/schemas/object.EmailDetailEntry"},{"$ref":"#/components/schemas/object.PhoneDetailEntry"},{"$ref":"#/components/schemas/object.ObjectDetailEntry"}]},"id":{"example":"last_modified_date","type":"string"}},"type":"object"},"object.EmailDetailEntry":{"properties":{"email":{"example":"example@example.com","type":"string"},"name":{"example":"Email","type":"string"},"type":{"enum":["email"],"example":"email","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.FileDetailEntry":{"properties":{"file":{"example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"name":{"example":"File","type":"string"},"type":{"enum":["file"],"example":"file","type":"string"}},"type":"object"},"object.MultiSelectDetailEntry":{"properties":{"multi_select":{"items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"example":"Tag","type":"string"},"type":{"enum":["multi_select"],"example":"multi_select","type":"string"}},"type":"object"},"object.NumberDetailEntry":{"properties":{"name":{"example":"Size","type":"string"},"number":{"example":42,"type":"number"},"type":{"enum":["number"],"example":"number","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectDetailEntry":{"properties":{"name":{"example":"Assignee","type":"string"},"object":{"example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"type":{"enum":["object"],"example":"object","type":"string"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.PhoneDetailEntry":{"properties":{"name":{"example":"Phone","type":"string"},"phone":{"example":"+1234567890","type":"string"},"type":{"enum":["phone"],"example":"phone","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.SelectDetailEntry":{"properties":{"name":{"example":"Status","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"type":{"enum":["select"],"example":"select","type":"string"}},"type":"object"},"object.Tag":{"properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.TextDetailEntry":{"properties":{"name":{"example":"Description","type":"string"},"text":{"example":"Some text...","type":"string"},"type":{"enum":["text"],"example":"text","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.UrlDetailEntry":{"properties":{"name":{"example":"URL","type":"string"},"type":{"enum":["url"],"example":"url","type":"string"},"url":{"example":"https://example.com","type":"string"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"},"type":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["spaces"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["spaces"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["types"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 94a52113b..46c5ce3aa 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -68,11 +68,19 @@ components: example: VerticalAlignTop type: string type: object - object.CheckboxDetail: + object.CheckboxDetailEntry: properties: checkbox: example: true type: boolean + name: + example: Done + type: string + type: + enum: + - checkbox + example: checkbox + type: string type: object object.CreateObjectRequest: properties: @@ -105,65 +113,52 @@ components: example: bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge type: string type: object - object.DateDetail: + object.DateDetailEntry: properties: date: example: "2024-02-14T12:34:56Z" type: string + name: + example: Last modified date + type: string + type: + enum: + - date + example: date + type: string type: object object.Detail: properties: details: - $ref: '#/components/schemas/object.DetailEntry' + oneOf: + - $ref: '#/components/schemas/object.TextDetailEntry' + - $ref: '#/components/schemas/object.NumberDetailEntry' + - $ref: '#/components/schemas/object.SelectDetailEntry' + - $ref: '#/components/schemas/object.MultiSelectDetailEntry' + - $ref: '#/components/schemas/object.DateDetailEntry' + - $ref: '#/components/schemas/object.FileDetailEntry' + - $ref: '#/components/schemas/object.CheckboxDetailEntry' + - $ref: '#/components/schemas/object.UrlDetailEntry' + - $ref: '#/components/schemas/object.EmailDetailEntry' + - $ref: '#/components/schemas/object.PhoneDetailEntry' + - $ref: '#/components/schemas/object.ObjectDetailEntry' id: - description: The id of the detail example: last_modified_date type: string type: object - object.DetailEntry: - description: The details - properties: - name: - description: The name of the detail - example: Last modified date - type: string - type: - description: The type of the detail, which should correspond to the field - that is set - enum: - - text - - number - - select - - multi_select - - date - - file - - checkbox - - url - - email - - phone - - object - example: date - type: string - value: - description: The value of the detail - oneOf: - - $ref: '#/components/schemas/object.TextDetail' - - $ref: '#/components/schemas/object.NumberDetail' - - $ref: '#/components/schemas/object.SelectDetail' - - $ref: '#/components/schemas/object.MultiSelectDetail' - - $ref: '#/components/schemas/object.DateDetail' - - $ref: '#/components/schemas/object.FileDetail' - - $ref: '#/components/schemas/object.CheckboxDetail' - - $ref: '#/components/schemas/object.UrlDetail' - - $ref: '#/components/schemas/object.EmailDetail' - - $ref: '#/components/schemas/object.PhoneDetail' - - $ref: '#/components/schemas/object.ObjectDetail' - type: object - object.EmailDetail: + object.EmailDetailEntry: properties: email: example: example@example.com type: string + name: + example: Email + type: string + type: + enum: + - email + example: email + type: string type: object object.File: description: The file of the block, if applicable @@ -196,7 +191,7 @@ components: description: The type of the file type: string type: object - object.FileDetail: + object.FileDetailEntry: properties: file: example: @@ -205,20 +200,44 @@ components: type: string type: array uniqueItems: false + name: + example: File + type: string + type: + enum: + - file + example: file + type: string type: object - object.MultiSelectDetail: + object.MultiSelectDetailEntry: properties: multi_select: items: $ref: '#/components/schemas/object.Tag' type: array uniqueItems: false + name: + example: Tag + type: string + type: + enum: + - multi_select + example: multi_select + type: string type: object - object.NumberDetail: + object.NumberDetailEntry: properties: + name: + example: Size + type: string number: example: 42 type: number + type: + enum: + - number + example: number + type: string type: object object.Object: description: The object @@ -269,8 +288,11 @@ components: type: $ref: '#/components/schemas/object.Type' type: object - object.ObjectDetail: + object.ObjectDetailEntry: properties: + name: + example: Assignee + type: string object: example: - '[''bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge'']' @@ -278,17 +300,30 @@ components: type: string type: array uniqueItems: false + type: + enum: + - object + example: object + type: string type: object object.ObjectResponse: properties: object: $ref: '#/components/schemas/object.Object' type: object - object.PhoneDetail: + object.PhoneDetailEntry: properties: + name: + example: Phone + type: string phone: example: "+1234567890" type: string + type: + enum: + - phone + example: phone + type: string type: object object.Relation: description: The relation of the block, if applicable @@ -296,10 +331,18 @@ components: id: type: string type: object - object.SelectDetail: + object.SelectDetailEntry: properties: + name: + example: Status + type: string select: $ref: '#/components/schemas/object.Tag' + type: + enum: + - select + example: select + type: string type: object object.Tag: properties: @@ -376,11 +419,19 @@ components: example: Some text... type: string type: object - object.TextDetail: + object.TextDetailEntry: properties: + name: + example: Description + type: string text: example: Some text... type: string + type: + enum: + - text + example: text + type: string type: object object.Type: description: The type of the object @@ -413,8 +464,16 @@ components: type: $ref: '#/components/schemas/object.Type' type: object - object.UrlDetail: + object.UrlDetailEntry: properties: + name: + example: URL + type: string + type: + enum: + - url + example: url + type: string url: example: https://example.com type: string diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index 7fd24a19f..19ddf66a2 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -67,60 +67,102 @@ type Relation struct { } type Detail struct { - Id string `json:"id" example:"last_modified_date"` // The id of the detail - Details DetailEntry `json:"details"` // The details + Id string `json:"id" example:"last_modified_date"` + Details DetailEntry `json:"details" oneOf:"TextDetailEntry,NumberDetailEntry,SelectDetailEntry,MultiSelectDetailEntry,DateDetailEntry,FileDetailEntry,CheckboxDetailEntry,UrlDetailEntry,EmailDetailEntry,PhoneDetailEntry,ObjectDetailEntry"` } -type DetailEntry struct { - Name string `json:"name" example:"Last modified date"` // The name of the detail - Type string `json:"type" enums:"text,number,select,multi_select,date,file,checkbox,url,email,phone,object" example:"date"` // The type of the detail, which should correspond to the field that is set - Value any `json:"value" oneOf:"TextDetail,NumberDetail,SelectDetail,MultiSelectDetail,DateDetail,FileDetail,CheckboxDetail,UrlDetail,EmailDetail,PhoneDetail,ObjectDetail"` // The value of the detail +type DetailEntry interface { + GetType() string } -type TextDetail struct { +type TextDetailEntry struct { + Name string `json:"name" example:"Description"` + Type string `json:"type" example:"text" enums:"text"` Text string `json:"text" example:"Some text..."` } -type NumberDetail struct { +func (t TextDetailEntry) GetType() string { return t.Type } + +type NumberDetailEntry struct { + Name string `json:"name" example:"Size"` + Type string `json:"type" example:"number" enums:"number"` Number float64 `json:"number" example:"42"` } -type SelectDetail struct { - Select *Tag `json:"select"` +func (n NumberDetailEntry) GetType() string { return n.Type } + +type SelectDetailEntry struct { + Name string `json:"name" example:"Status"` + Type string `json:"type" example:"select" enums:"select"` + Select *Tag `json:"select"` } -type MultiSelectDetail struct { - MultiSelect []Tag `json:"multi_select"` +func (s SelectDetailEntry) GetType() string { return s.Type } + +type MultiSelectDetailEntry struct { + Name string `json:"name" example:"Tag"` + Type string `json:"type" example:"multi_select" enums:"multi_select"` + MultiSelect []Tag `json:"multi_select"` } -type DateDetail struct { +func (m MultiSelectDetailEntry) GetType() string { return m.Type } + +type DateDetailEntry struct { + Name string `json:"name" example:"Last modified date"` + Type string `json:"type" example:"date" enums:"date"` Date string `json:"date" example:"2024-02-14T12:34:56Z"` } -type FileDetail struct { +func (d DateDetailEntry) GetType() string { return d.Type } + +type FileDetailEntry struct { + Name string `json:"name" example:"File"` + Type string `json:"type" example:"file" enums:"file"` File []string `json:"file" example:"['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"` } -type CheckboxDetail struct { - Checkbox bool `json:"checkbox" example:"true"` +func (f FileDetailEntry) GetType() string { return f.Type } + +type CheckboxDetailEntry struct { + Name string `json:"name" example:"Done"` + Type string `json:"type" example:"checkbox" enums:"checkbox"` + Checkbox bool `json:"checkbox" example:"true"` } -type UrlDetail struct { - Url string `json:"url" example:"https://example.com"` +func (c CheckboxDetailEntry) GetType() string { return c.Type } + +type UrlDetailEntry struct { + Name string `json:"name" example:"URL"` + Type string `json:"type" example:"url" enums:"url"` + Url string `json:"url" example:"https://example.com"` } -type EmailDetail struct { +func (u UrlDetailEntry) GetType() string { return u.Type } + +type EmailDetailEntry struct { + Name string `json:"name" example:"Email"` + Type string `json:"type" example:"email" enums:"email"` Email string `json:"email" example:"example@example.com"` } -type PhoneDetail struct { +func (e EmailDetailEntry) GetType() string { return e.Type } + +type PhoneDetailEntry struct { + Name string `json:"name" example:"Phone"` + Type string `json:"type" example:"phone" enums:"phone"` Phone string `json:"phone" example:"+1234567890"` } -type ObjectDetail struct { +func (p PhoneDetailEntry) GetType() string { return p.Type } + +type ObjectDetailEntry struct { + Name string `json:"name" example:"Assignee"` + Type string `json:"type" example:"object" enums:"object"` Object []string `json:"object" example:"['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"` } +func (o ObjectDetailEntry) GetType() string { return o.Type } + type Tag struct { Id string `json:"id" example:"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq"` // The id of the tag Name string `json:"name" example:"in-progress"` // The name of the tag diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 58a5e535b..a4b3bd8ad 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -541,29 +541,47 @@ func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { convertedVal := s.convertValue(key, val, format, resp.ObjectView.Details) var entry DetailEntry - entry.Name = name - entry.Type = format switch format { case "text": if str, ok := convertedVal.(string); ok { - entry.Value = TextDetail{Text: str} + entry = TextDetailEntry{ + Name: name, + Type: "text", + Text: str, + } } case "number": if num, ok := convertedVal.(float64); ok { - entry.Value = NumberDetail{Number: num} + entry = NumberDetailEntry{ + Name: name, + Type: "number", + Number: num, + } } case "select": if sel, ok := convertedVal.(Tag); ok { - entry.Value = SelectDetail{Select: &sel} + entry = SelectDetailEntry{ + Name: name, + Type: "select", + Select: &sel, + } } case "multi_select": if ms, ok := convertedVal.([]Tag); ok { - entry.Value = MultiSelectDetail{MultiSelect: ms} + entry = MultiSelectDetailEntry{ + Name: name, + Type: "multi_select", + MultiSelect: ms, + } } case "date": if dateStr, ok := convertedVal.(string); ok { - entry.Value = DateDetail{Date: dateStr} + entry = DateDetailEntry{ + Name: name, + Type: "date", + Date: dateStr, + } } case "file": if file, ok := convertedVal.([]interface{}); ok { @@ -573,27 +591,51 @@ func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { files = append(files, str) } } - entry.Value = FileDetail{File: files} + entry = FileDetailEntry{ + Name: name, + Type: "file", + File: files, + } } case "checkbox": if cb, ok := convertedVal.(bool); ok { - entry.Value = CheckboxDetail{Checkbox: cb} + entry = CheckboxDetailEntry{ + Name: name, + Type: "checkbox", + Checkbox: cb, + } } case "url": if url, ok := convertedVal.(string); ok { - entry.Value = UrlDetail{Url: url} + entry = UrlDetailEntry{ + Name: name, + Type: "url", + Url: url, + } } case "email": if email, ok := convertedVal.(string); ok { - entry.Value = EmailDetail{Email: email} + entry = EmailDetailEntry{ + Name: name, + Type: "email", + Email: email, + } } case "phone": if phone, ok := convertedVal.(string); ok { - entry.Value = PhoneDetail{Phone: phone} + entry = PhoneDetailEntry{ + Name: name, + Type: "phone", + Phone: phone, + } } case "object": if obj, ok := convertedVal.(string); ok { - entry.Value = ObjectDetail{Object: []string{obj}} + entry = ObjectDetailEntry{ + Name: name, + Type: "object", + Object: []string{obj}, + } } else if objSlice, ok := convertedVal.([]interface{}); ok { var objects []string for _, v := range objSlice { @@ -601,18 +643,29 @@ func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { objects = append(objects, str) } } - entry.Value = ObjectDetail{Object: objects} + entry = ObjectDetailEntry{ + Name: name, + Type: "object", + Object: objects, + } } default: if str, ok := convertedVal.(string); ok { - entry.Value = TextDetail{Text: str} + entry = TextDetailEntry{ + Name: name, + Type: "text", + Text: str, + } } } - details = append(details, Detail{ - Id: id, - Details: entry, - }) + // Only append if an entry was created. + if entry != nil { + details = append(details, Detail{ + Id: id, + Details: entry, + }) + } } } return details From 2629f1944af61a3d3de04d563aa51d4e230db469 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 11 Mar 2025 15:40:50 +0100 Subject: [PATCH 044/132] GO-4459: Fix relation lookup error messages --- core/api/util/util.go | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/core/api/util/util.go b/core/api/util/util.go index cf2f8181c..fe62e5409 100644 --- a/core/api/util/util.go +++ b/core/api/util/util.go @@ -13,22 +13,25 @@ import ( ) var ( - ErrFailedSearchType = errors.New("failed to search for type") - ErrorTypeNotFound = errors.New("type not found") - iconOptionToColor = map[float64]string{ - 1: "grey", - 2: "yellow", - 3: "orange", - 4: "red", - 5: "pink", - 6: "purple", - 7: "blue", - 8: "ice", - 9: "teal", - 10: "lime", - } + ErrFailedSearchType = errors.New("failed to search for type") + ErrorTypeNotFound = errors.New("type not found") + ErrFailedSearchRelation = errors.New("failed to search for relation") + ErrorRelationNotFound = errors.New("relation not found") ) +var iconOptionToColor = map[float64]string{ + 1: "grey", + 2: "yellow", + 3: "orange", + 4: "red", + 5: "pink", + 6: "purple", + 7: "blue", + 8: "ice", + 9: "teal", + 10: "lime", +} + type Icon struct { Type string `json:"type" enums:"emoji,file,icon" example:"emoji"` // The type of the icon Emoji string `json:"emoji,omitempty" example:"📄"` // The emoji of the icon @@ -108,11 +111,11 @@ func ResolveRelationKeyToRelationName(mw service.ClientCommandsServer, spaceId s }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { - return "", ErrFailedSearchType + return "", ErrFailedSearchRelation } if len(resp.Records) == 0 { - return "", ErrorTypeNotFound + return "", ErrorRelationNotFound } return resp.Records[0].Fields[bundle.RelationKeyName.String()].GetStringValue(), nil From 944afa7652f89b48b2184693489a53614af0045e Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 11 Mar 2025 15:41:10 +0100 Subject: [PATCH 045/132] GO-4459: Skip _missing_object details in relation conversion --- core/api/internal/object/service.go | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index a4b3bd8ad..1450b13ad 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -540,6 +540,16 @@ func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { format := relationFormatMap[key] convertedVal := s.convertValue(key, val, format, resp.ObjectView.Details) + // Skip any detail where the value indicates a missing object. + if str, ok := convertedVal.(string); ok && str == "_missing_object" { + continue + } + if list, ok := convertedVal.([]interface{}); ok && len(list) == 1 { + if str, ok := list[0].(string); ok && str == "_missing_object" { + continue + } + } + var entry DetailEntry switch format { @@ -561,6 +571,9 @@ func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { } case "select": if sel, ok := convertedVal.(Tag); ok { + if sel.Id == "_missing_object" { + continue + } entry = SelectDetailEntry{ Name: name, Type: "select", @@ -569,6 +582,9 @@ func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { } case "multi_select": if ms, ok := convertedVal.([]Tag); ok { + if len(ms) == 1 && ms[0].Id == "_missing_object" { + continue + } entry = MultiSelectDetailEntry{ Name: name, Type: "multi_select", @@ -672,7 +688,7 @@ func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { } // getRelationName returns the relation id and relation name from the ObjectShowResponse. -func (s *ObjectService) getRelation(key string, resp *pb.RpcObjectShowResponse) (id string, name string) { +func (s *ObjectService) getRelation(key string, resp *pb.RpcObjectShowResponse) (string, string) { // Handle special cases first switch key { case bundle.RelationKeyCreator.String(): @@ -687,7 +703,7 @@ func (s *ObjectService) getRelation(key string, resp *pb.RpcObjectShowResponse) // Fallback to resolving the relation name spaceId := resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue() - if name, err := util.ResolveRelationKeyToRelationName(s.mw, spaceId, key); err == nil { + if name, err2 := util.ResolveRelationKeyToRelationName(s.mw, spaceId, key); err2 == nil { return key, name } return key, key From 7bb134ee0aea07f9220886a6988f45f05ba43ea2 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 11 Mar 2025 16:01:35 +0100 Subject: [PATCH 046/132] GO-4459: Fix lint by decomposing getDetails function and improving missing object handling --- core/api/internal/object/service.go | 336 ++++++++++++---------------- 1 file changed, 148 insertions(+), 188 deletions(-) diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 1450b13ad..c5a04027b 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -43,6 +43,47 @@ var ( ErrTemplateNotFound = errors.New("template not found") ) +var excludedSystemRelations = map[string]bool{ + bundle.RelationKeyId.String(): true, + bundle.RelationKeySpaceId.String(): true, + bundle.RelationKeyName.String(): true, + bundle.RelationKeyIconEmoji.String(): true, + bundle.RelationKeyIconImage.String(): true, + bundle.RelationKeyType.String(): true, + bundle.RelationKeyResolvedLayout.String(): true, + bundle.RelationKeyIsFavorite.String(): true, + bundle.RelationKeyIsArchived.String(): true, + bundle.RelationKeyIsDeleted.String(): true, + bundle.RelationKeyIsHidden.String(): true, + bundle.RelationKeyWorkspaceId.String(): true, + bundle.RelationKeyInternalFlags.String(): true, + bundle.RelationKeyRestrictions.String(): true, + bundle.RelationKeyOrigin.String(): true, + bundle.RelationKeySnippet.String(): true, + bundle.RelationKeySyncStatus.String(): true, + bundle.RelationKeySyncError.String(): true, + bundle.RelationKeySyncDate.String(): true, + bundle.RelationKeyCoverId.String(): true, + bundle.RelationKeyCoverType.String(): true, + bundle.RelationKeyCoverScale.String(): true, + bundle.RelationKeyCoverX.String(): true, + bundle.RelationKeyCoverY.String(): true, + bundle.RelationKeyMentions.String(): true, + bundle.RelationKeyOldAnytypeID.String(): true, + bundle.RelationKeySource.String(): true, + bundle.RelationKeySourceFilePath.String(): true, + bundle.RelationKeyImportType.String(): true, + bundle.RelationKeyTargetObjectType.String(): true, + bundle.RelationKeyFeaturedRelations.String(): true, + bundle.RelationKeySetOf.String(): true, + bundle.RelationKeyLinks.String(): true, + bundle.RelationKeyBacklinks.String(): true, + bundle.RelationKeySourceObject.String(): true, + bundle.RelationKeyLayoutAlign.String(): true, + bundle.RelationKeyIsHiddenDiscovery.String(): true, + bundle.RelationKeyLayout.String(): true, +} + type Service interface { ListObjects(ctx context.Context, spaceId string, offset int, limit int) ([]Object, int, bool, error) GetObject(ctx context.Context, spaceId string, objectId string) (Object, error) @@ -486,207 +527,126 @@ func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { linkedRelations := resp.ObjectView.RelationLinks primaryDetailFields := resp.ObjectView.Details[0].Details.Fields - // system relations to be excluded - excludeRelations := map[string]bool{ - bundle.RelationKeyId.String(): true, - bundle.RelationKeySpaceId.String(): true, - bundle.RelationKeyName.String(): true, - bundle.RelationKeyIconEmoji.String(): true, - bundle.RelationKeyIconImage.String(): true, - bundle.RelationKeyType.String(): true, - bundle.RelationKeyResolvedLayout.String(): true, - bundle.RelationKeyIsFavorite.String(): true, - bundle.RelationKeyIsArchived.String(): true, - bundle.RelationKeyIsDeleted.String(): true, - bundle.RelationKeyIsHidden.String(): true, - bundle.RelationKeyWorkspaceId.String(): true, - bundle.RelationKeyInternalFlags.String(): true, - bundle.RelationKeyRestrictions.String(): true, - bundle.RelationKeyOrigin.String(): true, - bundle.RelationKeySnippet.String(): true, - bundle.RelationKeySyncStatus.String(): true, - bundle.RelationKeySyncError.String(): true, - bundle.RelationKeySyncDate.String(): true, - bundle.RelationKeyCoverId.String(): true, - bundle.RelationKeyCoverType.String(): true, - bundle.RelationKeyCoverScale.String(): true, - bundle.RelationKeyCoverX.String(): true, - bundle.RelationKeyCoverY.String(): true, - bundle.RelationKeyMentions.String(): true, - bundle.RelationKeyOldAnytypeID.String(): true, - bundle.RelationKeySource.String(): true, - bundle.RelationKeySourceFilePath.String(): true, - bundle.RelationKeyImportType.String(): true, - bundle.RelationKeyTargetObjectType.String(): true, - bundle.RelationKeyFeaturedRelations.String(): true, - bundle.RelationKeySetOf.String(): true, - bundle.RelationKeyLinks.String(): true, - bundle.RelationKeyBacklinks.String(): true, - bundle.RelationKeySourceObject.String(): true, - bundle.RelationKeyLayoutAlign.String(): true, - bundle.RelationKeyIsHiddenDiscovery.String(): true, - bundle.RelationKeyLayout.String(): true, - } - var details []Detail for _, r := range linkedRelations { key := r.Key - if _, isExcluded := excludeRelations[key]; isExcluded { + if _, isExcluded := excludedSystemRelations[key]; isExcluded { + continue + } + if _, ok := primaryDetailFields[key]; !ok { continue } - if val, ok := primaryDetailFields[key]; ok { - id, name := s.getRelation(key, resp) - format := relationFormatMap[key] - convertedVal := s.convertValue(key, val, format, resp.ObjectView.Details) + id, name := s.getRelation(key, resp) + format := relationFormatMap[key] + convertedVal := s.convertValue(key, primaryDetailFields[key], format, resp.ObjectView.Details) - // Skip any detail where the value indicates a missing object. - if str, ok := convertedVal.(string); ok && str == "_missing_object" { - continue - } - if list, ok := convertedVal.([]interface{}); ok && len(list) == 1 { - if str, ok := list[0].(string); ok && str == "_missing_object" { - continue - } - } + if s.isMissingObject(convertedVal) { + continue + } - var entry DetailEntry - - switch format { - case "text": - if str, ok := convertedVal.(string); ok { - entry = TextDetailEntry{ - Name: name, - Type: "text", - Text: str, - } - } - case "number": - if num, ok := convertedVal.(float64); ok { - entry = NumberDetailEntry{ - Name: name, - Type: "number", - Number: num, - } - } - case "select": - if sel, ok := convertedVal.(Tag); ok { - if sel.Id == "_missing_object" { - continue - } - entry = SelectDetailEntry{ - Name: name, - Type: "select", - Select: &sel, - } - } - case "multi_select": - if ms, ok := convertedVal.([]Tag); ok { - if len(ms) == 1 && ms[0].Id == "_missing_object" { - continue - } - entry = MultiSelectDetailEntry{ - Name: name, - Type: "multi_select", - MultiSelect: ms, - } - } - case "date": - if dateStr, ok := convertedVal.(string); ok { - entry = DateDetailEntry{ - Name: name, - Type: "date", - Date: dateStr, - } - } - case "file": - if file, ok := convertedVal.([]interface{}); ok { - var files []string - for _, v := range file { - if str, ok := v.(string); ok { - files = append(files, str) - } - } - entry = FileDetailEntry{ - Name: name, - Type: "file", - File: files, - } - } - case "checkbox": - if cb, ok := convertedVal.(bool); ok { - entry = CheckboxDetailEntry{ - Name: name, - Type: "checkbox", - Checkbox: cb, - } - } - case "url": - if url, ok := convertedVal.(string); ok { - entry = UrlDetailEntry{ - Name: name, - Type: "url", - Url: url, - } - } - case "email": - if email, ok := convertedVal.(string); ok { - entry = EmailDetailEntry{ - Name: name, - Type: "email", - Email: email, - } - } - case "phone": - if phone, ok := convertedVal.(string); ok { - entry = PhoneDetailEntry{ - Name: name, - Type: "phone", - Phone: phone, - } - } - case "object": - if obj, ok := convertedVal.(string); ok { - entry = ObjectDetailEntry{ - Name: name, - Type: "object", - Object: []string{obj}, - } - } else if objSlice, ok := convertedVal.([]interface{}); ok { - var objects []string - for _, v := range objSlice { - if str, ok := v.(string); ok { - objects = append(objects, str) - } - } - entry = ObjectDetailEntry{ - Name: name, - Type: "object", - Object: objects, - } - } - default: - if str, ok := convertedVal.(string); ok { - entry = TextDetailEntry{ - Name: name, - Type: "text", - Text: str, - } - } - } - - // Only append if an entry was created. - if entry != nil { - details = append(details, Detail{ - Id: id, - Details: entry, - }) - } + entry := s.createDetailEntry(name, format, convertedVal) + if entry != nil { + details = append(details, Detail{ + Id: id, + Details: entry, + }) } } + return details } +// isMissingObject returns true if val indicates a "_missing_object" placeholder. +func (s *ObjectService) isMissingObject(val interface{}) bool { + switch v := val.(type) { + case string: + return v == "_missing_object" + case []interface{}: + if len(v) == 1 { + if str, ok := v[0].(string); ok { + return str == "_missing_object" + } + } + case Tag: + return v.Id == "_missing_object" + case []Tag: + if len(v) == 1 && v[0].Id == "_missing_object" { + return true + } + } + return false +} + +// createDetailEntry creates a DetailEntry based on the format and converted value. +func (s *ObjectService) createDetailEntry(name, format string, val interface{}) DetailEntry { + switch format { + case "text": + if str, ok := val.(string); ok { + return TextDetailEntry{Name: name, Type: "text", Text: str} + } + case "number": + if num, ok := val.(float64); ok { + return NumberDetailEntry{Name: name, Type: "number", Number: num} + } + case "select": + if sel, ok := val.(Tag); ok { + return SelectDetailEntry{Name: name, Type: "select", Select: &sel} + } + case "multi_select": + if ms, ok := val.([]Tag); ok { + return MultiSelectDetailEntry{Name: name, Type: "multi_select", MultiSelect: ms} + } + case "date": + if dateStr, ok := val.(string); ok { + return DateDetailEntry{Name: name, Type: "date", Date: dateStr} + } + case "file": + if file, ok := val.([]interface{}); ok { + var files []string + for _, v := range file { + if str, ok := v.(string); ok { + files = append(files, str) + } + } + return FileDetailEntry{Name: name, Type: "file", File: files} + } + case "checkbox": + if cb, ok := val.(bool); ok { + return CheckboxDetailEntry{Name: name, Type: "checkbox", Checkbox: cb} + } + case "url": + if url, ok := val.(string); ok { + return UrlDetailEntry{Name: name, Type: "url", Url: url} + } + case "email": + if email, ok := val.(string); ok { + return EmailDetailEntry{Name: name, Type: "email", Email: email} + } + case "phone": + if phone, ok := val.(string); ok { + return PhoneDetailEntry{Name: name, Type: "phone", Phone: phone} + } + case "object": + if obj, ok := val.(string); ok { + return ObjectDetailEntry{Name: name, Type: "object", Object: []string{obj}} + } else if objSlice, ok := val.([]interface{}); ok { + var objects []string + for _, v := range objSlice { + if str, ok := v.(string); ok { + objects = append(objects, str) + } + } + return ObjectDetailEntry{Name: name, Type: "object", Object: objects} + } + default: + if str, ok := val.(string); ok { + return TextDetailEntry{Name: name, Type: "text", Text: str} + } + } + return nil +} + // getRelationName returns the relation id and relation name from the ObjectShowResponse. func (s *ObjectService) getRelation(key string, resp *pb.RpcObjectShowResponse) (string, string) { // Handle special cases first From 1fc01769b15322931bacfbe53d5799e2a4849f37 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 11 Mar 2025 16:28:43 +0100 Subject: [PATCH 047/132] GO-4459: Fix tests for new DetailEntry interface --- core/api/internal/object/service_test.go | 24 ++++++++++++------------ core/api/internal/search/service_test.go | 12 ++++++------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/core/api/internal/object/service_test.go b/core/api/internal/object/service_test.go index 5fc706dc7..c10f0137b 100644 --- a/core/api/internal/object/service_test.go +++ b/core/api/internal/object/service_test.go @@ -237,17 +237,17 @@ func TestObjectService_ListObjects(t *testing.T) { for _, detail := range objects[0].Details { if detail.Id == "created_date" { - require.Equal(t, "1970-01-11T06:54:48Z", detail.Details["date"]) + require.Equal(t, "1970-01-11T06:54:48Z", detail.Details.(DateDetailEntry).Date) } else if detail.Id == "created_by" { - require.Equal(t, mockedParticipantId, detail.Details["object"]) + require.Equal(t, []string{mockedParticipantId}, detail.Details.(ObjectDetailEntry).Object) } else if detail.Id == "last_modified_date" { - require.Equal(t, "1970-01-12T13:46:39Z", detail.Details["date"]) + require.Equal(t, "1970-01-12T13:46:39Z", detail.Details.(DateDetailEntry).Date) } else if detail.Id == "last_modified_by" { - require.Equal(t, mockedParticipantId, detail.Details["object"]) + require.Equal(t, []string{mockedParticipantId}, detail.Details.(ObjectDetailEntry).Object) } else if detail.Id == "last_opened_date" { - require.Equal(t, "1970-01-01T00:00:00Z", detail.Details["date"]) + require.Equal(t, "1970-01-01T00:00:00Z", detail.Details.(DateDetailEntry).Date) } else if detail.Id == "tags" { - require.Empty(t, detail.Details["tags"]) + require.Empty(t, detail.Details.(SelectDetailEntry).Select) } else { t.Errorf("unexpected detail id: %s", detail.Id) } @@ -429,17 +429,17 @@ func TestObjectService_GetObject(t *testing.T) { for _, detail := range object.Details { if detail.Id == "created_date" { - require.Equal(t, "1970-01-11T06:54:48Z", detail.Details["date"]) + require.Equal(t, "1970-01-11T06:54:48Z", detail.Details.(DateDetailEntry).Date) } else if detail.Id == "created_by" { - require.Empty(t, detail.Details["created_by"]) + require.Empty(t, detail.Details.(ObjectDetailEntry).Object) } else if detail.Id == "last_modified_date" { - require.Equal(t, "1970-01-12T13:46:39Z", detail.Details["date"]) + require.Equal(t, "1970-01-12T13:46:39Z", detail.Details.(DateDetailEntry).Date) } else if detail.Id == "last_modified_by" { - require.Empty(t, detail.Details["last_modified_by"]) + require.Empty(t, detail.Details.(ObjectDetailEntry).Object) } else if detail.Id == "last_opened_date" { - require.Equal(t, "1970-01-01T00:00:00Z", detail.Details["date"]) + require.Equal(t, "1970-01-01T00:00:00Z", detail.Details.(DateDetailEntry).Date) } else if detail.Id == "tags" { - require.Empty(t, detail.Details["tags"]) + require.Empty(t, detail.Details.(SelectDetailEntry).Select) } else { t.Errorf("unexpected detail id: %s", detail.Id) } diff --git a/core/api/internal/search/service_test.go b/core/api/internal/search/service_test.go index c5bcbe10f..c54e69f82 100644 --- a/core/api/internal/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -392,21 +392,21 @@ func TestSearchService_GlobalSearch(t *testing.T) { // check details for _, detail := range objects[0].Details { if detail.Id == "created_date" { - require.Equal(t, "1970-01-11T06:54:48Z", detail.Details["date"]) + require.Equal(t, "1970-01-11T06:54:48Z", detail.Details.(object.DateDetailEntry).Date) } else if detail.Id == "last_modified_date" { - require.Equal(t, "1970-01-12T13:46:39Z", detail.Details["date"]) + require.Equal(t, "1970-01-12T13:46:39Z", detail.Details.(object.DateDetailEntry).Date) } else if detail.Id == "created_by" { - require.Equal(t, mockedParticipantId, detail.Details["object"]) + require.Equal(t, []string{mockedParticipantId}, detail.Details.(object.ObjectDetailEntry).Object) } else if detail.Id == "last_modified_by" { - require.Equal(t, mockedParticipantId, detail.Details["object"]) + require.Equal(t, []string{mockedParticipantId}, detail.Details.(object.ObjectDetailEntry).Object) } } // check tags tags := []object.Tag{} for _, detail := range objects[0].Details { - if tagList, ok := detail.Details["multi_select"].([]object.Tag); ok { - for _, tag := range tagList { + if tagList, ok := detail.Details.(object.MultiSelectDetailEntry); ok { + for _, tag := range tagList.MultiSelect { tags = append(tags, tag) } } From 5571e05fc79eef3bdc20528d014772d152dda65b Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 11 Mar 2025 21:21:38 +0100 Subject: [PATCH 048/132] GO-4459: Add separate swagger tags for 'members' and 'templates' --- core/api/docs/docs.go | 2 +- core/api/docs/swagger.json | 2 +- core/api/docs/swagger.yaml | 8 ++++---- core/api/internal/object/handler.go | 4 ++-- core/api/internal/space/handler.go | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index a119d6eba..38624de87 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -9,7 +9,7 @@ const docTemplate = `{ "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CheckboxDetailEntry":{"properties":{"checkbox":{"example":true,"type":"boolean"},"name":{"example":"Done","type":"string"},"type":{"enum":["checkbox"],"example":"checkbox","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.DateDetailEntry":{"properties":{"date":{"example":"2024-02-14T12:34:56Z","type":"string"},"name":{"example":"Last modified date","type":"string"},"type":{"enum":["date"],"example":"date","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"oneOf":[{"$ref":"#/components/schemas/object.TextDetailEntry"},{"$ref":"#/components/schemas/object.NumberDetailEntry"},{"$ref":"#/components/schemas/object.SelectDetailEntry"},{"$ref":"#/components/schemas/object.MultiSelectDetailEntry"},{"$ref":"#/components/schemas/object.DateDetailEntry"},{"$ref":"#/components/schemas/object.FileDetailEntry"},{"$ref":"#/components/schemas/object.CheckboxDetailEntry"},{"$ref":"#/components/schemas/object.UrlDetailEntry"},{"$ref":"#/components/schemas/object.EmailDetailEntry"},{"$ref":"#/components/schemas/object.PhoneDetailEntry"},{"$ref":"#/components/schemas/object.ObjectDetailEntry"}]},"id":{"example":"last_modified_date","type":"string"}},"type":"object"},"object.EmailDetailEntry":{"properties":{"email":{"example":"example@example.com","type":"string"},"name":{"example":"Email","type":"string"},"type":{"enum":["email"],"example":"email","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.FileDetailEntry":{"properties":{"file":{"example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"name":{"example":"File","type":"string"},"type":{"enum":["file"],"example":"file","type":"string"}},"type":"object"},"object.MultiSelectDetailEntry":{"properties":{"multi_select":{"items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"example":"Tag","type":"string"},"type":{"enum":["multi_select"],"example":"multi_select","type":"string"}},"type":"object"},"object.NumberDetailEntry":{"properties":{"name":{"example":"Size","type":"string"},"number":{"example":42,"type":"number"},"type":{"enum":["number"],"example":"number","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectDetailEntry":{"properties":{"name":{"example":"Assignee","type":"string"},"object":{"example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"type":{"enum":["object"],"example":"object","type":"string"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.PhoneDetailEntry":{"properties":{"name":{"example":"Phone","type":"string"},"phone":{"example":"+1234567890","type":"string"},"type":{"enum":["phone"],"example":"phone","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.SelectDetailEntry":{"properties":{"name":{"example":"Status","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"type":{"enum":["select"],"example":"select","type":"string"}},"type":"object"},"object.Tag":{"properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.TextDetailEntry":{"properties":{"name":{"example":"Description","type":"string"},"text":{"example":"Some text...","type":"string"},"type":{"enum":["text"],"example":"text","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.UrlDetailEntry":{"properties":{"name":{"example":"URL","type":"string"},"type":{"enum":["url"],"example":"url","type":"string"},"url":{"example":"https://example.com","type":"string"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"},"type":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["spaces"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["spaces"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["types"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index b73a1048d..61fbac290 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -2,7 +2,7 @@ "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CheckboxDetailEntry":{"properties":{"checkbox":{"example":true,"type":"boolean"},"name":{"example":"Done","type":"string"},"type":{"enum":["checkbox"],"example":"checkbox","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.DateDetailEntry":{"properties":{"date":{"example":"2024-02-14T12:34:56Z","type":"string"},"name":{"example":"Last modified date","type":"string"},"type":{"enum":["date"],"example":"date","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"oneOf":[{"$ref":"#/components/schemas/object.TextDetailEntry"},{"$ref":"#/components/schemas/object.NumberDetailEntry"},{"$ref":"#/components/schemas/object.SelectDetailEntry"},{"$ref":"#/components/schemas/object.MultiSelectDetailEntry"},{"$ref":"#/components/schemas/object.DateDetailEntry"},{"$ref":"#/components/schemas/object.FileDetailEntry"},{"$ref":"#/components/schemas/object.CheckboxDetailEntry"},{"$ref":"#/components/schemas/object.UrlDetailEntry"},{"$ref":"#/components/schemas/object.EmailDetailEntry"},{"$ref":"#/components/schemas/object.PhoneDetailEntry"},{"$ref":"#/components/schemas/object.ObjectDetailEntry"}]},"id":{"example":"last_modified_date","type":"string"}},"type":"object"},"object.EmailDetailEntry":{"properties":{"email":{"example":"example@example.com","type":"string"},"name":{"example":"Email","type":"string"},"type":{"enum":["email"],"example":"email","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.FileDetailEntry":{"properties":{"file":{"example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"name":{"example":"File","type":"string"},"type":{"enum":["file"],"example":"file","type":"string"}},"type":"object"},"object.MultiSelectDetailEntry":{"properties":{"multi_select":{"items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"example":"Tag","type":"string"},"type":{"enum":["multi_select"],"example":"multi_select","type":"string"}},"type":"object"},"object.NumberDetailEntry":{"properties":{"name":{"example":"Size","type":"string"},"number":{"example":42,"type":"number"},"type":{"enum":["number"],"example":"number","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectDetailEntry":{"properties":{"name":{"example":"Assignee","type":"string"},"object":{"example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"type":{"enum":["object"],"example":"object","type":"string"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.PhoneDetailEntry":{"properties":{"name":{"example":"Phone","type":"string"},"phone":{"example":"+1234567890","type":"string"},"type":{"enum":["phone"],"example":"phone","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.SelectDetailEntry":{"properties":{"name":{"example":"Status","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"type":{"enum":["select"],"example":"select","type":"string"}},"type":"object"},"object.Tag":{"properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.TextDetailEntry":{"properties":{"name":{"example":"Description","type":"string"},"text":{"example":"Some text...","type":"string"},"type":{"enum":["text"],"example":"text","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.UrlDetailEntry":{"properties":{"name":{"example":"URL","type":"string"},"type":{"enum":["url"],"example":"url","type":"string"},"url":{"example":"https://example.com","type":"string"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"},"type":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["spaces"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["spaces"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["types"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 46c5ce3aa..4c9f70447 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -1167,7 +1167,7 @@ paths: - bearerauth: [] summary: List members tags: - - spaces + - members /spaces/{space_id}/members/{member_id}: get: description: Fetches detailed information about a single member within a space. @@ -1216,7 +1216,7 @@ paths: - bearerauth: [] summary: Get member tags: - - spaces + - members /spaces/{space_id}/objects: get: description: Retrieves a paginated list of objects in the given space. The endpoint @@ -1726,7 +1726,7 @@ paths: - bearerauth: [] summary: List templates tags: - - types + - templates /spaces/{space_id}/types/{type_id}/templates/{template_id}: get: description: Fetches full details for one template associated with a particular @@ -1781,7 +1781,7 @@ paths: - bearerauth: [] summary: Get template tags: - - types + - templates /v1/spaces/{space_id}/lists/{list_id}/objects: get: description: Returns a paginated list of objects that are associated with a diff --git a/core/api/internal/object/handler.go b/core/api/internal/object/handler.go index c62f18768..e5fc3a76a 100644 --- a/core/api/internal/object/handler.go +++ b/core/api/internal/object/handler.go @@ -240,7 +240,7 @@ func GetTypeHandler(s *ObjectService) gin.HandlerFunc { // // @Summary List templates // @Description This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects. -// @Tags types +// @Tags templates // @Produce json // @Param space_id path string true "Space ID" // @Param type_id path string true "Type ID" @@ -280,7 +280,7 @@ func GetTemplatesHandler(s *ObjectService) gin.HandlerFunc { // // @Summary Get template // @Description Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields. -// @Tags types +// @Tags templates // @Produce json // @Param space_id path string true "Space ID" // @Param type_id path string true "Type ID" diff --git a/core/api/internal/space/handler.go b/core/api/internal/space/handler.go index e52dcb2f6..4ed1b0fb9 100644 --- a/core/api/internal/space/handler.go +++ b/core/api/internal/space/handler.go @@ -119,7 +119,7 @@ func CreateSpaceHandler(s *SpaceService) gin.HandlerFunc { // // @Summary List members // @Description Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights. -// @Tags spaces +// @Tags members // @Produce json // @Param space_id path string true "Space ID" // @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) @@ -154,7 +154,7 @@ func GetMembersHandler(s *SpaceService) gin.HandlerFunc { // // @Summary Get member // @Description Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments. -// @Tags spaces +// @Tags members // @Produce json // @Param space_id path string true "Space ID" // @Param member_id path string true "Member ID" From 9c5f2e4b30e62f3b29e1696502ffebfeeb85dde3 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 12 Mar 2025 13:06:03 +0100 Subject: [PATCH 049/132] GO-4459: Simplify filter to exclude templates from search results through type.uniqueKey --- core/api/internal/search/service.go | 15 ++-- core/api/internal/search/service_test.go | 97 +----------------------- core/api/util/util.go | 3 +- 3 files changed, 11 insertions(+), 104 deletions(-) diff --git a/core/api/internal/search/service.go b/core/api/internal/search/service.go index dcc14c89a..0f62699b7 100644 --- a/core/api/internal/search/service.go +++ b/core/api/internal/search/service.go @@ -56,7 +56,7 @@ func (s *SearchService) GlobalSearch(ctx context.Context, request SearchRequest, allResponses := make([]*pb.RpcObjectSearchResponse, 0, len(spaces)) for _, space := range spaces { // Resolve template type and object type IDs per space, as they are unique per space - templateFilter := s.prepareTemplateFilter(space.Id) + templateFilter := s.prepareTemplateFilter() typeFilters := s.prepareObjectTypeFilters(space.Id, request.Types) filters := s.combineFilters(model.BlockContentDataviewFilter_And, baseFilters, templateFilter, queryFilters, typeFilters) @@ -117,7 +117,7 @@ func (s *SearchService) GlobalSearch(ctx context.Context, request SearchRequest, // Search retrieves a paginated list of objects from a specific space that match the search parameters. func (s *SearchService) Search(ctx context.Context, spaceId string, request SearchRequest, offset int, limit int) (objects []object.Object, total int, hasMore bool, err error) { baseFilters := s.prepareBaseFilters() - templateFilter := s.prepareTemplateFilter(spaceId) + templateFilter := s.prepareTemplateFilter() queryFilters := s.prepareQueryFilter(request.Query) typeFilters := s.prepareObjectTypeFilters(spaceId, request.Types) filters := s.combineFilters(model.BlockContentDataviewFilter_And, baseFilters, templateFilter, queryFilters, typeFilters) @@ -203,18 +203,13 @@ func (s *SearchService) prepareBaseFilters() []*model.BlockContentDataviewFilter } // prepareTemplateFilter returns a filter that excludes templates from the search results. -func (s *SearchService) prepareTemplateFilter(spaceId string) []*model.BlockContentDataviewFilter { - typeId, err := util.ResolveUniqueKeyToTypeId(s.mw, spaceId, "ot-template") - if err != nil { - return nil - } - +func (s *SearchService) prepareTemplateFilter() []*model.BlockContentDataviewFilter { return []*model.BlockContentDataviewFilter{ { Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyType.String(), + RelationKey: "type.uniqueKey", Condition: model.BlockContentDataviewFilter_NotEqual, - Value: pbtypes.String(typeId), + Value: pbtypes.String("ot-template"), }, } } diff --git a/core/api/internal/search/service_test.go b/core/api/internal/search/service_test.go index c54e69f82..65cb21fc7 100644 --- a/core/api/internal/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -116,28 +116,6 @@ func TestSearchService_GlobalSearch(t *testing.T) { Error: &pb.RpcWorkspaceOpenResponseError{Code: pb.RpcWorkspaceOpenResponseError_NULL}, }).Once() - // Mock template type resolution - fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ - SpaceId: mockedSpaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyUniqueKey.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String("ot-template"), - }, - }, - Keys: []string{bundle.RelationKeyId.String()}, - }).Return(&pb.RpcObjectSearchResponse{ - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - bundle.RelationKeyId.String(): pbtypes.String(mockedType), - }, - }, - }, - }).Once() - // Mock objects in space fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ SpaceId: mockedSpaceId, @@ -168,9 +146,9 @@ func TestSearchService_GlobalSearch(t *testing.T) { }, { Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyType.String(), + RelationKey: "type.uniqueKey", Condition: model.BlockContentDataviewFilter_NotEqual, - Value: pbtypes.String(mockedType), + Value: pbtypes.String("ot-template"), }, { Operator: model.BlockContentDataviewFilter_Or, @@ -430,28 +408,6 @@ func TestSearchService_Search(t *testing.T) { ctx := context.Background() fx := newFixture(t) - // Mock template type resolution - fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ - SpaceId: mockedSpaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyUniqueKey.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String("ot-template"), - }, - }, - Keys: []string{bundle.RelationKeyId.String()}, - }).Return(&pb.RpcObjectSearchResponse{ - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - bundle.RelationKeyId.String(): pbtypes.String(mockedType), - }, - }, - }, - }).Once() - // Mock objects in space fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ SpaceId: mockedSpaceId, @@ -482,9 +438,9 @@ func TestSearchService_Search(t *testing.T) { }, { Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyType.String(), + RelationKey: "type.uniqueKey", Condition: model.BlockContentDataviewFilter_NotEqual, - Value: pbtypes.String(mockedType), + Value: pbtypes.String("ot-template"), }, { Operator: model.BlockContentDataviewFilter_Or, @@ -581,29 +537,6 @@ func TestSearchService_Search(t *testing.T) { // given ctx := context.Background() fx := newFixture(t) - - // Mock template type resolution - fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ - SpaceId: mockedSpaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyUniqueKey.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String("ot-template"), - }, - }, - Keys: []string{bundle.RelationKeyId.String()}, - }).Return(&pb.RpcObjectSearchResponse{ - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - bundle.RelationKeyId.String(): pbtypes.String(mockedType), - }, - }, - }, - }).Once() - fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{}, Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, @@ -624,28 +557,6 @@ func TestSearchService_Search(t *testing.T) { ctx := context.Background() fx := newFixture(t) - // Mock template type resolution - fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ - SpaceId: mockedSpaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyUniqueKey.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String("ot-template"), - }, - }, - Keys: []string{bundle.RelationKeyId.String()}, - }).Return(&pb.RpcObjectSearchResponse{ - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - bundle.RelationKeyId.String(): pbtypes.String(mockedType), - }, - }, - }, - }).Once() - fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_UNKNOWN_ERROR}, }).Once() diff --git a/core/api/util/util.go b/core/api/util/util.go index fe62e5409..5447c2d3e 100644 --- a/core/api/util/util.go +++ b/core/api/util/util.go @@ -67,8 +67,8 @@ func GetIcon(accountInfo *model.AccountInfo, iconEmoji string, iconImage string, return Icon{} } +// ResolveUniqueKeyToTypeId resolves the unique key to the type's ID func ResolveUniqueKeyToTypeId(mw service.ClientCommandsServer, spaceId string, uniqueKey string) (typeId string, err error) { - // Call ObjectSearch for type with unique key and return the type's ID resp := mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ @@ -92,6 +92,7 @@ func ResolveUniqueKeyToTypeId(mw service.ClientCommandsServer, spaceId string, u return resp.Records[0].Fields[bundle.RelationKeyId.String()].GetStringValue(), nil } +// ResolveRelationKeyToRelationName resolves the relation key to the relation's name func ResolveRelationKeyToRelationName(mw service.ClientCommandsServer, spaceId string, relationKey string) (relation string, err error) { resp := mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ SpaceId: spaceId, From 6a1d667e44018b923428b453fd505f8c4ccb07e3 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 12 Mar 2025 18:58:41 +0100 Subject: [PATCH 050/132] GO-4459: Refactor object details to properties and update icon --- core/api/docs/docs.go | 2 +- core/api/docs/swagger.json | 2 +- core/api/docs/swagger.yaml | 256 +++++++---------------- core/api/internal/object/handler.go | 2 +- core/api/internal/object/model.go | 132 +++--------- core/api/internal/object/service.go | 135 ++++++------ core/api/internal/object/service_test.go | 68 +++--- core/api/internal/search/service_test.go | 31 ++- core/api/internal/space/service_test.go | 8 +- core/api/util/util.go | 29 +-- 10 files changed, 237 insertions(+), 428 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 38624de87..15da18204 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -6,7 +6,7 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CheckboxDetailEntry":{"properties":{"checkbox":{"example":true,"type":"boolean"},"name":{"example":"Done","type":"string"},"type":{"enum":["checkbox"],"example":"checkbox","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.DateDetailEntry":{"properties":{"date":{"example":"2024-02-14T12:34:56Z","type":"string"},"name":{"example":"Last modified date","type":"string"},"type":{"enum":["date"],"example":"date","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"oneOf":[{"$ref":"#/components/schemas/object.TextDetailEntry"},{"$ref":"#/components/schemas/object.NumberDetailEntry"},{"$ref":"#/components/schemas/object.SelectDetailEntry"},{"$ref":"#/components/schemas/object.MultiSelectDetailEntry"},{"$ref":"#/components/schemas/object.DateDetailEntry"},{"$ref":"#/components/schemas/object.FileDetailEntry"},{"$ref":"#/components/schemas/object.CheckboxDetailEntry"},{"$ref":"#/components/schemas/object.UrlDetailEntry"},{"$ref":"#/components/schemas/object.EmailDetailEntry"},{"$ref":"#/components/schemas/object.PhoneDetailEntry"},{"$ref":"#/components/schemas/object.ObjectDetailEntry"}]},"id":{"example":"last_modified_date","type":"string"}},"type":"object"},"object.EmailDetailEntry":{"properties":{"email":{"example":"example@example.com","type":"string"},"name":{"example":"Email","type":"string"},"type":{"enum":["email"],"example":"email","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.FileDetailEntry":{"properties":{"file":{"example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"name":{"example":"File","type":"string"},"type":{"enum":["file"],"example":"file","type":"string"}},"type":"object"},"object.MultiSelectDetailEntry":{"properties":{"multi_select":{"items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"example":"Tag","type":"string"},"type":{"enum":["multi_select"],"example":"multi_select","type":"string"}},"type":"object"},"object.NumberDetailEntry":{"properties":{"name":{"example":"Size","type":"string"},"number":{"example":42,"type":"number"},"type":{"enum":["number"],"example":"number","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectDetailEntry":{"properties":{"name":{"example":"Assignee","type":"string"},"object":{"example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"type":{"enum":["object"],"example":"object","type":"string"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.PhoneDetailEntry":{"properties":{"name":{"example":"Phone","type":"string"},"phone":{"example":"+1234567890","type":"string"},"type":{"enum":["phone"],"example":"phone","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.SelectDetailEntry":{"properties":{"name":{"example":"Status","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"type":{"enum":["select"],"example":"select","type":"string"}},"type":"object"},"object.Tag":{"properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.TextDetailEntry":{"properties":{"name":{"example":"Description","type":"string"},"text":{"example":"Some text...","type":"string"},"type":{"enum":["text"],"example":"text","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.UrlDetailEntry":{"properties":{"name":{"example":"URL","type":"string"},"type":{"enum":["url"],"example":"url","type":"string"},"url":{"example":"https://example.com","type":"string"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"},"type":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"properties":{"checkbox":{"example":true,"type":"boolean"},"date":{"example":"2025-02-14T12:34:56Z","type":"string"},"email":{"example":"example@example.com","type":"string"},"file":{"example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"example":"last_modified_date","type":"string"},"multi_select":{"items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"example":"Last modified date","type":"string"},"number":{"example":42,"type":"number"},"object":{"example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"example":"Some text...","type":"string"},"url":{"example":"https://example.com","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Tag":{"properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 61fbac290..18182dae9 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,5 +1,5 @@ { - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CheckboxDetailEntry":{"properties":{"checkbox":{"example":true,"type":"boolean"},"name":{"example":"Done","type":"string"},"type":{"enum":["checkbox"],"example":"checkbox","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.DateDetailEntry":{"properties":{"date":{"example":"2024-02-14T12:34:56Z","type":"string"},"name":{"example":"Last modified date","type":"string"},"type":{"enum":["date"],"example":"date","type":"string"}},"type":"object"},"object.Detail":{"properties":{"details":{"oneOf":[{"$ref":"#/components/schemas/object.TextDetailEntry"},{"$ref":"#/components/schemas/object.NumberDetailEntry"},{"$ref":"#/components/schemas/object.SelectDetailEntry"},{"$ref":"#/components/schemas/object.MultiSelectDetailEntry"},{"$ref":"#/components/schemas/object.DateDetailEntry"},{"$ref":"#/components/schemas/object.FileDetailEntry"},{"$ref":"#/components/schemas/object.CheckboxDetailEntry"},{"$ref":"#/components/schemas/object.UrlDetailEntry"},{"$ref":"#/components/schemas/object.EmailDetailEntry"},{"$ref":"#/components/schemas/object.PhoneDetailEntry"},{"$ref":"#/components/schemas/object.ObjectDetailEntry"}]},"id":{"example":"last_modified_date","type":"string"}},"type":"object"},"object.EmailDetailEntry":{"properties":{"email":{"example":"example@example.com","type":"string"},"name":{"example":"Email","type":"string"},"type":{"enum":["email"],"example":"email","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.FileDetailEntry":{"properties":{"file":{"example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"name":{"example":"File","type":"string"},"type":{"enum":["file"],"example":"file","type":"string"}},"type":"object"},"object.MultiSelectDetailEntry":{"properties":{"multi_select":{"items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"example":"Tag","type":"string"},"type":{"enum":["multi_select"],"example":"multi_select","type":"string"}},"type":"object"},"object.NumberDetailEntry":{"properties":{"name":{"example":"Size","type":"string"},"number":{"example":42,"type":"number"},"type":{"enum":["number"],"example":"number","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"details":{"description":"The details of the object","items":{"$ref":"#/components/schemas/object.Detail"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectDetailEntry":{"properties":{"name":{"example":"Assignee","type":"string"},"object":{"example":["['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"type":{"enum":["object"],"example":"object","type":"string"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.PhoneDetailEntry":{"properties":{"name":{"example":"Phone","type":"string"},"phone":{"example":"+1234567890","type":"string"},"type":{"enum":["phone"],"example":"phone","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.SelectDetailEntry":{"properties":{"name":{"example":"Status","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"type":{"enum":["select"],"example":"select","type":"string"}},"type":"object"},"object.Tag":{"properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.TextDetailEntry":{"properties":{"name":{"example":"Description","type":"string"},"text":{"example":"Some text...","type":"string"},"type":{"enum":["text"],"example":"text","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.UrlDetailEntry":{"properties":{"name":{"example":"URL","type":"string"},"type":{"enum":["url"],"example":"url","type":"string"},"url":{"example":"https://example.com","type":"string"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"},"type":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"properties":{"checkbox":{"example":true,"type":"boolean"},"date":{"example":"2025-02-14T12:34:56Z","type":"string"},"email":{"example":"example@example.com","type":"string"},"file":{"example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"example":"last_modified_date","type":"string"},"multi_select":{"items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"example":"Last modified date","type":"string"},"number":{"example":42,"type":"number"},"object":{"example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"example":"Some text...","type":"string"},"url":{"example":"https://example.com","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Tag":{"properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 4c9f70447..98f3cdeeb 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -68,20 +68,6 @@ components: example: VerticalAlignTop type: string type: object - object.CheckboxDetailEntry: - properties: - checkbox: - example: true - type: boolean - name: - example: Done - type: string - type: - enum: - - checkbox - example: checkbox - type: string - type: object object.CreateObjectRequest: properties: body: @@ -113,53 +99,6 @@ components: example: bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge type: string type: object - object.DateDetailEntry: - properties: - date: - example: "2024-02-14T12:34:56Z" - type: string - name: - example: Last modified date - type: string - type: - enum: - - date - example: date - type: string - type: object - object.Detail: - properties: - details: - oneOf: - - $ref: '#/components/schemas/object.TextDetailEntry' - - $ref: '#/components/schemas/object.NumberDetailEntry' - - $ref: '#/components/schemas/object.SelectDetailEntry' - - $ref: '#/components/schemas/object.MultiSelectDetailEntry' - - $ref: '#/components/schemas/object.DateDetailEntry' - - $ref: '#/components/schemas/object.FileDetailEntry' - - $ref: '#/components/schemas/object.CheckboxDetailEntry' - - $ref: '#/components/schemas/object.UrlDetailEntry' - - $ref: '#/components/schemas/object.EmailDetailEntry' - - $ref: '#/components/schemas/object.PhoneDetailEntry' - - $ref: '#/components/schemas/object.ObjectDetailEntry' - id: - example: last_modified_date - type: string - type: object - object.EmailDetailEntry: - properties: - email: - example: example@example.com - type: string - name: - example: Email - type: string - type: - enum: - - email - example: email - type: string - type: object object.File: description: The file of the block, if applicable properties: @@ -191,54 +130,6 @@ components: description: The type of the file type: string type: object - object.FileDetailEntry: - properties: - file: - example: - - '[''bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge'']' - items: - type: string - type: array - uniqueItems: false - name: - example: File - type: string - type: - enum: - - file - example: file - type: string - type: object - object.MultiSelectDetailEntry: - properties: - multi_select: - items: - $ref: '#/components/schemas/object.Tag' - type: array - uniqueItems: false - name: - example: Tag - type: string - type: - enum: - - multi_select - example: multi_select - type: string - type: object - object.NumberDetailEntry: - properties: - name: - example: Size - type: string - number: - example: 42 - type: number - type: - enum: - - number - example: number - type: string - type: object object.Object: description: The object properties: @@ -248,12 +139,6 @@ components: $ref: '#/components/schemas/object.Block' type: array uniqueItems: false - details: - description: The details of the object - items: - $ref: '#/components/schemas/object.Detail' - type: array - uniqueItems: false icon: $ref: '#/components/schemas/util.Icon' id: @@ -272,6 +157,12 @@ components: description: The data model of the object example: object type: string + properties: + description: The properties of the object + items: + $ref: '#/components/schemas/object.Property' + type: array + uniqueItems: false root_id: description: The id of the object's root example: bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u @@ -288,41 +179,75 @@ components: type: $ref: '#/components/schemas/object.Type' type: object - object.ObjectDetailEntry: - properties: - name: - example: Assignee - type: string - object: - example: - - '[''bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge'']' - items: - type: string - type: array - uniqueItems: false - type: - enum: - - object - example: object - type: string - type: object object.ObjectResponse: properties: object: $ref: '#/components/schemas/object.Object' type: object - object.PhoneDetailEntry: + object.Property: properties: - name: - example: Phone + checkbox: + example: true + type: boolean + date: + example: "2025-02-14T12:34:56Z" type: string + email: + example: example@example.com + type: string + file: + example: + - '[''fileId'']' + items: + type: string + type: array + uniqueItems: false + format: + enum: + - text + - number + - select + - multi_select + - date + - file + - checkbox + - url + - email + - phone + - object + example: date + type: string + id: + example: last_modified_date + type: string + multi_select: + items: + $ref: '#/components/schemas/object.Tag' + type: array + uniqueItems: false + name: + example: Last modified date + type: string + number: + example: 42 + type: number + object: + example: + - '[''objectId'']' + items: + type: string + type: array + uniqueItems: false phone: example: "+1234567890" type: string - type: - enum: - - phone - example: phone + select: + $ref: '#/components/schemas/object.Tag' + text: + example: Some text... + type: string + url: + example: https://example.com type: string type: object object.Relation: @@ -331,19 +256,6 @@ components: id: type: string type: object - object.SelectDetailEntry: - properties: - name: - example: Status - type: string - select: - $ref: '#/components/schemas/object.Tag' - type: - enum: - - select - example: select - type: string - type: object object.Tag: properties: color: @@ -419,20 +331,6 @@ components: example: Some text... type: string type: object - object.TextDetailEntry: - properties: - name: - example: Description - type: string - text: - example: Some text... - type: string - type: - enum: - - text - example: text - type: string - type: object object.Type: description: The type of the object properties: @@ -464,20 +362,6 @@ components: type: $ref: '#/components/schemas/object.Type' type: object - object.UrlDetailEntry: - properties: - name: - example: URL - type: string - type: - enum: - - url - example: url - type: string - url: - example: https://example.com - type: string - type: object pagination.PaginatedResponse-object_Object: properties: data: @@ -749,11 +633,7 @@ components: description: The file of the icon example: http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay type: string - name: - description: The name of the icon - example: document - type: string - type: + format: description: The type of the icon enum: - emoji @@ -761,6 +641,10 @@ components: - icon example: emoji type: string + name: + description: The name of the icon + example: document + type: string type: object util.NotFoundError: properties: diff --git a/core/api/internal/object/handler.go b/core/api/internal/object/handler.go index e5fc3a76a..433a63b4f 100644 --- a/core/api/internal/object/handler.go +++ b/core/api/internal/object/handler.go @@ -150,7 +150,7 @@ func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { code := util.MapErrorCode(err, util.ErrToCode(ErrInputMissingSource, http.StatusBadRequest), util.ErrToCode(ErrFailedCreateObject, http.StatusInternalServerError), - util.ErrToCode(ErrFailedSetRelationFeatured, http.StatusInternalServerError), + util.ErrToCode(ErrFailedSetPropertyFeatured, http.StatusInternalServerError), util.ErrToCode(ErrFailedFetchBookmark, http.StatusInternalServerError), util.ErrToCode(ErrObjectNotFound, http.StatusInternalServerError), util.ErrToCode(ErrFailedRetrieveObject, http.StatusInternalServerError), diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index 19ddf66a2..42a6ae897 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -17,17 +17,17 @@ type ObjectResponse struct { } type Object struct { - Object string `json:"object" example:"object"` // The data model of the object - Id string `json:"id" example:"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ"` // The id of the object - Name string `json:"name" example:"My object"` // The name of the object - Icon util.Icon `json:"icon"` // The icon of the object - Type Type `json:"type"` // The type of the object - Snippet string `json:"snippet" example:"The beginning of the object body..."` // The snippet of the object, especially important for notes as they don't have a name - Layout string `json:"layout" example:"basic"` // The layout of the object - SpaceId string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` // The id of the space the object is in - RootId string `json:"root_id" example:"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u"` // The id of the object's root - Blocks []Block `json:"blocks"` // The blocks of the object - Details []Detail `json:"details"` // The details of the object + Object string `json:"object" example:"object"` // The data model of the object + Id string `json:"id" example:"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ"` // The id of the object + Name string `json:"name" example:"My object"` // The name of the object + Icon util.Icon `json:"icon"` // The icon of the object + Type Type `json:"type"` // The type of the object + Snippet string `json:"snippet" example:"The beginning of the object body..."` // The snippet of the object, especially important for notes as they don't have a name + Layout string `json:"layout" example:"basic"` // The layout of the object + SpaceId string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` // The id of the space the object is in + RootId string `json:"root_id" example:"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u"` // The id of the object's root + Blocks []Block `json:"blocks"` // The blocks of the object + Properties []Property `json:"properties"` // The properties of the object } type Block struct { @@ -66,103 +66,23 @@ type Relation struct { Id string } -type Detail struct { - Id string `json:"id" example:"last_modified_date"` - Details DetailEntry `json:"details" oneOf:"TextDetailEntry,NumberDetailEntry,SelectDetailEntry,MultiSelectDetailEntry,DateDetailEntry,FileDetailEntry,CheckboxDetailEntry,UrlDetailEntry,EmailDetailEntry,PhoneDetailEntry,ObjectDetailEntry"` +type Property struct { + Id string `json:"id" example:"last_modified_date"` + Name string `json:"name" example:"Last modified date"` + Format string `json:"format" example:"date" enums:"text,number,select,multi_select,date,file,checkbox,url,email,phone,object"` + Text *string `json:"text,omitempty" example:"Some text..."` + Number *float64 `json:"number,omitempty" example:"42"` + Select *Tag `json:"select,omitempty"` + MultiSelect []Tag `json:"multi_select,omitempty"` + Date *string `json:"date,omitempty" example:"2025-02-14T12:34:56Z"` + File []string `json:"file,omitempty" example:"['fileId']"` + Checkbox *bool `json:"checkbox,omitempty" example:"true"` + Url *string `json:"url,omitempty" example:"https://example.com"` + Email *string `json:"email,omitempty" example:"example@example.com"` + Phone *string `json:"phone,omitempty" example:"+1234567890"` + Object []string `json:"object,omitempty" example:"['objectId']"` } -type DetailEntry interface { - GetType() string -} - -type TextDetailEntry struct { - Name string `json:"name" example:"Description"` - Type string `json:"type" example:"text" enums:"text"` - Text string `json:"text" example:"Some text..."` -} - -func (t TextDetailEntry) GetType() string { return t.Type } - -type NumberDetailEntry struct { - Name string `json:"name" example:"Size"` - Type string `json:"type" example:"number" enums:"number"` - Number float64 `json:"number" example:"42"` -} - -func (n NumberDetailEntry) GetType() string { return n.Type } - -type SelectDetailEntry struct { - Name string `json:"name" example:"Status"` - Type string `json:"type" example:"select" enums:"select"` - Select *Tag `json:"select"` -} - -func (s SelectDetailEntry) GetType() string { return s.Type } - -type MultiSelectDetailEntry struct { - Name string `json:"name" example:"Tag"` - Type string `json:"type" example:"multi_select" enums:"multi_select"` - MultiSelect []Tag `json:"multi_select"` -} - -func (m MultiSelectDetailEntry) GetType() string { return m.Type } - -type DateDetailEntry struct { - Name string `json:"name" example:"Last modified date"` - Type string `json:"type" example:"date" enums:"date"` - Date string `json:"date" example:"2024-02-14T12:34:56Z"` -} - -func (d DateDetailEntry) GetType() string { return d.Type } - -type FileDetailEntry struct { - Name string `json:"name" example:"File"` - Type string `json:"type" example:"file" enums:"file"` - File []string `json:"file" example:"['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"` -} - -func (f FileDetailEntry) GetType() string { return f.Type } - -type CheckboxDetailEntry struct { - Name string `json:"name" example:"Done"` - Type string `json:"type" example:"checkbox" enums:"checkbox"` - Checkbox bool `json:"checkbox" example:"true"` -} - -func (c CheckboxDetailEntry) GetType() string { return c.Type } - -type UrlDetailEntry struct { - Name string `json:"name" example:"URL"` - Type string `json:"type" example:"url" enums:"url"` - Url string `json:"url" example:"https://example.com"` -} - -func (u UrlDetailEntry) GetType() string { return u.Type } - -type EmailDetailEntry struct { - Name string `json:"name" example:"Email"` - Type string `json:"type" example:"email" enums:"email"` - Email string `json:"email" example:"example@example.com"` -} - -func (e EmailDetailEntry) GetType() string { return e.Type } - -type PhoneDetailEntry struct { - Name string `json:"name" example:"Phone"` - Type string `json:"type" example:"phone" enums:"phone"` - Phone string `json:"phone" example:"+1234567890"` -} - -func (p PhoneDetailEntry) GetType() string { return p.Type } - -type ObjectDetailEntry struct { - Name string `json:"name" example:"Assignee"` - Type string `json:"type" example:"object" enums:"object"` - Object []string `json:"object" example:"['bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5iutge']"` -} - -func (o ObjectDetailEntry) GetType() string { return o.Type } - type Tag struct { Id string `json:"id" example:"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq"` // The id of the tag Name string `json:"name" example:"in-progress"` // The name of the tag diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index c5a04027b..39e648320 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -27,7 +27,7 @@ var ( ErrFailedDeleteObject = errors.New("failed to delete object") ErrFailedCreateObject = errors.New("failed to create object") ErrInputMissingSource = errors.New("source is missing for bookmark") - ErrFailedSetRelationFeatured = errors.New("failed to set relation featured") + ErrFailedSetPropertyFeatured = errors.New("failed to set property featured") ErrFailedFetchBookmark = errors.New("failed to fetch bookmark") ErrFailedCreateBlock = errors.New("failed to create block") ErrFailedPasteBody = errors.New("failed to paste body") @@ -43,7 +43,7 @@ var ( ErrTemplateNotFound = errors.New("template not found") ) -var excludedSystemRelations = map[string]bool{ +var excludedSystemProperties = map[string]bool{ bundle.RelationKeyId.String(): true, bundle.RelationKeySpaceId.String(): true, bundle.RelationKeyName.String(): true, @@ -191,17 +191,17 @@ func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId icon := util.GetIcon(s.AccountInfo, details[bundle.RelationKeyIconEmoji.String()].GetStringValue(), details[bundle.RelationKeyIconImage.String()].GetStringValue(), details[bundle.RelationKeyIconName.String()].GetStringValue(), details[bundle.RelationKeyIconOption.String()].GetNumberValue()) object := Object{ - Object: "object", - Id: details[bundle.RelationKeyId.String()].GetStringValue(), - Name: details[bundle.RelationKeyName.String()].GetStringValue(), - Icon: icon, - Type: s.getTypeFromDetails(details[bundle.RelationKeyType.String()].GetStringValue(), resp.ObjectView.Details), - Snippet: details[bundle.RelationKeySnippet.String()].GetStringValue(), - Layout: model.ObjectTypeLayout_name[int32(details[bundle.RelationKeyResolvedLayout.String()].GetNumberValue())], - SpaceId: details[bundle.RelationKeySpaceId.String()].GetStringValue(), - RootId: resp.ObjectView.RootId, - Blocks: s.getBlocks(resp), - Details: s.getDetails(resp), + Object: "object", + Id: details[bundle.RelationKeyId.String()].GetStringValue(), + Name: details[bundle.RelationKeyName.String()].GetStringValue(), + Icon: icon, + Type: s.getTypeFromDetails(details[bundle.RelationKeyType.String()].GetStringValue(), resp.ObjectView.Details), + Snippet: details[bundle.RelationKeySnippet.String()].GetStringValue(), + Layout: model.ObjectTypeLayout_name[int32(details[bundle.RelationKeyResolvedLayout.String()].GetNumberValue())], + SpaceId: details[bundle.RelationKeySpaceId.String()].GetStringValue(), + RootId: resp.ObjectView.RootId, + Blocks: s.getBlocks(resp), + Properties: s.getProperties(resp), } return object, nil @@ -263,7 +263,7 @@ func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, reques if relAddFeatResp.Error.Code != pb.RpcObjectRelationAddFeaturedResponseError_NULL { object, _ := s.GetObject(ctx, spaceId, resp.ObjectId) // nolint:errcheck - return object, ErrFailedSetRelationFeatured + return object, ErrFailedSetPropertyFeatured } } @@ -521,40 +521,34 @@ func (s *ObjectService) getTypeFromDetails(typeId string, details []*model.Objec } } -// getDetails returns a list of details by iterating over all relations found in the RelationLinks and mapping their format and value. -func (s *ObjectService) getDetails(resp *pb.RpcObjectShowResponse) []Detail { - relationFormatMap := s.getRelationFormatMap(resp.ObjectView.RelationLinks) - linkedRelations := resp.ObjectView.RelationLinks +// getProperties returns a list of properties by iterating over all properties found in the RelationLinks and mapping their format and value. +func (s *ObjectService) getProperties(resp *pb.RpcObjectShowResponse) []Property { + propertyFormatMap := s.getPropertyFormatMap(resp.ObjectView.RelationLinks) + linkedProperties := resp.ObjectView.RelationLinks primaryDetailFields := resp.ObjectView.Details[0].Details.Fields - var details []Detail - for _, r := range linkedRelations { + var properties []Property + for _, r := range linkedProperties { key := r.Key - if _, isExcluded := excludedSystemRelations[key]; isExcluded { + if _, isExcluded := excludedSystemProperties[key]; isExcluded { continue } if _, ok := primaryDetailFields[key]; !ok { continue } - id, name := s.getRelation(key, resp) - format := relationFormatMap[key] + id, name := s.getProperty(key, resp) + format := propertyFormatMap[key] convertedVal := s.convertValue(key, primaryDetailFields[key], format, resp.ObjectView.Details) if s.isMissingObject(convertedVal) { continue } - entry := s.createDetailEntry(name, format, convertedVal) - if entry != nil { - details = append(details, Detail{ - Id: id, - Details: entry, - }) - } + properties = append(properties, s.buildProperty(id, name, format, convertedVal)) } - return details + return properties } // isMissingObject returns true if val indicates a "_missing_object" placeholder. @@ -578,58 +572,64 @@ func (s *ObjectService) isMissingObject(val interface{}) bool { return false } -// createDetailEntry creates a DetailEntry based on the format and converted value. -func (s *ObjectService) createDetailEntry(name, format string, val interface{}) DetailEntry { +// buildProperty creates a Property based on the format and converted value. +func (s *ObjectService) buildProperty(id string, name string, format string, val interface{}) Property { + prop := &Property{ + Id: id, + Name: name, + Format: format, + } + switch format { case "text": if str, ok := val.(string); ok { - return TextDetailEntry{Name: name, Type: "text", Text: str} + prop.Text = &str } case "number": if num, ok := val.(float64); ok { - return NumberDetailEntry{Name: name, Type: "number", Number: num} + prop.Number = &num } case "select": if sel, ok := val.(Tag); ok { - return SelectDetailEntry{Name: name, Type: "select", Select: &sel} + prop.Select = &sel } case "multi_select": if ms, ok := val.([]Tag); ok { - return MultiSelectDetailEntry{Name: name, Type: "multi_select", MultiSelect: ms} + prop.MultiSelect = ms } case "date": if dateStr, ok := val.(string); ok { - return DateDetailEntry{Name: name, Type: "date", Date: dateStr} + prop.Date = &dateStr } case "file": - if file, ok := val.([]interface{}); ok { + if fileList, ok := val.([]interface{}); ok { var files []string - for _, v := range file { + for _, v := range fileList { if str, ok := v.(string); ok { files = append(files, str) } } - return FileDetailEntry{Name: name, Type: "file", File: files} + prop.File = files } case "checkbox": if cb, ok := val.(bool); ok { - return CheckboxDetailEntry{Name: name, Type: "checkbox", Checkbox: cb} + prop.Checkbox = &cb } case "url": - if url, ok := val.(string); ok { - return UrlDetailEntry{Name: name, Type: "url", Url: url} + if urlStr, ok := val.(string); ok { + prop.Url = &urlStr } case "email": if email, ok := val.(string); ok { - return EmailDetailEntry{Name: name, Type: "email", Email: email} + prop.Email = &email } case "phone": if phone, ok := val.(string); ok { - return PhoneDetailEntry{Name: name, Type: "phone", Phone: phone} + prop.Phone = &phone } case "object": if obj, ok := val.(string); ok { - return ObjectDetailEntry{Name: name, Type: "object", Object: []string{obj}} + prop.Object = []string{obj} } else if objSlice, ok := val.([]interface{}); ok { var objects []string for _, v := range objSlice { @@ -637,18 +637,19 @@ func (s *ObjectService) createDetailEntry(name, format string, val interface{}) objects = append(objects, str) } } - return ObjectDetailEntry{Name: name, Type: "object", Object: objects} + prop.Object = objects } default: if str, ok := val.(string); ok { - return TextDetailEntry{Name: name, Type: "text", Text: str} + prop.Text = &str } } - return nil + + return *prop } -// getRelationName returns the relation id and relation name from the ObjectShowResponse. -func (s *ObjectService) getRelation(key string, resp *pb.RpcObjectShowResponse) (string, string) { +// getProperty returns the property id and name from the ObjectShowResponse. +func (s *ObjectService) getProperty(key string, resp *pb.RpcObjectShowResponse) (string, string) { // Handle special cases first switch key { case bundle.RelationKeyCreator.String(): @@ -657,11 +658,11 @@ func (s *ObjectService) getRelation(key string, resp *pb.RpcObjectShowResponse) return "created_date", "Created Date" } - if relation, err := bundle.GetRelation(domain.RelationKey(key)); err == nil { - return strcase.ToSnake(key), relation.Name + if property, err := bundle.GetRelation(domain.RelationKey(key)); err == nil { + return strcase.ToSnake(key), property.Name } - // Fallback to resolving the relation name + // Fallback to resolving the property name spaceId := resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue() if name, err2 := util.ResolveRelationKeyToRelationName(s.mw, spaceId, key); err2 == nil { return key, name @@ -717,23 +718,23 @@ func (s *ObjectService) convertValue(key string, value *types.Value, format stri } } -// getRelationFormatMapFromResponse returns the map of relation key to relation format from the ObjectShowResponse. -func (s *ObjectService) getRelationFormatMap(relationLinks []*model.RelationLink) map[string]string { - relationFormatToName := make(map[int32]string, len(model.RelationFormat_name)) +// getPropertyFormatMap returns the map of property key to property format from the ObjectShowResponse. +func (s *ObjectService) getPropertyFormatMap(propertyLinks []*model.RelationLink) map[string]string { + propertyFormatToName := make(map[int32]string, len(model.RelationFormat_name)) for k, v := range model.RelationFormat_name { - relationFormatToName[k] = v + propertyFormatToName[k] = v } - relationFormatToName[int32(model.RelationFormat_longtext)] = "text" - relationFormatToName[int32(model.RelationFormat_shorttext)] = "text" - relationFormatToName[int32(model.RelationFormat_tag)] = "multi_select" - relationFormatToName[int32(model.RelationFormat_status)] = "select" + propertyFormatToName[int32(model.RelationFormat_longtext)] = "text" + propertyFormatToName[int32(model.RelationFormat_shorttext)] = "text" + propertyFormatToName[int32(model.RelationFormat_tag)] = "multi_select" + propertyFormatToName[int32(model.RelationFormat_status)] = "select" - relationFormatMap := map[string]string{} - for _, detail := range relationLinks { - relationFormatMap[detail.Key] = relationFormatToName[int32(detail.Format)] + propertyFormatMap := map[string]string{} + for _, detail := range propertyLinks { + propertyFormatMap[detail.Key] = propertyFormatToName[int32(detail.Format)] } - return relationFormatMap + return propertyFormatMap } // TODO: remove once bug of select option not being returned in details is fixed diff --git a/core/api/internal/object/service_test.go b/core/api/internal/object/service_test.go index c10f0137b..c964f2a4d 100644 --- a/core/api/internal/object/service_test.go +++ b/core/api/internal/object/service_test.go @@ -228,26 +228,26 @@ func TestObjectService_ListObjects(t *testing.T) { require.Equal(t, mockedTypeId, objects[0].Type.Id) require.Equal(t, mockedTypeName, objects[0].Type.Name) require.Equal(t, mockedTypeUniqueKey, objects[0].Type.UniqueKey) - require.Equal(t, util.Icon{Type: "emoji", Emoji: mockedTypeIcon}, objects[0].Type.Icon) + require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr(mockedTypeIcon)}, objects[0].Type.Icon) require.Equal(t, mockedObjectId, objects[0].Id) require.Equal(t, mockedObjectName, objects[0].Name) require.Equal(t, mockedObjectSnippet, objects[0].Snippet) - require.Equal(t, util.Icon{Type: "emoji", Emoji: mockedObjectIcon}, objects[0].Icon) - require.Equal(t, 5, len(objects[0].Details)) + require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr(mockedObjectIcon)}, objects[0].Icon) + require.Equal(t, 5, len(objects[0].Properties)) - for _, detail := range objects[0].Details { + for _, detail := range objects[0].Properties { if detail.Id == "created_date" { - require.Equal(t, "1970-01-11T06:54:48Z", detail.Details.(DateDetailEntry).Date) + require.Equal(t, "1970-01-11T06:54:48Z", *detail.Date) } else if detail.Id == "created_by" { - require.Equal(t, []string{mockedParticipantId}, detail.Details.(ObjectDetailEntry).Object) + require.Equal(t, []string{mockedParticipantId}, detail.Object) } else if detail.Id == "last_modified_date" { - require.Equal(t, "1970-01-12T13:46:39Z", detail.Details.(DateDetailEntry).Date) + require.Equal(t, "1970-01-12T13:46:39Z", *detail.Date) } else if detail.Id == "last_modified_by" { - require.Equal(t, []string{mockedParticipantId}, detail.Details.(ObjectDetailEntry).Object) + require.Equal(t, []string{mockedParticipantId}, detail.Object) } else if detail.Id == "last_opened_date" { - require.Equal(t, "1970-01-01T00:00:00Z", detail.Details.(DateDetailEntry).Date) - } else if detail.Id == "tags" { - require.Empty(t, detail.Details.(SelectDetailEntry).Select) + require.Equal(t, "1970-01-01T00:00:00Z", *detail.Date) + } else if detail.Id == "tag" { + require.Empty(t, detail.MultiSelect) } else { t.Errorf("unexpected detail id: %s", detail.Id) } @@ -420,28 +420,28 @@ func TestObjectService_GetObject(t *testing.T) { require.Equal(t, mockedTypeId, object.Type.Id) require.Equal(t, mockedTypeName, object.Type.Name) require.Equal(t, mockedTypeUniqueKey, object.Type.UniqueKey) - require.Equal(t, util.Icon{Type: "emoji", Emoji: mockedTypeIcon}, object.Type.Icon) + require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr(mockedTypeIcon)}, object.Type.Icon) require.Equal(t, mockedObjectId, object.Id) require.Equal(t, mockedObjectName, object.Name) require.Equal(t, mockedObjectSnippet, object.Snippet) - require.Equal(t, util.Icon{Type: "emoji", Emoji: mockedObjectIcon}, object.Icon) - require.Equal(t, 3, len(object.Details)) + require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr(mockedObjectIcon)}, object.Icon) + require.Equal(t, 3, len(object.Properties)) - for _, detail := range object.Details { - if detail.Id == "created_date" { - require.Equal(t, "1970-01-11T06:54:48Z", detail.Details.(DateDetailEntry).Date) - } else if detail.Id == "created_by" { - require.Empty(t, detail.Details.(ObjectDetailEntry).Object) - } else if detail.Id == "last_modified_date" { - require.Equal(t, "1970-01-12T13:46:39Z", detail.Details.(DateDetailEntry).Date) - } else if detail.Id == "last_modified_by" { - require.Empty(t, detail.Details.(ObjectDetailEntry).Object) - } else if detail.Id == "last_opened_date" { - require.Equal(t, "1970-01-01T00:00:00Z", detail.Details.(DateDetailEntry).Date) - } else if detail.Id == "tags" { - require.Empty(t, detail.Details.(SelectDetailEntry).Select) + for _, property := range object.Properties { + if property.Id == "created_date" { + require.Equal(t, "1970-01-11T06:54:48Z", *property.Date) + } else if property.Id == "created_by" { + require.Empty(t, property.Object) + } else if property.Id == "last_modified_date" { + require.Equal(t, "1970-01-12T13:46:39Z", *property.Date) + } else if property.Id == "last_modified_by" { + require.Empty(t, property.Object) + } else if property.Id == "last_opened_date" { + require.Equal(t, "1970-01-01T00:00:00Z", *property.Date) + } else if property.Id == "tag" { + require.Empty(t, property.MultiSelect) } else { - t.Errorf("unexpected detail id: %s", detail.Id) + t.Errorf("unexpected property id: %s", property.Id) } } }) @@ -549,10 +549,10 @@ func TestObjectService_CreateObject(t *testing.T) { require.Equal(t, mockedTypeId, object.Type.Id) require.Equal(t, mockedTypeName, object.Type.Name) require.Equal(t, mockedTypeUniqueKey, object.Type.UniqueKey) - require.Equal(t, util.Icon{Type: "emoji", Emoji: mockedTypeIcon}, object.Type.Icon) + require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr(mockedTypeIcon)}, object.Type.Icon) require.Equal(t, mockedNewObjectId, object.Id) require.Equal(t, mockedObjectName, object.Name) - require.Equal(t, util.Icon{Type: "emoji", Emoji: mockedObjectIcon}, object.Icon) + require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr(mockedObjectIcon)}, object.Icon) require.Equal(t, mockedSpaceId, object.SpaceId) }) @@ -608,7 +608,7 @@ func TestObjectService_ListTypes(t *testing.T) { require.Equal(t, "type-1", types[0].Id) require.Equal(t, "Type One", types[0].Name) require.Equal(t, "type-one-key", types[0].UniqueKey) - require.Equal(t, util.Icon{Type: "emoji", Emoji: "🗂️"}, types[0].Icon) + require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr("🗂️")}, types[0].Icon) require.Equal(t, 1, total) require.False(t, hasMore) }) @@ -671,7 +671,7 @@ func TestObjectService_GetType(t *testing.T) { require.Equal(t, mockedTypeId, objType.Id) require.Equal(t, mockedTypeName, objType.Name) require.Equal(t, mockedTypeUniqueKey, objType.UniqueKey) - require.Equal(t, util.Icon{Type: "emoji", Emoji: mockedTypeIcon}, objType.Icon) + require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr(mockedTypeIcon)}, objType.Icon) require.Equal(t, model.ObjectTypeLayout_name[int32(model.ObjectType_basic)], objType.RecommendedLayout) }) @@ -753,7 +753,7 @@ func TestObjectService_ListTemplates(t *testing.T) { require.Len(t, templates, 1) require.Equal(t, "template-1", templates[0].Id) require.Equal(t, "Template Name", templates[0].Name) - require.Equal(t, util.Icon{Type: "emoji", Emoji: "📝"}, templates[0].Icon) + require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr("📝")}, templates[0].Icon) require.Equal(t, 1, total) require.False(t, hasMore) }) @@ -813,7 +813,7 @@ func TestObjectService_GetTemplate(t *testing.T) { require.NoError(t, err) require.Equal(t, mockedTemplateId, template.Id) require.Equal(t, mockedTemplateName, template.Name) - require.Equal(t, util.Icon{Type: "emoji", Emoji: mockedTemplateIcon}, template.Icon) + require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr(mockedTemplateIcon)}, template.Icon) }) t.Run("template not found", func(t *testing.T) { diff --git a/core/api/internal/search/service_test.go b/core/api/internal/search/service_test.go index 65cb21fc7..0430a0a32 100644 --- a/core/api/internal/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -27,6 +27,7 @@ const ( mockedSearchTerm = "mocked-search-term" mockedObjectId = "mocked-object-id" mockedObjectName = "mocked-object-name" + mockedObjectIcon = "🌐" mockedRootId = "mocked-root-id" mockedParticipantId = "mocked-participant-id" mockedType = "mocked-type" @@ -240,7 +241,7 @@ func TestSearchService_GlobalSearch(t *testing.T) { bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), bundle.RelationKeyResolvedLayout.String(): pbtypes.Int64(int64(model.ObjectType_basic)), - bundle.RelationKeyIconEmoji.String(): pbtypes.String("🌐"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedObjectIcon), bundle.RelationKeyLastModifiedDate.String(): pbtypes.Float64(999999), bundle.RelationKeyLastModifiedBy.String(): pbtypes.String(mockedParticipantId), bundle.RelationKeyCreatedDate.String(): pbtypes.Float64(888888), @@ -364,29 +365,27 @@ func TestSearchService_GlobalSearch(t *testing.T) { require.Equal(t, mockedType, objects[0].Type.Id) require.Equal(t, mockedSpaceId, objects[0].SpaceId) require.Equal(t, model.ObjectTypeLayout_name[int32(model.ObjectType_basic)], objects[0].Layout) - require.Equal(t, util.Icon{Type: "emoji", Emoji: "🌐"}, objects[0].Icon) + require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr(mockedObjectIcon)}, objects[0].Icon) require.Equal(t, "This is a sample text block", objects[0].Blocks[2].Text.Text) // check details - for _, detail := range objects[0].Details { - if detail.Id == "created_date" { - require.Equal(t, "1970-01-11T06:54:48Z", detail.Details.(object.DateDetailEntry).Date) - } else if detail.Id == "last_modified_date" { - require.Equal(t, "1970-01-12T13:46:39Z", detail.Details.(object.DateDetailEntry).Date) - } else if detail.Id == "created_by" { - require.Equal(t, []string{mockedParticipantId}, detail.Details.(object.ObjectDetailEntry).Object) - } else if detail.Id == "last_modified_by" { - require.Equal(t, []string{mockedParticipantId}, detail.Details.(object.ObjectDetailEntry).Object) + for _, property := range objects[0].Properties { + if property.Id == "created_date" { + require.Equal(t, "1970-01-11T06:54:48Z", *property.Date) + } else if property.Id == "last_modified_date" { + require.Equal(t, "1970-01-12T13:46:39Z", *property.Date) + } else if property.Id == "created_by" { + require.Equal(t, []string{mockedParticipantId}, property.Object) + } else if property.Id == "last_modified_by" { + require.Equal(t, []string{mockedParticipantId}, property.Object) } } // check tags tags := []object.Tag{} - for _, detail := range objects[0].Details { - if tagList, ok := detail.Details.(object.MultiSelectDetailEntry); ok { - for _, tag := range tagList.MultiSelect { - tags = append(tags, tag) - } + for _, detail := range objects[0].Properties { + for _, tag := range detail.MultiSelect { + tags = append(tags, tag) } } require.Len(t, tags, 2) diff --git a/core/api/internal/space/service_test.go b/core/api/internal/space/service_test.go index 267c3a3b2..02026aad9 100644 --- a/core/api/internal/space/service_test.go +++ b/core/api/internal/space/service_test.go @@ -125,10 +125,10 @@ func TestSpaceService_ListSpaces(t *testing.T) { require.Len(t, spaces, 2) require.Equal(t, "Another Workspace", spaces[0].Name) require.Equal(t, "another-space-id", spaces[0].Id) - require.Regexpf(t, regexp.MustCompile(gatewayUrl+`/image/`+iconImage), spaces[0].Icon, "Icon URL does not match") + require.Regexpf(t, regexp.MustCompile(gatewayUrl+`/image/`+iconImage), *spaces[0].Icon.File, "Icon URL does not match") require.Equal(t, "My Workspace", spaces[1].Name) require.Equal(t, "my-space-id", spaces[1].Id) - require.Equal(t, util.Icon{Type: "emoji", Emoji: "🚀"}, spaces[1].Icon) + require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr("🚀")}, spaces[1].Icon) require.Equal(t, 2, total) require.False(t, hasMore) }) @@ -282,11 +282,11 @@ func TestSpaceService_ListMembers(t *testing.T) { require.Len(t, members, 2) require.Equal(t, "member-1", members[0].Id) require.Equal(t, "John Doe", members[0].Name) - require.Equal(t, util.Icon{Type: "emoji", Emoji: "👤"}, members[0].Icon) + require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr("👤")}, members[0].Icon) require.Equal(t, "john.any", members[0].GlobalName) require.Equal(t, "member-2", members[1].Id) require.Equal(t, "Jane Doe", members[1].Name) - require.Regexpf(t, regexp.MustCompile(gatewayUrl+`/image/`+iconImage), members[1].Icon, "Icon URL does not match") + require.Regexpf(t, regexp.MustCompile(gatewayUrl+`/image/`+iconImage), *members[1].Icon.File, "Icon URL does not match") require.Equal(t, "jane.any", members[1].GlobalName) require.Equal(t, 2, total) require.False(t, hasMore) diff --git a/core/api/util/util.go b/core/api/util/util.go index 5447c2d3e..824da2f4b 100644 --- a/core/api/util/util.go +++ b/core/api/util/util.go @@ -33,34 +33,39 @@ var iconOptionToColor = map[float64]string{ } type Icon struct { - Type string `json:"type" enums:"emoji,file,icon" example:"emoji"` // The type of the icon - Emoji string `json:"emoji,omitempty" example:"📄"` // The emoji of the icon - File string `json:"file,omitempty" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay"` // The file of the icon - Name string `json:"name,omitempty" example:"document"` // The name of the icon - Color string `json:"color,omitempty" example:"red"` // The color of the icon + Format string `json:"format" enums:"emoji,file,icon" example:"emoji"` // The type of the icon + Emoji *string `json:"emoji,omitempty" example:"📄"` // The emoji of the icon + File *string `json:"file,omitempty" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay"` // The file of the icon + Name *string `json:"name,omitempty" example:"document"` // The name of the icon + Color *string `json:"color,omitempty" example:"red"` // The color of the icon +} + +// StringPtr returns a pointer to the string +func StringPtr(s string) *string { + return &s } // GetIcon returns the icon to use for the object, which can be builtin icon, emoji or file func GetIcon(accountInfo *model.AccountInfo, iconEmoji string, iconImage string, iconName string, iconOption float64) Icon { if iconName != "" { return Icon{ - Type: "icon", - Name: iconName, - Color: iconOptionToColor[iconOption], + Format: "icon", + Name: &iconName, + Color: StringPtr(iconOptionToColor[iconOption]), } } if iconEmoji != "" { return Icon{ - Type: "emoji", - Emoji: iconEmoji, + Format: "emoji", + Emoji: &iconEmoji, } } if iconImage != "" { return Icon{ - Type: "file", - File: fmt.Sprintf("%s/image/%s", accountInfo.GatewayUrl, iconImage), + Format: "file", + File: StringPtr(fmt.Sprintf("%s/image/%s", accountInfo.GatewayUrl, iconImage)), } } From 181fff8efcdb0144a699f7df1b038dc8cd4f46a8 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 12 Mar 2025 20:41:01 +0100 Subject: [PATCH 051/132] GO-4459: Fix lint --- core/api/internal/object/service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 39e648320..27f13d713 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -527,7 +527,7 @@ func (s *ObjectService) getProperties(resp *pb.RpcObjectShowResponse) []Property linkedProperties := resp.ObjectView.RelationLinks primaryDetailFields := resp.ObjectView.Details[0].Details.Fields - var properties []Property + properties := make([]Property, 0, len(linkedProperties)) for _, r := range linkedProperties { key := r.Key if _, isExcluded := excludedSystemProperties[key]; isExcluded { From ace1300de48ceedf3794816376bf0e2149e1711d Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 14 Mar 2025 11:38:50 +0100 Subject: [PATCH 052/132] GO-4459: Support views including sorts and filters for lists and return dataview in blocks --- core/api/docs/docs.go | 4 +- core/api/docs/swagger.json | 4 +- core/api/docs/swagger.yaml | 109 +++++++++++++++++++++++++++- core/api/internal/list/handler.go | 6 +- core/api/internal/list/service.go | 68 +++++++++++++++-- core/api/internal/object/model.go | 58 +++++++++++---- core/api/internal/object/service.go | 71 ++++++++++++++++-- core/api/server/router.go | 2 +- 8 files changed, 286 insertions(+), 36 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 15da18204..7cabfcb35 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -6,10 +6,10 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"properties":{"checkbox":{"example":true,"type":"boolean"},"date":{"example":"2025-02-14T12:34:56Z","type":"string"},"email":{"example":"example@example.com","type":"string"},"file":{"example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"example":"last_modified_date","type":"string"},"multi_select":{"items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"example":"Last modified date","type":"string"},"number":{"example":42,"type":"number"},"object":{"example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"example":"Some text...","type":"string"},"url":{"example":"https://example.com","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Tag":{"properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the relation used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"relation_key":{"description":"The relation key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the relation used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"relation_key":{"description":"The relation key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 18182dae9..f35a1a23f 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,8 +1,8 @@ { - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"properties":{"checkbox":{"example":true,"type":"boolean"},"date":{"example":"2025-02-14T12:34:56Z","type":"string"},"email":{"example":"example@example.com","type":"string"},"file":{"example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"example":"last_modified_date","type":"string"},"multi_select":{"items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"example":"Last modified date","type":"string"},"number":{"example":42,"type":"number"},"object":{"example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"example":"Some text...","type":"string"},"url":{"example":"https://example.com","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation of the block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Tag":{"properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the relation used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"relation_key":{"description":"The relation key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the relation used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"relation_key":{"description":"The relation key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]},"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 98f3cdeeb..b717abf0c 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -49,6 +49,8 @@ components: type: string type: array uniqueItems: false + dataview: + $ref: '#/components/schemas/object.Dataview' file: $ref: '#/components/schemas/object.File' id: @@ -99,6 +101,16 @@ components: example: bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge type: string type: object + object.Dataview: + description: The dataview, applicable for list objects + properties: + views: + description: The list of views + items: + $ref: '#/components/schemas/object.View' + type: array + uniqueItems: false + type: object object.File: description: The file of the block, if applicable properties: @@ -130,6 +142,29 @@ components: description: The type of the file type: string type: object + object.Filter: + properties: + condition: + description: The filter condition + example: contains + type: string + format: + description: The format of the relation used for filtering + example: text + type: string + id: + description: The id of the filter + example: 67bf3f21cda9134102e2422c + type: string + relation_key: + description: The relation key used for filtering + example: name + type: string + value: + description: The value used for filtering + example: Some value... + type: string + type: object object.Object: description: The object properties: @@ -187,15 +222,19 @@ components: object.Property: properties: checkbox: + description: The checkbox value, if applicable example: true type: boolean date: + description: The date value, if applicable example: "2025-02-14T12:34:56Z" type: string email: + description: The email value, if applicable example: example@example.com type: string file: + description: The file references, if applicable example: - '[''fileId'']' items: @@ -203,6 +242,7 @@ components: type: array uniqueItems: false format: + description: The format of the property enum: - text - number @@ -218,20 +258,25 @@ components: example: date type: string id: + description: The id of the property example: last_modified_date type: string multi_select: + description: The multi-select values, if applicable items: $ref: '#/components/schemas/object.Tag' type: array uniqueItems: false name: + description: The name of the property example: Last modified date type: string number: + description: The number value, if applicable example: 42 type: number object: + description: The object references, if applicable example: - '[''objectId'']' items: @@ -239,24 +284,47 @@ components: type: array uniqueItems: false phone: + description: The phone number value, if applicable example: "+1234567890" type: string select: $ref: '#/components/schemas/object.Tag' text: + description: The text value, if applicable example: Some text... type: string url: + description: The url value, if applicable example: https://example.com type: string type: object object.Relation: - description: The relation of the block, if applicable + description: The relation block, if applicable properties: id: type: string type: object + object.Sort: + properties: + format: + description: The format of the relation used for sorting + example: text + type: string + id: + description: The id of the sort + example: 67bf3f21cda9134102e2422c + type: string + relation_key: + description: The relation key used for sorting + example: name + type: string + sort_type: + description: The sort direction + example: asc + type: string + type: object object.Tag: + description: The select value, if applicable properties: color: description: The color of the tag @@ -362,6 +430,36 @@ components: type: $ref: '#/components/schemas/object.Type' type: object + object.View: + properties: + filters: + description: The list of filters + items: + $ref: '#/components/schemas/object.Filter' + type: array + uniqueItems: false + id: + description: The id of the view + example: 67bf3f21cda9134102e2422c + type: string + layout: + description: The layout of the view + enum: + - grid + - table + example: grid + type: string + name: + description: The name of the view + example: All + type: string + sorts: + description: The list of sorts + items: + $ref: '#/components/schemas/object.Sort' + type: array + uniqueItems: false + type: object pagination.PaginatedResponse-object_Object: properties: data: @@ -1666,7 +1764,7 @@ paths: summary: Get template tags: - templates - /v1/spaces/{space_id}/lists/{list_id}/objects: + /v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects: get: description: Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients @@ -1685,6 +1783,12 @@ paths: required: true schema: type: string + - description: View ID + in: path + name: view_id + required: true + schema: + type: string - description: The number of items to skip before starting to collect the result set in: query @@ -1727,6 +1831,7 @@ paths: summary: Get objects in list tags: - lists + /v1/spaces/{space_id}/lists/{list_id}/objects: post: description: Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns diff --git a/core/api/internal/list/handler.go b/core/api/internal/list/handler.go index 923787df3..63f9e86f7 100644 --- a/core/api/internal/list/handler.go +++ b/core/api/internal/list/handler.go @@ -17,6 +17,7 @@ import ( // @Produce json // @Param space_id path string true "Space ID" // @Param list_id path string true "List ID" +// @Param view_id path string true "View ID" // @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) // @Param limit query int false "The number of items to return" // @Success 200 {object} pagination.PaginatedResponse[object.Object] "List of objects" @@ -24,15 +25,16 @@ import ( // @Failure 404 {object} util.NotFoundError "Not found" // @Failure 500 {object} util.ServerError "Internal server error" // @Security bearerauth -// @Router /v1/spaces/{space_id}/lists/{list_id}/objects [get] +// @Router /v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects [get] func GetObjectsInListHandler(s *ListService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") listId := c.Param("list_id") + viewId := c.Param("view_id") offset := c.GetInt("offset") limit := c.GetInt("limit") - objects, total, hasMore, err := s.GetObjectsInList(c, spaceId, listId, offset, limit) + objects, total, hasMore, err := s.GetObjectsInList(c, spaceId, listId, viewId, offset, limit) code := util.MapErrorCode(err, util.ErrToCode(ErrFailedGetObjectsInList, http.StatusInternalServerError), ) diff --git a/core/api/internal/list/service.go b/core/api/internal/list/service.go index 9a5e2c15c..dea3f8571 100644 --- a/core/api/internal/list/service.go +++ b/core/api/internal/list/service.go @@ -9,16 +9,20 @@ import ( "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) var ( + ErrFailedGetList = errors.New("failed to get list") + ErrFailedGetListDataview = errors.New("failed to get list dataview") + ErrFailedGetListDataviewView = errors.New("failed to get list dataview view") ErrFailedGetObjectsInList = errors.New("failed to get objects in list") ErrFailedAddObjectsToList = errors.New("failed to add objects to list") ErrFailedRemoveObjectsFromList = errors.New("failed to remove objects from list") ) type Service interface { - GetObjectsInList(ctx context.Context, spaceId string, listId string, offset, limit int) ([]object.Object, int, bool, error) + GetObjectsInList(ctx context.Context, spaceId string, listId string, viewId string, offset, limit int) ([]object.Object, int, bool, error) AddObjectsToList(ctx context.Context, spaceId string, listId string, objectIds []string) error RemoveObjectsFromList(ctx context.Context, spaceId string, listId string, objectIds []string) error } @@ -33,22 +37,74 @@ func NewService(mw service.ClientCommandsServer, objectService *object.ObjectSer } // GetObjectsInList retrieves objects in a list -func (s *ListService) GetObjectsInList(ctx context.Context, spaceId string, listId string, offset, limit int) ([]object.Object, int, bool, error) { - resp := s.mw.ObjectSearchSubscribe(ctx, &pb.RpcObjectSearchSubscribeRequest{ +func (s *ListService) GetObjectsInList(ctx context.Context, spaceId string, listId string, viewId string, offset, limit int) ([]object.Object, int, bool, error) { + resp := s.mw.ObjectShow(ctx, &pb.RpcObjectShowRequest{ + SpaceId: spaceId, + ObjectId: listId, + }) + + if resp.Error != nil && resp.Error.Code != pb.RpcObjectShowResponseError_NULL { + return nil, 0, false, ErrFailedGetList + } + + var dataviewBlock *model.Block + for _, block := range resp.ObjectView.Blocks { + if block.Id == "dataview" { + dataviewBlock = block + break + } + } + + if dataviewBlock == nil { + return nil, 0, false, ErrFailedGetListDataview + } + + var sorts []*model.BlockContentDataviewSort + var filters []*model.BlockContentDataviewFilter + + switch content := dataviewBlock.Content.(type) { + case *model.BlockContentOfDataview: + var targetView *model.BlockContentDataviewView + if viewId == "" && len(content.Dataview.Views) > 0 { + // fallback to first view when view id is empty + targetView = content.Dataview.Views[0] + } else if viewId != "" { + for _, view := range content.Dataview.Views { + if view.Id == viewId { + targetView = view + break + } + } + } + + if targetView == nil { + return nil, 0, false, ErrFailedGetListDataviewView + } + + // use the sorts and filters from the selected view + sorts = targetView.Sorts + filters = targetView.Filters + default: + return nil, 0, false, ErrFailedGetListDataview + } + + searchResp := s.mw.ObjectSearchSubscribe(ctx, &pb.RpcObjectSearchSubscribeRequest{ SpaceId: spaceId, Limit: int64(limit), // nolint: gosec Offset: int64(offset), // nolint: gosec Keys: []string{bundle.RelationKeyId.String()}, CollectionId: listId, + Sorts: sorts, + Filters: filters, }) // TODO: returned error from ObjectSearchSubscribe is inconsistent with other RPCs: Error is nil instead of Code being NULL - if resp.Error != nil && resp.Error.Code != pb.RpcObjectSearchSubscribeResponseError_NULL { + if searchResp.Error != nil && searchResp.Error.Code != pb.RpcObjectSearchSubscribeResponseError_NULL { return nil, 0, false, ErrFailedGetObjectsInList } - total := int(resp.Counters.Total) - paginatedRecords, hasMore := pagination.Paginate(resp.Records, offset, limit) + total := int(searchResp.Counters.Total) + paginatedRecords, hasMore := pagination.Paginate(searchResp.Records, offset, limit) objects := make([]object.Object, 0, len(paginatedRecords)) for _, record := range paginatedRecords { diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index 42a6ae897..6952e2c5a 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -38,7 +38,8 @@ type Block struct { VerticalAlign string `json:"vertical_align" enums:"VerticalAlignTop,VerticalAlignMiddle,VerticalAlignBottom" example:"VerticalAlignTop"` // The vertical alignment of the block Text *Text `json:"text,omitempty"` // The text of the block, if applicable File *File `json:"file,omitempty"` // The file of the block, if applicable - Relation *Relation `json:"relation,omitempty"` // The relation of the block, if applicable + Relation *Relation `json:"relation,omitempty"` // The relation block, if applicable + Dataview *Dataview `json:"dataview,omitempty"` // The dataview, applicable for list objects } type Text struct { @@ -66,21 +67,48 @@ type Relation struct { Id string } +type Dataview struct { + Views []View `json:"views"` // The list of views +} + +type View struct { + Id string `json:"id" example:"67bf3f21cda9134102e2422c"` // The id of the view + Name string `json:"name" example:"All"` // The name of the view + Layout string `json:"layout" example:"grid" enums:"grid,table"` // The layout of the view + Filters []Filter `json:"filters"` // The list of filters + Sorts []Sort `json:"sorts"` // The list of sorts +} + +type Filter struct { + Id string `json:"id" example:"67bf3f21cda9134102e2422c"` // The id of the filter + RelationKey string `json:"relation_key" example:"name"` // The relation key used for filtering + Format string `json:"format" example:"text" enum:"text,number,select,multi_select,date,file,checkbox,url,email,phone,object"` // The format of the relation used for filtering + Condition string `json:"condition" example:"contains" enum:"equal,not_equal,greater,less,greater_or_equal,less_or_equal,like,not_like,in,not_in,empty,not_empty,all_in,not_all_in,exact_in,not_exact_in,exists"` // The filter condition + Value string `json:"value" example:"Some value..."` // The value used for filtering +} + +type Sort struct { + Id string `json:"id" example:"67bf3f21cda9134102e2422c"` // The id of the sort + RelationKey string `json:"relation_key" example:"name"` // The relation key used for sorting + Format string `json:"format" example:"text" enum:"text,number,select,multi_select,date,file,checkbox,url,email,phone,object"` // The format of the relation used for sorting + SortType string `json:"sort_type" example:"asc" enum:"asc,desc,custom"` // The sort direction +} + type Property struct { - Id string `json:"id" example:"last_modified_date"` - Name string `json:"name" example:"Last modified date"` - Format string `json:"format" example:"date" enums:"text,number,select,multi_select,date,file,checkbox,url,email,phone,object"` - Text *string `json:"text,omitempty" example:"Some text..."` - Number *float64 `json:"number,omitempty" example:"42"` - Select *Tag `json:"select,omitempty"` - MultiSelect []Tag `json:"multi_select,omitempty"` - Date *string `json:"date,omitempty" example:"2025-02-14T12:34:56Z"` - File []string `json:"file,omitempty" example:"['fileId']"` - Checkbox *bool `json:"checkbox,omitempty" example:"true"` - Url *string `json:"url,omitempty" example:"https://example.com"` - Email *string `json:"email,omitempty" example:"example@example.com"` - Phone *string `json:"phone,omitempty" example:"+1234567890"` - Object []string `json:"object,omitempty" example:"['objectId']"` + Id string `json:"id" example:"last_modified_date"` // The id of the property + Name string `json:"name" example:"Last modified date"` // The name of the property + Format string `json:"format" example:"date" enums:"text,number,select,multi_select,date,file,checkbox,url,email,phone,object"` // The format of the property + Text *string `json:"text,omitempty" example:"Some text..."` // The text value, if applicable + Number *float64 `json:"number,omitempty" example:"42"` // The number value, if applicable + Select *Tag `json:"select,omitempty"` // The select value, if applicable + MultiSelect []Tag `json:"multi_select,omitempty"` // The multi-select values, if applicable + Date *string `json:"date,omitempty" example:"2025-02-14T12:34:56Z"` // The date value, if applicable + File []string `json:"file,omitempty" example:"['fileId']"` // The file references, if applicable + Checkbox *bool `json:"checkbox,omitempty" example:"true" enum:"true,false"` // The checkbox value, if applicable + Url *string `json:"url,omitempty" example:"https://example.com"` // The url value, if applicable + Email *string `json:"email,omitempty" example:"example@example.com"` // The email value, if applicable + Phone *string `json:"phone,omitempty" example:"+1234567890"` // The phone number value, if applicable + Object []string `json:"object,omitempty" example:"['objectId']"` // The object references, if applicable } type Tag struct { diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 27f13d713..84619c425 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -82,6 +82,7 @@ var excludedSystemProperties = map[string]bool{ bundle.RelationKeyLayoutAlign.String(): true, bundle.RelationKeyIsHiddenDiscovery.String(): true, bundle.RelationKeyLayout.String(): true, + bundle.RelationKeyIsReadonly.String(): true, } type Service interface { @@ -721,13 +722,9 @@ func (s *ObjectService) convertValue(key string, value *types.Value, format stri // getPropertyFormatMap returns the map of property key to property format from the ObjectShowResponse. func (s *ObjectService) getPropertyFormatMap(propertyLinks []*model.RelationLink) map[string]string { propertyFormatToName := make(map[int32]string, len(model.RelationFormat_name)) - for k, v := range model.RelationFormat_name { - propertyFormatToName[k] = v + for k := range model.RelationFormat_name { + propertyFormatToName[k] = s.mapRelationFormat(model.RelationFormat(k)) } - propertyFormatToName[int32(model.RelationFormat_longtext)] = "text" - propertyFormatToName[int32(model.RelationFormat_shorttext)] = "text" - propertyFormatToName[int32(model.RelationFormat_tag)] = "multi_select" - propertyFormatToName[int32(model.RelationFormat_status)] = "select" propertyFormatMap := map[string]string{} for _, detail := range propertyLinks { @@ -792,6 +789,7 @@ func (s *ObjectService) getBlocks(resp *pb.RpcObjectShowResponse) []Block { var text *Text var file *File var relation *Relation + var dataviewMapping *Dataview switch content := block.Content.(type) { case *model.BlockContentOfText: @@ -818,6 +816,40 @@ func (s *ObjectService) getBlocks(resp *pb.RpcObjectShowResponse) []Block { relation = &Relation{ Id: content.Relation.Key, } + case *model.BlockContentOfDataview: + var viewList []View + for _, v := range content.Dataview.Views { + var filters []Filter + for _, f := range v.Filters { + filters = append(filters, Filter{ + Id: f.Id, + RelationKey: f.RelationKey, + Format: s.mapRelationFormat(f.Format), + Condition: strcase.ToSnake(model.BlockContentDataviewFilterCondition_name[int32(f.Condition)]), + Value: f.Value.GetStringValue(), + }) + } + var sorts []Sort + for _, srt := range v.Sorts { + sorts = append(sorts, Sort{ + Id: srt.Id, + RelationKey: srt.RelationKey, + Format: s.mapRelationFormat(srt.Format), + SortType: strcase.ToSnake(model.BlockContentDataviewSortType_name[int32(srt.Type)]), + }) + } + viewList = append(viewList, View{ + Id: v.Id, + Name: v.Name, + Layout: s.mapDataviewTypeName(v.Type), + Filters: filters, + Sorts: sorts, + }) + } + dataviewMapping = &Dataview{ + Views: viewList, + } + } // TODO: other content types? @@ -830,8 +862,35 @@ func (s *ObjectService) getBlocks(resp *pb.RpcObjectShowResponse) []Block { Text: text, File: file, Relation: relation, + Dataview: dataviewMapping, }) } return blocks } + +// mapRelationFormat maps the relation format to a string. +func (s *ObjectService) mapRelationFormat(format model.RelationFormat) string { + switch format { + case model.RelationFormat_longtext: + return "text" + case model.RelationFormat_shorttext: + return "text" + case model.RelationFormat_tag: + return "multi_select" + case model.RelationFormat_status: + return "select" + default: + return strcase.ToSnake(model.RelationFormat_name[int32(format)]) + } +} + +// mapDataviewTypeName maps the dataview type to a string. +func (s *ObjectService) mapDataviewTypeName(dataviewType model.BlockContentDataviewViewType) string { + switch dataviewType { + case model.BlockContentDataviewView_Table: + return "grid" + default: + return strcase.ToSnake(model.BlockContentDataviewViewType_name[int32(dataviewType)]) + } +} diff --git a/core/api/server/router.go b/core/api/server/router.go index 67237092c..bb2644229 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -69,7 +69,7 @@ func (s *Server) NewRouter(accountService account.Service, mw service.ClientComm v1.POST("/spaces/:space_id/objects/:object_id/export/:format", export.GetObjectExportHandler(s.exportService)) // List - v1.GET("/spaces/:space_id/lists/:list_id/objects", list.GetObjectsInListHandler(s.listService)) + v1.GET("/spaces/:space_id/lists/:list_id/:view_id/objects", list.GetObjectsInListHandler(s.listService)) v1.POST("/spaces/:space_id/lists/:list_id/objects", list.AddObjectsToListHandler(s.listService)) v1.DELETE("/spaces/:space_id/lists/:list_id/objects/:object_id", s.rateLimit(maxWriteRequestsPerSecond), list.RemoveObjectFromListHandler(s.listService)) From 2ce93ae436a7fecbe4070af698544682358b94cf Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 16 Mar 2025 14:18:00 +0100 Subject: [PATCH 053/132] GO-4459: Add UpdateMemberHandler to modify member status and role in a space --- core/api/docs/docs.go | 4 +- core/api/docs/swagger.json | 4 +- core/api/docs/swagger.yaml | 98 +++++++++++++- core/api/internal/space/handler.go | 54 +++++++- core/api/internal/space/model.go | 8 +- core/api/internal/space/service.go | 165 +++++++++++++++++++++--- core/api/internal/space/service_test.go | 35 +++-- core/api/server/router.go | 1 + 8 files changed, 323 insertions(+), 46 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 7cabfcb35..ecf0e0b1d 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -6,10 +6,10 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the relation used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"relation_key":{"description":"The relation key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the relation used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"relation_key":{"description":"The relation key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the relation used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"relation_key":{"description":"The relation key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the relation used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"relation_key":{"description":"The relation key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["reader","writer","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["reader","writer"],"example":"reader","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index f35a1a23f..388b43ff8 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,8 +1,8 @@ { - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the relation used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"relation_key":{"description":"The relation key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the relation used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"relation_key":{"description":"The relation key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["Reader","Writer","Owner","NoPermission"],"example":"Owner","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the relation used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"relation_key":{"description":"The relation key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the relation used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"relation_key":{"description":"The relation key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["reader","writer","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["reader","writer"],"example":"reader","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index b717abf0c..6383c46ec 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -611,11 +611,18 @@ components: role: description: The role of the member enum: - - Reader - - Writer - - Owner - - NoPermission - example: Owner + - reader + - writer + - owner + - no_permission + example: owner + type: string + status: + description: The status of the member + enum: + - joining + - active + example: active type: string type: object space.MemberResponse: @@ -707,6 +714,24 @@ components: space: $ref: '#/components/schemas/space.Space' type: object + space.UpdateMemberRequest: + properties: + role: + description: Role to assign if approving a joining member + enum: + - reader + - writer + example: reader + type: string + status: + description: Status of the member + enum: + - active + - removed + - declined + example: active + type: string + type: object util.ForbiddenError: properties: error: @@ -1199,6 +1224,69 @@ paths: summary: Get member tags: - members + patch: + description: Modifies a member's status and role in a space. Use this endpoint + to approve a joining member by setting the status to `active` and specifying + a role (`reader` or `writer`), reject a joining member by setting the status + to `declined`, remove a member by setting the status to `removed`, or update + an active member's role. This endpoint enables fine-grained control over member + access and permissions. + parameters: + - description: Space ID + in: path + name: space_id + required: true + schema: + type: string + - description: Member ID + in: path + name: member_id + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/space.UpdateMemberRequest' + description: Member to update + required: true + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/space.MemberResponse' + description: Member updated successfully + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ValidationError' + description: Bad request + "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' + description: Unauthorized + "404": + content: + application/json: + schema: + $ref: '#/components/schemas/util.NotFoundError' + description: Member not found + "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' + description: Internal server error + security: + - bearerauth: [] + summary: Update member + tags: + - members /spaces/{space_id}/objects: get: description: Retrieves a paginated list of objects in the given space. The endpoint diff --git a/core/api/internal/space/handler.go b/core/api/internal/space/handler.go index 4ed1b0fb9..9c48334f0 100644 --- a/core/api/internal/space/handler.go +++ b/core/api/internal/space/handler.go @@ -93,14 +93,14 @@ func GetSpaceHandler(s *SpaceService) gin.HandlerFunc { // @Router /spaces [post] func CreateSpaceHandler(s *SpaceService) gin.HandlerFunc { return func(c *gin.Context) { - nameRequest := CreateSpaceRequest{} - if err := c.BindJSON(&nameRequest); err != nil { + var req CreateSpaceRequest + if err := c.BindJSON(&req); err != nil { apiErr := util.CodeToAPIError(http.StatusBadRequest, err.Error()) c.JSON(http.StatusBadRequest, apiErr) return } - space, err := s.CreateSpace(c.Request.Context(), nameRequest.Name) + space, err := s.CreateSpace(c.Request.Context(), req) code := util.MapErrorCode(err, util.ErrToCode(ErrFailedCreateSpace, http.StatusInternalServerError), ) @@ -157,7 +157,7 @@ func GetMembersHandler(s *SpaceService) gin.HandlerFunc { // @Tags members // @Produce json // @Param space_id path string true "Space ID" -// @Param member_id path string true "Member ID" +// @Param member_id path string true "Member ID or Identity" // @Success 200 {object} MemberResponse "Member" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 404 {object} util.NotFoundError "Member not found" @@ -184,3 +184,49 @@ func GetMemberHandler(s *SpaceService) gin.HandlerFunc { c.JSON(http.StatusOK, MemberResponse{Member: member}) } } + +// UpdateMemberHandler updates a member in a space +// +// @Summary Update member +// @Description Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions. +// @Tags members +// @Accept json +// @Produce json +// @Param space_id path string true "Space ID" +// @Param member_id path string true "Member ID" +// @Param body body UpdateMemberRequest true "Member to update" +// @Success 200 {object} MemberResponse "Member updated successfully" +// @Failure 400 {object} util.ValidationError "Bad request" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Member not found" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth +// @Router /spaces/{space_id}/members/{member_id} [patch] +func UpdateMemberHandler(s *SpaceService) gin.HandlerFunc { + return func(c *gin.Context) { + spaceId := c.Param("space_id") + memberId := c.Param("member_id") + + var req UpdateMemberRequest + if err := c.BindJSON(&req); err != nil { + apiErr := util.CodeToAPIError(http.StatusBadRequest, err.Error()) + c.AbortWithStatusJSON(http.StatusBadRequest, apiErr) + } + + member, err := s.UpdateMember(c.Request.Context(), spaceId, memberId, req) + code := util.MapErrorCode(err, + util.ErrToCode(ErrInvalidApproveMemberStatus, http.StatusBadRequest), + util.ErrToCode(ErrInvalidApproveMemberRole, http.StatusBadRequest), + util.ErrToCode(ErrMemberNotFound, http.StatusNotFound), + util.ErrToCode(ErrFailedUpdateMember, http.StatusInternalServerError), + ) + + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) + return + } + + c.JSON(http.StatusOK, MemberResponse{Member: member}) + } +} diff --git a/core/api/internal/space/model.go b/core/api/internal/space/model.go index 2edf130db..aea8a6f12 100644 --- a/core/api/internal/space/model.go +++ b/core/api/internal/space/model.go @@ -38,6 +38,11 @@ type MemberResponse struct { Member Member `json:"member"` // The member } +type UpdateMemberRequest struct { + Status string `json:"status" enums:"active,removed,declined" example:"active"` // Status of the member + Role string `json:"role,omitempty" enums:"reader,writer" example:"reader"` // Role to assign if approving a joining member +} + type Member struct { Object string `json:"object" example:"member"` // The data model of the object Id string `json:"id" example:"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ"` // The profile object id of the member @@ -45,5 +50,6 @@ type Member struct { Icon util.Icon `json:"icon"` // The icon of the member Identity string `json:"identity" example:"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"` // The identity of the member in the network GlobalName string `json:"global_name" example:"john.any"` // The global name of the member in the network - Role string `json:"role" enums:"Reader,Writer,Owner,NoPermission" example:"Owner"` // The role of the member + Status string `json:"status" enums:"joining,active" example:"active"` // The status of the member + Role string `json:"role" enums:"reader,writer,owner,no_permission" example:"owner"` // The role of the member } diff --git a/core/api/internal/space/service.go b/core/api/internal/space/service.go index dfd9f4457..0312b0c0e 100644 --- a/core/api/internal/space/service.go +++ b/core/api/internal/space/service.go @@ -5,8 +5,10 @@ import ( "crypto/rand" "errors" "math/big" + "strings" "github.com/gogo/protobuf/types" + "github.com/iancoleman/strcase" "github.com/anyproto/anytype-heart/core/api/pagination" "github.com/anyproto/anytype-heart/core/api/util" @@ -18,22 +20,26 @@ import ( ) var ( - ErrFailedListSpaces = errors.New("failed to retrieve list of spaces") - ErrFailedOpenWorkspace = errors.New("failed to open workspace") - ErrWorkspaceNotFound = errors.New("workspace not found") - ErrFailedGenerateRandomIcon = errors.New("failed to generate random icon") - ErrFailedCreateSpace = errors.New("failed to create space") - ErrFailedListMembers = errors.New("failed to retrieve list of members") - ErrFailedGetMember = errors.New("failed to retrieve member") - ErrMemberNotFound = errors.New("member not found") + ErrFailedListSpaces = errors.New("failed to retrieve list of spaces") + ErrFailedOpenWorkspace = errors.New("failed to open workspace") + ErrWorkspaceNotFound = errors.New("workspace not found") + ErrFailedGenerateRandomIcon = errors.New("failed to generate random icon") + ErrFailedCreateSpace = errors.New("failed to create space") + ErrFailedListMembers = errors.New("failed to retrieve list of members") + ErrFailedGetMember = errors.New("failed to retrieve member") + ErrMemberNotFound = errors.New("member not found") + ErrInvalidApproveMemberStatus = errors.New("status must be 'active', 'declined', or 'removed'") + ErrInvalidApproveMemberRole = errors.New("role must be 'reader' or 'writer'") + ErrFailedUpdateMember = errors.New("failed to update member") ) type Service interface { ListSpaces(ctx context.Context, offset int, limit int) ([]Space, int, bool, error) GetSpace(ctx context.Context, spaceId string) (Space, error) - CreateSpace(ctx context.Context, name string) (Space, error) + CreateSpace(ctx context.Context, request CreateSpaceRequest) (Space, error) ListMembers(ctx context.Context, spaceId string, offset int, limit int) ([]Member, int, bool, error) GetMember(ctx context.Context, spaceId string, memberId string) (Member, error) + UpdateMember(ctx context.Context, spaceId string, memberId string, request UpdateMemberRequest) (Member, error) } type SpaceService struct { @@ -133,7 +139,8 @@ func (s *SpaceService) GetSpace(ctx context.Context, spaceId string) (Space, err } // CreateSpace creates a new space with the given name and returns the space info. -func (s *SpaceService) CreateSpace(ctx context.Context, name string) (Space, error) { +func (s *SpaceService) CreateSpace(ctx context.Context, request CreateSpaceRequest) (Space, error) { + name := request.Name iconOption, err := rand.Int(rand.Reader, big.NewInt(13)) if err != nil { return Space{}, ErrFailedGenerateRandomIcon @@ -143,8 +150,8 @@ func (s *SpaceService) CreateSpace(ctx context.Context, name string) (Space, err resp := s.mw.WorkspaceCreate(ctx, &pb.RpcWorkspaceCreateRequest{ Details: &types.Struct{ Fields: map[string]*types.Value{ - bundle.RelationKeyIconOption.String(): pbtypes.Float64(float64(iconOption.Int64())), bundle.RelationKeyName.String(): pbtypes.String(name), + bundle.RelationKeyIconOption.String(): pbtypes.Float64(float64(iconOption.Int64())), bundle.RelationKeySpaceDashboardId.String(): pbtypes.String("lastOpened"), }, }, @@ -161,7 +168,7 @@ func (s *SpaceService) CreateSpace(ctx context.Context, name string) (Space, err // ListMembers returns a paginated list of members in the space with the given ID. func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset int, limit int) (members []Member, total int, hasMore bool, err error) { - resp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ + activeResp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ { @@ -183,15 +190,46 @@ func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset i Type: model.BlockContentDataviewSort_Asc, }, }, - Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String(), bundle.RelationKeyIconEmoji.String(), bundle.RelationKeyIconImage.String(), bundle.RelationKeyIdentity.String(), bundle.RelationKeyGlobalName.String(), bundle.RelationKeyParticipantPermissions.String()}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String(), bundle.RelationKeyIconEmoji.String(), bundle.RelationKeyIconImage.String(), bundle.RelationKeyIdentity.String(), bundle.RelationKeyGlobalName.String(), bundle.RelationKeyParticipantPermissions.String(), bundle.RelationKeyParticipantStatus.String()}, }) - if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + if activeResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { return nil, 0, false, ErrFailedListMembers } - total = len(resp.Records) - paginatedMembers, hasMore := pagination.Paginate(resp.Records, offset, limit) + joiningResp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ + SpaceId: spaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyResolvedLayout.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.ObjectType_participant)), + }, + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyParticipantStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.ParticipantStatus_Joining)), + }, + }, + Sorts: []*model.BlockContentDataviewSort{ + { + RelationKey: bundle.RelationKeyName.String(), + Type: model.BlockContentDataviewSort_Asc, + }, + }, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String(), bundle.RelationKeyIconEmoji.String(), bundle.RelationKeyIconImage.String(), bundle.RelationKeyIdentity.String(), bundle.RelationKeyGlobalName.String(), bundle.RelationKeyParticipantPermissions.String(), bundle.RelationKeyParticipantStatus.String()}, + }) + + if joiningResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + return nil, 0, false, ErrFailedListMembers + } + + combinedRecords := append(joiningResp.Records, activeResp.Records...) + + total = len(combinedRecords) + paginatedMembers, hasMore := pagination.Paginate(combinedRecords, offset, limit) members = make([]Member, 0, len(paginatedMembers)) for _, record := range paginatedMembers { @@ -204,7 +242,8 @@ func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset i Icon: icon, Identity: record.Fields[bundle.RelationKeyIdentity.String()].GetStringValue(), GlobalName: record.Fields[bundle.RelationKeyGlobalName.String()].GetStringValue(), - Role: model.ParticipantPermissions_name[int32(record.Fields[bundle.RelationKeyParticipantPermissions.String()].GetNumberValue())], + Status: strcase.ToSnake(model.ParticipantStatus_name[int32(record.Fields[bundle.RelationKeyParticipantStatus.String()].GetNumberValue())]), + Role: strcase.ToSnake(model.ParticipantPermissions_name[int32(record.Fields[bundle.RelationKeyParticipantPermissions.String()].GetNumberValue())]), } members = append(members, member) @@ -215,17 +254,23 @@ func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset i // GetMember returns the member with the given ID in the space with the given ID. func (s *SpaceService) GetMember(ctx context.Context, spaceId string, memberId string) (Member, error) { + // Member ID can be either a participant ID or an identity. + relationKey := bundle.RelationKeyId + if !strings.HasPrefix(memberId, "_participant") { + relationKey = bundle.RelationKeyIdentity + } + resp := s.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ { Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyId.String(), + RelationKey: relationKey.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.String(memberId), }, }, - Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String(), bundle.RelationKeyIconEmoji.String(), bundle.RelationKeyIconImage.String(), bundle.RelationKeyIdentity.String(), bundle.RelationKeyGlobalName.String(), bundle.RelationKeyParticipantPermissions.String()}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String(), bundle.RelationKeyIconEmoji.String(), bundle.RelationKeyIconImage.String(), bundle.RelationKeyIdentity.String(), bundle.RelationKeyGlobalName.String(), bundle.RelationKeyParticipantPermissions.String(), bundle.RelationKeyParticipantStatus.String()}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -245,10 +290,78 @@ func (s *SpaceService) GetMember(ctx context.Context, spaceId string, memberId s Icon: icon, Identity: resp.Records[0].Fields[bundle.RelationKeyIdentity.String()].GetStringValue(), GlobalName: resp.Records[0].Fields[bundle.RelationKeyGlobalName.String()].GetStringValue(), - Role: model.ParticipantPermissions_name[int32(resp.Records[0].Fields[bundle.RelationKeyParticipantPermissions.String()].GetNumberValue())], + Status: strcase.ToSnake(model.ParticipantStatus_name[int32(resp.Records[0].Fields[bundle.RelationKeyParticipantStatus.String()].GetNumberValue())]), + Role: strcase.ToSnake(model.ParticipantPermissions_name[int32(resp.Records[0].Fields[bundle.RelationKeyParticipantPermissions.String()].GetNumberValue())]), }, nil } +// UpdateMember approves member with defined role or removes them +func (s *SpaceService) UpdateMember(ctx context.Context, spaceId string, memberId string, request UpdateMemberRequest) (Member, error) { + member, err := s.GetMember(ctx, spaceId, memberId) + if err != nil { + return Member{}, err + } + + if request.Status != "active" && request.Status != "removed" && request.Status != "declined" { + return Member{}, ErrInvalidApproveMemberStatus + } + + switch request.Status { + case "active": + if request.Role != "reader" && request.Role != "writer" { + return Member{}, ErrInvalidApproveMemberRole + } + + if member.Status == "joining" { + // Approve the member's join request. + approveResp := s.mw.SpaceRequestApprove(ctx, &pb.RpcSpaceRequestApproveRequest{ + SpaceId: spaceId, + Identity: memberId, + Permissions: s.mapMemberRole(request.Role), + }) + if approveResp.Error.Code != pb.RpcSpaceRequestApproveResponseError_NULL { + return Member{}, ErrFailedUpdateMember + } + } else { + // Update the member's role. + resp := s.mw.SpaceParticipantPermissionsChange(ctx, &pb.RpcSpaceParticipantPermissionsChangeRequest{ + SpaceId: spaceId, + Changes: []*model.ParticipantPermissionChange{{Identity: memberId, Perms: s.mapMemberRole(request.Role)}}, + }) + if resp.Error.Code != pb.RpcSpaceParticipantPermissionsChangeResponseError_NULL { + return Member{}, ErrFailedUpdateMember + } + } + case "declined": + // Reject the member's join request. + rejectResp := s.mw.SpaceRequestDecline(ctx, &pb.RpcSpaceRequestDeclineRequest{ + SpaceId: spaceId, + Identity: memberId, + }) + if rejectResp.Error.Code != pb.RpcSpaceRequestDeclineResponseError_NULL { + return Member{}, ErrFailedUpdateMember + } + case "removed": + // Remove the member from the space. + removeResp := s.mw.SpaceParticipantRemove(ctx, &pb.RpcSpaceParticipantRemoveRequest{ + SpaceId: spaceId, + Identities: []string{memberId}, + }) + if removeResp.Error.Code != pb.RpcSpaceParticipantRemoveResponseError_NULL { + return Member{}, ErrFailedUpdateMember + } + default: + return Member{}, ErrInvalidApproveMemberStatus + } + + member, err = s.GetMember(ctx, spaceId, memberId) + if err != nil { + return Member{}, err + } + + return member, nil +} + // getWorkspaceInfo returns the workspace info for the space with the given ID. func (s *SpaceService) getWorkspaceInfo(spaceId string, name string, icon util.Icon) (space Space, err error) { workspaceResponse := s.mw.WorkspaceOpen(context.Background(), &pb.RpcWorkspaceOpenRequest{ @@ -282,3 +395,15 @@ func (s *SpaceService) getWorkspaceInfo(spaceId string, name string, icon util.I NetworkId: workspaceResponse.Info.NetworkId, }, nil } + +// mapMemberPermissions maps a role to participant permissions +func (s *SpaceService) mapMemberRole(permission string) model.ParticipantPermissions { + switch permission { + case "reader": + return model.ParticipantPermissions_Reader + case "writer": + return model.ParticipantPermissions_Writer + default: + return model.ParticipantPermissions_Reader + } +} diff --git a/core/api/internal/space/service_test.go b/core/api/internal/space/service_test.go index 02026aad9..d6da5a5fa 100644 --- a/core/api/internal/space/service_test.go +++ b/core/api/internal/space/service_test.go @@ -220,7 +220,7 @@ func TestSpaceService_CreateSpace(t *testing.T) { }, nil).Once() // when - space, err := fx.CreateSpace(nil, "New Space") + space, err := fx.CreateSpace(nil, CreateSpaceRequest{Name: "New Space"}) // then require.NoError(t, err) @@ -236,7 +236,7 @@ func TestSpaceService_CreateSpace(t *testing.T) { }).Once() // when - space, err := fx.CreateSpace(nil, "New Space") + space, err := fx.CreateSpace(nil, CreateSpaceRequest{Name: "New Space"}) // then require.ErrorIs(t, err, ErrFailedCreateSpace) @@ -254,20 +254,24 @@ func TestSpaceService_ListMembers(t *testing.T) { Records: []*types.Struct{ { Fields: map[string]*types.Value{ - bundle.RelationKeyId.String(): pbtypes.String("member-1"), - bundle.RelationKeyName.String(): pbtypes.String("John Doe"), - bundle.RelationKeyIconEmoji.String(): pbtypes.String("👤"), - bundle.RelationKeyIdentity.String(): pbtypes.String("AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"), - bundle.RelationKeyGlobalName.String(): pbtypes.String("john.any"), + bundle.RelationKeyId.String(): pbtypes.String("member-1"), + bundle.RelationKeyName.String(): pbtypes.String("John Doe"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("👤"), + bundle.RelationKeyIdentity.String(): pbtypes.String("AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"), + bundle.RelationKeyGlobalName.String(): pbtypes.String("john.any"), + bundle.RelationKeyParticipantStatus.String(): pbtypes.Int64(int64(model.ParticipantStatus_Active)), + bundle.RelationKeyParticipantPermissions.String(): pbtypes.Int64(int64(model.ParticipantPermissions_Owner)), }, }, { Fields: map[string]*types.Value{ - bundle.RelationKeyId.String(): pbtypes.String("member-2"), - bundle.RelationKeyName.String(): pbtypes.String("Jane Doe"), - bundle.RelationKeyIconImage.String(): pbtypes.String(iconImage), - bundle.RelationKeyIdentity.String(): pbtypes.String("AAjLbEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMD4"), - bundle.RelationKeyGlobalName.String(): pbtypes.String("jane.any"), + bundle.RelationKeyId.String(): pbtypes.String("member-2"), + bundle.RelationKeyName.String(): pbtypes.String("Jane Doe"), + bundle.RelationKeyIconImage.String(): pbtypes.String(iconImage), + bundle.RelationKeyIdentity.String(): pbtypes.String("AAjLbEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMD4"), + bundle.RelationKeyGlobalName.String(): pbtypes.String("jane.any"), + bundle.RelationKeyParticipantStatus.String(): pbtypes.Int64(int64(model.ParticipantStatus_Joining)), + bundle.RelationKeyParticipantPermissions.String(): pbtypes.Int64(int64(model.ParticipantPermissions_NoPermissions)), }, }, }, @@ -280,14 +284,21 @@ func TestSpaceService_ListMembers(t *testing.T) { // then require.NoError(t, err) require.Len(t, members, 2) + require.Equal(t, "member-1", members[0].Id) require.Equal(t, "John Doe", members[0].Name) require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr("👤")}, members[0].Icon) require.Equal(t, "john.any", members[0].GlobalName) + require.Equal(t, "active", members[0].Status) + require.Equal(t, "owner", members[0].Role) + require.Equal(t, "member-2", members[1].Id) require.Equal(t, "Jane Doe", members[1].Name) require.Regexpf(t, regexp.MustCompile(gatewayUrl+`/image/`+iconImage), *members[1].Icon.File, "Icon URL does not match") require.Equal(t, "jane.any", members[1].GlobalName) + require.Equal(t, "joining", members[1].Status) + require.Equal(t, "no_permissions", members[1].Role) + require.Equal(t, 2, total) require.False(t, hasMore) }) diff --git a/core/api/server/router.go b/core/api/server/router.go index bb2644229..7dc888a84 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -88,6 +88,7 @@ func (s *Server) NewRouter(accountService account.Service, mw service.ClientComm v1.GET("/spaces/:space_id", space.GetSpaceHandler(s.spaceService)) v1.GET("/spaces/:space_id/members", space.GetMembersHandler(s.spaceService)) v1.GET("/spaces/:space_id/members/:member_id", space.GetMemberHandler(s.spaceService)) + v1.PATCH("/spaces/:space_id/members/:member_id", s.rateLimit(maxWriteRequestsPerSecond), space.UpdateMemberHandler(s.spaceService)) v1.POST("/spaces", s.rateLimit(maxWriteRequestsPerSecond), space.CreateSpaceHandler(s.spaceService)) // Type From 018990d66ac078c190d9aea04e7da5b9e12d93bd Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 16 Mar 2025 14:24:15 +0100 Subject: [PATCH 054/132] GO-4459: Fix member tests --- core/api/internal/space/service_test.go | 127 +++++++++++++++++++----- 1 file changed, 104 insertions(+), 23 deletions(-) diff --git a/core/api/internal/space/service_test.go b/core/api/internal/space/service_test.go index d6da5a5fa..519c8ec35 100644 --- a/core/api/internal/space/service_test.go +++ b/core/api/internal/space/service_test.go @@ -245,27 +245,84 @@ func TestSpaceService_CreateSpace(t *testing.T) { } func TestSpaceService_ListMembers(t *testing.T) { + joiningReq := &pb.RpcObjectSearchRequest{ + SpaceId: "space-id", + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyResolvedLayout.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.ObjectType_participant)), + }, + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyParticipantStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.ParticipantStatus_Joining)), + }, + }, + Sorts: []*model.BlockContentDataviewSort{ + { + RelationKey: bundle.RelationKeyName.String(), + Type: model.BlockContentDataviewSort_Asc, + }, + }, + Keys: []string{ + bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + bundle.RelationKeyParticipantStatus.String(), + }, + } + + activeReq := &pb.RpcObjectSearchRequest{ + SpaceId: "space-id", + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyResolvedLayout.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.ObjectType_participant)), + }, + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyParticipantStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.ParticipantStatus_Active)), + }, + }, + Sorts: []*model.BlockContentDataviewSort{ + { + RelationKey: bundle.RelationKeyName.String(), + Type: model.BlockContentDataviewSort_Asc, + }, + }, + Keys: []string{ + bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + bundle.RelationKeyParticipantStatus.String(), + }, + } + t.Run("successfully get members", func(t *testing.T) { // given fx := newFixture(t) - fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). + fx.mwMock.On("ObjectSearch", mock.Anything, joiningReq). Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{ { Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String("member-1"), - bundle.RelationKeyName.String(): pbtypes.String("John Doe"), - bundle.RelationKeyIconEmoji.String(): pbtypes.String("👤"), - bundle.RelationKeyIdentity.String(): pbtypes.String("AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"), - bundle.RelationKeyGlobalName.String(): pbtypes.String("john.any"), - bundle.RelationKeyParticipantStatus.String(): pbtypes.Int64(int64(model.ParticipantStatus_Active)), - bundle.RelationKeyParticipantPermissions.String(): pbtypes.Int64(int64(model.ParticipantPermissions_Owner)), - }, - }, - { - Fields: map[string]*types.Value{ - bundle.RelationKeyId.String(): pbtypes.String("member-2"), bundle.RelationKeyName.String(): pbtypes.String("Jane Doe"), bundle.RelationKeyIconImage.String(): pbtypes.String(iconImage), bundle.RelationKeyIdentity.String(): pbtypes.String("AAjLbEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMD4"), @@ -278,6 +335,24 @@ func TestSpaceService_ListMembers(t *testing.T) { Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, }).Once() + fx.mwMock.On("ObjectSearch", mock.Anything, activeReq). + Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String("member-2"), + bundle.RelationKeyName.String(): pbtypes.String("John Doe"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("👤"), + bundle.RelationKeyIdentity.String(): pbtypes.String("AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"), + bundle.RelationKeyGlobalName.String(): pbtypes.String("john.any"), + bundle.RelationKeyParticipantStatus.String(): pbtypes.Int64(int64(model.ParticipantStatus_Active)), + bundle.RelationKeyParticipantPermissions.String(): pbtypes.Int64(int64(model.ParticipantPermissions_Owner)), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + // when members, total, hasMore, err := fx.ListMembers(nil, "space-id", offset, limit) @@ -286,18 +361,18 @@ func TestSpaceService_ListMembers(t *testing.T) { require.Len(t, members, 2) require.Equal(t, "member-1", members[0].Id) - require.Equal(t, "John Doe", members[0].Name) - require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr("👤")}, members[0].Icon) - require.Equal(t, "john.any", members[0].GlobalName) - require.Equal(t, "active", members[0].Status) - require.Equal(t, "owner", members[0].Role) + require.Equal(t, "Jane Doe", members[0].Name) + require.Regexpf(t, regexp.MustCompile(gatewayUrl+`/image/`+iconImage), *members[0].Icon.File, "Icon URL does not match") + require.Equal(t, "jane.any", members[0].GlobalName) + require.Equal(t, "joining", members[0].Status) + require.Equal(t, "no_permissions", members[0].Role) require.Equal(t, "member-2", members[1].Id) - require.Equal(t, "Jane Doe", members[1].Name) - require.Regexpf(t, regexp.MustCompile(gatewayUrl+`/image/`+iconImage), *members[1].Icon.File, "Icon URL does not match") - require.Equal(t, "jane.any", members[1].GlobalName) - require.Equal(t, "joining", members[1].Status) - require.Equal(t, "no_permissions", members[1].Role) + require.Equal(t, "John Doe", members[1].Name) + require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr("👤")}, members[1].Icon) + require.Equal(t, "john.any", members[1].GlobalName) + require.Equal(t, "active", members[1].Status) + require.Equal(t, "owner", members[1].Role) require.Equal(t, 2, total) require.False(t, hasMore) @@ -307,7 +382,13 @@ func TestSpaceService_ListMembers(t *testing.T) { // given fx := newFixture(t) - fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). + fx.mwMock.On("ObjectSearch", mock.Anything, activeReq). + Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{}, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + fx.mwMock.On("ObjectSearch", mock.Anything, joiningReq). Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{}, Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, From 54d70de7883e2c64d7e3282ff3c07d94e092e130 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 16 Mar 2025 14:24:26 +0100 Subject: [PATCH 055/132] GO-4459: Update swagger --- core/api/docs/docs.go | 2 +- core/api/docs/swagger.json | 2 +- core/api/docs/swagger.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index ecf0e0b1d..24e52deab 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -9,7 +9,7 @@ const docTemplate = `{ "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the relation used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"relation_key":{"description":"The relation key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the relation used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"relation_key":{"description":"The relation key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["reader","writer","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["reader","writer"],"example":"reader","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 388b43ff8..28b241cbd 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -2,7 +2,7 @@ "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the relation used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"relation_key":{"description":"The relation key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the relation used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"relation_key":{"description":"The relation key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["reader","writer","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["reader","writer"],"example":"reader","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 6383c46ec..7a687560f 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -1188,7 +1188,7 @@ paths: required: true schema: type: string - - description: Member ID + - description: Member ID or Identity in: path name: member_id required: true From 28f279fa0252ea50deb2d2a88df1ab7469bdfc2f Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 16 Mar 2025 14:24:32 +0100 Subject: [PATCH 056/132] GO-4459: Fix lint --- core/api/internal/space/service.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/api/internal/space/service.go b/core/api/internal/space/service.go index 0312b0c0e..2e9ea6c6f 100644 --- a/core/api/internal/space/service.go +++ b/core/api/internal/space/service.go @@ -226,7 +226,9 @@ func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset i return nil, 0, false, ErrFailedListMembers } - combinedRecords := append(joiningResp.Records, activeResp.Records...) + combinedRecords := make([]*types.Struct, 0, len(joiningResp.Records)+len(activeResp.Records)) + combinedRecords = append(combinedRecords, joiningResp.Records...) + combinedRecords = append(combinedRecords, activeResp.Records...) total = len(combinedRecords) paginatedMembers, hasMore := pagination.Paginate(combinedRecords, offset, limit) From 8fffbc2ab72b8a4e22e380358b19bd1282d5c6c3 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 16 Mar 2025 21:27:08 +0100 Subject: [PATCH 057/132] GO-4459: Update metadata header to use date Anytype-Version --- core/api/server/middleware.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/api/server/middleware.go b/core/api/server/middleware.go index 2317c935f..f83e26e04 100644 --- a/core/api/server/middleware.go +++ b/core/api/server/middleware.go @@ -99,7 +99,7 @@ func (s *Server) ensureAccountInfo(accountService account.Service) gin.HandlerFu // ensureMetadataHeader is a middleware that ensures the metadata header is set. func (s *Server) ensureMetadataHeader() gin.HandlerFunc { return func(c *gin.Context) { - c.Writer.Header().Set("X-API-Version", "0.0.2") + c.Writer.Header().Set("Anytype-Version", "2025-03-17") c.Next() } } From 41d9946947fbbfa916746c551d8a9dde5a8afa84 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 17 Mar 2025 11:57:47 +0100 Subject: [PATCH 058/132] GO-4459: Rename relation references to property everywhere --- core/api/docs/docs.go | 4 ++-- core/api/docs/swagger.json | 4 ++-- core/api/docs/swagger.yaml | 31 ++++++++++++----------------- core/api/internal/object/handler.go | 4 ++-- core/api/internal/object/model.go | 15 +++++--------- core/api/internal/object/service.go | 13 ++++++------ core/api/util/util.go | 12 +++++------ 7 files changed, 37 insertions(+), 46 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 24e52deab..611b81149 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -6,10 +6,10 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the relation used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"relation_key":{"description":"The relation key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the relation used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"relation_key":{"description":"The relation key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["reader","writer","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["reader","writer"],"example":"reader","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["reader","writer","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["reader","writer"],"example":"reader","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 28b241cbd..c35839505 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,8 +1,8 @@ { - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"relation":{"$ref":"#/components/schemas/object.Relation"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the relation used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"relation_key":{"description":"The relation key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Relation":{"description":"The relation block, if applicable","properties":{"id":{"type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the relation used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"relation_key":{"description":"The relation key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["reader","writer","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["reader","writer"],"example":"reader","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["reader","writer","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["reader","writer"],"example":"reader","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 7a687560f..72e29852f 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -57,8 +57,8 @@ components: description: The id of the block example: 64394517de52ad5acb89c66c type: string - relation: - $ref: '#/components/schemas/object.Relation' + property: + $ref: '#/components/schemas/object.Property' text: $ref: '#/components/schemas/object.Text' vertical_align: @@ -149,15 +149,15 @@ components: example: contains type: string format: - description: The format of the relation used for filtering + description: The format of the property used for filtering example: text type: string id: description: The id of the filter example: 67bf3f21cda9134102e2422c type: string - relation_key: - description: The relation key used for filtering + property_key: + description: The property key used for filtering example: name type: string value: @@ -220,6 +220,7 @@ components: $ref: '#/components/schemas/object.Object' type: object object.Property: + description: The property block, if applicable properties: checkbox: description: The checkbox value, if applicable @@ -298,24 +299,18 @@ components: example: https://example.com type: string type: object - object.Relation: - description: The relation block, if applicable - properties: - id: - type: string - type: object object.Sort: properties: format: - description: The format of the relation used for sorting + description: The format of the property used for sorting example: text type: string id: description: The id of the sort example: 67bf3f21cda9134102e2422c type: string - relation_key: - description: The relation key used for sorting + property_key: + description: The property key used for sorting example: name type: string sort_type: @@ -1346,7 +1341,7 @@ paths: key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional - operations (like setting featured relations or fetching bookmark metadata) + operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions. parameters: @@ -1465,9 +1460,9 @@ paths: description: Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include - text, files, and relations) and extra details (such as timestamps and linked - member information). This endpoint is essential when a client needs to render - or edit the full object view. + text, files, properties and dataviews) and extra details (such as timestamps + and linked member information). This endpoint is essential when a client needs + to render or edit the full object view. parameters: - description: Space ID in: path diff --git a/core/api/internal/object/handler.go b/core/api/internal/object/handler.go index 433a63b4f..a171c6e1c 100644 --- a/core/api/internal/object/handler.go +++ b/core/api/internal/object/handler.go @@ -49,7 +49,7 @@ func GetObjectsHandler(s *ObjectService) gin.HandlerFunc { // GetObjectHandler retrieves an object in a space // // @Summary Get object -// @Description Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, and relations) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view. +// @Description Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view. // @Tags objects // @Produce json // @Param space_id path string true "Space ID" @@ -122,7 +122,7 @@ func DeleteObjectHandler(s *ObjectService) gin.HandlerFunc { // CreateObjectHandler creates a new object in a space // // @Summary Create object -// @Description Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured relations or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions. +// @Description Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions. // @Tags objects // @Accept json // @Produce json diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index 6952e2c5a..c0b715332 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -38,7 +38,7 @@ type Block struct { VerticalAlign string `json:"vertical_align" enums:"VerticalAlignTop,VerticalAlignMiddle,VerticalAlignBottom" example:"VerticalAlignTop"` // The vertical alignment of the block Text *Text `json:"text,omitempty"` // The text of the block, if applicable File *File `json:"file,omitempty"` // The file of the block, if applicable - Relation *Relation `json:"relation,omitempty"` // The relation block, if applicable + Property *Property `json:"property,omitempty"` // The property block, if applicable Dataview *Dataview `json:"dataview,omitempty"` // The dataview, applicable for list objects } @@ -62,11 +62,6 @@ type File struct { Style string `json:"style"` // The style of the file } -// TODO: fill in the relation struct -type Relation struct { - Id string -} - type Dataview struct { Views []View `json:"views"` // The list of views } @@ -81,16 +76,16 @@ type View struct { type Filter struct { Id string `json:"id" example:"67bf3f21cda9134102e2422c"` // The id of the filter - RelationKey string `json:"relation_key" example:"name"` // The relation key used for filtering - Format string `json:"format" example:"text" enum:"text,number,select,multi_select,date,file,checkbox,url,email,phone,object"` // The format of the relation used for filtering + PropertyKey string `json:"property_key" example:"name"` // The property key used for filtering + Format string `json:"format" example:"text" enum:"text,number,select,multi_select,date,file,checkbox,url,email,phone,object"` // The format of the property used for filtering Condition string `json:"condition" example:"contains" enum:"equal,not_equal,greater,less,greater_or_equal,less_or_equal,like,not_like,in,not_in,empty,not_empty,all_in,not_all_in,exact_in,not_exact_in,exists"` // The filter condition Value string `json:"value" example:"Some value..."` // The value used for filtering } type Sort struct { Id string `json:"id" example:"67bf3f21cda9134102e2422c"` // The id of the sort - RelationKey string `json:"relation_key" example:"name"` // The relation key used for sorting - Format string `json:"format" example:"text" enum:"text,number,select,multi_select,date,file,checkbox,url,email,phone,object"` // The format of the relation used for sorting + PropertyKey string `json:"property_key" example:"name"` // The property key used for sorting + Format string `json:"format" example:"text" enum:"text,number,select,multi_select,date,file,checkbox,url,email,phone,object"` // The format of the property used for sorting SortType string `json:"sort_type" example:"asc" enum:"asc,desc,custom"` // The sort direction } diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 84619c425..f66b3d749 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -665,7 +665,7 @@ func (s *ObjectService) getProperty(key string, resp *pb.RpcObjectShowResponse) // Fallback to resolving the property name spaceId := resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue() - if name, err2 := util.ResolveRelationKeyToRelationName(s.mw, spaceId, key); err2 == nil { + if name, err2 := util.ResolveRelationKeyToPropertyName(s.mw, spaceId, key); err2 == nil { return key, name } return key, key @@ -788,7 +788,7 @@ func (s *ObjectService) getBlocks(resp *pb.RpcObjectShowResponse) []Block { for _, block := range resp.ObjectView.Blocks { var text *Text var file *File - var relation *Relation + var property *Property var dataviewMapping *Dataview switch content := block.Content.(type) { @@ -813,7 +813,8 @@ func (s *ObjectService) getBlocks(resp *pb.RpcObjectShowResponse) []Block { Style: model.BlockContentFileStyle_name[int32(content.File.Style)], } case *model.BlockContentOfRelation: - relation = &Relation{ + property = &Property{ + // TODO: is it sufficient to return the id only? Id: content.Relation.Key, } case *model.BlockContentOfDataview: @@ -823,7 +824,7 @@ func (s *ObjectService) getBlocks(resp *pb.RpcObjectShowResponse) []Block { for _, f := range v.Filters { filters = append(filters, Filter{ Id: f.Id, - RelationKey: f.RelationKey, + PropertyKey: f.RelationKey, Format: s.mapRelationFormat(f.Format), Condition: strcase.ToSnake(model.BlockContentDataviewFilterCondition_name[int32(f.Condition)]), Value: f.Value.GetStringValue(), @@ -833,7 +834,7 @@ func (s *ObjectService) getBlocks(resp *pb.RpcObjectShowResponse) []Block { for _, srt := range v.Sorts { sorts = append(sorts, Sort{ Id: srt.Id, - RelationKey: srt.RelationKey, + PropertyKey: srt.RelationKey, Format: s.mapRelationFormat(srt.Format), SortType: strcase.ToSnake(model.BlockContentDataviewSortType_name[int32(srt.Type)]), }) @@ -861,7 +862,7 @@ func (s *ObjectService) getBlocks(resp *pb.RpcObjectShowResponse) []Block { VerticalAlign: model.BlockVerticalAlign_name[int32(block.VerticalAlign)], Text: text, File: file, - Relation: relation, + Property: property, Dataview: dataviewMapping, }) } diff --git a/core/api/util/util.go b/core/api/util/util.go index 824da2f4b..de58ca31d 100644 --- a/core/api/util/util.go +++ b/core/api/util/util.go @@ -15,8 +15,8 @@ import ( var ( ErrFailedSearchType = errors.New("failed to search for type") ErrorTypeNotFound = errors.New("type not found") - ErrFailedSearchRelation = errors.New("failed to search for relation") - ErrorRelationNotFound = errors.New("relation not found") + ErrFailedSearchProperty = errors.New("failed to search for property") + ErrorPropertyNotFound = errors.New("property not found") ) var iconOptionToColor = map[float64]string{ @@ -97,8 +97,8 @@ func ResolveUniqueKeyToTypeId(mw service.ClientCommandsServer, spaceId string, u return resp.Records[0].Fields[bundle.RelationKeyId.String()].GetStringValue(), nil } -// ResolveRelationKeyToRelationName resolves the relation key to the relation's name -func ResolveRelationKeyToRelationName(mw service.ClientCommandsServer, spaceId string, relationKey string) (relation string, err error) { +// ResolveRelationKeyToPropertyName resolves the property key to the property's name +func ResolveRelationKeyToPropertyName(mw service.ClientCommandsServer, spaceId string, relationKey string) (property string, err error) { resp := mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ @@ -117,11 +117,11 @@ func ResolveRelationKeyToRelationName(mw service.ClientCommandsServer, spaceId s }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { - return "", ErrFailedSearchRelation + return "", ErrFailedSearchProperty } if len(resp.Records) == 0 { - return "", ErrorRelationNotFound + return "", ErrorPropertyNotFound } return resp.Records[0].Fields[bundle.RelationKeyName.String()].GetStringValue(), nil From 52575ec2c36c88fa611198e82e56f4b8c834129e Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 17 Mar 2025 15:07:32 +0100 Subject: [PATCH 059/132] GO-4459: Add participant status and permissions to excluded system properties --- core/api/internal/object/service.go | 80 +++++++++++++++-------------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index f66b3d749..0575112c1 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -44,45 +44,47 @@ var ( ) var excludedSystemProperties = map[string]bool{ - bundle.RelationKeyId.String(): true, - bundle.RelationKeySpaceId.String(): true, - bundle.RelationKeyName.String(): true, - bundle.RelationKeyIconEmoji.String(): true, - bundle.RelationKeyIconImage.String(): true, - bundle.RelationKeyType.String(): true, - bundle.RelationKeyResolvedLayout.String(): true, - bundle.RelationKeyIsFavorite.String(): true, - bundle.RelationKeyIsArchived.String(): true, - bundle.RelationKeyIsDeleted.String(): true, - bundle.RelationKeyIsHidden.String(): true, - bundle.RelationKeyWorkspaceId.String(): true, - bundle.RelationKeyInternalFlags.String(): true, - bundle.RelationKeyRestrictions.String(): true, - bundle.RelationKeyOrigin.String(): true, - bundle.RelationKeySnippet.String(): true, - bundle.RelationKeySyncStatus.String(): true, - bundle.RelationKeySyncError.String(): true, - bundle.RelationKeySyncDate.String(): true, - bundle.RelationKeyCoverId.String(): true, - bundle.RelationKeyCoverType.String(): true, - bundle.RelationKeyCoverScale.String(): true, - bundle.RelationKeyCoverX.String(): true, - bundle.RelationKeyCoverY.String(): true, - bundle.RelationKeyMentions.String(): true, - bundle.RelationKeyOldAnytypeID.String(): true, - bundle.RelationKeySource.String(): true, - bundle.RelationKeySourceFilePath.String(): true, - bundle.RelationKeyImportType.String(): true, - bundle.RelationKeyTargetObjectType.String(): true, - bundle.RelationKeyFeaturedRelations.String(): true, - bundle.RelationKeySetOf.String(): true, - bundle.RelationKeyLinks.String(): true, - bundle.RelationKeyBacklinks.String(): true, - bundle.RelationKeySourceObject.String(): true, - bundle.RelationKeyLayoutAlign.String(): true, - bundle.RelationKeyIsHiddenDiscovery.String(): true, - bundle.RelationKeyLayout.String(): true, - bundle.RelationKeyIsReadonly.String(): true, + bundle.RelationKeyId.String(): true, + bundle.RelationKeySpaceId.String(): true, + bundle.RelationKeyName.String(): true, + bundle.RelationKeyIconEmoji.String(): true, + bundle.RelationKeyIconImage.String(): true, + bundle.RelationKeyType.String(): true, + bundle.RelationKeyResolvedLayout.String(): true, + bundle.RelationKeyIsFavorite.String(): true, + bundle.RelationKeyIsArchived.String(): true, + bundle.RelationKeyIsDeleted.String(): true, + bundle.RelationKeyIsHidden.String(): true, + bundle.RelationKeyWorkspaceId.String(): true, + bundle.RelationKeyInternalFlags.String(): true, + bundle.RelationKeyRestrictions.String(): true, + bundle.RelationKeyOrigin.String(): true, + bundle.RelationKeySnippet.String(): true, + bundle.RelationKeySyncStatus.String(): true, + bundle.RelationKeySyncError.String(): true, + bundle.RelationKeySyncDate.String(): true, + bundle.RelationKeyCoverId.String(): true, + bundle.RelationKeyCoverType.String(): true, + bundle.RelationKeyCoverScale.String(): true, + bundle.RelationKeyCoverX.String(): true, + bundle.RelationKeyCoverY.String(): true, + bundle.RelationKeyMentions.String(): true, + bundle.RelationKeyOldAnytypeID.String(): true, + bundle.RelationKeySource.String(): true, + bundle.RelationKeySourceFilePath.String(): true, + bundle.RelationKeyImportType.String(): true, + bundle.RelationKeyTargetObjectType.String(): true, + bundle.RelationKeyFeaturedRelations.String(): true, + bundle.RelationKeySetOf.String(): true, + bundle.RelationKeyLinks.String(): true, + bundle.RelationKeyBacklinks.String(): true, + bundle.RelationKeySourceObject.String(): true, + bundle.RelationKeyLayoutAlign.String(): true, + bundle.RelationKeyIsHiddenDiscovery.String(): true, + bundle.RelationKeyLayout.String(): true, + bundle.RelationKeyIsReadonly.String(): true, + bundle.RelationKeyParticipantStatus.String(): true, + bundle.RelationKeyParticipantPermissions.String(): true, } type Service interface { From c53874ffc938a88ee57e9c0d070a8c8a180a2e35 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 18 Mar 2025 11:30:44 +0100 Subject: [PATCH 060/132] GO-4459: Update member status and roles in docs and models --- core/api/docs/docs.go | 4 ++-- core/api/docs/swagger.json | 4 ++-- core/api/docs/swagger.yaml | 21 +++++++++++++-------- core/api/internal/space/handler.go | 4 ++-- core/api/internal/space/model.go | 6 +++--- core/api/internal/space/service.go | 26 +++++++++++++++++++------- 6 files changed, 41 insertions(+), 24 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 611b81149..83185dccf 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -6,10 +6,10 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["reader","writer","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["reader","writer"],"example":"reader","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index c35839505..4ddc25af2 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,8 +1,8 @@ { - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["reader","writer","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["reader","writer"],"example":"reader","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 72e29852f..828904d96 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -606,8 +606,8 @@ components: role: description: The role of the member enum: - - reader - - writer + - viewer + - editor - owner - no_permission example: owner @@ -617,6 +617,10 @@ components: enum: - joining - active + - removed + - declined + - removing + - canceled example: active type: string type: object @@ -714,9 +718,9 @@ components: role: description: Role to assign if approving a joining member enum: - - reader - - writer - example: reader + - viewer + - editor + example: viewer type: string status: description: Status of the member @@ -1122,9 +1126,10 @@ paths: get: description: Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which - may be derived from an emoji or image), network identity, global name, and - role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features - by allowing clients to show who is in a space and manage access rights. + may be derived from an emoji or image), network identity, global name, status + (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint + supports collaborative features by allowing clients to show who is in a space + and manage access rights. parameters: - description: Space ID in: path diff --git a/core/api/internal/space/handler.go b/core/api/internal/space/handler.go index 9c48334f0..7f6aab9ad 100644 --- a/core/api/internal/space/handler.go +++ b/core/api/internal/space/handler.go @@ -118,7 +118,7 @@ func CreateSpaceHandler(s *SpaceService) gin.HandlerFunc { // GetMembersHandler retrieves a list of members in a space // // @Summary List members -// @Description Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, and role (e.g. Reader, Writer, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights. +// @Description Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights. // @Tags members // @Produce json // @Param space_id path string true "Space ID" @@ -153,7 +153,7 @@ func GetMembersHandler(s *SpaceService) gin.HandlerFunc { // GetMemberHandler retrieves a member in a space // // @Summary Get member -// @Description Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments. +// @Description Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments. // @Tags members // @Produce json // @Param space_id path string true "Space ID" diff --git a/core/api/internal/space/model.go b/core/api/internal/space/model.go index aea8a6f12..c9c3a58cd 100644 --- a/core/api/internal/space/model.go +++ b/core/api/internal/space/model.go @@ -40,7 +40,7 @@ type MemberResponse struct { type UpdateMemberRequest struct { Status string `json:"status" enums:"active,removed,declined" example:"active"` // Status of the member - Role string `json:"role,omitempty" enums:"reader,writer" example:"reader"` // Role to assign if approving a joining member + Role string `json:"role,omitempty" enums:"viewer,editor" example:"viewer"` // Role to assign if approving a joining member } type Member struct { @@ -50,6 +50,6 @@ type Member struct { Icon util.Icon `json:"icon"` // The icon of the member Identity string `json:"identity" example:"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"` // The identity of the member in the network GlobalName string `json:"global_name" example:"john.any"` // The global name of the member in the network - Status string `json:"status" enums:"joining,active" example:"active"` // The status of the member - Role string `json:"role" enums:"reader,writer,owner,no_permission" example:"owner"` // The role of the member + Status string `json:"status" enums:"joining,active,removed,declined,removing,canceled" example:"active"` // The status of the member + Role string `json:"role" enums:"viewer,editor,owner,no_permission" example:"owner"` // The role of the member } diff --git a/core/api/internal/space/service.go b/core/api/internal/space/service.go index 2e9ea6c6f..401152cae 100644 --- a/core/api/internal/space/service.go +++ b/core/api/internal/space/service.go @@ -245,7 +245,7 @@ func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset i Identity: record.Fields[bundle.RelationKeyIdentity.String()].GetStringValue(), GlobalName: record.Fields[bundle.RelationKeyGlobalName.String()].GetStringValue(), Status: strcase.ToSnake(model.ParticipantStatus_name[int32(record.Fields[bundle.RelationKeyParticipantStatus.String()].GetNumberValue())]), - Role: strcase.ToSnake(model.ParticipantPermissions_name[int32(record.Fields[bundle.RelationKeyParticipantPermissions.String()].GetNumberValue())]), + Role: s.mapMemberPermissions(model.ParticipantPermissions(record.Fields[bundle.RelationKeyParticipantPermissions.String()].GetNumberValue())), } members = append(members, member) @@ -293,7 +293,7 @@ func (s *SpaceService) GetMember(ctx context.Context, spaceId string, memberId s Identity: resp.Records[0].Fields[bundle.RelationKeyIdentity.String()].GetStringValue(), GlobalName: resp.Records[0].Fields[bundle.RelationKeyGlobalName.String()].GetStringValue(), Status: strcase.ToSnake(model.ParticipantStatus_name[int32(resp.Records[0].Fields[bundle.RelationKeyParticipantStatus.String()].GetNumberValue())]), - Role: strcase.ToSnake(model.ParticipantPermissions_name[int32(resp.Records[0].Fields[bundle.RelationKeyParticipantPermissions.String()].GetNumberValue())]), + Role: s.mapMemberPermissions(model.ParticipantPermissions(resp.Records[0].Fields[bundle.RelationKeyParticipantPermissions.String()].GetNumberValue())), }, nil } @@ -310,7 +310,7 @@ func (s *SpaceService) UpdateMember(ctx context.Context, spaceId string, memberI switch request.Status { case "active": - if request.Role != "reader" && request.Role != "writer" { + if request.Role != "viewer" && request.Role != "editor" { return Member{}, ErrInvalidApproveMemberRole } @@ -398,12 +398,24 @@ func (s *SpaceService) getWorkspaceInfo(spaceId string, name string, icon util.I }, nil } +// mapMemberPermissions maps participant permissions to a role +func (s *SpaceService) mapMemberPermissions(permissions model.ParticipantPermissions) string { + switch permissions { + case model.ParticipantPermissions_Reader: + return "viewer" + case model.ParticipantPermissions_Writer: + return "editor" + default: + return strcase.ToSnake(model.ParticipantPermissions_name[int32(permissions)]) + } +} + // mapMemberPermissions maps a role to participant permissions -func (s *SpaceService) mapMemberRole(permission string) model.ParticipantPermissions { - switch permission { - case "reader": +func (s *SpaceService) mapMemberRole(role string) model.ParticipantPermissions { + switch role { + case "viewer": return model.ParticipantPermissions_Reader - case "writer": + case "editor": return model.ParticipantPermissions_Writer default: return model.ParticipantPermissions_Reader From 4df8ec2380cc1eb0f8bea064fa4cbdba358272c8 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 18 Mar 2025 17:00:55 +0100 Subject: [PATCH 061/132] GO-4459: Add unit tests for list service --- core/api/internal/list/service_test.go | 499 +++++++++++++++++++++++++ 1 file changed, 499 insertions(+) create mode 100644 core/api/internal/list/service_test.go diff --git a/core/api/internal/list/service_test.go b/core/api/internal/list/service_test.go new file mode 100644 index 000000000..d7c0cedbc --- /dev/null +++ b/core/api/internal/list/service_test.go @@ -0,0 +1,499 @@ +package list + +import ( + "context" + "testing" + + "github.com/gogo/protobuf/types" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/anyproto/anytype-heart/core/api/internal/object" + "github.com/anyproto/anytype-heart/core/api/internal/space" + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pb/service/mock_service" + "github.com/anyproto/anytype-heart/pkg/lib/bundle" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + "github.com/anyproto/anytype-heart/util/pbtypes" +) + +const ( + mockedSpaceId = "mocked-space-id" + mockedListId = "mocked-list-id" + mockedViewId = "view-1" + offset = 0 + limit = 100 +) + +type fixture struct { + *ListService + mwMock *mock_service.MockClientCommandsServer + objectService *object.ObjectService +} + +func newFixture(t *testing.T) *fixture { + mw := mock_service.NewMockClientCommandsServer(t) + spaceService := space.NewService(mw) + objSvc := object.NewService(mw, spaceService) + objSvc.AccountInfo = &model.AccountInfo{ + TechSpaceId: "mocked-tech-space-id", + GatewayUrl: "http://localhost:31006", + } + listSvc := NewService(mw, objSvc) + return &fixture{ + ListService: listSvc, + mwMock: mw, + objectService: objSvc, + } +} + +func TestListService_GetObjectsInList(t *testing.T) { + + t.Run("successful", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + // Prepare a dataview view with dummy sorts and filters. + sorts := []*model.BlockContentDataviewSort{ + { + RelationKey: "dummy-sort", + Type: model.BlockContentDataviewSort_Asc, + }, + } + filters := []*model.BlockContentDataviewFilter{ + { + RelationKey: "dummy-filter", + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("dummy-value"), + }, + } + view := &model.BlockContentDataviewView{ + Id: mockedViewId, + Sorts: sorts, + Filters: filters, + } + + // Expect the ObjectShow call for the list to return a block with a dataview. + fx.mwMock. + On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedListId, + }). + Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + Blocks: []*model.Block{ + { + Id: "dataview", + Content: &model.BlockContentOfDataview{ + Dataview: &model.BlockContentDataview{ + Views: []*model.BlockContentDataviewView{view}, + }, + }, + }, + }, + }, + }, nil).Once() + + // Expect the ObjectSearchSubscribe call to return one record. + fx.mwMock. + On("ObjectSearchSubscribe", mock.Anything, &pb.RpcObjectSearchSubscribeRequest{ + SpaceId: mockedSpaceId, + Limit: int64(limit), + Offset: int64(offset), + Keys: []string{bundle.RelationKeyId.String()}, + CollectionId: mockedListId, + Sorts: sorts, + Filters: filters, + }). + Return(&pb.RpcObjectSearchSubscribeResponse{ + Error: &pb.RpcObjectSearchSubscribeResponseError{Code: pb.RpcObjectSearchSubscribeResponseError_NULL}, + Counters: &pb.EventObjectSubscriptionCounters{Total: 1}, + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String("object-1"), + }, + }, + }, + }, nil).Once() + + // Expect the object service to be called to get details for "object-1". + fx.mwMock. + On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: "object-1", + }). + Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + Details: []*model.ObjectViewDetailsSet{ + { + Id: "object-1", + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String("object-1"), + bundle.RelationKeyName.String(): pbtypes.String("Object One"), + }, + }, + }, + }, + }, + }, nil).Once() + + // when + objects, total, hasMore, err := fx.GetObjectsInList(ctx, mockedSpaceId, mockedListId, "", offset, limit) + + // then + require.NoError(t, err) + require.Len(t, objects, 1) + require.Equal(t, 1, total) + require.False(t, hasMore) + require.Equal(t, "object-1", objects[0].Id) + require.Equal(t, "Object One", objects[0].Name) + }) + + t.Run("object show error", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + // Simulate an error response (non-NULL error code) from ObjectShow for the list. + fx.mwMock. + On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedListId, + }). + Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_UNKNOWN_ERROR}, + }, nil).Once() + + // when + _, _, _, err := fx.GetObjectsInList(ctx, mockedSpaceId, mockedListId, "", offset, limit) + + // then + require.ErrorIs(t, err, ErrFailedGetList) + }) + + t.Run("no dataview block", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + // Return an ObjectView that does not contain a block with ID "dataview". + fx.mwMock. + On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedListId, + }). + Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + Blocks: []*model.Block{ + {Id: "non-dataview"}, + }, + }, + }, nil).Once() + + // when + _, _, _, err := fx.GetObjectsInList(ctx, mockedSpaceId, mockedListId, "", offset, limit) + + // then + require.ErrorIs(t, err, ErrFailedGetListDataview) + }) + + t.Run("invalid dataview content", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + // Return a "dataview" block that does not have the expected content type. + fx.mwMock. + On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedListId, + }). + Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + Blocks: []*model.Block{ + { + Id: "dataview", + Content: nil, + }, + }, + }, + }, nil).Once() + + // when + _, _, _, err := fx.GetObjectsInList(ctx, mockedSpaceId, mockedListId, "", offset, limit) + + // then + require.ErrorIs(t, err, ErrFailedGetListDataview) + }) + + t.Run("view not found", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + // Prepare a dataview that only contains a view with an ID different from the one requested. + view := &model.BlockContentDataviewView{ + Id: "some-other-view", + Sorts: []*model.BlockContentDataviewSort{}, + Filters: []*model.BlockContentDataviewFilter{}, + } + + fx.mwMock. + On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedListId, + }). + Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + Blocks: []*model.Block{ + { + Id: "dataview", + Content: &model.BlockContentOfDataview{ + Dataview: &model.BlockContentDataview{ + Views: []*model.BlockContentDataviewView{view}, + }, + }, + }, + }, + }, + }, nil).Once() + + // when + _, _, _, err := fx.GetObjectsInList(ctx, mockedSpaceId, mockedListId, "non-existent-view", offset, limit) + + // then + require.ErrorIs(t, err, ErrFailedGetListDataviewView) + }) + + t.Run("search subscribe error", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + // Prepare an empty dataview view (no sorts/filters). + sorts := []*model.BlockContentDataviewSort{} + filters := []*model.BlockContentDataviewFilter{} + view := &model.BlockContentDataviewView{ + Id: mockedViewId, + Sorts: sorts, + Filters: filters, + } + + fx.mwMock. + On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedListId, + }). + Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + Blocks: []*model.Block{ + { + Id: "dataview", + Content: &model.BlockContentOfDataview{ + Dataview: &model.BlockContentDataview{ + Views: []*model.BlockContentDataviewView{view}, + }, + }, + }, + }, + }, + }, nil).Once() + + // Simulate an error from ObjectSearchSubscribe. + fx.mwMock. + On("ObjectSearchSubscribe", mock.Anything, &pb.RpcObjectSearchSubscribeRequest{ + SpaceId: mockedSpaceId, + Limit: int64(limit), + Offset: int64(offset), + Keys: []string{bundle.RelationKeyId.String()}, + CollectionId: mockedListId, + Sorts: sorts, + Filters: filters, + }). + Return(&pb.RpcObjectSearchSubscribeResponse{ + Error: &pb.RpcObjectSearchSubscribeResponseError{Code: pb.RpcObjectSearchSubscribeResponseError_UNKNOWN_ERROR}, + }, nil).Once() + + // when + _, _, _, err := fx.GetObjectsInList(ctx, mockedSpaceId, mockedListId, "", offset, limit) + + // then + require.ErrorIs(t, err, ErrFailedGetObjectsInList) + }) + + t.Run("get object error", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + var sorts []*model.BlockContentDataviewSort + var filters []*model.BlockContentDataviewFilter + view := &model.BlockContentDataviewView{ + Id: mockedViewId, + Sorts: sorts, + Filters: filters, + } + + fx.mwMock. + On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedListId, + }). + Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + Blocks: []*model.Block{ + { + Id: "dataview", + Content: &model.BlockContentOfDataview{ + Dataview: &model.BlockContentDataview{ + Views: []*model.BlockContentDataviewView{view}, + }, + }, + }, + }, + }, + }, nil).Once() + + fx.mwMock. + On("ObjectSearchSubscribe", mock.Anything, &pb.RpcObjectSearchSubscribeRequest{ + SpaceId: mockedSpaceId, + Limit: int64(limit), + Offset: int64(offset), + Keys: []string{bundle.RelationKeyId.String()}, + CollectionId: mockedListId, + Sorts: sorts, + Filters: filters, + }). + Return(&pb.RpcObjectSearchSubscribeResponse{ + Error: &pb.RpcObjectSearchSubscribeResponseError{Code: pb.RpcObjectSearchSubscribeResponseError_NULL}, + Counters: &pb.EventObjectSubscriptionCounters{Total: 1}, + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String("object-err"), + }, + }, + }, + }, nil).Once() + + // Simulate an error when trying to retrieve the object details. + fx.mwMock. + On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: "object-err", + }). + Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NOT_FOUND}, + }, nil).Once() + + // when + _, _, _, err := fx.GetObjectsInList(ctx, mockedSpaceId, mockedListId, "", offset, limit) + + // then + require.ErrorIs(t, err, object.ErrObjectNotFound) + }) +} + +func TestListService_AddObjectsToList(t *testing.T) { + + t.Run("success", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + objectIds := []string{"obj-1", "obj-2"} + + fx.mwMock. + On("ObjectCollectionAdd", mock.Anything, &pb.RpcObjectCollectionAddRequest{ + ContextId: mockedListId, + ObjectIds: objectIds, + }). + Return(&pb.RpcObjectCollectionAddResponse{ + Error: &pb.RpcObjectCollectionAddResponseError{Code: pb.RpcObjectCollectionAddResponseError_NULL}, + }, nil).Once() + + // when + err := fx.AddObjectsToList(ctx, mockedSpaceId, mockedListId, objectIds) + + // then + require.NoError(t, err) + }) + + t.Run("failure", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + objectIds := []string{"obj-1"} + + fx.mwMock. + On("ObjectCollectionAdd", mock.Anything, &pb.RpcObjectCollectionAddRequest{ + ContextId: mockedListId, + ObjectIds: objectIds, + }). + Return(&pb.RpcObjectCollectionAddResponse{ + Error: &pb.RpcObjectCollectionAddResponseError{Code: pb.RpcObjectCollectionAddResponseError_UNKNOWN_ERROR}, + }, nil).Once() + + // when + err := fx.AddObjectsToList(ctx, mockedSpaceId, mockedListId, objectIds) + + // then + require.ErrorIs(t, err, ErrFailedAddObjectsToList) + }) +} + +func TestListService_RemoveObjectsFromList(t *testing.T) { + + t.Run("success", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + objectIds := []string{"obj-1", "obj-2"} + + fx.mwMock. + On("ObjectCollectionRemove", mock.Anything, &pb.RpcObjectCollectionRemoveRequest{ + ContextId: mockedListId, + ObjectIds: objectIds, + }). + Return(&pb.RpcObjectCollectionRemoveResponse{ + Error: &pb.RpcObjectCollectionRemoveResponseError{Code: pb.RpcObjectCollectionRemoveResponseError_NULL}, + }, nil).Once() + + // when + err := fx.RemoveObjectsFromList(ctx, mockedSpaceId, mockedListId, objectIds) + + // then + require.NoError(t, err) + }) + + t.Run("failure", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + objectIds := []string{"obj-1"} + + fx.mwMock. + On("ObjectCollectionRemove", mock.Anything, &pb.RpcObjectCollectionRemoveRequest{ + ContextId: mockedListId, + ObjectIds: objectIds, + }). + Return(&pb.RpcObjectCollectionRemoveResponse{ + Error: &pb.RpcObjectCollectionRemoveResponseError{Code: pb.RpcObjectCollectionRemoveResponseError_UNKNOWN_ERROR}, + }, nil).Once() + + // when + err := fx.RemoveObjectsFromList(ctx, mockedSpaceId, mockedListId, objectIds) + + // then + require.ErrorIs(t, err, ErrFailedRemoveObjectsFromList) + }) +} From 410e0dca70c23c11c9aa09d8cc749d27dd877e53 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 19 Mar 2025 10:00:52 +0100 Subject: [PATCH 062/132] GO-4459: Refactor sorting options to use typed constants for direction and property and allow sorting after name --- core/api/docs/docs.go | 4 +- core/api/docs/swagger.json | 4 +- core/api/docs/swagger.yaml | 43 +++++++---- core/api/internal/search/model.go | 20 ++++- core/api/internal/search/service.go | 97 ++++++++++++++++-------- core/api/internal/search/service_test.go | 8 +- 6 files changed, 120 insertions(+), 56 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 83185dccf..d714d00ee 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -6,10 +6,10 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 4ddc25af2..e3140ad98 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,8 +1,8 @@ { - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string"},"timestamp":{"default":"last_modified_date","description":"The timestamp to sort the search results by","enum":["created_date","last_modified_date","last_opened_date"],"type":"string"}},"type":"object"},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 828904d96..5d0289ee2 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -552,25 +552,38 @@ components: type: array uniqueItems: false type: object + search.SortDirection: + default: desc + description: The direction to sort the search results + enum: + - asc + - desc + type: string + x-enum-varnames: + - Asc + - Desc search.SortOptions: description: The sorting criteria and direction for the search results properties: direction: - default: desc - description: The direction to sort the search results - enum: - - asc - - desc - type: string - timestamp: - default: last_modified_date - description: The timestamp to sort the search results by - enum: - - created_date - - last_modified_date - - last_opened_date - type: string + $ref: '#/components/schemas/search.SortDirection' + property: + $ref: '#/components/schemas/search.SortProperty' type: object + search.SortProperty: + default: last_modified_date + description: The property to sort the search results by + enum: + - created_date + - last_modified_date + - last_opened_date + - name + type: string + x-enum-varnames: + - CreatedDate + - LastModifiedDate + - LastOpenedDate + - Name space.CreateSpaceRequest: properties: name: @@ -1179,7 +1192,7 @@ paths: get: description: Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global - name, and role. This is useful for user profile pages, permission management, + name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments. parameters: - description: Space ID diff --git a/core/api/internal/search/model.go b/core/api/internal/search/model.go index 5cf874790..eab85f5ba 100644 --- a/core/api/internal/search/model.go +++ b/core/api/internal/search/model.go @@ -1,5 +1,21 @@ package search +type SortDirection string + +const ( + Asc SortDirection = "asc" + Desc SortDirection = "desc" +) + +type SortProperty string + +const ( + CreatedDate SortProperty = "created_date" + LastModifiedDate SortProperty = "last_modified_date" + LastOpenedDate SortProperty = "last_opened_date" + Name SortProperty = "name" +) + type SearchRequest struct { Query string `json:"query" example:"test"` // The search term to look for in object names and snippets Types []string `json:"types" example:"ot-page,ot-678043f0cda9133be777049f,bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"` // The types of objects to search for, specified by unique key or ID @@ -7,6 +23,6 @@ type SearchRequest struct { } type SortOptions struct { - Direction string `json:"direction" enums:"asc,desc" default:"desc"` // The direction to sort the search results - Timestamp string `json:"timestamp" enums:"created_date,last_modified_date,last_opened_date" default:"last_modified_date"` // The timestamp to sort the search results by + Property SortProperty `json:"property" enums:"created_date,last_modified_date,last_opened_date,name" default:"last_modified_date"` // The property to sort the search results by + Direction SortDirection `json:"direction" enums:"asc,desc" default:"desc"` // The direction to sort the search results } diff --git a/core/api/internal/search/service.go b/core/api/internal/search/service.go index 0f62699b7..55d6e94d3 100644 --- a/core/api/internal/search/service.go +++ b/core/api/internal/search/service.go @@ -51,7 +51,15 @@ func (s *SearchService) GlobalSearch(ctx context.Context, request SearchRequest, if len(sorts) == 0 { return nil, 0, false, errors.New("no sort criteria provided") } - dateToSortAfter := sorts[0].RelationKey + criterionToSortAfter := sorts[0].RelationKey + + type sortRecord struct { + Id string + SpaceId string + numericSort float64 + stringSort string + } + combinedRecords := make([]sortRecord, 0) allResponses := make([]*pb.RpcObjectSearchResponse, 0, len(spaces)) for _, space := range spaces { @@ -64,7 +72,7 @@ func (s *SearchService) GlobalSearch(ctx context.Context, request SearchRequest, SpaceId: space.Id, Filters: filters, Sorts: sorts, - Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeySpaceId.String(), dateToSortAfter}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeySpaceId.String(), criterionToSortAfter}, Limit: int32(offset + limit), // nolint: gosec }) @@ -75,29 +83,42 @@ func (s *SearchService) GlobalSearch(ctx context.Context, request SearchRequest, allResponses = append(allResponses, objResp) } - combinedRecords := make([]struct { - Id string - SpaceId string - DateToSortAfter float64 - }, 0) for _, objResp := range allResponses { for _, record := range objResp.Records { - combinedRecords = append(combinedRecords, struct { - Id string - SpaceId string - DateToSortAfter float64 - }{ - Id: record.Fields[bundle.RelationKeyId.String()].GetStringValue(), - SpaceId: record.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), - DateToSortAfter: record.Fields[dateToSortAfter].GetNumberValue(), - }) + sr := sortRecord{ + Id: record.Fields[bundle.RelationKeyId.String()].GetStringValue(), + SpaceId: record.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), + } + if criterionToSortAfter == bundle.RelationKeyName.String() { + sr.stringSort = record.Fields[criterionToSortAfter].GetStringValue() + } else { + sr.numericSort = record.Fields[criterionToSortAfter].GetNumberValue() + } + combinedRecords = append(combinedRecords, sr) } } - // sort after posix last_modified_date to achieve descending sort order across all spaces - sort.SliceStable(combinedRecords, func(i, j int) bool { - return combinedRecords[i].DateToSortAfter > combinedRecords[j].DateToSortAfter - }) + if criterionToSortAfter == bundle.RelationKeyName.String() { + if sorts[0].Type == model.BlockContentDataviewSort_Asc { + sort.SliceStable(combinedRecords, func(i, j int) bool { + return combinedRecords[i].stringSort < combinedRecords[j].stringSort + }) + } else { + sort.SliceStable(combinedRecords, func(i, j int) bool { + return combinedRecords[i].stringSort > combinedRecords[j].stringSort + }) + } + } else { + if sorts[0].Type == model.BlockContentDataviewSort_Asc { + sort.SliceStable(combinedRecords, func(i, j int) bool { + return combinedRecords[i].numericSort < combinedRecords[j].numericSort + }) + } else { + sort.SliceStable(combinedRecords, func(i, j int) bool { + return combinedRecords[i].numericSort > combinedRecords[j].numericSort + }) + } + } total = len(combinedRecords) paginatedRecords, hasMore := pagination.Paginate(combinedRecords, offset, limit) @@ -126,13 +147,13 @@ func (s *SearchService) Search(ctx context.Context, spaceId string, request Sear if len(sorts) == 0 { return nil, 0, false, errors.New("no sort criteria provided") } - dateToSortAfter := sorts[0].RelationKey + criterionToSortAfter := sorts[0].RelationKey resp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: filters, Sorts: sorts, - Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeySpaceId.String(), dateToSortAfter}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeySpaceId.String(), criterionToSortAfter}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -284,9 +305,9 @@ func (s *SearchService) prepareObjectTypeFilters(spaceId string, objectTypes []s // prepareSorts returns a sort filter based on the given sort parameters func (s *SearchService) prepareSorts(sort SortOptions) []*model.BlockContentDataviewSort { primarySort := &model.BlockContentDataviewSort{ - RelationKey: s.getSortRelationKey(sort.Timestamp), + RelationKey: s.getSortRelationKey(sort.Property), Type: s.getSortDirection(sort.Direction), - Format: model.RelationFormat_date, + Format: s.getSortFormat(sort.Property), IncludeTime: true, EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, } @@ -307,27 +328,41 @@ func (s *SearchService) prepareSorts(sort SortOptions) []*model.BlockContentData } // getSortRelationKey returns the relation key for the given sort timestamp -func (s *SearchService) getSortRelationKey(timestamp string) string { +func (s *SearchService) getSortRelationKey(timestamp SortProperty) string { switch timestamp { - case "created_date": + case CreatedDate: return bundle.RelationKeyCreatedDate.String() - case "last_modified_date": + case LastModifiedDate: return bundle.RelationKeyLastModifiedDate.String() - case "last_opened_date": + case LastOpenedDate: return bundle.RelationKeyLastOpenedDate.String() + case Name: + return bundle.RelationKeyName.String() default: return bundle.RelationKeyLastModifiedDate.String() } } // getSortDirection returns the sort direction for the given string -func (s *SearchService) getSortDirection(direction string) model.BlockContentDataviewSortType { +func (s *SearchService) getSortDirection(direction SortDirection) model.BlockContentDataviewSortType { switch direction { - case "asc": + case Asc: return model.BlockContentDataviewSort_Asc - case "desc": + case Desc: return model.BlockContentDataviewSort_Desc default: return model.BlockContentDataviewSort_Desc } } + +// getSortFormat returns the sort format for the given timestamp +func (s *SearchService) getSortFormat(timestamp SortProperty) model.RelationFormat { + switch timestamp { + case CreatedDate, LastModifiedDate, LastOpenedDate: + return model.RelationFormat_date + case Name: + return model.RelationFormat_longtext + default: + return model.RelationFormat_date + } +} diff --git a/core/api/internal/search/service_test.go b/core/api/internal/search/service_test.go index 0430a0a32..47cb157ae 100644 --- a/core/api/internal/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -355,7 +355,7 @@ func TestSearchService_GlobalSearch(t *testing.T) { }, nil).Once() // when - objects, total, hasMore, err := fx.GlobalSearch(ctx, SearchRequest{Query: mockedSearchTerm, Types: []string{}, Sort: SortOptions{Direction: "desc", Timestamp: "last_modified_date"}}, offset, limit) + objects, total, hasMore, err := fx.GlobalSearch(ctx, SearchRequest{Query: mockedSearchTerm, Types: []string{}, Sort: SortOptions{Property: LastModifiedDate, Direction: Desc}}, offset, limit) // then require.NoError(t, err) @@ -517,7 +517,7 @@ func TestSearchService_Search(t *testing.T) { }).Once() // when - objects, total, hasMore, err := fx.Search(ctx, mockedSpaceId, SearchRequest{Query: mockedSearchTerm, Types: []string{}, Sort: SortOptions{Direction: "desc", Timestamp: "last_modified_date"}}, offset, limit) + objects, total, hasMore, err := fx.Search(ctx, mockedSpaceId, SearchRequest{Query: mockedSearchTerm, Types: []string{}, Sort: SortOptions{Property: LastModifiedDate, Direction: Desc}}, offset, limit) // then require.NoError(t, err) @@ -542,7 +542,7 @@ func TestSearchService_Search(t *testing.T) { }).Once() // when - objects, total, hasMore, err := fx.Search(ctx, mockedSpaceId, SearchRequest{Query: mockedSearchTerm, Types: []string{}, Sort: SortOptions{Direction: "desc", Timestamp: "last_modified_date"}}, offset, limit) + objects, total, hasMore, err := fx.Search(ctx, mockedSpaceId, SearchRequest{Query: mockedSearchTerm, Types: []string{}, Sort: SortOptions{Property: LastModifiedDate, Direction: Desc}}, offset, limit) // then require.NoError(t, err) @@ -561,7 +561,7 @@ func TestSearchService_Search(t *testing.T) { }).Once() // when - objects, total, hasMore, err := fx.Search(ctx, mockedSpaceId, SearchRequest{Query: mockedSearchTerm, Types: []string{}, Sort: SortOptions{Direction: "desc", Timestamp: "last_modified_date"}}, offset, limit) + objects, total, hasMore, err := fx.Search(ctx, mockedSpaceId, SearchRequest{Query: mockedSearchTerm, Types: []string{}, Sort: SortOptions{Property: LastModifiedDate, Direction: Desc}}, offset, limit) // then require.Error(t, err) From baa455eb02805813cbfe1a5bf14ca99d4481fb7c Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 19 Mar 2025 10:13:37 +0100 Subject: [PATCH 063/132] GO-4459: Simplify sorting logic into single sort function --- core/api/internal/search/service.go | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/core/api/internal/search/service.go b/core/api/internal/search/service.go index 55d6e94d3..329af7e80 100644 --- a/core/api/internal/search/service.go +++ b/core/api/internal/search/service.go @@ -98,27 +98,20 @@ func (s *SearchService) GlobalSearch(ctx context.Context, request SearchRequest, } } - if criterionToSortAfter == bundle.RelationKeyName.String() { - if sorts[0].Type == model.BlockContentDataviewSort_Asc { - sort.SliceStable(combinedRecords, func(i, j int) bool { + sortFunc := func(i, j int) bool { + if criterionToSortAfter == bundle.RelationKeyName.String() { + if sorts[0].Type == model.BlockContentDataviewSort_Asc { return combinedRecords[i].stringSort < combinedRecords[j].stringSort - }) + } + return combinedRecords[i].stringSort > combinedRecords[j].stringSort } else { - sort.SliceStable(combinedRecords, func(i, j int) bool { - return combinedRecords[i].stringSort > combinedRecords[j].stringSort - }) - } - } else { - if sorts[0].Type == model.BlockContentDataviewSort_Asc { - sort.SliceStable(combinedRecords, func(i, j int) bool { + if sorts[0].Type == model.BlockContentDataviewSort_Asc { return combinedRecords[i].numericSort < combinedRecords[j].numericSort - }) - } else { - sort.SliceStable(combinedRecords, func(i, j int) bool { - return combinedRecords[i].numericSort > combinedRecords[j].numericSort - }) + } + return combinedRecords[i].numericSort > combinedRecords[j].numericSort } } + sort.SliceStable(combinedRecords, sortFunc) total = len(combinedRecords) paginatedRecords, hasMore := pagination.Paginate(combinedRecords, offset, limit) From 2a7976eb1d02f46ded57cf437318fa50b9b0697a Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 19 Mar 2025 14:47:01 +0100 Subject: [PATCH 064/132] GO-4459: Fix v1 in swaggo router definition --- core/api/docs/docs.go | 2 +- core/api/docs/swagger.json | 2 +- core/api/docs/swagger.yaml | 386 +++++++++++++++--------------- core/api/internal/list/handler.go | 6 +- 4 files changed, 198 insertions(+), 198 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index d714d00ee..94ad69788 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -9,7 +9,7 @@ const docTemplate = `{ "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index e3140ad98..349a72860 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -2,7 +2,7 @@ "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 5d0289ee2..15280ebda 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -1135,6 +1135,199 @@ paths: summary: Get space tags: - spaces + /spaces/{space_id}/lists/{list_id}/{view_id}/objects: + get: + description: Returns a paginated list of objects that are associated with a + specific list (or collection) within a space. This endpoint helps clients + to manage grouped objects (for example, tasks within a list) by returning + detailed object information for each item of the list. + parameters: + - description: Space ID + in: path + name: space_id + required: true + schema: + type: string + - description: List ID + in: path + name: list_id + required: true + schema: + type: string + - description: View ID + in: path + name: view_id + required: true + schema: + type: string + - description: The number of items to skip before starting to collect the result + set + in: query + name: offset + schema: + default: 0 + type: integer + - description: The number of items to return + in: query + name: limit + schema: + type: integer + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/pagination.PaginatedResponse-object_Object' + description: List of objects + "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' + description: Unauthorized + "404": + content: + application/json: + schema: + $ref: '#/components/schemas/util.NotFoundError' + description: Not found + "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' + description: Internal server error + security: + - bearerauth: [] + summary: Get objects in list + tags: + - lists + /spaces/{space_id}/lists/{list_id}/objects: + post: + description: Enables clients to add one or more objects to a specific list by + submitting a JSON array of object IDs. Upon success, the endpoint returns + a confirmation message. This endpoint is vital for building user interfaces + that allow drag‑and‑drop or multi‑select additions to collections. + parameters: + - description: Space ID + in: path + name: space_id + required: true + schema: + type: string + - description: List ID + in: path + name: list_id + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + items: + type: string + type: array + description: List of object IDs + required: true + responses: + "200": + content: + application/json: + schema: + type: string + description: Objects added successfully + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ValidationError' + description: Bad request + "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' + description: Unauthorized + "404": + content: + application/json: + schema: + $ref: '#/components/schemas/util.NotFoundError' + description: Not found + "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' + description: Internal server error + security: + - bearerauth: [] + summary: Add objects to list + tags: + - lists + /spaces/{space_id}/lists/{list_id}/objects/{object_id}: + delete: + description: Removes a given object from the specified list in a space. The + endpoint takes the space, list, and object identifiers as path parameters. + It's subject to rate limiting and returns a success message on completion. + It is used for dynamically managing collections without affecting the underlying + object data. + parameters: + - description: Space ID + in: path + name: space_id + required: true + schema: + type: string + - description: List ID + in: path + name: list_id + required: true + schema: + type: string + - description: Object ID + in: path + name: object_id + required: true + schema: + type: string + responses: + "200": + content: + application/json: + schema: + type: string + description: Objects removed successfully + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ValidationError' + description: Bad request + "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' + description: Unauthorized + "404": + content: + application/json: + schema: + $ref: '#/components/schemas/util.NotFoundError' + description: Not found + "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' + description: Internal server error + security: + - bearerauth: [] + summary: Remove object from list + tags: + - lists /spaces/{space_id}/members: get: description: Returns a paginated list of members belonging to the specified @@ -1865,198 +2058,5 @@ paths: summary: Get template tags: - templates - /v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects: - get: - description: Returns a paginated list of objects that are associated with a - specific list (or collection) within a space. This endpoint helps clients - to manage grouped objects (for example, tasks within a list) by returning - detailed object information for each item of the list. - parameters: - - description: Space ID - in: path - name: space_id - required: true - schema: - type: string - - description: List ID - in: path - name: list_id - required: true - schema: - type: string - - description: View ID - in: path - name: view_id - required: true - schema: - type: string - - description: The number of items to skip before starting to collect the result - set - in: query - name: offset - schema: - default: 0 - type: integer - - description: The number of items to return - in: query - name: limit - schema: - type: integer - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/pagination.PaginatedResponse-object_Object' - description: List of objects - "401": - content: - application/json: - schema: - $ref: '#/components/schemas/util.UnauthorizedError' - description: Unauthorized - "404": - content: - application/json: - schema: - $ref: '#/components/schemas/util.NotFoundError' - description: Not found - "500": - content: - application/json: - schema: - $ref: '#/components/schemas/util.ServerError' - description: Internal server error - security: - - bearerauth: [] - summary: Get objects in list - tags: - - lists - /v1/spaces/{space_id}/lists/{list_id}/objects: - post: - description: Enables clients to add one or more objects to a specific list by - submitting a JSON array of object IDs. Upon success, the endpoint returns - a confirmation message. This endpoint is vital for building user interfaces - that allow drag‑and‑drop or multi‑select additions to collections. - parameters: - - description: Space ID - in: path - name: space_id - required: true - schema: - type: string - - description: List ID - in: path - name: list_id - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - items: - type: string - type: array - description: List of object IDs - required: true - responses: - "200": - content: - application/json: - schema: - type: string - description: Objects added successfully - "400": - content: - application/json: - schema: - $ref: '#/components/schemas/util.ValidationError' - description: Bad request - "401": - content: - application/json: - schema: - $ref: '#/components/schemas/util.UnauthorizedError' - description: Unauthorized - "404": - content: - application/json: - schema: - $ref: '#/components/schemas/util.NotFoundError' - description: Not found - "500": - content: - application/json: - schema: - $ref: '#/components/schemas/util.ServerError' - description: Internal server error - security: - - bearerauth: [] - summary: Add objects to list - tags: - - lists - /v1/spaces/{space_id}/lists/{list_id}/objects/{object_id}: - delete: - description: Removes a given object from the specified list in a space. The - endpoint takes the space, list, and object identifiers as path parameters. - It's subject to rate limiting and returns a success message on completion. - It is used for dynamically managing collections without affecting the underlying - object data. - parameters: - - description: Space ID - in: path - name: space_id - required: true - schema: - type: string - - description: List ID - in: path - name: list_id - required: true - schema: - type: string - - description: Object ID - in: path - name: object_id - required: true - schema: - type: string - responses: - "200": - content: - application/json: - schema: - type: string - description: Objects removed successfully - "400": - content: - application/json: - schema: - $ref: '#/components/schemas/util.ValidationError' - description: Bad request - "401": - content: - application/json: - schema: - $ref: '#/components/schemas/util.UnauthorizedError' - description: Unauthorized - "404": - content: - application/json: - schema: - $ref: '#/components/schemas/util.NotFoundError' - description: Not found - "500": - content: - application/json: - schema: - $ref: '#/components/schemas/util.ServerError' - description: Internal server error - security: - - bearerauth: [] - summary: Remove object from list - tags: - - lists servers: - url: http://localhost:31009/v1 diff --git a/core/api/internal/list/handler.go b/core/api/internal/list/handler.go index 63f9e86f7..4fece4d47 100644 --- a/core/api/internal/list/handler.go +++ b/core/api/internal/list/handler.go @@ -25,7 +25,7 @@ import ( // @Failure 404 {object} util.NotFoundError "Not found" // @Failure 500 {object} util.ServerError "Internal server error" // @Security bearerauth -// @Router /v1/spaces/{space_id}/lists/{list_id}/{view_id}/objects [get] +// @Router /spaces/{space_id}/lists/{list_id}/{view_id}/objects [get] func GetObjectsInListHandler(s *ListService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") @@ -65,7 +65,7 @@ func GetObjectsInListHandler(s *ListService) gin.HandlerFunc { // @Failure 404 {object} util.NotFoundError "Not found" // @Failure 500 {object} util.ServerError "Internal server error" // @Security bearerauth -// @Router /v1/spaces/{space_id}/lists/{list_id}/objects [post] +// @Router /spaces/{space_id}/lists/{list_id}/objects [post] func AddObjectsToListHandler(s *ListService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") @@ -108,7 +108,7 @@ func AddObjectsToListHandler(s *ListService) gin.HandlerFunc { // @Failure 404 {object} util.NotFoundError "Not found" // @Failure 500 {object} util.ServerError "Internal server error" // @Security bearerauth -// @Router /v1/spaces/{space_id}/lists/{list_id}/objects/{object_id} [delete] +// @Router /spaces/{space_id}/lists/{list_id}/objects/{object_id} [delete] func RemoveObjectFromListHandler(s *ListService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") From 558047275a1a88361bf07409efc987b7808a97b0 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:27:08 +0100 Subject: [PATCH 065/132] GO-4459: Update object type references and descriptions to use 'type_key' instead of 'unique_key' --- core/api/docs/docs.go | 4 +-- core/api/docs/swagger.json | 4 +-- core/api/docs/swagger.yaml | 31 +++++++++++++----------- core/api/internal/object/handler.go | 4 +-- core/api/internal/object/model.go | 18 +++++++------- core/api/internal/object/service.go | 12 ++++----- core/api/internal/object/service_test.go | 10 ++++---- 7 files changed, 43 insertions(+), 40 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 94ad69788..1f837b15b 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -6,10 +6,10 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 349a72860..888d0e090 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,8 +1,8 @@ { - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object_type_unique_key":{"description":"The unique key of the object type","example":"ot-page","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"unique_key":{"description":"The unique key of the type","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 15280ebda..3f18f7feb 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -88,10 +88,6 @@ components: description: The name of the object example: My object type: string - object_type_unique_key: - description: The unique key of the object type - example: ot-page - type: string source: description: The source url, only applicable for bookmarks example: https://bookmark-source.com @@ -100,6 +96,10 @@ components: description: The id of the template to use example: bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge type: string + type_key: + description: The key of the type of object to create + example: ot-page + type: string type: object object.Dataview: description: The dataview, applicable for list objects @@ -400,7 +400,7 @@ components: icon: $ref: '#/components/schemas/util.Icon' id: - description: The id of the type + description: The id of the type (which is unique across spaces) example: bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu type: string name: @@ -415,8 +415,9 @@ components: description: The recommended layout of the type example: todo type: string - unique_key: - description: The unique key of the type + type_key: + description: The key of the type (can be the same across spaces for known + types) example: ot-page type: string type: object @@ -1551,10 +1552,10 @@ paths: The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template - identifier, and the unique key for the object type. Post-creation, additional - operations (like setting featured properties or fetching bookmark metadata) - may occur. The endpoint then returns the full object data, ready for further - interactions. + identifier, and the type_key (which is the non-unique identifier of the type + of object to create). Post-creation, additional operations (like setting featured + properties or fetching bookmark metadata) may occur. The endpoint then returns + the full object data, ready for further interactions. parameters: - description: Space ID in: path @@ -1847,9 +1848,11 @@ paths: get: description: This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s - record includes its unique identifier, unique key, display name, icon, and - a recommended layout. Clients use this information when offering choices for - object creation or for filtering objects by type. + record includes its unique identifier, type key, display name, icon, and a + recommended layout. While a type's id is truly unique, a type's key can be + the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients + use this information when offering choices for object creation or for filtering + objects by type through search. parameters: - description: Space ID in: path diff --git a/core/api/internal/object/handler.go b/core/api/internal/object/handler.go index a171c6e1c..188714618 100644 --- a/core/api/internal/object/handler.go +++ b/core/api/internal/object/handler.go @@ -122,7 +122,7 @@ func DeleteObjectHandler(s *ObjectService) gin.HandlerFunc { // CreateObjectHandler creates a new object in a space // // @Summary Create object -// @Description Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the unique key for the object type. Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions. +// @Description Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions. // @Tags objects // @Accept json // @Produce json @@ -169,7 +169,7 @@ func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { // GetTypesHandler retrieves a list of types in a space // // @Summary List types -// @Description This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, unique key, display name, icon, and a recommended layout. Clients use this information when offering choices for object creation or for filtering objects by type. +// @Description This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search. // @Tags types // @Produce json // @Param space_id path string true "Space ID" diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index c0b715332..3f59bdd96 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -3,13 +3,13 @@ package object import "github.com/anyproto/anytype-heart/core/api/util" type CreateObjectRequest struct { - Name string `json:"name" example:"My object"` // The name of the object - Icon string `json:"icon" example:"📄"` // The icon of the object - Description string `json:"description" example:"This is a description of the object."` // The description of the object - Body string `json:"body" example:"This is the body of the object. Markdown syntax is supported here."` // The body of the object - Source string `json:"source" example:"https://bookmark-source.com"` // The source url, only applicable for bookmarks - TemplateId string `json:"template_id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` // The id of the template to use - ObjectTypeUniqueKey string `json:"object_type_unique_key" example:"ot-page"` // The unique key of the object type + Name string `json:"name" example:"My object"` // The name of the object + Icon string `json:"icon" example:"📄"` // The icon of the object + Description string `json:"description" example:"This is a description of the object."` // The description of the object + Body string `json:"body" example:"This is the body of the object. Markdown syntax is supported here."` // The body of the object + Source string `json:"source" example:"https://bookmark-source.com"` // The source url, only applicable for bookmarks + TemplateId string `json:"template_id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` // The id of the template to use + TypeKey string `json:"type_key" example:"ot-page"` // The key of the type of object to create } type ObjectResponse struct { @@ -118,8 +118,8 @@ type TypeResponse struct { type Type struct { Object string `json:"object" example:"type"` // The data model of the object - Id string `json:"id" example:"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu"` // The id of the type - UniqueKey string `json:"unique_key" example:"ot-page"` // The unique key of the type + Id string `json:"id" example:"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu"` // The id of the type (which is unique across spaces) + TypeKey string `json:"type_key" example:"ot-page"` // The key of the type (can be the same across spaces for known types) Name string `json:"name" example:"Page"` // The name of the type Icon util.Icon `json:"icon"` // The icon of the type RecommendedLayout string `json:"recommended_layout" example:"todo"` // The recommended layout of the type diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 0575112c1..b00f2fbd4 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -231,7 +231,7 @@ func (s *ObjectService) DeleteObject(ctx context.Context, spaceId string, object // CreateObject creates a new object in a specific space. func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, request CreateObjectRequest) (Object, error) { - if request.ObjectTypeUniqueKey == "ot-bookmark" && request.Source == "" { + if request.TypeKey == "ot-bookmark" && request.Source == "" { return Object{}, ErrInputMissingSource } @@ -249,7 +249,7 @@ func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, reques Details: details, TemplateId: request.TemplateId, SpaceId: spaceId, - ObjectTypeUniqueKey: request.ObjectTypeUniqueKey, + ObjectTypeUniqueKey: request.TypeKey, WithChat: false, }) @@ -271,7 +271,7 @@ func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, reques } // ObjectBookmarkFetch after creating a bookmark object - if request.ObjectTypeUniqueKey == "ot-bookmark" { + if request.TypeKey == "ot-bookmark" { bookmarkResp := s.mw.ObjectBookmarkFetch(ctx, &pb.RpcObjectBookmarkFetchRequest{ ContextId: resp.ObjectId, Url: request.Source, @@ -366,7 +366,7 @@ func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset in types = append(types, Type{ Object: "type", Id: record.Fields[bundle.RelationKeyId.String()].GetStringValue(), - UniqueKey: record.Fields[bundle.RelationKeyUniqueKey.String()].GetStringValue(), + TypeKey: record.Fields[bundle.RelationKeyUniqueKey.String()].GetStringValue(), Name: record.Fields[bundle.RelationKeyName.String()].GetStringValue(), Icon: util.GetIcon(s.AccountInfo, record.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), "", record.Fields[bundle.RelationKeyIconName.String()].GetStringValue(), record.Fields[bundle.RelationKeyIconOption.String()].GetNumberValue()), RecommendedLayout: model.ObjectTypeLayout_name[int32(record.Fields[bundle.RelationKeyRecommendedLayout.String()].GetNumberValue())], @@ -394,7 +394,7 @@ func (s *ObjectService) GetType(ctx context.Context, spaceId string, typeId stri return Type{ Object: "type", Id: typeId, - UniqueKey: details[bundle.RelationKeyUniqueKey.String()].GetStringValue(), + TypeKey: details[bundle.RelationKeyUniqueKey.String()].GetStringValue(), Name: details[bundle.RelationKeyName.String()].GetStringValue(), Icon: util.GetIcon(s.AccountInfo, details[bundle.RelationKeyIconEmoji.String()].GetStringValue(), "", details[bundle.RelationKeyIconName.String()].GetStringValue(), details[bundle.RelationKeyIconOption.String()].GetNumberValue()), RecommendedLayout: model.ObjectTypeLayout_name[int32(details[bundle.RelationKeyRecommendedLayout.String()].GetNumberValue())], @@ -517,7 +517,7 @@ func (s *ObjectService) getTypeFromDetails(typeId string, details []*model.Objec return Type{ Object: "type", Id: typeId, - UniqueKey: objectTypeDetail.Fields[bundle.RelationKeyUniqueKey.String()].GetStringValue(), + TypeKey: objectTypeDetail.Fields[bundle.RelationKeyUniqueKey.String()].GetStringValue(), Name: objectTypeDetail.Fields[bundle.RelationKeyName.String()].GetStringValue(), Icon: util.GetIcon(s.AccountInfo, objectTypeDetail.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), "", objectTypeDetail.Fields[bundle.RelationKeyIconName.String()].GetStringValue(), objectTypeDetail.Fields[bundle.RelationKeyIconOption.String()].GetNumberValue()), RecommendedLayout: model.ObjectTypeLayout_name[int32(objectTypeDetail.Fields[bundle.RelationKeyRecommendedLayout.String()].GetNumberValue())], diff --git a/core/api/internal/object/service_test.go b/core/api/internal/object/service_test.go index c964f2a4d..3e90e3bc3 100644 --- a/core/api/internal/object/service_test.go +++ b/core/api/internal/object/service_test.go @@ -227,7 +227,7 @@ func TestObjectService_ListObjects(t *testing.T) { require.Len(t, objects, 1) require.Equal(t, mockedTypeId, objects[0].Type.Id) require.Equal(t, mockedTypeName, objects[0].Type.Name) - require.Equal(t, mockedTypeUniqueKey, objects[0].Type.UniqueKey) + require.Equal(t, mockedTypeUniqueKey, objects[0].Type.TypeKey) require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr(mockedTypeIcon)}, objects[0].Type.Icon) require.Equal(t, mockedObjectId, objects[0].Id) require.Equal(t, mockedObjectName, objects[0].Name) @@ -419,7 +419,7 @@ func TestObjectService_GetObject(t *testing.T) { require.Equal(t, "object", object.Object) require.Equal(t, mockedTypeId, object.Type.Id) require.Equal(t, mockedTypeName, object.Type.Name) - require.Equal(t, mockedTypeUniqueKey, object.Type.UniqueKey) + require.Equal(t, mockedTypeUniqueKey, object.Type.TypeKey) require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr(mockedTypeIcon)}, object.Type.Icon) require.Equal(t, mockedObjectId, object.Id) require.Equal(t, mockedObjectName, object.Name) @@ -548,7 +548,7 @@ func TestObjectService_CreateObject(t *testing.T) { require.Equal(t, "object", object.Object) require.Equal(t, mockedTypeId, object.Type.Id) require.Equal(t, mockedTypeName, object.Type.Name) - require.Equal(t, mockedTypeUniqueKey, object.Type.UniqueKey) + require.Equal(t, mockedTypeUniqueKey, object.Type.TypeKey) require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr(mockedTypeIcon)}, object.Type.Icon) require.Equal(t, mockedNewObjectId, object.Id) require.Equal(t, mockedObjectName, object.Name) @@ -607,7 +607,7 @@ func TestObjectService_ListTypes(t *testing.T) { require.Len(t, types, 1) require.Equal(t, "type-1", types[0].Id) require.Equal(t, "Type One", types[0].Name) - require.Equal(t, "type-one-key", types[0].UniqueKey) + require.Equal(t, "type-one-key", types[0].TypeKey) require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr("🗂️")}, types[0].Icon) require.Equal(t, 1, total) require.False(t, hasMore) @@ -670,7 +670,7 @@ func TestObjectService_GetType(t *testing.T) { require.NoError(t, err) require.Equal(t, mockedTypeId, objType.Id) require.Equal(t, mockedTypeName, objType.Name) - require.Equal(t, mockedTypeUniqueKey, objType.UniqueKey) + require.Equal(t, mockedTypeUniqueKey, objType.TypeKey) require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr(mockedTypeIcon)}, objType.Icon) require.Equal(t, model.ObjectTypeLayout_name[int32(model.ObjectType_basic)], objType.RecommendedLayout) }) From d1cc49bfadf64589308f2177a94e690fc6d07b04 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:50:53 +0100 Subject: [PATCH 066/132] GO-4459: Refactor CreateObject to use util.Icon and add validation for icons --- core/api/internal/object/model.go | 14 ++++++------- core/api/internal/object/service.go | 31 ++++++++++++++++++++--------- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index 3f59bdd96..82e52001d 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -3,13 +3,13 @@ package object import "github.com/anyproto/anytype-heart/core/api/util" type CreateObjectRequest struct { - Name string `json:"name" example:"My object"` // The name of the object - Icon string `json:"icon" example:"📄"` // The icon of the object - Description string `json:"description" example:"This is a description of the object."` // The description of the object - Body string `json:"body" example:"This is the body of the object. Markdown syntax is supported here."` // The body of the object - Source string `json:"source" example:"https://bookmark-source.com"` // The source url, only applicable for bookmarks - TemplateId string `json:"template_id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` // The id of the template to use - TypeKey string `json:"type_key" example:"ot-page"` // The key of the type of object to create + Name string `json:"name" example:"My object"` // The name of the object + Icon util.Icon `json:"icon"` // The icon of the object + Description string `json:"description" example:"This is a description of the object."` // The description of the object + Body string `json:"body" example:"This is the body of the object. Markdown syntax is supported here."` // The body of the object + Source string `json:"source" example:"https://bookmark-source.com"` // The source url, only applicable for bookmarks + TemplateId string `json:"template_id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` // The id of the template to use + TypeKey string `json:"type_key" example:"ot-page"` // The key of the type of object to create } type ObjectResponse struct { diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index b00f2fbd4..6231df7a0 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -27,6 +27,7 @@ var ( ErrFailedDeleteObject = errors.New("failed to delete object") ErrFailedCreateObject = errors.New("failed to create object") ErrInputMissingSource = errors.New("source is missing for bookmark") + ErrIconNameColorNotSupported = errors.New("icon name and color are not supported for object") ErrFailedSetPropertyFeatured = errors.New("failed to set property featured") ErrFailedFetchBookmark = errors.New("failed to fetch bookmark") ErrFailedCreateBlock = errors.New("failed to create block") @@ -235,18 +236,30 @@ func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, reques return Object{}, ErrInputMissingSource } - details := &types.Struct{ - Fields: map[string]*types.Value{ - bundle.RelationKeyName.String(): pbtypes.String(request.Name), - bundle.RelationKeyIconEmoji.String(): pbtypes.String(request.Icon), - bundle.RelationKeyDescription.String(): pbtypes.String(request.Description), - bundle.RelationKeySource.String(): pbtypes.String(request.Source), - bundle.RelationKeyOrigin.String(): pbtypes.Int64(int64(model.ObjectOrigin_api)), - }, + // Validate icon: only allow either emoji or file, and disallow name and color fields. + if request.Icon.Name != nil || request.Icon.Color != nil { + return Object{}, ErrIconNameColorNotSupported + } + + iconFields := map[string]*types.Value{} + if request.Icon.Emoji != nil { + iconFields[bundle.RelationKeyIconEmoji.String()] = pbtypes.String(*request.Icon.Emoji) + } else if request.Icon.File != nil { + iconFields[bundle.RelationKeyIconImage.String()] = pbtypes.String(*request.Icon.File) + } + + fields := map[string]*types.Value{ + bundle.RelationKeyName.String(): pbtypes.String(request.Name), + bundle.RelationKeyDescription.String(): pbtypes.String(request.Description), + bundle.RelationKeySource.String(): pbtypes.String(request.Source), + bundle.RelationKeyOrigin.String(): pbtypes.Int64(int64(model.ObjectOrigin_api)), + } + for k, v := range iconFields { + fields[k] = v } resp := s.mw.ObjectCreate(ctx, &pb.RpcObjectCreateRequest{ - Details: details, + Details: &types.Struct{Fields: fields}, TemplateId: request.TemplateId, SpaceId: spaceId, ObjectTypeUniqueKey: request.TypeKey, From 7a252a1b23672f1005eda9a1ea44476f86816455 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:54:57 +0100 Subject: [PATCH 067/132] GO-4459: Fix tests and icon type --- core/api/internal/object/service_test.go | 50 ++++++++++++------------ core/api/util/util.go | 18 ++++++--- 2 files changed, 38 insertions(+), 30 deletions(-) diff --git a/core/api/internal/object/service_test.go b/core/api/internal/object/service_test.go index 3e90e3bc3..6fd190e2f 100644 --- a/core/api/internal/object/service_test.go +++ b/core/api/internal/object/service_test.go @@ -18,25 +18,25 @@ import ( ) const ( - offset = 0 - limit = 100 - mockedTechSpaceId = "mocked-tech-space-id" - gatewayUrl = "http://localhost:31006" - mockedSpaceId = "mocked-space-id" - mockedObjectId = "mocked-object-id" - mockedNewObjectId = "mocked-new-object-id" - mockedObjectName = "mocked-object-name" - mockedObjectSnippet = "mocked-object-snippet" - mockedObjectIcon = "🔍" - mockedParticipantId = "mocked-participant-id" - mockedObjectTypeUniqueKey = "ot-page" - mockedTypeId = "mocked-type-id" - mockedTypeName = "mocked-type-name" - mockedTypeUniqueKey = "mocked-type-unique-key" - mockedTypeIcon = "📝" - mockedTemplateId = "mocked-template-id" - mockedTemplateName = "mocked-template-name" - mockedTemplateIcon = "📃" + offset = 0 + limit = 100 + mockedTechSpaceId = "mocked-tech-space-id" + gatewayUrl = "http://localhost:31006" + mockedSpaceId = "mocked-space-id" + mockedObjectId = "mocked-object-id" + mockedNewObjectId = "mocked-new-object-id" + mockedObjectName = "mocked-object-name" + mockedObjectSnippet = "mocked-object-snippet" + mockedObjectIcon = "🔍" + mockedParticipantId = "mocked-participant-id" + mockedTypeKey = "ot-page" + mockedTypeId = "mocked-type-id" + mockedTypeName = "mocked-type-name" + mockedTypeUniqueKey = "mocked-type-unique-key" + mockedTypeIcon = "📝" + mockedTemplateId = "mocked-template-id" + mockedTemplateName = "mocked-template-name" + mockedTemplateIcon = "📃" ) type fixture struct { @@ -483,7 +483,7 @@ func TestObjectService_CreateObject(t *testing.T) { }, TemplateId: mockedTemplateId, SpaceId: mockedSpaceId, - ObjectTypeUniqueKey: mockedObjectTypeUniqueKey, + ObjectTypeUniqueKey: mockedTypeKey, WithChat: false, }).Return(&pb.RpcObjectCreateResponse{ ObjectId: mockedNewObjectId, @@ -537,10 +537,10 @@ func TestObjectService_CreateObject(t *testing.T) { // when object, err := fx.CreateObject(ctx, mockedSpaceId, CreateObjectRequest{ - Name: mockedObjectName, - Icon: mockedObjectIcon, - TemplateId: mockedTemplateId, - ObjectTypeUniqueKey: mockedObjectTypeUniqueKey, + Name: mockedObjectName, + Icon: util.Icon{Format: util.IconFormatEmoji, Emoji: util.StringPtr(mockedObjectIcon)}, + TemplateId: mockedTemplateId, + TypeKey: mockedTypeKey, }) // then @@ -569,7 +569,7 @@ func TestObjectService_CreateObject(t *testing.T) { // when object, err := fx.CreateObject(ctx, mockedSpaceId, CreateObjectRequest{ Name: "Fail Object", - Icon: "", + Icon: util.Icon{}, }) // then diff --git a/core/api/util/util.go b/core/api/util/util.go index de58ca31d..c3c9f37bc 100644 --- a/core/api/util/util.go +++ b/core/api/util/util.go @@ -32,12 +32,20 @@ var iconOptionToColor = map[float64]string{ 10: "lime", } +type IconFormat string + +const ( + IconFormatEmoji IconFormat = "emoji" + IconFormatFile IconFormat = "file" + IconFormatIcon IconFormat = "icon" +) + type Icon struct { - Format string `json:"format" enums:"emoji,file,icon" example:"emoji"` // The type of the icon - Emoji *string `json:"emoji,omitempty" example:"📄"` // The emoji of the icon - File *string `json:"file,omitempty" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay"` // The file of the icon - Name *string `json:"name,omitempty" example:"document"` // The name of the icon - Color *string `json:"color,omitempty" example:"red"` // The color of the icon + Format IconFormat `json:"format" enums:"emoji,file,icon" example:"emoji"` // The type of the icon + Emoji *string `json:"emoji,omitempty" example:"📄"` // The emoji of the icon + File *string `json:"file,omitempty" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay"` // The file of the icon + Name *string `json:"name,omitempty" example:"document"` // The name of the icon + Color *string `json:"color,omitempty" example:"red"` // The color of the icon } // StringPtr returns a pointer to the string From 4e6f6f6bcc4e9ef059f73b53313a43ea71e6a3ba Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 19 Mar 2025 20:04:54 +0100 Subject: [PATCH 068/132] GO-4459: Clean up space model --- core/api/docs/docs.go | 2 +- core/api/docs/swagger.json | 2 +- core/api/docs/swagger.yaml | 77 ++++++------------------------ core/api/internal/space/model.go | 25 +++------- core/api/internal/space/service.go | 25 +++------- 5 files changed, 28 insertions(+), 103 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 1f837b15b..4c4f81781 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -6,7 +6,7 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 888d0e090..c7c6fd517 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,5 +1,5 @@ { - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"description":"The icon of the object","example":"📄","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"account_space_id":{"description":"The id of the account space","example":"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1","type":"string"},"analytics_id":{"description":"The analytics id of the account","example":"624aecdd-4797-4611-9d61-a2ae5f53cf1c","type":"string"},"archive_object_id":{"description":"The id of the archive object","example":"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri","type":"string"},"device_id":{"description":"The id of the device","example":"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"home_object_id":{"description":"The id of the home object","example":"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"local_storage_path":{"description":"The local storage path of the account","example":"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha","type":"string"},"marketplace_workspace_id":{"description":"The id of the marketplace workspace","example":"_anytype_marketplace","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"},"profile_object_id":{"description":"The id of the profile object","example":"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4","type":"string"},"space_view_id":{"description":"The id of the space view","example":"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy","type":"string"},"tech_space_id":{"description":"The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself","example":"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1","type":"string"},"timezone":{"description":"The timezone of the account","example":"","type":"string"},"widgets_id":{"description":"The id of the widgets","example":"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva","type":"string"},"workspace_object_id":{"description":"The id of the workspace object","example":"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 3f18f7feb..05ad5c24e 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -81,9 +81,7 @@ components: example: This is a description of the object. type: string icon: - description: The icon of the object - example: "\U0001F4C4" - type: string + $ref: '#/components/schemas/util.Icon' name: description: The name of the object example: My object @@ -646,44 +644,16 @@ components: space.Space: description: The space properties: - account_space_id: - description: The id of the account space - example: bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1 - type: string - analytics_id: - description: The analytics id of the account - example: 624aecdd-4797-4611-9d61-a2ae5f53cf1c - type: string - archive_object_id: - description: The id of the archive object - example: bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri - type: string - device_id: - description: The id of the device - example: 12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF - type: string gateway_url: description: The gateway url to serve files and media example: http://127.0.0.1:31006 type: string - home_object_id: - description: The id of the home object - example: bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya - type: string icon: $ref: '#/components/schemas/util.Icon' id: description: The id of the space example: bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1 type: string - local_storage_path: - description: The local storage path of the account - example: /Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha - type: string - marketplace_workspace_id: - description: The id of the marketplace workspace - example: _anytype_marketplace - type: string name: description: The name of the space example: My Space @@ -696,31 +666,6 @@ components: description: The data model of the object example: space type: string - profile_object_id: - description: The id of the profile object - example: bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4 - type: string - space_view_id: - description: The id of the space view - example: bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy - type: string - tech_space_id: - description: The id of tech space, where objects outside of user's actual - spaces are stored, e.g. spaces itself - example: bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1 - type: string - timezone: - description: The timezone of the account - example: "" - type: string - widgets_id: - description: The id of the widgets - example: bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva - type: string - workspace_object_id: - description: The id of the workspace object - example: bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y - type: string type: object space.SpaceResponse: properties: @@ -770,18 +715,24 @@ components: example: http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay type: string format: - description: The type of the icon - enum: - - emoji - - file - - icon - example: emoji - type: string + $ref: '#/components/schemas/util.IconFormat' name: description: The name of the icon example: document type: string type: object + util.IconFormat: + description: The type of the icon + enum: + - emoji + - file + - icon + example: emoji + type: string + x-enum-varnames: + - IconFormatEmoji + - IconFormatFile + - IconFormatIcon util.NotFoundError: properties: error: diff --git a/core/api/internal/space/model.go b/core/api/internal/space/model.go index c9c3a58cd..146e65ffb 100644 --- a/core/api/internal/space/model.go +++ b/core/api/internal/space/model.go @@ -13,25 +13,12 @@ type CreateSpaceRequest struct { } type Space struct { - Object string `json:"object" example:"space"` // The data model of the object - Id string `json:"id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` // The id of the space - Name string `json:"name" example:"My Space"` // The name of the space - Icon util.Icon `json:"icon"` // The icon of the space - HomeObjectId string `json:"home_object_id" example:"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya"` // The id of the home object - ArchiveObjectId string `json:"archive_object_id" example:"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri"` // The id of the archive object - ProfileObjectId string `json:"profile_object_id" example:"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4"` // The id of the profile object - MarketplaceWorkspaceId string `json:"marketplace_workspace_id" example:"_anytype_marketplace"` // The id of the marketplace workspace - WorkspaceObjectId string `json:"workspace_object_id" example:"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y"` // The id of the workspace object - DeviceId string `json:"device_id" example:"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF"` // The id of the device - AccountSpaceId string `json:"account_space_id" example:"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1"` // The id of the account space - WidgetsId string `json:"widgets_id" example:"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva"` // The id of the widgets - SpaceViewId string `json:"space_view_id" example:"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy"` // The id of the space view - TechSpaceId string `json:"tech_space_id" example:"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1"` // The id of tech space, where objects outside of user's actual spaces are stored, e.g. spaces itself - GatewayUrl string `json:"gateway_url" example:"http://127.0.0.1:31006"` // The gateway url to serve files and media - LocalStoragePath string `json:"local_storage_path" example:"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha"` // The local storage path of the account - Timezone string `json:"timezone" example:""` // The timezone of the account - AnalyticsId string `json:"analytics_id" example:"624aecdd-4797-4611-9d61-a2ae5f53cf1c"` // The analytics id of the account - NetworkId string `json:"network_id" example:"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU"` // The network id of the space + Object string `json:"object" example:"space"` // The data model of the object + Id string `json:"id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` // The id of the space + Name string `json:"name" example:"My Space"` // The name of the space + Icon util.Icon `json:"icon"` // The icon of the space + GatewayUrl string `json:"gateway_url" example:"http://127.0.0.1:31006"` // The gateway url to serve files and media + NetworkId string `json:"network_id" example:"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU"` // The network id of the space } type MemberResponse struct { diff --git a/core/api/internal/space/service.go b/core/api/internal/space/service.go index 401152cae..683d63187 100644 --- a/core/api/internal/space/service.go +++ b/core/api/internal/space/service.go @@ -376,25 +376,12 @@ func (s *SpaceService) getWorkspaceInfo(spaceId string, name string, icon util.I } return Space{ - Object: "space", - Id: spaceId, - Name: name, - Icon: icon, - HomeObjectId: workspaceResponse.Info.HomeObjectId, - ArchiveObjectId: workspaceResponse.Info.ArchiveObjectId, - ProfileObjectId: workspaceResponse.Info.ProfileObjectId, - MarketplaceWorkspaceId: workspaceResponse.Info.MarketplaceWorkspaceId, - WorkspaceObjectId: workspaceResponse.Info.WorkspaceObjectId, - DeviceId: workspaceResponse.Info.DeviceId, - AccountSpaceId: workspaceResponse.Info.AccountSpaceId, - WidgetsId: workspaceResponse.Info.WidgetsId, - SpaceViewId: workspaceResponse.Info.SpaceViewId, - TechSpaceId: workspaceResponse.Info.TechSpaceId, - GatewayUrl: workspaceResponse.Info.GatewayUrl, - LocalStoragePath: workspaceResponse.Info.LocalStoragePath, - Timezone: workspaceResponse.Info.TimeZone, - AnalyticsId: workspaceResponse.Info.AnalyticsId, - NetworkId: workspaceResponse.Info.NetworkId, + Object: "space", + Id: spaceId, + Name: name, + Icon: icon, + GatewayUrl: workspaceResponse.Info.GatewayUrl, + NetworkId: workspaceResponse.Info.NetworkId, }, nil } From 420277322b8d025c8565fa1be52ecfba99e378e2 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 20 Mar 2025 08:50:47 +0100 Subject: [PATCH 069/132] GO-4459: Refactor CreateObject errors, bookmark and details --- core/api/internal/object/handler.go | 5 +- core/api/internal/object/service.go | 118 +++++++++++++++------------- 2 files changed, 69 insertions(+), 54 deletions(-) diff --git a/core/api/internal/object/handler.go b/core/api/internal/object/handler.go index 188714618..2bea31908 100644 --- a/core/api/internal/object/handler.go +++ b/core/api/internal/object/handler.go @@ -149,9 +149,12 @@ func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { object, err := s.CreateObject(c.Request.Context(), spaceId, request) code := util.MapErrorCode(err, util.ErrToCode(ErrInputMissingSource, http.StatusBadRequest), + util.ErrToCode(ErrIconNameColorNotSupported, http.StatusBadRequest), + util.ErrToCode(ErrFailedCreateBookmark, http.StatusInternalServerError), util.ErrToCode(ErrFailedCreateObject, http.StatusInternalServerError), util.ErrToCode(ErrFailedSetPropertyFeatured, http.StatusInternalServerError), - util.ErrToCode(ErrFailedFetchBookmark, http.StatusInternalServerError), + util.ErrToCode(ErrFailedCreateBlock, http.StatusInternalServerError), + util.ErrToCode(ErrFailedPasteBody, http.StatusInternalServerError), util.ErrToCode(ErrObjectNotFound, http.StatusInternalServerError), util.ErrToCode(ErrFailedRetrieveObject, http.StatusInternalServerError), ) diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 6231df7a0..36b0ee284 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -29,7 +29,7 @@ var ( ErrInputMissingSource = errors.New("source is missing for bookmark") ErrIconNameColorNotSupported = errors.New("icon name and color are not supported for object") ErrFailedSetPropertyFeatured = errors.New("failed to set property featured") - ErrFailedFetchBookmark = errors.New("failed to fetch bookmark") + ErrFailedCreateBookmark = errors.New("failed to fetch bookmark") ErrFailedCreateBlock = errors.New("failed to create block") ErrFailedPasteBody = errors.New("failed to paste body") @@ -232,74 +232,54 @@ func (s *ObjectService) DeleteObject(ctx context.Context, spaceId string, object // CreateObject creates a new object in a specific space. func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, request CreateObjectRequest) (Object, error) { - if request.TypeKey == "ot-bookmark" && request.Source == "" { - return Object{}, ErrInputMissingSource + details, err := s.buildObjectDetails(request) + if err != nil { + return Object{}, err } - // Validate icon: only allow either emoji or file, and disallow name and color fields. - if request.Icon.Name != nil || request.Icon.Color != nil { - return Object{}, ErrIconNameColorNotSupported - } + var objectId string + if request.TypeKey == "ot-bookmark" { + resp := s.mw.ObjectCreateBookmark(ctx, &pb.RpcObjectCreateBookmarkRequest{ + Details: details, + SpaceId: spaceId, + TemplateId: request.TemplateId, + }) - iconFields := map[string]*types.Value{} - if request.Icon.Emoji != nil { - iconFields[bundle.RelationKeyIconEmoji.String()] = pbtypes.String(*request.Icon.Emoji) - } else if request.Icon.File != nil { - iconFields[bundle.RelationKeyIconImage.String()] = pbtypes.String(*request.Icon.File) - } + if resp.Error.Code != pb.RpcObjectCreateBookmarkResponseError_NULL { + return Object{}, ErrFailedCreateBookmark + } + objectId = resp.ObjectId + } else { + resp := s.mw.ObjectCreate(ctx, &pb.RpcObjectCreateRequest{ + Details: details, + TemplateId: request.TemplateId, + SpaceId: spaceId, + ObjectTypeUniqueKey: request.TypeKey, + }) - fields := map[string]*types.Value{ - bundle.RelationKeyName.String(): pbtypes.String(request.Name), - bundle.RelationKeyDescription.String(): pbtypes.String(request.Description), - bundle.RelationKeySource.String(): pbtypes.String(request.Source), - bundle.RelationKeyOrigin.String(): pbtypes.Int64(int64(model.ObjectOrigin_api)), - } - for k, v := range iconFields { - fields[k] = v - } - - resp := s.mw.ObjectCreate(ctx, &pb.RpcObjectCreateRequest{ - Details: &types.Struct{Fields: fields}, - TemplateId: request.TemplateId, - SpaceId: spaceId, - ObjectTypeUniqueKey: request.TypeKey, - WithChat: false, - }) - - if resp.Error.Code != pb.RpcObjectCreateResponseError_NULL { - return Object{}, ErrFailedCreateObject + if resp.Error.Code != pb.RpcObjectCreateResponseError_NULL { + return Object{}, ErrFailedCreateObject + } + objectId = resp.ObjectId } // ObjectRelationAddFeatured if description was set if request.Description != "" { relAddFeatResp := s.mw.ObjectRelationAddFeatured(ctx, &pb.RpcObjectRelationAddFeaturedRequest{ - ContextId: resp.ObjectId, + ContextId: objectId, Relations: []string{bundle.RelationKeyDescription.String()}, }) if relAddFeatResp.Error.Code != pb.RpcObjectRelationAddFeaturedResponseError_NULL { - object, _ := s.GetObject(ctx, spaceId, resp.ObjectId) // nolint:errcheck + object, _ := s.GetObject(ctx, spaceId, objectId) // nolint:errcheck return object, ErrFailedSetPropertyFeatured } } - // ObjectBookmarkFetch after creating a bookmark object - if request.TypeKey == "ot-bookmark" { - bookmarkResp := s.mw.ObjectBookmarkFetch(ctx, &pb.RpcObjectBookmarkFetchRequest{ - ContextId: resp.ObjectId, - Url: request.Source, - }) - - if bookmarkResp.Error.Code != pb.RpcObjectBookmarkFetchResponseError_NULL { - object, _ := s.GetObject(ctx, spaceId, resp.ObjectId) // nolint:errcheck - return object, ErrFailedFetchBookmark - } - } - // First call BlockCreate at top, then BlockPaste to paste the body if request.Body != "" { blockCreateResp := s.mw.BlockCreate(ctx, &pb.RpcBlockCreateRequest{ - ContextId: resp.ObjectId, + ContextId: objectId, TargetId: "", Block: &model.Block{ Id: "", @@ -321,23 +301,55 @@ func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, reques }) if blockCreateResp.Error.Code != pb.RpcBlockCreateResponseError_NULL { - object, _ := s.GetObject(ctx, spaceId, resp.ObjectId) // nolint:errcheck + object, _ := s.GetObject(ctx, spaceId, objectId) // nolint:errcheck return object, ErrFailedCreateBlock } blockPasteResp := s.mw.BlockPaste(ctx, &pb.RpcBlockPasteRequest{ - ContextId: resp.ObjectId, + ContextId: objectId, FocusedBlockId: blockCreateResp.BlockId, TextSlot: request.Body, }) if blockPasteResp.Error.Code != pb.RpcBlockPasteResponseError_NULL { - object, _ := s.GetObject(ctx, spaceId, resp.ObjectId) // nolint:errcheck + object, _ := s.GetObject(ctx, spaceId, objectId) // nolint:errcheck return object, ErrFailedPasteBody } } - return s.GetObject(ctx, spaceId, resp.ObjectId) + return s.GetObject(ctx, spaceId, objectId) +} + +// buildObjectDetails extracts the details structure from the CreateObjectRequest. +func (s *ObjectService) buildObjectDetails(request CreateObjectRequest) (*types.Struct, error) { + // Validate bookmark source + if request.TypeKey == "ot-bookmark" && request.Source == "" { + return nil, ErrInputMissingSource + } + + // Validate icon: only allow either emoji or file, and disallow name and color fields. + if request.Icon.Name != nil || request.Icon.Color != nil { + return nil, ErrIconNameColorNotSupported + } + + iconFields := map[string]*types.Value{} + if request.Icon.Emoji != nil { + iconFields[bundle.RelationKeyIconEmoji.String()] = pbtypes.String(*request.Icon.Emoji) + } else if request.Icon.File != nil { + iconFields[bundle.RelationKeyIconImage.String()] = pbtypes.String(*request.Icon.File) + } + + fields := map[string]*types.Value{ + bundle.RelationKeyName.String(): pbtypes.String(request.Name), + bundle.RelationKeyDescription.String(): pbtypes.String(request.Description), + bundle.RelationKeySource.String(): pbtypes.String(request.Source), + bundle.RelationKeyOrigin.String(): pbtypes.Int64(int64(model.ObjectOrigin_api)), + } + for k, v := range iconFields { + fields[k] = v + } + + return &types.Struct{Fields: fields}, nil } // ListTypes returns a paginated list of types in a specific space. From c74306844ddc25d1f3bf6ced1e6551bae40817f2 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 20 Mar 2025 13:06:44 +0100 Subject: [PATCH 070/132] GO-4459: Add GoneError struct and update error handling for deleted object and type --- core/api/docs/docs.go | 4 +-- core/api/docs/swagger.json | 4 +-- core/api/docs/swagger.yaml | 29 +++++++++++++++++++++ core/api/internal/object/handler.go | 4 +++ core/api/internal/object/model.go | 2 ++ core/api/internal/object/service.go | 39 +++++++++++++++++++++-------- core/api/util/error.go | 7 ++++++ 7 files changed, 74 insertions(+), 15 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 4c4f81781..6fb9a1dea 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -6,10 +6,10 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index c7c6fd517..548de4a93 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,8 +1,8 @@ { - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 05ad5c24e..c56929a6e 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -166,6 +166,10 @@ components: object.Object: description: The object properties: + archived: + description: Whether the object is archived + example: false + type: boolean blocks: description: The blocks of the object items: @@ -395,6 +399,10 @@ components: object.Type: description: The type of the object properties: + archived: + description: Whether the type is archived + example: false + type: boolean icon: $ref: '#/components/schemas/util.Icon' id: @@ -699,6 +707,15 @@ components: type: string type: object type: object + util.GoneError: + properties: + error: + properties: + message: + example: Resource is gone + type: string + type: object + type: object util.Icon: description: The icon of the object properties: @@ -1658,6 +1675,12 @@ paths: schema: $ref: '#/components/schemas/util.NotFoundError' description: Resource not found + "410": + content: + application/json: + schema: + $ref: '#/components/schemas/util.GoneError' + description: Resource deleted "500": content: application/json: @@ -1888,6 +1911,12 @@ paths: schema: $ref: '#/components/schemas/util.NotFoundError' description: Resource not found + "410": + content: + application/json: + schema: + $ref: '#/components/schemas/util.GoneError' + description: Resource deleted "500": content: application/json: diff --git a/core/api/internal/object/handler.go b/core/api/internal/object/handler.go index 2bea31908..7d7bd42a8 100644 --- a/core/api/internal/object/handler.go +++ b/core/api/internal/object/handler.go @@ -57,6 +57,7 @@ func GetObjectsHandler(s *ObjectService) gin.HandlerFunc { // @Success 200 {object} ObjectResponse "The requested object" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 404 {object} util.NotFoundError "Resource not found" +// @Failure 410 {object} util.GoneError "Resource deleted" // @Failure 500 {object} util.ServerError "Internal server error" // @Security bearerauth // @Router /spaces/{space_id}/objects/{object_id} [get] @@ -68,6 +69,7 @@ func GetObjectHandler(s *ObjectService) gin.HandlerFunc { object, err := s.GetObject(c.Request.Context(), spaceId, objectId) code := util.MapErrorCode(err, util.ErrToCode(ErrObjectNotFound, http.StatusNotFound), + util.ErrToCode(ErrObjectDeleted, http.StatusGone), util.ErrToCode(ErrFailedRetrieveObject, http.StatusInternalServerError), ) @@ -215,6 +217,7 @@ func GetTypesHandler(s *ObjectService) gin.HandlerFunc { // @Success 200 {object} TypeResponse "The requested type" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 404 {object} util.NotFoundError "Resource not found" +// @Failure 410 {object} util.GoneError "Resource deleted" // @Failure 500 {object} util.ServerError "Internal server error" // @Security bearerauth // @Router /spaces/{space_id}/types/{type_id} [get] @@ -226,6 +229,7 @@ func GetTypeHandler(s *ObjectService) gin.HandlerFunc { object, err := s.GetType(c.Request.Context(), spaceId, typeId) code := util.MapErrorCode(err, util.ErrToCode(ErrTypeNotFound, http.StatusNotFound), + util.ErrToCode(ErrTypeDeleted, http.StatusGone), util.ErrToCode(ErrFailedRetrieveType, http.StatusInternalServerError), ) diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index 82e52001d..db25f4538 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -26,6 +26,7 @@ type Object struct { Layout string `json:"layout" example:"basic"` // The layout of the object SpaceId string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` // The id of the space the object is in RootId string `json:"root_id" example:"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u"` // The id of the object's root + Archived bool `json:"archived" example:"false"` // Whether the object is archived Blocks []Block `json:"blocks"` // The blocks of the object Properties []Property `json:"properties"` // The properties of the object } @@ -123,6 +124,7 @@ type Type struct { Name string `json:"name" example:"Page"` // The name of the type Icon util.Icon `json:"icon"` // The icon of the type RecommendedLayout string `json:"recommended_layout" example:"todo"` // The recommended layout of the type + Archived bool `json:"archived" example:"false"` // Whether the type is archived } type TemplateResponse struct { diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 36b0ee284..927d05eb7 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -22,6 +22,7 @@ import ( var ( // objects ErrObjectNotFound = errors.New("object not found") + ErrObjectDeleted = errors.New("object deleted") ErrFailedRetrieveObject = errors.New("failed to retrieve object") ErrFailedRetrieveObjects = errors.New("failed to retrieve list of objects") ErrFailedDeleteObject = errors.New("failed to delete object") @@ -36,6 +37,7 @@ var ( // types ErrFailedRetrieveTypes = errors.New("failed to retrieve types") ErrTypeNotFound = errors.New("type not found") + ErrTypeDeleted = errors.New("type deleted") ErrFailedRetrieveType = errors.New("failed to retrieve type") ErrFailedRetrieveTemplateType = errors.New("failed to retrieve template type") ErrTemplateTypeNotFound = errors.New("template type not found") @@ -183,12 +185,18 @@ func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId ObjectId: objectId, }) - if resp.Error != nil && resp.Error.Code == pb.RpcObjectShowResponseError_NOT_FOUND || resp.ObjectView != nil && resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIsArchived.String()].GetBoolValue() { - return Object{}, ErrObjectNotFound - } + if resp.Error != nil { + if resp.Error.Code == pb.RpcObjectShowResponseError_NOT_FOUND { + return Object{}, ErrObjectNotFound + } - if resp.Error != nil && resp.Error.Code != pb.RpcObjectShowResponseError_NULL { - return Object{}, ErrFailedRetrieveObject + if resp.Error.Code == pb.RpcObjectShowResponseError_OBJECT_DELETED { + return Object{}, ErrObjectDeleted + } + + if resp.Error.Code != pb.RpcObjectShowResponseError_NULL { + return Object{}, ErrFailedRetrieveObject + } } details := resp.ObjectView.Details[0].Details.Fields @@ -204,6 +212,7 @@ func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId Layout: model.ObjectTypeLayout_name[int32(details[bundle.RelationKeyResolvedLayout.String()].GetNumberValue())], SpaceId: details[bundle.RelationKeySpaceId.String()].GetStringValue(), RootId: resp.ObjectView.RootId, + Archived: details[bundle.RelationKeyIsArchived.String()].GetBoolValue(), Blocks: s.getBlocks(resp), Properties: s.getProperties(resp), } @@ -376,7 +385,7 @@ func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset in Type: model.BlockContentDataviewSort_Asc, }, }, - Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyUniqueKey.String(), bundle.RelationKeyName.String(), bundle.RelationKeyIconEmoji.String(), bundle.RelationKeyIconName.String(), bundle.RelationKeyIconOption.String(), bundle.RelationKeyRecommendedLayout.String()}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyUniqueKey.String(), bundle.RelationKeyName.String(), bundle.RelationKeyIconEmoji.String(), bundle.RelationKeyIconName.String(), bundle.RelationKeyIconOption.String(), bundle.RelationKeyRecommendedLayout.String(), bundle.RelationKeyIsArchived.String()}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -395,6 +404,7 @@ func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset in Name: record.Fields[bundle.RelationKeyName.String()].GetStringValue(), Icon: util.GetIcon(s.AccountInfo, record.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), "", record.Fields[bundle.RelationKeyIconName.String()].GetStringValue(), record.Fields[bundle.RelationKeyIconOption.String()].GetNumberValue()), RecommendedLayout: model.ObjectTypeLayout_name[int32(record.Fields[bundle.RelationKeyRecommendedLayout.String()].GetNumberValue())], + Archived: record.Fields[bundle.RelationKeyIsArchived.String()].GetBoolValue(), }) } return types, total, hasMore, nil @@ -407,12 +417,18 @@ func (s *ObjectService) GetType(ctx context.Context, spaceId string, typeId stri ObjectId: typeId, }) - if resp.Error.Code == pb.RpcObjectShowResponseError_NOT_FOUND { - return Type{}, ErrTypeNotFound - } + if resp.Error != nil { + if resp.Error.Code == pb.RpcObjectShowResponseError_NOT_FOUND { + return Type{}, ErrTypeNotFound + } - if resp.Error.Code != pb.RpcObjectShowResponseError_NULL { - return Type{}, ErrFailedRetrieveType + if resp.Error.Code == pb.RpcObjectShowResponseError_OBJECT_DELETED { + return Type{}, ErrTypeDeleted + } + + if resp.Error.Code != pb.RpcObjectShowResponseError_NULL { + return Type{}, ErrFailedRetrieveType + } } details := resp.ObjectView.Details[0].Details.Fields @@ -423,6 +439,7 @@ func (s *ObjectService) GetType(ctx context.Context, spaceId string, typeId stri Name: details[bundle.RelationKeyName.String()].GetStringValue(), Icon: util.GetIcon(s.AccountInfo, details[bundle.RelationKeyIconEmoji.String()].GetStringValue(), "", details[bundle.RelationKeyIconName.String()].GetStringValue(), details[bundle.RelationKeyIconOption.String()].GetNumberValue()), RecommendedLayout: model.ObjectTypeLayout_name[int32(details[bundle.RelationKeyRecommendedLayout.String()].GetNumberValue())], + Archived: details[bundle.RelationKeyIsArchived.String()].GetBoolValue(), }, nil } diff --git a/core/api/util/error.go b/core/api/util/error.go index 77aeff751..764359a57 100644 --- a/core/api/util/error.go +++ b/core/api/util/error.go @@ -33,6 +33,13 @@ type NotFoundError struct { } `json:"error"` } +// GoneError is a struct for 410 errors +type GoneError struct { + Error struct { + Message string `json:"message" example:"Resource is gone"` + } `json:"error"` +} + // RateLimitError is a struct for 423 errors type RateLimitError struct { Error struct { From 25dcfa45d6d1e6185d6a56a2c0a345d87e5ff8c6 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 20 Mar 2025 13:09:39 +0100 Subject: [PATCH 071/132] GO-4459: Remove RootId field from object model and tests --- core/api/docs/docs.go | 2 +- core/api/docs/swagger.json | 2 +- core/api/docs/swagger.yaml | 4 ---- core/api/internal/object/model.go | 1 - core/api/internal/object/service.go | 1 - core/api/internal/search/service_test.go | 11 +++++------ 6 files changed, 7 insertions(+), 14 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 6fb9a1dea..5b9b2ef04 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -6,7 +6,7 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 548de4a93..358d61aa0 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,5 +1,5 @@ { - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"root_id":{"description":"The id of the object's root","example":"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u","type":"string"},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index c56929a6e..a64aec811 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -200,10 +200,6 @@ components: $ref: '#/components/schemas/object.Property' type: array uniqueItems: false - root_id: - description: The id of the object's root - example: bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u - type: string snippet: description: The snippet of the object, especially important for notes as they don't have a name diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index db25f4538..56d550576 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -25,7 +25,6 @@ type Object struct { Snippet string `json:"snippet" example:"The beginning of the object body..."` // The snippet of the object, especially important for notes as they don't have a name Layout string `json:"layout" example:"basic"` // The layout of the object SpaceId string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` // The id of the space the object is in - RootId string `json:"root_id" example:"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u"` // The id of the object's root Archived bool `json:"archived" example:"false"` // Whether the object is archived Blocks []Block `json:"blocks"` // The blocks of the object Properties []Property `json:"properties"` // The properties of the object diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 927d05eb7..db846f1c0 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -211,7 +211,6 @@ func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId Snippet: details[bundle.RelationKeySnippet.String()].GetStringValue(), Layout: model.ObjectTypeLayout_name[int32(details[bundle.RelationKeyResolvedLayout.String()].GetNumberValue())], SpaceId: details[bundle.RelationKeySpaceId.String()].GetStringValue(), - RootId: resp.ObjectView.RootId, Archived: details[bundle.RelationKeyIsArchived.String()].GetBoolValue(), Blocks: s.getBlocks(resp), Properties: s.getProperties(resp), diff --git a/core/api/internal/search/service_test.go b/core/api/internal/search/service_test.go index 47cb157ae..2cedc370a 100644 --- a/core/api/internal/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -28,7 +28,6 @@ const ( mockedObjectId = "mocked-object-id" mockedObjectName = "mocked-object-name" mockedObjectIcon = "🌐" - mockedRootId = "mocked-root-id" mockedParticipantId = "mocked-participant-id" mockedType = "mocked-type" mockedTagId1 = "mocked-tag-id-1" @@ -199,10 +198,10 @@ func TestSearchService_GlobalSearch(t *testing.T) { ObjectId: mockedObjectId, }).Return(&pb.RpcObjectShowResponse{ ObjectView: &model.ObjectView{ - RootId: mockedRootId, + RootId: mockedObjectId, Blocks: []*model.Block{ { - Id: mockedRootId, + Id: mockedObjectId, Restrictions: &model.BlockRestrictions{ Read: false, Edit: false, @@ -235,7 +234,7 @@ func TestSearchService_GlobalSearch(t *testing.T) { }, Details: []*model.ObjectViewDetailsSet{ { - Id: mockedRootId, + Id: mockedObjectId, Details: &types.Struct{ Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), @@ -488,10 +487,10 @@ func TestSearchService_Search(t *testing.T) { ObjectId: mockedObjectId, }).Return(&pb.RpcObjectShowResponse{ ObjectView: &model.ObjectView{ - RootId: mockedRootId, + RootId: mockedObjectId, Details: []*model.ObjectViewDetailsSet{ { - Id: mockedRootId, + Id: mockedObjectId, Details: &types.Struct{ Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), From de7ded441d910e9df79881fc25eaba9c74e5b36e Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 20 Mar 2025 13:38:46 +0100 Subject: [PATCH 072/132] GO-4459: Add archived and 410 for templates --- core/api/docs/docs.go | 4 +-- core/api/docs/swagger.json | 4 +-- core/api/docs/swagger.yaml | 10 ++++++ core/api/internal/object/handler.go | 2 ++ core/api/internal/object/model.go | 17 ++++++----- core/api/internal/object/service.go | 47 +++++++++++++++++------------ 6 files changed, 53 insertions(+), 31 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 5b9b2ef04..4957bb441 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -6,10 +6,10 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 358d61aa0..d93223be9 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,8 +1,8 @@ { - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index a64aec811..a60f9afd1 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -335,6 +335,10 @@ components: object.Template: description: The template properties: + archived: + description: Whether the template is archived + example: false + type: boolean icon: $ref: '#/components/schemas/util.Icon' id: @@ -2026,6 +2030,12 @@ paths: schema: $ref: '#/components/schemas/util.NotFoundError' description: Resource not found + "410": + content: + application/json: + schema: + $ref: '#/components/schemas/util.GoneError' + description: Resource deleted "500": content: application/json: diff --git a/core/api/internal/object/handler.go b/core/api/internal/object/handler.go index 7d7bd42a8..e1378e3f9 100644 --- a/core/api/internal/object/handler.go +++ b/core/api/internal/object/handler.go @@ -295,6 +295,7 @@ func GetTemplatesHandler(s *ObjectService) gin.HandlerFunc { // @Success 200 {object} TemplateResponse "The requested template" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 404 {object} util.NotFoundError "Resource not found" +// @Failure 410 {object} util.GoneError "Resource deleted" // @Failure 500 {object} util.ServerError "Internal server error" // @Security bearerauth // @Router /spaces/{space_id}/types/{type_id}/templates/{template_id} [get] @@ -307,6 +308,7 @@ func GetTemplateHandler(s *ObjectService) gin.HandlerFunc { object, err := s.GetTemplate(c.Request.Context(), spaceId, typeId, templateId) code := util.MapErrorCode(err, util.ErrToCode(ErrTemplateNotFound, http.StatusNotFound), + util.ErrToCode(ErrTemplateDeleted, http.StatusGone), util.ErrToCode(ErrFailedRetrieveTemplate, http.StatusInternalServerError), ) diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index 56d550576..a864d48ac 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -21,11 +21,11 @@ type Object struct { Id string `json:"id" example:"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ"` // The id of the object Name string `json:"name" example:"My object"` // The name of the object Icon util.Icon `json:"icon"` // The icon of the object - Type Type `json:"type"` // The type of the object + Archived bool `json:"archived" example:"false"` // Whether the object is archived + SpaceId string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` // The id of the space the object is in Snippet string `json:"snippet" example:"The beginning of the object body..."` // The snippet of the object, especially important for notes as they don't have a name Layout string `json:"layout" example:"basic"` // The layout of the object - SpaceId string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` // The id of the space the object is in - Archived bool `json:"archived" example:"false"` // Whether the object is archived + Type Type `json:"type"` // The type of the object Blocks []Block `json:"blocks"` // The blocks of the object Properties []Property `json:"properties"` // The properties of the object } @@ -122,8 +122,8 @@ type Type struct { TypeKey string `json:"type_key" example:"ot-page"` // The key of the type (can be the same across spaces for known types) Name string `json:"name" example:"Page"` // The name of the type Icon util.Icon `json:"icon"` // The icon of the type - RecommendedLayout string `json:"recommended_layout" example:"todo"` // The recommended layout of the type Archived bool `json:"archived" example:"false"` // Whether the type is archived + RecommendedLayout string `json:"recommended_layout" example:"todo"` // The recommended layout of the type } type TemplateResponse struct { @@ -131,8 +131,9 @@ type TemplateResponse struct { } type Template struct { - Object string `json:"object" example:"template"` // The data model of the object - Id string `json:"id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` // The id of the template - Name string `json:"name" example:"My template"` // The name of the template - Icon util.Icon `json:"icon"` // The icon of the template + Object string `json:"object" example:"template"` // The data model of the object + Id string `json:"id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` // The id of the template + Name string `json:"name" example:"My template"` // The name of the template + Icon util.Icon `json:"icon"` // The icon of the template + Archived bool `json:"archived" example:"false"` // Whether the template is archived } diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index db846f1c0..36b5dcf99 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -44,6 +44,7 @@ var ( ErrFailedRetrieveTemplate = errors.New("failed to retrieve template") ErrFailedRetrieveTemplates = errors.New("failed to retrieve templates") ErrTemplateNotFound = errors.New("template not found") + ErrTemplateDeleted = errors.New("template deleted") ) var excludedSystemProperties = map[string]bool{ @@ -207,11 +208,11 @@ func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId Id: details[bundle.RelationKeyId.String()].GetStringValue(), Name: details[bundle.RelationKeyName.String()].GetStringValue(), Icon: icon, - Type: s.getTypeFromDetails(details[bundle.RelationKeyType.String()].GetStringValue(), resp.ObjectView.Details), + Archived: details[bundle.RelationKeyIsArchived.String()].GetBoolValue(), + SpaceId: details[bundle.RelationKeySpaceId.String()].GetStringValue(), Snippet: details[bundle.RelationKeySnippet.String()].GetStringValue(), Layout: model.ObjectTypeLayout_name[int32(details[bundle.RelationKeyResolvedLayout.String()].GetNumberValue())], - SpaceId: details[bundle.RelationKeySpaceId.String()].GetStringValue(), - Archived: details[bundle.RelationKeyIsArchived.String()].GetBoolValue(), + Type: s.getTypeFromDetails(details[bundle.RelationKeyType.String()].GetStringValue(), resp.ObjectView.Details), Blocks: s.getBlocks(resp), Properties: s.getProperties(resp), } @@ -402,8 +403,8 @@ func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset in TypeKey: record.Fields[bundle.RelationKeyUniqueKey.String()].GetStringValue(), Name: record.Fields[bundle.RelationKeyName.String()].GetStringValue(), Icon: util.GetIcon(s.AccountInfo, record.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), "", record.Fields[bundle.RelationKeyIconName.String()].GetStringValue(), record.Fields[bundle.RelationKeyIconOption.String()].GetNumberValue()), - RecommendedLayout: model.ObjectTypeLayout_name[int32(record.Fields[bundle.RelationKeyRecommendedLayout.String()].GetNumberValue())], Archived: record.Fields[bundle.RelationKeyIsArchived.String()].GetBoolValue(), + RecommendedLayout: model.ObjectTypeLayout_name[int32(record.Fields[bundle.RelationKeyRecommendedLayout.String()].GetNumberValue())], }) } return types, total, hasMore, nil @@ -437,8 +438,8 @@ func (s *ObjectService) GetType(ctx context.Context, spaceId string, typeId stri TypeKey: details[bundle.RelationKeyUniqueKey.String()].GetStringValue(), Name: details[bundle.RelationKeyName.String()].GetStringValue(), Icon: util.GetIcon(s.AccountInfo, details[bundle.RelationKeyIconEmoji.String()].GetStringValue(), "", details[bundle.RelationKeyIconName.String()].GetStringValue(), details[bundle.RelationKeyIconOption.String()].GetNumberValue()), - RecommendedLayout: model.ObjectTypeLayout_name[int32(details[bundle.RelationKeyRecommendedLayout.String()].GetNumberValue())], Archived: details[bundle.RelationKeyIsArchived.String()].GetBoolValue(), + RecommendedLayout: model.ObjectTypeLayout_name[int32(details[bundle.RelationKeyRecommendedLayout.String()].GetNumberValue())], }, nil } @@ -478,7 +479,7 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI Value: pbtypes.String(templateTypeId), }, }, - Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyTargetObjectType.String(), bundle.RelationKeyName.String(), bundle.RelationKeyIconEmoji.String()}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyTargetObjectType.String(), bundle.RelationKeyName.String(), bundle.RelationKeyIconEmoji.String(), bundle.RelationKeyIsArchived.String()}, }) if templateObjectsResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -508,10 +509,11 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI } templates = append(templates, Template{ - Object: "template", - Id: templateId, - Name: templateResp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), - Icon: util.GetIcon(s.AccountInfo, templateResp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), "", "", 0), + Object: "template", + Id: templateId, + Name: templateResp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), + Icon: util.GetIcon(s.AccountInfo, templateResp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), "", "", 0), + Archived: templateResp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIsArchived.String()].GetBoolValue(), }) } @@ -525,19 +527,26 @@ func (s *ObjectService) GetTemplate(ctx context.Context, spaceId string, typeId ObjectId: templateId, }) - if resp.Error.Code == pb.RpcObjectShowResponseError_NOT_FOUND { - return Template{}, ErrTemplateNotFound - } + if resp.Error != nil { + if resp.Error.Code == pb.RpcObjectShowResponseError_NOT_FOUND { + return Template{}, ErrTemplateNotFound + } - if resp.Error.Code != pb.RpcObjectShowResponseError_NULL { - return Template{}, ErrFailedRetrieveTemplate + if resp.Error.Code == pb.RpcObjectShowResponseError_OBJECT_DELETED { + return Template{}, ErrTemplateDeleted + } + + if resp.Error.Code != pb.RpcObjectShowResponseError_NULL { + return Template{}, ErrFailedRetrieveTemplate + } } return Template{ - Object: "template", - Id: templateId, - Name: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), - Icon: util.GetIcon(s.AccountInfo, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), "", "", 0), + Object: "template", + Id: templateId, + Name: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), + Icon: util.GetIcon(s.AccountInfo, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), "", "", 0), + Archived: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIsArchived.String()].GetBoolValue(), }, nil } From ffa566e4d024a57d5b0ed542cbb59fdff1d4aa62 Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Fri, 21 Mar 2025 10:37:11 +0100 Subject: [PATCH 073/132] GO-5303 type widget created notification --- core/block/service.go | 3 + core/block/widget.go | 29 +- docs/proto.md | 20 + pkg/lib/pb/model/models.pb.go | 1556 ++++++++++++++++---------- pkg/lib/pb/model/protos/models.proto | 8 + 5 files changed, 1036 insertions(+), 580 deletions(-) diff --git a/core/block/service.go b/core/block/service.go index 64934e594..9e801e050 100644 --- a/core/block/service.go +++ b/core/block/service.go @@ -35,6 +35,7 @@ import ( "github.com/anyproto/anytype-heart/core/files" "github.com/anyproto/anytype-heart/core/files/fileobject" "github.com/anyproto/anytype-heart/core/files/fileuploader" + "github.com/anyproto/anytype-heart/core/notifications" "github.com/anyproto/anytype-heart/core/session" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" @@ -100,6 +101,7 @@ type Service struct { builtinObjectService builtinObjects fileObjectService fileobject.Service detailsService detailservice.Service + notificationService notifications.Notifications fileService files.Service fileUploaderService fileuploader.Service @@ -127,6 +129,7 @@ func (s *Service) Init(a *app.App) (err error) { s.objectStore = a.MustComponent(objectstore.CName).(objectstore.ObjectStore) s.restriction = a.MustComponent(restriction.CName).(restriction.Service) s.bookmark = a.MustComponent("bookmark-importer").(bookmarksvc.Service) + s.notificationService = app.MustComponent[notifications.Notifications](a) s.objectCreator = app.MustComponent[objectcreator.Service](a) s.templateService = app.MustComponent[template.Service](a) s.spaceService = a.MustComponent(space.CName).(space.Service) diff --git a/core/block/widget.go b/core/block/widget.go index fc22342f7..92988d345 100644 --- a/core/block/widget.go +++ b/core/block/widget.go @@ -4,6 +4,8 @@ import ( "context" "fmt" + "github.com/google/uuid" + "github.com/anyproto/anytype-heart/core/block/cache" "github.com/anyproto/anytype-heart/core/block/editor" "github.com/anyproto/anytype-heart/core/block/editor/basic" @@ -92,7 +94,7 @@ func (s *Service) CreateTypeWidgetIfMissing(ctx context.Context, spaceId string, } widgetBlockId := key.String() - return cache.DoState(s, widgetObjectId, func(st *state.State, w widget.Widget) (err error) { + err = cache.DoState(s, widgetObjectId, func(st *state.State, w widget.Widget) (err error) { targets := st.Details().Get(bundle.RelationKeyAutoWidgetTargets).StringList() targets = append(targets, typeId) st.SetDetail(bundle.RelationKeyAutoWidgetTargets, domain.StringList(targets)) @@ -131,6 +133,29 @@ func (s *Service) CreateTypeWidgetIfMissing(ctx context.Context, spaceId string, }}, }, }) - return err + if err != nil { + return err + } + objectType, err := s.objectStore.SpaceIndex(spaceId).GetObjectType(typeId) + if err != nil { + log.Errorf("failed to get object type to send the notification %s: %s", typeId, err) + } else { + err = s.notificationService.CreateAndSend(&model.Notification{ + Id: uuid.New().String(), + IsLocal: true, + IsToast: true, + Payload: &model.NotificationPayloadOfAutoTypeWidgetAdded{AutoTypeWidgetAdded: &model.NotificationAutoTypeWidgetAdded{ + SpaceId: spaceId, + TypePluralName: objectType.PluralName, + WidgetBlockId: widgetBlockId, + }}, + }) + if err != nil { + log.Errorf("failed to send the notification %s: %s", typeId, err) + } + } + + return nil }) + return err } diff --git a/docs/proto.md b/docs/proto.md index c120066e1..503826066 100644 --- a/docs/proto.md +++ b/docs/proto.md @@ -1930,6 +1930,7 @@ - [Metadata.Payload](#anytype-model-Metadata-Payload) - [Metadata.Payload.IdentityPayload](#anytype-model-Metadata-Payload-IdentityPayload) - [Notification](#anytype-model-Notification) + - [Notification.AutoTypeWidgetAdded](#anytype-model-Notification-AutoTypeWidgetAdded) - [Notification.Export](#anytype-model-Notification-Export) - [Notification.GalleryImport](#anytype-model-Notification-GalleryImport) - [Notification.Import](#anytype-model-Notification-Import) @@ -30512,6 +30513,7 @@ Used to decode block meta only, without the content itself | createTime | [int64](#int64) | | | | status | [Notification.Status](#anytype-model-Notification-Status) | | | | isLocal | [bool](#bool) | | | +| isToast | [bool](#bool) | | means it should automatically hide after some time if client window is active | | import | [Notification.Import](#anytype-model-Notification-Import) | | | | export | [Notification.Export](#anytype-model-Notification-Export) | | | | galleryImport | [Notification.GalleryImport](#anytype-model-Notification-GalleryImport) | | | @@ -30522,6 +30524,7 @@ Used to decode block meta only, without the content itself | participantRemove | [Notification.ParticipantRemove](#anytype-model-Notification-ParticipantRemove) | | | | participantRequestDecline | [Notification.ParticipantRequestDecline](#anytype-model-Notification-ParticipantRequestDecline) | | | | participantPermissionsChange | [Notification.ParticipantPermissionsChange](#anytype-model-Notification-ParticipantPermissionsChange) | | | +| autoTypeWidgetAdded | [Notification.AutoTypeWidgetAdded](#anytype-model-Notification-AutoTypeWidgetAdded) | | | | space | [string](#string) | | | | aclHeadId | [string](#string) | | | @@ -30530,6 +30533,23 @@ Used to decode block meta only, without the content itself + + +### Notification.AutoTypeWidgetAdded + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| spaceId | [string](#string) | | | +| typePluralName | [string](#string) | | fallback to singular if missing | +| widgetBlockId | [string](#string) | | | + + + + + + ### Notification.Export diff --git a/pkg/lib/pb/model/models.pb.go b/pkg/lib/pb/model/models.pb.go index aafcc2e38..329c3b35c 100644 --- a/pkg/lib/pb/model/models.pb.go +++ b/pkg/lib/pb/model/models.pb.go @@ -7343,6 +7343,7 @@ type Notification struct { CreateTime int64 `protobuf:"varint,2,opt,name=createTime,proto3" json:"createTime,omitempty"` Status NotificationStatus `protobuf:"varint,4,opt,name=status,proto3,enum=anytype.model.NotificationStatus" json:"status,omitempty"` IsLocal bool `protobuf:"varint,5,opt,name=isLocal,proto3" json:"isLocal,omitempty"` + IsToast bool `protobuf:"varint,3,opt,name=isToast,proto3" json:"isToast,omitempty"` // Types that are valid to be assigned to Payload: // // *NotificationPayloadOfImport @@ -7355,6 +7356,7 @@ type Notification struct { // *NotificationPayloadOfParticipantRemove // *NotificationPayloadOfParticipantRequestDecline // *NotificationPayloadOfParticipantPermissionsChange + // *NotificationPayloadOfAutoTypeWidgetAdded Payload IsNotificationPayload `protobuf_oneof:"payload"` Space string `protobuf:"bytes,7,opt,name=space,proto3" json:"space,omitempty"` AclHeadId string `protobuf:"bytes,14,opt,name=aclHeadId,proto3" json:"aclHeadId,omitempty"` @@ -7429,6 +7431,9 @@ type NotificationPayloadOfParticipantRequestDecline struct { type NotificationPayloadOfParticipantPermissionsChange struct { ParticipantPermissionsChange *NotificationParticipantPermissionsChange `protobuf:"bytes,18,opt,name=participantPermissionsChange,proto3,oneof" json:"participantPermissionsChange,omitempty"` } +type NotificationPayloadOfAutoTypeWidgetAdded struct { + AutoTypeWidgetAdded *NotificationAutoTypeWidgetAdded `protobuf:"bytes,19,opt,name=autoTypeWidgetAdded,proto3,oneof" json:"autoTypeWidgetAdded,omitempty"` +} func (*NotificationPayloadOfImport) IsNotificationPayload() {} func (*NotificationPayloadOfExport) IsNotificationPayload() {} @@ -7440,6 +7445,7 @@ func (*NotificationPayloadOfRequestToLeave) IsNotificationPayload() func (*NotificationPayloadOfParticipantRemove) IsNotificationPayload() {} func (*NotificationPayloadOfParticipantRequestDecline) IsNotificationPayload() {} func (*NotificationPayloadOfParticipantPermissionsChange) IsNotificationPayload() {} +func (*NotificationPayloadOfAutoTypeWidgetAdded) IsNotificationPayload() {} func (m *Notification) GetPayload() IsNotificationPayload { if m != nil { @@ -7476,6 +7482,13 @@ func (m *Notification) GetIsLocal() bool { return false } +func (m *Notification) GetIsToast() bool { + if m != nil { + return m.IsToast + } + return false +} + func (m *Notification) GetImport() *NotificationImport { if x, ok := m.GetPayload().(*NotificationPayloadOfImport); ok { return x.Import @@ -7546,6 +7559,13 @@ func (m *Notification) GetParticipantPermissionsChange() *NotificationParticipan return nil } +func (m *Notification) GetAutoTypeWidgetAdded() *NotificationAutoTypeWidgetAdded { + if x, ok := m.GetPayload().(*NotificationPayloadOfAutoTypeWidgetAdded); ok { + return x.AutoTypeWidgetAdded + } + return nil +} + func (m *Notification) GetSpace() string { if m != nil { return m.Space @@ -7573,6 +7593,7 @@ func (*Notification) XXX_OneofWrappers() []interface{} { (*NotificationPayloadOfParticipantRemove)(nil), (*NotificationPayloadOfParticipantRequestDecline)(nil), (*NotificationPayloadOfParticipantPermissionsChange)(nil), + (*NotificationPayloadOfAutoTypeWidgetAdded)(nil), } } @@ -8228,6 +8249,66 @@ func (m *NotificationParticipantPermissionsChange) GetSpaceName() string { return "" } +type NotificationAutoTypeWidgetAdded struct { + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + TypePluralName string `protobuf:"bytes,2,opt,name=typePluralName,proto3" json:"typePluralName,omitempty"` + WidgetBlockId string `protobuf:"bytes,3,opt,name=widgetBlockId,proto3" json:"widgetBlockId,omitempty"` +} + +func (m *NotificationAutoTypeWidgetAdded) Reset() { *m = NotificationAutoTypeWidgetAdded{} } +func (m *NotificationAutoTypeWidgetAdded) String() string { return proto.CompactTextString(m) } +func (*NotificationAutoTypeWidgetAdded) ProtoMessage() {} +func (*NotificationAutoTypeWidgetAdded) Descriptor() ([]byte, []int) { + return fileDescriptor_98a910b73321e591, []int{21, 10} +} +func (m *NotificationAutoTypeWidgetAdded) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *NotificationAutoTypeWidgetAdded) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_NotificationAutoTypeWidgetAdded.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *NotificationAutoTypeWidgetAdded) XXX_Merge(src proto.Message) { + xxx_messageInfo_NotificationAutoTypeWidgetAdded.Merge(m, src) +} +func (m *NotificationAutoTypeWidgetAdded) XXX_Size() int { + return m.Size() +} +func (m *NotificationAutoTypeWidgetAdded) XXX_DiscardUnknown() { + xxx_messageInfo_NotificationAutoTypeWidgetAdded.DiscardUnknown(m) +} + +var xxx_messageInfo_NotificationAutoTypeWidgetAdded proto.InternalMessageInfo + +func (m *NotificationAutoTypeWidgetAdded) GetSpaceId() string { + if m != nil { + return m.SpaceId + } + return "" +} + +func (m *NotificationAutoTypeWidgetAdded) GetTypePluralName() string { + if m != nil { + return m.TypePluralName + } + return "" +} + +func (m *NotificationAutoTypeWidgetAdded) GetWidgetBlockId() string { + if m != nil { + return m.WidgetBlockId + } + return "" +} + type Export struct { } @@ -9794,6 +9875,7 @@ func init() { proto.RegisterType((*NotificationParticipantRemove)(nil), "anytype.model.Notification.ParticipantRemove") proto.RegisterType((*NotificationParticipantRequestDecline)(nil), "anytype.model.Notification.ParticipantRequestDecline") proto.RegisterType((*NotificationParticipantPermissionsChange)(nil), "anytype.model.Notification.ParticipantPermissionsChange") + proto.RegisterType((*NotificationAutoTypeWidgetAdded)(nil), "anytype.model.Notification.AutoTypeWidgetAdded") proto.RegisterType((*Export)(nil), "anytype.model.Export") proto.RegisterType((*Import)(nil), "anytype.model.Import") proto.RegisterType((*Invite)(nil), "anytype.model.Invite") @@ -9821,584 +9903,588 @@ func init() { } var fileDescriptor_98a910b73321e591 = []byte{ - // 9218 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0xbd, 0x5d, 0x6c, 0x23, 0xd9, - 0x95, 0x18, 0x2c, 0xfe, 0x93, 0x87, 0xa2, 0x74, 0x75, 0xfb, 0x8f, 0xa6, 0xdb, 0xfd, 0xb5, 0xe9, - 0xf1, 0x4c, 0xbb, 0x3d, 0x56, 0xcf, 0xf4, 0xcc, 0x78, 0xc6, 0x63, 0xcf, 0xd8, 0x94, 0x44, 0xb5, - 0x38, 0xad, 0x3f, 0x17, 0xd9, 0xdd, 0x9e, 0xc1, 0xee, 0xa7, 0x94, 0x58, 0x57, 0x64, 0x59, 0xc5, - 0x2a, 0xba, 0xea, 0x52, 0x2d, 0x19, 0x49, 0xe0, 0xfc, 0xed, 0x66, 0xdf, 0x9c, 0x20, 0x9b, 0x64, - 0x11, 0x04, 0x6b, 0x3f, 0x04, 0x08, 0xb2, 0x1b, 0xe4, 0xc9, 0x48, 0x36, 0xc9, 0x02, 0xd9, 0x05, - 0x02, 0x04, 0xc8, 0x8b, 0x93, 0xa7, 0x3c, 0x04, 0x48, 0x30, 0x06, 0xf2, 0x12, 0x24, 0x8b, 0x0d, - 0x10, 0xc0, 0x08, 0xf2, 0x10, 0x9c, 0x73, 0x6f, 0xfd, 0x91, 0x94, 0x9a, 0x3d, 0xbb, 0x1b, 0xe4, - 0x49, 0xbc, 0xa7, 0xce, 0x39, 0x75, 0x7f, 0xce, 0x3d, 0xf7, 0xfc, 0xdd, 0x12, 0xbc, 0x32, 0x3e, - 0x1d, 0x3c, 0x70, 0xec, 0xe3, 0x07, 0xe3, 0xe3, 0x07, 0x23, 0xcf, 0x12, 0xce, 0x83, 0xb1, 0xef, - 0x49, 0x2f, 0x50, 0x8d, 0x60, 0x9d, 0x5a, 0xbc, 0x66, 0xba, 0x17, 0xf2, 0x62, 0x2c, 0xd6, 0x09, - 0xda, 0xb8, 0x3d, 0xf0, 0xbc, 0x81, 0x23, 0x14, 0xea, 0xf1, 0xe4, 0xe4, 0x41, 0x20, 0xfd, 0x49, - 0x5f, 0x2a, 0xe4, 0xe6, 0xcf, 0xf3, 0x70, 0xb3, 0x3b, 0x32, 0x7d, 0xb9, 0xe1, 0x78, 0xfd, 0xd3, - 0xae, 0x6b, 0x8e, 0x83, 0xa1, 0x27, 0x37, 0xcc, 0x40, 0xf0, 0xd7, 0xa1, 0x78, 0x8c, 0xc0, 0xa0, - 0x9e, 0xb9, 0x9b, 0xbb, 0x57, 0x7d, 0x78, 0x7d, 0x3d, 0xc5, 0x78, 0x9d, 0x28, 0x0c, 0x8d, 0xc3, - 0xdf, 0x84, 0x92, 0x25, 0xa4, 0x69, 0x3b, 0x41, 0x3d, 0x7b, 0x37, 0x73, 0xaf, 0xfa, 0xf0, 0xd6, - 0xba, 0x7a, 0xf1, 0x7a, 0xf8, 0xe2, 0xf5, 0x2e, 0xbd, 0xd8, 0x08, 0xf1, 0xf8, 0xbb, 0x50, 0x3e, - 0xb1, 0x1d, 0xf1, 0x58, 0x5c, 0x04, 0xf5, 0xdc, 0x95, 0x34, 0x1b, 0xd9, 0x7a, 0xc6, 0x88, 0x90, - 0xf9, 0x26, 0xac, 0x88, 0x73, 0xe9, 0x9b, 0x86, 0x70, 0x4c, 0x69, 0x7b, 0x6e, 0x50, 0xcf, 0x53, - 0x0f, 0x6f, 0x4d, 0xf5, 0x30, 0x7c, 0x4e, 0xe4, 0x53, 0x24, 0xfc, 0x2e, 0x54, 0xbd, 0xe3, 0xef, - 0x8b, 0xbe, 0xec, 0x5d, 0x8c, 0x45, 0x50, 0x2f, 0xdc, 0xcd, 0xdd, 0xab, 0x18, 0x49, 0x10, 0xff, - 0x06, 0x54, 0xfb, 0x9e, 0xe3, 0x88, 0xbe, 0x7a, 0x47, 0xf1, 0xea, 0x61, 0x25, 0x71, 0xf9, 0xdb, - 0x70, 0xc3, 0x17, 0x23, 0xef, 0x4c, 0x58, 0x9b, 0x11, 0x94, 0xc6, 0x59, 0xa6, 0xd7, 0xcc, 0x7f, - 0xc8, 0x5b, 0x50, 0xf3, 0x75, 0xff, 0x76, 0x6d, 0xf7, 0x34, 0xa8, 0x97, 0x68, 0x58, 0x9f, 0xbf, - 0x64, 0x58, 0x88, 0x63, 0xa4, 0x29, 0x38, 0x83, 0xdc, 0xa9, 0xb8, 0xa8, 0x57, 0xee, 0x66, 0xee, - 0x55, 0x0c, 0xfc, 0xc9, 0xdf, 0x87, 0xba, 0xe7, 0xdb, 0x03, 0xdb, 0x35, 0x9d, 0x4d, 0x5f, 0x98, - 0x52, 0x58, 0x3d, 0x7b, 0x24, 0x02, 0x69, 0x8e, 0xc6, 0x75, 0xb8, 0x9b, 0xb9, 0x97, 0x33, 0x2e, - 0x7d, 0xce, 0xdf, 0x52, 0x2b, 0xd4, 0x71, 0x4f, 0xbc, 0x7a, 0x55, 0x0f, 0x3f, 0xdd, 0x97, 0x6d, - 0xfd, 0xd8, 0x88, 0x10, 0x9b, 0xbf, 0xcc, 0x42, 0xb1, 0x2b, 0x4c, 0xbf, 0x3f, 0x6c, 0xfc, 0x7a, - 0x06, 0x8a, 0x86, 0x08, 0x26, 0x8e, 0xe4, 0x0d, 0x28, 0xab, 0xb9, 0xed, 0x58, 0xf5, 0x0c, 0xf5, - 0x2e, 0x6a, 0x7f, 0x16, 0xd9, 0x59, 0x87, 0xfc, 0x48, 0x48, 0xb3, 0x9e, 0xa3, 0x19, 0x6a, 0x4c, - 0xf5, 0x4a, 0xbd, 0x7e, 0x7d, 0x4f, 0x48, 0xd3, 0x20, 0xbc, 0xc6, 0x2f, 0x32, 0x90, 0xc7, 0x26, - 0xbf, 0x0d, 0x95, 0xa1, 0x3d, 0x18, 0x3a, 0xf6, 0x60, 0x28, 0x75, 0x47, 0x62, 0x00, 0xff, 0x10, - 0x56, 0xa3, 0x86, 0x61, 0xba, 0x03, 0x81, 0x3d, 0x9a, 0x27, 0xfc, 0xf4, 0xd0, 0x98, 0x46, 0xe6, - 0x75, 0x28, 0xd1, 0x7e, 0xe8, 0x58, 0x24, 0xd1, 0x15, 0x23, 0x6c, 0xa2, 0xb8, 0x85, 0x2b, 0xf5, - 0x58, 0x5c, 0xd4, 0xf3, 0xf4, 0x34, 0x09, 0xe2, 0x2d, 0x58, 0x0d, 0x9b, 0x5b, 0x7a, 0x36, 0x0a, - 0x57, 0xcf, 0xc6, 0x34, 0x7e, 0xf3, 0xd3, 0x5d, 0x28, 0xd0, 0xb6, 0xe4, 0x2b, 0x90, 0xb5, 0xc3, - 0x89, 0xce, 0xda, 0x16, 0x7f, 0x00, 0xc5, 0x13, 0x5b, 0x38, 0xd6, 0x0b, 0x67, 0x58, 0xa3, 0xf1, - 0x36, 0x2c, 0xfb, 0x22, 0x90, 0xbe, 0xad, 0xa5, 0x5f, 0x6d, 0xd0, 0x2f, 0xce, 0xd3, 0x01, 0xeb, - 0x46, 0x02, 0xd1, 0x48, 0x91, 0xe1, 0xb0, 0xfb, 0x43, 0xdb, 0xb1, 0x7c, 0xe1, 0x76, 0x2c, 0xb5, - 0x4f, 0x2b, 0x46, 0x12, 0xc4, 0xef, 0xc1, 0xea, 0xb1, 0xd9, 0x3f, 0x1d, 0xf8, 0xde, 0xc4, 0xc5, - 0x0d, 0xe1, 0xf9, 0x34, 0xec, 0x8a, 0x31, 0x0d, 0xe6, 0x6f, 0x40, 0xc1, 0x74, 0xec, 0x81, 0x4b, - 0x3b, 0x71, 0x65, 0x66, 0xd1, 0x55, 0x5f, 0x5a, 0x88, 0x61, 0x28, 0x44, 0xbe, 0x03, 0xb5, 0x33, - 0xe1, 0x4b, 0xbb, 0x6f, 0x3a, 0x04, 0xaf, 0x97, 0x88, 0xb2, 0x39, 0x97, 0xf2, 0x69, 0x12, 0xd3, - 0x48, 0x13, 0xf2, 0x0e, 0x40, 0x80, 0x6a, 0x92, 0x96, 0x53, 0xef, 0x85, 0xd7, 0xe6, 0xb2, 0xd9, - 0xf4, 0x5c, 0x29, 0x5c, 0xb9, 0xde, 0x8d, 0xd0, 0x77, 0x96, 0x8c, 0x04, 0x31, 0x7f, 0x17, 0xf2, - 0x52, 0x9c, 0xcb, 0xfa, 0xca, 0x15, 0x33, 0x1a, 0x32, 0xe9, 0x89, 0x73, 0xb9, 0xb3, 0x64, 0x10, - 0x01, 0x12, 0xe2, 0x26, 0xab, 0xaf, 0x2e, 0x40, 0x88, 0xfb, 0x12, 0x09, 0x91, 0x80, 0x7f, 0x00, - 0x45, 0xc7, 0xbc, 0xf0, 0x26, 0xb2, 0xce, 0x88, 0xf4, 0x4b, 0x57, 0x92, 0xee, 0x12, 0xea, 0xce, - 0x92, 0xa1, 0x89, 0xf8, 0xdb, 0x90, 0xb3, 0xec, 0xb3, 0xfa, 0x1a, 0xd1, 0xde, 0xbd, 0x92, 0x76, - 0xcb, 0x3e, 0xdb, 0x59, 0x32, 0x10, 0x9d, 0x6f, 0x42, 0xf9, 0xd8, 0xf3, 0x4e, 0x47, 0xa6, 0x7f, - 0x5a, 0xe7, 0x44, 0xfa, 0xe5, 0x2b, 0x49, 0x37, 0x34, 0xf2, 0xce, 0x92, 0x11, 0x11, 0xe2, 0x90, - 0xed, 0xbe, 0xe7, 0xd6, 0xaf, 0x2d, 0x30, 0xe4, 0x4e, 0xdf, 0x73, 0x71, 0xc8, 0x48, 0x80, 0x84, - 0x8e, 0xed, 0x9e, 0xd6, 0xaf, 0x2f, 0x40, 0x88, 0x9a, 0x13, 0x09, 0x91, 0x00, 0xbb, 0x6d, 0x99, - 0xd2, 0x3c, 0xb3, 0xc5, 0xf3, 0xfa, 0x8d, 0x05, 0xba, 0xbd, 0xa5, 0x91, 0xb1, 0xdb, 0x21, 0x21, - 0x32, 0x09, 0xb7, 0x66, 0xfd, 0xe6, 0x02, 0x4c, 0x42, 0x8d, 0x8e, 0x4c, 0x42, 0x42, 0xfe, 0xff, - 0xc3, 0xda, 0x89, 0x30, 0xe5, 0xc4, 0x17, 0x56, 0x7c, 0xd0, 0xdd, 0x22, 0x6e, 0xeb, 0x57, 0xaf, - 0xfd, 0x34, 0xd5, 0xce, 0x92, 0x31, 0xcb, 0x8a, 0xbf, 0x0f, 0x05, 0xc7, 0x94, 0xe2, 0xbc, 0x5e, - 0x27, 0x9e, 0xcd, 0x17, 0x08, 0x85, 0x14, 0xe7, 0x3b, 0x4b, 0x86, 0x22, 0xe1, 0xdf, 0x83, 0x55, - 0x69, 0x1e, 0x3b, 0xe2, 0xe0, 0x44, 0x23, 0x04, 0xf5, 0xcf, 0x11, 0x97, 0xd7, 0xaf, 0x16, 0xe7, - 0x34, 0xcd, 0xce, 0x92, 0x31, 0xcd, 0x06, 0x7b, 0x45, 0xa0, 0x7a, 0x63, 0x81, 0x5e, 0x11, 0x3f, - 0xec, 0x15, 0x91, 0xf0, 0x5d, 0xa8, 0xd2, 0x8f, 0x4d, 0xcf, 0x99, 0x8c, 0xdc, 0xfa, 0xe7, 0x89, - 0xc3, 0xbd, 0x17, 0x73, 0x50, 0xf8, 0x3b, 0x4b, 0x46, 0x92, 0x1c, 0x17, 0x91, 0x9a, 0x86, 0xf7, - 0xbc, 0x7e, 0x7b, 0x81, 0x45, 0xec, 0x69, 0x64, 0x5c, 0xc4, 0x90, 0x10, 0xb7, 0xde, 0x73, 0xdb, - 0x1a, 0x08, 0x59, 0xff, 0xc2, 0x02, 0x5b, 0xef, 0x19, 0xa1, 0xe2, 0xd6, 0x53, 0x44, 0x28, 0xc6, - 0xfd, 0xa1, 0x29, 0xeb, 0x77, 0x16, 0x10, 0xe3, 0xcd, 0xa1, 0x49, 0xba, 0x02, 0x09, 0x1a, 0x3f, - 0x84, 0xe5, 0xa4, 0x56, 0xe6, 0x1c, 0xf2, 0xbe, 0x30, 0xd5, 0x89, 0x50, 0x36, 0xe8, 0x37, 0xc2, - 0x84, 0x65, 0x4b, 0x3a, 0x11, 0xca, 0x06, 0xfd, 0xe6, 0x37, 0xa1, 0xa8, 0x6c, 0x13, 0x52, 0xf8, - 0x65, 0x43, 0xb7, 0x10, 0xd7, 0xf2, 0xcd, 0x01, 0x9d, 0x5b, 0x65, 0x83, 0x7e, 0x23, 0xae, 0xe5, - 0x7b, 0xe3, 0x03, 0x97, 0x14, 0x76, 0xd9, 0xd0, 0xad, 0xc6, 0xbf, 0xfe, 0x00, 0x4a, 0xba, 0x53, - 0x8d, 0xbf, 0x9f, 0x81, 0xa2, 0x52, 0x28, 0xfc, 0xdb, 0x50, 0x08, 0xe4, 0x85, 0x23, 0xa8, 0x0f, - 0x2b, 0x0f, 0xbf, 0xb2, 0x80, 0x12, 0x5a, 0xef, 0x22, 0x81, 0xa1, 0xe8, 0x9a, 0x06, 0x14, 0xa8, - 0xcd, 0x4b, 0x90, 0x33, 0xbc, 0xe7, 0x6c, 0x89, 0x03, 0x14, 0xd5, 0x62, 0xb1, 0x0c, 0x02, 0xb7, - 0xec, 0x33, 0x96, 0x45, 0xe0, 0x8e, 0x30, 0x2d, 0xe1, 0xb3, 0x1c, 0xaf, 0x41, 0x25, 0x5c, 0x96, - 0x80, 0xe5, 0x39, 0x83, 0xe5, 0xc4, 0x82, 0x07, 0xac, 0xd0, 0xf8, 0x1f, 0x79, 0xc8, 0xe3, 0xfe, - 0xe7, 0xaf, 0x40, 0x4d, 0x9a, 0xfe, 0x40, 0x28, 0x43, 0x38, 0x32, 0x52, 0xd2, 0x40, 0xfe, 0x41, - 0x38, 0x86, 0x2c, 0x8d, 0xe1, 0xb5, 0x17, 0xea, 0x95, 0xd4, 0x08, 0x12, 0xa7, 0x70, 0x6e, 0xb1, - 0x53, 0x78, 0x1b, 0xca, 0xa8, 0xce, 0xba, 0xf6, 0x0f, 0x05, 0x4d, 0xfd, 0xca, 0xc3, 0xfb, 0x2f, - 0x7e, 0x65, 0x47, 0x53, 0x18, 0x11, 0x2d, 0xef, 0x40, 0xa5, 0x6f, 0xfa, 0x16, 0x75, 0x86, 0x56, - 0x6b, 0xe5, 0xe1, 0x57, 0x5f, 0xcc, 0x68, 0x33, 0x24, 0x31, 0x62, 0x6a, 0x7e, 0x00, 0x55, 0x4b, - 0x04, 0x7d, 0xdf, 0x1e, 0x93, 0x7a, 0x53, 0x67, 0xf1, 0xd7, 0x5e, 0xcc, 0x6c, 0x2b, 0x26, 0x32, - 0x92, 0x1c, 0xd0, 0x22, 0xf3, 0x23, 0xfd, 0x56, 0x22, 0x03, 0x21, 0x06, 0x34, 0xdf, 0x85, 0x72, - 0x38, 0x1e, 0xbe, 0x0c, 0x65, 0xfc, 0xbb, 0xef, 0xb9, 0x82, 0x2d, 0xe1, 0xda, 0x62, 0xab, 0x3b, - 0x32, 0x1d, 0x87, 0x65, 0xf8, 0x0a, 0x00, 0x36, 0xf7, 0x84, 0x65, 0x4f, 0x46, 0x2c, 0xdb, 0xfc, - 0x66, 0x28, 0x2d, 0x65, 0xc8, 0x1f, 0x9a, 0x03, 0xa4, 0x58, 0x86, 0x72, 0xa8, 0xae, 0x59, 0x06, - 0xe9, 0xb7, 0xcc, 0x60, 0x78, 0xec, 0x99, 0xbe, 0xc5, 0xb2, 0xbc, 0x0a, 0xa5, 0x96, 0xdf, 0x1f, - 0xda, 0x67, 0x82, 0xe5, 0x9a, 0x0f, 0xa0, 0x9a, 0xe8, 0x2f, 0xb2, 0xd0, 0x2f, 0xad, 0x40, 0xa1, - 0x65, 0x59, 0xc2, 0x62, 0x19, 0x24, 0xd0, 0x03, 0x64, 0xd9, 0xe6, 0x57, 0xa1, 0x12, 0xcd, 0x16, - 0xa2, 0xe3, 0xc1, 0xcd, 0x96, 0xf0, 0x17, 0x82, 0x59, 0x06, 0xa5, 0xb2, 0xe3, 0x3a, 0xb6, 0x2b, - 0x58, 0xb6, 0xf1, 0xe7, 0x48, 0x54, 0xf9, 0xb7, 0xd2, 0x1b, 0xe2, 0xd5, 0x17, 0x9d, 0xac, 0xe9, - 0xdd, 0xf0, 0xf9, 0xc4, 0xf8, 0x76, 0x6d, 0xea, 0x5c, 0x19, 0xf2, 0x5b, 0x9e, 0x0c, 0x58, 0xa6, - 0xf1, 0x5f, 0xb3, 0x50, 0x0e, 0x0f, 0x54, 0xf4, 0x09, 0x26, 0xbe, 0xa3, 0x05, 0x1a, 0x7f, 0xf2, - 0xeb, 0x50, 0x90, 0xb6, 0xd4, 0x62, 0x5c, 0x31, 0x54, 0x03, 0x6d, 0xb5, 0xe4, 0xca, 0x2a, 0x03, - 0x76, 0x7a, 0xa9, 0xec, 0x91, 0x39, 0x10, 0x3b, 0x66, 0x30, 0xd4, 0x26, 0x6c, 0x0c, 0x40, 0xfa, - 0x13, 0xf3, 0x0c, 0x65, 0x8e, 0x9e, 0x2b, 0x2b, 0x2e, 0x09, 0xe2, 0x6f, 0x41, 0x1e, 0x07, 0xa8, - 0x85, 0xe6, 0xff, 0x9b, 0x1a, 0x30, 0x8a, 0xc9, 0xa1, 0x2f, 0x70, 0x79, 0xd6, 0xd1, 0x03, 0x33, - 0x08, 0x99, 0xbf, 0x0a, 0x2b, 0x6a, 0x13, 0x1e, 0x84, 0xfe, 0x43, 0x89, 0x38, 0x4f, 0x41, 0x79, - 0x0b, 0xa7, 0xd3, 0x94, 0xa2, 0x5e, 0x5e, 0x40, 0xbe, 0xc3, 0xc9, 0x59, 0xef, 0x22, 0x89, 0xa1, - 0x28, 0x9b, 0xef, 0xe0, 0x9c, 0x9a, 0x52, 0xe0, 0x32, 0xb7, 0x47, 0x63, 0x79, 0xa1, 0x84, 0x66, - 0x5b, 0xc8, 0xfe, 0xd0, 0x76, 0x07, 0x2c, 0xa3, 0xa6, 0x18, 0x17, 0x91, 0x50, 0x7c, 0xdf, 0xf3, - 0x59, 0xae, 0xd1, 0x80, 0x3c, 0xca, 0x28, 0x2a, 0x49, 0xd7, 0x1c, 0x09, 0x3d, 0xd3, 0xf4, 0xbb, - 0x71, 0x0d, 0xd6, 0x66, 0xce, 0xe3, 0xc6, 0xef, 0x15, 0x95, 0x84, 0x20, 0x05, 0xd9, 0x82, 0x9a, - 0x82, 0xcc, 0xbc, 0x97, 0xd2, 0x31, 0xc8, 0x25, 0xad, 0x63, 0x3e, 0x80, 0x02, 0x0e, 0x2c, 0x54, - 0x31, 0x0b, 0x90, 0xef, 0x21, 0xba, 0xa1, 0xa8, 0xd0, 0x83, 0xe9, 0x0f, 0x45, 0xff, 0x54, 0x58, - 0x5a, 0xd7, 0x87, 0x4d, 0x14, 0x9a, 0x7e, 0xc2, 0x3c, 0x57, 0x0d, 0x12, 0x89, 0xbe, 0xe7, 0xb6, - 0x47, 0xde, 0xf7, 0x6d, 0x5a, 0x57, 0x14, 0x89, 0x10, 0x10, 0x3e, 0xed, 0xa0, 0x8c, 0xe8, 0x65, - 0x8b, 0x01, 0x8d, 0x36, 0x14, 0xe8, 0xdd, 0xb8, 0x13, 0x54, 0x9f, 0x55, 0xa4, 0xe1, 0xd5, 0xc5, - 0xfa, 0xac, 0xbb, 0xdc, 0xf8, 0xdd, 0x2c, 0xe4, 0xb1, 0xcd, 0xef, 0x43, 0xc1, 0x47, 0x3f, 0x8c, - 0xa6, 0xf3, 0x32, 0x9f, 0x4d, 0xa1, 0xf0, 0x6f, 0x6b, 0x51, 0xcc, 0x2e, 0x20, 0x2c, 0xd1, 0x1b, - 0x93, 0x62, 0x79, 0x1d, 0x0a, 0x63, 0xd3, 0x37, 0x47, 0x7a, 0x9f, 0xa8, 0x46, 0xf3, 0x27, 0x19, - 0xc8, 0x23, 0x12, 0x5f, 0x83, 0x5a, 0x57, 0xfa, 0xf6, 0xa9, 0x90, 0x43, 0xdf, 0x9b, 0x0c, 0x86, - 0x4a, 0x92, 0x1e, 0x8b, 0x0b, 0xa5, 0x6f, 0x94, 0x42, 0x90, 0xa6, 0x63, 0xf7, 0x59, 0x16, 0xa5, - 0x6a, 0xc3, 0x73, 0x2c, 0x96, 0xe3, 0xab, 0x50, 0x7d, 0xe2, 0x5a, 0xc2, 0x0f, 0xfa, 0x9e, 0x2f, - 0x2c, 0x96, 0xd7, 0xbb, 0xfb, 0x94, 0x15, 0xe8, 0x2c, 0x13, 0xe7, 0x92, 0x7c, 0x21, 0x56, 0xe4, - 0xd7, 0x60, 0x75, 0x23, 0xed, 0x20, 0xb1, 0x12, 0xea, 0xa4, 0x3d, 0xe1, 0xa2, 0x90, 0xb1, 0xb2, - 0x12, 0x62, 0xef, 0xfb, 0x36, 0xab, 0xe0, 0xcb, 0xd4, 0x3e, 0x61, 0xd0, 0xfc, 0x97, 0x99, 0x50, - 0x73, 0xd4, 0xa0, 0x72, 0x68, 0xfa, 0xe6, 0xc0, 0x37, 0xc7, 0xd8, 0xbf, 0x2a, 0x94, 0xd4, 0xc1, - 0xf9, 0xa6, 0xd2, 0x6e, 0xaa, 0xf1, 0x50, 0xe9, 0x46, 0xd5, 0x78, 0x8b, 0xe5, 0xe2, 0xc6, 0xdb, - 0x2c, 0x8f, 0xef, 0xf8, 0xee, 0xc4, 0x93, 0x82, 0x15, 0x48, 0xd7, 0x79, 0x96, 0x60, 0x45, 0x04, - 0xf6, 0x50, 0xa3, 0xb0, 0x12, 0x8e, 0x79, 0x13, 0xe5, 0xe7, 0xd8, 0x3b, 0x67, 0x65, 0xec, 0x06, - 0x4e, 0xa3, 0xb0, 0x58, 0x05, 0x9f, 0xec, 0x4f, 0x46, 0xc7, 0x02, 0x87, 0x09, 0xf8, 0xa4, 0xe7, - 0x0d, 0x06, 0x8e, 0x60, 0x55, 0x9c, 0x83, 0x84, 0xf2, 0x65, 0xcb, 0xa4, 0x69, 0x4d, 0xc7, 0xf1, - 0x26, 0x92, 0xd5, 0x1a, 0xbf, 0xcc, 0x41, 0x1e, 0xbd, 0x1b, 0xdc, 0x3b, 0x43, 0xd4, 0x33, 0x7a, - 0xef, 0xe0, 0xef, 0x68, 0x07, 0x66, 0xe3, 0x1d, 0xc8, 0xdf, 0xd7, 0x2b, 0x9d, 0x5b, 0x40, 0xcb, - 0x22, 0xe3, 0xe4, 0x22, 0x73, 0xc8, 0x8f, 0xec, 0x91, 0xd0, 0xba, 0x8e, 0x7e, 0x23, 0x2c, 0xc0, - 0xf3, 0xb8, 0x40, 0xc1, 0x13, 0xfa, 0x8d, 0xbb, 0xc6, 0xc4, 0x63, 0xa1, 0x25, 0x69, 0x0f, 0xe4, - 0x8c, 0xb0, 0x39, 0x47, 0x7b, 0x55, 0xe6, 0x6a, 0xaf, 0x0f, 0x42, 0xed, 0x55, 0x5a, 0x60, 0xd7, - 0x53, 0x37, 0x93, 0x9a, 0x2b, 0x56, 0x1a, 0xe5, 0xc5, 0xc9, 0x13, 0x87, 0xc9, 0x96, 0x96, 0xda, - 0xf8, 0xa0, 0x2b, 0xab, 0x59, 0x66, 0x19, 0x5c, 0x4d, 0xda, 0xae, 0x4a, 0xe7, 0x3d, 0xb5, 0x2d, - 0xe1, 0xb1, 0x1c, 0x1d, 0x84, 0x13, 0xcb, 0xf6, 0x58, 0x1e, 0x2d, 0xaf, 0xc3, 0xad, 0x6d, 0x56, - 0x68, 0xbe, 0x9a, 0x38, 0x92, 0x5a, 0x13, 0xe9, 0x29, 0x36, 0x24, 0xbe, 0x19, 0x25, 0x8d, 0xc7, - 0xc2, 0x62, 0xd9, 0xe6, 0xd7, 0xe7, 0xa8, 0xd9, 0x1a, 0x54, 0x9e, 0x8c, 0x1d, 0xcf, 0xb4, 0xae, - 0xd0, 0xb3, 0xcb, 0x00, 0xb1, 0x57, 0xdd, 0xf8, 0x65, 0x33, 0x3e, 0xce, 0xd1, 0x16, 0x0d, 0xbc, - 0x89, 0xdf, 0x17, 0xa4, 0x42, 0x2a, 0x86, 0x6e, 0xf1, 0xef, 0x40, 0x01, 0x9f, 0x87, 0x61, 0x9c, - 0xfb, 0x0b, 0xf9, 0x72, 0xeb, 0x4f, 0x6d, 0xf1, 0xdc, 0x50, 0x84, 0xfc, 0x0e, 0x80, 0xd9, 0x97, - 0xf6, 0x99, 0x40, 0xa0, 0xde, 0xec, 0x09, 0x08, 0x7f, 0x27, 0x69, 0xbe, 0x5c, 0x1d, 0x87, 0x4c, - 0xd8, 0x35, 0xdc, 0x80, 0x2a, 0x6e, 0xdd, 0xf1, 0x81, 0x8f, 0xbb, 0xbd, 0xbe, 0x4c, 0x84, 0x6f, - 0x2c, 0xd6, 0xbd, 0x47, 0x11, 0xa1, 0x91, 0x64, 0xc2, 0x9f, 0xc0, 0xb2, 0x8a, 0xa9, 0x69, 0xa6, - 0x35, 0x62, 0xfa, 0xe6, 0x62, 0x4c, 0x0f, 0x62, 0x4a, 0x23, 0xc5, 0x66, 0x36, 0x2c, 0x59, 0x78, - 0xe9, 0xb0, 0xe4, 0xab, 0xb0, 0xd2, 0x4b, 0xef, 0x02, 0x75, 0x54, 0x4c, 0x41, 0x79, 0x13, 0x96, - 0xed, 0x20, 0x8e, 0x8a, 0x52, 0x8c, 0xa4, 0x6c, 0xa4, 0x60, 0x8d, 0x7f, 0x57, 0x84, 0x3c, 0xcd, - 0xfc, 0x74, 0x8c, 0x6b, 0x33, 0xa5, 0xd2, 0x1f, 0x2c, 0xbe, 0xd4, 0x53, 0x3b, 0x9e, 0x34, 0x48, - 0x2e, 0xa1, 0x41, 0xbe, 0x03, 0x85, 0xc0, 0xf3, 0x65, 0xb8, 0xbc, 0x0b, 0x0a, 0x51, 0xd7, 0xf3, - 0xa5, 0xa1, 0x08, 0xf9, 0x36, 0x94, 0x4e, 0x6c, 0x47, 0xe2, 0xa2, 0xa8, 0xc9, 0x7b, 0x7d, 0x31, - 0x1e, 0xdb, 0x44, 0x64, 0x84, 0xc4, 0x7c, 0x37, 0x29, 0x6c, 0x45, 0xe2, 0xb4, 0xbe, 0x18, 0xa7, - 0x79, 0x32, 0x78, 0x1f, 0x58, 0xdf, 0x3b, 0x13, 0xbe, 0x91, 0x08, 0x4c, 0xaa, 0x43, 0x7a, 0x06, - 0xce, 0x1b, 0x50, 0x1e, 0xda, 0x96, 0x40, 0x3b, 0x87, 0x74, 0x4c, 0xd9, 0x88, 0xda, 0xfc, 0x31, - 0x94, 0xc9, 0x3f, 0x40, 0xad, 0x58, 0x79, 0xe9, 0xc9, 0x57, 0xae, 0x4a, 0xc8, 0x00, 0x5f, 0x44, - 0x2f, 0xdf, 0xb6, 0x25, 0xc5, 0xa7, 0xcb, 0x46, 0xd4, 0xc6, 0x0e, 0x93, 0xbc, 0x27, 0x3b, 0x5c, - 0x55, 0x1d, 0x9e, 0x86, 0xf3, 0xb7, 0xe1, 0x06, 0xc1, 0xa6, 0x0e, 0x49, 0xdc, 0x6a, 0xc8, 0x74, - 0xfe, 0x43, 0x34, 0x58, 0xc6, 0xe6, 0x40, 0xec, 0xda, 0x23, 0x5b, 0xd6, 0x6b, 0x77, 0x33, 0xf7, - 0x0a, 0x46, 0x0c, 0xe0, 0xaf, 0xc3, 0x9a, 0x25, 0x4e, 0xcc, 0x89, 0x23, 0x7b, 0x62, 0x34, 0x76, - 0x4c, 0x29, 0x3a, 0x16, 0xc9, 0x68, 0xc5, 0x98, 0x7d, 0xc0, 0xdf, 0x80, 0x6b, 0x1a, 0x78, 0x10, - 0x65, 0x15, 0x3a, 0x16, 0x85, 0xef, 0x2a, 0xc6, 0xbc, 0x47, 0xcd, 0x3d, 0xad, 0x86, 0xf1, 0x00, - 0x45, 0x3f, 0x35, 0x54, 0xa0, 0x81, 0x54, 0x27, 0xf2, 0x23, 0xd3, 0x71, 0x84, 0x7f, 0xa1, 0x9c, - 0xdc, 0xc7, 0xa6, 0x7b, 0x6c, 0xba, 0x2c, 0x47, 0x67, 0xac, 0xe9, 0x08, 0xd7, 0x32, 0x7d, 0x75, - 0x22, 0x3f, 0xa2, 0x03, 0xbd, 0xd0, 0xbc, 0x07, 0x79, 0x9a, 0xd2, 0x0a, 0x14, 0x94, 0x97, 0x44, - 0x1e, 0xb3, 0xf6, 0x90, 0x48, 0x23, 0xef, 0xe2, 0xf6, 0x63, 0xd9, 0xc6, 0x3f, 0x28, 0x42, 0x39, - 0x9c, 0xbc, 0x30, 0x87, 0x90, 0x89, 0x73, 0x08, 0x68, 0xc6, 0x05, 0x4f, 0xed, 0xc0, 0x3e, 0xd6, - 0x66, 0x69, 0xd9, 0x88, 0x01, 0x68, 0x09, 0x3d, 0xb7, 0x2d, 0x39, 0xa4, 0x3d, 0x53, 0x30, 0x54, - 0x83, 0xdf, 0x83, 0x55, 0x0b, 0xe7, 0xc1, 0xed, 0x3b, 0x13, 0x4b, 0xf4, 0xf0, 0x14, 0x55, 0x61, - 0x82, 0x69, 0x30, 0xff, 0x18, 0x40, 0xda, 0x23, 0xb1, 0xed, 0xf9, 0x23, 0x53, 0x6a, 0xdf, 0xe0, - 0x1b, 0x2f, 0x27, 0xd5, 0xeb, 0xbd, 0x88, 0x81, 0x91, 0x60, 0x86, 0xac, 0xf1, 0x6d, 0x9a, 0x75, - 0xe9, 0x33, 0xb1, 0xde, 0x8a, 0x18, 0x18, 0x09, 0x66, 0xbc, 0x07, 0xa5, 0x13, 0xcf, 0x1f, 0x4d, - 0x1c, 0x53, 0x9f, 0xb9, 0xef, 0xbf, 0x24, 0xdf, 0x6d, 0x45, 0x4d, 0xba, 0x27, 0x64, 0x15, 0xc7, - 0xb8, 0x2b, 0x0b, 0xc6, 0xb8, 0x9b, 0xbf, 0x02, 0x10, 0xf7, 0x90, 0xdf, 0x04, 0xbe, 0xe7, 0xb9, - 0x72, 0xd8, 0x3a, 0x3e, 0xf6, 0x37, 0xc4, 0x89, 0xe7, 0x8b, 0x2d, 0x13, 0x8f, 0xd7, 0x1b, 0xb0, - 0x16, 0xc1, 0x5b, 0x27, 0x52, 0xf8, 0x08, 0x26, 0x11, 0xe8, 0x0e, 0x3d, 0x5f, 0x2a, 0x1b, 0x8f, - 0x7e, 0x3e, 0xe9, 0xb2, 0x1c, 0x1e, 0xe9, 0x9d, 0xee, 0x01, 0xcb, 0x37, 0xef, 0x01, 0xc4, 0x53, - 0x4b, 0xbe, 0x10, 0xfd, 0x7a, 0xf3, 0xa1, 0xf6, 0x8c, 0xa8, 0xf5, 0xf0, 0x6d, 0x96, 0x69, 0x7e, - 0x9a, 0x81, 0x6a, 0x62, 0x48, 0x69, 0x9f, 0x79, 0xd3, 0x9b, 0xb8, 0x52, 0x39, 0xe9, 0xf4, 0xf3, - 0xa9, 0xe9, 0x4c, 0xf0, 0x70, 0x5f, 0x83, 0x1a, 0xb5, 0xb7, 0xec, 0x40, 0xda, 0x6e, 0x5f, 0xb2, - 0x5c, 0x84, 0xa2, 0x0c, 0x83, 0x7c, 0x84, 0xb2, 0xef, 0x69, 0x50, 0x81, 0x33, 0x58, 0x3e, 0x14, - 0x7e, 0x5f, 0x84, 0x48, 0x64, 0x0c, 0x6b, 0x48, 0x84, 0xa6, 0x8c, 0x61, 0x53, 0x0e, 0xbb, 0x93, - 0x11, 0x2b, 0xa3, 0x51, 0x89, 0x8d, 0xd6, 0x99, 0xf0, 0xd1, 0x96, 0xa9, 0xe0, 0x7b, 0x10, 0x80, - 0xbb, 0xc1, 0x74, 0x19, 0x84, 0xd8, 0x7b, 0xb6, 0xcb, 0xaa, 0x51, 0xc3, 0x3c, 0x67, 0xcb, 0xd8, - 0x7f, 0x72, 0x1d, 0x58, 0xad, 0xf1, 0x5f, 0x72, 0x90, 0x47, 0xbd, 0x8e, 0xbe, 0x6e, 0x52, 0x09, - 0xa9, 0xbd, 0x92, 0x04, 0x7d, 0xb6, 0xd3, 0x08, 0x79, 0x27, 0x4f, 0xa3, 0xf7, 0xa0, 0xda, 0x9f, - 0x04, 0xd2, 0x1b, 0xd1, 0x51, 0xac, 0xb3, 0x5d, 0x37, 0x67, 0xa2, 0x46, 0x34, 0x9d, 0x46, 0x12, - 0x95, 0xbf, 0x03, 0xc5, 0x13, 0x25, 0xf5, 0x2a, 0x6e, 0xf4, 0x85, 0x4b, 0x4e, 0x6b, 0x2d, 0xd9, - 0x1a, 0x19, 0xc7, 0x65, 0xcf, 0xec, 0xd8, 0x24, 0x48, 0x9f, 0xba, 0xc5, 0xe8, 0xd4, 0xfd, 0x15, - 0x58, 0x11, 0x38, 0xe1, 0x87, 0x8e, 0xd9, 0x17, 0x23, 0xe1, 0x86, 0xdb, 0xec, 0xed, 0x97, 0x18, - 0x31, 0xad, 0x18, 0x0d, 0x7b, 0x8a, 0x17, 0x6a, 0x1e, 0xd7, 0xc3, 0xc3, 0x3f, 0x74, 0xec, 0xcb, - 0x46, 0x0c, 0x68, 0x7e, 0x59, 0xeb, 0xcb, 0x12, 0xe4, 0x5a, 0x41, 0x5f, 0x47, 0x40, 0x44, 0xd0, - 0x57, 0xee, 0xd5, 0x26, 0x4d, 0x07, 0xcb, 0x36, 0xdf, 0x84, 0x4a, 0xf4, 0x06, 0x14, 0x9e, 0x7d, - 0x4f, 0x76, 0xc7, 0xa2, 0x6f, 0x9f, 0xd8, 0xc2, 0x52, 0xf2, 0xd9, 0x95, 0xa6, 0x2f, 0x55, 0x10, - 0xb1, 0xed, 0x5a, 0x2c, 0xdb, 0xf8, 0x9d, 0x32, 0x14, 0xd5, 0xe1, 0xab, 0x07, 0x5c, 0x89, 0x06, - 0xfc, 0x5d, 0x28, 0x7b, 0x63, 0xe1, 0x9b, 0xd2, 0xf3, 0x75, 0xe4, 0xe6, 0x9d, 0x97, 0x39, 0xcc, - 0xd7, 0x0f, 0x34, 0xb1, 0x11, 0xb1, 0x99, 0x96, 0xa6, 0xec, 0xac, 0x34, 0xdd, 0x07, 0x16, 0x9e, - 0xdb, 0x87, 0x3e, 0xd2, 0xc9, 0x0b, 0xed, 0x87, 0xcf, 0xc0, 0x79, 0x0f, 0x2a, 0x7d, 0xcf, 0xb5, - 0xec, 0x28, 0x8a, 0xb3, 0xf2, 0xf0, 0xeb, 0x2f, 0xd5, 0xc3, 0xcd, 0x90, 0xda, 0x88, 0x19, 0xf1, - 0xd7, 0xa1, 0x70, 0x86, 0x62, 0x46, 0xf2, 0x74, 0xb9, 0x10, 0x2a, 0x24, 0xfe, 0x09, 0x54, 0x7f, - 0x30, 0xb1, 0xfb, 0xa7, 0x07, 0xc9, 0x28, 0xe1, 0x7b, 0x2f, 0xd5, 0x8b, 0xef, 0xc6, 0xf4, 0x46, - 0x92, 0x59, 0x42, 0xb4, 0x4b, 0x7f, 0x02, 0xd1, 0x2e, 0xcf, 0x8a, 0xb6, 0x01, 0x35, 0x57, 0x04, - 0x52, 0x58, 0xdb, 0xda, 0x56, 0x83, 0xcf, 0x60, 0xab, 0xa5, 0x59, 0x34, 0xbf, 0x04, 0xe5, 0x70, - 0xc1, 0x79, 0x11, 0xb2, 0xfb, 0xe8, 0x14, 0x15, 0x21, 0x7b, 0xe0, 0x2b, 0x69, 0x6b, 0xa1, 0xb4, - 0x35, 0xff, 0x28, 0x03, 0x95, 0x68, 0xd2, 0xd3, 0x9a, 0xb3, 0xfd, 0x83, 0x89, 0xe9, 0xb0, 0x0c, - 0xb9, 0xcb, 0x9e, 0x54, 0x2d, 0x52, 0xd6, 0x8f, 0x28, 0x59, 0xef, 0xb3, 0x1c, 0x99, 0x08, 0x22, - 0x08, 0x58, 0x9e, 0x73, 0x58, 0xd1, 0xe0, 0x03, 0x5f, 0xa1, 0x16, 0x50, 0xf1, 0xe1, 0xd3, 0x10, - 0x50, 0x54, 0x16, 0xc5, 0xa9, 0x50, 0x0a, 0x72, 0xdf, 0x93, 0xd4, 0x28, 0x63, 0xa7, 0x3a, 0x2e, - 0xab, 0xe0, 0x3b, 0xf7, 0x3d, 0xd9, 0x41, 0x95, 0x18, 0xb9, 0x67, 0xd5, 0xf0, 0xf5, 0xd4, 0x22, - 0x8d, 0xd8, 0x72, 0x9c, 0x8e, 0xcb, 0x6a, 0xfa, 0x81, 0x6a, 0xad, 0x20, 0xc7, 0xf6, 0xb9, 0xd9, - 0x47, 0xf2, 0x55, 0xd4, 0xb0, 0x48, 0xa3, 0xdb, 0x0c, 0xb7, 0x64, 0xfb, 0xdc, 0x0e, 0x64, 0xc0, - 0xd6, 0x9a, 0xff, 0x36, 0x03, 0xd5, 0xc4, 0x02, 0xa3, 0xfb, 0x47, 0x88, 0x78, 0x94, 0x29, 0x6f, - 0xf0, 0x63, 0x9c, 0x46, 0xdf, 0x0a, 0x8f, 0xa9, 0x9e, 0x87, 0x3f, 0xb3, 0xf8, 0xbe, 0x9e, 0x37, - 0xf2, 0x7c, 0xdf, 0x7b, 0xae, 0x4c, 0x9f, 0x5d, 0x33, 0x90, 0xcf, 0x84, 0x38, 0x65, 0x79, 0x1c, - 0xea, 0xe6, 0xc4, 0xf7, 0x85, 0xab, 0x00, 0x05, 0xea, 0x9c, 0x38, 0x57, 0xad, 0x22, 0x32, 0x45, - 0x64, 0x3a, 0x07, 0x59, 0x09, 0x15, 0x81, 0xc6, 0x56, 0x90, 0x32, 0x22, 0x20, 0xba, 0x6a, 0x56, - 0xf0, 0x50, 0x51, 0x11, 0x8a, 0x83, 0x93, 0x2d, 0xf3, 0x22, 0x68, 0x0d, 0x3c, 0x06, 0xd3, 0xc0, - 0x7d, 0xef, 0x39, 0xab, 0x36, 0x26, 0x00, 0xb1, 0x4f, 0x86, 0xbe, 0x28, 0x0a, 0x44, 0x94, 0x43, - 0xd0, 0x2d, 0x7e, 0x00, 0x80, 0xbf, 0x08, 0x33, 0x74, 0x48, 0x5f, 0xc2, 0x50, 0x26, 0x3a, 0x23, - 0xc1, 0xa2, 0xf1, 0x17, 0xa0, 0x12, 0x3d, 0xe0, 0x75, 0x28, 0x91, 0x49, 0x1b, 0xbd, 0x36, 0x6c, - 0xa2, 0x7d, 0x66, 0xbb, 0x96, 0x38, 0x27, 0xbd, 0x52, 0x30, 0x54, 0x03, 0x7b, 0x39, 0xb4, 0x2d, - 0x4b, 0xb8, 0x61, 0xa6, 0x47, 0xb5, 0xe6, 0xe5, 0xe3, 0xf3, 0x73, 0xf3, 0xf1, 0x8d, 0x5f, 0x85, - 0x6a, 0xc2, 0x69, 0xbc, 0x74, 0xd8, 0x89, 0x8e, 0x65, 0xd3, 0x1d, 0xbb, 0x0d, 0x95, 0xb0, 0x06, - 0x24, 0xa0, 0xb3, 0xad, 0x62, 0xc4, 0x80, 0xc6, 0x3f, 0xcd, 0xa2, 0x25, 0x8b, 0x43, 0x9b, 0x76, - 0xf4, 0xb6, 0xa1, 0x18, 0x48, 0x53, 0x4e, 0xc2, 0x62, 0x86, 0x05, 0x37, 0x68, 0x97, 0x68, 0x76, - 0x96, 0x0c, 0x4d, 0xcd, 0x3f, 0x80, 0x9c, 0x34, 0x07, 0x3a, 0x50, 0xfa, 0x95, 0xc5, 0x98, 0xf4, - 0xcc, 0xc1, 0xce, 0x92, 0x81, 0x74, 0x7c, 0x17, 0xca, 0x7d, 0x1d, 0xdb, 0xd2, 0x4a, 0x71, 0x41, - 0x5f, 0x2c, 0x8c, 0x88, 0xed, 0x2c, 0x19, 0x11, 0x07, 0xfe, 0x1d, 0xc8, 0xa3, 0x75, 0xa9, 0x6b, - 0x3e, 0x16, 0xf4, 0x31, 0x71, 0xbb, 0xec, 0x2c, 0x19, 0x44, 0xb9, 0x51, 0x82, 0x02, 0xe9, 0xe0, - 0x46, 0x1d, 0x8a, 0x6a, 0xac, 0xd3, 0x33, 0xd7, 0xb8, 0x05, 0xb9, 0x9e, 0x39, 0x40, 0x0b, 0xdf, - 0xb6, 0x02, 0x1d, 0x2a, 0xc1, 0x9f, 0x8d, 0x57, 0xe2, 0x38, 0x5d, 0x32, 0x04, 0x9c, 0x49, 0x85, - 0x80, 0x1b, 0x45, 0xc8, 0xe3, 0x1b, 0x1b, 0xb7, 0xaf, 0xf2, 0x16, 0x1a, 0xff, 0x28, 0x87, 0x8e, - 0x85, 0x14, 0xe7, 0x73, 0xc3, 0xdb, 0x1f, 0x41, 0x65, 0xec, 0x7b, 0x7d, 0x11, 0x04, 0x9e, 0xaf, - 0x8d, 0xa3, 0xd7, 0x5f, 0x9c, 0x7a, 0x5e, 0x3f, 0x0c, 0x69, 0x8c, 0x98, 0xbc, 0xf9, 0xaf, 0xb2, - 0x50, 0x89, 0x1e, 0x28, 0x7f, 0x46, 0x8a, 0x73, 0x15, 0xca, 0xdc, 0x13, 0xfe, 0xc8, 0xb4, 0x2d, - 0xa5, 0x3d, 0x36, 0x87, 0x66, 0x68, 0xe4, 0x7e, 0xec, 0x4d, 0xe4, 0xe4, 0x58, 0xa8, 0x10, 0xd6, - 0x53, 0x7b, 0x24, 0x3c, 0x96, 0xa7, 0xe4, 0x11, 0x0a, 0x76, 0xdf, 0xf1, 0x26, 0x16, 0x2b, 0x60, - 0xfb, 0x11, 0x1d, 0x6f, 0x7b, 0xe6, 0x38, 0x50, 0x3a, 0x73, 0xcf, 0xf6, 0x3d, 0x56, 0x42, 0xa2, - 0x6d, 0x7b, 0x30, 0x32, 0x59, 0x19, 0x99, 0xf5, 0x9e, 0xdb, 0x12, 0x95, 0x70, 0x05, 0xcd, 0xd4, - 0x83, 0xb1, 0x70, 0xbb, 0xd2, 0x17, 0x42, 0xee, 0x99, 0x63, 0x15, 0xd3, 0x34, 0x84, 0x65, 0xd9, - 0x52, 0xe9, 0xcf, 0x6d, 0xb3, 0x2f, 0x8e, 0x3d, 0xef, 0x94, 0x2d, 0xa3, 0xa2, 0xe9, 0xb8, 0x81, - 0x34, 0x07, 0xbe, 0x39, 0x52, 0x3a, 0xb4, 0x27, 0x1c, 0x41, 0xad, 0x15, 0x7a, 0xb7, 0x2d, 0x87, - 0x93, 0xe3, 0x47, 0xe8, 0xf7, 0xad, 0xaa, 0x3c, 0x93, 0x25, 0xc6, 0x02, 0x75, 0xe8, 0x32, 0x94, - 0x37, 0x6c, 0xc7, 0x3e, 0xb6, 0x1d, 0x9b, 0xad, 0x21, 0x6a, 0xfb, 0xbc, 0x6f, 0x3a, 0xb6, 0xe5, - 0x9b, 0xcf, 0x19, 0xc7, 0xce, 0x3d, 0xf6, 0xbd, 0x53, 0x9b, 0x5d, 0x43, 0x44, 0x72, 0x03, 0xcf, - 0xec, 0x1f, 0xb2, 0xeb, 0x94, 0x2b, 0x3b, 0x15, 0xb2, 0x3f, 0x3c, 0x31, 0x8f, 0xd9, 0x8d, 0x38, - 0xa4, 0x77, 0xb3, 0xb1, 0x06, 0xab, 0x53, 0x59, 0xf9, 0x46, 0x49, 0x7b, 0x9f, 0x8d, 0x1a, 0x54, - 0x13, 0xe9, 0xd2, 0xc6, 0xab, 0x50, 0x0e, 0x93, 0xa9, 0xe8, 0xa5, 0xdb, 0x81, 0x0a, 0x03, 0x6b, - 0x21, 0x89, 0xda, 0x8d, 0xdf, 0xcf, 0x40, 0x51, 0x65, 0xb2, 0xf9, 0x46, 0x54, 0x79, 0x92, 0x59, - 0x20, 0x7b, 0xa9, 0x88, 0x74, 0xee, 0x37, 0x2a, 0x3f, 0xb9, 0x0e, 0x05, 0x87, 0xdc, 0x71, 0xad, - 0xbe, 0xa8, 0x91, 0xd0, 0x36, 0xb9, 0xa4, 0xb6, 0x69, 0xb6, 0xa2, 0x7c, 0x73, 0x18, 0x7a, 0x24, - 0xab, 0xb0, 0xe7, 0x0b, 0xa1, 0xc2, 0x8a, 0xe4, 0x4d, 0x67, 0xe9, 0xac, 0xf0, 0x46, 0x63, 0xb3, - 0x2f, 0x09, 0x40, 0xa7, 0x28, 0x2a, 0x53, 0x96, 0x47, 0x29, 0xdf, 0x1c, 0x9a, 0xb2, 0x79, 0x02, - 0xe5, 0x43, 0x2f, 0x98, 0x3e, 0x93, 0x4b, 0x90, 0xeb, 0x79, 0x63, 0x65, 0x61, 0x6e, 0x78, 0x92, - 0x2c, 0x4c, 0x75, 0x04, 0x9f, 0x48, 0x25, 0x54, 0x86, 0x3d, 0x18, 0x4a, 0xe5, 0x89, 0x77, 0x5c, - 0x57, 0xf8, 0xac, 0x80, 0x6b, 0x68, 0x88, 0x31, 0x5a, 0xb5, 0xac, 0x88, 0xab, 0x46, 0xf0, 0x6d, - 0xdb, 0x0f, 0x24, 0x2b, 0x35, 0x3b, 0x78, 0x9a, 0xda, 0x03, 0x3a, 0x04, 0xe9, 0x07, 0xb1, 0x5a, - 0xc2, 0x2e, 0x52, 0x73, 0x53, 0xb8, 0x28, 0x63, 0xe4, 0x3d, 0x29, 0xd7, 0x8f, 0x5e, 0x90, 0xc5, - 0x13, 0x8c, 0xda, 0x1f, 0x4d, 0x02, 0x69, 0x9f, 0x5c, 0xb0, 0x5c, 0xf3, 0x19, 0xd4, 0x52, 0x65, - 0x4c, 0xfc, 0x3a, 0xb0, 0x14, 0x00, 0xbb, 0xbe, 0xc4, 0x6f, 0xc1, 0xb5, 0x14, 0x74, 0xcf, 0xb6, - 0x2c, 0x8a, 0xf5, 0x4e, 0x3f, 0x08, 0x07, 0xb8, 0x51, 0x81, 0x52, 0x5f, 0xad, 0x52, 0xf3, 0x10, - 0x6a, 0xb4, 0x6c, 0x7b, 0x42, 0x9a, 0x07, 0xae, 0x73, 0xf1, 0x27, 0xae, 0x35, 0x6b, 0x7e, 0x55, - 0x3b, 0x58, 0xa8, 0x2f, 0x4e, 0x7c, 0x6f, 0x44, 0xbc, 0x0a, 0x06, 0xfd, 0x46, 0xee, 0xd2, 0xd3, - 0x6b, 0x9f, 0x95, 0x5e, 0xf3, 0x97, 0x15, 0x28, 0xb5, 0xfa, 0x7d, 0x74, 0x09, 0x67, 0xde, 0xfc, - 0x0e, 0x14, 0xfb, 0x9e, 0x7b, 0x62, 0x0f, 0xb4, 0x3e, 0x9e, 0xb6, 0x0c, 0x35, 0x1d, 0x0a, 0xdc, - 0x89, 0x3d, 0x30, 0x34, 0x32, 0x92, 0xe9, 0xf3, 0xa4, 0x70, 0x25, 0x99, 0x52, 0xaa, 0xd1, 0xf1, - 0xf1, 0x00, 0xf2, 0xb6, 0x7b, 0xe2, 0xe9, 0xc2, 0xd0, 0xcf, 0x5f, 0x42, 0x44, 0xd5, 0x91, 0x84, - 0xd8, 0xf8, 0x4f, 0x19, 0x28, 0xaa, 0x57, 0xf3, 0x57, 0x61, 0x45, 0xb8, 0xb8, 0x99, 0x42, 0x55, - 0xae, 0x77, 0xd1, 0x14, 0x14, 0x8d, 0x56, 0x0d, 0x11, 0xc7, 0x93, 0x81, 0x8e, 0xbd, 0x24, 0x41, - 0xfc, 0x3d, 0xb8, 0xa5, 0x9a, 0x87, 0xbe, 0xf0, 0x85, 0x23, 0xcc, 0x40, 0x6c, 0x0e, 0x4d, 0xd7, - 0x15, 0x8e, 0x3e, 0xd8, 0x2f, 0x7b, 0xcc, 0x9b, 0xb0, 0xac, 0x1e, 0x75, 0xc7, 0x66, 0x5f, 0x04, - 0x3a, 0xdf, 0x97, 0x82, 0xf1, 0xaf, 0x41, 0x81, 0xea, 0x66, 0xeb, 0xd6, 0xd5, 0x4b, 0xa9, 0xb0, - 0x1a, 0x5e, 0x74, 0xf2, 0xb4, 0x00, 0xd4, 0x34, 0xa1, 0xd3, 0xa5, 0x77, 0xff, 0x17, 0xaf, 0x9c, - 0x57, 0xf2, 0xff, 0x12, 0x44, 0xd8, 0x3f, 0x4b, 0x38, 0x82, 0x0a, 0x1c, 0xf1, 0x64, 0xcc, 0x52, - 0x66, 0x25, 0x05, 0x6b, 0xfc, 0xc7, 0x3c, 0xe4, 0x71, 0x86, 0x11, 0x79, 0xe8, 0x8d, 0x44, 0x14, - 0x5f, 0x56, 0xa6, 0x46, 0x0a, 0x86, 0xa6, 0x8d, 0xa9, 0x52, 0xfc, 0x11, 0x9a, 0x52, 0x1e, 0xd3, - 0x60, 0xc4, 0x1c, 0xfb, 0xde, 0x89, 0xed, 0xc4, 0x98, 0xda, 0x08, 0x9a, 0x02, 0xf3, 0xaf, 0xc3, - 0xcd, 0x91, 0xe9, 0x9f, 0x0a, 0x49, 0xbb, 0xfb, 0x99, 0xe7, 0x9f, 0x06, 0x38, 0x73, 0x1d, 0x4b, - 0x07, 0x26, 0x2f, 0x79, 0xca, 0x5f, 0x87, 0xb5, 0xe7, 0x61, 0x33, 0x7a, 0x87, 0x0a, 0x0d, 0xce, - 0x3e, 0x40, 0x75, 0x6b, 0x89, 0x33, 0x9b, 0xf8, 0x96, 0x55, 0xf5, 0x6c, 0xd8, 0x46, 0x51, 0x32, - 0xd5, 0x44, 0x76, 0xf5, 0x9b, 0x75, 0x86, 0x29, 0x0d, 0x45, 0x6b, 0x4b, 0x55, 0x15, 0x05, 0x1d, - 0x8b, 0x22, 0xab, 0x15, 0x23, 0x06, 0xa0, 0xa0, 0xd1, 0x2b, 0x9f, 0x2a, 0xa5, 0x5a, 0x53, 0x2e, - 0x68, 0x02, 0x84, 0x18, 0x52, 0xf4, 0x87, 0xe1, 0x4b, 0x54, 0xd8, 0x33, 0x09, 0xe2, 0x77, 0x00, - 0x06, 0xa6, 0x14, 0xcf, 0xcd, 0x8b, 0x27, 0xbe, 0x53, 0x17, 0x2a, 0x55, 0x12, 0x43, 0xd0, 0x89, - 0x75, 0xbc, 0xbe, 0xe9, 0x74, 0xa5, 0xe7, 0x9b, 0x03, 0x71, 0x68, 0xca, 0x61, 0x7d, 0xa0, 0x9c, - 0xd8, 0x69, 0x38, 0x8e, 0x58, 0xda, 0x23, 0xf1, 0x89, 0xe7, 0x8a, 0xfa, 0x50, 0x8d, 0x38, 0x6c, - 0x63, 0x4f, 0x4c, 0xd7, 0x74, 0x2e, 0xa4, 0xdd, 0xc7, 0xb1, 0xd8, 0xaa, 0x27, 0x09, 0x10, 0x85, - 0x0d, 0x84, 0xc4, 0x79, 0xec, 0x58, 0xf5, 0xef, 0xab, 0xb1, 0x46, 0x00, 0x5c, 0x5d, 0x21, 0x87, - 0xc2, 0x17, 0x93, 0x51, 0xcb, 0xb2, 0x7c, 0x11, 0x04, 0xf5, 0x53, 0xb5, 0xba, 0x53, 0xe0, 0xc6, - 0x37, 0x29, 0x91, 0x35, 0x6c, 0xbe, 0x05, 0xb5, 0x5d, 0xec, 0x61, 0x6b, 0x6c, 0x77, 0xfb, 0xde, - 0x58, 0xa0, 0x42, 0xa7, 0x90, 0x30, 0x05, 0x10, 0xaa, 0x50, 0xfa, 0x28, 0xf0, 0xdc, 0xd6, 0x61, - 0x47, 0x1d, 0x31, 0xdb, 0x13, 0xc7, 0x61, 0xd9, 0xe6, 0x01, 0x40, 0x2c, 0xd9, 0x78, 0x5c, 0xb4, - 0x28, 0x6b, 0xc4, 0x96, 0x54, 0xb8, 0xca, 0xb5, 0x6c, 0x77, 0xb0, 0xa5, 0x85, 0x99, 0x65, 0x10, - 0x48, 0x61, 0x08, 0x61, 0x45, 0x40, 0x32, 0x58, 0xa8, 0x25, 0x2c, 0x96, 0x6b, 0xfe, 0xef, 0x0c, - 0x54, 0x13, 0x45, 0x12, 0x7f, 0x8a, 0x85, 0x1d, 0x78, 0x9c, 0xa3, 0x41, 0x80, 0xeb, 0xa6, 0x04, - 0x3d, 0x6a, 0xe3, 0xaa, 0xea, 0x1a, 0x0e, 0x7c, 0xaa, 0x82, 0x0e, 0x09, 0xc8, 0x67, 0x2a, 0xea, - 0x68, 0x3e, 0xd4, 0x91, 0x9b, 0x2a, 0x94, 0x9e, 0xb8, 0xa7, 0xae, 0xf7, 0xdc, 0x55, 0xe7, 0x34, - 0x55, 0xea, 0xa4, 0x72, 0x8e, 0x61, 0x31, 0x4d, 0xae, 0xf9, 0x2f, 0xf2, 0x53, 0x45, 0x6d, 0x6d, - 0x28, 0x2a, 0x77, 0x81, 0x2c, 0xd9, 0xd9, 0x2a, 0xa4, 0x24, 0xb2, 0xce, 0x6f, 0x25, 0x40, 0x86, - 0x26, 0x46, 0x3b, 0x3e, 0x2a, 0xf9, 0xcc, 0xce, 0xcd, 0xc3, 0xa5, 0x18, 0x85, 0xba, 0x39, 0x55, - 0xf5, 0x1c, 0x71, 0x68, 0xfc, 0xb5, 0x0c, 0x5c, 0x9f, 0x87, 0x92, 0xac, 0x0d, 0xcf, 0xa4, 0x6b, - 0xc3, 0xbb, 0x53, 0xb5, 0xd6, 0x59, 0x1a, 0xcd, 0x83, 0x97, 0xec, 0x44, 0xba, 0xf2, 0xba, 0xf9, - 0x7b, 0x19, 0x58, 0x9b, 0x19, 0x73, 0xc2, 0x8e, 0x01, 0x28, 0x2a, 0xc9, 0x52, 0xa5, 0x50, 0x51, - 0x71, 0x8a, 0x4a, 0x2e, 0xd0, 0x09, 0x1f, 0xa8, 0x6c, 0xbf, 0xae, 0x2e, 0x57, 0x66, 0x32, 0xae, - 0x1a, 0x1e, 0x20, 0x03, 0xa1, 0x02, 0xb1, 0xca, 0xd8, 0xd2, 0x90, 0xa2, 0x32, 0x65, 0x55, 0x06, - 0x84, 0x95, 0xa8, 0xc4, 0x6a, 0x32, 0x76, 0xec, 0x3e, 0x36, 0xcb, 0xbc, 0x01, 0x37, 0xd5, 0x15, - 0x03, 0xed, 0x36, 0x9e, 0xf4, 0x86, 0x36, 0x6d, 0x0e, 0x56, 0xc1, 0xf7, 0x1c, 0x4e, 0x8e, 0x1d, - 0x3b, 0x18, 0x32, 0x68, 0x1a, 0x70, 0x6d, 0xce, 0x00, 0xa9, 0xcb, 0x4f, 0x75, 0xf7, 0x57, 0x00, - 0xb6, 0x9e, 0x86, 0x9d, 0x66, 0x19, 0xce, 0x61, 0x65, 0xeb, 0x69, 0x92, 0xbb, 0xde, 0x3c, 0x4f, - 0x51, 0x7b, 0x05, 0x2c, 0xd7, 0xfc, 0xb5, 0x4c, 0x58, 0x03, 0xd1, 0xf8, 0xf3, 0x50, 0x53, 0x1d, - 0x3e, 0x34, 0x2f, 0x1c, 0xcf, 0xb4, 0x78, 0x1b, 0x56, 0x82, 0xe8, 0x12, 0x4c, 0xe2, 0xc0, 0x9a, - 0x36, 0x04, 0xba, 0x29, 0x24, 0x63, 0x8a, 0x28, 0x74, 0x85, 0xb2, 0x71, 0xe2, 0x84, 0x93, 0x53, - 0x67, 0xd2, 0x96, 0x5b, 0x26, 0x37, 0xcd, 0x6c, 0x7e, 0x0d, 0xd6, 0xba, 0xb1, 0x72, 0x57, 0x36, - 0x33, 0x0a, 0x87, 0x3a, 0x19, 0xb6, 0x42, 0xe1, 0xd0, 0xcd, 0xe6, 0x3f, 0x2e, 0x01, 0xc4, 0x49, - 0xa2, 0x39, 0x7b, 0x7e, 0x5e, 0xcd, 0xc3, 0x4c, 0xca, 0x36, 0xf7, 0xd2, 0x29, 0xdb, 0xf7, 0x22, - 0xd3, 0x5d, 0x05, 0x90, 0xa7, 0x0b, 0xbf, 0xe3, 0x3e, 0x4d, 0x1b, 0xec, 0xa9, 0x92, 0xa0, 0xc2, - 0x74, 0x49, 0xd0, 0xdd, 0xd9, 0xfa, 0xc1, 0x29, 0x65, 0x14, 0x47, 0x26, 0x4a, 0xa9, 0xc8, 0x44, - 0x03, 0xca, 0xbe, 0x30, 0x2d, 0xcf, 0x75, 0x2e, 0xc2, 0xcc, 0x60, 0xd8, 0xe6, 0x6f, 0x41, 0x41, - 0xd2, 0x3d, 0x9e, 0x32, 0xed, 0x9d, 0x17, 0x2c, 0x9c, 0xc2, 0x45, 0xcd, 0x66, 0x07, 0xba, 0xe8, - 0x4f, 0x9d, 0x9a, 0x65, 0x23, 0x01, 0xe1, 0xeb, 0xc0, 0x6d, 0x74, 0xd3, 0x1c, 0x47, 0x58, 0x1b, - 0x17, 0x5b, 0x2a, 0x61, 0x47, 0xe7, 0x7a, 0xd9, 0x98, 0xf3, 0x24, 0x5c, 0xff, 0xe5, 0x78, 0xfd, - 0xa9, 0xcb, 0x67, 0x76, 0x80, 0x23, 0xad, 0x91, 0xf9, 0x12, 0xb5, 0xd1, 0x72, 0x08, 0x37, 0xac, - 0x9a, 0x4b, 0x92, 0xde, 0x38, 0xeb, 0x7d, 0xc9, 0xd3, 0x70, 0x7a, 0x55, 0x68, 0x66, 0x95, 0x98, - 0xc6, 0x00, 0xd2, 0xe4, 0x7d, 0xcf, 0xdd, 0x47, 0x89, 0x60, 0x5a, 0x93, 0xeb, 0x36, 0x8e, 0x77, - 0xec, 0x4c, 0x7c, 0xd3, 0xa1, 0xa7, 0x6b, 0x4a, 0x93, 0xc7, 0x90, 0xe6, 0x1f, 0x66, 0x23, 0xe7, - 0xa9, 0x02, 0x85, 0x63, 0x33, 0xb0, 0xfb, 0xea, 0x74, 0xd3, 0x46, 0x8f, 0x3a, 0xdd, 0xa4, 0x67, - 0x79, 0x2c, 0x8b, 0x7e, 0x50, 0x20, 0x74, 0xc2, 0x26, 0xbe, 0x35, 0xc5, 0xf2, 0xa8, 0x02, 0x42, - 0x49, 0x52, 0x55, 0x41, 0x44, 0x4a, 0xe1, 0x37, 0x2b, 0xaa, 0xb7, 0x24, 0x47, 0x9a, 0x8e, 0x18, - 0x56, 0x46, 0x1c, 0xd7, 0x93, 0x42, 0x05, 0x1f, 0x49, 0xee, 0x19, 0x20, 0x9b, 0xf0, 0x1a, 0x00, - 0xab, 0xa2, 0x63, 0x12, 0x32, 0x55, 0x11, 0xc3, 0x80, 0xdc, 0xb6, 0x65, 0xdc, 0xf7, 0xe9, 0x07, - 0xac, 0x86, 0x3d, 0x8a, 0x2f, 0x63, 0xb1, 0x15, 0xe4, 0x6a, 0x52, 0xad, 0xca, 0x2a, 0xfe, 0x3c, - 0xa3, 0x0a, 0x16, 0x86, 0x6f, 0xb5, 0x50, 0x2f, 0xad, 0x61, 0xcf, 0x22, 0x43, 0x87, 0x71, 0xf4, - 0xbb, 0xc6, 0x26, 0x3a, 0x41, 0xf6, 0xd8, 0x74, 0x25, 0xbb, 0x86, 0x43, 0x1d, 0x5b, 0x27, 0xec, - 0x3a, 0x92, 0xf4, 0x87, 0xa6, 0x64, 0x37, 0x10, 0x07, 0x7f, 0x6d, 0x09, 0x1f, 0x25, 0x85, 0xdd, - 0x44, 0x1c, 0x69, 0x0e, 0xd8, 0xad, 0xe6, 0x6f, 0xc6, 0x15, 0xcf, 0x6f, 0x44, 0xee, 0xc9, 0x22, - 0xdb, 0x07, 0x1d, 0x98, 0x79, 0x7b, 0xb9, 0x0d, 0x6b, 0xbe, 0xf8, 0xc1, 0xc4, 0x4e, 0xdd, 0x03, - 0xc8, 0x5d, 0x5d, 0x68, 0x32, 0x4b, 0xd1, 0x3c, 0x83, 0xb5, 0xb0, 0xf1, 0xcc, 0x96, 0x43, 0x8a, - 0x14, 0xf1, 0xb7, 0x12, 0x17, 0x15, 0x32, 0x73, 0x2f, 0x78, 0x45, 0x2c, 0xe3, 0x8b, 0x09, 0x51, - 0x26, 0x20, 0xbb, 0x40, 0x26, 0xa0, 0xf9, 0xbf, 0x92, 0xa9, 0x65, 0xe5, 0xb0, 0x59, 0x91, 0xc3, - 0x36, 0x9b, 0x6a, 0x8e, 0x83, 0xfb, 0xd9, 0x97, 0x09, 0xee, 0xcf, 0x2b, 0xdb, 0x78, 0x1f, 0xfd, - 0x07, 0xda, 0x99, 0x4f, 0x17, 0x48, 0x5c, 0xa4, 0x70, 0xf9, 0x06, 0x25, 0x8e, 0xcd, 0xae, 0xaa, - 0x29, 0x2a, 0xcc, 0xbd, 0x36, 0x94, 0xcc, 0x10, 0x6b, 0x4c, 0x23, 0x41, 0x95, 0xd0, 0x63, 0xc5, - 0x79, 0x7a, 0x0c, 0x7d, 0x67, 0xad, 0xe1, 0xa2, 0xb6, 0xca, 0xf3, 0xa8, 0xdf, 0x21, 0x7b, 0xda, - 0xe3, 0x65, 0x63, 0x06, 0x8e, 0xc6, 0xde, 0x68, 0xe2, 0x48, 0x5b, 0xa7, 0x32, 0x54, 0x63, 0xfa, - 0x5e, 0x63, 0x65, 0xf6, 0x5e, 0xe3, 0x87, 0x00, 0x81, 0xc0, 0xdd, 0xb1, 0x65, 0xf7, 0xa5, 0xae, - 0x3c, 0xba, 0x73, 0xd9, 0xd8, 0x74, 0x02, 0x26, 0x41, 0x81, 0xfd, 0x1f, 0x99, 0xe7, 0x94, 0x94, - 0xd5, 0x25, 0x12, 0x51, 0x7b, 0x5a, 0xbb, 0xaf, 0xcc, 0x6a, 0xf7, 0xb7, 0xa0, 0x10, 0xa0, 0x09, - 0x4d, 0x57, 0x73, 0x2e, 0x5f, 0xdf, 0x75, 0xb2, 0xb3, 0x0d, 0x85, 0x4b, 0x21, 0x49, 0xd4, 0x7f, - 0x9e, 0x4f, 0x97, 0x72, 0x2a, 0x46, 0xd8, 0x4c, 0x69, 0xd8, 0x9b, 0x69, 0x0d, 0xdb, 0xb0, 0xa0, - 0xa8, 0xd3, 0x0b, 0xd3, 0x81, 0x82, 0x30, 0x30, 0x99, 0x4d, 0x04, 0x26, 0xa3, 0xfa, 0xd6, 0x5c, - 0xb2, 0xbe, 0x75, 0xea, 0xde, 0x5e, 0x61, 0xe6, 0xde, 0x5e, 0xf3, 0x13, 0x28, 0x28, 0x9f, 0x00, - 0x42, 0x73, 0x54, 0x99, 0xb2, 0x38, 0x28, 0x96, 0xe1, 0xd7, 0x81, 0x05, 0x82, 0x6c, 0x1d, 0xd1, - 0x35, 0x47, 0x82, 0x94, 0x64, 0x96, 0xd7, 0xe1, 0xba, 0xc2, 0x0d, 0xd2, 0x4f, 0xc8, 0xe0, 0x72, - 0xec, 0x63, 0xdf, 0xf4, 0x2f, 0x58, 0xbe, 0xf9, 0x21, 0x25, 0xf7, 0x43, 0x81, 0xaa, 0x46, 0xf7, - 0x24, 0x95, 0x5a, 0xb6, 0xb4, 0xf6, 0xa1, 0xda, 0x10, 0xed, 0xed, 0xa9, 0x8a, 0x39, 0x72, 0xa7, - 0x28, 0x1e, 0xb4, 0x9c, 0x3c, 0xe3, 0xff, 0xd4, 0xf6, 0x5b, 0x73, 0x23, 0x61, 0x31, 0xa6, 0x4b, - 0xe0, 0x32, 0x8b, 0x96, 0xc0, 0x35, 0x1f, 0xc3, 0xaa, 0x91, 0xd6, 0xe9, 0xfc, 0x3d, 0x28, 0x79, - 0xe3, 0x24, 0x9f, 0x17, 0xc9, 0x65, 0x88, 0xde, 0xfc, 0x59, 0x06, 0x96, 0x3b, 0xae, 0x14, 0xbe, - 0x6b, 0x3a, 0xdb, 0x8e, 0x39, 0xe0, 0xef, 0x86, 0x5a, 0x6a, 0x7e, 0xec, 0x21, 0x89, 0x9b, 0x56, - 0x58, 0x8e, 0x0e, 0xa3, 0xf3, 0x1b, 0xb0, 0x26, 0x2c, 0x5b, 0x7a, 0xbe, 0xb2, 0x93, 0xc3, 0x4a, - 0xc5, 0xeb, 0xc0, 0x14, 0xb8, 0x4b, 0x5b, 0xa2, 0xa7, 0x96, 0xb9, 0x0e, 0xd7, 0x53, 0xd0, 0xd0, - 0x08, 0xce, 0xf2, 0xdb, 0x50, 0x8f, 0x4f, 0xa3, 0x2d, 0xcf, 0x95, 0x1d, 0xd7, 0x12, 0xe7, 0x64, - 0x64, 0xb1, 0x5c, 0xf3, 0x37, 0x22, 0xf3, 0xee, 0xa9, 0xae, 0x63, 0xf4, 0x3d, 0x2f, 0xbe, 0x24, - 0xab, 0x5b, 0x89, 0xcb, 0xd8, 0xd9, 0x05, 0x2e, 0x63, 0x7f, 0x18, 0x5f, 0xa8, 0x55, 0x07, 0xc5, - 0x2b, 0x73, 0x4f, 0x1f, 0x2a, 0xbf, 0xd2, 0xd6, 0x7d, 0x57, 0x24, 0x6e, 0xd7, 0xbe, 0xa9, 0x5d, - 0xba, 0xfc, 0x22, 0x56, 0xb0, 0xaa, 0x54, 0x78, 0x67, 0xfa, 0x16, 0xc7, 0x62, 0x65, 0x90, 0x33, - 0x86, 0x2a, 0xbc, 0xb4, 0xa1, 0xfa, 0xed, 0x29, 0xef, 0xa9, 0x3c, 0x37, 0x1c, 0x77, 0xc5, 0x1d, - 0xd5, 0x6f, 0x43, 0x69, 0x68, 0x07, 0xd2, 0xf3, 0xd5, 0xbd, 0xe9, 0xd9, 0x7b, 0x5e, 0x89, 0xd9, - 0xda, 0x51, 0x88, 0x54, 0xb3, 0x16, 0x52, 0xf1, 0xef, 0xc1, 0x1a, 0x4d, 0xfc, 0x61, 0x6c, 0x35, - 0x04, 0xf5, 0xea, 0xdc, 0x5a, 0xc1, 0x04, 0xab, 0x8d, 0x29, 0x12, 0x63, 0x96, 0x49, 0x63, 0x00, - 0x10, 0xaf, 0xcf, 0x8c, 0x16, 0xfb, 0x0c, 0xf7, 0xa6, 0x6f, 0x42, 0x31, 0x98, 0x1c, 0xc7, 0xf9, - 0x36, 0xdd, 0x6a, 0x9c, 0x43, 0x63, 0xc6, 0x3a, 0x38, 0x14, 0xbe, 0xea, 0xee, 0x95, 0x97, 0xb7, - 0x3f, 0x4c, 0x2e, 0xbc, 0x12, 0xce, 0xbb, 0x97, 0xac, 0x5e, 0xc4, 0x39, 0x21, 0x01, 0x8d, 0x77, - 0xa0, 0x9a, 0x98, 0x54, 0xd4, 0xcc, 0x13, 0xd7, 0xf2, 0xc2, 0x10, 0x30, 0xfe, 0x56, 0x97, 0xd7, - 0xac, 0x30, 0x08, 0x4c, 0xbf, 0x1b, 0x06, 0xb0, 0xe9, 0x09, 0xbc, 0xc2, 0xc3, 0x7e, 0x05, 0x6a, - 0x09, 0x93, 0x2e, 0x0a, 0x0f, 0xa6, 0x81, 0xcd, 0x33, 0xf8, 0x7c, 0x82, 0xdd, 0xa1, 0xf0, 0x47, - 0x76, 0x80, 0x07, 0x89, 0x72, 0x16, 0xc9, 0xb4, 0xb6, 0x84, 0x2b, 0x6d, 0x19, 0x6a, 0xd0, 0xa8, - 0xcd, 0xbf, 0x09, 0x85, 0xb1, 0xf0, 0x47, 0x81, 0xd6, 0xa2, 0xd3, 0x12, 0x34, 0x97, 0x6d, 0x60, - 0x28, 0x9a, 0xe6, 0x3f, 0xcc, 0x40, 0x79, 0x4f, 0x48, 0x13, 0x6d, 0x07, 0xbe, 0x37, 0xf5, 0x96, - 0xd9, 0x1c, 0x71, 0x88, 0xba, 0xae, 0xdd, 0xd7, 0xf5, 0x8e, 0xc6, 0xd7, 0xed, 0x9d, 0xa5, 0xb8, - 0x63, 0x8d, 0x0d, 0x28, 0x69, 0x70, 0xe3, 0x5d, 0x58, 0x9d, 0xc2, 0xa4, 0x79, 0x51, 0xb6, 0x7d, - 0xf7, 0x62, 0x14, 0x16, 0x32, 0x2d, 0x1b, 0x69, 0xe0, 0x46, 0x05, 0x4a, 0x63, 0x45, 0xd0, 0xfc, - 0xc3, 0x1b, 0x54, 0x3e, 0x63, 0x9f, 0xa0, 0x4f, 0x3f, 0xef, 0x64, 0xbd, 0x03, 0x40, 0x47, 0xb3, - 0x2a, 0xb2, 0x50, 0x21, 0xdb, 0x04, 0x84, 0xbf, 0x1f, 0xc5, 0xda, 0xf3, 0x73, 0x8d, 0xaa, 0x24, - 0xf3, 0xe9, 0x80, 0x7b, 0x1d, 0x4a, 0x76, 0x40, 0x71, 0x38, 0x5d, 0x98, 0x14, 0x36, 0xf9, 0xb7, - 0xa0, 0x68, 0x8f, 0xc6, 0x9e, 0x2f, 0x75, 0x30, 0xfe, 0x4a, 0xae, 0x1d, 0xc2, 0xdc, 0x59, 0x32, - 0x34, 0x0d, 0x52, 0x8b, 0x73, 0xa2, 0x2e, 0xbf, 0x98, 0xba, 0x7d, 0x1e, 0x52, 0x2b, 0x1a, 0xfe, - 0x5d, 0xa8, 0x0d, 0x54, 0x5d, 0xa6, 0x62, 0xac, 0x95, 0xc8, 0x57, 0xae, 0x62, 0xf2, 0x28, 0x49, - 0xb0, 0xb3, 0x64, 0xa4, 0x39, 0x20, 0x4b, 0x34, 0xe0, 0x45, 0x20, 0x7b, 0xde, 0x47, 0x9e, 0xed, - 0x92, 0xbb, 0xfb, 0x02, 0x96, 0x46, 0x92, 0x00, 0x59, 0xa6, 0x38, 0xf0, 0xaf, 0xa3, 0xc5, 0x13, - 0x48, 0x7d, 0x75, 0xfd, 0xee, 0x55, 0x9c, 0x7a, 0x22, 0xd0, 0x97, 0xce, 0x03, 0xc9, 0xcf, 0xa1, - 0x91, 0xd8, 0x24, 0xfa, 0x25, 0xad, 0xf1, 0xd8, 0xf7, 0xd0, 0x67, 0xae, 0x11, 0xb7, 0xaf, 0x5f, - 0xc5, 0xed, 0xf0, 0x52, 0xea, 0x9d, 0x25, 0xe3, 0x0a, 0xde, 0xbc, 0x87, 0x9e, 0x9d, 0x1e, 0xc2, - 0xae, 0x30, 0xcf, 0xc2, 0x8b, 0xef, 0xf7, 0x17, 0x9a, 0x05, 0xa2, 0xd8, 0x59, 0x32, 0xa6, 0x78, - 0xf0, 0x5f, 0x85, 0xb5, 0xd4, 0x3b, 0xe9, 0xae, 0xab, 0xba, 0x16, 0xff, 0xb5, 0x85, 0x87, 0x81, - 0x44, 0x3b, 0x4b, 0xc6, 0x2c, 0x27, 0x3e, 0x81, 0xcf, 0xcd, 0x0e, 0x69, 0x4b, 0xf4, 0x1d, 0xdb, - 0x15, 0xfa, 0x06, 0xfd, 0x3b, 0x2f, 0x37, 0x5b, 0x9a, 0x78, 0x67, 0xc9, 0xb8, 0x9c, 0x33, 0xff, - 0x8b, 0x70, 0x7b, 0x3c, 0x57, 0xc5, 0x28, 0xd5, 0xa5, 0x2f, 0xe0, 0xbf, 0xb7, 0xe0, 0x9b, 0x67, - 0xe8, 0x77, 0x96, 0x8c, 0x2b, 0xf9, 0xa3, 0xed, 0x4c, 0x1e, 0xb4, 0x2e, 0x1f, 0x57, 0x0d, 0x7e, - 0x1b, 0x2a, 0x66, 0xdf, 0xd9, 0x11, 0xa6, 0x15, 0xe5, 0x0b, 0x62, 0x40, 0xe3, 0xbf, 0x65, 0xa0, - 0xa8, 0xe5, 0xfd, 0x76, 0x54, 0x13, 0x10, 0xa9, 0xee, 0x18, 0xc0, 0x3f, 0x80, 0x8a, 0xf0, 0x7d, - 0xcf, 0xdf, 0xf4, 0xac, 0xb0, 0x9c, 0x72, 0x3a, 0xca, 0xac, 0xf8, 0xac, 0xb7, 0x43, 0x34, 0x23, - 0xa6, 0xe0, 0xef, 0x03, 0xa8, 0x7d, 0xde, 0x8b, 0x6f, 0x01, 0x35, 0xe6, 0xd3, 0xab, 0x14, 0x54, - 0x8c, 0x1d, 0x87, 0xe5, 0xc2, 0xfc, 0x4f, 0xd8, 0x8c, 0x1c, 0xce, 0x42, 0xc2, 0xe1, 0xbc, 0xad, - 0xe3, 0x08, 0x14, 0x5e, 0xd1, 0x77, 0xe1, 0x22, 0x40, 0xe3, 0x0f, 0x32, 0x50, 0x54, 0xca, 0x83, - 0xb7, 0x67, 0x47, 0xf4, 0xda, 0x8b, 0x75, 0xce, 0xfa, 0xf4, 0xc8, 0xbe, 0x05, 0xa0, 0x74, 0x50, - 0x62, 0x64, 0xb7, 0xa7, 0xf8, 0x68, 0xd2, 0xb0, 0x80, 0x39, 0xc6, 0x6f, 0x3e, 0x54, 0xf7, 0xb5, - 0x28, 0x24, 0xfc, 0x64, 0x77, 0x97, 0x2d, 0xf1, 0x35, 0xa8, 0x3d, 0xd9, 0x7f, 0xbc, 0x7f, 0xf0, - 0x6c, 0xff, 0xa8, 0x6d, 0x18, 0x07, 0x86, 0x8a, 0x0c, 0x6f, 0xb4, 0xb6, 0x8e, 0x3a, 0xfb, 0x87, - 0x4f, 0x7a, 0x2c, 0xdb, 0xf8, 0x67, 0x19, 0xa8, 0xa5, 0x74, 0xd7, 0x9f, 0xed, 0xd2, 0x25, 0xa6, - 0x3f, 0x37, 0x7f, 0xfa, 0xf3, 0x97, 0x4d, 0x7f, 0x61, 0x7a, 0xfa, 0x7f, 0x27, 0x03, 0xb5, 0x94, - 0x8e, 0x4c, 0x72, 0xcf, 0xa4, 0xb9, 0x27, 0x4f, 0xfa, 0xec, 0xd4, 0x49, 0xdf, 0x84, 0xe5, 0xf0, - 0xf7, 0x7e, 0x1c, 0x71, 0x48, 0xc1, 0x92, 0x38, 0x74, 0x61, 0x22, 0x9f, 0xc6, 0xa1, 0x4b, 0x13, - 0x57, 0xf7, 0x96, 0x2e, 0x88, 0x06, 0x74, 0x7f, 0xbe, 0x71, 0xb9, 0x06, 0xbd, 0x62, 0x08, 0x8f, - 0xa0, 0x3a, 0x8e, 0xb7, 0xe9, 0xcb, 0x99, 0x25, 0x49, 0xca, 0x17, 0xf4, 0xf3, 0x77, 0x33, 0xb0, - 0x92, 0xd6, 0xb9, 0xff, 0x4f, 0x4f, 0xeb, 0x3f, 0xc9, 0xc0, 0xda, 0x8c, 0x26, 0xbf, 0xd2, 0xb0, - 0x9b, 0xee, 0x57, 0x76, 0x81, 0x7e, 0xe5, 0xe6, 0xf4, 0xeb, 0x72, 0x4d, 0x72, 0x75, 0x8f, 0xbb, - 0xf0, 0xb9, 0x4b, 0xcf, 0x84, 0x2b, 0xa6, 0x3a, 0xc5, 0x34, 0x37, 0xcd, 0xf4, 0xb7, 0x33, 0x70, - 0xfb, 0x2a, 0x7d, 0xff, 0x7f, 0x5d, 0xae, 0xa6, 0x7b, 0xd8, 0x7c, 0x37, 0x2a, 0x24, 0xa8, 0x42, - 0x49, 0x7f, 0x97, 0x4a, 0x97, 0x6a, 0x0f, 0xbd, 0xe7, 0xae, 0x8a, 0x44, 0x1b, 0xc2, 0xd4, 0x37, - 0xf7, 0x0d, 0x31, 0x76, 0x6c, 0xca, 0x91, 0xde, 0x02, 0x68, 0x91, 0x5f, 0x17, 0x5e, 0xa4, 0xd9, - 0xdc, 0x3d, 0xe8, 0xb6, 0xd9, 0x52, 0xd2, 0x88, 0xfd, 0x24, 0x54, 0xc4, 0xcd, 0x43, 0x28, 0xc6, - 0x57, 0x1b, 0xf6, 0x4c, 0xff, 0xd4, 0x52, 0x99, 0xc8, 0x65, 0x28, 0x1f, 0x6a, 0x17, 0x4a, 0xbd, - 0xea, 0xa3, 0xee, 0xc1, 0xbe, 0x0a, 0x7a, 0x6f, 0x1d, 0xf4, 0xd4, 0x05, 0x89, 0xee, 0xd3, 0x47, - 0x2a, 0x25, 0xf6, 0xc8, 0x68, 0x1d, 0xee, 0x1c, 0x11, 0x46, 0xa1, 0xf9, 0x5b, 0xf9, 0xf0, 0x54, - 0x6b, 0x1a, 0x3a, 0xc7, 0x09, 0x50, 0x44, 0x6d, 0xee, 0x69, 0xc6, 0xd1, 0x6b, 0xa8, 0xa8, 0xb7, - 0x7d, 0xae, 0xe2, 0x10, 0x2c, 0xcb, 0x8b, 0x90, 0x3d, 0x3c, 0x56, 0x95, 0x48, 0x3b, 0x72, 0xe4, - 0xa8, 0x9b, 0x95, 0xbd, 0x73, 0xc9, 0x0a, 0xf8, 0x63, 0x33, 0x38, 0x63, 0xc5, 0xe6, 0x3f, 0xcf, - 0x41, 0x25, 0x52, 0x95, 0x2f, 0xa3, 0xba, 0x39, 0x87, 0x95, 0xce, 0x7e, 0xaf, 0x6d, 0xec, 0xb7, - 0x76, 0x35, 0x4a, 0x8e, 0x5f, 0x83, 0xd5, 0xed, 0xce, 0x6e, 0xfb, 0x68, 0xf7, 0xa0, 0xb5, 0xa5, - 0x81, 0x65, 0x7e, 0x13, 0x78, 0x67, 0xef, 0xf0, 0xc0, 0xe8, 0x1d, 0x75, 0xba, 0x47, 0x9b, 0xad, - 0xfd, 0xcd, 0xf6, 0x6e, 0x7b, 0x8b, 0x15, 0xf9, 0x2b, 0x70, 0x77, 0xff, 0xa0, 0xd7, 0x39, 0xd8, - 0x3f, 0xda, 0x3f, 0x38, 0x3a, 0xd8, 0xf8, 0xa8, 0xbd, 0xd9, 0xeb, 0x1e, 0x75, 0xf6, 0x8f, 0x90, - 0xeb, 0x23, 0xa3, 0x85, 0x4f, 0x58, 0x81, 0xdf, 0x85, 0xdb, 0x1a, 0xab, 0xdb, 0x36, 0x9e, 0xb6, - 0x0d, 0x64, 0xf2, 0x64, 0xbf, 0xf5, 0xb4, 0xd5, 0xd9, 0x6d, 0x6d, 0xec, 0xb6, 0xd9, 0x32, 0xbf, - 0x03, 0x0d, 0x8d, 0x61, 0xb4, 0x7a, 0xed, 0xa3, 0xdd, 0xce, 0x5e, 0xa7, 0x77, 0xd4, 0xfe, 0xde, - 0x66, 0xbb, 0xbd, 0xd5, 0xde, 0x62, 0x35, 0xfe, 0x15, 0xf8, 0x32, 0x75, 0x4a, 0x77, 0x22, 0xfd, - 0xb2, 0x4f, 0x3a, 0x87, 0x47, 0x2d, 0x63, 0x73, 0xa7, 0xf3, 0xb4, 0xcd, 0x56, 0xf8, 0x6b, 0xf0, - 0xa5, 0xcb, 0x51, 0xb7, 0x3a, 0x46, 0x7b, 0xb3, 0x77, 0x60, 0x7c, 0xcc, 0xd6, 0xf8, 0x17, 0xe0, - 0x73, 0x3b, 0xbd, 0xbd, 0xdd, 0xa3, 0x67, 0xc6, 0xc1, 0xfe, 0xa3, 0x23, 0xfa, 0xd9, 0xed, 0x19, - 0x4f, 0x36, 0x7b, 0x4f, 0x8c, 0x36, 0x03, 0xde, 0x80, 0x9b, 0x87, 0x1b, 0x47, 0xfb, 0x07, 0xbd, - 0xa3, 0xd6, 0xfe, 0xc7, 0x1b, 0xbb, 0x07, 0x9b, 0x8f, 0x8f, 0xb6, 0x0f, 0x8c, 0xbd, 0x56, 0x8f, - 0x55, 0xf9, 0x57, 0xe1, 0xb5, 0xcd, 0xee, 0x53, 0xdd, 0xcd, 0x83, 0xed, 0x23, 0xe3, 0xe0, 0x59, - 0xf7, 0xe8, 0xc0, 0x38, 0x32, 0xda, 0xbb, 0x34, 0xe6, 0x6e, 0xdc, 0xf7, 0x12, 0xbf, 0x0d, 0xf5, - 0xce, 0x7e, 0xf7, 0xc9, 0xf6, 0x76, 0x67, 0xb3, 0xd3, 0xde, 0xef, 0x1d, 0x1d, 0xb6, 0x8d, 0xbd, - 0x4e, 0xb7, 0x8b, 0x68, 0xac, 0xd2, 0xfc, 0x0e, 0x14, 0x3b, 0xee, 0x99, 0x2d, 0x69, 0x7f, 0x69, - 0x61, 0xd4, 0x1e, 0x57, 0xd8, 0xa4, 0x6d, 0x61, 0x0f, 0x5c, 0xfa, 0x62, 0x00, 0xed, 0xae, 0x65, - 0x23, 0x06, 0x34, 0xff, 0x20, 0x07, 0x35, 0xc5, 0x22, 0xf4, 0xe0, 0xee, 0xc1, 0xaa, 0x0e, 0x85, - 0x76, 0xd2, 0x2a, 0x6c, 0x1a, 0x4c, 0x9f, 0xe2, 0x52, 0xa0, 0x84, 0x22, 0x4b, 0x82, 0xf8, 0x4d, - 0x28, 0x9a, 0x7d, 0x07, 0xdd, 0x40, 0x95, 0xaf, 0xd4, 0xad, 0xcf, 0xaa, 0xbb, 0x50, 0x2f, 0x2a, - 0xc4, 0xbe, 0xe7, 0x6e, 0x46, 0x97, 0x46, 0x52, 0x30, 0xfe, 0x09, 0xdc, 0x8a, 0xda, 0x6d, 0xb7, - 0xef, 0x5f, 0x8c, 0xa3, 0x6f, 0xe5, 0x95, 0xe6, 0x06, 0x13, 0xb6, 0x6d, 0x47, 0xa4, 0x10, 0x8d, - 0xcb, 0x18, 0xf0, 0x47, 0x00, 0x36, 0x4d, 0x16, 0xd9, 0x47, 0xf3, 0x6f, 0x46, 0xa7, 0x66, 0x53, - 0xb7, 0xb4, 0x19, 0x18, 0xfd, 0xc6, 0x03, 0x62, 0x80, 0x7a, 0xf7, 0xb1, 0xfe, 0xb4, 0xde, 0xb2, - 0x11, 0xb5, 0x9b, 0x0f, 0x00, 0x62, 0x2a, 0xce, 0x60, 0x19, 0x6d, 0x8b, 0x56, 0xb0, 0x27, 0x46, - 0xc7, 0xc2, 0x57, 0x55, 0x7c, 0x0a, 0xf2, 0x08, 0x29, 0x58, 0xa6, 0xf9, 0x47, 0x99, 0x84, 0x1f, - 0xae, 0xfc, 0xec, 0x2b, 0x4f, 0xa0, 0x79, 0x39, 0x21, 0xf4, 0x84, 0xf5, 0xa4, 0x6a, 0xc3, 0x48, - 0x37, 0xf9, 0x21, 0x70, 0x7b, 0x76, 0x2a, 0xf3, 0x0b, 0x4e, 0xe5, 0x1c, 0xda, 0xe9, 0x90, 0x7e, - 0x61, 0x36, 0xa4, 0x7f, 0x07, 0x60, 0xe0, 0x78, 0xc7, 0x3a, 0xaf, 0x58, 0xd4, 0x75, 0x3f, 0x11, - 0xa4, 0xe9, 0x40, 0x39, 0xfc, 0x4e, 0x20, 0xca, 0x18, 0x7d, 0x29, 0x30, 0x0a, 0x70, 0xaa, 0x16, - 0xdf, 0x81, 0x15, 0x91, 0xee, 0x73, 0x76, 0xc1, 0x3e, 0x4f, 0xd1, 0x35, 0xbf, 0x01, 0x6b, 0x33, - 0x48, 0x38, 0x89, 0x63, 0x53, 0x46, 0x1f, 0x0b, 0xc0, 0xdf, 0xb3, 0xe9, 0xfa, 0xe6, 0xbf, 0xcf, - 0xc2, 0xf2, 0x9e, 0xe9, 0xda, 0x27, 0x22, 0x90, 0x61, 0x6f, 0x83, 0xfe, 0x50, 0x8c, 0xcc, 0xb0, - 0xb7, 0xaa, 0xa5, 0xa3, 0x1e, 0xd9, 0x64, 0x3e, 0x61, 0x26, 0xfd, 0x84, 0xbb, 0x69, 0x22, 0x87, - 0x51, 0xfd, 0xbc, 0x6e, 0xe1, 0xda, 0x39, 0x76, 0x5f, 0xb8, 0x41, 0xb8, 0x63, 0xc2, 0x66, 0x5c, - 0xbd, 0x53, 0xbc, 0xa2, 0x7a, 0xa7, 0x34, 0x3b, 0xff, 0x77, 0xa1, 0x1a, 0xf4, 0x7d, 0x21, 0xdc, - 0x60, 0xe8, 0xc9, 0xf0, 0x1b, 0x93, 0x49, 0x10, 0x95, 0xd2, 0x79, 0xcf, 0x5d, 0x94, 0xf1, 0x5d, - 0xdb, 0x3d, 0xd5, 0x15, 0x62, 0x29, 0x18, 0xca, 0x20, 0xc5, 0x7c, 0xec, 0x1f, 0x0a, 0x8a, 0x37, - 0x14, 0x8c, 0xa8, 0x4d, 0x51, 0x1d, 0x53, 0x8a, 0x81, 0xe7, 0xdb, 0x42, 0x85, 0x36, 0x2b, 0x46, - 0x02, 0x82, 0xb4, 0x8e, 0xe9, 0x0e, 0x26, 0xe6, 0x40, 0xe8, 0xf4, 0x77, 0xd4, 0x6e, 0xfe, 0xf7, - 0x02, 0x80, 0xda, 0x0d, 0xc1, 0xd0, 0x1e, 0x53, 0xea, 0xc5, 0xd6, 0x55, 0xc3, 0x35, 0x83, 0x7e, - 0xf3, 0xf7, 0x52, 0x05, 0xfd, 0xb3, 0xc9, 0xd2, 0x98, 0x7c, 0x3a, 0x24, 0x84, 0x93, 0x63, 0x4a, - 0xa1, 0x0b, 0xa7, 0x68, 0xfe, 0xf3, 0x46, 0x12, 0x44, 0xa5, 0x73, 0xa6, 0x14, 0x6d, 0xd7, 0x52, - 0x21, 0xa7, 0xbc, 0x11, 0xb5, 0xe9, 0x4a, 0x50, 0xd0, 0x9a, 0x48, 0xcf, 0x10, 0xae, 0x78, 0x1e, - 0xdd, 0x76, 0x8b, 0x41, 0x7c, 0x0f, 0x6a, 0x63, 0xf3, 0x62, 0x24, 0x5c, 0xb9, 0x27, 0xe4, 0xd0, - 0xb3, 0x74, 0x95, 0xd3, 0x6b, 0x97, 0x77, 0xf0, 0x30, 0x89, 0x6e, 0xa4, 0xa9, 0x51, 0x26, 0xdc, - 0x80, 0x76, 0x89, 0x5a, 0x46, 0xdd, 0xe2, 0x1b, 0x00, 0xea, 0x57, 0x42, 0x53, 0xcd, 0x44, 0xa1, - 0xcc, 0x91, 0x08, 0x84, 0x7f, 0x66, 0x2b, 0xed, 0xaa, 0x94, 0x54, 0x4c, 0x85, 0xba, 0x78, 0x12, - 0x08, 0xbf, 0x3d, 0x32, 0x6d, 0x47, 0x2f, 0x70, 0x0c, 0xe0, 0x6f, 0xc3, 0x8d, 0x60, 0x72, 0x8c, - 0x32, 0x73, 0x2c, 0x7a, 0xde, 0xbe, 0x78, 0x1e, 0x38, 0x42, 0x4a, 0xe1, 0xeb, 0x4a, 0x8a, 0xf9, - 0x0f, 0x9b, 0x83, 0xc8, 0x0c, 0xa3, 0xef, 0x99, 0xe0, 0xaf, 0xb8, 0x5c, 0x2b, 0x02, 0xe9, 0x5a, - 0x36, 0x96, 0x41, 0xf5, 0xa7, 0x40, 0xba, 0xd4, 0x2d, 0xcb, 0xbf, 0x0c, 0x5f, 0x4c, 0x21, 0x19, - 0x2a, 0x31, 0x1d, 0x6c, 0xdb, 0xae, 0xe9, 0xd8, 0x3f, 0x54, 0x65, 0x02, 0xb9, 0xe6, 0x18, 0x6a, - 0xa9, 0x89, 0xa3, 0xeb, 0x99, 0xf4, 0x4b, 0xd7, 0xfb, 0x30, 0x58, 0x56, 0xed, 0xae, 0xf4, 0x6d, - 0xca, 0xb8, 0x44, 0x90, 0x4d, 0xdc, 0xe7, 0x1e, 0xcb, 0xf2, 0xeb, 0xc0, 0x14, 0xa4, 0xe3, 0x9a, - 0xe3, 0x71, 0x6b, 0x3c, 0x76, 0x04, 0xcb, 0xd1, 0xd5, 0xd7, 0x18, 0xaa, 0xca, 0xfa, 0x59, 0xbe, - 0xf9, 0x3d, 0xb8, 0x45, 0x33, 0xf3, 0x54, 0xf8, 0x91, 0xa3, 0xad, 0xc7, 0x7a, 0x03, 0xd6, 0xd4, - 0xaf, 0x7d, 0x4f, 0xaa, 0xc7, 0x64, 0x7c, 0x72, 0x58, 0x51, 0x60, 0xb4, 0xbd, 0xba, 0x82, 0x2e, - 0xb4, 0x46, 0xb0, 0x08, 0x2f, 0xdb, 0xfc, 0x59, 0x11, 0x78, 0x2c, 0x10, 0x3d, 0x5b, 0xf8, 0x5b, - 0xa6, 0x34, 0x13, 0x91, 0xd2, 0xda, 0xa5, 0xb9, 0xfe, 0x17, 0x57, 0xea, 0xdd, 0x84, 0xa2, 0x1d, - 0xa0, 0x6b, 0xa8, 0xcb, 0x75, 0x75, 0x8b, 0xef, 0x02, 0x8c, 0x85, 0x6f, 0x7b, 0x16, 0x49, 0x50, - 0x61, 0xee, 0xbd, 0x8a, 0xd9, 0x4e, 0xad, 0x1f, 0x46, 0x34, 0x46, 0x82, 0x1e, 0xfb, 0xa1, 0x5a, - 0x2a, 0x73, 0x5e, 0xa4, 0x4e, 0x27, 0x41, 0xfc, 0x0d, 0xb8, 0x36, 0xf6, 0xed, 0xbe, 0x50, 0xcb, - 0xf1, 0x24, 0xb0, 0x36, 0xe9, 0x2b, 0x80, 0x25, 0xc2, 0x9c, 0xf7, 0x08, 0x25, 0xd0, 0x74, 0xc9, - 0x61, 0x0a, 0x28, 0x57, 0xac, 0xaf, 0x80, 0xab, 0x82, 0xd6, 0x9a, 0x31, 0xff, 0x21, 0xbf, 0x0f, - 0x4c, 0x3f, 0xd8, 0xb3, 0xdd, 0x5d, 0xe1, 0x0e, 0xe4, 0x90, 0x84, 0xbb, 0x66, 0xcc, 0xc0, 0x49, - 0x83, 0xa9, 0x6f, 0x2d, 0xa9, 0x3c, 0x52, 0xc5, 0x88, 0xda, 0xea, 0xb3, 0x02, 0x8e, 0xe7, 0x77, - 0xa5, 0xaf, 0x2b, 0x73, 0xa3, 0x36, 0xda, 0x50, 0x01, 0xf5, 0xf5, 0xd0, 0xf7, 0xac, 0x09, 0x65, - 0x39, 0x94, 0x12, 0x9b, 0x06, 0xc7, 0x98, 0x7b, 0xa6, 0xab, 0xcb, 0x25, 0x6b, 0x49, 0xcc, 0x08, - 0x4c, 0x3e, 0xa1, 0x17, 0xc4, 0x0c, 0x57, 0xb5, 0x4f, 0x98, 0x80, 0x69, 0x9c, 0x98, 0x15, 0x8b, - 0x70, 0x62, 0x3e, 0x34, 0x7e, 0xcb, 0xf7, 0x6c, 0x2b, 0xe6, 0xa5, 0x2a, 0x77, 0x66, 0xe0, 0x09, - 0xdc, 0x98, 0x27, 0x4f, 0xe1, 0x46, 0xf0, 0xe6, 0x8f, 0x33, 0x00, 0xf1, 0xe2, 0xa3, 0xc8, 0xc7, - 0xad, 0x78, 0x8b, 0xdf, 0x82, 0x6b, 0x49, 0xb0, 0xa3, 0x4b, 0x5e, 0x49, 0xee, 0xe3, 0x07, 0x5b, - 0xe6, 0x45, 0xc0, 0xb2, 0xfa, 0x12, 0xb6, 0x86, 0x3d, 0x13, 0x82, 0xea, 0x07, 0xaf, 0x03, 0x8b, - 0x81, 0x74, 0xb3, 0x2e, 0x60, 0xf9, 0x34, 0xea, 0xc7, 0xc2, 0xf4, 0x03, 0x56, 0x68, 0xee, 0x40, - 0x51, 0x25, 0xbb, 0xe6, 0xa4, 0xa9, 0x5f, 0xae, 0xe6, 0xe4, 0xaf, 0x67, 0x00, 0xb6, 0x54, 0x7d, - 0x34, 0x9e, 0xe2, 0x73, 0xb2, 0xff, 0xf3, 0x2c, 0x2a, 0xd3, 0xb2, 0xa8, 0xce, 0x3c, 0x17, 0x7d, - 0xc1, 0x07, 0x9b, 0x28, 0x39, 0x66, 0x58, 0x23, 0xa6, 0xf6, 0x5c, 0xd4, 0x56, 0x07, 0xc8, 0xa6, - 0xe7, 0xba, 0xa2, 0x8f, 0xc7, 0x4f, 0x74, 0x80, 0x44, 0xa0, 0xe6, 0x8f, 0xb2, 0x50, 0xd9, 0x1c, - 0x9a, 0x52, 0x7d, 0xf0, 0xe6, 0x3b, 0x50, 0x1e, 0x89, 0x20, 0x30, 0x07, 0x22, 0xd0, 0xc9, 0x9d, - 0xe9, 0xcc, 0x6c, 0x84, 0xbb, 0xfe, 0xc4, 0xf5, 0x85, 0x69, 0xa9, 0xaf, 0xfc, 0x44, 0x54, 0x8a, - 0x83, 0x2b, 0x23, 0xe7, 0xfb, 0x25, 0x38, 0xb8, 0xd1, 0x27, 0x79, 0xad, 0xe3, 0xf8, 0x1b, 0xd0, - 0x6a, 0xb4, 0x49, 0x50, 0x63, 0x0f, 0xaa, 0x09, 0x52, 0xfe, 0x0a, 0xd4, 0x3c, 0xc7, 0x12, 0x81, - 0xba, 0xe7, 0x17, 0x7f, 0x1a, 0x31, 0x05, 0xa4, 0x12, 0x0d, 0xdc, 0xb9, 0xc2, 0xd7, 0x79, 0xba, - 0xb0, 0xd9, 0xfc, 0x9f, 0x25, 0xa8, 0x62, 0xa7, 0xf6, 0xd4, 0x18, 0x66, 0x96, 0xa3, 0x0e, 0x25, - 0x4f, 0x73, 0xd6, 0x17, 0x04, 0xbd, 0x04, 0x4f, 0x5d, 0xf6, 0x91, 0x4b, 0x97, 0x7d, 0xdc, 0x86, - 0x8a, 0x4a, 0x2a, 0x59, 0x2d, 0xa5, 0x09, 0x73, 0x46, 0x0c, 0x40, 0x73, 0x65, 0xe4, 0x59, 0xa4, - 0x8f, 0x5b, 0x2a, 0x1f, 0x93, 0x33, 0x12, 0x90, 0xe4, 0xe7, 0x9a, 0xaa, 0xe9, 0xcf, 0x35, 0x51, - 0xfd, 0xcd, 0xd8, 0xb9, 0xe8, 0x79, 0xba, 0xb7, 0x1d, 0x2b, 0xbe, 0x67, 0x9d, 0x86, 0xf3, 0x4d, - 0x28, 0xe9, 0x65, 0xd1, 0x59, 0xa7, 0xaf, 0xcc, 0x59, 0x09, 0x8d, 0xbe, 0xae, 0xff, 0xea, 0xab, - 0x4e, 0x46, 0x48, 0xc9, 0x1f, 0x41, 0xd5, 0x94, 0xd2, 0xec, 0x0f, 0x47, 0x5a, 0x7f, 0xe6, 0xe6, - 0x24, 0xa0, 0x93, 0x8c, 0x5a, 0x11, 0xb6, 0x91, 0xa4, 0xe4, 0x1b, 0x50, 0xf1, 0x85, 0x99, 0xca, - 0x81, 0xbf, 0x72, 0x05, 0x1b, 0x23, 0xc4, 0x35, 0x62, 0xb2, 0xe8, 0x2b, 0xa1, 0x10, 0x7f, 0x25, - 0xb4, 0xf1, 0xd3, 0x0c, 0xac, 0xa4, 0x3b, 0xff, 0x67, 0xf1, 0xd5, 0xba, 0x6f, 0xc5, 0x5f, 0xad, - 0xfb, 0x0c, 0x5f, 0x80, 0xfb, 0xed, 0x0c, 0x40, 0x3c, 0x2f, 0x78, 0x46, 0xaa, 0xaf, 0x6b, 0x85, - 0x56, 0xbb, 0x6a, 0xf1, 0x9d, 0xd4, 0x27, 0x19, 0xde, 0x5e, 0x68, 0x92, 0x13, 0x3f, 0x13, 0xe5, - 0xeb, 0x0f, 0x60, 0x25, 0x0d, 0xa7, 0xb2, 0xff, 0xce, 0x6e, 0x5b, 0xc5, 0xa8, 0x3a, 0x7b, 0xad, - 0x47, 0x6d, 0x7d, 0xdd, 0xac, 0xb3, 0xff, 0x98, 0x65, 0x1b, 0x7f, 0x9c, 0x81, 0x4a, 0x34, 0xe5, - 0xfc, 0xbb, 0xc9, 0xb5, 0x52, 0x85, 0x2e, 0x6f, 0x2d, 0xb2, 0x56, 0xf1, 0xaf, 0xb6, 0x2b, 0xfd, - 0x8b, 0xc4, 0xd2, 0x35, 0x3c, 0x58, 0x49, 0x3f, 0x9c, 0xa3, 0x44, 0x1f, 0xa5, 0x95, 0xe8, 0x9b, - 0x0b, 0xbd, 0x32, 0x74, 0x55, 0x77, 0xed, 0x40, 0x6a, 0xfd, 0xfa, 0x7e, 0xf6, 0xbd, 0x4c, 0xe3, - 0x2e, 0x2c, 0x27, 0x1f, 0xcd, 0xde, 0x29, 0xbd, 0xff, 0xc7, 0x39, 0x58, 0x49, 0xd7, 0x8a, 0xd0, - 0x0d, 0x36, 0x55, 0xa7, 0x74, 0xe0, 0x58, 0x89, 0x8a, 0x7f, 0x86, 0x6e, 0xb2, 0x76, 0x86, 0x09, - 0xb0, 0x46, 0x51, 0x30, 0x6f, 0x24, 0xd8, 0xdd, 0xe4, 0x97, 0x39, 0xdf, 0xe0, 0x10, 0xde, 0x2d, - 0x64, 0x63, 0x5e, 0xd1, 0xdf, 0x28, 0xfb, 0x51, 0x96, 0xd7, 0x12, 0x75, 0xe7, 0x3f, 0x41, 0x4b, - 0x70, 0x75, 0x63, 0xe2, 0x5a, 0x8e, 0xb0, 0x22, 0xe8, 0x4f, 0x93, 0xd0, 0xa8, 0x70, 0xfc, 0x47, - 0x79, 0xbe, 0x02, 0x95, 0xee, 0xe4, 0x58, 0x17, 0x8d, 0xff, 0xa5, 0x3c, 0xbf, 0x09, 0x6b, 0x1a, - 0x2b, 0xae, 0xd1, 0x64, 0x7f, 0x19, 0xcf, 0xac, 0x95, 0x96, 0x9a, 0x2f, 0xdd, 0x51, 0xf6, 0x57, - 0xf2, 0xd8, 0x05, 0xba, 0xb2, 0xfe, 0x57, 0x89, 0x4f, 0x74, 0xc1, 0x87, 0xfd, 0x5a, 0x9e, 0xaf, - 0x02, 0x74, 0x7b, 0xd1, 0x8b, 0x7e, 0x23, 0xcf, 0xab, 0x50, 0xec, 0xf6, 0x88, 0xdb, 0x8f, 0xf3, - 0xfc, 0x06, 0xb0, 0xf8, 0xa9, 0xae, 0x5c, 0xfd, 0x1b, 0xaa, 0x33, 0x51, 0x29, 0xea, 0xdf, 0xcc, - 0xe3, 0xb8, 0xc2, 0x59, 0x66, 0x7f, 0x2b, 0xcf, 0x19, 0x54, 0x13, 0xb1, 0x55, 0xf6, 0xb7, 0xf3, - 0x9c, 0x43, 0x6d, 0xcf, 0x0e, 0x02, 0xdb, 0x1d, 0xe8, 0x11, 0xfc, 0x3a, 0xbd, 0x79, 0x3b, 0xba, - 0xa3, 0xc4, 0x7e, 0x33, 0xcf, 0x6f, 0x01, 0x4f, 0xe6, 0x93, 0xf4, 0x83, 0xbf, 0x43, 0xd4, 0xea, - 0x9c, 0x0c, 0x34, 0xec, 0xef, 0x12, 0x35, 0x4a, 0x82, 0x06, 0xfc, 0x16, 0x4d, 0xc8, 0x66, 0x5c, - 0xeb, 0xaa, 0xe1, 0x3f, 0x21, 0xe2, 0x70, 0x31, 0x15, 0xec, 0xa7, 0xf9, 0xfb, 0x3f, 0xa3, 0x7c, - 0x40, 0xb2, 0x64, 0x8c, 0x2f, 0x43, 0xd9, 0xf1, 0xdc, 0x81, 0x54, 0x5f, 0x44, 0xad, 0x41, 0x25, - 0x18, 0x7a, 0xbe, 0xa4, 0x26, 0x5d, 0xa2, 0x74, 0xe9, 0x3a, 0xbd, 0xba, 0x76, 0xa0, 0xbc, 0x3a, - 0x15, 0x5f, 0x95, 0xe6, 0x80, 0x55, 0xa3, 0x2a, 0xdd, 0x7c, 0x54, 0x49, 0x4c, 0xd7, 0xfa, 0xc3, - 0x6b, 0xd3, 0xac, 0x88, 0xa8, 0x13, 0xdf, 0x51, 0x15, 0xc5, 0x02, 0x2d, 0x7a, 0xf5, 0xe9, 0xc3, - 0xf1, 0x10, 0x1d, 0x87, 0x8a, 0x82, 0x7a, 0xdf, 0xb7, 0xd5, 0x85, 0x5c, 0x5d, 0xa0, 0x67, 0x61, - 0x3f, 0xa2, 0x1a, 0x14, 0x26, 0xee, 0xff, 0xbd, 0x0c, 0x2c, 0x87, 0x97, 0xd9, 0xed, 0x81, 0xed, - 0xaa, 0x9a, 0xe4, 0xf0, 0x3b, 0xb3, 0x7d, 0xc7, 0x1e, 0x87, 0xdf, 0x6d, 0x5c, 0x85, 0xaa, 0xe5, - 0x9b, 0x83, 0x96, 0x6b, 0x6d, 0xf9, 0xde, 0x58, 0x75, 0x5b, 0x65, 0x0c, 0x55, 0x2d, 0xf4, 0x73, - 0x71, 0x8c, 0xe8, 0x63, 0xe1, 0xb3, 0x3c, 0x15, 0xff, 0x0d, 0x4d, 0xdf, 0x76, 0x07, 0xed, 0x73, - 0x29, 0xdc, 0x40, 0xd5, 0x44, 0x57, 0xa1, 0x34, 0x09, 0x44, 0xdf, 0x0c, 0x04, 0x2b, 0x62, 0xe3, - 0x78, 0x62, 0x3b, 0xd2, 0x76, 0xd5, 0xe7, 0x12, 0xa3, 0xa2, 0xe7, 0x32, 0x8e, 0xcc, 0x1c, 0xdb, - 0xac, 0x72, 0xff, 0xf7, 0x33, 0x50, 0x25, 0xb1, 0x88, 0x63, 0xe2, 0xb1, 0x8d, 0x56, 0x85, 0xd2, - 0x6e, 0xf4, 0xdd, 0xbc, 0x22, 0x64, 0x0f, 0x4e, 0x55, 0x4c, 0x5c, 0x8b, 0x85, 0xba, 0x93, 0xaa, - 0x3e, 0xa1, 0x97, 0xe7, 0x9f, 0x83, 0x1b, 0x86, 0x18, 0x79, 0x52, 0x3c, 0x33, 0x6d, 0x99, 0xbc, - 0x7f, 0x54, 0x40, 0x77, 0x4e, 0x3d, 0x0a, 0x2f, 0x1c, 0x15, 0xc9, 0x9d, 0xc3, 0xd7, 0x86, 0x90, - 0x12, 0x8e, 0x9e, 0x20, 0xda, 0xbf, 0x2b, 0x47, 0x28, 0x1f, 0x79, 0xb6, 0x8b, 0x6f, 0xa3, 0x9b, - 0xd0, 0x04, 0xa1, 0xe4, 0x0a, 0x82, 0xe0, 0xfe, 0x3e, 0xdc, 0x9c, 0x9f, 0x12, 0x50, 0x77, 0xa4, - 0xe9, 0x63, 0xcd, 0x74, 0x23, 0xe5, 0x99, 0x6f, 0xab, 0xab, 0xae, 0x15, 0x28, 0x1c, 0x3c, 0x77, - 0x49, 0x2c, 0xd6, 0xa0, 0xb6, 0xef, 0x25, 0x68, 0x58, 0xee, 0x7e, 0x3f, 0x95, 0xc5, 0x89, 0x27, - 0x25, 0xec, 0xc4, 0x52, 0xe2, 0xb6, 0x55, 0x46, 0xe5, 0x07, 0xe8, 0xff, 0x6d, 0xa8, 0xef, 0x47, - 0xe8, 0xec, 0x89, 0xa5, 0xbe, 0x1f, 0x11, 0x75, 0x33, 0xaf, 0x3e, 0xa4, 0xe5, 0xf6, 0x85, 0x23, - 0x2c, 0x56, 0xb8, 0xff, 0x1e, 0xac, 0xea, 0xa1, 0xf6, 0x45, 0x10, 0x84, 0xb7, 0x95, 0x0e, 0x7d, - 0xfb, 0x4c, 0x7d, 0xa3, 0x62, 0x19, 0xca, 0x87, 0xc2, 0x0f, 0x3c, 0x97, 0xbe, 0xcf, 0x01, 0x50, - 0xec, 0x0e, 0x4d, 0x1f, 0xdf, 0x71, 0xff, 0x6b, 0x7a, 0x92, 0x9e, 0x9c, 0x87, 0x47, 0x03, 0xee, - 0x1f, 0xfd, 0x79, 0x1a, 0x53, 0x9a, 0x1a, 0x5d, 0xfa, 0xc2, 0x1c, 0xb1, 0xec, 0xfd, 0x4d, 0xa8, - 0xd0, 0x65, 0xa7, 0xc7, 0xb6, 0x6b, 0xe1, 0xc0, 0x37, 0x74, 0xe1, 0x3d, 0x7d, 0x37, 0xe9, 0x8c, - 0xa6, 0xa3, 0xac, 0xbe, 0x30, 0xcb, 0xb2, 0xfc, 0x26, 0xf0, 0xd6, 0x44, 0x7a, 0x23, 0x93, 0x2e, - 0xe9, 0x3a, 0x17, 0xea, 0x6b, 0xc4, 0xb9, 0xfb, 0xdf, 0x06, 0xae, 0x62, 0x6c, 0x96, 0x38, 0xb7, - 0xdd, 0x41, 0x74, 0xff, 0x1f, 0xe8, 0x63, 0x1e, 0x96, 0x38, 0x0f, 0x6f, 0xaa, 0x85, 0x8d, 0xf0, - 0x93, 0x22, 0xdb, 0xde, 0xc4, 0xc5, 0x4e, 0x3f, 0x85, 0xeb, 0x4a, 0xc4, 0x70, 0x14, 0x74, 0x03, - 0xf4, 0x52, 0xc7, 0x5f, 0xdd, 0x54, 0x93, 0x93, 0x20, 0xc2, 0x65, 0x19, 0xec, 0x58, 0xe4, 0x34, - 0xc7, 0xf0, 0xec, 0xfd, 0x26, 0x5c, 0x9b, 0x13, 0xb9, 0x20, 0xa5, 0xae, 0xfc, 0x37, 0xb6, 0x74, - 0xff, 0x43, 0x58, 0x53, 0x6a, 0x68, 0x5f, 0xdd, 0xd1, 0x0b, 0xa7, 0xed, 0x59, 0x67, 0xbb, 0xa3, - 0x66, 0x7a, 0xb3, 0xbd, 0xbb, 0xfb, 0x64, 0xb7, 0x65, 0xb0, 0x0c, 0xc9, 0xc3, 0x41, 0xef, 0x68, - 0xf3, 0x60, 0x7f, 0xbf, 0xbd, 0xd9, 0x6b, 0x6f, 0xb1, 0xec, 0xc6, 0xfd, 0x7f, 0xf3, 0xe9, 0x9d, - 0xcc, 0xcf, 0x3f, 0xbd, 0x93, 0xf9, 0xcf, 0x9f, 0xde, 0xc9, 0xfc, 0xf8, 0x17, 0x77, 0x96, 0x7e, - 0xfe, 0x8b, 0x3b, 0x4b, 0xff, 0xe1, 0x17, 0x77, 0x96, 0x3e, 0x61, 0xd3, 0xff, 0x32, 0xe7, 0xb8, - 0x48, 0x2e, 0xc3, 0x5b, 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, 0xd4, 0x42, 0x2e, 0x22, 0x4d, 0x67, - 0x00, 0x00, + // 9288 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x7d, 0x5b, 0x8c, 0x23, 0xc9, + 0x91, 0x58, 0xf3, 0x4d, 0x06, 0xfb, 0x91, 0x9d, 0xf3, 0xa2, 0xa8, 0xb9, 0xf1, 0x88, 0x5a, 0xed, + 0x8e, 0x46, 0xab, 0x9e, 0xdd, 0xd9, 0x5d, 0xed, 0x6a, 0xa5, 0x5d, 0x89, 0xcd, 0x66, 0x4f, 0x73, + 0xa7, 0x5f, 0x2a, 0x72, 0x66, 0xb4, 0x8b, 0x3b, 0xb7, 0xab, 0x59, 0xd9, 0x64, 0xa9, 0x8b, 0x55, + 0x54, 0x55, 0xb2, 0xa7, 0x5b, 0xf0, 0x19, 0xf2, 0xeb, 0xce, 0xf7, 0x27, 0x1b, 0x3e, 0xdb, 0x07, + 0xc3, 0x38, 0xe9, 0xc3, 0x80, 0xe1, 0x3b, 0xc3, 0x5f, 0x82, 0x7d, 0xb6, 0x0f, 0xb8, 0x33, 0x60, + 0xc0, 0x80, 0x7f, 0x64, 0x7f, 0xf9, 0xc3, 0x80, 0x8d, 0x15, 0xe0, 0x1f, 0xc3, 0x3e, 0x9c, 0x01, + 0x03, 0x82, 0xe1, 0x0f, 0x23, 0x22, 0xb3, 0x5e, 0x24, 0xbb, 0x87, 0xb3, 0x77, 0x67, 0xf8, 0xab, + 0x99, 0x51, 0x11, 0x91, 0xaf, 0xc8, 0xc8, 0x88, 0xc8, 0xc8, 0x6c, 0x78, 0x65, 0x7c, 0x3a, 0x78, + 0xe0, 0xd8, 0xc7, 0x0f, 0xc6, 0xc7, 0x0f, 0x46, 0x9e, 0x25, 0x9c, 0x07, 0x63, 0xdf, 0x93, 0x5e, + 0xa0, 0x0a, 0xc1, 0x06, 0x95, 0xf8, 0x8a, 0xe9, 0x5e, 0xc8, 0x8b, 0xb1, 0xd8, 0x20, 0x68, 0xfd, + 0xf6, 0xc0, 0xf3, 0x06, 0x8e, 0x50, 0xa8, 0xc7, 0x93, 0x93, 0x07, 0x81, 0xf4, 0x27, 0x7d, 0xa9, + 0x90, 0x1b, 0x3f, 0xcb, 0xc3, 0xcd, 0xee, 0xc8, 0xf4, 0xe5, 0xa6, 0xe3, 0xf5, 0x4f, 0xbb, 0xae, + 0x39, 0x0e, 0x86, 0x9e, 0xdc, 0x34, 0x03, 0xc1, 0x5f, 0x87, 0xe2, 0x31, 0x02, 0x83, 0x5a, 0xe6, + 0x6e, 0xee, 0x5e, 0xf5, 0xe1, 0xf5, 0x8d, 0x14, 0xe3, 0x0d, 0xa2, 0x30, 0x34, 0x0e, 0x7f, 0x13, + 0x4a, 0x96, 0x90, 0xa6, 0xed, 0x04, 0xb5, 0xec, 0xdd, 0xcc, 0xbd, 0xea, 0xc3, 0x5b, 0x1b, 0xaa, + 0xe2, 0x8d, 0xb0, 0xe2, 0x8d, 0x2e, 0x55, 0x6c, 0x84, 0x78, 0xfc, 0x5d, 0x28, 0x9f, 0xd8, 0x8e, + 0x78, 0x2c, 0x2e, 0x82, 0x5a, 0xee, 0x4a, 0x9a, 0xcd, 0x6c, 0x2d, 0x63, 0x44, 0xc8, 0xbc, 0x05, + 0xab, 0xe2, 0x5c, 0xfa, 0xa6, 0x21, 0x1c, 0x53, 0xda, 0x9e, 0x1b, 0xd4, 0xf2, 0xd4, 0xc2, 0x5b, + 0x53, 0x2d, 0x0c, 0xbf, 0x13, 0xf9, 0x14, 0x09, 0xbf, 0x0b, 0x55, 0xef, 0xf8, 0x7b, 0xa2, 0x2f, + 0x7b, 0x17, 0x63, 0x11, 0xd4, 0x0a, 0x77, 0x73, 0xf7, 0x2a, 0x46, 0x12, 0xc4, 0xbf, 0x0e, 0xd5, + 0xbe, 0xe7, 0x38, 0xa2, 0xaf, 0xea, 0x28, 0x5e, 0xdd, 0xad, 0x24, 0x2e, 0x7f, 0x1b, 0x6e, 0xf8, + 0x62, 0xe4, 0x9d, 0x09, 0xab, 0x15, 0x41, 0xa9, 0x9f, 0x65, 0xaa, 0x66, 0xfe, 0x47, 0xde, 0x84, + 0x15, 0x5f, 0xb7, 0x6f, 0xd7, 0x76, 0x4f, 0x83, 0x5a, 0x89, 0xba, 0xf5, 0xf9, 0x4b, 0xba, 0x85, + 0x38, 0x46, 0x9a, 0x82, 0x33, 0xc8, 0x9d, 0x8a, 0x8b, 0x5a, 0xe5, 0x6e, 0xe6, 0x5e, 0xc5, 0xc0, + 0x9f, 0xfc, 0x7d, 0xa8, 0x79, 0xbe, 0x3d, 0xb0, 0x5d, 0xd3, 0x69, 0xf9, 0xc2, 0x94, 0xc2, 0xea, + 0xd9, 0x23, 0x11, 0x48, 0x73, 0x34, 0xae, 0xc1, 0xdd, 0xcc, 0xbd, 0x9c, 0x71, 0xe9, 0x77, 0xfe, + 0x96, 0x9a, 0xa1, 0x8e, 0x7b, 0xe2, 0xd5, 0xaa, 0xba, 0xfb, 0xe9, 0xb6, 0x6c, 0xeb, 0xcf, 0x46, + 0x84, 0xd8, 0xf8, 0x45, 0x16, 0x8a, 0x5d, 0x61, 0xfa, 0xfd, 0x61, 0xfd, 0xd7, 0x33, 0x50, 0x34, + 0x44, 0x30, 0x71, 0x24, 0xaf, 0x43, 0x59, 0x8d, 0x6d, 0xc7, 0xaa, 0x65, 0xa8, 0x75, 0x51, 0xf9, + 0xb3, 0xc8, 0xce, 0x06, 0xe4, 0x47, 0x42, 0x9a, 0xb5, 0x1c, 0x8d, 0x50, 0x7d, 0xaa, 0x55, 0xaa, + 0xfa, 0x8d, 0x3d, 0x21, 0x4d, 0x83, 0xf0, 0xea, 0x3f, 0xcf, 0x40, 0x1e, 0x8b, 0xfc, 0x36, 0x54, + 0x86, 0xf6, 0x60, 0xe8, 0xd8, 0x83, 0xa1, 0xd4, 0x0d, 0x89, 0x01, 0xfc, 0x43, 0x58, 0x8b, 0x0a, + 0x86, 0xe9, 0x0e, 0x04, 0xb6, 0x68, 0x9e, 0xf0, 0xd3, 0x47, 0x63, 0x1a, 0x99, 0xd7, 0xa0, 0x44, + 0xeb, 0xa1, 0x63, 0x91, 0x44, 0x57, 0x8c, 0xb0, 0x88, 0xe2, 0x16, 0xce, 0xd4, 0x63, 0x71, 0x51, + 0xcb, 0xd3, 0xd7, 0x24, 0x88, 0x37, 0x61, 0x2d, 0x2c, 0x6e, 0xe9, 0xd1, 0x28, 0x5c, 0x3d, 0x1a, + 0xd3, 0xf8, 0x8d, 0x4f, 0x77, 0xa1, 0x40, 0xcb, 0x92, 0xaf, 0x42, 0xd6, 0x0e, 0x07, 0x3a, 0x6b, + 0x5b, 0xfc, 0x01, 0x14, 0x4f, 0x6c, 0xe1, 0x58, 0x2f, 0x1c, 0x61, 0x8d, 0xc6, 0xdb, 0xb0, 0xec, + 0x8b, 0x40, 0xfa, 0xb6, 0x96, 0x7e, 0xb5, 0x40, 0xbf, 0x30, 0x4f, 0x07, 0x6c, 0x18, 0x09, 0x44, + 0x23, 0x45, 0x86, 0xdd, 0xee, 0x0f, 0x6d, 0xc7, 0xf2, 0x85, 0xdb, 0xb1, 0xd4, 0x3a, 0xad, 0x18, + 0x49, 0x10, 0xbf, 0x07, 0x6b, 0xc7, 0x66, 0xff, 0x74, 0xe0, 0x7b, 0x13, 0x17, 0x17, 0x84, 0xe7, + 0x53, 0xb7, 0x2b, 0xc6, 0x34, 0x98, 0xbf, 0x01, 0x05, 0xd3, 0xb1, 0x07, 0x2e, 0xad, 0xc4, 0xd5, + 0x99, 0x49, 0x57, 0x6d, 0x69, 0x22, 0x86, 0xa1, 0x10, 0xf9, 0x0e, 0xac, 0x9c, 0x09, 0x5f, 0xda, + 0x7d, 0xd3, 0x21, 0x78, 0xad, 0x44, 0x94, 0x8d, 0xb9, 0x94, 0x4f, 0x93, 0x98, 0x46, 0x9a, 0x90, + 0x77, 0x00, 0x02, 0x54, 0x93, 0x34, 0x9d, 0x7a, 0x2d, 0xbc, 0x36, 0x97, 0x4d, 0xcb, 0x73, 0xa5, + 0x70, 0xe5, 0x46, 0x37, 0x42, 0xdf, 0x59, 0x32, 0x12, 0xc4, 0xfc, 0x5d, 0xc8, 0x4b, 0x71, 0x2e, + 0x6b, 0xab, 0x57, 0x8c, 0x68, 0xc8, 0xa4, 0x27, 0xce, 0xe5, 0xce, 0x92, 0x41, 0x04, 0x48, 0x88, + 0x8b, 0xac, 0xb6, 0xb6, 0x00, 0x21, 0xae, 0x4b, 0x24, 0x44, 0x02, 0xfe, 0x01, 0x14, 0x1d, 0xf3, + 0xc2, 0x9b, 0xc8, 0x1a, 0x23, 0xd2, 0x2f, 0x5e, 0x49, 0xba, 0x4b, 0xa8, 0x3b, 0x4b, 0x86, 0x26, + 0xe2, 0x6f, 0x43, 0xce, 0xb2, 0xcf, 0x6a, 0xeb, 0x44, 0x7b, 0xf7, 0x4a, 0xda, 0x2d, 0xfb, 0x6c, + 0x67, 0xc9, 0x40, 0x74, 0xde, 0x82, 0xf2, 0xb1, 0xe7, 0x9d, 0x8e, 0x4c, 0xff, 0xb4, 0xc6, 0x89, + 0xf4, 0x4b, 0x57, 0x92, 0x6e, 0x6a, 0xe4, 0x9d, 0x25, 0x23, 0x22, 0xc4, 0x2e, 0xdb, 0x7d, 0xcf, + 0xad, 0x5d, 0x5b, 0xa0, 0xcb, 0x9d, 0xbe, 0xe7, 0x62, 0x97, 0x91, 0x00, 0x09, 0x1d, 0xdb, 0x3d, + 0xad, 0x5d, 0x5f, 0x80, 0x10, 0x35, 0x27, 0x12, 0x22, 0x01, 0x36, 0xdb, 0x32, 0xa5, 0x79, 0x66, + 0x8b, 0xe7, 0xb5, 0x1b, 0x0b, 0x34, 0x7b, 0x4b, 0x23, 0x63, 0xb3, 0x43, 0x42, 0x64, 0x12, 0x2e, + 0xcd, 0xda, 0xcd, 0x05, 0x98, 0x84, 0x1a, 0x1d, 0x99, 0x84, 0x84, 0xfc, 0xcf, 0xc3, 0xfa, 0x89, + 0x30, 0xe5, 0xc4, 0x17, 0x56, 0xbc, 0xd1, 0xdd, 0x22, 0x6e, 0x1b, 0x57, 0xcf, 0xfd, 0x34, 0xd5, + 0xce, 0x92, 0x31, 0xcb, 0x8a, 0xbf, 0x0f, 0x05, 0xc7, 0x94, 0xe2, 0xbc, 0x56, 0x23, 0x9e, 0x8d, + 0x17, 0x08, 0x85, 0x14, 0xe7, 0x3b, 0x4b, 0x86, 0x22, 0xe1, 0xdf, 0x85, 0x35, 0x69, 0x1e, 0x3b, + 0xe2, 0xe0, 0x44, 0x23, 0x04, 0xb5, 0xcf, 0x11, 0x97, 0xd7, 0xaf, 0x16, 0xe7, 0x34, 0xcd, 0xce, + 0x92, 0x31, 0xcd, 0x06, 0x5b, 0x45, 0xa0, 0x5a, 0x7d, 0x81, 0x56, 0x11, 0x3f, 0x6c, 0x15, 0x91, + 0xf0, 0x5d, 0xa8, 0xd2, 0x8f, 0x96, 0xe7, 0x4c, 0x46, 0x6e, 0xed, 0xf3, 0xc4, 0xe1, 0xde, 0x8b, + 0x39, 0x28, 0xfc, 0x9d, 0x25, 0x23, 0x49, 0x8e, 0x93, 0x48, 0x45, 0xc3, 0x7b, 0x5e, 0xbb, 0xbd, + 0xc0, 0x24, 0xf6, 0x34, 0x32, 0x4e, 0x62, 0x48, 0x88, 0x4b, 0xef, 0xb9, 0x6d, 0x0d, 0x84, 0xac, + 0xfd, 0xd2, 0x02, 0x4b, 0xef, 0x19, 0xa1, 0xe2, 0xd2, 0x53, 0x44, 0x28, 0xc6, 0xfd, 0xa1, 0x29, + 0x6b, 0x77, 0x16, 0x10, 0xe3, 0xd6, 0xd0, 0x24, 0x5d, 0x81, 0x04, 0xf5, 0x1f, 0xc0, 0x72, 0x52, + 0x2b, 0x73, 0x0e, 0x79, 0x5f, 0x98, 0x6a, 0x47, 0x28, 0x1b, 0xf4, 0x1b, 0x61, 0xc2, 0xb2, 0x25, + 0xed, 0x08, 0x65, 0x83, 0x7e, 0xf3, 0x9b, 0x50, 0x54, 0xb6, 0x09, 0x29, 0xfc, 0xb2, 0xa1, 0x4b, + 0x88, 0x6b, 0xf9, 0xe6, 0x80, 0xf6, 0xad, 0xb2, 0x41, 0xbf, 0x11, 0xd7, 0xf2, 0xbd, 0xf1, 0x81, + 0x4b, 0x0a, 0xbb, 0x6c, 0xe8, 0x52, 0xfd, 0xdf, 0x7c, 0x00, 0x25, 0xdd, 0xa8, 0xfa, 0x3f, 0xc8, + 0x40, 0x51, 0x29, 0x14, 0xfe, 0x2d, 0x28, 0x04, 0xf2, 0xc2, 0x11, 0xd4, 0x86, 0xd5, 0x87, 0x5f, + 0x5e, 0x40, 0x09, 0x6d, 0x74, 0x91, 0xc0, 0x50, 0x74, 0x0d, 0x03, 0x0a, 0x54, 0xe6, 0x25, 0xc8, + 0x19, 0xde, 0x73, 0xb6, 0xc4, 0x01, 0x8a, 0x6a, 0xb2, 0x58, 0x06, 0x81, 0x5b, 0xf6, 0x19, 0xcb, + 0x22, 0x70, 0x47, 0x98, 0x96, 0xf0, 0x59, 0x8e, 0xaf, 0x40, 0x25, 0x9c, 0x96, 0x80, 0xe5, 0x39, + 0x83, 0xe5, 0xc4, 0x84, 0x07, 0xac, 0x50, 0xff, 0x9f, 0x79, 0xc8, 0xe3, 0xfa, 0xe7, 0xaf, 0xc0, + 0x8a, 0x34, 0xfd, 0x81, 0x50, 0x86, 0x70, 0x64, 0xa4, 0xa4, 0x81, 0xfc, 0x83, 0xb0, 0x0f, 0x59, + 0xea, 0xc3, 0x6b, 0x2f, 0xd4, 0x2b, 0xa9, 0x1e, 0x24, 0x76, 0xe1, 0xdc, 0x62, 0xbb, 0xf0, 0x36, + 0x94, 0x51, 0x9d, 0x75, 0xed, 0x1f, 0x08, 0x1a, 0xfa, 0xd5, 0x87, 0xf7, 0x5f, 0x5c, 0x65, 0x47, + 0x53, 0x18, 0x11, 0x2d, 0xef, 0x40, 0xa5, 0x6f, 0xfa, 0x16, 0x35, 0x86, 0x66, 0x6b, 0xf5, 0xe1, + 0x57, 0x5e, 0xcc, 0xa8, 0x15, 0x92, 0x18, 0x31, 0x35, 0x3f, 0x80, 0xaa, 0x25, 0x82, 0xbe, 0x6f, + 0x8f, 0x49, 0xbd, 0xa9, 0xbd, 0xf8, 0xab, 0x2f, 0x66, 0xb6, 0x15, 0x13, 0x19, 0x49, 0x0e, 0x68, + 0x91, 0xf9, 0x91, 0x7e, 0x2b, 0x91, 0x81, 0x10, 0x03, 0x1a, 0xef, 0x42, 0x39, 0xec, 0x0f, 0x5f, + 0x86, 0x32, 0xfe, 0xdd, 0xf7, 0x5c, 0xc1, 0x96, 0x70, 0x6e, 0xb1, 0xd4, 0x1d, 0x99, 0x8e, 0xc3, + 0x32, 0x7c, 0x15, 0x00, 0x8b, 0x7b, 0xc2, 0xb2, 0x27, 0x23, 0x96, 0x6d, 0x7c, 0x23, 0x94, 0x96, + 0x32, 0xe4, 0x0f, 0xcd, 0x01, 0x52, 0x2c, 0x43, 0x39, 0x54, 0xd7, 0x2c, 0x83, 0xf4, 0x5b, 0x66, + 0x30, 0x3c, 0xf6, 0x4c, 0xdf, 0x62, 0x59, 0x5e, 0x85, 0x52, 0xd3, 0xef, 0x0f, 0xed, 0x33, 0xc1, + 0x72, 0x8d, 0x07, 0x50, 0x4d, 0xb4, 0x17, 0x59, 0xe8, 0x4a, 0x2b, 0x50, 0x68, 0x5a, 0x96, 0xb0, + 0x58, 0x06, 0x09, 0x74, 0x07, 0x59, 0xb6, 0xf1, 0x15, 0xa8, 0x44, 0xa3, 0x85, 0xe8, 0xb8, 0x71, + 0xb3, 0x25, 0xfc, 0x85, 0x60, 0x96, 0x41, 0xa9, 0xec, 0xb8, 0x8e, 0xed, 0x0a, 0x96, 0xad, 0xff, + 0x05, 0x12, 0x55, 0xfe, 0xcd, 0xf4, 0x82, 0x78, 0xf5, 0x45, 0x3b, 0x6b, 0x7a, 0x35, 0x7c, 0x3e, + 0xd1, 0xbf, 0x5d, 0x9b, 0x1a, 0x57, 0x86, 0xfc, 0x96, 0x27, 0x03, 0x96, 0xa9, 0xff, 0xb7, 0x2c, + 0x94, 0xc3, 0x0d, 0x15, 0x7d, 0x82, 0x89, 0xef, 0x68, 0x81, 0xc6, 0x9f, 0xfc, 0x3a, 0x14, 0xa4, + 0x2d, 0xb5, 0x18, 0x57, 0x0c, 0x55, 0x40, 0x5b, 0x2d, 0x39, 0xb3, 0xca, 0x80, 0x9d, 0x9e, 0x2a, + 0x7b, 0x64, 0x0e, 0xc4, 0x8e, 0x19, 0x0c, 0xb5, 0x09, 0x1b, 0x03, 0x90, 0xfe, 0xc4, 0x3c, 0x43, + 0x99, 0xa3, 0xef, 0xca, 0x8a, 0x4b, 0x82, 0xf8, 0x5b, 0x90, 0xc7, 0x0e, 0x6a, 0xa1, 0xf9, 0x73, + 0x53, 0x1d, 0x46, 0x31, 0x39, 0xf4, 0x05, 0x4e, 0xcf, 0x06, 0x7a, 0x60, 0x06, 0x21, 0xf3, 0x57, + 0x61, 0x55, 0x2d, 0xc2, 0x83, 0xd0, 0x7f, 0x28, 0x11, 0xe7, 0x29, 0x28, 0x6f, 0xe2, 0x70, 0x9a, + 0x52, 0xd4, 0xca, 0x0b, 0xc8, 0x77, 0x38, 0x38, 0x1b, 0x5d, 0x24, 0x31, 0x14, 0x65, 0xe3, 0x1d, + 0x1c, 0x53, 0x53, 0x0a, 0x9c, 0xe6, 0xf6, 0x68, 0x2c, 0x2f, 0x94, 0xd0, 0x6c, 0x0b, 0xd9, 0x1f, + 0xda, 0xee, 0x80, 0x65, 0xd4, 0x10, 0xe3, 0x24, 0x12, 0x8a, 0xef, 0x7b, 0x3e, 0xcb, 0xd5, 0xeb, + 0x90, 0x47, 0x19, 0x45, 0x25, 0xe9, 0x9a, 0x23, 0xa1, 0x47, 0x9a, 0x7e, 0xd7, 0xaf, 0xc1, 0xfa, + 0xcc, 0x7e, 0x5c, 0xff, 0xbd, 0xa2, 0x92, 0x10, 0xa4, 0x20, 0x5b, 0x50, 0x53, 0x90, 0x99, 0xf7, + 0x52, 0x3a, 0x06, 0xb9, 0xa4, 0x75, 0xcc, 0x07, 0x50, 0xc0, 0x8e, 0x85, 0x2a, 0x66, 0x01, 0xf2, + 0x3d, 0x44, 0x37, 0x14, 0x15, 0x7a, 0x30, 0xfd, 0xa1, 0xe8, 0x9f, 0x0a, 0x4b, 0xeb, 0xfa, 0xb0, + 0x88, 0x42, 0xd3, 0x4f, 0x98, 0xe7, 0xaa, 0x40, 0x22, 0xd1, 0xf7, 0xdc, 0xf6, 0xc8, 0xfb, 0x9e, + 0x4d, 0xf3, 0x8a, 0x22, 0x11, 0x02, 0xc2, 0xaf, 0x1d, 0x94, 0x11, 0x3d, 0x6d, 0x31, 0xa0, 0xde, + 0x86, 0x02, 0xd5, 0x8d, 0x2b, 0x41, 0xb5, 0x59, 0x45, 0x1a, 0x5e, 0x5d, 0xac, 0xcd, 0xba, 0xc9, + 0xf5, 0xdf, 0xcd, 0x42, 0x1e, 0xcb, 0xfc, 0x3e, 0x14, 0x7c, 0xf4, 0xc3, 0x68, 0x38, 0x2f, 0xf3, + 0xd9, 0x14, 0x0a, 0xff, 0x96, 0x16, 0xc5, 0xec, 0x02, 0xc2, 0x12, 0xd5, 0x98, 0x14, 0xcb, 0xeb, + 0x50, 0x18, 0x9b, 0xbe, 0x39, 0xd2, 0xeb, 0x44, 0x15, 0x1a, 0x3f, 0xce, 0x40, 0x1e, 0x91, 0xf8, + 0x3a, 0xac, 0x74, 0xa5, 0x6f, 0x9f, 0x0a, 0x39, 0xf4, 0xbd, 0xc9, 0x60, 0xa8, 0x24, 0xe9, 0xb1, + 0xb8, 0x50, 0xfa, 0x46, 0x29, 0x04, 0x69, 0x3a, 0x76, 0x9f, 0x65, 0x51, 0xaa, 0x36, 0x3d, 0xc7, + 0x62, 0x39, 0xbe, 0x06, 0xd5, 0x27, 0xae, 0x25, 0xfc, 0xa0, 0xef, 0xf9, 0xc2, 0x62, 0x79, 0xbd, + 0xba, 0x4f, 0x59, 0x81, 0xf6, 0x32, 0x71, 0x2e, 0xc9, 0x17, 0x62, 0x45, 0x7e, 0x0d, 0xd6, 0x36, + 0xd3, 0x0e, 0x12, 0x2b, 0xa1, 0x4e, 0xda, 0x13, 0x2e, 0x0a, 0x19, 0x2b, 0x2b, 0x21, 0xf6, 0xbe, + 0x67, 0xb3, 0x0a, 0x56, 0xa6, 0xd6, 0x09, 0x83, 0xc6, 0xbf, 0xca, 0x84, 0x9a, 0x63, 0x05, 0x2a, + 0x87, 0xa6, 0x6f, 0x0e, 0x7c, 0x73, 0x8c, 0xed, 0xab, 0x42, 0x49, 0x6d, 0x9c, 0x6f, 0x2a, 0xed, + 0xa6, 0x0a, 0x0f, 0x95, 0x6e, 0x54, 0x85, 0xb7, 0x58, 0x2e, 0x2e, 0xbc, 0xcd, 0xf2, 0x58, 0xc7, + 0x77, 0x26, 0x9e, 0x14, 0xac, 0x40, 0xba, 0xce, 0xb3, 0x04, 0x2b, 0x22, 0xb0, 0x87, 0x1a, 0x85, + 0x95, 0xb0, 0xcf, 0x2d, 0x94, 0x9f, 0x63, 0xef, 0x9c, 0x95, 0xb1, 0x19, 0x38, 0x8c, 0xc2, 0x62, + 0x15, 0xfc, 0xb2, 0x3f, 0x19, 0x1d, 0x0b, 0xec, 0x26, 0xe0, 0x97, 0x9e, 0x37, 0x18, 0x38, 0x82, + 0x55, 0x71, 0x0c, 0x12, 0xca, 0x97, 0x2d, 0x93, 0xa6, 0x35, 0x1d, 0xc7, 0x9b, 0x48, 0xb6, 0x52, + 0xff, 0x45, 0x0e, 0xf2, 0xe8, 0xdd, 0xe0, 0xda, 0x19, 0xa2, 0x9e, 0xd1, 0x6b, 0x07, 0x7f, 0x47, + 0x2b, 0x30, 0x1b, 0xaf, 0x40, 0xfe, 0xbe, 0x9e, 0xe9, 0xdc, 0x02, 0x5a, 0x16, 0x19, 0x27, 0x27, + 0x99, 0x43, 0x7e, 0x64, 0x8f, 0x84, 0xd6, 0x75, 0xf4, 0x1b, 0x61, 0x01, 0xee, 0xc7, 0x05, 0x0a, + 0x9e, 0xd0, 0x6f, 0x5c, 0x35, 0x26, 0x6e, 0x0b, 0x4d, 0x49, 0x6b, 0x20, 0x67, 0x84, 0xc5, 0x39, + 0xda, 0xab, 0x32, 0x57, 0x7b, 0x7d, 0x10, 0x6a, 0xaf, 0xd2, 0x02, 0xab, 0x9e, 0x9a, 0x99, 0xd4, + 0x5c, 0xb1, 0xd2, 0x28, 0x2f, 0x4e, 0x9e, 0xd8, 0x4c, 0xb6, 0xb4, 0xd4, 0xc6, 0x1b, 0x5d, 0x59, + 0x8d, 0x32, 0xcb, 0xe0, 0x6c, 0xd2, 0x72, 0x55, 0x3a, 0xef, 0xa9, 0x6d, 0x09, 0x8f, 0xe5, 0x68, + 0x23, 0x9c, 0x58, 0xb6, 0xc7, 0xf2, 0x68, 0x79, 0x1d, 0x6e, 0x6d, 0xb3, 0x42, 0xe3, 0xd5, 0xc4, + 0x96, 0xd4, 0x9c, 0x48, 0x4f, 0xb1, 0x21, 0xf1, 0xcd, 0x28, 0x69, 0x3c, 0x16, 0x16, 0xcb, 0x36, + 0xbe, 0x36, 0x47, 0xcd, 0xae, 0x40, 0xe5, 0xc9, 0xd8, 0xf1, 0x4c, 0xeb, 0x0a, 0x3d, 0xbb, 0x0c, + 0x10, 0x7b, 0xd5, 0xf5, 0x5f, 0x34, 0xe2, 0xed, 0x1c, 0x6d, 0xd1, 0xc0, 0x9b, 0xf8, 0x7d, 0x41, + 0x2a, 0xa4, 0x62, 0xe8, 0x12, 0xff, 0x36, 0x14, 0xf0, 0x7b, 0x18, 0xc6, 0xb9, 0xbf, 0x90, 0x2f, + 0xb7, 0xf1, 0xd4, 0x16, 0xcf, 0x0d, 0x45, 0xc8, 0xef, 0x00, 0x98, 0x7d, 0x69, 0x9f, 0x09, 0x04, + 0xea, 0xc5, 0x9e, 0x80, 0xf0, 0x77, 0x92, 0xe6, 0xcb, 0xd5, 0x71, 0xc8, 0x84, 0x5d, 0xc3, 0x0d, + 0xa8, 0xe2, 0xd2, 0x1d, 0x1f, 0xf8, 0xb8, 0xda, 0x6b, 0xcb, 0x44, 0xf8, 0xc6, 0x62, 0xcd, 0x7b, + 0x14, 0x11, 0x1a, 0x49, 0x26, 0xfc, 0x09, 0x2c, 0xab, 0x98, 0x9a, 0x66, 0xba, 0x42, 0x4c, 0xdf, + 0x5c, 0x8c, 0xe9, 0x41, 0x4c, 0x69, 0xa4, 0xd8, 0xcc, 0x86, 0x25, 0x0b, 0x2f, 0x1d, 0x96, 0x7c, + 0x15, 0x56, 0x7b, 0xe9, 0x55, 0xa0, 0xb6, 0x8a, 0x29, 0x28, 0x6f, 0xc0, 0xb2, 0x1d, 0xc4, 0x51, + 0x51, 0x8a, 0x91, 0x94, 0x8d, 0x14, 0xac, 0xfe, 0xef, 0x8b, 0x90, 0xa7, 0x91, 0x9f, 0x8e, 0x71, + 0xb5, 0x52, 0x2a, 0xfd, 0xc1, 0xe2, 0x53, 0x3d, 0xb5, 0xe2, 0x49, 0x83, 0xe4, 0x12, 0x1a, 0xe4, + 0xdb, 0x50, 0x08, 0x3c, 0x5f, 0x86, 0xd3, 0xbb, 0xa0, 0x10, 0x75, 0x3d, 0x5f, 0x1a, 0x8a, 0x90, + 0x6f, 0x43, 0xe9, 0xc4, 0x76, 0x24, 0x4e, 0x8a, 0x1a, 0xbc, 0xd7, 0x17, 0xe3, 0xb1, 0x4d, 0x44, + 0x46, 0x48, 0xcc, 0x77, 0x93, 0xc2, 0x56, 0x24, 0x4e, 0x1b, 0x8b, 0x71, 0x9a, 0x27, 0x83, 0xf7, + 0x81, 0xf5, 0xbd, 0x33, 0xe1, 0x1b, 0x89, 0xc0, 0xa4, 0xda, 0xa4, 0x67, 0xe0, 0xbc, 0x0e, 0xe5, + 0xa1, 0x6d, 0x09, 0xb4, 0x73, 0x48, 0xc7, 0x94, 0x8d, 0xa8, 0xcc, 0x1f, 0x43, 0x99, 0xfc, 0x03, + 0xd4, 0x8a, 0x95, 0x97, 0x1e, 0x7c, 0xe5, 0xaa, 0x84, 0x0c, 0xb0, 0x22, 0xaa, 0x7c, 0xdb, 0x96, + 0x14, 0x9f, 0x2e, 0x1b, 0x51, 0x19, 0x1b, 0x4c, 0xf2, 0x9e, 0x6c, 0x70, 0x55, 0x35, 0x78, 0x1a, + 0xce, 0xdf, 0x86, 0x1b, 0x04, 0x9b, 0xda, 0x24, 0x71, 0xa9, 0x21, 0xd3, 0xf9, 0x1f, 0xd1, 0x60, + 0x19, 0x9b, 0x03, 0xb1, 0x6b, 0x8f, 0x6c, 0x59, 0x5b, 0xb9, 0x9b, 0xb9, 0x57, 0x30, 0x62, 0x00, + 0x7f, 0x1d, 0xd6, 0x2d, 0x71, 0x62, 0x4e, 0x1c, 0xd9, 0x13, 0xa3, 0xb1, 0x63, 0x4a, 0xd1, 0xb1, + 0x48, 0x46, 0x2b, 0xc6, 0xec, 0x07, 0xfe, 0x06, 0x5c, 0xd3, 0xc0, 0x83, 0xe8, 0x54, 0xa1, 0x63, + 0x51, 0xf8, 0xae, 0x62, 0xcc, 0xfb, 0xd4, 0xd8, 0xd3, 0x6a, 0x18, 0x37, 0x50, 0xf4, 0x53, 0x43, + 0x05, 0x1a, 0x48, 0xb5, 0x23, 0x3f, 0x32, 0x1d, 0x47, 0xf8, 0x17, 0xca, 0xc9, 0x7d, 0x6c, 0xba, + 0xc7, 0xa6, 0xcb, 0x72, 0xb4, 0xc7, 0x9a, 0x8e, 0x70, 0x2d, 0xd3, 0x57, 0x3b, 0xf2, 0x23, 0xda, + 0xd0, 0x0b, 0x8d, 0x7b, 0x90, 0xa7, 0x21, 0xad, 0x40, 0x41, 0x79, 0x49, 0xe4, 0x31, 0x6b, 0x0f, + 0x89, 0x34, 0xf2, 0x2e, 0x2e, 0x3f, 0x96, 0xad, 0xff, 0xc3, 0x22, 0x94, 0xc3, 0xc1, 0x0b, 0xcf, + 0x10, 0x32, 0xf1, 0x19, 0x02, 0x9a, 0x71, 0xc1, 0x53, 0x3b, 0xb0, 0x8f, 0xb5, 0x59, 0x5a, 0x36, + 0x62, 0x00, 0x5a, 0x42, 0xcf, 0x6d, 0x4b, 0x0e, 0x69, 0xcd, 0x14, 0x0c, 0x55, 0xe0, 0xf7, 0x60, + 0xcd, 0xc2, 0x71, 0x70, 0xfb, 0xce, 0xc4, 0x12, 0x3d, 0xdc, 0x45, 0x55, 0x98, 0x60, 0x1a, 0xcc, + 0x3f, 0x06, 0x90, 0xf6, 0x48, 0x6c, 0x7b, 0xfe, 0xc8, 0x94, 0xda, 0x37, 0xf8, 0xfa, 0xcb, 0x49, + 0xf5, 0x46, 0x2f, 0x62, 0x60, 0x24, 0x98, 0x21, 0x6b, 0xac, 0x4d, 0xb3, 0x2e, 0x7d, 0x26, 0xd6, + 0x5b, 0x11, 0x03, 0x23, 0xc1, 0x8c, 0xf7, 0xa0, 0x74, 0xe2, 0xf9, 0xa3, 0x89, 0x63, 0xea, 0x3d, + 0xf7, 0xfd, 0x97, 0xe4, 0xbb, 0xad, 0xa8, 0x49, 0xf7, 0x84, 0xac, 0xe2, 0x18, 0x77, 0x65, 0xc1, + 0x18, 0x77, 0xe3, 0x97, 0x01, 0xe2, 0x16, 0xf2, 0x9b, 0xc0, 0xf7, 0x3c, 0x57, 0x0e, 0x9b, 0xc7, + 0xc7, 0xfe, 0xa6, 0x38, 0xf1, 0x7c, 0xb1, 0x65, 0xe2, 0xf6, 0x7a, 0x03, 0xd6, 0x23, 0x78, 0xf3, + 0x44, 0x0a, 0x1f, 0xc1, 0x24, 0x02, 0xdd, 0xa1, 0xe7, 0x4b, 0x65, 0xe3, 0xd1, 0xcf, 0x27, 0x5d, + 0x96, 0xc3, 0x2d, 0xbd, 0xd3, 0x3d, 0x60, 0xf9, 0xc6, 0x3d, 0x80, 0x78, 0x68, 0xc9, 0x17, 0xa2, + 0x5f, 0x6f, 0x3e, 0xd4, 0x9e, 0x11, 0x95, 0x1e, 0xbe, 0xcd, 0x32, 0x8d, 0x4f, 0x33, 0x50, 0x4d, + 0x74, 0x29, 0xed, 0x33, 0xb7, 0xbc, 0x89, 0x2b, 0x95, 0x93, 0x4e, 0x3f, 0x9f, 0x9a, 0xce, 0x04, + 0x37, 0xf7, 0x75, 0x58, 0xa1, 0xf2, 0x96, 0x1d, 0x48, 0xdb, 0xed, 0x4b, 0x96, 0x8b, 0x50, 0x94, + 0x61, 0x90, 0x8f, 0x50, 0xf6, 0x3d, 0x0d, 0x2a, 0x70, 0x06, 0xcb, 0x87, 0xc2, 0xef, 0x8b, 0x10, + 0x89, 0x8c, 0x61, 0x0d, 0x89, 0xd0, 0x94, 0x31, 0x6c, 0xca, 0x61, 0x77, 0x32, 0x62, 0x65, 0x34, + 0x2a, 0xb1, 0xd0, 0x3c, 0x13, 0x3e, 0xda, 0x32, 0x15, 0xac, 0x07, 0x01, 0xb8, 0x1a, 0x4c, 0x97, + 0x41, 0x88, 0xbd, 0x67, 0xbb, 0xac, 0x1a, 0x15, 0xcc, 0x73, 0xb6, 0x8c, 0xed, 0x27, 0xd7, 0x81, + 0xad, 0xd4, 0xff, 0x6b, 0x0e, 0xf2, 0xa8, 0xd7, 0xd1, 0xd7, 0x4d, 0x2a, 0x21, 0xb5, 0x56, 0x92, + 0xa0, 0xcf, 0xb6, 0x1b, 0x21, 0xef, 0xe4, 0x6e, 0xf4, 0x1e, 0x54, 0xfb, 0x93, 0x40, 0x7a, 0x23, + 0xda, 0x8a, 0xf5, 0x69, 0xd7, 0xcd, 0x99, 0xa8, 0x11, 0x0d, 0xa7, 0x91, 0x44, 0xe5, 0xef, 0x40, + 0xf1, 0x44, 0x49, 0xbd, 0x8a, 0x1b, 0xfd, 0xd2, 0x25, 0xbb, 0xb5, 0x96, 0x6c, 0x8d, 0x8c, 0xfd, + 0xb2, 0x67, 0x56, 0x6c, 0x12, 0xa4, 0x77, 0xdd, 0x62, 0xb4, 0xeb, 0xfe, 0x32, 0xac, 0x0a, 0x1c, + 0xf0, 0x43, 0xc7, 0xec, 0x8b, 0x91, 0x70, 0xc3, 0x65, 0xf6, 0xf6, 0x4b, 0xf4, 0x98, 0x66, 0x8c, + 0xba, 0x3d, 0xc5, 0x0b, 0x35, 0x8f, 0xeb, 0xe1, 0xe6, 0x1f, 0x3a, 0xf6, 0x65, 0x23, 0x06, 0x34, + 0xbe, 0xa4, 0xf5, 0x65, 0x09, 0x72, 0xcd, 0xa0, 0xaf, 0x23, 0x20, 0x22, 0xe8, 0x2b, 0xf7, 0xaa, + 0x45, 0xc3, 0xc1, 0xb2, 0x8d, 0x37, 0xa1, 0x12, 0xd5, 0x80, 0xc2, 0xb3, 0xef, 0xc9, 0xee, 0x58, + 0xf4, 0xed, 0x13, 0x5b, 0x58, 0x4a, 0x3e, 0xbb, 0xd2, 0xf4, 0xa5, 0x0a, 0x22, 0xb6, 0x5d, 0x8b, + 0x65, 0xeb, 0xbf, 0x53, 0x86, 0xa2, 0xda, 0x7c, 0x75, 0x87, 0x2b, 0x51, 0x87, 0xbf, 0x03, 0x65, + 0x6f, 0x2c, 0x7c, 0x53, 0x7a, 0xbe, 0x8e, 0xdc, 0xbc, 0xf3, 0x32, 0x9b, 0xf9, 0xc6, 0x81, 0x26, + 0x36, 0x22, 0x36, 0xd3, 0xd2, 0x94, 0x9d, 0x95, 0xa6, 0xfb, 0xc0, 0xc2, 0x7d, 0xfb, 0xd0, 0x47, + 0x3a, 0x79, 0xa1, 0xfd, 0xf0, 0x19, 0x38, 0xef, 0x41, 0xa5, 0xef, 0xb9, 0x96, 0x1d, 0x45, 0x71, + 0x56, 0x1f, 0x7e, 0xed, 0xa5, 0x5a, 0xd8, 0x0a, 0xa9, 0x8d, 0x98, 0x11, 0x7f, 0x1d, 0x0a, 0x67, + 0x28, 0x66, 0x24, 0x4f, 0x97, 0x0b, 0xa1, 0x42, 0xe2, 0x9f, 0x40, 0xf5, 0xfb, 0x13, 0xbb, 0x7f, + 0x7a, 0x90, 0x8c, 0x12, 0xbe, 0xf7, 0x52, 0xad, 0xf8, 0x4e, 0x4c, 0x6f, 0x24, 0x99, 0x25, 0x44, + 0xbb, 0xf4, 0x27, 0x10, 0xed, 0xf2, 0xac, 0x68, 0x1b, 0xb0, 0xe2, 0x8a, 0x40, 0x0a, 0x6b, 0x5b, + 0xdb, 0x6a, 0xf0, 0x19, 0x6c, 0xb5, 0x34, 0x8b, 0xc6, 0x17, 0xa1, 0x1c, 0x4e, 0x38, 0x2f, 0x42, + 0x76, 0x1f, 0x9d, 0xa2, 0x22, 0x64, 0x0f, 0x7c, 0x25, 0x6d, 0x4d, 0x94, 0xb6, 0xc6, 0x1f, 0x65, + 0xa0, 0x12, 0x0d, 0x7a, 0x5a, 0x73, 0xb6, 0xbf, 0x3f, 0x31, 0x1d, 0x96, 0x21, 0x77, 0xd9, 0x93, + 0xaa, 0x44, 0xca, 0xfa, 0x11, 0x1d, 0xd6, 0xfb, 0x2c, 0x47, 0x26, 0x82, 0x08, 0x02, 0x96, 0xe7, + 0x1c, 0x56, 0x35, 0xf8, 0xc0, 0x57, 0xa8, 0x05, 0x54, 0x7c, 0xf8, 0x35, 0x04, 0x14, 0x95, 0x45, + 0x71, 0x2a, 0x94, 0x82, 0xdc, 0xf7, 0x24, 0x15, 0xca, 0xd8, 0xa8, 0x8e, 0xcb, 0x2a, 0x58, 0xe7, + 0xbe, 0x27, 0x3b, 0xa8, 0x12, 0x23, 0xf7, 0xac, 0x1a, 0x56, 0x4f, 0x25, 0xd2, 0x88, 0x4d, 0xc7, + 0xe9, 0xb8, 0x6c, 0x45, 0x7f, 0x50, 0xa5, 0x55, 0xe4, 0xd8, 0x3e, 0x37, 0xfb, 0x48, 0xbe, 0x86, + 0x1a, 0x16, 0x69, 0x74, 0x99, 0xe1, 0x92, 0x6c, 0x9f, 0xdb, 0x81, 0x0c, 0xd8, 0x7a, 0xe3, 0xdf, + 0x65, 0xa0, 0x9a, 0x98, 0x60, 0x74, 0xff, 0x08, 0x11, 0xb7, 0x32, 0xe5, 0x0d, 0x7e, 0x8c, 0xc3, + 0xe8, 0x5b, 0xe1, 0x36, 0xd5, 0xf3, 0xf0, 0x67, 0x16, 0xeb, 0xeb, 0x79, 0x23, 0xcf, 0xf7, 0xbd, + 0xe7, 0xca, 0xf4, 0xd9, 0x35, 0x03, 0xf9, 0x4c, 0x88, 0x53, 0x96, 0xc7, 0xae, 0xb6, 0x26, 0xbe, + 0x2f, 0x5c, 0x05, 0x28, 0x50, 0xe3, 0xc4, 0xb9, 0x2a, 0x15, 0x91, 0x29, 0x22, 0xd3, 0x3e, 0xc8, + 0x4a, 0xa8, 0x08, 0x34, 0xb6, 0x82, 0x94, 0x11, 0x01, 0xd1, 0x55, 0xb1, 0x82, 0x9b, 0x8a, 0x8a, + 0x50, 0x1c, 0x9c, 0x6c, 0x99, 0x17, 0x41, 0x73, 0xe0, 0x31, 0x98, 0x06, 0xee, 0x7b, 0xcf, 0x59, + 0xb5, 0x3e, 0x01, 0x88, 0x7d, 0x32, 0xf4, 0x45, 0x51, 0x20, 0xa2, 0x33, 0x04, 0x5d, 0xe2, 0x07, + 0x00, 0xf8, 0x8b, 0x30, 0x43, 0x87, 0xf4, 0x25, 0x0c, 0x65, 0xa2, 0x33, 0x12, 0x2c, 0xea, 0xbf, + 0x0a, 0x95, 0xe8, 0x03, 0xaf, 0x41, 0x89, 0x4c, 0xda, 0xa8, 0xda, 0xb0, 0x88, 0xf6, 0x99, 0xed, + 0x5a, 0xe2, 0x9c, 0xf4, 0x4a, 0xc1, 0x50, 0x05, 0x6c, 0xe5, 0xd0, 0xb6, 0x2c, 0xe1, 0x86, 0x27, + 0x3d, 0xaa, 0x34, 0xef, 0x3c, 0x3e, 0x3f, 0xf7, 0x3c, 0xbe, 0xfe, 0x2b, 0x50, 0x4d, 0x38, 0x8d, + 0x97, 0x76, 0x3b, 0xd1, 0xb0, 0x6c, 0xba, 0x61, 0xb7, 0xa1, 0x12, 0xe6, 0x80, 0x04, 0xb4, 0xb7, + 0x55, 0x8c, 0x18, 0x50, 0xff, 0x67, 0x59, 0xb4, 0x64, 0xb1, 0x6b, 0xd3, 0x8e, 0xde, 0x36, 0x14, + 0x03, 0x69, 0xca, 0x49, 0x98, 0xcc, 0xb0, 0xe0, 0x02, 0xed, 0x12, 0xcd, 0xce, 0x92, 0xa1, 0xa9, + 0xf9, 0x07, 0x90, 0x93, 0xe6, 0x40, 0x07, 0x4a, 0xbf, 0xbc, 0x18, 0x93, 0x9e, 0x39, 0xd8, 0x59, + 0x32, 0x90, 0x8e, 0xef, 0x42, 0xb9, 0xaf, 0x63, 0x5b, 0x5a, 0x29, 0x2e, 0xe8, 0x8b, 0x85, 0x11, + 0xb1, 0x9d, 0x25, 0x23, 0xe2, 0xc0, 0xbf, 0x0d, 0x79, 0xb4, 0x2e, 0x75, 0xce, 0xc7, 0x82, 0x3e, + 0x26, 0x2e, 0x97, 0x9d, 0x25, 0x83, 0x28, 0x37, 0x4b, 0x50, 0x20, 0x1d, 0x5c, 0xaf, 0x41, 0x51, + 0xf5, 0x75, 0x7a, 0xe4, 0xea, 0xb7, 0x20, 0xd7, 0x33, 0x07, 0x68, 0xe1, 0xdb, 0x56, 0xa0, 0x43, + 0x25, 0xf8, 0xb3, 0xfe, 0x4a, 0x1c, 0xa7, 0x4b, 0x86, 0x80, 0x33, 0xa9, 0x10, 0x70, 0xbd, 0x08, + 0x79, 0xac, 0xb1, 0x7e, 0xfb, 0x2a, 0x6f, 0xa1, 0xfe, 0x8f, 0x73, 0xe8, 0x58, 0x48, 0x71, 0x3e, + 0x37, 0xbc, 0xfd, 0x11, 0x54, 0xc6, 0xbe, 0xd7, 0x17, 0x41, 0xe0, 0xf9, 0xda, 0x38, 0x7a, 0xfd, + 0xc5, 0x47, 0xcf, 0x1b, 0x87, 0x21, 0x8d, 0x11, 0x93, 0x37, 0xfe, 0x20, 0x0b, 0x95, 0xe8, 0x83, + 0xf2, 0x67, 0xa4, 0x38, 0x57, 0xa1, 0xcc, 0x3d, 0xe1, 0x8f, 0x4c, 0xdb, 0x52, 0xda, 0xa3, 0x35, + 0x34, 0x43, 0x23, 0xf7, 0x63, 0x6f, 0x22, 0x27, 0xc7, 0x42, 0x85, 0xb0, 0x9e, 0xda, 0x23, 0xe1, + 0xb1, 0x3c, 0x1d, 0x1e, 0xa1, 0x60, 0xf7, 0x1d, 0x6f, 0x62, 0xb1, 0x02, 0x96, 0x1f, 0xd1, 0xf6, + 0xb6, 0x67, 0x8e, 0x03, 0xa5, 0x33, 0xf7, 0x6c, 0xdf, 0x63, 0x25, 0x24, 0xda, 0xb6, 0x07, 0x23, + 0x93, 0x95, 0x91, 0x59, 0xef, 0xb9, 0x2d, 0x51, 0x09, 0x57, 0xd0, 0x4c, 0x3d, 0x18, 0x0b, 0xb7, + 0x2b, 0x7d, 0x21, 0xe4, 0x9e, 0x39, 0x56, 0x31, 0x4d, 0x43, 0x58, 0x96, 0x2d, 0x95, 0xfe, 0xdc, + 0x36, 0xfb, 0xe2, 0xd8, 0xf3, 0x4e, 0xd9, 0x32, 0x2a, 0x9a, 0x8e, 0x1b, 0x48, 0x73, 0xe0, 0x9b, + 0x23, 0xa5, 0x43, 0x7b, 0xc2, 0x11, 0x54, 0x5a, 0xa5, 0xba, 0x6d, 0x39, 0x9c, 0x1c, 0x3f, 0x42, + 0xbf, 0x6f, 0x4d, 0x9d, 0x33, 0x59, 0x62, 0x2c, 0x50, 0x87, 0x2e, 0x43, 0x79, 0xd3, 0x76, 0xec, + 0x63, 0xdb, 0xb1, 0xd9, 0x3a, 0xa2, 0xb6, 0xcf, 0xfb, 0xa6, 0x63, 0x5b, 0xbe, 0xf9, 0x9c, 0x71, + 0x6c, 0xdc, 0x63, 0xdf, 0x3b, 0xb5, 0xd9, 0x35, 0x44, 0x24, 0x37, 0xf0, 0xcc, 0xfe, 0x01, 0xbb, + 0x4e, 0x67, 0x65, 0xa7, 0x42, 0xf6, 0x87, 0x27, 0xe6, 0x31, 0xbb, 0x11, 0x87, 0xf4, 0x6e, 0xd6, + 0xd7, 0x61, 0x6d, 0xea, 0x54, 0xbe, 0x5e, 0xd2, 0xde, 0x67, 0x7d, 0x05, 0xaa, 0x89, 0xe3, 0xd2, + 0xfa, 0xab, 0x50, 0x0e, 0x0f, 0x53, 0xd1, 0x4b, 0xb7, 0x03, 0x15, 0x06, 0xd6, 0x42, 0x12, 0x95, + 0xeb, 0xbf, 0x9f, 0x81, 0xa2, 0x3a, 0xc9, 0xe6, 0x9b, 0x51, 0xe6, 0x49, 0x66, 0x81, 0xd3, 0x4b, + 0x45, 0xa4, 0xcf, 0x7e, 0xa3, 0xf4, 0x93, 0xeb, 0x50, 0x70, 0xc8, 0x1d, 0xd7, 0xea, 0x8b, 0x0a, + 0x09, 0x6d, 0x93, 0x4b, 0x6a, 0x9b, 0x46, 0x33, 0x3a, 0x6f, 0x0e, 0x43, 0x8f, 0x64, 0x15, 0xf6, + 0x7c, 0x21, 0x54, 0x58, 0x91, 0xbc, 0xe9, 0x2c, 0xed, 0x15, 0xde, 0x68, 0x6c, 0xf6, 0x25, 0x01, + 0x68, 0x17, 0x45, 0x65, 0xca, 0xf2, 0x28, 0xe5, 0xad, 0xa1, 0x29, 0x1b, 0x27, 0x50, 0x3e, 0xf4, + 0x82, 0xe9, 0x3d, 0xb9, 0x04, 0xb9, 0x9e, 0x37, 0x56, 0x16, 0xe6, 0xa6, 0x27, 0xc9, 0xc2, 0x54, + 0x5b, 0xf0, 0x89, 0x54, 0x42, 0x65, 0xd8, 0x83, 0xa1, 0x54, 0x9e, 0x78, 0xc7, 0x75, 0x85, 0xcf, + 0x0a, 0x38, 0x87, 0x86, 0x18, 0xa3, 0x55, 0xcb, 0x8a, 0x38, 0x6b, 0x04, 0xdf, 0xb6, 0xfd, 0x40, + 0xb2, 0x52, 0xa3, 0x83, 0xbb, 0xa9, 0x3d, 0xa0, 0x4d, 0x90, 0x7e, 0x10, 0xab, 0x25, 0x6c, 0x22, + 0x15, 0x5b, 0xc2, 0x45, 0x19, 0x23, 0xef, 0x49, 0xb9, 0x7e, 0x54, 0x41, 0x16, 0x77, 0x30, 0x2a, + 0x7f, 0x34, 0x09, 0xa4, 0x7d, 0x72, 0xc1, 0x72, 0x8d, 0x67, 0xb0, 0x92, 0x4a, 0x63, 0xe2, 0xd7, + 0x81, 0xa5, 0x00, 0xd8, 0xf4, 0x25, 0x7e, 0x0b, 0xae, 0xa5, 0xa0, 0x7b, 0xb6, 0x65, 0x51, 0xac, + 0x77, 0xfa, 0x43, 0xd8, 0xc1, 0xcd, 0x0a, 0x94, 0xfa, 0x6a, 0x96, 0x1a, 0x87, 0xb0, 0x42, 0xd3, + 0xb6, 0x27, 0xa4, 0x79, 0xe0, 0x3a, 0x17, 0x7f, 0xe2, 0x5c, 0xb3, 0xc6, 0x57, 0xb4, 0x83, 0x85, + 0xfa, 0xe2, 0xc4, 0xf7, 0x46, 0xc4, 0xab, 0x60, 0xd0, 0x6f, 0xe4, 0x2e, 0x3d, 0x3d, 0xf7, 0x59, + 0xe9, 0x35, 0x7e, 0x51, 0x81, 0x52, 0xb3, 0xdf, 0x47, 0x97, 0x70, 0xa6, 0xe6, 0x77, 0xa0, 0xd8, + 0xf7, 0xdc, 0x13, 0x7b, 0xa0, 0xf5, 0xf1, 0xb4, 0x65, 0xa8, 0xe9, 0x50, 0xe0, 0x4e, 0xec, 0x81, + 0xa1, 0x91, 0x91, 0x4c, 0xef, 0x27, 0x85, 0x2b, 0xc9, 0x94, 0x52, 0x8d, 0xb6, 0x8f, 0x07, 0x90, + 0xb7, 0xdd, 0x13, 0x4f, 0x27, 0x86, 0x7e, 0xfe, 0x12, 0x22, 0xca, 0x8e, 0x24, 0xc4, 0xfa, 0x7f, + 0xce, 0x40, 0x51, 0x55, 0xcd, 0x5f, 0x85, 0x55, 0xe1, 0xe2, 0x62, 0x0a, 0x55, 0xb9, 0x5e, 0x45, + 0x53, 0x50, 0x34, 0x5a, 0x35, 0x44, 0x1c, 0x4f, 0x06, 0x3a, 0xf6, 0x92, 0x04, 0xf1, 0xf7, 0xe0, + 0x96, 0x2a, 0x1e, 0xfa, 0xc2, 0x17, 0x8e, 0x30, 0x03, 0xd1, 0x1a, 0x9a, 0xae, 0x2b, 0x1c, 0xbd, + 0xb1, 0x5f, 0xf6, 0x99, 0x37, 0x60, 0x59, 0x7d, 0xea, 0x8e, 0xcd, 0xbe, 0x08, 0xf4, 0x79, 0x5f, + 0x0a, 0xc6, 0xbf, 0x0a, 0x05, 0xca, 0x9b, 0xad, 0x59, 0x57, 0x4f, 0xa5, 0xc2, 0xaa, 0x7b, 0xd1, + 0xce, 0xd3, 0x04, 0x50, 0xc3, 0x84, 0x4e, 0x97, 0x5e, 0xfd, 0x5f, 0xb8, 0x72, 0x5c, 0xc9, 0xff, + 0x4b, 0x10, 0x61, 0xfb, 0x2c, 0xe1, 0x08, 0x4a, 0x70, 0xc4, 0x9d, 0x31, 0x4b, 0x27, 0x2b, 0x29, + 0x58, 0xfd, 0x3f, 0xe5, 0x21, 0x8f, 0x23, 0x8c, 0xc8, 0x43, 0x6f, 0x24, 0xa2, 0xf8, 0xb2, 0x32, + 0x35, 0x52, 0x30, 0x34, 0x6d, 0x4c, 0x75, 0xc4, 0x1f, 0xa1, 0x29, 0xe5, 0x31, 0x0d, 0x46, 0xcc, + 0xb1, 0xef, 0x9d, 0xd8, 0x4e, 0x8c, 0xa9, 0x8d, 0xa0, 0x29, 0x30, 0xff, 0x1a, 0xdc, 0x1c, 0x99, + 0xfe, 0xa9, 0x90, 0xb4, 0xba, 0x9f, 0x79, 0xfe, 0x69, 0x80, 0x23, 0xd7, 0xb1, 0x74, 0x60, 0xf2, + 0x92, 0xaf, 0xfc, 0x75, 0x58, 0x7f, 0x1e, 0x16, 0xa3, 0x3a, 0x54, 0x68, 0x70, 0xf6, 0x03, 0xaa, + 0x5b, 0x4b, 0x9c, 0xd9, 0xc4, 0xb7, 0xac, 0xb2, 0x67, 0xc3, 0x32, 0x8a, 0x92, 0xa9, 0x06, 0xb2, + 0xab, 0x6b, 0xd6, 0x27, 0x4c, 0x69, 0x28, 0x5a, 0x5b, 0x2a, 0xab, 0x28, 0xe8, 0x58, 0x14, 0x59, + 0xad, 0x18, 0x31, 0x00, 0x05, 0x8d, 0xaa, 0x7c, 0xaa, 0x94, 0xea, 0x8a, 0x72, 0x41, 0x13, 0x20, + 0xc4, 0x90, 0xa2, 0x3f, 0x0c, 0x2b, 0x51, 0x61, 0xcf, 0x24, 0x88, 0xdf, 0x01, 0x18, 0x98, 0x52, + 0x3c, 0x37, 0x2f, 0x9e, 0xf8, 0x4e, 0x4d, 0xa8, 0xa3, 0x92, 0x18, 0x82, 0x4e, 0xac, 0xe3, 0xf5, + 0x4d, 0xa7, 0x2b, 0x3d, 0xdf, 0x1c, 0x88, 0x43, 0x53, 0x0e, 0x6b, 0x03, 0xe5, 0xc4, 0x4e, 0xc3, + 0xb1, 0xc7, 0xd2, 0x1e, 0x89, 0x4f, 0x3c, 0x57, 0xd4, 0x86, 0xaa, 0xc7, 0x61, 0x19, 0x5b, 0x62, + 0xba, 0xa6, 0x73, 0x21, 0xed, 0x3e, 0xf6, 0xc5, 0x56, 0x2d, 0x49, 0x80, 0x28, 0x6c, 0x20, 0x24, + 0x8e, 0x63, 0xc7, 0xaa, 0x7d, 0x4f, 0xf5, 0x35, 0x02, 0xe0, 0xec, 0x0a, 0x39, 0x14, 0xbe, 0x98, + 0x8c, 0x9a, 0x96, 0xe5, 0x8b, 0x20, 0xa8, 0x9d, 0xaa, 0xd9, 0x9d, 0x02, 0xd7, 0xbf, 0x41, 0x07, + 0x59, 0xc3, 0xc6, 0x5b, 0xb0, 0xb2, 0x8b, 0x2d, 0x6c, 0x8e, 0xed, 0x6e, 0xdf, 0x1b, 0x0b, 0x54, + 0xe8, 0x14, 0x12, 0xa6, 0x00, 0x42, 0x15, 0x4a, 0x1f, 0x05, 0x9e, 0xdb, 0x3c, 0xec, 0xa8, 0x2d, + 0x66, 0x7b, 0xe2, 0x38, 0x2c, 0xdb, 0x38, 0x00, 0x88, 0x25, 0x1b, 0xb7, 0x8b, 0x26, 0x9d, 0x1a, + 0xb1, 0x25, 0x15, 0xae, 0x72, 0x2d, 0xdb, 0x1d, 0x6c, 0x69, 0x61, 0x66, 0x19, 0x04, 0x52, 0x18, + 0x42, 0x58, 0x11, 0x90, 0x0c, 0x16, 0x2a, 0x09, 0x8b, 0xe5, 0x1a, 0xff, 0x27, 0x03, 0xd5, 0x44, + 0x92, 0xc4, 0x9f, 0x62, 0x62, 0x07, 0x6e, 0xe7, 0x68, 0x10, 0xe0, 0xbc, 0x29, 0x41, 0x8f, 0xca, + 0x38, 0xab, 0x3a, 0x87, 0x03, 0xbf, 0xaa, 0xa0, 0x43, 0x02, 0xf2, 0x99, 0x92, 0x3a, 0x1a, 0x0f, + 0x75, 0xe4, 0xa6, 0x0a, 0xa5, 0x27, 0xee, 0xa9, 0xeb, 0x3d, 0x77, 0xd5, 0x3e, 0x4d, 0x99, 0x3a, + 0xa9, 0x33, 0xc7, 0x30, 0x99, 0x26, 0xd7, 0xf8, 0x97, 0xf9, 0xa9, 0xa4, 0xb6, 0x36, 0x14, 0x95, + 0xbb, 0x40, 0x96, 0xec, 0x6c, 0x16, 0x52, 0x12, 0x59, 0x9f, 0x6f, 0x25, 0x40, 0x86, 0x26, 0x46, + 0x3b, 0x3e, 0x4a, 0xf9, 0xcc, 0xce, 0x3d, 0x87, 0x4b, 0x31, 0x0a, 0x75, 0x73, 0x2a, 0xeb, 0x39, + 0xe2, 0x50, 0xff, 0xeb, 0x19, 0xb8, 0x3e, 0x0f, 0x25, 0x99, 0x1b, 0x9e, 0x49, 0xe7, 0x86, 0x77, + 0xa7, 0x72, 0xad, 0xb3, 0xd4, 0x9b, 0x07, 0x2f, 0xd9, 0x88, 0x74, 0xe6, 0x75, 0xe3, 0xf7, 0x32, + 0xb0, 0x3e, 0xd3, 0xe7, 0x84, 0x1d, 0x03, 0x50, 0x54, 0x92, 0xa5, 0x52, 0xa1, 0xa2, 0xe4, 0x14, + 0x75, 0xb8, 0x40, 0x3b, 0x7c, 0xa0, 0x4e, 0xfb, 0x75, 0x76, 0xb9, 0x32, 0x93, 0x71, 0xd6, 0x70, + 0x03, 0x19, 0x08, 0x15, 0x88, 0x55, 0xc6, 0x96, 0x86, 0x14, 0x95, 0x29, 0xab, 0x4e, 0x40, 0x58, + 0x89, 0x52, 0xac, 0x26, 0x63, 0xc7, 0xee, 0x63, 0xb1, 0xcc, 0xeb, 0x70, 0x53, 0x5d, 0x31, 0xd0, + 0x6e, 0xe3, 0x49, 0x6f, 0x68, 0xd3, 0xe2, 0x60, 0x15, 0xac, 0xe7, 0x70, 0x72, 0xec, 0xd8, 0xc1, + 0x90, 0x41, 0xc3, 0x80, 0x6b, 0x73, 0x3a, 0x48, 0x4d, 0x7e, 0xaa, 0x9b, 0xbf, 0x0a, 0xb0, 0xf5, + 0x34, 0x6c, 0x34, 0xcb, 0x70, 0x0e, 0xab, 0x5b, 0x4f, 0x93, 0xdc, 0xf5, 0xe2, 0x79, 0x8a, 0xda, + 0x2b, 0x60, 0xb9, 0xc6, 0xaf, 0x65, 0xc2, 0x1c, 0x88, 0xfa, 0x5f, 0x84, 0x15, 0xd5, 0xe0, 0x43, + 0xf3, 0xc2, 0xf1, 0x4c, 0x8b, 0xb7, 0x61, 0x35, 0x88, 0x2e, 0xc1, 0x24, 0x36, 0xac, 0x69, 0x43, + 0xa0, 0x9b, 0x42, 0x32, 0xa6, 0x88, 0x42, 0x57, 0x28, 0x1b, 0x1f, 0x9c, 0x70, 0x72, 0xea, 0x4c, + 0x5a, 0x72, 0xcb, 0xe4, 0xa6, 0x99, 0x8d, 0xaf, 0xc2, 0x7a, 0x37, 0x56, 0xee, 0xca, 0x66, 0x46, + 0xe1, 0x50, 0x3b, 0xc3, 0x56, 0x28, 0x1c, 0xba, 0xd8, 0xf8, 0x27, 0x25, 0x80, 0xf8, 0x90, 0x68, + 0xce, 0x9a, 0x9f, 0x97, 0xf3, 0x30, 0x73, 0x64, 0x9b, 0x7b, 0xe9, 0x23, 0xdb, 0xf7, 0x22, 0xd3, + 0x5d, 0x05, 0x90, 0xa7, 0x13, 0xbf, 0xe3, 0x36, 0x4d, 0x1b, 0xec, 0xa9, 0x94, 0xa0, 0xc2, 0x74, + 0x4a, 0xd0, 0xdd, 0xd9, 0xfc, 0xc1, 0x29, 0x65, 0x14, 0x47, 0x26, 0x4a, 0xa9, 0xc8, 0x44, 0x1d, + 0xca, 0xbe, 0x30, 0x2d, 0xcf, 0x75, 0x2e, 0xc2, 0x93, 0xc1, 0xb0, 0xcc, 0xdf, 0x82, 0x82, 0xa4, + 0x7b, 0x3c, 0x65, 0x5a, 0x3b, 0x2f, 0x98, 0x38, 0x85, 0x8b, 0x9a, 0xcd, 0x0e, 0x74, 0xd2, 0x9f, + 0xda, 0x35, 0xcb, 0x46, 0x02, 0xc2, 0x37, 0x80, 0xdb, 0xe8, 0xa6, 0x39, 0x8e, 0xb0, 0x36, 0x2f, + 0xb6, 0xd4, 0x81, 0x1d, 0xed, 0xeb, 0x65, 0x63, 0xce, 0x97, 0x70, 0xfe, 0x97, 0xe3, 0xf9, 0xa7, + 0x26, 0x9f, 0xd9, 0x01, 0xf6, 0x74, 0x85, 0xcc, 0x97, 0xa8, 0x8c, 0x96, 0x43, 0xb8, 0x60, 0xd5, + 0x58, 0x92, 0xf4, 0xc6, 0xa7, 0xde, 0x97, 0x7c, 0x0d, 0x87, 0x57, 0x85, 0x66, 0xd6, 0x88, 0x69, + 0x0c, 0x20, 0x4d, 0xde, 0xf7, 0xdc, 0x7d, 0x94, 0x08, 0xa6, 0x35, 0xb9, 0x2e, 0x63, 0x7f, 0xc7, + 0xce, 0xc4, 0x37, 0x1d, 0xfa, 0xba, 0xae, 0x34, 0x79, 0x0c, 0x69, 0xfc, 0xeb, 0x6c, 0xe4, 0x3c, + 0x55, 0xa0, 0x70, 0x6c, 0x06, 0x76, 0x5f, 0xed, 0x6e, 0xda, 0xe8, 0x51, 0xbb, 0x9b, 0xf4, 0x2c, + 0x8f, 0x65, 0xd1, 0x0f, 0x0a, 0x84, 0x3e, 0xb0, 0x89, 0x6f, 0x4d, 0xb1, 0x3c, 0xaa, 0x80, 0x50, + 0x92, 0x54, 0x56, 0x10, 0x91, 0x52, 0xf8, 0xcd, 0x8a, 0xf2, 0x2d, 0xc9, 0x91, 0xa6, 0x2d, 0x86, + 0x95, 0x11, 0xc7, 0xf5, 0xa4, 0x50, 0xc1, 0x47, 0x92, 0x7b, 0x06, 0xc8, 0x26, 0xbc, 0x06, 0xc0, + 0xaa, 0xe8, 0x98, 0x84, 0x4c, 0x55, 0xc4, 0x30, 0x20, 0xb7, 0x6d, 0x19, 0xd7, 0x7d, 0xfa, 0x03, + 0x5b, 0xc1, 0x16, 0xc5, 0x97, 0xb1, 0xd8, 0x2a, 0x72, 0x35, 0x29, 0x57, 0x65, 0x0d, 0x7f, 0x9e, + 0x51, 0x06, 0x0b, 0xc3, 0x5a, 0x2d, 0xd4, 0x4b, 0xeb, 0xd8, 0xb2, 0xc8, 0xd0, 0x61, 0x1c, 0xfd, + 0xae, 0xb1, 0x89, 0x4e, 0x90, 0x3d, 0x36, 0x5d, 0xc9, 0xae, 0x61, 0x57, 0xc7, 0xd6, 0x09, 0xbb, + 0x8e, 0x24, 0xfd, 0xa1, 0x29, 0xd9, 0x0d, 0xc4, 0xc1, 0x5f, 0x5b, 0xc2, 0x47, 0x49, 0x61, 0x37, + 0x11, 0x47, 0x9a, 0x03, 0x76, 0xab, 0xf1, 0x9b, 0x71, 0xc6, 0xf3, 0x1b, 0x91, 0x7b, 0xb2, 0xc8, + 0xf2, 0x41, 0x07, 0x66, 0xde, 0x5a, 0x6e, 0xc3, 0xba, 0x2f, 0xbe, 0x3f, 0xb1, 0x53, 0xf7, 0x00, + 0x72, 0x57, 0x27, 0x9a, 0xcc, 0x52, 0x34, 0xce, 0x60, 0x3d, 0x2c, 0x3c, 0xb3, 0xe5, 0x90, 0x22, + 0x45, 0xfc, 0xad, 0xc4, 0x45, 0x85, 0xcc, 0xdc, 0x0b, 0x5e, 0x11, 0xcb, 0xf8, 0x62, 0x42, 0x74, + 0x12, 0x90, 0x5d, 0xe0, 0x24, 0xa0, 0xf1, 0xbf, 0x93, 0x47, 0xcb, 0xca, 0x61, 0xb3, 0x22, 0x87, + 0x6d, 0xf6, 0xa8, 0x39, 0x0e, 0xee, 0x67, 0x5f, 0x26, 0xb8, 0x3f, 0x2f, 0x6d, 0xe3, 0x7d, 0xf4, + 0x1f, 0x68, 0x65, 0x3e, 0x5d, 0xe0, 0xe0, 0x22, 0x85, 0xcb, 0x37, 0xe9, 0xe0, 0xd8, 0xec, 0xaa, + 0x9c, 0xa2, 0xc2, 0xdc, 0x6b, 0x43, 0xc9, 0x13, 0x62, 0x8d, 0x69, 0x24, 0xa8, 0x12, 0x7a, 0xac, + 0x38, 0x4f, 0x8f, 0xa1, 0xef, 0xac, 0x35, 0x5c, 0x54, 0x56, 0xe7, 0x3c, 0xea, 0x77, 0xc8, 0x9e, + 0xd6, 0x78, 0xd9, 0x98, 0x81, 0xa3, 0xb1, 0x37, 0x9a, 0x38, 0xd2, 0xd6, 0x47, 0x19, 0xaa, 0x30, + 0x7d, 0xaf, 0xb1, 0x32, 0x7b, 0xaf, 0xf1, 0x43, 0x80, 0x40, 0xe0, 0xea, 0xd8, 0xb2, 0xfb, 0x52, + 0x67, 0x1e, 0xdd, 0xb9, 0xac, 0x6f, 0xfa, 0x00, 0x26, 0x41, 0x81, 0xed, 0x1f, 0x99, 0xe7, 0x74, + 0x28, 0xab, 0x53, 0x24, 0xa2, 0xf2, 0xb4, 0x76, 0x5f, 0x9d, 0xd5, 0xee, 0x6f, 0x41, 0x21, 0x40, + 0x13, 0x9a, 0xae, 0xe6, 0x5c, 0x3e, 0xbf, 0x1b, 0x64, 0x67, 0x1b, 0x0a, 0x97, 0x42, 0x92, 0xa8, + 0xff, 0x3c, 0x9f, 0x2e, 0xe5, 0x54, 0x8c, 0xb0, 0x98, 0xd2, 0xb0, 0x37, 0xd3, 0x1a, 0xb6, 0x6e, + 0x41, 0x51, 0x1f, 0x2f, 0x4c, 0x07, 0x0a, 0xc2, 0xc0, 0x64, 0x36, 0x11, 0x98, 0x8c, 0xf2, 0x5b, + 0x73, 0xc9, 0xfc, 0xd6, 0xa9, 0x7b, 0x7b, 0x85, 0x99, 0x7b, 0x7b, 0x8d, 0x4f, 0xa0, 0xa0, 0x7c, + 0x02, 0x08, 0xcd, 0x51, 0x65, 0xca, 0x62, 0xa7, 0x58, 0x86, 0x5f, 0x07, 0x16, 0x08, 0xb2, 0x75, + 0x44, 0xd7, 0x1c, 0x09, 0x52, 0x92, 0x59, 0x5e, 0x83, 0xeb, 0x0a, 0x37, 0x48, 0x7f, 0x21, 0x83, + 0xcb, 0xb1, 0x8f, 0x7d, 0xd3, 0xbf, 0x60, 0xf9, 0xc6, 0x87, 0x74, 0xb8, 0x1f, 0x0a, 0x54, 0x35, + 0xba, 0x27, 0xa9, 0xd4, 0xb2, 0xa5, 0xb5, 0x0f, 0xe5, 0x86, 0x68, 0x6f, 0x4f, 0x65, 0xcc, 0x91, + 0x3b, 0x45, 0xf1, 0xa0, 0xe5, 0xe4, 0x1e, 0xff, 0xa7, 0xb6, 0xde, 0x1a, 0x9b, 0x09, 0x8b, 0x31, + 0x9d, 0x02, 0x97, 0x59, 0x34, 0x05, 0xae, 0xf1, 0x18, 0xd6, 0x8c, 0xb4, 0x4e, 0xe7, 0xef, 0x41, + 0xc9, 0x1b, 0x27, 0xf9, 0xbc, 0x48, 0x2e, 0x43, 0xf4, 0xc6, 0x4f, 0x33, 0xb0, 0xdc, 0x71, 0xa5, + 0xf0, 0x5d, 0xd3, 0xd9, 0x76, 0xcc, 0x01, 0x7f, 0x37, 0xd4, 0x52, 0xf3, 0x63, 0x0f, 0x49, 0xdc, + 0xb4, 0xc2, 0x72, 0x74, 0x18, 0x9d, 0xdf, 0x80, 0x75, 0x61, 0xd9, 0xd2, 0xf3, 0x95, 0x9d, 0x1c, + 0x66, 0x2a, 0x5e, 0x07, 0xa6, 0xc0, 0x5d, 0x5a, 0x12, 0x3d, 0x35, 0xcd, 0x35, 0xb8, 0x9e, 0x82, + 0x86, 0x46, 0x70, 0x96, 0xdf, 0x86, 0x5a, 0xbc, 0x1b, 0x6d, 0x79, 0xae, 0xec, 0xb8, 0x96, 0x38, + 0x27, 0x23, 0x8b, 0xe5, 0x1a, 0xbf, 0x11, 0x99, 0x77, 0x4f, 0x75, 0x1e, 0xa3, 0xef, 0x79, 0xf1, + 0x25, 0x59, 0x5d, 0x4a, 0x5c, 0xc6, 0xce, 0x2e, 0x70, 0x19, 0xfb, 0xc3, 0xf8, 0x42, 0xad, 0xda, + 0x28, 0x5e, 0x99, 0xbb, 0xfb, 0x50, 0xfa, 0x95, 0xb6, 0xee, 0xbb, 0x22, 0x71, 0xbb, 0xf6, 0x4d, + 0xed, 0xd2, 0xe5, 0x17, 0xb1, 0x82, 0x55, 0xa6, 0xc2, 0x3b, 0xd3, 0xb7, 0x38, 0x16, 0x4b, 0x83, + 0x9c, 0x31, 0x54, 0xe1, 0xa5, 0x0d, 0xd5, 0x6f, 0x4d, 0x79, 0x4f, 0xe5, 0xb9, 0xe1, 0xb8, 0x2b, + 0xee, 0xa8, 0x7e, 0x0b, 0x4a, 0x43, 0x3b, 0x90, 0x9e, 0xaf, 0xee, 0x4d, 0xcf, 0xde, 0xf3, 0x4a, + 0x8c, 0xd6, 0x8e, 0x42, 0xa4, 0x9c, 0xb5, 0x90, 0x8a, 0x7f, 0x17, 0xd6, 0x69, 0xe0, 0x0f, 0x63, + 0xab, 0x21, 0xa8, 0x55, 0xe7, 0xe6, 0x0a, 0x26, 0x58, 0x6d, 0x4e, 0x91, 0x18, 0xb3, 0x4c, 0xea, + 0x03, 0x80, 0x78, 0x7e, 0x66, 0xb4, 0xd8, 0x67, 0xb8, 0x37, 0x7d, 0x13, 0x8a, 0xc1, 0xe4, 0x38, + 0x3e, 0x6f, 0xd3, 0xa5, 0xfa, 0x39, 0xd4, 0x67, 0xac, 0x83, 0x43, 0xe1, 0xab, 0xe6, 0x5e, 0x79, + 0x79, 0xfb, 0xc3, 0xe4, 0xc4, 0x2b, 0xe1, 0xbc, 0x7b, 0xc9, 0xec, 0x45, 0x9c, 0x13, 0x12, 0x50, + 0x7f, 0x07, 0xaa, 0x89, 0x41, 0x45, 0xcd, 0x3c, 0x71, 0x2d, 0x2f, 0x0c, 0x01, 0xe3, 0x6f, 0x75, + 0x79, 0xcd, 0x0a, 0x83, 0xc0, 0xf4, 0xbb, 0x6e, 0x00, 0x9b, 0x1e, 0xc0, 0x2b, 0x3c, 0xec, 0x57, + 0x60, 0x25, 0x61, 0xd2, 0x45, 0xe1, 0xc1, 0x34, 0xb0, 0x71, 0x06, 0x9f, 0x4f, 0xb0, 0x3b, 0x14, + 0xfe, 0xc8, 0x0e, 0x70, 0x23, 0x51, 0xce, 0x22, 0x99, 0xd6, 0x96, 0x70, 0xa5, 0x2d, 0x43, 0x0d, + 0x1a, 0x95, 0xf9, 0x37, 0xa0, 0x30, 0x16, 0xfe, 0x28, 0xd0, 0x5a, 0x74, 0x5a, 0x82, 0xe6, 0xb2, + 0x0d, 0x0c, 0x45, 0xd3, 0xf8, 0x47, 0x19, 0x28, 0xef, 0x09, 0x69, 0xa2, 0xed, 0xc0, 0xf7, 0xa6, + 0x6a, 0x99, 0x3d, 0x23, 0x0e, 0x51, 0x37, 0xb4, 0xfb, 0xba, 0xd1, 0xd1, 0xf8, 0xba, 0xbc, 0xb3, + 0x14, 0x37, 0xac, 0xbe, 0x09, 0x25, 0x0d, 0xae, 0xbf, 0x0b, 0x6b, 0x53, 0x98, 0x34, 0x2e, 0xca, + 0xb6, 0xef, 0x5e, 0x8c, 0xc2, 0x44, 0xa6, 0x65, 0x23, 0x0d, 0xdc, 0xac, 0x40, 0x69, 0xac, 0x08, + 0x1a, 0x7f, 0x70, 0x8b, 0xd2, 0x67, 0xec, 0x13, 0xf4, 0xe9, 0xe7, 0xed, 0xac, 0x77, 0x00, 0x68, + 0x6b, 0x56, 0x49, 0x16, 0x2a, 0x64, 0x9b, 0x80, 0xf0, 0xf7, 0xa3, 0x58, 0x7b, 0x7e, 0xae, 0x51, + 0x95, 0x64, 0x3e, 0x1d, 0x70, 0xaf, 0x41, 0xc9, 0x0e, 0x28, 0x0e, 0xa7, 0x13, 0x93, 0xc2, 0xa2, + 0xfa, 0xd2, 0xf3, 0xcc, 0x40, 0xea, 0xa0, 0x77, 0x58, 0xe4, 0xdf, 0x84, 0xa2, 0x3d, 0x1a, 0x7b, + 0xbe, 0xd4, 0x61, 0xfa, 0x2b, 0xeb, 0xeb, 0x10, 0xe6, 0xce, 0x92, 0xa1, 0x69, 0x90, 0x5a, 0x9c, + 0x13, 0x75, 0xf9, 0xc5, 0xd4, 0xed, 0xf3, 0x90, 0x5a, 0xd1, 0xf0, 0xef, 0xc0, 0xca, 0x40, 0x65, + 0x6c, 0x2a, 0xc6, 0x5a, 0xbd, 0x7c, 0xf9, 0x2a, 0x26, 0x8f, 0x92, 0x04, 0x3b, 0x4b, 0x46, 0x9a, + 0x03, 0xb2, 0x44, 0xd3, 0x5e, 0x04, 0xb2, 0xe7, 0x7d, 0xe4, 0xd9, 0x2e, 0x39, 0xc2, 0x2f, 0x60, + 0x69, 0x24, 0x09, 0x90, 0x65, 0x8a, 0x03, 0xff, 0x1a, 0xda, 0x42, 0x81, 0xd4, 0x97, 0xda, 0xef, + 0x5e, 0xc5, 0xa9, 0x27, 0x02, 0x7d, 0x1d, 0x3d, 0x90, 0xfc, 0x1c, 0xea, 0x89, 0xe5, 0xa3, 0x2b, + 0x69, 0x8e, 0xc7, 0xbe, 0x87, 0xde, 0xf4, 0x0a, 0x71, 0xfb, 0xda, 0x55, 0xdc, 0x0e, 0x2f, 0xa5, + 0xde, 0x59, 0x32, 0xae, 0xe0, 0xcd, 0x7b, 0xe8, 0xf3, 0xe9, 0x2e, 0xec, 0x0a, 0xf3, 0x2c, 0xbc, + 0x12, 0x7f, 0x7f, 0xa1, 0x51, 0x20, 0x8a, 0x9d, 0x25, 0x63, 0x8a, 0x07, 0xff, 0x15, 0x58, 0x4f, + 0xd5, 0x49, 0xb7, 0x60, 0xd5, 0x85, 0xf9, 0xaf, 0x2e, 0xdc, 0x0d, 0x24, 0xda, 0x59, 0x32, 0x66, + 0x39, 0xf1, 0x09, 0x7c, 0x6e, 0xb6, 0x4b, 0x5b, 0xa2, 0xef, 0xd8, 0xae, 0xd0, 0x77, 0xeb, 0xdf, + 0x79, 0xb9, 0xd1, 0xd2, 0xc4, 0x3b, 0x4b, 0xc6, 0xe5, 0x9c, 0xf9, 0x5f, 0x82, 0xdb, 0xe3, 0xb9, + 0xca, 0x47, 0x29, 0x35, 0x7d, 0x35, 0xff, 0xbd, 0x05, 0x6b, 0x9e, 0xa1, 0xdf, 0x59, 0x32, 0xae, + 0xe4, 0xcf, 0xfb, 0x70, 0xcd, 0x9c, 0x48, 0x0f, 0x2d, 0x05, 0x75, 0xbc, 0x4b, 0xd7, 0x27, 0xf5, + 0x85, 0xfe, 0x07, 0x57, 0x55, 0xdb, 0x9c, 0x25, 0xdb, 0x59, 0x32, 0xe6, 0x71, 0x43, 0xd3, 0x9d, + 0x1c, 0x78, 0x9d, 0xbd, 0xae, 0x0a, 0xfc, 0x36, 0x54, 0xcc, 0xbe, 0xb3, 0x23, 0x4c, 0x2b, 0x3a, + 0xae, 0x88, 0x01, 0xf5, 0xff, 0x9e, 0x81, 0xa2, 0x5e, 0x54, 0xb7, 0xa3, 0x94, 0x84, 0x68, 0xe7, + 0x88, 0x01, 0xfc, 0x03, 0xa8, 0x08, 0xdf, 0xf7, 0xfc, 0x96, 0x67, 0x85, 0xd9, 0x9c, 0xd3, 0x41, + 0x6e, 0xc5, 0x67, 0xa3, 0x1d, 0xa2, 0x19, 0x31, 0x05, 0x7f, 0x1f, 0x40, 0x29, 0x93, 0x5e, 0x7c, + 0x09, 0xa9, 0x3e, 0x9f, 0x5e, 0x9d, 0x80, 0xc5, 0xd8, 0x71, 0x54, 0x30, 0x3c, 0x7e, 0x0a, 0x8b, + 0x91, 0xbf, 0x5b, 0x48, 0xf8, 0xbb, 0xb7, 0x75, 0x18, 0x83, 0xa2, 0x3b, 0xfa, 0x2a, 0x5e, 0x04, + 0xa8, 0xff, 0x61, 0x06, 0x8a, 0x4a, 0x43, 0xf1, 0xf6, 0x6c, 0x8f, 0x5e, 0x7b, 0xb1, 0x62, 0xdb, + 0x98, 0xee, 0xd9, 0x37, 0x01, 0x94, 0xa2, 0x4b, 0xf4, 0xec, 0xf6, 0x14, 0x1f, 0x4d, 0x1a, 0xe6, + 0x4f, 0xc7, 0xf8, 0x8d, 0x87, 0xea, 0xba, 0x18, 0x45, 0xa4, 0x9f, 0xec, 0xee, 0xb2, 0x25, 0xbe, + 0x0e, 0x2b, 0x4f, 0xf6, 0x1f, 0xef, 0x1f, 0x3c, 0xdb, 0x3f, 0x6a, 0x1b, 0xc6, 0x81, 0xa1, 0x02, + 0xd3, 0x9b, 0xcd, 0xad, 0xa3, 0xce, 0xfe, 0xe1, 0x93, 0x1e, 0xcb, 0xd6, 0xff, 0x79, 0x06, 0x56, + 0x52, 0x0a, 0xf2, 0xcf, 0x76, 0xea, 0x12, 0xc3, 0x9f, 0x9b, 0x3f, 0xfc, 0xf9, 0xcb, 0x86, 0xbf, + 0x30, 0x3d, 0xfc, 0xbf, 0x93, 0x81, 0x95, 0x94, 0x22, 0x4e, 0x72, 0xcf, 0xa4, 0xb9, 0x27, 0x0d, + 0x8d, 0xec, 0x94, 0xa1, 0xd1, 0x80, 0xe5, 0xf0, 0xf7, 0x7e, 0x1c, 0xf0, 0x48, 0xc1, 0x92, 0x38, + 0x74, 0x5f, 0x23, 0x9f, 0xc6, 0xa1, 0x3b, 0x1b, 0x57, 0xb7, 0x96, 0xee, 0xa7, 0x06, 0x74, 0x7d, + 0xbf, 0x7e, 0xb9, 0x9a, 0xbe, 0xa2, 0x0b, 0x8f, 0xa0, 0x3a, 0x8e, 0x75, 0xc1, 0xcb, 0x59, 0x45, + 0x49, 0xca, 0x17, 0xb4, 0xf3, 0x77, 0x33, 0xb0, 0x9a, 0x56, 0xec, 0xff, 0x5f, 0x0f, 0xeb, 0x3f, + 0xcd, 0xc0, 0xfa, 0xcc, 0x76, 0x71, 0xa5, 0x5d, 0x39, 0xdd, 0xae, 0xec, 0x02, 0xed, 0xca, 0xcd, + 0x69, 0xd7, 0xe5, 0x9a, 0xe4, 0xea, 0x16, 0x77, 0xe1, 0x73, 0x97, 0x6e, 0x3c, 0x57, 0x0c, 0x75, + 0x8a, 0x69, 0x6e, 0x9a, 0xe9, 0x6f, 0x67, 0xe0, 0xf6, 0x55, 0x9b, 0xca, 0xff, 0x73, 0xb9, 0x9a, + 0x69, 0xe1, 0xaf, 0xc2, 0xb5, 0x39, 0xdb, 0xcf, 0x15, 0xed, 0x7a, 0x15, 0x56, 0xb1, 0x01, 0x87, + 0x71, 0x78, 0x3d, 0xab, 0xaf, 0x79, 0xa6, 0xa0, 0x68, 0x70, 0xab, 0x33, 0xf7, 0xcd, 0xd4, 0x33, + 0x51, 0x69, 0x60, 0xe3, 0xdd, 0x28, 0x8d, 0xa2, 0x0a, 0x25, 0xfd, 0x2a, 0x97, 0x4e, 0x54, 0x1f, + 0x7a, 0xcf, 0x5d, 0x15, 0x87, 0x37, 0x84, 0xa9, 0xdf, 0x2d, 0x30, 0xc4, 0xd8, 0xb1, 0xe9, 0x84, + 0xf8, 0x16, 0x40, 0x93, 0xbc, 0xda, 0xf0, 0x1a, 0x51, 0x6b, 0xf7, 0xa0, 0xdb, 0x66, 0x4b, 0x49, + 0x13, 0xfe, 0x93, 0x70, 0x1f, 0x68, 0x1c, 0x42, 0x31, 0xbe, 0xd8, 0xb1, 0x67, 0xfa, 0xa7, 0x96, + 0x3a, 0x87, 0x5d, 0x86, 0xf2, 0xa1, 0x76, 0x20, 0x55, 0x55, 0x1f, 0x75, 0x0f, 0xf6, 0x55, 0xc8, + 0x7f, 0xeb, 0xa0, 0xa7, 0xae, 0x87, 0x74, 0x9f, 0x3e, 0x52, 0x07, 0x82, 0x8f, 0x8c, 0xe6, 0xe1, + 0xce, 0x11, 0x61, 0x14, 0x1a, 0xbf, 0x95, 0x0f, 0x37, 0xd5, 0x86, 0xa1, 0x4f, 0x78, 0x01, 0x8a, + 0xb8, 0x99, 0x78, 0x9a, 0x71, 0x54, 0x0d, 0xa5, 0x34, 0xb7, 0xcf, 0x55, 0x14, 0x86, 0x65, 0x79, + 0x11, 0xb2, 0x87, 0xc7, 0x2a, 0x0f, 0x6b, 0x47, 0x8e, 0x1c, 0x75, 0xaf, 0xb4, 0x77, 0x2e, 0x59, + 0x01, 0x7f, 0xb4, 0x82, 0x33, 0x56, 0x6c, 0xfc, 0x8b, 0x1c, 0x54, 0x22, 0x4d, 0xfd, 0x32, 0x3b, + 0x07, 0xe7, 0xb0, 0xda, 0xd9, 0xef, 0xb5, 0x8d, 0xfd, 0xe6, 0xae, 0x46, 0xc9, 0xf1, 0x6b, 0xb0, + 0xb6, 0xdd, 0xd9, 0x6d, 0x1f, 0xed, 0x1e, 0x34, 0xb7, 0x34, 0xb0, 0xcc, 0x6f, 0x02, 0xef, 0xec, + 0x1d, 0x1e, 0x18, 0xbd, 0xa3, 0x4e, 0xf7, 0xa8, 0xd5, 0xdc, 0x6f, 0xb5, 0x77, 0xdb, 0x5b, 0xac, + 0xc8, 0x5f, 0x81, 0xbb, 0xfb, 0x07, 0xbd, 0xce, 0xc1, 0xfe, 0xd1, 0xfe, 0xc1, 0xd1, 0xc1, 0xe6, + 0x47, 0xed, 0x56, 0xaf, 0x7b, 0xd4, 0xd9, 0x3f, 0x42, 0xae, 0x8f, 0x8c, 0x26, 0x7e, 0x61, 0x05, + 0x7e, 0x17, 0x6e, 0x6b, 0xac, 0x6e, 0xdb, 0x78, 0xda, 0x36, 0x90, 0xc9, 0x93, 0xfd, 0xe6, 0xd3, + 0x66, 0x67, 0xb7, 0xb9, 0xb9, 0xdb, 0x66, 0xcb, 0xfc, 0x0e, 0xd4, 0x35, 0x86, 0xd1, 0xec, 0xb5, + 0x8f, 0x76, 0x3b, 0x7b, 0x9d, 0xde, 0x51, 0xfb, 0xbb, 0xad, 0x76, 0x7b, 0xab, 0xbd, 0xc5, 0x56, + 0xf8, 0x97, 0xe1, 0x4b, 0xd4, 0x28, 0xdd, 0x88, 0x74, 0x65, 0x9f, 0x74, 0x0e, 0x8f, 0x9a, 0x46, + 0x6b, 0xa7, 0xf3, 0xb4, 0xcd, 0x56, 0xf9, 0x6b, 0xf0, 0xc5, 0xcb, 0x51, 0xb7, 0x3a, 0x46, 0xbb, + 0xd5, 0x3b, 0x30, 0x3e, 0x66, 0xeb, 0xfc, 0x97, 0xe0, 0x73, 0x3b, 0xbd, 0xbd, 0xdd, 0xa3, 0x67, + 0xc6, 0xc1, 0xfe, 0xa3, 0x23, 0xfa, 0xd9, 0xed, 0x19, 0x4f, 0x5a, 0xbd, 0x27, 0x46, 0x9b, 0x01, + 0xaf, 0xc3, 0xcd, 0xc3, 0xcd, 0xa3, 0xfd, 0x83, 0xde, 0x51, 0x73, 0xff, 0xe3, 0xcd, 0xdd, 0x83, + 0xd6, 0xe3, 0xa3, 0xed, 0x03, 0x63, 0xaf, 0xd9, 0x63, 0x55, 0xfe, 0x15, 0x78, 0xad, 0xd5, 0x7d, + 0xaa, 0x9b, 0x79, 0xb0, 0x7d, 0x64, 0x1c, 0x3c, 0xeb, 0x1e, 0x1d, 0x18, 0x47, 0x46, 0x7b, 0x97, + 0xfa, 0xdc, 0x8d, 0xdb, 0x5e, 0xe2, 0xb7, 0xa1, 0xd6, 0xd9, 0xef, 0x3e, 0xd9, 0xde, 0xee, 0xb4, + 0x3a, 0xed, 0xfd, 0xde, 0xd1, 0x61, 0xdb, 0xd8, 0xeb, 0x74, 0xbb, 0x88, 0xc6, 0x2a, 0x8d, 0x6f, + 0x43, 0xb1, 0xe3, 0x9e, 0xd9, 0x92, 0x96, 0xb7, 0x16, 0x46, 0xed, 0x6f, 0x86, 0x45, 0x5a, 0x95, + 0xf6, 0xc0, 0xa5, 0xf7, 0x12, 0x68, 0x05, 0x2d, 0x1b, 0x31, 0xa0, 0xf1, 0x87, 0x39, 0x58, 0x51, + 0x2c, 0x42, 0xff, 0xf5, 0x1e, 0xac, 0xe9, 0x40, 0x70, 0x27, 0xad, 0x41, 0xa7, 0xc1, 0xf4, 0x10, + 0x99, 0x02, 0x25, 0x56, 0x67, 0x12, 0xc4, 0x6f, 0x42, 0xd1, 0xec, 0x3b, 0xe8, 0x04, 0xab, 0xd3, + 0x5a, 0x5d, 0xfa, 0xac, 0xaa, 0x13, 0xd5, 0xb2, 0x42, 0xec, 0x7b, 0x6e, 0x2b, 0xba, 0x32, 0x93, + 0x82, 0xf1, 0x4f, 0xe0, 0x56, 0x54, 0x6e, 0xbb, 0x7d, 0xff, 0x62, 0x1c, 0xbd, 0x14, 0x58, 0x9a, + 0x1b, 0x4a, 0xd9, 0xb6, 0x1d, 0x91, 0x42, 0x34, 0x2e, 0x63, 0xc0, 0x1f, 0x01, 0xd8, 0x34, 0x58, + 0x64, 0x9e, 0xcd, 0xbf, 0x17, 0x9e, 0x1a, 0x4d, 0x5d, 0xd2, 0x56, 0x68, 0xf4, 0x1b, 0xf7, 0xa7, + 0x01, 0xaa, 0xfd, 0xc7, 0xfa, 0x61, 0xc1, 0x65, 0x23, 0x2a, 0x37, 0x1e, 0x00, 0xc4, 0x54, 0x9c, + 0xc1, 0x32, 0x9a, 0x36, 0xcd, 0x60, 0x4f, 0x8c, 0x8e, 0x85, 0xaf, 0x72, 0x18, 0x15, 0xe4, 0x11, + 0x52, 0xb0, 0x4c, 0xe3, 0x8f, 0x32, 0x89, 0x28, 0x84, 0x8a, 0x32, 0x5c, 0xb9, 0x01, 0xce, 0x3b, + 0x11, 0x43, 0x6f, 0x5f, 0x0f, 0xaa, 0xb6, 0xcb, 0x74, 0x91, 0x1f, 0x02, 0xb7, 0x67, 0x87, 0x32, + 0xbf, 0xe0, 0x50, 0xce, 0xa1, 0x9d, 0x3e, 0xd0, 0x28, 0xcc, 0x1e, 0x68, 0xdc, 0x01, 0x18, 0x38, + 0xde, 0xb1, 0x56, 0xfb, 0x45, 0x9d, 0xf5, 0x14, 0x41, 0x1a, 0x0e, 0x94, 0xc3, 0x57, 0x12, 0x51, + 0xc6, 0xe8, 0x9d, 0xc4, 0x28, 0xbc, 0xab, 0x4a, 0x7c, 0x07, 0x56, 0x45, 0xba, 0xcd, 0xd9, 0x05, + 0xdb, 0x3c, 0x45, 0xd7, 0xf8, 0x3a, 0xac, 0xcf, 0x20, 0xe1, 0x20, 0x8e, 0x4d, 0x19, 0x3d, 0x95, + 0x80, 0xbf, 0x67, 0x93, 0x15, 0x1a, 0xff, 0x21, 0x0b, 0xcb, 0x7b, 0xa6, 0x6b, 0x9f, 0x88, 0x40, + 0x86, 0xad, 0x0d, 0xfa, 0x43, 0x31, 0x32, 0xc3, 0xd6, 0xaa, 0x92, 0x8e, 0xf9, 0x64, 0x93, 0xa7, + 0x29, 0x33, 0x87, 0x6f, 0xb8, 0x9a, 0x26, 0x72, 0x18, 0xdd, 0x1e, 0xd0, 0x25, 0x9c, 0x3b, 0xc7, + 0xee, 0x0b, 0x37, 0x08, 0x57, 0x4c, 0x58, 0x8c, 0x73, 0x97, 0x8a, 0x57, 0xe4, 0x2e, 0x95, 0x66, + 0xc7, 0xff, 0x2e, 0x54, 0x83, 0xbe, 0x2f, 0x84, 0x1b, 0x0c, 0x3d, 0x19, 0xbe, 0xb0, 0x99, 0x04, + 0x51, 0x22, 0xa1, 0xf7, 0xdc, 0x45, 0x19, 0xdf, 0xb5, 0xdd, 0x53, 0x9d, 0x1f, 0x97, 0x82, 0xa1, + 0x0c, 0x52, 0xc4, 0xcb, 0xfe, 0x81, 0xa0, 0x98, 0x4a, 0xc1, 0x88, 0xca, 0x14, 0xd3, 0x32, 0xa5, + 0x18, 0x78, 0xbe, 0x2d, 0x54, 0x60, 0xb7, 0x62, 0x24, 0x20, 0x48, 0xeb, 0x98, 0xee, 0x60, 0x62, + 0x0e, 0x84, 0x3e, 0xfc, 0x8f, 0xca, 0x8d, 0xff, 0x51, 0x00, 0x50, 0xab, 0x21, 0x18, 0xda, 0x63, + 0x3a, 0x78, 0xb2, 0x75, 0xce, 0xf4, 0x8a, 0x41, 0xbf, 0xf9, 0x7b, 0xa9, 0xeb, 0x0c, 0xb3, 0x47, + 0xc5, 0x31, 0xf9, 0x74, 0x40, 0x0c, 0x07, 0xc7, 0x94, 0x42, 0xa7, 0x8d, 0xd1, 0xf8, 0xe7, 0x8d, + 0x24, 0x88, 0x12, 0x07, 0x4d, 0x29, 0xda, 0xae, 0xa5, 0x02, 0x6e, 0x79, 0x23, 0x2a, 0xd3, 0x85, + 0xa8, 0x00, 0xcd, 0x1c, 0x43, 0xb8, 0xe2, 0x79, 0x74, 0xd7, 0x2f, 0x06, 0xf1, 0x3d, 0x58, 0x19, + 0x9b, 0x17, 0x23, 0xe1, 0xca, 0x3d, 0x21, 0x87, 0x9e, 0xa5, 0x73, 0xbc, 0x5e, 0xbb, 0xbc, 0x81, + 0x87, 0x49, 0x74, 0x23, 0x4d, 0x8d, 0x32, 0xe1, 0x06, 0xb4, 0x4a, 0xd4, 0x34, 0xea, 0x12, 0xdf, + 0x04, 0x50, 0xbf, 0x12, 0x9a, 0x6a, 0x26, 0xd2, 0x66, 0x8e, 0x44, 0x20, 0xfc, 0x33, 0x5b, 0x69, + 0x57, 0xa5, 0xa4, 0x62, 0x2a, 0xd4, 0xc5, 0x93, 0x40, 0xf8, 0xed, 0x91, 0x69, 0x3b, 0x7a, 0x82, + 0x63, 0x00, 0x7f, 0x1b, 0x6e, 0x04, 0x93, 0x63, 0x94, 0x99, 0x63, 0xd1, 0xf3, 0xf6, 0xc5, 0xf3, + 0xc0, 0x11, 0x52, 0x0a, 0x5f, 0xe7, 0x91, 0xcc, 0xff, 0xd8, 0x18, 0x44, 0x66, 0x18, 0xbd, 0xe6, + 0x82, 0xbf, 0xe2, 0x64, 0xb5, 0x08, 0xa4, 0x33, 0xf9, 0x58, 0x06, 0xd5, 0x9f, 0x02, 0xe9, 0x44, + 0xbf, 0x2c, 0xff, 0x12, 0x7c, 0x21, 0x85, 0x64, 0xa8, 0x63, 0xf9, 0x60, 0xdb, 0x76, 0x4d, 0xc7, + 0xfe, 0x81, 0x4a, 0x92, 0xc8, 0x35, 0xc6, 0xb0, 0x92, 0x1a, 0x38, 0xba, 0x9c, 0x4a, 0xbf, 0x74, + 0xb6, 0x13, 0x83, 0x65, 0x55, 0xee, 0x4a, 0xdf, 0xa6, 0xf3, 0xa6, 0x08, 0xd2, 0xc2, 0x75, 0xee, + 0xb1, 0x2c, 0xbf, 0x0e, 0x4c, 0x41, 0x3a, 0xae, 0x39, 0x1e, 0x37, 0xc7, 0x63, 0x47, 0xb0, 0x1c, + 0x5d, 0xfc, 0x8d, 0xa1, 0xea, 0x52, 0x03, 0xcb, 0x37, 0xbe, 0x0b, 0xb7, 0x68, 0x64, 0x9e, 0x0a, + 0x3f, 0xf2, 0xf3, 0x75, 0x5f, 0x6f, 0xc0, 0xba, 0xfa, 0xb5, 0xef, 0x49, 0xf5, 0x99, 0x8c, 0x4f, + 0x0e, 0xab, 0x0a, 0x8c, 0xb6, 0x57, 0x57, 0xd0, 0x75, 0xde, 0x08, 0x16, 0xe1, 0x65, 0x1b, 0x3f, + 0x2d, 0x02, 0x8f, 0x05, 0xa2, 0x67, 0x0b, 0x7f, 0xcb, 0x94, 0x66, 0x22, 0x4e, 0xbc, 0x72, 0x69, + 0xa6, 0xc3, 0x8b, 0xf3, 0x14, 0x6f, 0x42, 0xd1, 0x0e, 0xd0, 0x33, 0xd5, 0xc9, 0xca, 0xba, 0xc4, + 0x77, 0x01, 0xc6, 0xc2, 0xb7, 0x3d, 0x8b, 0x24, 0xa8, 0x30, 0xf7, 0x56, 0xc9, 0x6c, 0xa3, 0x36, + 0x0e, 0x23, 0x1a, 0x23, 0x41, 0x8f, 0xed, 0x50, 0x25, 0x95, 0x37, 0x50, 0xa4, 0x46, 0x27, 0x41, + 0xfc, 0x0d, 0xb8, 0x36, 0xf6, 0xed, 0xbe, 0x50, 0xd3, 0xf1, 0x24, 0xb0, 0x5a, 0xf4, 0x06, 0x62, + 0x89, 0x30, 0xe7, 0x7d, 0x42, 0x09, 0x34, 0x5d, 0xf2, 0xd7, 0x02, 0x3a, 0x29, 0xd7, 0x17, 0xe0, + 0x55, 0x3a, 0xef, 0x8a, 0x31, 0xff, 0x23, 0xbf, 0x0f, 0x4c, 0x7f, 0xd8, 0xb3, 0xdd, 0x5d, 0xe1, + 0x0e, 0xe4, 0x90, 0x84, 0x7b, 0xc5, 0x98, 0x81, 0x93, 0x06, 0x53, 0x2f, 0x4d, 0xa9, 0x53, 0xb4, + 0x8a, 0x11, 0x95, 0xd5, 0xa3, 0x0a, 0x8e, 0xe7, 0x77, 0xa5, 0xaf, 0xf3, 0x92, 0xa3, 0x32, 0xda, + 0x50, 0x01, 0xb5, 0xf5, 0xd0, 0xf7, 0xac, 0x09, 0x9d, 0xf1, 0x28, 0x25, 0x36, 0x0d, 0x8e, 0x31, + 0xf7, 0x4c, 0x57, 0x27, 0x8b, 0xae, 0x24, 0x31, 0x23, 0x30, 0xb9, 0xa4, 0x5e, 0x10, 0x33, 0x5c, + 0xd3, 0x2e, 0x69, 0x02, 0xa6, 0x71, 0x62, 0x56, 0x2c, 0xc2, 0x89, 0xf9, 0x50, 0xff, 0x2d, 0xdf, + 0xb3, 0xad, 0x98, 0x97, 0xca, 0x5b, 0x9a, 0x81, 0x27, 0x70, 0x63, 0x9e, 0x3c, 0x85, 0x1b, 0xc1, + 0x1b, 0x3f, 0xca, 0x00, 0xc4, 0x93, 0x8f, 0x22, 0x1f, 0x97, 0xe2, 0x25, 0x7e, 0x0b, 0xae, 0x25, + 0xc1, 0x8e, 0x4e, 0xf8, 0x25, 0xb9, 0x8f, 0x3f, 0x6c, 0x99, 0x17, 0x01, 0xcb, 0xea, 0x2b, 0xe8, + 0x1a, 0xf6, 0x4c, 0x08, 0xca, 0x9e, 0xbc, 0x0e, 0x2c, 0x06, 0xd2, 0xbd, 0xc2, 0x80, 0xe5, 0xd3, + 0xa8, 0x1f, 0x0b, 0xd3, 0x0f, 0x58, 0xa1, 0xb1, 0x03, 0x45, 0x75, 0xd4, 0x37, 0xe7, 0x90, 0xfe, + 0xe5, 0x32, 0x6e, 0xfe, 0x46, 0x06, 0x60, 0x4b, 0x65, 0x87, 0xe3, 0x2e, 0x3e, 0x27, 0xf7, 0x61, + 0x9e, 0x45, 0x65, 0x5a, 0x16, 0x65, 0xd9, 0xe7, 0xa2, 0xf7, 0x8b, 0xb0, 0x88, 0x92, 0x63, 0x86, + 0x19, 0x72, 0x6a, 0xcd, 0x45, 0x65, 0xb5, 0x81, 0xb4, 0x3c, 0xd7, 0x15, 0x7d, 0xdc, 0x7e, 0xa2, + 0x0d, 0x24, 0x02, 0x35, 0x7e, 0x98, 0x85, 0x4a, 0x6b, 0x68, 0x4a, 0xf5, 0xdc, 0xcf, 0xb7, 0xa1, + 0x3c, 0x12, 0x41, 0x60, 0x0e, 0x44, 0xa0, 0x8f, 0xb6, 0xa6, 0xcf, 0xa5, 0x23, 0xdc, 0x8d, 0x27, + 0xae, 0x2f, 0x4c, 0x4b, 0xbd, 0x71, 0x14, 0x51, 0x29, 0x0e, 0xae, 0x8c, 0x7c, 0xff, 0x97, 0xe0, + 0xe0, 0x46, 0x0f, 0x12, 0x5b, 0xc7, 0xf1, 0x0b, 0xd8, 0xaa, 0xb7, 0x49, 0x50, 0x7d, 0x0f, 0xaa, + 0x09, 0x52, 0xf4, 0xd8, 0x3d, 0xc7, 0x12, 0x81, 0xba, 0xe5, 0x18, 0x3f, 0x0c, 0x99, 0x02, 0x52, + 0x82, 0x0a, 0xae, 0x5c, 0xe1, 0xeb, 0x53, 0xca, 0xb0, 0xd8, 0xf8, 0x5f, 0x25, 0xa8, 0x62, 0xa3, + 0xf6, 0x54, 0x1f, 0x66, 0xa6, 0xa3, 0x06, 0x25, 0x4f, 0x73, 0xd6, 0xd7, 0x23, 0xbd, 0x04, 0x4f, + 0x9d, 0xf4, 0x92, 0x4b, 0x27, 0xbd, 0xdc, 0x86, 0x8a, 0x3a, 0x52, 0xb3, 0x9a, 0x4a, 0x13, 0xe6, + 0x8c, 0x18, 0x80, 0xe6, 0xca, 0xc8, 0xb3, 0x48, 0x1f, 0x37, 0xd5, 0x99, 0x53, 0xce, 0x48, 0x40, + 0x92, 0x8f, 0x55, 0x55, 0xd3, 0x8f, 0x55, 0x51, 0xf6, 0xd1, 0xd8, 0xb9, 0xe8, 0x79, 0xba, 0xb5, + 0x1d, 0x2b, 0xbe, 0x65, 0x9e, 0x86, 0xf3, 0x16, 0x94, 0xf4, 0xb4, 0xe8, 0x93, 0xb5, 0x2f, 0xcf, + 0x99, 0x09, 0x8d, 0xbe, 0xa1, 0xff, 0xea, 0x8b, 0x5e, 0x46, 0x48, 0xc9, 0x1f, 0x41, 0xd5, 0x94, + 0xd2, 0xec, 0x0f, 0x47, 0x5a, 0x7f, 0xe6, 0xe6, 0x1c, 0xbf, 0x27, 0x19, 0x35, 0x23, 0x6c, 0x23, + 0x49, 0xc9, 0x37, 0xa1, 0xe2, 0x0b, 0x33, 0x95, 0x01, 0xf0, 0xca, 0x15, 0x6c, 0x8c, 0x10, 0xd7, + 0x88, 0xc9, 0xa2, 0x37, 0x52, 0x21, 0x7e, 0x23, 0xb5, 0xfe, 0x93, 0x0c, 0xac, 0xa6, 0x1b, 0xff, + 0x67, 0xf1, 0x66, 0xdf, 0x37, 0xe3, 0x37, 0xfb, 0x3e, 0xc3, 0xfb, 0x77, 0xbf, 0x9d, 0x01, 0x88, + 0xc7, 0x05, 0xf7, 0x48, 0xf5, 0xb6, 0x58, 0x68, 0xb5, 0xab, 0x12, 0xdf, 0x49, 0x3d, 0x48, 0xf1, + 0xf6, 0x42, 0x83, 0x9c, 0xf8, 0x99, 0x48, 0xde, 0x7f, 0x00, 0xab, 0x69, 0x38, 0x5d, 0x7a, 0xe8, + 0xec, 0xb6, 0x55, 0x8c, 0xaa, 0xb3, 0xd7, 0x7c, 0xd4, 0xd6, 0x97, 0xed, 0x3a, 0xfb, 0x8f, 0x59, + 0xb6, 0xfe, 0xc7, 0x19, 0xa8, 0x44, 0x43, 0xce, 0xbf, 0x93, 0x9c, 0x2b, 0x95, 0xe6, 0xf3, 0xd6, + 0x22, 0x73, 0x15, 0xff, 0x6a, 0xbb, 0xd2, 0xbf, 0x48, 0x4c, 0x5d, 0xdd, 0x83, 0xd5, 0xf4, 0xc7, + 0x39, 0x4a, 0xf4, 0x51, 0x5a, 0x89, 0xbe, 0xb9, 0x50, 0x95, 0xa1, 0xab, 0xba, 0x6b, 0x07, 0x52, + 0xeb, 0xd7, 0xf7, 0xb3, 0xef, 0x65, 0xea, 0x77, 0x61, 0x39, 0xf9, 0x69, 0xf6, 0x46, 0xed, 0xfd, + 0x3f, 0xce, 0xc1, 0x6a, 0x3a, 0x53, 0x86, 0xee, 0xef, 0xa9, 0x2c, 0xad, 0x03, 0xc7, 0x4a, 0xdc, + 0x77, 0x60, 0xe8, 0x26, 0x6b, 0x67, 0x98, 0x00, 0xeb, 0x14, 0x05, 0xf3, 0x46, 0x82, 0xdd, 0x4d, + 0xbe, 0x4b, 0xfa, 0x06, 0x87, 0xf0, 0x66, 0x25, 0x1b, 0xf3, 0x8a, 0x7e, 0xa1, 0xed, 0x87, 0x59, + 0xbe, 0x92, 0xc8, 0xba, 0xff, 0x31, 0x5a, 0x82, 0x6b, 0x9b, 0x13, 0xd7, 0x72, 0x84, 0x15, 0x41, + 0x7f, 0x92, 0x84, 0x46, 0x69, 0xf3, 0x3f, 0xcc, 0xf3, 0x55, 0xa8, 0x74, 0x27, 0xc7, 0x3a, 0x65, + 0xfe, 0x2f, 0xe7, 0xf9, 0x4d, 0x58, 0xd7, 0x58, 0x71, 0x86, 0x2a, 0xfb, 0x2b, 0xb8, 0x67, 0xad, + 0x36, 0xd5, 0x78, 0xe9, 0x86, 0xb2, 0xbf, 0x9a, 0xc7, 0x26, 0xd0, 0x85, 0xfd, 0xbf, 0x46, 0x7c, + 0xa2, 0xeb, 0x4d, 0xec, 0xd7, 0xf2, 0x7c, 0x0d, 0xa0, 0xdb, 0x8b, 0x2a, 0xfa, 0x8d, 0x3c, 0xaf, + 0x42, 0xb1, 0xdb, 0x23, 0x6e, 0x3f, 0xca, 0xf3, 0x1b, 0xc0, 0xe2, 0xaf, 0x3a, 0x6f, 0xf7, 0x6f, + 0xaa, 0xc6, 0x44, 0x89, 0xb8, 0x7f, 0x2b, 0x8f, 0xfd, 0x0a, 0x47, 0x99, 0xfd, 0xed, 0x3c, 0x67, + 0x50, 0x4d, 0x84, 0x76, 0xd9, 0xdf, 0xc9, 0x73, 0x0e, 0x2b, 0x7b, 0x76, 0x10, 0xd8, 0xee, 0x40, + 0xf7, 0xe0, 0xd7, 0xa9, 0xe6, 0xed, 0xe8, 0x86, 0x16, 0xfb, 0xcd, 0x3c, 0xbf, 0x05, 0x3c, 0x79, + 0x9c, 0xa5, 0x3f, 0xfc, 0x5d, 0xa2, 0x56, 0xfb, 0x64, 0xa0, 0x61, 0x7f, 0x8f, 0xa8, 0x51, 0x12, + 0x34, 0xe0, 0xb7, 0x68, 0x40, 0x5a, 0x71, 0xa6, 0xaf, 0x86, 0xff, 0x98, 0x88, 0xc3, 0xc9, 0x54, + 0xb0, 0x9f, 0xe4, 0xef, 0xff, 0x94, 0x8e, 0x23, 0x92, 0x09, 0x73, 0x7c, 0x19, 0xca, 0x8e, 0xe7, + 0x0e, 0xa4, 0x7a, 0x0f, 0x76, 0x05, 0x2a, 0xc1, 0xd0, 0xf3, 0x25, 0x15, 0xe9, 0x0a, 0xa9, 0x4b, + 0x8f, 0x09, 0xa8, 0x4b, 0x17, 0xca, 0xab, 0x53, 0xf1, 0x55, 0x69, 0x0e, 0x58, 0x35, 0xca, 0x51, + 0xce, 0x47, 0x79, 0xd4, 0xf4, 0xa8, 0x41, 0x78, 0x69, 0x9c, 0x15, 0x11, 0x75, 0xe2, 0x3b, 0x2a, + 0x9f, 0x5a, 0xa0, 0x45, 0xaf, 0x1e, 0x7e, 0x1c, 0x0f, 0xd1, 0x71, 0xa8, 0x28, 0xa8, 0xf7, 0x3d, + 0x5b, 0x5d, 0x47, 0xd6, 0xe9, 0x89, 0x16, 0xb6, 0x23, 0xca, 0xc0, 0x61, 0xe2, 0xfe, 0xdf, 0xcf, + 0xc0, 0x72, 0x78, 0x95, 0xdf, 0x1e, 0xd8, 0xae, 0xca, 0xc8, 0x0e, 0x5f, 0xd9, 0xed, 0x3b, 0xf6, + 0x38, 0x7c, 0xb5, 0x72, 0x0d, 0xaa, 0x96, 0x6f, 0x0e, 0x9a, 0xae, 0xb5, 0xe5, 0x7b, 0x63, 0xd5, + 0x6c, 0x75, 0x60, 0xa9, 0x32, 0xc1, 0x9f, 0x8b, 0x63, 0x44, 0x1f, 0x0b, 0x9f, 0xe5, 0x29, 0xf5, + 0x71, 0x68, 0xfa, 0xb6, 0x3b, 0x68, 0x9f, 0x4b, 0xe1, 0x06, 0x2a, 0x23, 0xbc, 0x0a, 0xa5, 0x49, + 0x20, 0xfa, 0x66, 0x20, 0x58, 0x11, 0x0b, 0xc7, 0x13, 0xdb, 0x91, 0xb6, 0xab, 0x1e, 0x8b, 0x8c, + 0x52, 0xbe, 0xcb, 0xd8, 0x33, 0x73, 0x6c, 0xb3, 0xca, 0xfd, 0xdf, 0xcf, 0x40, 0x95, 0xc4, 0x22, + 0x8e, 0x89, 0xc7, 0x36, 0x5a, 0x15, 0x4a, 0xbb, 0xd1, 0xab, 0x81, 0x45, 0xc8, 0x1e, 0x9c, 0xaa, + 0x98, 0xb8, 0x16, 0x0b, 0x75, 0x23, 0x57, 0x3d, 0x20, 0x98, 0xe7, 0x9f, 0x83, 0x1b, 0x86, 0x18, + 0x79, 0x52, 0x3c, 0x33, 0x6d, 0x99, 0xbc, 0x7d, 0x55, 0x40, 0x77, 0x4e, 0x7d, 0x0a, 0xaf, 0x5b, + 0x15, 0xc9, 0x9d, 0xc3, 0x6a, 0x43, 0x48, 0x09, 0x7b, 0x4f, 0x10, 0xed, 0xdf, 0x95, 0x23, 0x94, + 0x8f, 0x3c, 0xdb, 0xc5, 0xda, 0xe8, 0x1e, 0x38, 0x41, 0xe8, 0x6c, 0x07, 0x41, 0x70, 0x7f, 0x1f, + 0x6e, 0xce, 0x3f, 0x91, 0x50, 0x37, 0xc4, 0xe9, 0xa9, 0x6a, 0xba, 0x8f, 0xf3, 0xcc, 0xb7, 0xd5, + 0x45, 0xdf, 0x0a, 0x14, 0x0e, 0x9e, 0xbb, 0x24, 0x16, 0xeb, 0xb0, 0xb2, 0xef, 0x25, 0x68, 0x58, + 0xee, 0x7e, 0x3f, 0x75, 0x88, 0x14, 0x0f, 0x4a, 0xd8, 0x88, 0xa5, 0xc4, 0x5d, 0xb3, 0x8c, 0x3a, + 0x1f, 0xa0, 0xff, 0x36, 0xa2, 0x5e, 0xcf, 0xd0, 0x87, 0x37, 0x96, 0x7a, 0x3d, 0x23, 0x6a, 0x66, + 0x5e, 0x3d, 0x23, 0xe6, 0xf6, 0x85, 0x23, 0x2c, 0x56, 0xb8, 0xff, 0x1e, 0xac, 0xe9, 0xae, 0xf6, + 0x45, 0x10, 0x84, 0x77, 0xb5, 0x0e, 0x7d, 0xfb, 0x4c, 0xbd, 0xd0, 0xb1, 0x0c, 0xe5, 0x43, 0xe1, + 0x07, 0x9e, 0x4b, 0xaf, 0x93, 0x00, 0x14, 0xbb, 0x43, 0xd3, 0xc7, 0x3a, 0xee, 0x7f, 0x55, 0x0f, + 0xd2, 0x93, 0xf3, 0x70, 0x6b, 0xc0, 0xf5, 0xa3, 0x1f, 0xe7, 0x31, 0xa5, 0xa9, 0xd1, 0xa5, 0x2f, + 0xcc, 0x11, 0xcb, 0xde, 0x6f, 0x41, 0x85, 0xae, 0x7a, 0x3d, 0xb6, 0x5d, 0x0b, 0x3b, 0xbe, 0xa9, + 0xaf, 0x1d, 0xd0, 0xab, 0x51, 0x67, 0x34, 0x1c, 0x65, 0xf5, 0xbe, 0x2e, 0xcb, 0xf2, 0x9b, 0xc0, + 0x9b, 0x13, 0xe9, 0x8d, 0x4c, 0xba, 0xa2, 0xec, 0x5c, 0xa8, 0xb7, 0x98, 0x73, 0xf7, 0xbf, 0x05, + 0x5c, 0xc5, 0xd8, 0x2c, 0x71, 0x6e, 0xbb, 0x83, 0xe8, 0xf5, 0x03, 0xa0, 0xa7, 0x4c, 0x2c, 0x71, + 0x1e, 0xde, 0xd3, 0x0b, 0x0b, 0xe1, 0x83, 0x2a, 0xdb, 0xde, 0xc4, 0xc5, 0x46, 0x3f, 0x85, 0xeb, + 0x4a, 0xc4, 0xb0, 0x17, 0x74, 0xff, 0xf5, 0x52, 0xc7, 0x5f, 0xdd, 0xd3, 0x93, 0x93, 0x20, 0xc2, + 0x65, 0x19, 0x6c, 0x58, 0xe4, 0x34, 0xc7, 0xf0, 0xec, 0xfd, 0x06, 0x5c, 0x9b, 0x13, 0xb9, 0x20, + 0xa5, 0xae, 0xfc, 0x37, 0xb6, 0x74, 0xff, 0x43, 0x58, 0x57, 0x6a, 0x68, 0x5f, 0xdd, 0x50, 0x0c, + 0x87, 0xed, 0x59, 0x67, 0xbb, 0xa3, 0x46, 0xba, 0xd5, 0xde, 0xdd, 0x7d, 0xb2, 0xdb, 0x34, 0x58, + 0x86, 0xe4, 0xe1, 0xa0, 0x77, 0xd4, 0x3a, 0xd8, 0xdf, 0x6f, 0xb7, 0x7a, 0xed, 0x2d, 0x96, 0xdd, + 0xbc, 0xff, 0x6f, 0x3f, 0xbd, 0x93, 0xf9, 0xd9, 0xa7, 0x77, 0x32, 0xff, 0xe5, 0xd3, 0x3b, 0x99, + 0x1f, 0xfd, 0xfc, 0xce, 0xd2, 0xcf, 0x7e, 0x7e, 0x67, 0xe9, 0x3f, 0xfe, 0xfc, 0xce, 0xd2, 0x27, + 0x6c, 0xfa, 0x1f, 0x06, 0x1d, 0x17, 0xc9, 0x65, 0x78, 0xeb, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, + 0x90, 0x26, 0xce, 0x54, 0x4b, 0x68, 0x00, 0x00, } func (m *SmartBlockSnapshotBase) Marshal() (dAtA []byte, err error) { @@ -14752,6 +14838,16 @@ func (m *Notification) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x20 } + if m.IsToast { + i-- + if m.IsToast { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } if m.CreateTime != 0 { i = encodeVarintModels(dAtA, i, uint64(m.CreateTime)) i-- @@ -14983,6 +15079,29 @@ func (m *NotificationPayloadOfParticipantPermissionsChange) MarshalToSizedBuffer } return len(dAtA) - i, nil } +func (m *NotificationPayloadOfAutoTypeWidgetAdded) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NotificationPayloadOfAutoTypeWidgetAdded) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.AutoTypeWidgetAdded != nil { + { + size, err := m.AutoTypeWidgetAdded.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintModels(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x9a + } + return len(dAtA) - i, nil +} func (m *NotificationImport) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -15451,6 +15570,50 @@ func (m *NotificationParticipantPermissionsChange) MarshalToSizedBuffer(dAtA []b return len(dAtA) - i, nil } +func (m *NotificationAutoTypeWidgetAdded) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NotificationAutoTypeWidgetAdded) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NotificationAutoTypeWidgetAdded) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.WidgetBlockId) > 0 { + i -= len(m.WidgetBlockId) + copy(dAtA[i:], m.WidgetBlockId) + i = encodeVarintModels(dAtA, i, uint64(len(m.WidgetBlockId))) + i-- + dAtA[i] = 0x1a + } + if len(m.TypePluralName) > 0 { + i -= len(m.TypePluralName) + copy(dAtA[i:], m.TypePluralName) + i = encodeVarintModels(dAtA, i, uint64(len(m.TypePluralName))) + i-- + dAtA[i] = 0x12 + } + if len(m.SpaceId) > 0 { + i -= len(m.SpaceId) + copy(dAtA[i:], m.SpaceId) + i = encodeVarintModels(dAtA, i, uint64(len(m.SpaceId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *Export) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -18532,6 +18695,9 @@ func (m *Notification) Size() (n int) { if m.CreateTime != 0 { n += 1 + sovModels(uint64(m.CreateTime)) } + if m.IsToast { + n += 2 + } if m.Status != 0 { n += 1 + sovModels(uint64(m.Status)) } @@ -18672,6 +18838,18 @@ func (m *NotificationPayloadOfParticipantPermissionsChange) Size() (n int) { } return n } +func (m *NotificationPayloadOfAutoTypeWidgetAdded) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.AutoTypeWidgetAdded != nil { + l = m.AutoTypeWidgetAdded.Size() + n += 2 + l + sovModels(uint64(l)) + } + return n +} func (m *NotificationImport) Size() (n int) { if m == nil { return 0 @@ -18899,6 +19077,27 @@ func (m *NotificationParticipantPermissionsChange) Size() (n int) { return n } +func (m *NotificationAutoTypeWidgetAdded) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.SpaceId) + if l > 0 { + n += 1 + l + sovModels(uint64(l)) + } + l = len(m.TypePluralName) + if l > 0 { + n += 1 + l + sovModels(uint64(l)) + } + l = len(m.WidgetBlockId) + if l > 0 { + n += 1 + l + sovModels(uint64(l)) + } + return n +} + func (m *Export) Size() (n int) { if m == nil { return 0 @@ -31055,6 +31254,26 @@ func (m *Notification) Unmarshal(dAtA []byte) error { break } } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IsToast", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowModels + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IsToast = bool(v != 0) case 4: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) @@ -31508,6 +31727,41 @@ func (m *Notification) Unmarshal(dAtA []byte) error { } m.Payload = &NotificationPayloadOfParticipantPermissionsChange{v} iNdEx = postIndex + case 19: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AutoTypeWidgetAdded", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowModels + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthModels + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthModels + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &NotificationAutoTypeWidgetAdded{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Payload = &NotificationPayloadOfAutoTypeWidgetAdded{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipModels(dAtA[iNdEx:]) @@ -33090,6 +33344,152 @@ func (m *NotificationParticipantPermissionsChange) Unmarshal(dAtA []byte) error } return nil } +func (m *NotificationAutoTypeWidgetAdded) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowModels + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AutoTypeWidgetAdded: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AutoTypeWidgetAdded: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SpaceId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowModels + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthModels + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthModels + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SpaceId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TypePluralName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowModels + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthModels + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthModels + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TypePluralName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WidgetBlockId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowModels + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthModels + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthModels + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.WidgetBlockId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipModels(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthModels + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Export) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pkg/lib/pb/model/protos/models.proto b/pkg/lib/pb/model/protos/models.proto index 38577c2bf..080995757 100644 --- a/pkg/lib/pb/model/protos/models.proto +++ b/pkg/lib/pb/model/protos/models.proto @@ -1043,6 +1043,7 @@ message Notification { int64 createTime = 2; Status status = 4; bool isLocal = 5; + bool isToast = 3; // means it should automatically hide after some time if client window is active oneof payload { Import import = 6; Export export = 8; @@ -1054,6 +1055,7 @@ message Notification { ParticipantRemove participantRemove = 16; ParticipantRequestDecline participantRequestDecline = 17; ParticipantPermissionsChange participantPermissionsChange = 18; + AutoTypeWidgetAdded autoTypeWidgetAdded = 19; } string space = 7; string aclHeadId = 14; @@ -1138,6 +1140,12 @@ message Notification { enum ActionType { CLOSE = 0; } + + message AutoTypeWidgetAdded { + string spaceId = 1; + string typePluralName = 2; // fallback to singular if missing + string widgetBlockId = 3; + } } message Export { From 0356512e1c01349a2e5c9b83f30a2adb657bf3fe Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 24 Mar 2025 12:29:07 +0100 Subject: [PATCH 074/132] GO-4459: Simplify template exclusion in object service --- core/api/internal/object/service.go | 9 +--- core/api/internal/object/service_test.go | 52 ++---------------------- 2 files changed, 6 insertions(+), 55 deletions(-) diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 36b5dcf99..52f805cf4 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -114,11 +114,6 @@ func NewService(mw service.ClientCommandsServer, spaceService *space.SpaceServic // ListObjects retrieves a paginated list of objects in a specific space. func (s *ObjectService) ListObjects(ctx context.Context, spaceId string, offset int, limit int) (objects []Object, total int, hasMore bool, err error) { - typeId, err := util.ResolveUniqueKeyToTypeId(s.mw, spaceId, "ot-template") - if err != nil { - return nil, 0, false, err - } - resp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ @@ -139,9 +134,9 @@ func (s *ObjectService) ListObjects(ctx context.Context, spaceId string, offset }, { Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyType.String(), + RelationKey: "type.uniqueKey", Condition: model.BlockContentDataviewFilter_NotEqual, - Value: pbtypes.String(typeId), + Value: pbtypes.String("ot-template"), }, { Operator: model.BlockContentDataviewFilter_No, diff --git a/core/api/internal/object/service_test.go b/core/api/internal/object/service_test.go index 6fd190e2f..5bb40f904 100644 --- a/core/api/internal/object/service_test.go +++ b/core/api/internal/object/service_test.go @@ -66,28 +66,6 @@ func TestObjectService_ListObjects(t *testing.T) { ctx := context.Background() fx := newFixture(t) - // Mock template type resolution - fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ - SpaceId: mockedSpaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyUniqueKey.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String("ot-template"), - }, - }, - Keys: []string{bundle.RelationKeyId.String()}, - }).Return(&pb.RpcObjectSearchResponse{ - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - bundle.RelationKeyId.String(): pbtypes.String(mockedTypeId), - }, - }, - }, - }).Once() - // Mock object search fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ SpaceId: mockedSpaceId, @@ -108,9 +86,9 @@ func TestObjectService_ListObjects(t *testing.T) { }, { Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyType.String(), + RelationKey: "type.uniqueKey", Condition: model.BlockContentDataviewFilter_NotEqual, - Value: pbtypes.String(mockedTypeId), + Value: pbtypes.String("ot-template"), }, { Operator: model.BlockContentDataviewFilter_No, @@ -262,28 +240,6 @@ func TestObjectService_ListObjects(t *testing.T) { ctx := context.Background() fx := newFixture(t) - // Mock template type resolution - fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ - SpaceId: mockedSpaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyUniqueKey.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String("ot-template"), - }, - }, - Keys: []string{bundle.RelationKeyId.String()}, - }).Return(&pb.RpcObjectSearchResponse{ - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - bundle.RelationKeyId.String(): pbtypes.String(mockedTypeId), - }, - }, - }, - }).Once() - // Mock object search fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ SpaceId: mockedSpaceId, @@ -304,9 +260,9 @@ func TestObjectService_ListObjects(t *testing.T) { }, { Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeyType.String(), + RelationKey: "type.uniqueKey", Condition: model.BlockContentDataviewFilter_NotEqual, - Value: pbtypes.String(mockedTypeId), + Value: pbtypes.String("ot-template"), }, { Operator: model.BlockContentDataviewFilter_No, From 11c1b9429803a5e9ce99eec66ddc64bcb9729220 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 25 Mar 2025 13:39:01 +0100 Subject: [PATCH 075/132] GO-4459: Add support for queries in GetObjectsInList --- core/api/docs/docs.go | 2 +- core/api/docs/swagger.json | 2 +- core/api/docs/swagger.yaml | 5 +++-- core/api/internal/list/handler.go | 7 ++++++- core/api/internal/list/service.go | 27 ++++++++++++++++++++++++++- core/api/internal/object/service.go | 6 +++--- core/api/util/util.go | 26 +++++++++++++++++++++----- 7 files changed, 61 insertions(+), 14 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 4957bb441..abeb29d1c 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -9,7 +9,7 @@ const docTemplate = `{ "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (query or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list. View IDs can be obtained from the block entry with ID \"dataview\" when retrieving the list object.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index d93223be9..8d71916fc 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -2,7 +2,7 @@ "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (query or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list. View IDs can be obtained from the block entry with ID \"dataview\" when retrieving the list object.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index a60f9afd1..b9f520b14 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -1107,9 +1107,10 @@ paths: /spaces/{space_id}/lists/{list_id}/{view_id}/objects: get: description: Returns a paginated list of objects that are associated with a - specific list (or collection) within a space. This endpoint helps clients + specific list (query or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning - detailed object information for each item of the list. + detailed object information for each item of the list. View IDs can be obtained + from the block entry with ID "dataview" when retrieving the list object. parameters: - description: Space ID in: path diff --git a/core/api/internal/list/handler.go b/core/api/internal/list/handler.go index 4fece4d47..8ce726fd3 100644 --- a/core/api/internal/list/handler.go +++ b/core/api/internal/list/handler.go @@ -12,7 +12,7 @@ import ( // GetObjectsInListHandler // // @Summary Get objects in list -// @Description Returns a paginated list of objects that are associated with a specific list (or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list. +// @Description Returns a paginated list of objects that are associated with a specific list (query or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list. View IDs can be obtained from the block entry with ID "dataview" when retrieving the list object. // @Tags lists // @Produce json // @Param space_id path string true "Space ID" @@ -36,7 +36,12 @@ func GetObjectsInListHandler(s *ListService) gin.HandlerFunc { objects, total, hasMore, err := s.GetObjectsInList(c, spaceId, listId, viewId, offset, limit) code := util.MapErrorCode(err, + util.ErrToCode(ErrFailedGetList, http.StatusNotFound), + util.ErrToCode(ErrFailedGetListDataview, http.StatusInternalServerError), + util.ErrToCode(ErrFailedGetListDataviewView, http.StatusInternalServerError), + util.ErrToCode(ErrUnsupportedListType, http.StatusInternalServerError), util.ErrToCode(ErrFailedGetObjectsInList, http.StatusInternalServerError), + util.ErrToCode(util.ErrorTypeNotFound, http.StatusInternalServerError), ) if code != http.StatusOK { diff --git a/core/api/internal/list/service.go b/core/api/internal/list/service.go index dea3f8571..cfa175b7a 100644 --- a/core/api/internal/list/service.go +++ b/core/api/internal/list/service.go @@ -6,6 +6,7 @@ import ( "github.com/anyproto/anytype-heart/core/api/internal/object" "github.com/anyproto/anytype-heart/core/api/pagination" + "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" @@ -16,6 +17,7 @@ var ( ErrFailedGetList = errors.New("failed to get list") ErrFailedGetListDataview = errors.New("failed to get list dataview") ErrFailedGetListDataviewView = errors.New("failed to get list dataview view") + ErrUnsupportedListType = errors.New("unsupported list type") ErrFailedGetObjectsInList = errors.New("failed to get objects in list") ErrFailedAddObjectsToList = errors.New("failed to add objects to list") ErrFailedRemoveObjectsFromList = errors.New("failed to remove objects from list") @@ -88,14 +90,37 @@ func (s *ListService) GetObjectsInList(ctx context.Context, spaceId string, list return nil, 0, false, ErrFailedGetListDataview } + var collectionId string + var source []string + listType := s.objectService.GetTypeFromDetails(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyType.String()].GetStringValue(), resp.ObjectView.Details) + + if listType.RecommendedLayout == "set" { + // for queries, we search within the space for objects of the setOf type + setOfValues := resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySetOf.String()].GetListValue().Values + for _, value := range setOfValues { + typeKey, err := util.ResolveIdtoUniqueKey(s.mw, spaceId, value.GetStringValue()) + if err != nil { + return nil, 0, false, err + } + source = append(source, typeKey) + } + } else if listType.RecommendedLayout == "collection" { + // for collections, we need to search within that collection + collectionId = listId + } else { + return nil, 0, false, ErrUnsupportedListType + } + + // TODO: use subscription service with internal: 'true' to not send events to clients searchResp := s.mw.ObjectSearchSubscribe(ctx, &pb.RpcObjectSearchSubscribeRequest{ SpaceId: spaceId, Limit: int64(limit), // nolint: gosec Offset: int64(offset), // nolint: gosec Keys: []string{bundle.RelationKeyId.String()}, - CollectionId: listId, Sorts: sorts, Filters: filters, + Source: source, + CollectionId: collectionId, }) // TODO: returned error from ObjectSearchSubscribe is inconsistent with other RPCs: Error is nil instead of Code being NULL diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 52f805cf4..d5cf23d08 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -207,7 +207,7 @@ func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId SpaceId: details[bundle.RelationKeySpaceId.String()].GetStringValue(), Snippet: details[bundle.RelationKeySnippet.String()].GetStringValue(), Layout: model.ObjectTypeLayout_name[int32(details[bundle.RelationKeyResolvedLayout.String()].GetNumberValue())], - Type: s.getTypeFromDetails(details[bundle.RelationKeyType.String()].GetStringValue(), resp.ObjectView.Details), + Type: s.GetTypeFromDetails(details[bundle.RelationKeyType.String()].GetStringValue(), resp.ObjectView.Details), Blocks: s.getBlocks(resp), Properties: s.getProperties(resp), } @@ -545,8 +545,8 @@ func (s *ObjectService) GetTemplate(ctx context.Context, spaceId string, typeId }, nil } -// getTypeFromDetails returns the type from the details of the ObjectShowResponse. -func (s *ObjectService) getTypeFromDetails(typeId string, details []*model.ObjectViewDetailsSet) Type { +// GetTypeFromDetails returns the type from the details of the ObjectShowResponse. +func (s *ObjectService) GetTypeFromDetails(typeId string, details []*model.ObjectViewDetailsSet) Type { var objectTypeDetail *types.Struct for _, detail := range details { if detail.Id == typeId { diff --git a/core/api/util/util.go b/core/api/util/util.go index c3c9f37bc..d6460c243 100644 --- a/core/api/util/util.go +++ b/core/api/util/util.go @@ -94,17 +94,33 @@ func ResolveUniqueKeyToTypeId(mw service.ClientCommandsServer, spaceId string, u Keys: []string{bundle.RelationKeyId.String()}, }) - if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { - return "", ErrFailedSearchType - } + if resp.Error != nil { + if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + return "", ErrFailedSearchType + } - if len(resp.Records) == 0 { - return "", ErrorTypeNotFound + if len(resp.Records) == 0 { + return "", ErrorTypeNotFound + } } return resp.Records[0].Fields[bundle.RelationKeyId.String()].GetStringValue(), nil } +// ResolveIdtoUniqueKey resolves the type's ID to the unique key +func ResolveIdtoUniqueKey(mw service.ClientCommandsServer, spaceId string, typeId string) (uniqueKey string, err error) { + resp := mw.ObjectShow(context.Background(), &pb.RpcObjectShowRequest{ + SpaceId: spaceId, + ObjectId: typeId, + }) + + if resp.Error != nil && resp.Error.Code != pb.RpcObjectShowResponseError_NULL { + return "", ErrorTypeNotFound + } + + return resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyUniqueKey.String()].GetStringValue(), nil +} + // ResolveRelationKeyToPropertyName resolves the property key to the property's name func ResolveRelationKeyToPropertyName(mw service.ClientCommandsServer, spaceId string, relationKey string) (property string, err error) { resp := mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ From ea47186bd1b95f90d16b4f2479df524d7eeb9788 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 25 Mar 2025 13:44:31 +0100 Subject: [PATCH 076/132] GO-4459: Fix list tests --- core/api/internal/list/service_test.go | 112 +++++++++++++++++++++---- 1 file changed, 97 insertions(+), 15 deletions(-) diff --git a/core/api/internal/list/service_test.go b/core/api/internal/list/service_test.go index d7c0cedbc..a2aeddc73 100644 --- a/core/api/internal/list/service_test.go +++ b/core/api/internal/list/service_test.go @@ -18,11 +18,14 @@ import ( ) const ( - mockedSpaceId = "mocked-space-id" - mockedListId = "mocked-list-id" - mockedViewId = "view-1" - offset = 0 - limit = 100 + mockedSpaceId = "mocked-space-id" + mockedListId = "mocked-list-id" + mockedTypeId = "mocked-type-id" + mockedSetOfTypeId = "mocked-set-of-type-id" + mockedUniueKey = "mocked-unique-key" + mockedViewId = "view-1" + offset = 0 + limit = 100 ) type fixture struct { @@ -74,7 +77,7 @@ func TestListService_GetObjectsInList(t *testing.T) { Filters: filters, } - // Expect the ObjectShow call for the list to return a block with a dataview. + // Expect the ObjectShow call for the list to return the type in the details and dataview block. fx.mwMock. On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ SpaceId: mockedSpaceId, @@ -83,6 +86,25 @@ func TestListService_GetObjectsInList(t *testing.T) { Return(&pb.RpcObjectShowResponse{ Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, ObjectView: &model.ObjectView{ + Details: []*model.ObjectViewDetailsSet{ + { + Id: mockedListId, + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyType.String(): pbtypes.String(mockedTypeId), + bundle.RelationKeySetOf.String(): pbtypes.StringList([]string{mockedSetOfTypeId}), + }, + }, + }, + { + Id: mockedTypeId, + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyRecommendedLayout.String(): pbtypes.Int64(int64(model.ObjectType_set)), + }, + }, + }, + }, Blocks: []*model.Block{ { Id: "dataview", @@ -96,16 +118,38 @@ func TestListService_GetObjectsInList(t *testing.T) { }, }, nil).Once() + // Expect the ObjectShow to return the type's unique key. + fx.mwMock. + On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedSetOfTypeId, + }). + Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + Details: []*model.ObjectViewDetailsSet{ + { + Id: mockedSetOfTypeId, + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyUniqueKey.String(): pbtypes.String(mockedUniueKey), + }, + }, + }, + }, + }, + }, nil).Once() + // Expect the ObjectSearchSubscribe call to return one record. fx.mwMock. On("ObjectSearchSubscribe", mock.Anything, &pb.RpcObjectSearchSubscribeRequest{ - SpaceId: mockedSpaceId, - Limit: int64(limit), - Offset: int64(offset), - Keys: []string{bundle.RelationKeyId.String()}, - CollectionId: mockedListId, - Sorts: sorts, - Filters: filters, + SpaceId: mockedSpaceId, + Limit: int64(limit), + Offset: int64(offset), + Keys: []string{bundle.RelationKeyId.String()}, + Sorts: sorts, + Filters: filters, + Source: []string{mockedUniueKey}, }). Return(&pb.RpcObjectSearchSubscribeResponse{ Error: &pb.RpcObjectSearchSubscribeResponseError{Code: pb.RpcObjectSearchSubscribeResponseError_NULL}, @@ -295,6 +339,25 @@ func TestListService_GetObjectsInList(t *testing.T) { Return(&pb.RpcObjectShowResponse{ Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, ObjectView: &model.ObjectView{ + Details: []*model.ObjectViewDetailsSet{ + { + Id: mockedListId, + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyType.String(): pbtypes.String(mockedTypeId), + bundle.RelationKeySetOf.String(): pbtypes.StringList([]string{mockedSetOfTypeId}), + }, + }, + }, + { + Id: mockedTypeId, + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyRecommendedLayout.String(): pbtypes.Int64(int64(model.ObjectType_collection)), + }, + }, + }, + }, Blocks: []*model.Block{ { Id: "dataview", @@ -315,9 +378,9 @@ func TestListService_GetObjectsInList(t *testing.T) { Limit: int64(limit), Offset: int64(offset), Keys: []string{bundle.RelationKeyId.String()}, - CollectionId: mockedListId, Sorts: sorts, Filters: filters, + CollectionId: mockedListId, }). Return(&pb.RpcObjectSearchSubscribeResponse{ Error: &pb.RpcObjectSearchSubscribeResponseError{Code: pb.RpcObjectSearchSubscribeResponseError_UNKNOWN_ERROR}, @@ -351,6 +414,25 @@ func TestListService_GetObjectsInList(t *testing.T) { Return(&pb.RpcObjectShowResponse{ Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, ObjectView: &model.ObjectView{ + Details: []*model.ObjectViewDetailsSet{ + { + Id: mockedListId, + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyType.String(): pbtypes.String(mockedTypeId), + bundle.RelationKeySetOf.String(): pbtypes.StringList([]string{mockedSetOfTypeId}), + }, + }, + }, + { + Id: mockedTypeId, + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyRecommendedLayout.String(): pbtypes.Int64(int64(model.ObjectType_collection)), + }, + }, + }, + }, Blocks: []*model.Block{ { Id: "dataview", @@ -370,9 +452,9 @@ func TestListService_GetObjectsInList(t *testing.T) { Limit: int64(limit), Offset: int64(offset), Keys: []string{bundle.RelationKeyId.String()}, - CollectionId: mockedListId, Sorts: sorts, Filters: filters, + CollectionId: mockedListId, }). Return(&pb.RpcObjectSearchSubscribeResponse{ Error: &pb.RpcObjectSearchSubscribeResponseError{Code: pb.RpcObjectSearchSubscribeResponseError_NULL}, From 18206b6ecbb8e396b4d4a7574c018adadcda0e11 Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Tue, 25 Mar 2025 15:13:01 +0100 Subject: [PATCH 077/132] GO-5364 internal API to export the single object into markdown into a byte slice --- core/block/export/export.go | 49 +++++++++++++++++++++++++++++++++++-- core/block/export/writer.go | 43 ++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 2 deletions(-) diff --git a/core/block/export/export.go b/core/block/export/export.go index 9c34bf8ec..eed8135a5 100644 --- a/core/block/export/export.go +++ b/core/block/export/export.go @@ -69,6 +69,7 @@ var log = logging.Logger("anytype-mw-export") type Export interface { Export(ctx context.Context, req pb.RpcObjectListExportRequest) (path string, succeed int, err error) + ExportInMemory(ctx context.Context, spaceId string, objectIds []string, format model.ExportFormat, includeRelations bool) (res map[string][]byte, err error) app.Component } @@ -114,10 +115,32 @@ func (e *export) Export(ctx context.Context, req pb.RpcObjectListExportRequest) if err = queue.Start(); err != nil { return } - exportCtx := newExportContext(e, req) + exportCtx := NewExportContext(e, req) return exportCtx.exportObjects(ctx, queue) } +func (e *export) ExportInMemory(ctx context.Context, spaceId string, objectIds []string, format model.ExportFormat, includeRelations bool) (res map[string][]byte, err error) { + req := pb.RpcObjectListExportRequest{ + SpaceId: spaceId, + ObjectIds: objectIds, + IncludeFiles: false, + Format: format, + IncludeNested: true, + } + + res = make(map[string][]byte) + exportCtx := NewExportContext(e, req) + for _, objectId := range objectIds { + b, err := exportCtx.exportObject(ctx, objectId) + if err != nil { + return nil, err + } + res[objectId] = b + } + + return res, nil +} + func (e *export) finishWithNotification(spaceId string, exportFormat model.ExportFormat, queue process.Queue, err error) { errCode := model.NotificationExport_NULL if err != nil { @@ -172,7 +195,7 @@ type exportContext struct { *export } -func newExportContext(e *export, req pb.RpcObjectListExportRequest) *exportContext { +func NewExportContext(e *export, req pb.RpcObjectListExportRequest) *exportContext { ec := &exportContext{ path: req.Path, spaceId: req.SpaceId, @@ -224,6 +247,28 @@ func (e *exportContext) getStateFilters(id string) *state.Filters { return nil } +// exportObject synchronously exports a single object and return the bytes slice +func (e *exportContext) exportObject(ctx context.Context, objectId string) ([]byte, error) { + e.reqIds = []string{objectId} + e.includeArchive = true + err := e.docsForExport(ctx) + if err != nil { + return nil, err + } + + inMemoryWriter := &InMemoryWriter{} + err = e.writeDoc(ctx, inMemoryWriter, objectId, e.docs.transformToDetailsMap()) + if err != nil { + return nil, err + } + + for _, v := range inMemoryWriter.data { + return v, nil + } + + return nil, fmt.Errorf("failed to find data in writer") +} + func (e *exportContext) exportObjects(ctx context.Context, queue process.Queue) (string, int, error) { var ( err error diff --git a/core/block/export/writer.go b/core/block/export/writer.go index cc89bbb25..034f11ed8 100644 --- a/core/block/export/writer.go +++ b/core/block/export/writer.go @@ -149,3 +149,46 @@ func (d *zipWriter) Close() (err error) { func getZipName(path string) string { return filepath.Join(path, uniqName()+".zip") } + +type InMemoryWriter struct { + data map[string][]byte + fn *namer + m sync.Mutex +} + +func (d *InMemoryWriter) Namer() *namer { + d.m.Lock() + defer d.m.Unlock() + if d.fn == nil { + d.fn = newNamer() + } + return d.fn +} + +func (d *InMemoryWriter) Path() string { + return "" +} + +func (d *InMemoryWriter) WriteFile(filename string, r io.Reader, lastModifiedDate int64) (err error) { + d.m.Lock() + defer d.m.Unlock() + if d.data == nil { + d.data = make(map[string][]byte) + } + b, err := io.ReadAll(r) + if err != nil { + return + } + d.data[filename] = b + return +} + +func (d *InMemoryWriter) Close() (err error) { + return nil +} + +func (d *InMemoryWriter) GetData(id string) []byte { + d.m.Lock() + defer d.m.Unlock() + return d.data[id] +} From 9cc41e1be57dc768d0ab598c56b9cecbef289e0a Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 25 Mar 2025 16:20:52 +0100 Subject: [PATCH 078/132] GO-4459: Refactor list views into separate endpoint --- core/api/docs/docs.go | 4 +- core/api/docs/swagger.json | 4 +- core/api/docs/swagger.yaml | 236 ++++++++++++++++++---------- core/api/internal/list/handler.go | 43 ++++- core/api/internal/list/model.go | 24 +++ core/api/internal/list/service.go | 78 +++++++++ core/api/internal/object/model.go | 28 ---- core/api/internal/object/service.go | 52 +----- core/api/server/router.go | 1 + 9 files changed, 300 insertions(+), 170 deletions(-) create mode 100644 core/api/internal/list/model.go diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index abeb29d1c..ac3dbaf0a 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -6,10 +6,10 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (query or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list. View IDs can be obtained from the block entry with ID \"dataview\" when retrieving the list object.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (query or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list. View IDs can be obtained from the block entry with ID \"dataview\" when retrieving the list object.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 8d71916fc..567351214 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,8 +1,8 @@ { - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"dataview":{"$ref":"#/components/schemas/object.Dataview"},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.Dataview":{"description":"The dataview, applicable for list objects","properties":{"views":{"description":"The list of views","items":{"$ref":"#/components/schemas/object.View"},"type":"array","uniqueItems":false}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/object.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/object.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (query or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list. View IDs can be obtained from the block entry with ID \"dataview\" when retrieving the list object.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (query or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list. View IDs can be obtained from the block entry with ID \"dataview\" when retrieving the list object.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index b9f520b14..67bf0dfd9 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -26,6 +26,78 @@ components: example: /path/to/export type: string type: object + list.Filter: + properties: + condition: + description: The filter condition + example: contains + type: string + format: + description: The format of the property used for filtering + example: text + type: string + id: + description: The id of the filter + example: 67bf3f21cda9134102e2422c + type: string + property_key: + description: The property key used for filtering + example: name + type: string + value: + description: The value used for filtering + example: Some value... + type: string + type: object + list.Sort: + properties: + format: + description: The format of the property used for sorting + example: text + type: string + id: + description: The id of the sort + example: 67bf3f21cda9134102e2422c + type: string + property_key: + description: The property key used for sorting + example: name + type: string + sort_type: + description: The sort direction + example: asc + type: string + type: object + list.View: + properties: + filters: + description: The list of filters + items: + $ref: '#/components/schemas/list.Filter' + type: array + uniqueItems: false + id: + description: The id of the view + example: 67bf3f21cda9134102e2422c + type: string + layout: + description: The layout of the view + enum: + - grid + - table + example: grid + type: string + name: + description: The name of the view + example: All + type: string + sorts: + description: The list of sorts + items: + $ref: '#/components/schemas/list.Sort' + type: array + uniqueItems: false + type: object object.Block: properties: align: @@ -49,8 +121,6 @@ components: type: string type: array uniqueItems: false - dataview: - $ref: '#/components/schemas/object.Dataview' file: $ref: '#/components/schemas/object.File' id: @@ -99,16 +169,6 @@ components: example: ot-page type: string type: object - object.Dataview: - description: The dataview, applicable for list objects - properties: - views: - description: The list of views - items: - $ref: '#/components/schemas/object.View' - type: array - uniqueItems: false - type: object object.File: description: The file of the block, if applicable properties: @@ -140,29 +200,6 @@ components: description: The type of the file type: string type: object - object.Filter: - properties: - condition: - description: The filter condition - example: contains - type: string - format: - description: The format of the property used for filtering - example: text - type: string - id: - description: The id of the filter - example: 67bf3f21cda9134102e2422c - type: string - property_key: - description: The property key used for filtering - example: name - type: string - value: - description: The value used for filtering - example: Some value... - type: string - type: object object.Object: description: The object properties: @@ -297,25 +334,6 @@ components: example: https://example.com type: string type: object - object.Sort: - properties: - format: - description: The format of the property used for sorting - example: text - type: string - id: - description: The id of the sort - example: 67bf3f21cda9134102e2422c - type: string - property_key: - description: The property key used for sorting - example: name - type: string - sort_type: - description: The sort direction - example: asc - type: string - type: object object.Tag: description: The select value, if applicable properties: @@ -432,35 +450,16 @@ components: type: $ref: '#/components/schemas/object.Type' type: object - object.View: + pagination.PaginatedResponse-list_View: properties: - filters: - description: The list of filters + data: + description: The list of items in the current result set items: - $ref: '#/components/schemas/object.Filter' - type: array - uniqueItems: false - id: - description: The id of the view - example: 67bf3f21cda9134102e2422c - type: string - layout: - description: The layout of the view - enum: - - grid - - table - example: grid - type: string - name: - description: The name of the view - example: All - type: string - sorts: - description: The list of sorts - items: - $ref: '#/components/schemas/object.Sort' + $ref: '#/components/schemas/list.View' type: array uniqueItems: false + pagination: + $ref: '#/components/schemas/pagination.PaginationMeta' type: object pagination.PaginatedResponse-object_Object: properties: @@ -1174,9 +1173,9 @@ paths: - lists /spaces/{space_id}/lists/{list_id}/objects: post: - description: Enables clients to add one or more objects to a specific list by - submitting a JSON array of object IDs. Upon success, the endpoint returns - a confirmation message. This endpoint is vital for building user interfaces + description: Enables clients to add one or more objects to a specific list (collection + only) by submitting a JSON array of object IDs. Upon success, the endpoint + returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections. parameters: - description: Space ID @@ -1238,11 +1237,11 @@ paths: - lists /spaces/{space_id}/lists/{list_id}/objects/{object_id}: delete: - description: Removes a given object from the specified list in a space. The - endpoint takes the space, list, and object identifiers as path parameters. - It's subject to rate limiting and returns a success message on completion. - It is used for dynamically managing collections without affecting the underlying - object data. + description: Removes a given object from the specified list (collection only) + in a space. The endpoint takes the space, list, and object identifiers as + path parameters. It's subject to rate limiting and returns a success message + on completion. It is used for dynamically managing collections without affecting + the underlying object data. parameters: - description: Space ID in: path @@ -1298,6 +1297,69 @@ paths: summary: Remove object from list tags: - lists + /spaces/{space_id}/lists/{list_id}/views: + get: + description: Returns a paginated list of views defined for a specific list (query + or collection) within a space. Each view includes configuration details such + as layout, applied filters, and sorting options, enabling clients to render + the list according to user preferences and context. This endpoint supports + pagination parameters to control the number of views returned and the starting + point of the result set. + parameters: + - description: Space ID + in: path + name: space_id + required: true + schema: + type: string + - description: List ID + in: path + name: list_id + required: true + schema: + type: string + - description: The number of items to skip before starting to collect the result + set + in: query + name: offset + schema: + default: 0 + type: integer + - description: The number of items to return + in: query + name: limit + schema: + type: integer + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/pagination.PaginatedResponse-list_View' + description: List of views + "401": + content: + application/json: + schema: + $ref: '#/components/schemas/util.UnauthorizedError' + description: Unauthorized + "404": + content: + application/json: + schema: + $ref: '#/components/schemas/util.NotFoundError' + description: Not found + "500": + content: + application/json: + schema: + $ref: '#/components/schemas/util.ServerError' + description: Internal server error + security: + - bearerauth: [] + summary: Get list views + tags: + - lists /spaces/{space_id}/members: get: description: Returns a paginated list of members belonging to the specified diff --git a/core/api/internal/list/handler.go b/core/api/internal/list/handler.go index 8ce726fd3..fcf15278c 100644 --- a/core/api/internal/list/handler.go +++ b/core/api/internal/list/handler.go @@ -9,6 +9,45 @@ import ( "github.com/anyproto/anytype-heart/core/api/util" ) +// GetListViewsHandler +// +// @Summary Get list views +// @Description Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set. +// @Tags lists +// @Produce json +// @Param space_id path string true "Space ID" +// @Param list_id path string true "List ID" +// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) +// @Param limit query int false "The number of items to return" +// @Success 200 {object} pagination.PaginatedResponse[View] "List of views" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Not found" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Security bearerauth +// @Router /spaces/{space_id}/lists/{list_id}/views [get] +func GetListViewsHandler(s *ListService) gin.HandlerFunc { + return func(c *gin.Context) { + spaceId := c.Param("space_id") + listId := c.Param("list_id") + offset := c.GetInt("offset") + limit := c.GetInt("limit") + + views, total, hasMore, err := s.GetListViews(c, spaceId, listId, offset, limit) + code := util.MapErrorCode(err, + util.ErrToCode(ErrFailedGetList, http.StatusNotFound), + util.ErrToCode(ErrFailedGetListDataview, http.StatusInternalServerError), + ) + + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) + return + } + + pagination.RespondWithPagination(c, http.StatusOK, views, total, offset, limit, hasMore) + } +} + // GetObjectsInListHandler // // @Summary Get objects in list @@ -57,7 +96,7 @@ func GetObjectsInListHandler(s *ListService) gin.HandlerFunc { // AddObjectsToListHandler // // @Summary Add objects to list -// @Description Enables clients to add one or more objects to a specific list by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections. +// @Description Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections. // @Tags lists // @Accept json // @Produce json @@ -101,7 +140,7 @@ func AddObjectsToListHandler(s *ListService) gin.HandlerFunc { // RemoveObjectFromListHandler // // @Summary Remove object from list -// @Description Removes a given object from the specified list in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data. +// @Description Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data. // @Tags lists // @Produce json // @Param space_id path string true "Space ID" diff --git a/core/api/internal/list/model.go b/core/api/internal/list/model.go new file mode 100644 index 000000000..e47d72cc5 --- /dev/null +++ b/core/api/internal/list/model.go @@ -0,0 +1,24 @@ +package list + +type View struct { + Id string `json:"id" example:"67bf3f21cda9134102e2422c"` // The id of the view + Name string `json:"name" example:"All"` // The name of the view + Layout string `json:"layout" example:"grid" enums:"grid,table"` // The layout of the view + Filters []Filter `json:"filters"` // The list of filters + Sorts []Sort `json:"sorts"` // The list of sorts +} + +type Filter struct { + Id string `json:"id" example:"67bf3f21cda9134102e2422c"` // The id of the filter + PropertyKey string `json:"property_key" example:"name"` // The property key used for filtering + Format string `json:"format" example:"text" enum:"text,number,select,multi_select,date,file,checkbox,url,email,phone,object"` // The format of the property used for filtering + Condition string `json:"condition" example:"contains" enum:"equal,not_equal,greater,less,greater_or_equal,less_or_equal,like,not_like,in,not_in,empty,not_empty,all_in,not_all_in,exact_in,not_exact_in,exists"` // The filter condition + Value string `json:"value" example:"Some value..."` // The value used for filtering +} + +type Sort struct { + Id string `json:"id" example:"67bf3f21cda9134102e2422c"` // The id of the sort + PropertyKey string `json:"property_key" example:"name"` // The property key used for sorting + Format string `json:"format" example:"text" enum:"text,number,select,multi_select,date,file,checkbox,url,email,phone,object"` // The format of the property used for sorting + SortType string `json:"sort_type" example:"asc" enum:"asc,desc,custom"` // The sort direction +} diff --git a/core/api/internal/list/service.go b/core/api/internal/list/service.go index cfa175b7a..bd5f3e295 100644 --- a/core/api/internal/list/service.go +++ b/core/api/internal/list/service.go @@ -4,6 +4,8 @@ import ( "context" "errors" + "github.com/iancoleman/strcase" + "github.com/anyproto/anytype-heart/core/api/internal/object" "github.com/anyproto/anytype-heart/core/api/pagination" "github.com/anyproto/anytype-heart/core/api/util" @@ -24,6 +26,7 @@ var ( ) type Service interface { + GetListViews(ctx context.Context, spaceId string, listId string, offset, limit int) ([]View, int, bool, error) GetObjectsInList(ctx context.Context, spaceId string, listId string, viewId string, offset, limit int) ([]object.Object, int, bool, error) AddObjectsToList(ctx context.Context, spaceId string, listId string, objectIds []string) error RemoveObjectsFromList(ctx context.Context, spaceId string, listId string, objectIds []string) error @@ -38,6 +41,71 @@ func NewService(mw service.ClientCommandsServer, objectService *object.ObjectSer return &ListService{mw: mw, objectService: objectService} } +// GetListViews retrieves views of a list +func (s *ListService) GetListViews(ctx context.Context, spaceId string, listId string, offset, limit int) ([]View, int, bool, error) { + resp := s.mw.ObjectShow(ctx, &pb.RpcObjectShowRequest{ + SpaceId: spaceId, + ObjectId: listId, + }) + + if resp.Error != nil && resp.Error.Code != pb.RpcObjectShowResponseError_NULL { + return nil, 0, false, ErrFailedGetList + } + + var dataviewBlock *model.Block + for _, block := range resp.ObjectView.Blocks { + if block.Id == "dataview" { + dataviewBlock = block + break + } + } + + if dataviewBlock == nil { + return nil, 0, false, ErrFailedGetListDataview + } + + var views []View + switch content := dataviewBlock.Content.(type) { + case *model.BlockContentOfDataview: + for _, view := range content.Dataview.Views { + var filters []Filter + for _, f := range view.Filters { + filters = append(filters, Filter{ + Id: f.Id, + PropertyKey: f.RelationKey, + Format: s.objectService.MapRelationFormat(f.Format), + Condition: strcase.ToSnake(model.BlockContentDataviewFilterCondition_name[int32(f.Condition)]), + Value: f.Value.GetStringValue(), + }) + } + var sorts []Sort + for _, srt := range view.Sorts { + sorts = append(sorts, Sort{ + Id: srt.Id, + PropertyKey: srt.RelationKey, + Format: s.objectService.MapRelationFormat(srt.Format), + SortType: strcase.ToSnake(model.BlockContentDataviewSortType_name[int32(srt.Type)]), + }) + + views = append(views, View{ + Id: view.Id, + Name: view.Name, + Layout: s.mapDataviewTypeName(view.Type), + Filters: filters, + Sorts: sorts, + }) + } + } + default: + return nil, 0, false, ErrFailedGetListDataview + } + + total := len(views) + paginatedViews, hasMore := pagination.Paginate(views, offset, limit) + + return paginatedViews, total, hasMore, nil +} + // GetObjectsInList retrieves objects in a list func (s *ListService) GetObjectsInList(ctx context.Context, spaceId string, listId string, viewId string, offset, limit int) ([]object.Object, int, bool, error) { resp := s.mw.ObjectShow(ctx, &pb.RpcObjectShowRequest{ @@ -170,3 +238,13 @@ func (s *ListService) RemoveObjectsFromList(ctx context.Context, spaceId string, return nil } + +// mapDataviewTypeName maps the dataview type to a string. +func (s *ListService) mapDataviewTypeName(dataviewType model.BlockContentDataviewViewType) string { + switch dataviewType { + case model.BlockContentDataviewView_Table: + return "grid" + default: + return strcase.ToSnake(model.BlockContentDataviewViewType_name[int32(dataviewType)]) + } +} diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index a864d48ac..40783fa74 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -39,7 +39,6 @@ type Block struct { Text *Text `json:"text,omitempty"` // The text of the block, if applicable File *File `json:"file,omitempty"` // The file of the block, if applicable Property *Property `json:"property,omitempty"` // The property block, if applicable - Dataview *Dataview `json:"dataview,omitempty"` // The dataview, applicable for list objects } type Text struct { @@ -62,33 +61,6 @@ type File struct { Style string `json:"style"` // The style of the file } -type Dataview struct { - Views []View `json:"views"` // The list of views -} - -type View struct { - Id string `json:"id" example:"67bf3f21cda9134102e2422c"` // The id of the view - Name string `json:"name" example:"All"` // The name of the view - Layout string `json:"layout" example:"grid" enums:"grid,table"` // The layout of the view - Filters []Filter `json:"filters"` // The list of filters - Sorts []Sort `json:"sorts"` // The list of sorts -} - -type Filter struct { - Id string `json:"id" example:"67bf3f21cda9134102e2422c"` // The id of the filter - PropertyKey string `json:"property_key" example:"name"` // The property key used for filtering - Format string `json:"format" example:"text" enum:"text,number,select,multi_select,date,file,checkbox,url,email,phone,object"` // The format of the property used for filtering - Condition string `json:"condition" example:"contains" enum:"equal,not_equal,greater,less,greater_or_equal,less_or_equal,like,not_like,in,not_in,empty,not_empty,all_in,not_all_in,exact_in,not_exact_in,exists"` // The filter condition - Value string `json:"value" example:"Some value..."` // The value used for filtering -} - -type Sort struct { - Id string `json:"id" example:"67bf3f21cda9134102e2422c"` // The id of the sort - PropertyKey string `json:"property_key" example:"name"` // The property key used for sorting - Format string `json:"format" example:"text" enum:"text,number,select,multi_select,date,file,checkbox,url,email,phone,object"` // The format of the property used for sorting - SortType string `json:"sort_type" example:"asc" enum:"asc,desc,custom"` // The sort direction -} - type Property struct { Id string `json:"id" example:"last_modified_date"` // The id of the property Name string `json:"name" example:"Last modified date"` // The name of the property diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index d5cf23d08..8bbc608ba 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -770,7 +770,7 @@ func (s *ObjectService) convertValue(key string, value *types.Value, format stri func (s *ObjectService) getPropertyFormatMap(propertyLinks []*model.RelationLink) map[string]string { propertyFormatToName := make(map[int32]string, len(model.RelationFormat_name)) for k := range model.RelationFormat_name { - propertyFormatToName[k] = s.mapRelationFormat(model.RelationFormat(k)) + propertyFormatToName[k] = s.MapRelationFormat(model.RelationFormat(k)) } propertyFormatMap := map[string]string{} @@ -836,7 +836,6 @@ func (s *ObjectService) getBlocks(resp *pb.RpcObjectShowResponse) []Block { var text *Text var file *File var property *Property - var dataviewMapping *Dataview switch content := block.Content.(type) { case *model.BlockContentOfText: @@ -864,40 +863,6 @@ func (s *ObjectService) getBlocks(resp *pb.RpcObjectShowResponse) []Block { // TODO: is it sufficient to return the id only? Id: content.Relation.Key, } - case *model.BlockContentOfDataview: - var viewList []View - for _, v := range content.Dataview.Views { - var filters []Filter - for _, f := range v.Filters { - filters = append(filters, Filter{ - Id: f.Id, - PropertyKey: f.RelationKey, - Format: s.mapRelationFormat(f.Format), - Condition: strcase.ToSnake(model.BlockContentDataviewFilterCondition_name[int32(f.Condition)]), - Value: f.Value.GetStringValue(), - }) - } - var sorts []Sort - for _, srt := range v.Sorts { - sorts = append(sorts, Sort{ - Id: srt.Id, - PropertyKey: srt.RelationKey, - Format: s.mapRelationFormat(srt.Format), - SortType: strcase.ToSnake(model.BlockContentDataviewSortType_name[int32(srt.Type)]), - }) - } - viewList = append(viewList, View{ - Id: v.Id, - Name: v.Name, - Layout: s.mapDataviewTypeName(v.Type), - Filters: filters, - Sorts: sorts, - }) - } - dataviewMapping = &Dataview{ - Views: viewList, - } - } // TODO: other content types? @@ -910,15 +875,14 @@ func (s *ObjectService) getBlocks(resp *pb.RpcObjectShowResponse) []Block { Text: text, File: file, Property: property, - Dataview: dataviewMapping, }) } return blocks } -// mapRelationFormat maps the relation format to a string. -func (s *ObjectService) mapRelationFormat(format model.RelationFormat) string { +// MapRelationFormat maps the relation format to a string. +func (s *ObjectService) MapRelationFormat(format model.RelationFormat) string { switch format { case model.RelationFormat_longtext: return "text" @@ -932,13 +896,3 @@ func (s *ObjectService) mapRelationFormat(format model.RelationFormat) string { return strcase.ToSnake(model.RelationFormat_name[int32(format)]) } } - -// mapDataviewTypeName maps the dataview type to a string. -func (s *ObjectService) mapDataviewTypeName(dataviewType model.BlockContentDataviewViewType) string { - switch dataviewType { - case model.BlockContentDataviewView_Table: - return "grid" - default: - return strcase.ToSnake(model.BlockContentDataviewViewType_name[int32(dataviewType)]) - } -} diff --git a/core/api/server/router.go b/core/api/server/router.go index 7dc888a84..bc04565fd 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -69,6 +69,7 @@ func (s *Server) NewRouter(accountService account.Service, mw service.ClientComm v1.POST("/spaces/:space_id/objects/:object_id/export/:format", export.GetObjectExportHandler(s.exportService)) // List + v1.GET("/spaces/:space_id/lists/:list_id/views", list.GetListViewsHandler(s.listService)) v1.GET("/spaces/:space_id/lists/:list_id/:view_id/objects", list.GetObjectsInListHandler(s.listService)) v1.POST("/spaces/:space_id/lists/:list_id/objects", list.AddObjectsToListHandler(s.listService)) v1.DELETE("/spaces/:space_id/lists/:list_id/objects/:object_id", s.rateLimit(maxWriteRequestsPerSecond), list.RemoveObjectFromListHandler(s.listService)) From 12a688b8124f1383007c376cf28f9c7c1bf45a9f Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 25 Mar 2025 16:21:14 +0100 Subject: [PATCH 079/132] GO-4459: Fix pagination for GetObjectsInList --- core/api/internal/list/service.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/api/internal/list/service.go b/core/api/internal/list/service.go index bd5f3e295..6948bc5fc 100644 --- a/core/api/internal/list/service.go +++ b/core/api/internal/list/service.go @@ -197,10 +197,10 @@ func (s *ListService) GetObjectsInList(ctx context.Context, spaceId string, list } total := int(searchResp.Counters.Total) - paginatedRecords, hasMore := pagination.Paginate(searchResp.Records, offset, limit) + hasMore := searchResp.Counters.Total > int64(offset+limit) - objects := make([]object.Object, 0, len(paginatedRecords)) - for _, record := range paginatedRecords { + objects := make([]object.Object, 0, len(searchResp.Records)) + for _, record := range searchResp.Records { object, err := s.objectService.GetObject(ctx, spaceId, record.Fields[bundle.RelationKeyId.String()].GetStringValue()) if err != nil { return nil, 0, false, err From fafcf9f8623a4aaf99620dc1e22d2ea92630693d Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 25 Mar 2025 16:33:15 +0100 Subject: [PATCH 080/132] GO-4459: Fix view append and add tests for GetListViews --- core/api/internal/list/service.go | 15 +- core/api/internal/list/service_test.go | 246 ++++++++++++++++++++++++- 2 files changed, 250 insertions(+), 11 deletions(-) diff --git a/core/api/internal/list/service.go b/core/api/internal/list/service.go index 6948bc5fc..78817233c 100644 --- a/core/api/internal/list/service.go +++ b/core/api/internal/list/service.go @@ -86,15 +86,14 @@ func (s *ListService) GetListViews(ctx context.Context, spaceId string, listId s Format: s.objectService.MapRelationFormat(srt.Format), SortType: strcase.ToSnake(model.BlockContentDataviewSortType_name[int32(srt.Type)]), }) - - views = append(views, View{ - Id: view.Id, - Name: view.Name, - Layout: s.mapDataviewTypeName(view.Type), - Filters: filters, - Sorts: sorts, - }) } + views = append(views, View{ + Id: view.Id, + Name: view.Name, + Layout: s.mapDataviewTypeName(view.Type), + Filters: filters, + Sorts: sorts, + }) } default: return nil, 0, false, ErrFailedGetListDataview diff --git a/core/api/internal/list/service_test.go b/core/api/internal/list/service_test.go index a2aeddc73..8ab9e373c 100644 --- a/core/api/internal/list/service_test.go +++ b/core/api/internal/list/service_test.go @@ -22,7 +22,7 @@ const ( mockedListId = "mocked-list-id" mockedTypeId = "mocked-type-id" mockedSetOfTypeId = "mocked-set-of-type-id" - mockedUniueKey = "mocked-unique-key" + mockedUniqueKey = "mocked-unique-key" mockedViewId = "view-1" offset = 0 limit = 100 @@ -50,6 +50,246 @@ func newFixture(t *testing.T) *fixture { } } +func TestListService_GetListViews(t *testing.T) { + ctx := context.Background() + + t.Run("successful", func(t *testing.T) { + fx := newFixture(t) + + // Prepare a view with one sort and one filter + sorts := []*model.BlockContentDataviewSort{ + { + Id: "sort-1", + RelationKey: "dummy-sort", + Type: model.BlockContentDataviewSort_Asc, + }, + } + filters := []*model.BlockContentDataviewFilter{ + { + Id: "filter-1", + RelationKey: "dummy-filter", + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("dummy-value"), + }, + } + view := &model.BlockContentDataviewView{ + Id: "view-1", + Name: "Test View", + Sorts: sorts, + Filters: filters, + Type: model.BlockContentDataviewView_Table, + } + + resp := &pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + Blocks: []*model.Block{ + { + Id: "dataview", + Content: &model.BlockContentOfDataview{ + Dataview: &model.BlockContentDataview{ + Views: []*model.BlockContentDataviewView{view}, + }, + }, + }, + }, + }, + } + + fx.mwMock. + On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedListId, + }). + Return(resp, nil).Once() + + views, total, hasMore, err := fx.GetListViews(ctx, mockedSpaceId, mockedListId, offset, limit) + require.NoError(t, err) + require.Len(t, views, 1) + require.Equal(t, 1, total) + require.False(t, hasMore) + + retView := views[0] + require.Equal(t, "view-1", retView.Id) + require.Equal(t, "Test View", retView.Name) + require.Len(t, retView.Filters, 1) + require.Len(t, retView.Sorts, 1) + }) + + t.Run("object show error", func(t *testing.T) { + fx := newFixture(t) + + fx.mwMock. + On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedListId, + }). + Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_UNKNOWN_ERROR}, + }, nil).Once() + + _, _, _, err := fx.GetListViews(ctx, mockedSpaceId, mockedListId, offset, limit) + require.ErrorIs(t, err, ErrFailedGetList) + }) + + t.Run("no dataview block", func(t *testing.T) { + fx := newFixture(t) + + fx.mwMock. + On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedListId, + }). + Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + Blocks: []*model.Block{ + {Id: "non-dataview"}, + }, + }, + }, nil).Once() + + _, _, _, err := fx.GetListViews(ctx, mockedSpaceId, mockedListId, offset, limit) + require.ErrorIs(t, err, ErrFailedGetListDataview) + }) + + t.Run("invalid dataview content", func(t *testing.T) { + fx := newFixture(t) + + fx.mwMock. + On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedListId, + }). + Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + Blocks: []*model.Block{ + {Id: "dataview", Content: nil}, + }, + }, + }, nil).Once() + + _, _, _, err := fx.GetListViews(ctx, mockedSpaceId, mockedListId, offset, limit) + require.ErrorIs(t, err, ErrFailedGetListDataview) + }) + + t.Run("view with no sorts", func(t *testing.T) { + fx := newFixture(t) + + // Create a view with filters but no sorts + filters := []*model.BlockContentDataviewFilter{ + { + Id: "filter-1", + RelationKey: "dummy-filter", + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("dummy-value"), + }, + } + view := &model.BlockContentDataviewView{ + Id: "view-2", + Name: "No Sort View", + Sorts: []*model.BlockContentDataviewSort{}, + Filters: filters, + Type: model.BlockContentDataviewView_Table, + } + + resp := &pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + Blocks: []*model.Block{ + { + Id: "dataview", + Content: &model.BlockContentOfDataview{ + Dataview: &model.BlockContentDataview{ + Views: []*model.BlockContentDataviewView{view}, + }, + }, + }, + }, + }, + } + + fx.mwMock. + On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedListId, + }). + Return(resp, nil).Once() + + views, total, hasMore, err := fx.GetListViews(ctx, mockedSpaceId, mockedListId, offset, limit) + require.NoError(t, err) + require.Len(t, views, 1) + require.Equal(t, 1, total) + require.False(t, hasMore) + }) + + t.Run("view with multiple sorts", func(t *testing.T) { + fx := newFixture(t) + + // Create a view with 2 sorts + sorts := []*model.BlockContentDataviewSort{ + { + Id: "sort-1", + RelationKey: "dummy-sort", + Type: model.BlockContentDataviewSort_Asc, + }, + { + Id: "sort-2", + RelationKey: "dummy-sort2", + Type: model.BlockContentDataviewSort_Desc, + }, + } + filters := []*model.BlockContentDataviewFilter{ + { + Id: "filter-1", + RelationKey: "dummy-filter", + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("dummy-value"), + }, + } + view := &model.BlockContentDataviewView{ + Id: "view-3", + Name: "Multi-Sort View", + Sorts: sorts, + Filters: filters, + Type: model.BlockContentDataviewView_Table, + } + + resp := &pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + Blocks: []*model.Block{ + { + Id: "dataview", + Content: &model.BlockContentOfDataview{ + Dataview: &model.BlockContentDataview{ + Views: []*model.BlockContentDataviewView{view}, + }, + }, + }, + }, + }, + } + + fx.mwMock. + On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedListId, + }). + Return(resp, nil).Once() + + views, total, hasMore, err := fx.GetListViews(ctx, mockedSpaceId, mockedListId, offset, limit) + require.NoError(t, err) + require.Len(t, views, 1) + require.Equal(t, 1, total) + require.False(t, hasMore) + + require.Equal(t, "view-3", views[0].Id) + require.Len(t, views[0].Sorts, 2) + }) +} + func TestListService_GetObjectsInList(t *testing.T) { t.Run("successful", func(t *testing.T) { @@ -132,7 +372,7 @@ func TestListService_GetObjectsInList(t *testing.T) { Id: mockedSetOfTypeId, Details: &types.Struct{ Fields: map[string]*types.Value{ - bundle.RelationKeyUniqueKey.String(): pbtypes.String(mockedUniueKey), + bundle.RelationKeyUniqueKey.String(): pbtypes.String(mockedUniqueKey), }, }, }, @@ -149,7 +389,7 @@ func TestListService_GetObjectsInList(t *testing.T) { Keys: []string{bundle.RelationKeyId.String()}, Sorts: sorts, Filters: filters, - Source: []string{mockedUniueKey}, + Source: []string{mockedUniqueKey}, }). Return(&pb.RpcObjectSearchSubscribeResponse{ Error: &pb.RpcObjectSearchSubscribeResponseError{Code: pb.RpcObjectSearchSubscribeResponseError_NULL}, From 2189444342c17adee08a84450803d4f5d27ac6d3 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 25 Mar 2025 17:15:59 +0100 Subject: [PATCH 081/132] GO-4459: Change logic to no filtering on empty view id for lists --- core/api/docs/docs.go | 2 +- core/api/docs/swagger.json | 2 +- core/api/docs/swagger.yaml | 11 ++++++----- core/api/internal/list/handler.go | 2 +- core/api/internal/list/service.go | 21 ++++++++------------- 5 files changed, 17 insertions(+), 21 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index ac3dbaf0a..afc11bae4 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -9,7 +9,7 @@ const docTemplate = `{ "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (query or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list. View IDs can be obtained from the block entry with ID \"dataview\" when retrieving the list object.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects associated with a specific list (query or collection) within a space. When a view ID is provided, the objects are filtered and sorted according to the view's configuration. If no view ID is specified, all list objects are returned without filtering and sorting. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 567351214..65f2cb126 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -2,7 +2,7 @@ "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects that are associated with a specific list (query or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list. View IDs can be obtained from the block entry with ID \"dataview\" when retrieving the list object.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects associated with a specific list (query or collection) within a space. When a view ID is provided, the objects are filtered and sorted according to the view's configuration. If no view ID is specified, all list objects are returned without filtering and sorting. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 67bf0dfd9..e3a7ad9b5 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -1105,11 +1105,12 @@ paths: - spaces /spaces/{space_id}/lists/{list_id}/{view_id}/objects: get: - description: Returns a paginated list of objects that are associated with a - specific list (query or collection) within a space. This endpoint helps clients - to manage grouped objects (for example, tasks within a list) by returning - detailed object information for each item of the list. View IDs can be obtained - from the block entry with ID "dataview" when retrieving the list object. + description: Returns a paginated list of objects associated with a specific + list (query or collection) within a space. When a view ID is provided, the + objects are filtered and sorted according to the view's configuration. If + no view ID is specified, all list objects are returned without filtering and + sorting. This endpoint helps clients to manage grouped objects (for example, + tasks within a list) by returning information for each item of the list. parameters: - description: Space ID in: path diff --git a/core/api/internal/list/handler.go b/core/api/internal/list/handler.go index fcf15278c..a56841e28 100644 --- a/core/api/internal/list/handler.go +++ b/core/api/internal/list/handler.go @@ -51,7 +51,7 @@ func GetListViewsHandler(s *ListService) gin.HandlerFunc { // GetObjectsInListHandler // // @Summary Get objects in list -// @Description Returns a paginated list of objects that are associated with a specific list (query or collection) within a space. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning detailed object information for each item of the list. View IDs can be obtained from the block entry with ID "dataview" when retrieving the list object. +// @Description Returns a paginated list of objects associated with a specific list (query or collection) within a space. When a view ID is provided, the objects are filtered and sorted according to the view's configuration. If no view ID is specified, all list objects are returned without filtering and sorting. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning information for each item of the list. // @Tags lists // @Produce json // @Param space_id path string true "Space ID" diff --git a/core/api/internal/list/service.go b/core/api/internal/list/service.go index 78817233c..2cc463abe 100644 --- a/core/api/internal/list/service.go +++ b/core/api/internal/list/service.go @@ -133,26 +133,21 @@ func (s *ListService) GetObjectsInList(ctx context.Context, spaceId string, list switch content := dataviewBlock.Content.(type) { case *model.BlockContentOfDataview: - var targetView *model.BlockContentDataviewView - if viewId == "" && len(content.Dataview.Views) > 0 { - // fallback to first view when view id is empty - targetView = content.Dataview.Views[0] - } else if viewId != "" { + // if view not specified: return all objects without filtering and sorting + if viewId != "" { + var targetView *model.BlockContentDataviewView for _, view := range content.Dataview.Views { if view.Id == viewId { targetView = view break } } + if targetView == nil { + return nil, 0, false, ErrFailedGetListDataviewView + } + sorts = targetView.Sorts + filters = targetView.Filters } - - if targetView == nil { - return nil, 0, false, ErrFailedGetListDataviewView - } - - // use the sorts and filters from the selected view - sorts = targetView.Sorts - filters = targetView.Filters default: return nil, 0, false, ErrFailedGetListDataview } From dbd2e3a1b78f0a0c6f63d8eae7e0d2a589e3d2cd Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 25 Mar 2025 17:39:18 +0100 Subject: [PATCH 082/132] GO-4459: Fix list tests --- core/api/internal/list/service_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/api/internal/list/service_test.go b/core/api/internal/list/service_test.go index 8ab9e373c..c688edf49 100644 --- a/core/api/internal/list/service_test.go +++ b/core/api/internal/list/service_test.go @@ -427,7 +427,7 @@ func TestListService_GetObjectsInList(t *testing.T) { }, nil).Once() // when - objects, total, hasMore, err := fx.GetObjectsInList(ctx, mockedSpaceId, mockedListId, "", offset, limit) + objects, total, hasMore, err := fx.GetObjectsInList(ctx, mockedSpaceId, mockedListId, mockedViewId, offset, limit) // then require.NoError(t, err) @@ -627,7 +627,7 @@ func TestListService_GetObjectsInList(t *testing.T) { }, nil).Once() // when - _, _, _, err := fx.GetObjectsInList(ctx, mockedSpaceId, mockedListId, "", offset, limit) + _, _, _, err := fx.GetObjectsInList(ctx, mockedSpaceId, mockedListId, mockedViewId, offset, limit) // then require.ErrorIs(t, err, ErrFailedGetObjectsInList) From 2abbc574d5b3fd83105785cc19d2ff73fca89162 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 25 Mar 2025 17:49:34 +0100 Subject: [PATCH 083/132] GO-4459: Add list test for empty view id --- core/api/internal/list/service_test.go | 126 +++++++++++++++++++++++++ 1 file changed, 126 insertions(+) diff --git a/core/api/internal/list/service_test.go b/core/api/internal/list/service_test.go index c688edf49..cd4295092 100644 --- a/core/api/internal/list/service_test.go +++ b/core/api/internal/list/service_test.go @@ -438,6 +438,132 @@ func TestListService_GetObjectsInList(t *testing.T) { require.Equal(t, "Object One", objects[0].Name) }) + t.Run("successful with empty viewId", func(t *testing.T) { + ctx := context.Background() + fx := newFixture(t) + + // Prepare an ObjectShow response with a dataview block containing a view (which will not be used since viewId is empty) + resp := &pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + Details: []*model.ObjectViewDetailsSet{ + { + Id: mockedListId, + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyType.String(): pbtypes.String(mockedTypeId), + bundle.RelationKeySetOf.String(): pbtypes.StringList([]string{mockedSetOfTypeId}), + }, + }, + }, + { + Id: mockedTypeId, + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyRecommendedLayout.String(): pbtypes.Int64(int64(model.ObjectType_collection)), + }, + }, + }, + }, + Blocks: []*model.Block{ + { + Id: "dataview", + Content: &model.BlockContentOfDataview{ + Dataview: &model.BlockContentDataview{ + Views: []*model.BlockContentDataviewView{ + { + Id: mockedListId, + Sorts: []*model.BlockContentDataviewSort{ + { + Id: "view_sort", + RelationKey: bundle.RelationKeyLastModifiedDate.String(), + Format: model.RelationFormat_date, + Type: model.BlockContentDataviewSort_Asc, + }, + }, + Filters: []*model.BlockContentDataviewFilter{ + { + Id: "view_filter", + RelationKey: bundle.RelationKeyStatus.String(), + Format: model.RelationFormat_longtext, + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("active"), + }, + }, + }, + }, + }, + }, + }, + }, + }, + } + + fx.mwMock. + On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedListId, + }). + Return(resp, nil).Once() + + // Since viewId is empty, sorts and filters should be nil. + fx.mwMock. + On("ObjectSearchSubscribe", mock.Anything, &pb.RpcObjectSearchSubscribeRequest{ + SpaceId: mockedSpaceId, + Limit: int64(limit), + Offset: int64(offset), + Keys: []string{bundle.RelationKeyId.String()}, + Sorts: nil, + Filters: nil, + CollectionId: mockedListId, + }). + Return(&pb.RpcObjectSearchSubscribeResponse{ + Error: &pb.RpcObjectSearchSubscribeResponseError{Code: pb.RpcObjectSearchSubscribeResponseError_NULL}, + Counters: &pb.EventObjectSubscriptionCounters{Total: 1}, + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String("object-1"), + }, + }, + }, + }, nil).Once() + + // Expect the ObjectShow call for "object-1" to return its details. + fx.mwMock. + On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: "object-1", + }). + Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + Details: []*model.ObjectViewDetailsSet{ + { + Id: "object-1", + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String("object-1"), + bundle.RelationKeyName.String(): pbtypes.String("Object One"), + }, + }, + }, + }, + }, + }, nil).Once() + + // when + objects, total, hasMore, err := fx.GetObjectsInList(ctx, mockedSpaceId, mockedListId, "", offset, limit) + + // then + require.NoError(t, err) + require.Len(t, objects, 1) + require.Equal(t, 1, total) + require.False(t, hasMore) + require.Equal(t, "object-1", objects[0].Id) + require.Equal(t, "Object One", objects[0].Name) + }) + t.Run("object show error", func(t *testing.T) { // given ctx := context.Background() From 276efcabb9629cd7078b3b7d23ef1b88a56bd5db Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Tue, 25 Mar 2025 17:57:07 +0100 Subject: [PATCH 084/132] GO-5364 deeplink paths for single object export --- core/block/export/export.go | 23 +++++++--- core/block/export/writer.go | 46 +++++++++++++++---- .../import/markdown/anymark/anyblocks.go | 2 +- pkg/lib/mill/image_resize.go | 8 ++++ 4 files changed, 61 insertions(+), 18 deletions(-) diff --git a/core/block/export/export.go b/core/block/export/export.go index eed8135a5..5d87faff1 100644 --- a/core/block/export/export.go +++ b/core/block/export/export.go @@ -39,6 +39,7 @@ import ( "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock" "github.com/anyproto/anytype-heart/pkg/lib/database" + "github.com/anyproto/anytype-heart/pkg/lib/gateway" "github.com/anyproto/anytype-heart/pkg/lib/localstore/addr" "github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore" "github.com/anyproto/anytype-heart/pkg/lib/logging" @@ -82,6 +83,7 @@ type export struct { accountService account.Service notificationService notifications.Notifications processService process.Service + gatewayService gateway.Gateway } func New() Export { @@ -97,6 +99,7 @@ func (e *export) Init(a *app.App) (err error) { e.spaceService = app.MustComponent[space.Service](a) e.accountService = app.MustComponent[account.Service](a) e.notificationService = app.MustComponent[notifications.Notifications](a) + e.gatewayService = app.MustComponent[gateway.Gateway](a) return } @@ -115,7 +118,7 @@ func (e *export) Export(ctx context.Context, req pb.RpcObjectListExportRequest) if err = queue.Start(); err != nil { return } - exportCtx := NewExportContext(e, req) + exportCtx := newExportContext(e, req) return exportCtx.exportObjects(ctx, queue) } @@ -129,7 +132,7 @@ func (e *export) ExportInMemory(ctx context.Context, spaceId string, objectIds [ } res = make(map[string][]byte) - exportCtx := NewExportContext(e, req) + exportCtx := newExportContext(e, req) for _, objectId := range objectIds { b, err := exportCtx.exportObject(ctx, objectId) if err != nil { @@ -191,11 +194,11 @@ type exportContext struct { relations map[string]struct{} setOfList map[string]struct{} objectTypes map[string]struct{} - + gatewayUrl string *export } -func NewExportContext(e *export, req pb.RpcObjectListExportRequest) *exportContext { +func newExportContext(e *export, req pb.RpcObjectListExportRequest) *exportContext { ec := &exportContext{ path: req.Path, spaceId: req.SpaceId, @@ -213,8 +216,8 @@ func NewExportContext(e *export, req pb.RpcObjectListExportRequest) *exportConte setOfList: make(map[string]struct{}), objectTypes: make(map[string]struct{}), relations: make(map[string]struct{}), - - export: e, + gatewayUrl: "http://" + e.gatewayService.Addr(), + export: e, } return ec } @@ -256,7 +259,13 @@ func (e *exportContext) exportObject(ctx context.Context, objectId string) ([]by return nil, err } - inMemoryWriter := &InMemoryWriter{} + var docNamer Namer + if e.format == model.Export_Markdown { + docNamer = &deepLinkNamer{gatewayUrl: e.gatewayUrl} + } else { + docNamer = newNamer() + } + inMemoryWriter := &InMemoryWriter{fn: docNamer} err = e.writeDoc(ctx, inMemoryWriter, objectId, e.docs.transformToDetailsMap()) if err != nil { return nil, err diff --git a/core/block/export/writer.go b/core/block/export/writer.go index 034f11ed8..87541154b 100644 --- a/core/block/export/writer.go +++ b/core/block/export/writer.go @@ -4,22 +4,28 @@ import ( "archive/zip" "fmt" "io" + "net/url" "os" "path" "path/filepath" "sync" "time" + "github.com/anyproto/anytype-heart/pkg/lib/mill" "github.com/anyproto/anytype-heart/util/anyerror" ) type writer interface { Path() string - Namer() *namer + Namer() Namer WriteFile(filename string, r io.Reader, lastModifiedDate int64) (err error) Close() (err error) } +type Namer interface { + Get(path, hash, title, ext string) (name string) +} + func uniqName() string { return time.Now().Format("Anytype.20060102.150405.99") } @@ -44,7 +50,7 @@ type dirWriter struct { m sync.Mutex } -func (d *dirWriter) Namer() *namer { +func (d *dirWriter) Namer() Namer { d.m.Lock() defer d.m.Unlock() if d.fn == nil { @@ -108,7 +114,7 @@ type zipWriter struct { fn *namer } -func (d *zipWriter) Namer() *namer { +func (d *zipWriter) Namer() Namer { d.m.Lock() defer d.m.Unlock() if d.fn == nil { @@ -152,16 +158,11 @@ func getZipName(path string) string { type InMemoryWriter struct { data map[string][]byte - fn *namer + fn Namer m sync.Mutex } -func (d *InMemoryWriter) Namer() *namer { - d.m.Lock() - defer d.m.Unlock() - if d.fn == nil { - d.fn = newNamer() - } +func (d *InMemoryWriter) Namer() Namer { return d.fn } @@ -192,3 +193,28 @@ func (d *InMemoryWriter) GetData(id string) []byte { defer d.m.Unlock() return d.data[id] } + +// deepLinkNamer used to render a single-object export, in md format +type deepLinkNamer struct { + gatewayUrl string +} + +func (fn *deepLinkNamer) Get(path, hash, title, ext string) (name string) { + if ext == ".md" { + // object links via deeplink to the app + return "anytype://object?objectId=" + hash + } + + // files links via gateway + u, err := url.Parse(fn.gatewayUrl) + if err != nil { + return "anytype://object?objectId=" + hash + } + if mill.IsImageExt(ext) { + u.Path = "image/" + hash + } else { + u.Path = "file/" + hash + } + + return u.String() +} diff --git a/core/block/import/markdown/anymark/anyblocks.go b/core/block/import/markdown/anymark/anyblocks.go index eeea01d64..aa43abd81 100644 --- a/core/block/import/markdown/anymark/anyblocks.go +++ b/core/block/import/markdown/anymark/anyblocks.go @@ -98,7 +98,7 @@ func ConvertTextToFile(filePath string) *model.BlockContentOfFile { return nil } - imageFormats := []string{"jpg", "jpeg", "png", "gif", "webp"} + imageFormats := []string{"jpg", "jpeg", "png", "gif", "webp", "heic", "heif", "bmp", "tiff", "psd", "ico"} videoFormats := []string{"mp4", "m4v", "mov"} audioFormats := []string{"mp3", "ogg", "wav", "m4a", "flac"} pdfFormat := "pdf" diff --git a/pkg/lib/mill/image_resize.go b/pkg/lib/mill/image_resize.go index e49fd09e4..a14933dda 100644 --- a/pkg/lib/mill/image_resize.go +++ b/pkg/lib/mill/image_resize.go @@ -42,6 +42,14 @@ const ( TIFF Format = "tiff" ) +func IsImageExt(ext string) bool { + switch strings.ToLower(strings.TrimPrefix(ext, ".")) { + case "jpg", "jpeg", "png", "gif", "ico", "webp", "heic", "heif", "bmp", "tiff", "psd": + return true + } + return false +} + func IsImage(mime string) bool { parts := strings.SplitN(mime, "/", 2) if len(parts) == 1 { From fdd7085404742bcc0683c2e080dd77b7a964d68f Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 25 Mar 2025 18:17:27 +0100 Subject: [PATCH 085/132] GO-4459: Add tests for GetSpace and GetMember --- core/api/internal/space/service_test.go | 367 ++++++++++++++++++++++++ 1 file changed, 367 insertions(+) diff --git a/core/api/internal/space/service_test.go b/core/api/internal/space/service_test.go index 519c8ec35..35bea6a63 100644 --- a/core/api/internal/space/service_test.go +++ b/core/api/internal/space/service_test.go @@ -188,6 +188,173 @@ func TestSpaceService_ListSpaces(t *testing.T) { }) } +func TestSpaceService_GetSpace(t *testing.T) { + t.Run("successful retrieval of space", func(t *testing.T) { + // given + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: techSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyTargetSpaceId.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("space-id"), + }, + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeySpaceLocalStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), + }, + }, + Keys: []string{ + bundle.RelationKeyTargetSpaceId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyName.String(): pbtypes.String("My Workspace"), + bundle.RelationKeyTargetSpaceId.String(): pbtypes.String("space-id"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("🚀"), + bundle.RelationKeyIconImage.String(): pbtypes.String(""), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + fx.mwMock.On("WorkspaceOpen", mock.Anything, mock.Anything).Return(&pb.RpcWorkspaceOpenResponse{ + Error: &pb.RpcWorkspaceOpenResponseError{Code: pb.RpcWorkspaceOpenResponseError_NULL}, + Info: &model.AccountInfo{ + HomeObjectId: "home-object-id", + ArchiveObjectId: "archive-object-id", + ProfileObjectId: "profile-object-id", + MarketplaceWorkspaceId: "marketplace-workspace-id", + WorkspaceObjectId: "workspace-object-id", + DeviceId: "device-id", + AccountSpaceId: "account-space-id", + WidgetsId: "widgets-id", + SpaceViewId: "space-view-id", + TechSpaceId: "tech-space-id", + GatewayUrl: "gateway-url", + LocalStoragePath: "local-storage-path", + TimeZone: "time-zone", + AnalyticsId: "analytics-id", + NetworkId: "network-id", + }, + }, nil).Once() + + // when + space, err := fx.GetSpace(nil, "space-id") + + // then + require.NoError(t, err) + require.Equal(t, "My Workspace", space.Name) + require.Equal(t, "space-id", space.Id) + require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr("🚀")}, space.Icon) + require.Equal(t, "gateway-url", space.GatewayUrl) + require.Equal(t, "network-id", space.NetworkId) + }) + + t.Run("workspace not found", func(t *testing.T) { + // given + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: techSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyTargetSpaceId.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("space-id"), + }, + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeySpaceLocalStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), + }, + }, + Keys: []string{ + bundle.RelationKeyTargetSpaceId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{}, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // when + space, err := fx.GetSpace(nil, "space-id") + + // then + require.ErrorIs(t, err, ErrWorkspaceNotFound) + require.Equal(t, Space{}, space) + }) + + t.Run("failed workspace open", func(t *testing.T) { + // given + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: techSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyTargetSpaceId.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("space-id"), + }, + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeySpaceLocalStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), + }, + }, + Keys: []string{ + bundle.RelationKeyTargetSpaceId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyName.String(): pbtypes.String("My Workspace"), + bundle.RelationKeyTargetSpaceId.String(): pbtypes.String("space-id"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("🚀"), + bundle.RelationKeyIconImage.String(): pbtypes.String(""), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + fx.mwMock.On("WorkspaceOpen", mock.Anything, mock.Anything). + Return(&pb.RpcWorkspaceOpenResponse{ + Error: &pb.RpcWorkspaceOpenResponseError{Code: pb.RpcWorkspaceOpenResponseError_UNKNOWN_ERROR}, + }, nil).Once() + + // when + space, err := fx.GetSpace(nil, "space-id") + + // then + require.ErrorIs(t, err, ErrFailedOpenWorkspace) + require.Equal(t, Space{}, space) + }) +} + func TestSpaceService_CreateSpace(t *testing.T) { t.Run("successful create space", func(t *testing.T) { // given @@ -404,3 +571,203 @@ func TestSpaceService_ListMembers(t *testing.T) { require.False(t, hasMore) }) } + +func TestSpaceService_GetMember(t *testing.T) { + t.Run("successful retrieval of member", func(t *testing.T) { + // given + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: "space-id", + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyIdentity.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("member-id"), + }, + }, + Keys: []string{ + bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + bundle.RelationKeyParticipantStatus.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String("member-id"), + bundle.RelationKeyName.String(): pbtypes.String("John Doe"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("👤"), + bundle.RelationKeyIconImage.String(): pbtypes.String("icon.png"), + bundle.RelationKeyIdentity.String(): pbtypes.String("member-id"), + bundle.RelationKeyGlobalName.String(): pbtypes.String("john.any"), + bundle.RelationKeyParticipantPermissions.String(): pbtypes.Int64(int64(model.ParticipantPermissions_Owner)), + bundle.RelationKeyParticipantStatus.String(): pbtypes.Int64(int64(model.ParticipantStatus_Active)), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // when + member, err := fx.GetMember(nil, "space-id", "member-id") + + // then + require.NoError(t, err) + require.Equal(t, "member-id", member.Id) + require.Equal(t, "John Doe", member.Name) + require.Regexpf(t, regexp.MustCompile(gatewayUrl+`/image/icon.png`), *member.Icon.File, "Icon URL does not match") + require.Equal(t, "member-id", member.Identity) + require.Equal(t, "john.any", member.GlobalName) + require.Equal(t, "active", member.Status) + require.Equal(t, "owner", member.Role) + }) + + t.Run("member not found", func(t *testing.T) { + // given + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: "space-id", + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyIdentity.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("member-id")}, + }, + Keys: []string{ + bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + bundle.RelationKeyParticipantStatus.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{}, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // when + member, err := fx.GetMember(nil, "space-id", "member-id") + + // then + require.ErrorIs(t, err, ErrMemberNotFound) + require.Equal(t, Member{}, member) + }) + t.Run("failed get member", func(t *testing.T) { + // given + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: "space-id", + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyIdentity.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("member-id"), + }, + }, + Keys: []string{ + bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + bundle.RelationKeyParticipantStatus.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String("member-id"), + bundle.RelationKeyName.String(): pbtypes.String("John Doe"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(""), + bundle.RelationKeyIconImage.String(): pbtypes.String("icon.png"), + bundle.RelationKeyIdentity.String(): pbtypes.String("member-id"), + bundle.RelationKeyGlobalName.String(): pbtypes.String("john.any"), + bundle.RelationKeyParticipantPermissions.String(): pbtypes.Int64(int64(model.ParticipantPermissions_Owner)), + bundle.RelationKeyParticipantStatus.String(): pbtypes.Int64(int64(model.ParticipantStatus_Active)), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_UNKNOWN_ERROR}, + }).Once() + + // when + member, err := fx.GetMember(nil, "space-id", "member-id") + + // then + require.ErrorIs(t, err, ErrFailedGetMember) + require.Equal(t, Member{}, member) + }) + + t.Run("successful retrieval of member with participant id", func(t *testing.T) { + // given + fx := newFixture(t) + participantId := "_participant123" + + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: "space-id", + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyId.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(participantId), + }, + }, + Keys: []string{ + bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + bundle.RelationKeyParticipantStatus.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String(participantId), + bundle.RelationKeyName.String(): pbtypes.String("Alice"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("😊"), + bundle.RelationKeyIconImage.String(): pbtypes.String("participant.png"), + bundle.RelationKeyIdentity.String(): pbtypes.String("alice-identity"), + bundle.RelationKeyGlobalName.String(): pbtypes.String("alice.any"), + bundle.RelationKeyParticipantPermissions.String(): pbtypes.Int64(int64(model.ParticipantPermissions_Writer)), + bundle.RelationKeyParticipantStatus.String(): pbtypes.Int64(int64(model.ParticipantStatus_Active)), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // when + member, err := fx.GetMember(nil, "space-id", participantId) + + // then + require.NoError(t, err) + require.Equal(t, participantId, member.Id) + require.Equal(t, "Alice", member.Name) + require.Regexpf(t, regexp.MustCompile(gatewayUrl+`/image/participant.png`), *member.Icon.File, "Icon URL does not match") + require.Equal(t, "alice-identity", member.Identity) + require.Equal(t, "alice.any", member.GlobalName) + require.Equal(t, "active", member.Status) + require.Equal(t, "editor", member.Role) + }) +} From 937fb0440318a9c6a8b66bfe50199536f9a7a6c1 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 25 Mar 2025 18:19:13 +0100 Subject: [PATCH 086/132] GO-4459: Update member retrieval documentation to clarify member_id parameter usage --- core/api/docs/docs.go | 2 +- core/api/docs/swagger.json | 2 +- core/api/docs/swagger.yaml | 6 ++++-- core/api/internal/space/handler.go | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index afc11bae4..b55186eb7 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -9,7 +9,7 @@ const docTemplate = `{ "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects associated with a specific list (query or collection) within a space. When a view ID is provided, the objects are filtered and sorted according to the view's configuration. If no view ID is specified, all list objects are returned without filtering and sorting. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects associated with a specific list (query or collection) within a space. When a view ID is provided, the objects are filtered and sorted according to the view's configuration. If no view ID is specified, all list objects are returned without filtering and sorting. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. The member_id path parameter can be provided as either the member's ID (starting with ` + "`" + `_participant` + "`" + `) or the member's identity. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 65f2cb126..23b399fca 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -2,7 +2,7 @@ "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects associated with a specific list (query or collection) within a space. When a view ID is provided, the objects are filtered and sorted according to the view's configuration. If no view ID is specified, all list objects are returned without filtering and sorting. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects associated with a specific list (query or collection) within a space. When a view ID is provided, the objects are filtered and sorted according to the view's configuration. If no view ID is specified, all list objects are returned without filtering and sorting. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. The member_id path parameter can be provided as either the member's ID (starting with `_participant`) or the member's identity. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index e3a7ad9b5..7204c1b35 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -1418,8 +1418,10 @@ paths: get: description: Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global - name, status and role. This is useful for user profile pages, permission management, - and displaying member-specific information in collaborative environments. + name, status and role. The member_id path parameter can be provided as either + the member's ID (starting with `_participant`) or the member's identity. + This is useful for user profile pages, permission management, and displaying + member-specific information in collaborative environments. parameters: - description: Space ID in: path diff --git a/core/api/internal/space/handler.go b/core/api/internal/space/handler.go index 7f6aab9ad..ab4107fc6 100644 --- a/core/api/internal/space/handler.go +++ b/core/api/internal/space/handler.go @@ -153,7 +153,7 @@ func GetMembersHandler(s *SpaceService) gin.HandlerFunc { // GetMemberHandler retrieves a member in a space // // @Summary Get member -// @Description Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments. +// @Description Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. The member_id path parameter can be provided as either the member's ID (starting with `_participant`) or the member's identity. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments. // @Tags members // @Produce json // @Param space_id path string true "Space ID" From e536f8bf370b3a26d22007be68593ee72d54a6ea Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Tue, 25 Mar 2025 18:30:03 +0100 Subject: [PATCH 087/132] GO-5364 ObjectExport single object export/deeplink linking for md --- clientlibrary/service/service.pb.go | 737 ++-- core/block/export/export.go | 49 +- core/block/export/writer.go | 6 +- .../import/markdown/anymark/anyblocks.go | 9 +- core/export.go | 28 + docs/proto.md | 79 + pb/commands.pb.go | 3556 +++++++++++------ pb/protos/commands.proto | 29 + pb/protos/service/service.proto | 1 + pb/service/service.pb.go | 736 ++-- 10 files changed, 3171 insertions(+), 2059 deletions(-) diff --git a/clientlibrary/service/service.pb.go b/clientlibrary/service/service.pb.go index b54493d9c..344ce49f7 100644 --- a/clientlibrary/service/service.pb.go +++ b/clientlibrary/service/service.pb.go @@ -25,356 +25,356 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package func init() { proto.RegisterFile("pb/protos/service/service.proto", fileDescriptor_93a29dc403579097) } var fileDescriptor_93a29dc403579097 = []byte{ - // 5574 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x9d, 0xdf, 0x8f, 0x1c, 0x49, - 0x52, 0xf8, 0xb7, 0x5f, 0xbe, 0xfb, 0xa5, 0x8e, 0x5b, 0xa0, 0x17, 0x96, 0xbd, 0xe5, 0xce, 0xf6, - 0x7a, 0xed, 0x19, 0xdb, 0xe3, 0xe9, 0xf1, 0xda, 0xfb, 0x8b, 0x3b, 0x24, 0x68, 0xcf, 0xd8, 0xb3, - 0x73, 0x37, 0x33, 0x3b, 0x4c, 0xf7, 0xd8, 0x62, 0x25, 0x24, 0x6a, 0xba, 0x72, 0x7a, 0x8a, 0xa9, - 0xae, 0xac, 0xab, 0xca, 0x6e, 0xbb, 0x0f, 0x81, 0x40, 0x20, 0x10, 0x08, 0xc4, 0x89, 0x5f, 0x82, - 0x27, 0x24, 0xfe, 0x02, 0xfe, 0x0c, 0x1e, 0xef, 0x91, 0x47, 0xb4, 0xfb, 0x2f, 0x20, 0x9e, 0x51, - 0x65, 0x66, 0xe5, 0x8f, 0xa8, 0x88, 0xac, 0x9a, 0xe5, 0xc9, 0xd6, 0xc4, 0x27, 0x22, 0x32, 0x2b, - 0x23, 0x33, 0x23, 0xb3, 0xb2, 0xb2, 0xa3, 0x9b, 0xc5, 0xf9, 0x4e, 0x51, 0x72, 0xc1, 0xab, 0x9d, - 0x8a, 0x95, 0xab, 0x74, 0xc6, 0x9a, 0x7f, 0x47, 0xf2, 0xcf, 0xc3, 0x37, 0xe3, 0x7c, 0x2d, 0xd6, - 0x05, 0x7b, 0xef, 0x5d, 0x4b, 0xce, 0xf8, 0x62, 0x11, 0xe7, 0x49, 0xa5, 0x90, 0xf7, 0xde, 0xb1, - 0x12, 0xb6, 0x62, 0xb9, 0xd0, 0x7f, 0x7f, 0xfc, 0xdf, 0xff, 0x33, 0x88, 0xde, 0xda, 0xcd, 0x52, - 0x96, 0x8b, 0x5d, 0xad, 0x31, 0xfc, 0x32, 0xfa, 0xf6, 0xb8, 0x28, 0xf6, 0x99, 0x78, 0xc1, 0xca, - 0x2a, 0xe5, 0xf9, 0xf0, 0x83, 0x91, 0x76, 0x30, 0x3a, 0x2d, 0x66, 0xa3, 0x71, 0x51, 0x8c, 0xac, - 0x70, 0x74, 0xca, 0x7e, 0xbc, 0x64, 0x95, 0x78, 0xef, 0x4e, 0x18, 0xaa, 0x0a, 0x9e, 0x57, 0x6c, - 0x78, 0x11, 0xfd, 0xd2, 0xb8, 0x28, 0x26, 0x4c, 0xec, 0xb1, 0xba, 0x02, 0x13, 0x11, 0x0b, 0x36, - 0xdc, 0x6c, 0xa9, 0xfa, 0x80, 0xf1, 0x71, 0xaf, 0x1b, 0xd4, 0x7e, 0xa6, 0xd1, 0xb7, 0x6a, 0x3f, - 0x97, 0x4b, 0x91, 0xf0, 0x57, 0xf9, 0xf0, 0xfd, 0xb6, 0xa2, 0x16, 0x19, 0xdb, 0xb7, 0x43, 0x88, - 0xb6, 0xfa, 0x32, 0xfa, 0xf9, 0x97, 0x71, 0x96, 0x31, 0xb1, 0x5b, 0xb2, 0xba, 0xe0, 0xbe, 0x8e, - 0x12, 0x8d, 0x94, 0xcc, 0xd8, 0xfd, 0x20, 0xc8, 0x68, 0xc3, 0x5f, 0x46, 0xdf, 0x56, 0x92, 0x53, - 0x36, 0xe3, 0x2b, 0x56, 0x0e, 0x51, 0x2d, 0x2d, 0x24, 0x1e, 0x79, 0x0b, 0x82, 0xb6, 0x77, 0x79, - 0xbe, 0x62, 0xa5, 0xc0, 0x6d, 0x6b, 0x61, 0xd8, 0xb6, 0x85, 0xb4, 0xed, 0xbf, 0x1c, 0x44, 0xdf, - 0x1d, 0xcf, 0x66, 0x7c, 0x99, 0x8b, 0x43, 0x3e, 0x8b, 0xb3, 0xc3, 0x34, 0xbf, 0x3a, 0x66, 0xaf, - 0x76, 0x2f, 0x6b, 0x3e, 0x9f, 0xb3, 0xe1, 0x13, 0xff, 0xa9, 0x2a, 0x74, 0x64, 0xd8, 0x91, 0x0b, - 0x1b, 0xdf, 0x1f, 0x5d, 0x4f, 0x49, 0x97, 0xe5, 0x6f, 0x07, 0xd1, 0x0d, 0x58, 0x96, 0x09, 0xcf, - 0x56, 0xcc, 0x96, 0xe6, 0xe3, 0x0e, 0xc3, 0x3e, 0x6e, 0xca, 0xf3, 0xc9, 0x75, 0xd5, 0x74, 0x89, - 0xb2, 0xe8, 0x6d, 0x37, 0x5c, 0x26, 0xac, 0x92, 0xdd, 0xe9, 0x3e, 0x1d, 0x11, 0x1a, 0x31, 0x9e, - 0x1f, 0xf4, 0x41, 0xb5, 0xb7, 0x34, 0x1a, 0x6a, 0x6f, 0x19, 0xaf, 0x8c, 0xb3, 0x7b, 0xa8, 0x05, - 0x87, 0x30, 0xbe, 0xee, 0xf7, 0x20, 0xb5, 0xab, 0xdf, 0x8b, 0x7e, 0xe1, 0x25, 0x2f, 0xaf, 0xaa, - 0x22, 0x9e, 0x31, 0xdd, 0x15, 0xee, 0xfa, 0xda, 0x8d, 0x14, 0xf6, 0x86, 0x8d, 0x2e, 0xcc, 0x09, - 0xda, 0x46, 0xf8, 0x45, 0xc1, 0xe0, 0x18, 0x64, 0x15, 0x6b, 0x21, 0x15, 0xb4, 0x10, 0xd2, 0xb6, - 0xaf, 0xa2, 0xa1, 0xb5, 0x7d, 0xfe, 0xfb, 0x6c, 0x26, 0xc6, 0x49, 0x02, 0x5b, 0xc5, 0xea, 0x4a, - 0x62, 0x34, 0x4e, 0x12, 0xaa, 0x55, 0x70, 0x54, 0x3b, 0x7b, 0x15, 0xbd, 0x03, 0x9c, 0x1d, 0xa6, - 0x95, 0x74, 0xb8, 0x1d, 0xb6, 0xa2, 0x31, 0xe3, 0x74, 0xd4, 0x17, 0xd7, 0x8e, 0xff, 0x78, 0x10, - 0x7d, 0x07, 0xf1, 0x7c, 0xca, 0x16, 0x7c, 0xc5, 0x86, 0x8f, 0xba, 0xad, 0x29, 0xd2, 0xf8, 0xff, - 0xf0, 0x1a, 0x1a, 0x48, 0x98, 0x4c, 0x58, 0xc6, 0x66, 0x82, 0x0c, 0x13, 0x25, 0xee, 0x0c, 0x13, - 0x83, 0x39, 0x3d, 0xac, 0x11, 0xee, 0x33, 0xb1, 0xbb, 0x2c, 0x4b, 0x96, 0x0b, 0xb2, 0x2d, 0x2d, - 0xd2, 0xd9, 0x96, 0x1e, 0x8a, 0xd4, 0x67, 0x9f, 0x89, 0x71, 0x96, 0x91, 0xf5, 0x51, 0xe2, 0xce, - 0xfa, 0x18, 0x4c, 0x7b, 0x98, 0x45, 0xbf, 0xe8, 0x3c, 0x31, 0x71, 0x90, 0x5f, 0xf0, 0x21, 0xfd, - 0x2c, 0xa4, 0xdc, 0xf8, 0xd8, 0xec, 0xe4, 0x90, 0x6a, 0x3c, 0x7b, 0x5d, 0xf0, 0x92, 0x6e, 0x16, - 0x25, 0xee, 0xac, 0x86, 0xc1, 0xb4, 0x87, 0xdf, 0x8d, 0xde, 0xd2, 0xa3, 0x64, 0x33, 0x9f, 0xdd, - 0x41, 0x87, 0x50, 0x38, 0xa1, 0xdd, 0xed, 0xa0, 0x5a, 0xe6, 0x8f, 0xd2, 0x79, 0x59, 0x8f, 0x3e, - 0xb8, 0x79, 0x2d, 0xed, 0x30, 0x6f, 0x29, 0x6d, 0x9e, 0x47, 0xbf, 0xec, 0x9b, 0xdf, 0x8d, 0xf3, - 0x19, 0xcb, 0x86, 0x0f, 0x42, 0xea, 0x8a, 0x31, 0xae, 0xb6, 0x7a, 0xb1, 0x76, 0xb0, 0xd3, 0x84, - 0x1e, 0x4c, 0x3f, 0x40, 0xb5, 0xc1, 0x50, 0x7a, 0x27, 0x0c, 0xb5, 0x6c, 0xef, 0xb1, 0x8c, 0x91, - 0xb6, 0x95, 0xb0, 0xc3, 0xb6, 0x81, 0xb4, 0xed, 0x32, 0xfa, 0x15, 0xd3, 0xcc, 0x75, 0x5e, 0x20, - 0xe5, 0xf5, 0xa4, 0xb3, 0x45, 0xb4, 0xa3, 0x0b, 0x19, 0x5f, 0x0f, 0xfb, 0xc1, 0xad, 0xfa, 0xe8, - 0x11, 0x05, 0xaf, 0x0f, 0x18, 0x4f, 0xee, 0x84, 0x21, 0x6d, 0xfb, 0xaf, 0x06, 0xd1, 0xf7, 0xb4, - 0xec, 0x59, 0x1e, 0x9f, 0x67, 0x4c, 0x4e, 0xf1, 0xc7, 0x4c, 0xbc, 0xe2, 0xe5, 0xd5, 0x64, 0x9d, - 0xcf, 0x88, 0x74, 0x06, 0x87, 0x3b, 0xd2, 0x19, 0x52, 0x49, 0x17, 0xe6, 0x0f, 0xa2, 0x77, 0x9b, - 0xa0, 0xb8, 0x8c, 0xf3, 0x39, 0xfb, 0x61, 0xc5, 0xf3, 0x71, 0x91, 0x8e, 0x93, 0xa4, 0x1c, 0x8e, - 0xf0, 0xa6, 0x87, 0x9c, 0x29, 0xc1, 0x4e, 0x6f, 0xde, 0x49, 0x9f, 0xf5, 0x53, 0x16, 0xbc, 0x80, - 0xe9, 0x73, 0xf3, 0xf8, 0x04, 0x2f, 0xa8, 0xf4, 0xd9, 0x47, 0x5a, 0x56, 0x8f, 0xea, 0x39, 0x08, - 0xb7, 0x7a, 0xe4, 0x4e, 0x3a, 0xb7, 0x43, 0x88, 0x9d, 0x03, 0x9a, 0x07, 0xc5, 0xf3, 0x8b, 0x74, - 0x7e, 0x56, 0x24, 0x75, 0x1f, 0xba, 0x8f, 0xd7, 0xd9, 0x41, 0x88, 0x39, 0x80, 0x40, 0xb5, 0xb7, - 0xbf, 0xb1, 0x59, 0xa6, 0x1e, 0x97, 0x9e, 0x97, 0x7c, 0x71, 0xc8, 0xe6, 0xf1, 0x6c, 0xad, 0x07, - 0xd3, 0x8f, 0x42, 0xa3, 0x18, 0xa4, 0x4d, 0x21, 0x3e, 0xbe, 0xa6, 0x96, 0x2e, 0xcf, 0xbf, 0x0e, - 0xa2, 0x3b, 0x5e, 0x9c, 0xe8, 0x60, 0x52, 0xa5, 0x1f, 0xe7, 0xc9, 0x29, 0xab, 0x44, 0x5c, 0x8a, - 0xe1, 0xf7, 0x03, 0x31, 0x40, 0xe8, 0x98, 0xb2, 0xfd, 0xe0, 0x1b, 0xe9, 0xda, 0x56, 0x9f, 0xd4, - 0xb3, 0x84, 0x1e, 0x7f, 0xfc, 0x56, 0x97, 0x12, 0x38, 0xfa, 0xdc, 0x0e, 0x21, 0xb6, 0xd5, 0xa5, - 0xe0, 0x20, 0x5f, 0xa5, 0x82, 0xed, 0xb3, 0x9c, 0x95, 0xed, 0x56, 0x57, 0xaa, 0x3e, 0x42, 0xb4, - 0x3a, 0x81, 0xda, 0x91, 0xce, 0xf3, 0x66, 0x32, 0x8d, 0xad, 0x80, 0x91, 0x56, 0xae, 0xf1, 0xb0, - 0x1f, 0x6c, 0x97, 0xca, 0x8e, 0xcf, 0x53, 0xb6, 0xe2, 0x57, 0x70, 0xa9, 0xec, 0x9a, 0x50, 0x00, - 0xb1, 0x54, 0x46, 0x41, 0x9b, 0x0e, 0x38, 0x7e, 0x5e, 0xa4, 0xec, 0x15, 0x48, 0x07, 0x5c, 0xe5, - 0x5a, 0x4c, 0xa4, 0x03, 0x08, 0xa6, 0x3d, 0x1c, 0x47, 0x3f, 0x27, 0x85, 0x3f, 0xe4, 0x69, 0x3e, - 0xbc, 0x89, 0x28, 0xd5, 0x02, 0x63, 0xf5, 0x16, 0x0d, 0x80, 0x12, 0xd7, 0x7f, 0xd5, 0x73, 0xf3, - 0x5d, 0x42, 0x09, 0x4c, 0xcb, 0x1b, 0x5d, 0x98, 0xcd, 0xc3, 0xa4, 0xb0, 0x1e, 0xbf, 0x26, 0x97, - 0x71, 0x99, 0xe6, 0xf3, 0x21, 0xa6, 0xeb, 0xc8, 0x89, 0x3c, 0x0c, 0xe3, 0x40, 0x08, 0x6b, 0xc5, - 0x71, 0x51, 0x94, 0xf5, 0xb0, 0x88, 0x85, 0xb0, 0x8f, 0x04, 0x43, 0xb8, 0x85, 0xe2, 0xde, 0xf6, - 0xd8, 0x2c, 0x4b, 0xf3, 0xa0, 0x37, 0x8d, 0xf4, 0xf1, 0x66, 0x51, 0x10, 0xbc, 0x87, 0x2c, 0x5e, - 0xb1, 0xa6, 0x66, 0xd8, 0x93, 0x71, 0x81, 0x60, 0xf0, 0x02, 0xd0, 0x2e, 0x7a, 0xa5, 0xf8, 0x28, - 0xbe, 0x62, 0xf5, 0x03, 0x66, 0xf5, 0xa4, 0x3a, 0xc4, 0xf4, 0x3d, 0x82, 0x58, 0xf4, 0xe2, 0xa4, - 0x76, 0xb5, 0x8c, 0xde, 0x91, 0xf2, 0x93, 0xb8, 0x14, 0xe9, 0x2c, 0x2d, 0xe2, 0xbc, 0x59, 0x4c, - 0x61, 0xfd, 0xba, 0x45, 0x19, 0x97, 0xdb, 0x3d, 0x69, 0xed, 0xf6, 0x9f, 0x06, 0xd1, 0xfb, 0xd0, - 0xef, 0x09, 0x2b, 0x17, 0xa9, 0x5c, 0x93, 0x57, 0x6a, 0x10, 0x1e, 0x7e, 0x1a, 0x36, 0xda, 0x52, - 0x30, 0xa5, 0xf9, 0xec, 0xfa, 0x8a, 0x36, 0x13, 0x9b, 0xe8, 0x75, 0xca, 0x17, 0x65, 0xd2, 0xda, - 0xb3, 0x9a, 0x34, 0x8b, 0x0f, 0x29, 0x24, 0x32, 0xb1, 0x16, 0x04, 0x7a, 0xf8, 0x59, 0x5e, 0x35, - 0xd6, 0xb1, 0x1e, 0x6e, 0xc5, 0xc1, 0x1e, 0xee, 0x61, 0xb6, 0x87, 0x9f, 0x2c, 0xcf, 0xb3, 0xb4, - 0xba, 0x4c, 0xf3, 0xb9, 0x4e, 0xbb, 0x7d, 0x5d, 0x2b, 0x86, 0x99, 0xf7, 0x66, 0x27, 0x87, 0x39, - 0xd1, 0xc1, 0x42, 0x3a, 0x01, 0x61, 0xb2, 0xd9, 0xc9, 0xd9, 0xd5, 0x90, 0x95, 0xd6, 0xcb, 0x70, - 0xb0, 0x1a, 0x72, 0x54, 0x6b, 0x29, 0xb1, 0x1a, 0x6a, 0x53, 0x76, 0x35, 0xe4, 0xd6, 0xa1, 0xe2, - 0xd9, 0x8a, 0x9d, 0x95, 0x29, 0x58, 0x0d, 0x79, 0xe5, 0x6b, 0x18, 0x62, 0x35, 0x44, 0xb1, 0x76, - 0xa0, 0xb2, 0xc4, 0x3e, 0x13, 0x13, 0x11, 0x8b, 0x65, 0x05, 0x06, 0x2a, 0xc7, 0x86, 0x41, 0x88, - 0x81, 0x8a, 0x40, 0xb5, 0xb7, 0xdf, 0x8e, 0x22, 0xb5, 0x83, 0x21, 0x77, 0x99, 0xfc, 0xb9, 0x47, - 0x6f, 0x6d, 0x78, 0x5b, 0x4c, 0xef, 0x07, 0x08, 0x9b, 0xf0, 0xa8, 0xbf, 0xcb, 0xcd, 0xb3, 0x21, - 0xaa, 0x21, 0x45, 0x44, 0xc2, 0x03, 0x10, 0x58, 0xd0, 0xc9, 0x25, 0x7f, 0x85, 0x17, 0xb4, 0x96, - 0x84, 0x0b, 0xaa, 0x09, 0xbb, 0x9d, 0xad, 0x0b, 0x8a, 0x6d, 0x67, 0x37, 0xc5, 0x08, 0x6d, 0x67, - 0x43, 0xc6, 0xc6, 0x8c, 0x6b, 0xf8, 0x29, 0xe7, 0x57, 0x8b, 0xb8, 0xbc, 0x02, 0x31, 0xe3, 0x29, - 0x37, 0x0c, 0x11, 0x33, 0x14, 0x6b, 0x63, 0xc6, 0x75, 0x58, 0xa7, 0xcb, 0x67, 0x65, 0x06, 0x62, - 0xc6, 0xb3, 0xa1, 0x11, 0x22, 0x66, 0x08, 0xd4, 0x8e, 0x4e, 0xae, 0xb7, 0x09, 0x83, 0x1b, 0x28, - 0x9e, 0xfa, 0x84, 0x51, 0x1b, 0x28, 0x08, 0x06, 0x43, 0x68, 0xbf, 0x8c, 0x8b, 0x4b, 0x3c, 0x84, - 0xa4, 0x28, 0x1c, 0x42, 0x0d, 0x02, 0xdb, 0x7b, 0xc2, 0xe2, 0x72, 0x76, 0x89, 0xb7, 0xb7, 0x92, - 0x85, 0xdb, 0xdb, 0x30, 0xb0, 0xbd, 0x95, 0xe0, 0x65, 0x2a, 0x2e, 0x8f, 0x98, 0x88, 0xf1, 0xf6, - 0xf6, 0x99, 0x70, 0x7b, 0xb7, 0x58, 0x9b, 0x8f, 0xbb, 0x0e, 0x27, 0xcb, 0xf3, 0x6a, 0x56, 0xa6, - 0xe7, 0x6c, 0x18, 0xb0, 0x62, 0x20, 0x22, 0x1f, 0x27, 0x61, 0xed, 0xf3, 0xa7, 0x83, 0xe8, 0x66, - 0xd3, 0xec, 0xbc, 0xaa, 0xf4, 0xdc, 0xe7, 0xbb, 0xff, 0x18, 0x6f, 0x5f, 0x02, 0x27, 0x5e, 0x30, - 0xf4, 0x50, 0x73, 0x72, 0x03, 0xbc, 0x48, 0x67, 0x79, 0x65, 0x0a, 0xf5, 0x69, 0x1f, 0xeb, 0x8e, - 0x02, 0x91, 0x1b, 0xf4, 0x52, 0xb4, 0x69, 0x99, 0x6e, 0x9f, 0x46, 0x76, 0x90, 0x54, 0x20, 0x2d, - 0x6b, 0x9e, 0xb7, 0x43, 0x10, 0x69, 0x19, 0x4e, 0xc2, 0x50, 0xd8, 0x2f, 0xf9, 0xb2, 0xa8, 0x3a, - 0x42, 0x01, 0x40, 0xe1, 0x50, 0x68, 0xc3, 0xda, 0xe7, 0xeb, 0xe8, 0x57, 0xdd, 0xf0, 0x73, 0x1f, - 0xf6, 0x36, 0x1d, 0x53, 0xd8, 0x23, 0x1e, 0xf5, 0xc5, 0x6d, 0x46, 0xd1, 0x78, 0x16, 0x7b, 0x4c, - 0xc4, 0x69, 0x56, 0x0d, 0x37, 0x70, 0x1b, 0x8d, 0x9c, 0xc8, 0x28, 0x30, 0x0e, 0x8e, 0x6f, 0x7b, - 0xcb, 0x22, 0x4b, 0x67, 0xed, 0xd7, 0x3b, 0x5a, 0xd7, 0x88, 0xc3, 0xe3, 0x9b, 0x8b, 0xc1, 0xf1, - 0xba, 0x4e, 0xfd, 0xe4, 0x7f, 0xa6, 0xeb, 0x82, 0xe1, 0xe3, 0xb5, 0x87, 0x84, 0xc7, 0x6b, 0x88, - 0xc2, 0xfa, 0x4c, 0x98, 0x38, 0x8c, 0xd7, 0x7c, 0x49, 0x8c, 0xd7, 0x46, 0x1c, 0xae, 0x8f, 0x8b, - 0xd9, 0xb5, 0x81, 0xf1, 0x70, 0x90, 0x0b, 0x56, 0xe6, 0x71, 0xf6, 0x3c, 0x8b, 0xe7, 0xd5, 0x90, - 0x18, 0x63, 0x7c, 0x8a, 0x58, 0x1b, 0xd0, 0x34, 0xf2, 0x18, 0x0f, 0xaa, 0xe7, 0xf1, 0x8a, 0x97, - 0xa9, 0xa0, 0x1f, 0xa3, 0x45, 0x3a, 0x1f, 0xa3, 0x87, 0xa2, 0xde, 0xc6, 0xe5, 0xec, 0x32, 0x5d, - 0xb1, 0x24, 0xe0, 0xad, 0x41, 0x7a, 0x78, 0x73, 0x50, 0xa4, 0xd1, 0x26, 0x7c, 0x59, 0xce, 0x18, - 0xd9, 0x68, 0x4a, 0xdc, 0xd9, 0x68, 0x06, 0xd3, 0x1e, 0xfe, 0x6c, 0x10, 0xfd, 0x9a, 0x92, 0xba, - 0xef, 0x5c, 0xf6, 0xe2, 0xea, 0xf2, 0x9c, 0xc7, 0x65, 0x32, 0xfc, 0x10, 0xb3, 0x83, 0xa2, 0xc6, - 0xf5, 0xe3, 0xeb, 0xa8, 0xc0, 0xc7, 0x5a, 0xe7, 0xdd, 0xb6, 0xc7, 0xa1, 0x8f, 0xd5, 0x43, 0xc2, - 0x8f, 0x15, 0xa2, 0x70, 0x00, 0x91, 0x72, 0xb5, 0x25, 0xb7, 0x41, 0xea, 0xfb, 0xfb, 0x72, 0x9b, - 0x9d, 0x1c, 0x1c, 0x1f, 0x6b, 0xa1, 0x1f, 0x2d, 0xdb, 0x94, 0x0d, 0x3c, 0x62, 0x46, 0x7d, 0x71, - 0xd2, 0xb3, 0xe9, 0x15, 0x61, 0xcf, 0xad, 0x9e, 0x31, 0xea, 0x8b, 0x13, 0x9e, 0x9d, 0x61, 0x2d, - 0xe4, 0x19, 0x19, 0xda, 0x46, 0x7d, 0x71, 0x98, 0x7d, 0x69, 0xa6, 0x99, 0x17, 0x1e, 0x04, 0xec, - 0xc0, 0xb9, 0x61, 0xab, 0x17, 0xab, 0x1d, 0xfe, 0xc5, 0x20, 0xfa, 0xae, 0xf5, 0x78, 0xc4, 0x93, - 0xf4, 0x62, 0xad, 0xa0, 0x17, 0x71, 0xb6, 0x64, 0xd5, 0xf0, 0x31, 0x65, 0xad, 0xcd, 0x9a, 0x12, - 0x3c, 0xb9, 0x96, 0x0e, 0xec, 0x3b, 0xe3, 0xa2, 0xc8, 0xd6, 0x53, 0xb6, 0x28, 0x32, 0xb2, 0xef, - 0x78, 0x48, 0xb8, 0xef, 0x40, 0x14, 0x66, 0xe5, 0x53, 0x5e, 0xe7, 0xfc, 0x68, 0x56, 0x2e, 0x45, - 0xe1, 0xac, 0xbc, 0x41, 0x60, 0xae, 0x34, 0xe5, 0xbb, 0x3c, 0xcb, 0xd8, 0x4c, 0xb4, 0xcf, 0x6d, - 0x18, 0x4d, 0x4b, 0x84, 0x73, 0x25, 0x40, 0xda, 0x5d, 0xb9, 0x66, 0x0d, 0x19, 0x97, 0xec, 0xe9, - 0xfa, 0x30, 0xcd, 0xaf, 0x86, 0x78, 0x5a, 0x60, 0x01, 0x62, 0x57, 0x0e, 0x05, 0xe1, 0x5a, 0xf5, - 0x2c, 0x4f, 0x38, 0xbe, 0x56, 0xad, 0x25, 0xe1, 0xb5, 0xaa, 0x26, 0xa0, 0xc9, 0x53, 0x46, 0x99, - 0xac, 0x25, 0x61, 0x93, 0x9a, 0xc0, 0x86, 0x42, 0xfd, 0xee, 0x86, 0x1c, 0x0a, 0xc1, 0xdb, 0x9a, - 0xcd, 0x4e, 0x0e, 0x46, 0x68, 0xb3, 0x68, 0x7d, 0xce, 0xc4, 0xec, 0x12, 0x8f, 0x50, 0x0f, 0x09, - 0x47, 0x28, 0x44, 0x61, 0x95, 0xa6, 0xdc, 0x2c, 0xba, 0x37, 0xf0, 0xf8, 0x68, 0x2d, 0xb8, 0x37, - 0x3b, 0x39, 0xb8, 0x8c, 0x3c, 0x58, 0xc8, 0x67, 0x86, 0x06, 0xb9, 0x92, 0x85, 0x97, 0x91, 0x86, - 0x81, 0xa5, 0x57, 0x02, 0xb9, 0x97, 0xb5, 0x41, 0x2b, 0x7a, 0xbb, 0x59, 0x9b, 0x9d, 0x9c, 0x76, - 0xf2, 0x0f, 0x66, 0x19, 0xa7, 0xa4, 0xc7, 0xbc, 0xee, 0x23, 0x2f, 0xe2, 0x2c, 0x4d, 0x62, 0xc1, - 0xa6, 0xfc, 0x8a, 0xe5, 0xf8, 0x8a, 0x49, 0x97, 0x56, 0xf1, 0x23, 0x4f, 0x21, 0xbc, 0x62, 0x0a, - 0x2b, 0xc2, 0x38, 0x51, 0xf4, 0x59, 0xc5, 0x76, 0xe3, 0x8a, 0x18, 0xc9, 0x3c, 0x24, 0x1c, 0x27, - 0x10, 0x85, 0xf9, 0xaa, 0x92, 0x3f, 0x7b, 0x5d, 0xb0, 0x32, 0x65, 0xf9, 0x8c, 0xe1, 0xf9, 0x2a, - 0xa4, 0xc2, 0xf9, 0x2a, 0x42, 0xc3, 0xb5, 0xda, 0x5e, 0x2c, 0xd8, 0xd3, 0xf5, 0x34, 0x5d, 0xb0, - 0x4a, 0xc4, 0x8b, 0x02, 0x5f, 0xab, 0x01, 0x28, 0xbc, 0x56, 0x6b, 0xc3, 0xad, 0xad, 0x21, 0x33, - 0x20, 0xb6, 0x8f, 0x7b, 0x41, 0x22, 0x70, 0xdc, 0x8b, 0x40, 0xe1, 0x83, 0xb5, 0x00, 0xfa, 0x92, - 0xa0, 0x65, 0x25, 0xf8, 0x92, 0x80, 0xa6, 0x5b, 0x1b, 0x6e, 0x86, 0x99, 0xd4, 0x5d, 0xb3, 0xa3, - 0xe8, 0x13, 0xb7, 0x8b, 0x6e, 0xf5, 0x62, 0xf1, 0x1d, 0xbe, 0x53, 0x96, 0xc5, 0x72, 0xda, 0x0a, - 0x6c, 0xa3, 0x35, 0x4c, 0x9f, 0x1d, 0x3e, 0x87, 0xd5, 0x0e, 0xff, 0x64, 0x10, 0xbd, 0x87, 0x79, - 0xfc, 0xa2, 0x90, 0x7e, 0x1f, 0x75, 0xdb, 0x52, 0x24, 0x71, 0x9e, 0x2d, 0xac, 0x61, 0x8f, 0x64, - 0x34, 0x22, 0x7b, 0xdc, 0x4d, 0x17, 0xc0, 0x4f, 0xda, 0x4c, 0xf9, 0x21, 0x47, 0x1c, 0xc9, 0x08, - 0xf1, 0x76, 0x3d, 0xe4, 0x97, 0xab, 0x02, 0xeb, 0x21, 0x63, 0x43, 0x8b, 0x89, 0xf5, 0x10, 0x82, - 0xd9, 0xde, 0xe9, 0x56, 0xef, 0x65, 0x2a, 0x2e, 0x65, 0xbe, 0x05, 0x7a, 0xa7, 0x57, 0x56, 0x03, - 0x11, 0xbd, 0x93, 0x84, 0x61, 0x46, 0xd2, 0x80, 0x75, 0xdf, 0xc4, 0xc6, 0x72, 0x63, 0xc8, 0xed, - 0x99, 0xf7, 0xba, 0x41, 0x18, 0xaf, 0x8d, 0x58, 0x2f, 0x7d, 0x1e, 0x84, 0x2c, 0x80, 0xe5, 0xcf, - 0x56, 0x2f, 0x56, 0x3b, 0xfc, 0xa3, 0xe8, 0x3b, 0xad, 0x8a, 0x3d, 0x67, 0xb1, 0x58, 0x96, 0x2c, - 0x19, 0xee, 0x74, 0x94, 0xbb, 0x01, 0x8d, 0xeb, 0x47, 0xfd, 0x15, 0x5a, 0x39, 0x7a, 0xc3, 0xa9, - 0xb0, 0x32, 0x65, 0x78, 0x1c, 0x32, 0xe9, 0xb3, 0xc1, 0x1c, 0x9d, 0xd6, 0x69, 0x2d, 0xb3, 0xdd, - 0xe8, 0x1a, 0xaf, 0xe2, 0x34, 0x93, 0x2f, 0x6b, 0x3f, 0x0c, 0x19, 0xf5, 0xd0, 0xe0, 0x32, 0x9b, - 0x54, 0x69, 0x8d, 0xcc, 0xb2, 0x8f, 0x3b, 0xcb, 0xb3, 0x87, 0xf4, 0x48, 0x80, 0xac, 0xce, 0xb6, - 0x7b, 0xd2, 0xda, 0xad, 0x68, 0xa6, 0xbc, 0xfa, 0xcf, 0x6e, 0x90, 0x63, 0x5e, 0xb5, 0x2a, 0x12, - 0xe9, 0xdb, 0x3d, 0x69, 0xed, 0xf5, 0x0f, 0xa3, 0x77, 0xdb, 0x5e, 0xf5, 0x44, 0xb4, 0xd3, 0x69, - 0x0a, 0xcc, 0x45, 0x8f, 0xfa, 0x2b, 0x68, 0xf7, 0xff, 0x6c, 0xf6, 0xa5, 0x95, 0xff, 0x19, 0x5f, - 0x2c, 0x58, 0x9e, 0xb0, 0xa4, 0xd1, 0xa8, 0xea, 0xf5, 0xd3, 0x67, 0xb4, 0x5d, 0xa3, 0x30, 0x72, - 0x35, 0x4c, 0x89, 0x7e, 0xfd, 0x1b, 0x68, 0xea, 0xa2, 0xfd, 0xfb, 0x20, 0xba, 0x8f, 0x16, 0xad, - 0x09, 0x5c, 0xaf, 0x88, 0xbf, 0xd5, 0xc7, 0x11, 0xa6, 0x69, 0x8a, 0x3a, 0xfe, 0x3f, 0x58, 0xd0, - 0x45, 0xfe, 0x97, 0x41, 0x74, 0xdb, 0x2a, 0xd6, 0xe1, 0xbd, 0xcb, 0xf3, 0x8b, 0x2c, 0x9d, 0x09, - 0xf9, 0x46, 0x56, 0xab, 0xd0, 0x8f, 0x93, 0xd2, 0xe8, 0x7e, 0x9c, 0x01, 0x4d, 0xbb, 0x78, 0xfd, - 0x3c, 0xad, 0x04, 0x2f, 0xd7, 0x93, 0x4b, 0xfe, 0xaa, 0xf9, 0x60, 0xc8, 0x1f, 0x97, 0x35, 0x30, - 0x72, 0x08, 0x62, 0xf1, 0x8a, 0x93, 0x2d, 0x57, 0xf6, 0xc3, 0xa2, 0x8a, 0x70, 0xe5, 0x10, 0x1d, - 0xae, 0x7c, 0xd2, 0xce, 0x4a, 0x4d, 0xad, 0xec, 0x57, 0x50, 0x9b, 0x78, 0x51, 0xdb, 0x5f, 0x42, - 0xdd, 0xeb, 0x06, 0x6d, 0x6e, 0xaa, 0xc5, 0x7b, 0xe9, 0xc5, 0x85, 0xa9, 0x13, 0x5e, 0x52, 0x17, - 0x21, 0x72, 0x53, 0x02, 0xb5, 0xcb, 0xab, 0xe7, 0x69, 0xc6, 0xe4, 0xbb, 0x9b, 0x2f, 0x2e, 0x2e, - 0x32, 0x1e, 0x27, 0x60, 0x79, 0x55, 0x8b, 0x47, 0xae, 0x9c, 0x58, 0x5e, 0x61, 0x9c, 0x3d, 0x15, - 0x52, 0x4b, 0xeb, 0xe8, 0xce, 0x67, 0x69, 0x06, 0xcf, 0x1b, 0x4b, 0x4d, 0x23, 0x24, 0x4e, 0x85, - 0xb4, 0x20, 0x9b, 0x02, 0xd5, 0xa2, 0x3a, 0x2a, 0x9b, 0xf2, 0xdf, 0x6d, 0x2b, 0x3a, 0x62, 0x22, - 0x05, 0x42, 0x30, 0xbb, 0xcb, 0x50, 0x0b, 0xcf, 0x0a, 0x69, 0xfc, 0x56, 0x5b, 0x4b, 0x49, 0x88, - 0x5d, 0x06, 0x9f, 0xb0, 0xab, 0xe5, 0xfa, 0xef, 0x7b, 0xfc, 0x55, 0x2e, 0x8d, 0xde, 0x6e, 0xab, - 0x34, 0x32, 0x62, 0xb5, 0x0c, 0x19, 0x6d, 0xf8, 0x47, 0xd1, 0xff, 0x97, 0x86, 0x4b, 0x5e, 0x0c, - 0x6f, 0x20, 0x0a, 0xa5, 0x73, 0x3a, 0xf7, 0x26, 0x29, 0xb7, 0x87, 0x48, 0x4c, 0x6c, 0x9c, 0x55, - 0xf1, 0x1c, 0x1e, 0xa9, 0xb7, 0x2d, 0x2e, 0xa5, 0xc4, 0x21, 0x92, 0x36, 0xe5, 0x47, 0xc5, 0x31, - 0x4f, 0xb4, 0x75, 0xa4, 0x86, 0x46, 0x18, 0x8a, 0x0a, 0x17, 0xb2, 0x69, 0xeb, 0x71, 0xbc, 0x4a, - 0xe7, 0x26, 0xb5, 0x50, 0x03, 0x58, 0x05, 0xd2, 0x56, 0xcb, 0x8c, 0x1c, 0x88, 0x48, 0x5b, 0x49, - 0x58, 0xfb, 0xfc, 0xfb, 0x41, 0x74, 0xcb, 0x32, 0xfb, 0xcd, 0xbe, 0xec, 0x41, 0x7e, 0xc1, 0xeb, - 0x24, 0xf7, 0x30, 0xcd, 0xaf, 0xaa, 0xe1, 0x27, 0x94, 0x49, 0x9c, 0x37, 0x45, 0xf9, 0xf4, 0xda, - 0x7a, 0x76, 0x7d, 0xd2, 0x6c, 0x5a, 0xda, 0x93, 0x0b, 0x4a, 0x03, 0xac, 0x4f, 0xcc, 0xde, 0x26, - 0xe4, 0x88, 0xf5, 0x49, 0x88, 0xb7, 0x4d, 0x6c, 0x9c, 0x67, 0x3c, 0x87, 0x4d, 0x6c, 0x2d, 0xd4, - 0x42, 0xa2, 0x89, 0x5b, 0x90, 0x1d, 0x8f, 0x1b, 0x91, 0xda, 0x5f, 0x1b, 0x67, 0x19, 0x18, 0x8f, - 0x8d, 0xaa, 0x01, 0x88, 0xf1, 0x18, 0x05, 0xb5, 0x9f, 0xd3, 0xe8, 0x5b, 0xf5, 0x23, 0x3d, 0x29, - 0xd9, 0x2a, 0x65, 0xf0, 0x90, 0x8d, 0x23, 0x21, 0xfa, 0xbf, 0x4f, 0xd8, 0x9e, 0x75, 0x96, 0x57, - 0x45, 0x16, 0x57, 0x97, 0xfa, 0xd8, 0x85, 0x5f, 0xe7, 0x46, 0x08, 0x0f, 0x5e, 0xdc, 0xed, 0xa0, - 0xec, 0xa0, 0xde, 0xc8, 0xcc, 0x10, 0xb3, 0x81, 0xab, 0xb6, 0x86, 0x99, 0xcd, 0x4e, 0xce, 0xbe, - 0xdb, 0xd8, 0x8f, 0xb3, 0x8c, 0x95, 0xeb, 0x46, 0x76, 0x14, 0xe7, 0xe9, 0x05, 0xab, 0x04, 0x78, - 0xb7, 0xa1, 0xa9, 0x11, 0xc4, 0x88, 0x77, 0x1b, 0x01, 0xdc, 0xae, 0xdb, 0x80, 0xe7, 0x83, 0x3c, - 0x61, 0xaf, 0xc1, 0xba, 0x0d, 0xda, 0x91, 0x0c, 0xb1, 0x6e, 0xa3, 0x58, 0xbb, 0xc7, 0xff, 0x34, - 0xe3, 0xb3, 0x2b, 0x3d, 0x05, 0xf8, 0x0d, 0x2c, 0x25, 0x70, 0x0e, 0xb8, 0x1d, 0x42, 0xec, 0x24, - 0x20, 0x05, 0xa7, 0xac, 0xc8, 0xe2, 0x19, 0x3c, 0x69, 0xa5, 0x74, 0xb4, 0x8c, 0x98, 0x04, 0x20, - 0x03, 0x8a, 0xab, 0x4f, 0x70, 0x61, 0xc5, 0x05, 0x07, 0xb8, 0x6e, 0x87, 0x10, 0x3b, 0x0d, 0x4a, - 0xc1, 0xa4, 0xc8, 0x52, 0x01, 0xba, 0x81, 0xd2, 0x90, 0x12, 0xa2, 0x1b, 0xf8, 0x04, 0x30, 0x79, - 0xc4, 0xca, 0x39, 0x43, 0x4d, 0x4a, 0x49, 0xd0, 0x64, 0x43, 0xd8, 0x63, 0xe5, 0xaa, 0xee, 0xbc, - 0x58, 0x83, 0x63, 0xe5, 0xba, 0x5a, 0xbc, 0x58, 0x13, 0xc7, 0xca, 0x3d, 0x00, 0x14, 0xf1, 0x24, - 0xae, 0x04, 0x5e, 0x44, 0x29, 0x09, 0x16, 0xb1, 0x21, 0xec, 0x1c, 0xad, 0x8a, 0xb8, 0x14, 0x60, - 0x8e, 0xd6, 0x05, 0x70, 0xce, 0x1a, 0xdc, 0x24, 0xe5, 0x76, 0x24, 0x51, 0xad, 0xc2, 0xc4, 0xf3, - 0x94, 0x65, 0x49, 0x05, 0x46, 0x12, 0xfd, 0xdc, 0x1b, 0x29, 0x31, 0x92, 0xb4, 0x29, 0x10, 0x4a, - 0xfa, 0x4d, 0x08, 0x56, 0x3b, 0xf0, 0x12, 0xe4, 0x76, 0x08, 0xb1, 0xe3, 0x53, 0x53, 0xe8, 0xdd, - 0xb8, 0x2c, 0xd3, 0x7a, 0xf2, 0xdf, 0xc0, 0x0b, 0xd4, 0xc8, 0x89, 0xf1, 0x09, 0xe3, 0x40, 0xf7, - 0x6a, 0x06, 0x6e, 0xac, 0x60, 0x70, 0xe8, 0xfe, 0x20, 0xc8, 0xd8, 0x8c, 0x53, 0x4a, 0x9c, 0x97, - 0xe5, 0xd8, 0xd3, 0x44, 0xde, 0x95, 0x6f, 0x74, 0x61, 0xce, 0x37, 0x67, 0xc6, 0xc5, 0x11, 0x5f, - 0xb1, 0x29, 0x7f, 0xf6, 0x3a, 0xad, 0xea, 0xe5, 0x96, 0x9e, 0xb9, 0x9f, 0x10, 0x96, 0x30, 0x98, - 0xf8, 0xe6, 0xac, 0x53, 0xc9, 0x26, 0x10, 0xa0, 0x2c, 0xc7, 0xec, 0x15, 0x9a, 0x40, 0x40, 0x8b, - 0x86, 0x23, 0x12, 0x88, 0x10, 0x6f, 0x77, 0xcc, 0x8c, 0x73, 0x7d, 0xd1, 0xc0, 0x94, 0x37, 0xb9, - 0x1c, 0x65, 0x0d, 0x82, 0xc4, 0xa6, 0x45, 0x50, 0xc1, 0xae, 0x2f, 0x8d, 0x7f, 0xdb, 0xc5, 0xee, - 0x11, 0x76, 0xda, 0xdd, 0xec, 0x7e, 0x0f, 0x12, 0x71, 0x65, 0x4f, 0x7c, 0x50, 0xae, 0xda, 0x07, - 0x3e, 0xee, 0xf7, 0x20, 0x9d, 0xdd, 0x37, 0xb7, 0x5a, 0x4f, 0xe3, 0xd9, 0xd5, 0xbc, 0xe4, 0xcb, - 0x3c, 0xd9, 0xe5, 0x19, 0x2f, 0xc1, 0xee, 0x9b, 0x57, 0x6a, 0x80, 0x12, 0xbb, 0x6f, 0x1d, 0x2a, - 0x36, 0x83, 0x73, 0x4b, 0x31, 0xce, 0xd2, 0x39, 0x5c, 0x51, 0x7b, 0x86, 0x24, 0x40, 0x64, 0x70, - 0x28, 0x88, 0x04, 0x91, 0x5a, 0x71, 0x8b, 0x74, 0x16, 0x67, 0xca, 0xdf, 0x0e, 0x6d, 0xc6, 0x03, - 0x3b, 0x83, 0x08, 0x51, 0x40, 0xea, 0x39, 0x5d, 0x96, 0xf9, 0x41, 0x2e, 0x38, 0x59, 0xcf, 0x06, - 0xe8, 0xac, 0xa7, 0x03, 0x82, 0x61, 0x75, 0xca, 0x5e, 0xd7, 0xa5, 0xa9, 0xff, 0xc1, 0x86, 0xd5, - 0xfa, 0xef, 0x23, 0x2d, 0x0f, 0x0d, 0xab, 0x80, 0x03, 0x95, 0xd1, 0x4e, 0x54, 0xc0, 0x04, 0xb4, - 0xfd, 0x30, 0xb9, 0xd7, 0x0d, 0xe2, 0x7e, 0x26, 0x62, 0x9d, 0xb1, 0x90, 0x1f, 0x09, 0xf4, 0xf1, - 0xd3, 0x80, 0x76, 0xbb, 0xc5, 0xab, 0xcf, 0x25, 0x9b, 0x5d, 0xb5, 0x0e, 0xb0, 0xf9, 0x05, 0x55, - 0x08, 0xb1, 0xdd, 0x42, 0xa0, 0x78, 0x13, 0x1d, 0xcc, 0x78, 0x1e, 0x6a, 0xa2, 0x5a, 0xde, 0xa7, - 0x89, 0x34, 0x67, 0x17, 0xbf, 0x46, 0xaa, 0x23, 0x53, 0x35, 0xd3, 0x16, 0x61, 0xc1, 0x85, 0x88, - 0xc5, 0x2f, 0x09, 0xdb, 0x9c, 0x1c, 0xfa, 0x3c, 0x6a, 0x9f, 0xee, 0x6f, 0x59, 0x39, 0xa2, 0x4f, - 0xf7, 0x53, 0x2c, 0x5d, 0x49, 0x15, 0x23, 0x1d, 0x56, 0xfc, 0x38, 0x79, 0xd8, 0x0f, 0xb6, 0x4b, - 0x1e, 0xcf, 0xe7, 0x6e, 0xc6, 0xe2, 0x52, 0x79, 0xdd, 0x0e, 0x18, 0xb2, 0x18, 0xb1, 0xe4, 0x09, - 0xe0, 0x60, 0x08, 0xf3, 0x3c, 0xef, 0xf2, 0x5c, 0xb0, 0x5c, 0x60, 0x43, 0x98, 0x6f, 0x4c, 0x83, - 0xa1, 0x21, 0x8c, 0x52, 0x00, 0x71, 0x2b, 0xf7, 0x83, 0x98, 0x38, 0x8e, 0x17, 0x68, 0xc6, 0xa6, - 0xf6, 0x7a, 0x94, 0x3c, 0x14, 0xb7, 0x80, 0x73, 0x5e, 0xe7, 0xba, 0x5e, 0xa6, 0x71, 0x39, 0x37, - 0xbb, 0x1b, 0xc9, 0xf0, 0x11, 0x6d, 0xc7, 0x27, 0x89, 0xd7, 0xb9, 0x61, 0x0d, 0x30, 0xec, 0x1c, - 0x2c, 0xe2, 0xb9, 0xa9, 0x29, 0x52, 0x03, 0x29, 0x6f, 0x55, 0xf5, 0x5e, 0x37, 0x08, 0xfc, 0xbc, - 0x48, 0x13, 0xc6, 0x03, 0x7e, 0xa4, 0xbc, 0x8f, 0x1f, 0x08, 0x82, 0xec, 0xad, 0xae, 0xb7, 0x5a, - 0xd1, 0x8d, 0xf3, 0x44, 0xaf, 0x63, 0x47, 0xc4, 0xe3, 0x01, 0x5c, 0x28, 0x7b, 0x23, 0x78, 0xd0, - 0x47, 0x9b, 0x0d, 0xda, 0x50, 0x1f, 0x35, 0xfb, 0xaf, 0x7d, 0xfa, 0x28, 0x06, 0x6b, 0x9f, 0x3f, - 0xd1, 0x7d, 0x74, 0x2f, 0x16, 0x71, 0x9d, 0xb7, 0xbf, 0x48, 0xd9, 0x2b, 0xbd, 0x10, 0x46, 0xea, - 0xdb, 0x50, 0x23, 0xf9, 0x71, 0x32, 0x58, 0x15, 0xef, 0xf4, 0xe6, 0x03, 0xbe, 0xf5, 0x0a, 0xa1, - 0xd3, 0x37, 0x58, 0x2a, 0xec, 0xf4, 0xe6, 0x03, 0xbe, 0xf5, 0xad, 0x07, 0x9d, 0xbe, 0xc1, 0xd5, - 0x07, 0x3b, 0xbd, 0x79, 0xed, 0xfb, 0x4f, 0x9b, 0x8e, 0xeb, 0x3a, 0xaf, 0xf3, 0xb0, 0x99, 0x48, - 0x57, 0x0c, 0x4b, 0x27, 0x7d, 0x7b, 0x06, 0x0d, 0xa5, 0x93, 0xb4, 0x8a, 0x73, 0xef, 0x18, 0x56, - 0x8a, 0x13, 0x5e, 0xa5, 0xf2, 0x38, 0xc6, 0x93, 0x1e, 0x46, 0x1b, 0x38, 0xb4, 0x68, 0x0a, 0x29, - 0xd9, 0x17, 0xcb, 0x1e, 0x6a, 0xcf, 0xab, 0x3f, 0x0c, 0xd8, 0x6b, 0x1f, 0x5b, 0xdf, 0xee, 0x49, - 0xdb, 0x57, 0xbc, 0x1e, 0xe3, 0xbe, 0x5b, 0x0e, 0xb5, 0x2a, 0xfa, 0x7a, 0xf9, 0x51, 0x7f, 0x05, - 0xed, 0xfe, 0xcf, 0x9b, 0x75, 0x05, 0xf4, 0xaf, 0x3b, 0xc1, 0xe3, 0x3e, 0x16, 0x41, 0x47, 0x78, - 0x72, 0x2d, 0x1d, 0x5d, 0x90, 0xbf, 0x6e, 0x16, 0xd0, 0x0d, 0x2a, 0xbf, 0xda, 0x91, 0x5f, 0xfb, - 0xea, 0x3e, 0x11, 0x6a, 0x56, 0x0b, 0xc3, 0x9e, 0xf1, 0xf1, 0x35, 0xb5, 0x9c, 0x5b, 0xe8, 0x3c, - 0x58, 0x7f, 0x5d, 0xea, 0x94, 0x27, 0x64, 0xd9, 0xa1, 0x61, 0x81, 0x3e, 0xb9, 0xae, 0x1a, 0xd5, - 0x57, 0x1c, 0x58, 0xde, 0xc3, 0xf2, 0xa4, 0xa7, 0x61, 0xef, 0x66, 0x96, 0x8f, 0xae, 0xa7, 0xa4, - 0xcb, 0xf2, 0x6f, 0x83, 0xe8, 0xae, 0xc7, 0xda, 0xf7, 0x09, 0x60, 0xd7, 0xe3, 0x07, 0x01, 0xfb, - 0x94, 0x92, 0x29, 0xdc, 0x6f, 0x7c, 0x33, 0x65, 0x7b, 0x65, 0x9b, 0xa7, 0xf2, 0x3c, 0xcd, 0x04, - 0x2b, 0xdb, 0x57, 0xb6, 0xf9, 0x76, 0x15, 0x35, 0xa2, 0xaf, 0x6c, 0x0b, 0xe0, 0xce, 0x95, 0x6d, - 0x88, 0x67, 0xf4, 0xca, 0x36, 0xd4, 0x5a, 0xf0, 0xca, 0xb6, 0xb0, 0x06, 0x35, 0xbc, 0x37, 0x45, - 0x50, 0xfb, 0xd6, 0xbd, 0x2c, 0xfa, 0xdb, 0xd8, 0x8f, 0xaf, 0xa3, 0x42, 0x4c, 0x70, 0x8a, 0x93, - 0x27, 0x1a, 0x7b, 0x3c, 0x53, 0xef, 0x54, 0xe3, 0x4e, 0x6f, 0x5e, 0xfb, 0xfe, 0xb1, 0x5e, 0xdd, - 0x98, 0xe1, 0x9c, 0x97, 0xf2, 0xba, 0xbe, 0xad, 0xd0, 0xf0, 0x5c, 0x5b, 0x70, 0x5b, 0xfe, 0x61, - 0x3f, 0x98, 0xa8, 0x6e, 0x4d, 0xe8, 0x46, 0x1f, 0x75, 0x19, 0x02, 0x4d, 0xbe, 0xd3, 0x9b, 0x27, - 0xa6, 0x11, 0xe5, 0x5b, 0xb5, 0x76, 0x0f, 0x63, 0x7e, 0x5b, 0x3f, 0xea, 0xaf, 0xa0, 0xdd, 0xaf, - 0x74, 0xda, 0xe8, 0xba, 0x97, 0xed, 0xbc, 0xdd, 0x65, 0x6a, 0xe2, 0x35, 0xf3, 0xa8, 0x2f, 0x1e, - 0x4a, 0x20, 0xdc, 0x29, 0xb4, 0x2b, 0x81, 0x40, 0xa7, 0xd1, 0x8f, 0xae, 0xa7, 0xa4, 0xcb, 0xf2, - 0x77, 0x83, 0xe8, 0x26, 0x59, 0x16, 0x1d, 0x07, 0x9f, 0xf4, 0xb5, 0x0c, 0xe2, 0xe1, 0xd3, 0x6b, - 0xeb, 0xe9, 0x42, 0xfd, 0xe3, 0x20, 0xba, 0x15, 0x28, 0x94, 0x0a, 0x90, 0x6b, 0x58, 0xf7, 0x03, - 0xe5, 0xb3, 0xeb, 0x2b, 0x52, 0xd3, 0xbd, 0x8b, 0x4f, 0xda, 0xd7, 0x6f, 0x05, 0x6c, 0x4f, 0xe8, - 0xeb, 0xb7, 0xba, 0xb5, 0xe0, 0x26, 0x4f, 0x7c, 0xde, 0x2c, 0xba, 0xd0, 0x4d, 0x1e, 0x79, 0x16, - 0x31, 0x78, 0x8d, 0x08, 0xc6, 0x61, 0x4e, 0x9e, 0xbd, 0x2e, 0xe2, 0x3c, 0xa1, 0x9d, 0x28, 0x79, - 0xb7, 0x13, 0xc3, 0xc1, 0xcd, 0xb1, 0x5a, 0x7a, 0xca, 0x9b, 0x85, 0xd4, 0x7d, 0x4a, 0xdf, 0x20, - 0xc1, 0xcd, 0xb1, 0x16, 0x4a, 0x78, 0xd3, 0x59, 0x63, 0xc8, 0x1b, 0x48, 0x16, 0x1f, 0xf4, 0x41, - 0x41, 0x8a, 0x6e, 0xbc, 0x99, 0x3d, 0xf7, 0x87, 0x21, 0x2b, 0xad, 0x7d, 0xf7, 0xed, 0x9e, 0x34, - 0xe1, 0x76, 0xc2, 0xc4, 0xe7, 0x2c, 0x4e, 0x58, 0x19, 0x74, 0x6b, 0xa8, 0x5e, 0x6e, 0x5d, 0x1a, - 0x73, 0xbb, 0xcb, 0xb3, 0xe5, 0x22, 0xd7, 0x8d, 0x49, 0xba, 0x75, 0xa9, 0x6e, 0xb7, 0x80, 0x86, - 0xdb, 0x82, 0xd6, 0xad, 0x4c, 0x2f, 0x1f, 0x84, 0xcd, 0x78, 0x59, 0xe5, 0x56, 0x2f, 0x96, 0xae, - 0xa7, 0x0e, 0xa3, 0x8e, 0x7a, 0x82, 0x48, 0xda, 0xee, 0x49, 0xc3, 0xfd, 0x39, 0xc7, 0xad, 0x89, - 0xa7, 0x9d, 0x0e, 0x5b, 0xad, 0x90, 0x7a, 0xd4, 0x5f, 0x01, 0xee, 0x86, 0xea, 0xa8, 0x3a, 0x4c, - 0x2b, 0xf1, 0x3c, 0xcd, 0xb2, 0xe1, 0x56, 0x20, 0x4c, 0x1a, 0x28, 0xb8, 0x1b, 0x8a, 0xc0, 0x44, - 0x24, 0x37, 0xbb, 0x87, 0xf9, 0xb0, 0xcb, 0x8e, 0xa4, 0x7a, 0x45, 0xb2, 0x4b, 0x83, 0x1d, 0x2d, - 0xe7, 0x51, 0x9b, 0xda, 0x8e, 0xc2, 0x0f, 0xae, 0x55, 0xe1, 0x9d, 0xde, 0x3c, 0x78, 0xdd, 0x2e, - 0x29, 0x39, 0xb3, 0xdc, 0xa1, 0x4c, 0x78, 0x33, 0xc9, 0xdd, 0x0e, 0x0a, 0xec, 0x0a, 0xaa, 0x6e, - 0xf4, 0x32, 0x4d, 0xe6, 0x4c, 0xa0, 0x6f, 0x8a, 0x5c, 0x20, 0xf8, 0xa6, 0x08, 0x80, 0xa0, 0xe9, - 0xd4, 0xdf, 0xcd, 0x76, 0xe8, 0x41, 0x82, 0x35, 0x9d, 0x56, 0x76, 0xa8, 0x50, 0xd3, 0xa1, 0x34, - 0x18, 0x0d, 0x8c, 0x5b, 0x7d, 0xf1, 0xc2, 0x83, 0x90, 0x19, 0x70, 0xfb, 0xc2, 0x56, 0x2f, 0x16, - 0xcc, 0x28, 0xd6, 0x61, 0xba, 0x48, 0x05, 0x36, 0xa3, 0x38, 0x36, 0x6a, 0x24, 0x34, 0xa3, 0xb4, - 0x51, 0xaa, 0x7a, 0x75, 0x8e, 0x70, 0x90, 0x84, 0xab, 0xa7, 0x98, 0x7e, 0xd5, 0x33, 0x6c, 0xeb, - 0xc5, 0x66, 0x6e, 0x42, 0x46, 0x5c, 0xea, 0xc5, 0x32, 0x12, 0xdb, 0xf2, 0x83, 0x5c, 0x08, 0x86, - 0x46, 0x1d, 0x4a, 0x01, 0x6e, 0xd8, 0xd7, 0x5c, 0xf3, 0xee, 0xb5, 0x28, 0x58, 0x5c, 0xc6, 0xf9, - 0x0c, 0x5d, 0x9c, 0x4a, 0x83, 0x2d, 0x32, 0xb4, 0x38, 0x25, 0x35, 0xc0, 0x6b, 0x73, 0xff, 0x53, - 0x5a, 0xa4, 0x2b, 0x98, 0x6f, 0x56, 0xfd, 0x2f, 0x69, 0xef, 0xf7, 0x20, 0xe1, 0x6b, 0xf3, 0x06, - 0x30, 0x1b, 0xdf, 0xca, 0xe9, 0x87, 0x01, 0x53, 0x3e, 0x1a, 0x5a, 0x08, 0xd3, 0x2a, 0x20, 0xa8, - 0x4d, 0x82, 0xcb, 0xc4, 0x8f, 0xd8, 0x1a, 0x0b, 0x6a, 0x9b, 0x9f, 0x4a, 0x24, 0x14, 0xd4, 0x6d, - 0x14, 0xe4, 0x99, 0xee, 0x3a, 0x68, 0x23, 0xa0, 0xef, 0x2e, 0x7d, 0x36, 0x3b, 0x39, 0xd0, 0x73, - 0xf6, 0xd2, 0x95, 0xf7, 0x9e, 0x00, 0x29, 0xe8, 0x5e, 0xba, 0xc2, 0x5f, 0x13, 0x6c, 0xf5, 0x62, - 0xe1, 0x2b, 0xf9, 0x58, 0xb0, 0xd7, 0xcd, 0xbb, 0x72, 0xa4, 0xb8, 0x52, 0xde, 0x7a, 0x59, 0x7e, - 0xaf, 0x1b, 0xb4, 0x07, 0x60, 0x4f, 0x4a, 0x3e, 0x63, 0x55, 0xa5, 0xef, 0x24, 0xf5, 0x4f, 0x18, - 0x69, 0xd9, 0x08, 0xdc, 0x48, 0x7a, 0x27, 0x0c, 0x39, 0x17, 0x09, 0x2a, 0x91, 0xbd, 0xdf, 0x68, - 0x03, 0xd5, 0x6c, 0x5f, 0x6d, 0xb4, 0xd9, 0xc9, 0xd9, 0xee, 0xa5, 0xa5, 0xee, 0x85, 0x46, 0xf7, - 0x50, 0x75, 0xec, 0x2e, 0xa3, 0xfb, 0x3d, 0x48, 0xed, 0xea, 0xf3, 0xe8, 0xcd, 0x43, 0x3e, 0x9f, - 0xb0, 0x3c, 0x19, 0x7e, 0xcf, 0x3f, 0x42, 0xcb, 0xe7, 0xa3, 0xfa, 0xcf, 0xc6, 0xe8, 0x0d, 0x4a, - 0x6c, 0x0f, 0x01, 0xee, 0xb1, 0xf3, 0xe5, 0x7c, 0x22, 0x62, 0x01, 0x0e, 0x01, 0xca, 0xbf, 0x8f, - 0x6a, 0x01, 0x71, 0x08, 0xd0, 0x03, 0x80, 0xbd, 0x69, 0xc9, 0x18, 0x6a, 0xaf, 0x16, 0x04, 0xed, - 0x69, 0xc0, 0x66, 0x11, 0xc6, 0x5e, 0x9d, 0xa8, 0xc3, 0x43, 0x7b, 0x56, 0x47, 0x4a, 0x89, 0x2c, - 0xa2, 0x4d, 0xd9, 0xe0, 0x56, 0xd5, 0x97, 0xf7, 0xcb, 0x2c, 0x17, 0x8b, 0xb8, 0x5c, 0x83, 0xe0, - 0xd6, 0xb5, 0x74, 0x00, 0x22, 0xb8, 0x51, 0xd0, 0xf6, 0xda, 0xe6, 0x31, 0xcf, 0xae, 0xf6, 0x79, - 0xc9, 0x97, 0x22, 0xcd, 0x19, 0xbc, 0x63, 0xc4, 0x3c, 0x50, 0x97, 0x21, 0x7a, 0x2d, 0xc5, 0xda, - 0x2c, 0x57, 0x12, 0xea, 0x3c, 0xa1, 0xbc, 0x26, 0xbd, 0x12, 0xbc, 0x84, 0xef, 0x13, 0x95, 0x15, - 0x08, 0x11, 0x59, 0x2e, 0x09, 0x83, 0xb6, 0x3f, 0x49, 0xf3, 0x39, 0xda, 0xf6, 0x27, 0xee, 0x3d, - 0xbf, 0xb7, 0x68, 0xc0, 0x76, 0x28, 0xf5, 0xd0, 0x54, 0x07, 0xd0, 0x5f, 0xed, 0xa2, 0x0f, 0xdd, - 0x25, 0x88, 0x0e, 0x85, 0x93, 0xc0, 0xd5, 0x17, 0x05, 0xcb, 0x59, 0xd2, 0x9c, 0x9a, 0xc3, 0x5c, - 0x79, 0x44, 0xd0, 0x15, 0x24, 0xed, 0x58, 0x24, 0xe5, 0xa7, 0xcb, 0xfc, 0xa4, 0xe4, 0x17, 0x69, - 0xc6, 0x4a, 0x30, 0x16, 0x29, 0x75, 0x47, 0x4e, 0x8c, 0x45, 0x18, 0x67, 0x8f, 0x5f, 0x48, 0xa9, - 0x77, 0xd7, 0xff, 0xb4, 0x8c, 0x67, 0xf0, 0xf8, 0x85, 0xb2, 0xd1, 0xc6, 0x88, 0x9d, 0xc1, 0x00, - 0xee, 0x24, 0x3a, 0xca, 0x75, 0xbe, 0x96, 0xf1, 0xa1, 0xbf, 0x1a, 0x95, 0xb7, 0xdf, 0x56, 0x20, - 0xd1, 0xd1, 0xe6, 0x30, 0x92, 0x48, 0x74, 0xc2, 0x1a, 0x76, 0x2a, 0x91, 0xdc, 0xb1, 0x3e, 0x56, - 0x04, 0xa6, 0x12, 0x65, 0xa3, 0x11, 0x12, 0x53, 0x49, 0x0b, 0x02, 0x03, 0x52, 0xd3, 0x0d, 0xe6, - 0xe8, 0x80, 0x64, 0xa4, 0xc1, 0x01, 0xc9, 0xa5, 0xec, 0x40, 0x71, 0x90, 0xa7, 0x22, 0x8d, 0xb3, - 0x09, 0x13, 0x27, 0x71, 0x19, 0x2f, 0x98, 0x60, 0x25, 0x1c, 0x28, 0x34, 0x32, 0xf2, 0x18, 0x62, - 0xa0, 0xa0, 0x58, 0xed, 0xf0, 0x37, 0xa3, 0xb7, 0xeb, 0x79, 0x9f, 0xe5, 0xfa, 0x57, 0x8a, 0x9e, - 0xc9, 0x9f, 0x37, 0x1b, 0xbe, 0x63, 0x6c, 0x4c, 0x44, 0xc9, 0xe2, 0x45, 0x63, 0xfb, 0x2d, 0xf3, - 0x77, 0x09, 0x3e, 0x1a, 0xd4, 0xf1, 0x7c, 0xcc, 0x45, 0x7a, 0x51, 0x2f, 0xb3, 0xf5, 0x17, 0x44, - 0x20, 0x9e, 0x5d, 0xf1, 0x28, 0x70, 0xeb, 0x08, 0xc6, 0xd9, 0x71, 0xda, 0x95, 0x9e, 0xb2, 0x22, - 0x83, 0xe3, 0xb4, 0xa7, 0x2d, 0x01, 0x62, 0x9c, 0x46, 0x41, 0xdb, 0x39, 0x5d, 0xf1, 0x94, 0x85, - 0x2b, 0x33, 0x65, 0xfd, 0x2a, 0x33, 0xf5, 0x3e, 0xca, 0xc8, 0xa2, 0xb7, 0x8f, 0xd8, 0xe2, 0x9c, - 0x95, 0xd5, 0x65, 0x5a, 0x50, 0x37, 0xf4, 0x5a, 0xa2, 0xf3, 0x86, 0x5e, 0x02, 0xb5, 0x33, 0x81, - 0x05, 0x0e, 0xaa, 0xe3, 0x78, 0xc1, 0xe4, 0x1d, 0x2a, 0x60, 0x26, 0x70, 0x8c, 0x38, 0x10, 0x31, - 0x13, 0x90, 0xb0, 0xf3, 0x7d, 0x97, 0x65, 0x4e, 0xd9, 0xbc, 0x8e, 0xb0, 0xf2, 0x24, 0x5e, 0x2f, - 0x58, 0x2e, 0xb4, 0x49, 0xb0, 0x27, 0xef, 0x98, 0xc4, 0x79, 0x62, 0x4f, 0xbe, 0x8f, 0x9e, 0x33, - 0x34, 0x79, 0x0f, 0xfe, 0x84, 0x97, 0x42, 0xfd, 0x06, 0xd9, 0x59, 0x99, 0x81, 0xa1, 0xc9, 0x7f, - 0xa8, 0x1e, 0x49, 0x0c, 0x4d, 0x61, 0x0d, 0xe7, 0xf7, 0x26, 0xbc, 0x32, 0xbc, 0x60, 0xa5, 0x89, - 0x93, 0x67, 0x8b, 0x38, 0xcd, 0x74, 0x34, 0x7c, 0x3f, 0x60, 0x9b, 0xd0, 0x21, 0x7e, 0x6f, 0xa2, - 0xaf, 0xae, 0xf3, 0x0b, 0x1d, 0xe1, 0x12, 0x82, 0x57, 0x04, 0x1d, 0xf6, 0x89, 0x57, 0x04, 0xdd, - 0x5a, 0x76, 0xe5, 0x6e, 0x59, 0xc9, 0xad, 0x25, 0xb1, 0xcb, 0x13, 0xb8, 0x5f, 0xe8, 0xd8, 0x04, - 0x20, 0xb1, 0x72, 0x0f, 0x2a, 0xd8, 0xd4, 0xc0, 0x62, 0xcf, 0xd3, 0x3c, 0xce, 0xd2, 0x9f, 0xc0, - 0xb4, 0xde, 0xb1, 0xd3, 0x10, 0x44, 0x6a, 0x80, 0x93, 0x98, 0xab, 0x7d, 0x26, 0xa6, 0x69, 0x3d, - 0xf4, 0xdf, 0x0b, 0x3c, 0x37, 0x49, 0x74, 0xbb, 0x72, 0x48, 0xe7, 0x36, 0x5e, 0xf8, 0x58, 0xc7, - 0x45, 0x31, 0xa9, 0x67, 0xd5, 0x53, 0x36, 0x63, 0x69, 0x21, 0x86, 0x1f, 0x87, 0x9f, 0x15, 0xc0, - 0x89, 0x83, 0x16, 0x3d, 0xd4, 0x9c, 0xd7, 0xf7, 0xf5, 0x58, 0x32, 0x51, 0x3f, 0xce, 0x79, 0x56, - 0xb1, 0x52, 0x27, 0x1a, 0xfb, 0x4c, 0x80, 0xde, 0xe9, 0x70, 0x23, 0x07, 0xac, 0x2b, 0x4a, 0xf4, - 0xce, 0xb0, 0x86, 0xdd, 0xec, 0x73, 0x38, 0x7d, 0xbb, 0xba, 0x3c, 0x6f, 0xf8, 0x90, 0x34, 0xe6, - 0x50, 0xc4, 0x66, 0x1f, 0x4d, 0xdb, 0x6c, 0xad, 0xed, 0x76, 0x9c, 0xaf, 0x0f, 0xe0, 0x91, 0x09, - 0xc4, 0x92, 0xc4, 0x88, 0x6c, 0x2d, 0x80, 0x3b, 0x9b, 0xe1, 0x25, 0x8f, 0x93, 0x59, 0x5c, 0x89, - 0x93, 0x78, 0x9d, 0xf1, 0x38, 0x91, 0xf3, 0x3a, 0xdc, 0x0c, 0x6f, 0x98, 0x91, 0x0b, 0x51, 0x9b, - 0xe1, 0x14, 0xec, 0x66, 0x67, 0xf2, 0x37, 0x47, 0xf5, 0x59, 0x4e, 0x98, 0x9d, 0xc9, 0xf2, 0xc2, - 0x73, 0x9c, 0x77, 0xc2, 0x90, 0xfd, 0x06, 0x4d, 0x89, 0x64, 0x1a, 0x72, 0x0b, 0xd3, 0xf1, 0x12, - 0x90, 0xf7, 0x03, 0x84, 0xbd, 0x81, 0x44, 0xfd, 0xbd, 0xf9, 0x99, 0x29, 0xa1, 0xef, 0x2c, 0x7f, - 0x88, 0xe9, 0xba, 0xd0, 0xc8, 0xbd, 0xc8, 0x62, 0xbb, 0x27, 0x6d, 0xd3, 0xcc, 0xdd, 0xcb, 0x58, - 0x8c, 0x93, 0xe4, 0x88, 0x55, 0xc8, 0x07, 0xe5, 0xb5, 0x70, 0x64, 0xa5, 0x44, 0x9a, 0xd9, 0xa6, - 0x6c, 0xa0, 0xd7, 0xb2, 0x67, 0x49, 0x2a, 0xb4, 0xac, 0x39, 0x21, 0xfd, 0xb0, 0x6d, 0xa0, 0x4d, - 0x11, 0xb5, 0xa2, 0x69, 0x3b, 0x96, 0xd7, 0xcc, 0x94, 0xcf, 0xe7, 0x19, 0xd3, 0xd0, 0x29, 0x8b, - 0xd5, 0x95, 0x8d, 0x3b, 0x6d, 0x5b, 0x28, 0x48, 0x8c, 0xe5, 0x41, 0x05, 0x9b, 0x46, 0xd6, 0x98, - 0x7a, 0x25, 0xd5, 0x3c, 0xd8, 0xcd, 0xb6, 0x19, 0x0f, 0x20, 0xd2, 0x48, 0x14, 0xb4, 0xdf, 0xbd, - 0xd5, 0xe2, 0x7d, 0xd6, 0x3c, 0x09, 0x78, 0xd9, 0x94, 0x54, 0x76, 0xc4, 0xc4, 0x77, 0x6f, 0x08, - 0x66, 0xd7, 0x09, 0xc0, 0xc3, 0xd3, 0xf5, 0x41, 0x02, 0xd7, 0x09, 0x50, 0x5f, 0x32, 0xc4, 0x3a, - 0x81, 0x62, 0xfd, 0xa6, 0x33, 0xfb, 0x5e, 0x87, 0x71, 0x65, 0x2b, 0x87, 0x34, 0x1d, 0x0a, 0x86, - 0x9a, 0x8e, 0x52, 0xf0, 0x1f, 0xa9, 0xbb, 0xb5, 0x86, 0x3c, 0x52, 0x6c, 0x5f, 0x6d, 0xa3, 0x0b, - 0xb3, 0xb9, 0x7f, 0x2d, 0x3c, 0x65, 0x71, 0x62, 0x2a, 0x86, 0xe8, 0xba, 0x72, 0x22, 0xf7, 0xc7, - 0x38, 0xed, 0xe4, 0x77, 0xa2, 0xa1, 0xaa, 0x46, 0xe9, 0xba, 0xb9, 0x85, 0x15, 0xb1, 0x26, 0x88, - 0x81, 0xca, 0x27, 0x9c, 0xc4, 0xcd, 0x6b, 0xa2, 0x29, 0xd7, 0x0e, 0xf4, 0x77, 0x99, 0x15, 0x48, - 0xdc, 0xfc, 0xc7, 0xde, 0xa2, 0x89, 0xc4, 0xad, 0x5b, 0xcb, 0x8e, 0xf3, 0x66, 0x7d, 0x2e, 0x8f, - 0x80, 0xe1, 0xbf, 0x7d, 0xa1, 0x84, 0xc4, 0x38, 0xdf, 0x82, 0x94, 0xed, 0xa7, 0xef, 0xff, 0xc7, - 0x57, 0x37, 0x06, 0x3f, 0xfb, 0xea, 0xc6, 0xe0, 0xbf, 0xbe, 0xba, 0x31, 0xf8, 0xe9, 0xd7, 0x37, - 0xde, 0xf8, 0xd9, 0xd7, 0x37, 0xde, 0xf8, 0xcf, 0xaf, 0x6f, 0xbc, 0xf1, 0xe5, 0x9b, 0xfa, 0xb7, - 0xbd, 0xcf, 0xff, 0x9f, 0xfc, 0x85, 0xee, 0x27, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x49, 0x2e, - 0xb9, 0x13, 0xff, 0x7b, 0x00, 0x00, + // 5583 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x9d, 0x5b, 0x8f, 0x1c, 0x49, + 0x56, 0xf8, 0xa7, 0x5e, 0xfe, 0xf3, 0x27, 0x97, 0x1d, 0xa0, 0x06, 0x86, 0xd9, 0x61, 0xd7, 0xf6, + 0x78, 0xec, 0x6e, 0xdb, 0xed, 0xae, 0xf6, 0xd8, 0x73, 0x63, 0x17, 0x09, 0xca, 0xdd, 0x76, 0x4f, + 0xef, 0x76, 0xf7, 0x34, 0x5d, 0xd5, 0xb6, 0x18, 0x09, 0x89, 0xec, 0xca, 0xe8, 0xea, 0xa4, 0xb3, + 0x32, 0x72, 0x33, 0xa3, 0xca, 0xae, 0x45, 0x20, 0x10, 0x08, 0x04, 0x02, 0xb1, 0xe2, 0x26, 0x78, + 0x42, 0xe2, 0x13, 0xf0, 0x31, 0x78, 0x41, 0xda, 0x47, 0x1e, 0xd1, 0xcc, 0x87, 0xe0, 0x15, 0x65, + 0x44, 0x64, 0x5c, 0x4e, 0x9e, 0x13, 0x99, 0x3d, 0x3c, 0xd9, 0xea, 0xf3, 0x3b, 0xe7, 0xc4, 0xe5, + 0x44, 0xc4, 0x89, 0xc8, 0xc8, 0xac, 0xe8, 0x66, 0x71, 0xbe, 0x53, 0x94, 0x5c, 0xf0, 0x6a, 0xa7, + 0x62, 0xe5, 0x2a, 0x9d, 0xb1, 0xe6, 0xdf, 0x91, 0xfc, 0xf3, 0xf0, 0xcd, 0x38, 0x5f, 0x8b, 0x75, + 0xc1, 0xde, 0x7b, 0xd7, 0x92, 0x33, 0xbe, 0x58, 0xc4, 0x79, 0x52, 0x29, 0xe4, 0xbd, 0x77, 0xac, + 0x84, 0xad, 0x58, 0x2e, 0xf4, 0xdf, 0x1f, 0xff, 0xe7, 0xff, 0x0c, 0xa2, 0xb7, 0x76, 0xb3, 0x94, + 0xe5, 0x62, 0x57, 0x6b, 0x0c, 0xbf, 0x8c, 0xbe, 0x3d, 0x2e, 0x8a, 0x7d, 0x26, 0x5e, 0xb0, 0xb2, + 0x4a, 0x79, 0x3e, 0xfc, 0x60, 0xa4, 0x1d, 0x8c, 0x4e, 0x8b, 0xd9, 0x68, 0x5c, 0x14, 0x23, 0x2b, + 0x1c, 0x9d, 0xb2, 0x1f, 0x2f, 0x59, 0x25, 0xde, 0xbb, 0x13, 0x86, 0xaa, 0x82, 0xe7, 0x15, 0x1b, + 0x5e, 0x44, 0xbf, 0x34, 0x2e, 0x8a, 0x09, 0x13, 0x7b, 0xac, 0xae, 0xc0, 0x44, 0xc4, 0x82, 0x0d, + 0x37, 0x5b, 0xaa, 0x3e, 0x60, 0x7c, 0xdc, 0xeb, 0x06, 0xb5, 0x9f, 0x69, 0xf4, 0xad, 0xda, 0xcf, + 0xe5, 0x52, 0x24, 0xfc, 0x55, 0x3e, 0x7c, 0xbf, 0xad, 0xa8, 0x45, 0xc6, 0xf6, 0xed, 0x10, 0xa2, + 0xad, 0xbe, 0x8c, 0x7e, 0xfe, 0x65, 0x9c, 0x65, 0x4c, 0xec, 0x96, 0xac, 0x2e, 0xb8, 0xaf, 0xa3, + 0x44, 0x23, 0x25, 0x33, 0x76, 0x3f, 0x08, 0x32, 0xda, 0xf0, 0x97, 0xd1, 0xb7, 0x95, 0xe4, 0x94, + 0xcd, 0xf8, 0x8a, 0x95, 0x43, 0x54, 0x4b, 0x0b, 0x89, 0x26, 0x6f, 0x41, 0xd0, 0xf6, 0x2e, 0xcf, + 0x57, 0xac, 0x14, 0xb8, 0x6d, 0x2d, 0x0c, 0xdb, 0xb6, 0x90, 0xb6, 0xfd, 0x97, 0x83, 0xe8, 0xbb, + 0xe3, 0xd9, 0x8c, 0x2f, 0x73, 0x71, 0xc8, 0x67, 0x71, 0x76, 0x98, 0xe6, 0x57, 0xc7, 0xec, 0xd5, + 0xee, 0x65, 0xcd, 0xe7, 0x73, 0x36, 0x7c, 0xe2, 0xb7, 0xaa, 0x42, 0x47, 0x86, 0x1d, 0xb9, 0xb0, + 0xf1, 0xfd, 0xd1, 0xf5, 0x94, 0x74, 0x59, 0xfe, 0x76, 0x10, 0xdd, 0x80, 0x65, 0x99, 0xf0, 0x6c, + 0xc5, 0x6c, 0x69, 0x3e, 0xee, 0x30, 0xec, 0xe3, 0xa6, 0x3c, 0x9f, 0x5c, 0x57, 0x4d, 0x97, 0x28, + 0x8b, 0xde, 0x76, 0xc3, 0x65, 0xc2, 0x2a, 0x39, 0x9c, 0xee, 0xd3, 0x11, 0xa1, 0x11, 0xe3, 0xf9, + 0x41, 0x1f, 0x54, 0x7b, 0x4b, 0xa3, 0xa1, 0xf6, 0x96, 0xf1, 0xca, 0x38, 0xbb, 0x87, 0x5a, 0x70, + 0x08, 0xe3, 0xeb, 0x7e, 0x0f, 0x52, 0xbb, 0xfa, 0xbd, 0xe8, 0x17, 0x5e, 0xf2, 0xf2, 0xaa, 0x2a, + 0xe2, 0x19, 0xd3, 0x43, 0xe1, 0xae, 0xaf, 0xdd, 0x48, 0xe1, 0x68, 0xd8, 0xe8, 0xc2, 0x9c, 0xa0, + 0x6d, 0x84, 0x5f, 0x14, 0x0c, 0xce, 0x41, 0x56, 0xb1, 0x16, 0x52, 0x41, 0x0b, 0x21, 0x6d, 0xfb, + 0x2a, 0x1a, 0x5a, 0xdb, 0xe7, 0xbf, 0xcf, 0x66, 0x62, 0x9c, 0x24, 0xb0, 0x57, 0xac, 0xae, 0x24, + 0x46, 0xe3, 0x24, 0xa1, 0x7a, 0x05, 0x47, 0xb5, 0xb3, 0x57, 0xd1, 0x3b, 0xc0, 0xd9, 0x61, 0x5a, + 0x49, 0x87, 0xdb, 0x61, 0x2b, 0x1a, 0x33, 0x4e, 0x47, 0x7d, 0x71, 0xed, 0xf8, 0x8f, 0x07, 0xd1, + 0x77, 0x10, 0xcf, 0xa7, 0x6c, 0xc1, 0x57, 0x6c, 0xf8, 0xa8, 0xdb, 0x9a, 0x22, 0x8d, 0xff, 0x0f, + 0xaf, 0xa1, 0x81, 0x84, 0xc9, 0x84, 0x65, 0x6c, 0x26, 0xc8, 0x30, 0x51, 0xe2, 0xce, 0x30, 0x31, + 0x98, 0x33, 0xc2, 0x1a, 0xe1, 0x3e, 0x13, 0xbb, 0xcb, 0xb2, 0x64, 0xb9, 0x20, 0xfb, 0xd2, 0x22, + 0x9d, 0x7d, 0xe9, 0xa1, 0x48, 0x7d, 0xf6, 0x99, 0x18, 0x67, 0x19, 0x59, 0x1f, 0x25, 0xee, 0xac, + 0x8f, 0xc1, 0xb4, 0x87, 0x59, 0xf4, 0x8b, 0x4e, 0x8b, 0x89, 0x83, 0xfc, 0x82, 0x0f, 0xe9, 0xb6, + 0x90, 0x72, 0xe3, 0x63, 0xb3, 0x93, 0x43, 0xaa, 0xf1, 0xec, 0x75, 0xc1, 0x4b, 0xba, 0x5b, 0x94, + 0xb8, 0xb3, 0x1a, 0x06, 0xd3, 0x1e, 0x7e, 0x37, 0x7a, 0x4b, 0xcf, 0x92, 0xcd, 0x7a, 0x76, 0x07, + 0x9d, 0x42, 0xe1, 0x82, 0x76, 0xb7, 0x83, 0x6a, 0x99, 0x3f, 0x4a, 0xe7, 0x65, 0x3d, 0xfb, 0xe0, + 0xe6, 0xb5, 0xb4, 0xc3, 0xbc, 0xa5, 0xb4, 0x79, 0x1e, 0xfd, 0xb2, 0x6f, 0x7e, 0x37, 0xce, 0x67, + 0x2c, 0x1b, 0x3e, 0x08, 0xa9, 0x2b, 0xc6, 0xb8, 0xda, 0xea, 0xc5, 0xda, 0xc9, 0x4e, 0x13, 0x7a, + 0x32, 0xfd, 0x00, 0xd5, 0x06, 0x53, 0xe9, 0x9d, 0x30, 0xd4, 0xb2, 0xbd, 0xc7, 0x32, 0x46, 0xda, + 0x56, 0xc2, 0x0e, 0xdb, 0x06, 0xd2, 0xb6, 0xcb, 0xe8, 0x57, 0x4c, 0x37, 0xd7, 0x79, 0x81, 0x94, + 0xd7, 0x8b, 0xce, 0x16, 0xd1, 0x8f, 0x2e, 0x64, 0x7c, 0x3d, 0xec, 0x07, 0xb7, 0xea, 0xa3, 0x67, + 0x14, 0xbc, 0x3e, 0x60, 0x3e, 0xb9, 0x13, 0x86, 0xb4, 0xed, 0xbf, 0x1a, 0x44, 0xdf, 0xd3, 0xb2, + 0x67, 0x79, 0x7c, 0x9e, 0x31, 0xb9, 0xc4, 0x1f, 0x33, 0xf1, 0x8a, 0x97, 0x57, 0x93, 0x75, 0x3e, + 0x23, 0xd2, 0x19, 0x1c, 0xee, 0x48, 0x67, 0x48, 0x25, 0x5d, 0x98, 0x3f, 0x88, 0xde, 0x6d, 0x82, + 0xe2, 0x32, 0xce, 0xe7, 0xec, 0x87, 0x15, 0xcf, 0xc7, 0x45, 0x3a, 0x4e, 0x92, 0x72, 0x38, 0xc2, + 0xbb, 0x1e, 0x72, 0xa6, 0x04, 0x3b, 0xbd, 0x79, 0x27, 0x7d, 0xd6, 0xad, 0x2c, 0x78, 0x01, 0xd3, + 0xe7, 0xa6, 0xf9, 0x04, 0x2f, 0xa8, 0xf4, 0xd9, 0x47, 0x5a, 0x56, 0x8f, 0xea, 0x35, 0x08, 0xb7, + 0x7a, 0xe4, 0x2e, 0x3a, 0xb7, 0x43, 0x88, 0x5d, 0x03, 0x9a, 0x86, 0xe2, 0xf9, 0x45, 0x3a, 0x3f, + 0x2b, 0x92, 0x7a, 0x0c, 0xdd, 0xc7, 0xeb, 0xec, 0x20, 0xc4, 0x1a, 0x40, 0xa0, 0xda, 0xdb, 0xdf, + 0xd8, 0x2c, 0x53, 0xcf, 0x4b, 0xcf, 0x4b, 0xbe, 0x38, 0x64, 0xf3, 0x78, 0xb6, 0xd6, 0x93, 0xe9, + 0x47, 0xa1, 0x59, 0x0c, 0xd2, 0xa6, 0x10, 0x1f, 0x5f, 0x53, 0x4b, 0x97, 0xe7, 0x5f, 0x07, 0xd1, + 0x1d, 0x2f, 0x4e, 0x74, 0x30, 0xa9, 0xd2, 0x8f, 0xf3, 0xe4, 0x94, 0x55, 0x22, 0x2e, 0xc5, 0xf0, + 0xfb, 0x81, 0x18, 0x20, 0x74, 0x4c, 0xd9, 0x7e, 0xf0, 0x8d, 0x74, 0x6d, 0xaf, 0x4f, 0xea, 0x55, + 0x42, 0xcf, 0x3f, 0x7e, 0xaf, 0x4b, 0x09, 0x9c, 0x7d, 0x6e, 0x87, 0x10, 0xdb, 0xeb, 0x52, 0x70, + 0x90, 0xaf, 0x52, 0xc1, 0xf6, 0x59, 0xce, 0xca, 0x76, 0xaf, 0x2b, 0x55, 0x1f, 0x21, 0x7a, 0x9d, + 0x40, 0xed, 0x4c, 0xe7, 0x79, 0x33, 0x99, 0xc6, 0x56, 0xc0, 0x48, 0x2b, 0xd7, 0x78, 0xd8, 0x0f, + 0xb6, 0x5b, 0x65, 0xc7, 0xe7, 0x29, 0x5b, 0xf1, 0x2b, 0xb8, 0x55, 0x76, 0x4d, 0x28, 0x80, 0xd8, + 0x2a, 0xa3, 0xa0, 0x4d, 0x07, 0x1c, 0x3f, 0x2f, 0x52, 0xf6, 0x0a, 0xa4, 0x03, 0xae, 0x72, 0x2d, + 0x26, 0xd2, 0x01, 0x04, 0xd3, 0x1e, 0x8e, 0xa3, 0x9f, 0x93, 0xc2, 0x1f, 0xf2, 0x34, 0x1f, 0xde, + 0x44, 0x94, 0x6a, 0x81, 0xb1, 0x7a, 0x8b, 0x06, 0x40, 0x89, 0xeb, 0xbf, 0xea, 0xb5, 0xf9, 0x2e, + 0xa1, 0x04, 0x96, 0xe5, 0x8d, 0x2e, 0xcc, 0xe6, 0x61, 0x52, 0x58, 0xcf, 0x5f, 0x93, 0xcb, 0xb8, + 0x4c, 0xf3, 0xf9, 0x10, 0xd3, 0x75, 0xe4, 0x44, 0x1e, 0x86, 0x71, 0x20, 0x84, 0xb5, 0xe2, 0xb8, + 0x28, 0xca, 0x7a, 0x5a, 0xc4, 0x42, 0xd8, 0x47, 0x82, 0x21, 0xdc, 0x42, 0x71, 0x6f, 0x7b, 0x6c, + 0x96, 0xa5, 0x79, 0xd0, 0x9b, 0x46, 0xfa, 0x78, 0xb3, 0x28, 0x08, 0xde, 0x43, 0x16, 0xaf, 0x58, + 0x53, 0x33, 0xac, 0x65, 0x5c, 0x20, 0x18, 0xbc, 0x00, 0xb4, 0x9b, 0x5e, 0x29, 0x3e, 0x8a, 0xaf, + 0x58, 0xdd, 0xc0, 0xac, 0x5e, 0x54, 0x87, 0x98, 0xbe, 0x47, 0x10, 0x9b, 0x5e, 0x9c, 0xd4, 0xae, + 0x96, 0xd1, 0x3b, 0x52, 0x7e, 0x12, 0x97, 0x22, 0x9d, 0xa5, 0x45, 0x9c, 0x37, 0x9b, 0x29, 0x6c, + 0x5c, 0xb7, 0x28, 0xe3, 0x72, 0xbb, 0x27, 0xad, 0xdd, 0xfe, 0xd3, 0x20, 0x7a, 0x1f, 0xfa, 0x3d, + 0x61, 0xe5, 0x22, 0x95, 0x7b, 0xf2, 0x4a, 0x4d, 0xc2, 0xc3, 0x4f, 0xc3, 0x46, 0x5b, 0x0a, 0xa6, + 0x34, 0x9f, 0x5d, 0x5f, 0xd1, 0x66, 0x62, 0x13, 0xbd, 0x4f, 0xf9, 0xa2, 0x4c, 0x5a, 0x67, 0x56, + 0x93, 0x66, 0xf3, 0x21, 0x85, 0x44, 0x26, 0xd6, 0x82, 0xc0, 0x08, 0x3f, 0xcb, 0xab, 0xc6, 0x3a, + 0x36, 0xc2, 0xad, 0x38, 0x38, 0xc2, 0x3d, 0xcc, 0x8e, 0xf0, 0x93, 0xe5, 0x79, 0x96, 0x56, 0x97, + 0x69, 0x3e, 0xd7, 0x69, 0xb7, 0xaf, 0x6b, 0xc5, 0x30, 0xf3, 0xde, 0xec, 0xe4, 0x30, 0x27, 0x3a, + 0x58, 0x48, 0x27, 0x20, 0x4c, 0x36, 0x3b, 0x39, 0xbb, 0x1b, 0xb2, 0xd2, 0x7a, 0x1b, 0x0e, 0x76, + 0x43, 0x8e, 0x6a, 0x2d, 0x25, 0x76, 0x43, 0x6d, 0xca, 0xee, 0x86, 0xdc, 0x3a, 0x54, 0x3c, 0x5b, + 0xb1, 0xb3, 0x32, 0x05, 0xbb, 0x21, 0xaf, 0x7c, 0x0d, 0x43, 0xec, 0x86, 0x28, 0xd6, 0x4e, 0x54, + 0x96, 0xd8, 0x67, 0x62, 0x22, 0x62, 0xb1, 0xac, 0xc0, 0x44, 0xe5, 0xd8, 0x30, 0x08, 0x31, 0x51, + 0x11, 0xa8, 0xf6, 0xf6, 0xdb, 0x51, 0xa4, 0x4e, 0x30, 0xe4, 0x29, 0x93, 0xbf, 0xf6, 0xe8, 0xa3, + 0x0d, 0xef, 0x88, 0xe9, 0xfd, 0x00, 0x61, 0x13, 0x1e, 0xf5, 0x77, 0x79, 0x78, 0x36, 0x44, 0x35, + 0xa4, 0x88, 0x48, 0x78, 0x00, 0x02, 0x0b, 0x3a, 0xb9, 0xe4, 0xaf, 0xf0, 0x82, 0xd6, 0x92, 0x70, + 0x41, 0x35, 0x61, 0x8f, 0xb3, 0x75, 0x41, 0xb1, 0xe3, 0xec, 0xa6, 0x18, 0xa1, 0xe3, 0x6c, 0xc8, + 0xd8, 0x98, 0x71, 0x0d, 0x3f, 0xe5, 0xfc, 0x6a, 0x11, 0x97, 0x57, 0x20, 0x66, 0x3c, 0xe5, 0x86, + 0x21, 0x62, 0x86, 0x62, 0x6d, 0xcc, 0xb8, 0x0e, 0xeb, 0x74, 0xf9, 0xac, 0xcc, 0x40, 0xcc, 0x78, + 0x36, 0x34, 0x42, 0xc4, 0x0c, 0x81, 0xda, 0xd9, 0xc9, 0xf5, 0x36, 0x61, 0xf0, 0x00, 0xc5, 0x53, + 0x9f, 0x30, 0xea, 0x00, 0x05, 0xc1, 0x60, 0x08, 0xed, 0x97, 0x71, 0x71, 0x89, 0x87, 0x90, 0x14, + 0x85, 0x43, 0xa8, 0x41, 0x60, 0x7f, 0x4f, 0x58, 0x5c, 0xce, 0x2e, 0xf1, 0xfe, 0x56, 0xb2, 0x70, + 0x7f, 0x1b, 0x06, 0xf6, 0xb7, 0x12, 0xbc, 0x4c, 0xc5, 0xe5, 0x11, 0x13, 0x31, 0xde, 0xdf, 0x3e, + 0x13, 0xee, 0xef, 0x16, 0x6b, 0xf3, 0x71, 0xd7, 0xe1, 0x64, 0x79, 0x5e, 0xcd, 0xca, 0xf4, 0x9c, + 0x0d, 0x03, 0x56, 0x0c, 0x44, 0xe4, 0xe3, 0x24, 0xac, 0x7d, 0xfe, 0x74, 0x10, 0xdd, 0x6c, 0xba, + 0x9d, 0x57, 0x95, 0x5e, 0xfb, 0x7c, 0xf7, 0x1f, 0xe3, 0xfd, 0x4b, 0xe0, 0xc4, 0x03, 0x86, 0x1e, + 0x6a, 0x4e, 0x6e, 0x80, 0x17, 0xe9, 0x2c, 0xaf, 0x4c, 0xa1, 0x3e, 0xed, 0x63, 0xdd, 0x51, 0x20, + 0x72, 0x83, 0x5e, 0x8a, 0x36, 0x2d, 0xd3, 0xfd, 0xd3, 0xc8, 0x0e, 0x92, 0x0a, 0xa4, 0x65, 0x4d, + 0x7b, 0x3b, 0x04, 0x91, 0x96, 0xe1, 0x24, 0x0c, 0x85, 0xfd, 0x92, 0x2f, 0x8b, 0xaa, 0x23, 0x14, + 0x00, 0x14, 0x0e, 0x85, 0x36, 0xac, 0x7d, 0xbe, 0x8e, 0x7e, 0xd5, 0x0d, 0x3f, 0xb7, 0xb1, 0xb7, + 0xe9, 0x98, 0xc2, 0x9a, 0x78, 0xd4, 0x17, 0xb7, 0x19, 0x45, 0xe3, 0x59, 0xec, 0x31, 0x11, 0xa7, + 0x59, 0x35, 0xdc, 0xc0, 0x6d, 0x34, 0x72, 0x22, 0xa3, 0xc0, 0x38, 0x38, 0xbf, 0xed, 0x2d, 0x8b, + 0x2c, 0x9d, 0xb5, 0x1f, 0xef, 0x68, 0x5d, 0x23, 0x0e, 0xcf, 0x6f, 0x2e, 0x06, 0xe7, 0xeb, 0x3a, + 0xf5, 0x93, 0xff, 0x99, 0xae, 0x0b, 0x86, 0xcf, 0xd7, 0x1e, 0x12, 0x9e, 0xaf, 0x21, 0x0a, 0xeb, + 0x33, 0x61, 0xe2, 0x30, 0x5e, 0xf3, 0x25, 0x31, 0x5f, 0x1b, 0x71, 0xb8, 0x3e, 0x2e, 0x66, 0xf7, + 0x06, 0xc6, 0xc3, 0x41, 0x2e, 0x58, 0x99, 0xc7, 0xd9, 0xf3, 0x2c, 0x9e, 0x57, 0x43, 0x62, 0x8e, + 0xf1, 0x29, 0x62, 0x6f, 0x40, 0xd3, 0x48, 0x33, 0x1e, 0x54, 0xcf, 0xe3, 0x15, 0x2f, 0x53, 0x41, + 0x37, 0xa3, 0x45, 0x3a, 0x9b, 0xd1, 0x43, 0x51, 0x6f, 0xe3, 0x72, 0x76, 0x99, 0xae, 0x58, 0x12, + 0xf0, 0xd6, 0x20, 0x3d, 0xbc, 0x39, 0x28, 0xd2, 0x69, 0x13, 0xbe, 0x2c, 0x67, 0x8c, 0xec, 0x34, + 0x25, 0xee, 0xec, 0x34, 0x83, 0x69, 0x0f, 0x7f, 0x36, 0x88, 0x7e, 0x4d, 0x49, 0xdd, 0x67, 0x2e, + 0x7b, 0x71, 0x75, 0x79, 0xce, 0xe3, 0x32, 0x19, 0x7e, 0x88, 0xd9, 0x41, 0x51, 0xe3, 0xfa, 0xf1, + 0x75, 0x54, 0x60, 0xb3, 0xd6, 0x79, 0xb7, 0x1d, 0x71, 0x68, 0xb3, 0x7a, 0x48, 0xb8, 0x59, 0x21, + 0x0a, 0x27, 0x10, 0x29, 0x57, 0x47, 0x72, 0x1b, 0xa4, 0xbe, 0x7f, 0x2e, 0xb7, 0xd9, 0xc9, 0xc1, + 0xf9, 0xb1, 0x16, 0xfa, 0xd1, 0xb2, 0x4d, 0xd9, 0xc0, 0x23, 0x66, 0xd4, 0x17, 0x27, 0x3d, 0x9b, + 0x51, 0x11, 0xf6, 0xdc, 0x1a, 0x19, 0xa3, 0xbe, 0x38, 0xe1, 0xd9, 0x99, 0xd6, 0x42, 0x9e, 0x91, + 0xa9, 0x6d, 0xd4, 0x17, 0x87, 0xd9, 0x97, 0x66, 0x9a, 0x75, 0xe1, 0x41, 0xc0, 0x0e, 0x5c, 0x1b, + 0xb6, 0x7a, 0xb1, 0xda, 0xe1, 0x5f, 0x0c, 0xa2, 0xef, 0x5a, 0x8f, 0x47, 0x3c, 0x49, 0x2f, 0xd6, + 0x0a, 0x7a, 0x11, 0x67, 0x4b, 0x56, 0x0d, 0x1f, 0x53, 0xd6, 0xda, 0xac, 0x29, 0xc1, 0x93, 0x6b, + 0xe9, 0xc0, 0xb1, 0x33, 0x2e, 0x8a, 0x6c, 0x3d, 0x65, 0x8b, 0x22, 0x23, 0xc7, 0x8e, 0x87, 0x84, + 0xc7, 0x0e, 0x44, 0x61, 0x56, 0x3e, 0xe5, 0x75, 0xce, 0x8f, 0x66, 0xe5, 0x52, 0x14, 0xce, 0xca, + 0x1b, 0x04, 0xe6, 0x4a, 0x53, 0xbe, 0xcb, 0xb3, 0x8c, 0xcd, 0x44, 0xfb, 0xde, 0x86, 0xd1, 0xb4, + 0x44, 0x38, 0x57, 0x02, 0xa4, 0x3d, 0x95, 0x6b, 0xf6, 0x90, 0x71, 0xc9, 0x9e, 0xae, 0x0f, 0xd3, + 0xfc, 0x6a, 0x88, 0xa7, 0x05, 0x16, 0x20, 0x4e, 0xe5, 0x50, 0x10, 0xee, 0x55, 0xcf, 0xf2, 0x84, + 0xe3, 0x7b, 0xd5, 0x5a, 0x12, 0xde, 0xab, 0x6a, 0x02, 0x9a, 0x3c, 0x65, 0x94, 0xc9, 0x5a, 0x12, + 0x36, 0xa9, 0x09, 0x6c, 0x2a, 0xd4, 0xcf, 0x6e, 0xc8, 0xa9, 0x10, 0x3c, 0xad, 0xd9, 0xec, 0xe4, + 0xe0, 0x9e, 0x4b, 0x3b, 0x40, 0x23, 0x02, 0x18, 0xff, 0x20, 0xc8, 0xc0, 0xd0, 0x6f, 0x76, 0xc3, + 0xcf, 0x99, 0x98, 0x5d, 0xe2, 0xa1, 0xef, 0x21, 0xe1, 0xd0, 0x87, 0x28, 0x6c, 0xab, 0x29, 0x37, + 0xbb, 0xf9, 0x0d, 0x3c, 0xf0, 0x5a, 0x3b, 0xf9, 0xcd, 0x4e, 0x0e, 0xb6, 0xd5, 0xc1, 0x82, 0x6e, + 0x2b, 0x25, 0x0b, 0xb7, 0x95, 0x61, 0x60, 0xe9, 0x95, 0x40, 0x1e, 0x92, 0x6d, 0xd0, 0x8a, 0xde, + 0x31, 0xd9, 0x66, 0x27, 0xa7, 0x9d, 0xfc, 0x83, 0xd9, 0x1f, 0x2a, 0xe9, 0x31, 0xaf, 0x07, 0xdf, + 0x8b, 0x38, 0x4b, 0x93, 0x58, 0xb0, 0x29, 0xbf, 0x62, 0x39, 0xbe, 0x15, 0xd3, 0xa5, 0x55, 0xfc, + 0xc8, 0x53, 0x08, 0x6f, 0xc5, 0xc2, 0x8a, 0x30, 0x4e, 0x14, 0x7d, 0x56, 0xb1, 0xdd, 0xb8, 0x22, + 0xa6, 0x48, 0x0f, 0x09, 0xc7, 0x09, 0x44, 0x61, 0x22, 0xac, 0xe4, 0xcf, 0x5e, 0x17, 0xac, 0x4c, + 0x59, 0x3e, 0x63, 0x78, 0x22, 0x0c, 0xa9, 0x70, 0x22, 0x8c, 0xd0, 0x70, 0x13, 0xb8, 0x17, 0x0b, + 0xf6, 0x74, 0x3d, 0x4d, 0x17, 0xac, 0x12, 0xf1, 0xa2, 0xc0, 0x37, 0x81, 0x00, 0x0a, 0x6f, 0x02, + 0xdb, 0x70, 0xeb, 0xcc, 0xc9, 0xcc, 0xb4, 0xed, 0x7b, 0x64, 0x90, 0x08, 0xdc, 0x23, 0x23, 0x50, + 0xd8, 0xb0, 0x16, 0x40, 0x9f, 0x3e, 0xb4, 0xac, 0x04, 0x9f, 0x3e, 0xd0, 0x74, 0xeb, 0x24, 0xcf, + 0x30, 0x93, 0x7a, 0x68, 0x76, 0x14, 0x7d, 0xe2, 0x0e, 0xd1, 0xad, 0x5e, 0x2c, 0x7e, 0x74, 0x78, + 0xca, 0xb2, 0x58, 0xae, 0x87, 0x81, 0xf3, 0xb9, 0x86, 0xe9, 0x73, 0x74, 0xe8, 0xb0, 0xda, 0xe1, + 0x9f, 0x0c, 0xa2, 0xf7, 0x30, 0x8f, 0x5f, 0x14, 0xd2, 0xef, 0xa3, 0x6e, 0x5b, 0x8a, 0x24, 0x2e, + 0xca, 0x85, 0x35, 0xec, 0x5d, 0x8f, 0x46, 0x64, 0xef, 0xd1, 0xe9, 0x02, 0xf8, 0xd9, 0xa0, 0x29, + 0x3f, 0xe4, 0x88, 0xbb, 0x1e, 0x21, 0xde, 0x6e, 0xb4, 0xfc, 0x72, 0x55, 0x60, 0xa3, 0x65, 0x6c, + 0x68, 0x31, 0xb1, 0xd1, 0x42, 0x30, 0x3b, 0x3a, 0xdd, 0xea, 0xbd, 0x4c, 0xc5, 0xa5, 0x4c, 0xe4, + 0xc0, 0xe8, 0xf4, 0xca, 0x6a, 0x20, 0x62, 0x74, 0x92, 0x30, 0x4c, 0x75, 0x1a, 0xb0, 0x1e, 0x9b, + 0xd8, 0x5c, 0x6e, 0x0c, 0xb9, 0x23, 0xf3, 0x5e, 0x37, 0x08, 0xe3, 0xb5, 0x11, 0xeb, 0x3d, 0xd5, + 0x83, 0x90, 0x05, 0xb0, 0xaf, 0xda, 0xea, 0xc5, 0x6a, 0x87, 0x7f, 0x14, 0x7d, 0xa7, 0x55, 0xb1, + 0xe7, 0x2c, 0x16, 0xcb, 0x92, 0x25, 0xc3, 0x9d, 0x8e, 0x72, 0x37, 0xa0, 0x71, 0xfd, 0xa8, 0xbf, + 0x42, 0x2b, 0xf9, 0x6f, 0x38, 0x15, 0x56, 0xa6, 0x0c, 0x8f, 0x43, 0x26, 0x7d, 0x36, 0x98, 0xfc, + 0xd3, 0x3a, 0xad, 0xfd, 0xbb, 0x1b, 0x5d, 0xe3, 0x55, 0x9c, 0x66, 0xf2, 0x29, 0xf0, 0x87, 0x21, + 0xa3, 0x1e, 0x1a, 0xdc, 0xbf, 0x93, 0x2a, 0xad, 0x99, 0x59, 0x8e, 0x71, 0x67, 0xdf, 0xf7, 0x90, + 0x9e, 0x09, 0x90, 0x6d, 0xdf, 0x76, 0x4f, 0x5a, 0xbb, 0x15, 0xcd, 0x92, 0x57, 0xff, 0xd9, 0x0d, + 0x72, 0xcc, 0xab, 0x56, 0x45, 0x22, 0x7d, 0xbb, 0x27, 0xad, 0xbd, 0xfe, 0x61, 0xf4, 0x6e, 0xdb, + 0xab, 0x5e, 0x88, 0x76, 0x3a, 0x4d, 0x81, 0xb5, 0xe8, 0x51, 0x7f, 0x05, 0xed, 0xfe, 0x9f, 0xcd, + 0x81, 0xb7, 0xf2, 0x3f, 0xe3, 0x8b, 0x05, 0xcb, 0x13, 0x96, 0x34, 0x1a, 0x55, 0xbd, 0x31, 0xfb, + 0x8c, 0xb6, 0x6b, 0x14, 0x46, 0xae, 0x86, 0x29, 0xd1, 0xaf, 0x7f, 0x03, 0x4d, 0x5d, 0xb4, 0x7f, + 0x1f, 0x44, 0xf7, 0xd1, 0xa2, 0x35, 0x81, 0xeb, 0x15, 0xf1, 0xb7, 0xfa, 0x38, 0xc2, 0x34, 0x4d, + 0x51, 0xc7, 0xff, 0x07, 0x0b, 0xba, 0xc8, 0xff, 0x32, 0x88, 0x6e, 0x5b, 0xc5, 0x3a, 0xbc, 0x77, + 0x79, 0x7e, 0x91, 0xa5, 0x33, 0x21, 0x1f, 0xf5, 0x6a, 0x15, 0xba, 0x39, 0x29, 0x8d, 0xee, 0xe6, + 0x0c, 0x68, 0xda, 0x5d, 0xf1, 0xe7, 0x69, 0x25, 0x78, 0xb9, 0x9e, 0x5c, 0xf2, 0x57, 0xcd, 0x9b, + 0x48, 0xfe, 0xbc, 0xac, 0x81, 0x91, 0x43, 0x10, 0xbb, 0x62, 0x9c, 0x6c, 0xb9, 0xb2, 0x6f, 0x2c, + 0x55, 0x84, 0x2b, 0x87, 0xe8, 0x70, 0xe5, 0x93, 0x76, 0x55, 0x6a, 0x6a, 0x65, 0x5f, 0xaf, 0xda, + 0xc4, 0x8b, 0xda, 0x7e, 0xc5, 0xea, 0x5e, 0x37, 0x68, 0x73, 0x53, 0x2d, 0xde, 0x4b, 0x2f, 0x2e, + 0x4c, 0x9d, 0xf0, 0x92, 0xba, 0x08, 0x91, 0x9b, 0x12, 0xa8, 0xdd, 0x5e, 0x3d, 0x4f, 0x33, 0x26, + 0x1f, 0x0a, 0x7d, 0x71, 0x71, 0x91, 0xf1, 0x38, 0x01, 0xdb, 0xab, 0x5a, 0x3c, 0x72, 0xe5, 0xc4, + 0xf6, 0x0a, 0xe3, 0xec, 0x75, 0x93, 0x5a, 0x5a, 0x47, 0x77, 0x3e, 0x4b, 0x33, 0x78, 0x91, 0x59, + 0x6a, 0x1a, 0x21, 0x71, 0xdd, 0xa4, 0x05, 0xd9, 0x14, 0xa8, 0x16, 0xd5, 0x51, 0xd9, 0x94, 0xff, + 0x6e, 0x5b, 0xd1, 0x11, 0x13, 0x29, 0x10, 0x82, 0xd9, 0xe3, 0x8b, 0x5a, 0x78, 0x56, 0x48, 0xe3, + 0xb7, 0xda, 0x5a, 0x4a, 0x42, 0x1c, 0x5f, 0xf8, 0x84, 0xdd, 0x2d, 0xd7, 0x7f, 0xdf, 0xe3, 0xaf, + 0x72, 0x69, 0xf4, 0x76, 0x5b, 0xa5, 0x91, 0x11, 0xbb, 0x65, 0xc8, 0x68, 0xc3, 0x3f, 0x8a, 0xfe, + 0xbf, 0x34, 0x5c, 0xf2, 0x62, 0x78, 0x03, 0x51, 0x28, 0x9d, 0x6b, 0xbf, 0x37, 0x49, 0xb9, 0xbd, + 0x9d, 0x62, 0x62, 0xe3, 0xac, 0x8a, 0xe7, 0xf0, 0xae, 0xbe, 0xed, 0x71, 0x29, 0x25, 0x6e, 0xa7, + 0xb4, 0x29, 0x3f, 0x2a, 0x8e, 0x79, 0xa2, 0xad, 0x23, 0x35, 0x34, 0xc2, 0x50, 0x54, 0xb8, 0x90, + 0x4d, 0x5b, 0x8f, 0xe3, 0x55, 0x3a, 0x37, 0xa9, 0x85, 0x9a, 0xc0, 0x2a, 0x90, 0xb6, 0x5a, 0x66, + 0xe4, 0x40, 0x44, 0xda, 0x4a, 0xc2, 0xda, 0xe7, 0xdf, 0x0f, 0xa2, 0x5b, 0x96, 0xd9, 0x6f, 0x0e, + 0x7c, 0x0f, 0xf2, 0x0b, 0x5e, 0x27, 0xb9, 0x87, 0x69, 0x7e, 0x55, 0x0d, 0x3f, 0xa1, 0x4c, 0xe2, + 0xbc, 0x29, 0xca, 0xa7, 0xd7, 0xd6, 0xb3, 0xfb, 0x93, 0xe6, 0x34, 0xd4, 0x5e, 0x89, 0x50, 0x1a, + 0x60, 0x7f, 0x62, 0x0e, 0x4d, 0x21, 0x47, 0xec, 0x4f, 0x42, 0xbc, 0xed, 0x62, 0xe3, 0x3c, 0xe3, + 0x39, 0xec, 0x62, 0x6b, 0xa1, 0x16, 0x12, 0x5d, 0xdc, 0x82, 0xec, 0x7c, 0xdc, 0x88, 0xd4, 0xf9, + 0xda, 0x38, 0xcb, 0xc0, 0x7c, 0x6c, 0x54, 0x0d, 0x40, 0xcc, 0xc7, 0x28, 0xa8, 0xfd, 0x9c, 0x46, + 0xdf, 0xaa, 0x9b, 0xf4, 0xa4, 0x64, 0xab, 0x94, 0xc1, 0xdb, 0x3b, 0x8e, 0x84, 0x18, 0xff, 0x3e, + 0x61, 0x47, 0xd6, 0x59, 0x5e, 0x15, 0x59, 0x5c, 0x5d, 0xea, 0xfb, 0x1c, 0x7e, 0x9d, 0x1b, 0x21, + 0xbc, 0xd1, 0x71, 0xb7, 0x83, 0xb2, 0x93, 0x7a, 0x23, 0x33, 0x53, 0xcc, 0x06, 0xae, 0xda, 0x9a, + 0x66, 0x36, 0x3b, 0x39, 0xfb, 0xd0, 0x64, 0x3f, 0xce, 0x32, 0x56, 0xae, 0x1b, 0xd9, 0x51, 0x9c, + 0xa7, 0x17, 0xac, 0x12, 0xe0, 0xa1, 0x89, 0xa6, 0x46, 0x10, 0x23, 0x1e, 0x9a, 0x04, 0x70, 0xbb, + 0x6f, 0x03, 0x9e, 0x0f, 0xf2, 0x84, 0xbd, 0x06, 0xfb, 0x36, 0x68, 0x47, 0x32, 0xc4, 0xbe, 0x8d, + 0x62, 0xed, 0xc3, 0x83, 0xa7, 0x19, 0x9f, 0x5d, 0xe9, 0x25, 0xc0, 0xef, 0x60, 0x29, 0x81, 0x6b, + 0xc0, 0xed, 0x10, 0x62, 0x17, 0x01, 0x29, 0x38, 0x65, 0x45, 0x16, 0xcf, 0xe0, 0x15, 0x2e, 0xa5, + 0xa3, 0x65, 0xc4, 0x22, 0x00, 0x19, 0x50, 0x5c, 0x7d, 0x35, 0x0c, 0x2b, 0x2e, 0xb8, 0x19, 0x76, + 0x3b, 0x84, 0xd8, 0x65, 0x50, 0x0a, 0x26, 0x45, 0x96, 0x0a, 0x30, 0x0c, 0x94, 0x86, 0x94, 0x10, + 0xc3, 0xc0, 0x27, 0x80, 0xc9, 0x23, 0x56, 0xce, 0x19, 0x6a, 0x52, 0x4a, 0x82, 0x26, 0x1b, 0xc2, + 0xde, 0x57, 0x57, 0x75, 0xe7, 0xc5, 0x1a, 0xdc, 0x57, 0xd7, 0xd5, 0xe2, 0xc5, 0x9a, 0xb8, 0xaf, + 0xee, 0x01, 0xa0, 0x88, 0x27, 0x71, 0x25, 0xf0, 0x22, 0x4a, 0x49, 0xb0, 0x88, 0x0d, 0x61, 0xd7, + 0x68, 0x55, 0xc4, 0xa5, 0x00, 0x6b, 0xb4, 0x2e, 0x80, 0x73, 0x89, 0xe1, 0x26, 0x29, 0xb7, 0x33, + 0x89, 0xea, 0x15, 0x26, 0x9e, 0xa7, 0x2c, 0x4b, 0x2a, 0x30, 0x93, 0xe8, 0x76, 0x6f, 0xa4, 0xc4, + 0x4c, 0xd2, 0xa6, 0x40, 0x28, 0xe9, 0x27, 0x20, 0x58, 0xed, 0xc0, 0x03, 0x90, 0xdb, 0x21, 0xc4, + 0xce, 0x4f, 0x4d, 0xa1, 0x77, 0xe3, 0xb2, 0x4c, 0xeb, 0xc5, 0x7f, 0x03, 0x2f, 0x50, 0x23, 0x27, + 0xe6, 0x27, 0x8c, 0x03, 0xc3, 0xab, 0x99, 0xb8, 0xb1, 0x82, 0xc1, 0xa9, 0xfb, 0x83, 0x20, 0x63, + 0x33, 0x4e, 0x29, 0x71, 0x9e, 0xc2, 0x63, 0xad, 0x89, 0x3c, 0x84, 0xdf, 0xe8, 0xc2, 0x9c, 0x97, + 0xd9, 0x8c, 0x8b, 0x23, 0xbe, 0x62, 0x53, 0xfe, 0xec, 0x75, 0x5a, 0xd5, 0xdb, 0x2d, 0xbd, 0x72, + 0x3f, 0x21, 0x2c, 0x61, 0x30, 0xf1, 0x32, 0x5b, 0xa7, 0x92, 0x4d, 0x20, 0x40, 0x59, 0x8e, 0xd9, + 0x2b, 0x34, 0x81, 0x80, 0x16, 0x0d, 0x47, 0x24, 0x10, 0x21, 0xde, 0x9e, 0x98, 0x19, 0xe7, 0xfa, + 0x0b, 0x06, 0x53, 0xde, 0xe4, 0x72, 0x94, 0x35, 0x08, 0x12, 0x87, 0x16, 0x41, 0x05, 0xbb, 0xbf, + 0x34, 0xfe, 0xed, 0x10, 0xbb, 0x47, 0xd8, 0x69, 0x0f, 0xb3, 0xfb, 0x3d, 0x48, 0xc4, 0x95, 0xbd, + 0x4a, 0x42, 0xb9, 0x6a, 0xdf, 0x24, 0xb9, 0xdf, 0x83, 0x74, 0x4e, 0xdf, 0xdc, 0x6a, 0x3d, 0x8d, + 0x67, 0x57, 0xf3, 0x92, 0x2f, 0xf3, 0x64, 0x97, 0x67, 0xbc, 0x04, 0xa7, 0x6f, 0x5e, 0xa9, 0x01, + 0x4a, 0x9c, 0xbe, 0x75, 0xa8, 0xd8, 0x0c, 0xce, 0x2d, 0xc5, 0x38, 0x4b, 0xe7, 0x70, 0x47, 0xed, + 0x19, 0x92, 0x00, 0x91, 0xc1, 0xa1, 0x20, 0x12, 0x44, 0x6a, 0xc7, 0x2d, 0xd2, 0x59, 0x9c, 0x29, + 0x7f, 0x3b, 0xb4, 0x19, 0x0f, 0xec, 0x0c, 0x22, 0x44, 0x01, 0xa9, 0xe7, 0x74, 0x59, 0xe6, 0x07, + 0xb9, 0xe0, 0x64, 0x3d, 0x1b, 0xa0, 0xb3, 0x9e, 0x0e, 0x08, 0xa6, 0xd5, 0x29, 0x7b, 0x5d, 0x97, + 0xa6, 0xfe, 0x07, 0x9b, 0x56, 0xeb, 0xbf, 0x8f, 0xb4, 0x3c, 0x34, 0xad, 0x02, 0x0e, 0x54, 0x46, + 0x3b, 0x51, 0x01, 0x13, 0xd0, 0xf6, 0xc3, 0xe4, 0x5e, 0x37, 0x88, 0xfb, 0x99, 0x88, 0x75, 0xc6, + 0x42, 0x7e, 0x24, 0xd0, 0xc7, 0x4f, 0x03, 0xda, 0xe3, 0x16, 0xaf, 0x3e, 0x97, 0x6c, 0x76, 0xd5, + 0xba, 0x19, 0xe7, 0x17, 0x54, 0x21, 0xc4, 0x71, 0x0b, 0x81, 0xe2, 0x5d, 0x74, 0x30, 0xe3, 0x79, + 0xa8, 0x8b, 0x6a, 0x79, 0x9f, 0x2e, 0xd2, 0x9c, 0xdd, 0xfc, 0x1a, 0xa9, 0x8e, 0x4c, 0xd5, 0x4d, + 0x5b, 0x84, 0x05, 0x17, 0x22, 0x36, 0xbf, 0x24, 0x6c, 0x73, 0x72, 0xe8, 0xf3, 0xa8, 0xfd, 0xda, + 0x40, 0xcb, 0xca, 0x11, 0xfd, 0xda, 0x00, 0xc5, 0xd2, 0x95, 0x54, 0x31, 0xd2, 0x61, 0xc5, 0x8f, + 0x93, 0x87, 0xfd, 0x60, 0xbb, 0xe5, 0xf1, 0x7c, 0xee, 0x66, 0x2c, 0x2e, 0x95, 0xd7, 0xed, 0x80, + 0x21, 0x8b, 0x11, 0x5b, 0x9e, 0x00, 0x0e, 0xa6, 0x30, 0xcf, 0xf3, 0x2e, 0xcf, 0x05, 0xcb, 0x05, + 0x36, 0x85, 0xf9, 0xc6, 0x34, 0x18, 0x9a, 0xc2, 0x28, 0x05, 0x10, 0xb7, 0xf2, 0x3c, 0x88, 0x89, + 0xe3, 0x78, 0x81, 0x66, 0x6c, 0xea, 0xac, 0x47, 0xc9, 0x43, 0x71, 0x0b, 0x38, 0xe7, 0x71, 0xae, + 0xeb, 0x65, 0x1a, 0x97, 0x73, 0x73, 0xba, 0x91, 0x0c, 0x1f, 0xd1, 0x76, 0x7c, 0x92, 0x78, 0x9c, + 0x1b, 0xd6, 0x00, 0xd3, 0xce, 0xc1, 0x22, 0x9e, 0x9b, 0x9a, 0x22, 0x35, 0x90, 0xf2, 0x56, 0x55, + 0xef, 0x75, 0x83, 0xc0, 0xcf, 0x8b, 0x34, 0x61, 0x3c, 0xe0, 0x47, 0xca, 0xfb, 0xf8, 0x81, 0x20, + 0xc8, 0xde, 0xea, 0x7a, 0xab, 0x1d, 0xdd, 0x38, 0x4f, 0xf4, 0x3e, 0x76, 0x44, 0x34, 0x0f, 0xe0, + 0x42, 0xd9, 0x1b, 0xc1, 0x83, 0x31, 0xda, 0x1c, 0xd0, 0x86, 0xc6, 0xa8, 0x39, 0x7f, 0xed, 0x33, + 0x46, 0x31, 0x58, 0xfb, 0xfc, 0x89, 0x1e, 0xa3, 0x7b, 0xb1, 0x88, 0xeb, 0xbc, 0xfd, 0x45, 0xca, + 0x5e, 0xe9, 0x8d, 0x30, 0x52, 0xdf, 0x86, 0x1a, 0xc9, 0xb7, 0x9e, 0xc1, 0xae, 0x78, 0xa7, 0x37, + 0x1f, 0xf0, 0xad, 0x77, 0x08, 0x9d, 0xbe, 0xc1, 0x56, 0x61, 0xa7, 0x37, 0x1f, 0xf0, 0xad, 0x3f, + 0xa7, 0xd0, 0xe9, 0x1b, 0x7c, 0x53, 0x61, 0xa7, 0x37, 0xaf, 0x7d, 0xff, 0x69, 0x33, 0x70, 0x5d, + 0xe7, 0x75, 0x1e, 0x36, 0x13, 0xe9, 0x8a, 0x61, 0xe9, 0xa4, 0x6f, 0xcf, 0xa0, 0xa1, 0x74, 0x92, + 0x56, 0x71, 0x3e, 0x68, 0x86, 0x95, 0xe2, 0x84, 0x57, 0xa9, 0xbc, 0x8e, 0xf1, 0xa4, 0x87, 0xd1, + 0x06, 0x0e, 0x6d, 0x9a, 0x42, 0x4a, 0xf6, 0xc1, 0xb2, 0x87, 0xda, 0x8b, 0xf0, 0x0f, 0x03, 0xf6, + 0xda, 0xf7, 0xe1, 0xb7, 0x7b, 0xd2, 0xf6, 0x11, 0xaf, 0xc7, 0xb8, 0xcf, 0x96, 0x43, 0xbd, 0x8a, + 0x3e, 0x5e, 0x7e, 0xd4, 0x5f, 0x41, 0xbb, 0xff, 0xf3, 0x66, 0x5f, 0x01, 0xfd, 0xeb, 0x41, 0xf0, + 0xb8, 0x8f, 0x45, 0x30, 0x10, 0x9e, 0x5c, 0x4b, 0x47, 0x17, 0xe4, 0xaf, 0x9b, 0x0d, 0x74, 0x83, + 0xca, 0xd7, 0x81, 0xe4, 0x6b, 0xc4, 0x7a, 0x4c, 0x84, 0xba, 0xd5, 0xc2, 0x70, 0x64, 0x7c, 0x7c, + 0x4d, 0x2d, 0xe7, 0xf3, 0x76, 0x1e, 0xac, 0x5f, 0x5b, 0x75, 0xca, 0x13, 0xb2, 0xec, 0xd0, 0xb0, + 0x40, 0x9f, 0x5c, 0x57, 0x8d, 0x1a, 0x2b, 0x0e, 0x2c, 0x3f, 0xf0, 0xf2, 0xa4, 0xa7, 0x61, 0xef, + 0x93, 0x2f, 0x1f, 0x5d, 0x4f, 0x49, 0x97, 0xe5, 0xdf, 0x06, 0xd1, 0x5d, 0x8f, 0xb5, 0xcf, 0x13, + 0xc0, 0xa9, 0xc7, 0x0f, 0x02, 0xf6, 0x29, 0x25, 0x53, 0xb8, 0xdf, 0xf8, 0x66, 0xca, 0xf6, 0x5b, + 0x70, 0x9e, 0xca, 0xf3, 0x34, 0x13, 0xac, 0x6c, 0x7f, 0x0b, 0xce, 0xb7, 0xab, 0xa8, 0x11, 0xfd, + 0x2d, 0xb8, 0x00, 0xee, 0x7c, 0x0b, 0x0e, 0xf1, 0x8c, 0x7e, 0x0b, 0x0e, 0xb5, 0x16, 0xfc, 0x16, + 0x5c, 0x58, 0x83, 0x9a, 0xde, 0x9b, 0x22, 0xa8, 0x73, 0xeb, 0x5e, 0x16, 0xfd, 0x63, 0xec, 0xc7, + 0xd7, 0x51, 0x21, 0x16, 0x38, 0xc5, 0xc9, 0x1b, 0x8d, 0x3d, 0xda, 0xd4, 0xbb, 0xd5, 0xb8, 0xd3, + 0x9b, 0xd7, 0xbe, 0x7f, 0xac, 0x77, 0x37, 0x66, 0x3a, 0xe7, 0xa5, 0xfc, 0x0e, 0xe0, 0x56, 0x68, + 0x7a, 0xae, 0x2d, 0xb8, 0x3d, 0xff, 0xb0, 0x1f, 0x4c, 0x54, 0xb7, 0x26, 0x74, 0xa7, 0x8f, 0xba, + 0x0c, 0x81, 0x2e, 0xdf, 0xe9, 0xcd, 0x13, 0xcb, 0x88, 0xf2, 0xad, 0x7a, 0xbb, 0x87, 0x31, 0xbf, + 0xaf, 0x1f, 0xf5, 0x57, 0xd0, 0xee, 0x57, 0x3a, 0x6d, 0x74, 0xdd, 0xcb, 0x7e, 0xde, 0xee, 0x32, + 0x35, 0xf1, 0xba, 0x79, 0xd4, 0x17, 0x0f, 0x25, 0x10, 0xee, 0x12, 0xda, 0x95, 0x40, 0xa0, 0xcb, + 0xe8, 0x47, 0xd7, 0x53, 0xd2, 0x65, 0xf9, 0xbb, 0x41, 0x74, 0x93, 0x2c, 0x8b, 0x8e, 0x83, 0x4f, + 0xfa, 0x5a, 0x06, 0xf1, 0xf0, 0xe9, 0xb5, 0xf5, 0x74, 0xa1, 0xfe, 0x71, 0x10, 0xdd, 0x0a, 0x14, + 0x4a, 0x05, 0xc8, 0x35, 0xac, 0xfb, 0x81, 0xf2, 0xd9, 0xf5, 0x15, 0xa9, 0xe5, 0xde, 0xc5, 0x27, + 0xed, 0xef, 0x7a, 0x05, 0x6c, 0x4f, 0xe8, 0xef, 0x7a, 0x75, 0x6b, 0xc1, 0x43, 0x9e, 0xf8, 0xbc, + 0xd9, 0x74, 0xa1, 0x87, 0x3c, 0xf2, 0x2e, 0x62, 0xf0, 0xfb, 0x24, 0x18, 0x87, 0x39, 0x79, 0xf6, + 0xba, 0x88, 0xf3, 0x84, 0x76, 0xa2, 0xe4, 0xdd, 0x4e, 0x0c, 0x07, 0x0f, 0xc7, 0x6a, 0xe9, 0x29, + 0x6f, 0x36, 0x52, 0xf7, 0x29, 0x7d, 0x83, 0x04, 0x0f, 0xc7, 0x5a, 0x28, 0xe1, 0x4d, 0x67, 0x8d, + 0x21, 0x6f, 0x20, 0x59, 0x7c, 0xd0, 0x07, 0x05, 0x29, 0xba, 0xf1, 0x66, 0xce, 0xdc, 0x1f, 0x86, + 0xac, 0xb4, 0xce, 0xdd, 0xb7, 0x7b, 0xd2, 0x84, 0xdb, 0x09, 0x13, 0x9f, 0xb3, 0x38, 0x61, 0x65, + 0xd0, 0xad, 0xa1, 0x7a, 0xb9, 0x75, 0x69, 0xcc, 0xed, 0x2e, 0xcf, 0x96, 0x8b, 0x5c, 0x77, 0x26, + 0xe9, 0xd6, 0xa5, 0xba, 0xdd, 0x02, 0x1a, 0x1e, 0x0b, 0x5a, 0xb7, 0x32, 0xbd, 0x7c, 0x10, 0x36, + 0xe3, 0x65, 0x95, 0x5b, 0xbd, 0x58, 0xba, 0x9e, 0x3a, 0x8c, 0x3a, 0xea, 0x09, 0x22, 0x69, 0xbb, + 0x27, 0x0d, 0xcf, 0xe7, 0x1c, 0xb7, 0x26, 0x9e, 0x76, 0x3a, 0x6c, 0xb5, 0x42, 0xea, 0x51, 0x7f, + 0x05, 0x78, 0x1a, 0xaa, 0xa3, 0xea, 0x30, 0xad, 0xc4, 0xf3, 0x34, 0xcb, 0x86, 0x5b, 0x81, 0x30, + 0x69, 0xa0, 0xe0, 0x69, 0x28, 0x02, 0x13, 0x91, 0xdc, 0x9c, 0x1e, 0xe6, 0xc3, 0x2e, 0x3b, 0x92, + 0xea, 0x15, 0xc9, 0x2e, 0x0d, 0x4e, 0xb4, 0x9c, 0xa6, 0x36, 0xb5, 0x1d, 0x85, 0x1b, 0xae, 0x55, + 0xe1, 0x9d, 0xde, 0x3c, 0x78, 0xdc, 0x2e, 0x29, 0xb9, 0xb2, 0xdc, 0xa1, 0x4c, 0x78, 0x2b, 0xc9, + 0xdd, 0x0e, 0x0a, 0x9c, 0x0a, 0xaa, 0x61, 0xf4, 0x32, 0x4d, 0xe6, 0x4c, 0xa0, 0x4f, 0x8a, 0x5c, + 0x20, 0xf8, 0xa4, 0x08, 0x80, 0xa0, 0xeb, 0xd4, 0xdf, 0xcd, 0x71, 0xe8, 0x41, 0x82, 0x75, 0x9d, + 0x56, 0x76, 0xa8, 0x50, 0xd7, 0xa1, 0x34, 0x98, 0x0d, 0x8c, 0x5b, 0xfd, 0x45, 0x87, 0x07, 0x21, + 0x33, 0xe0, 0xb3, 0x0e, 0x5b, 0xbd, 0x58, 0xb0, 0xa2, 0x58, 0x87, 0xe9, 0x22, 0x15, 0xd8, 0x8a, + 0xe2, 0xd8, 0xa8, 0x91, 0xd0, 0x8a, 0xd2, 0x46, 0xa9, 0xea, 0xd5, 0x39, 0xc2, 0x41, 0x12, 0xae, + 0x9e, 0x62, 0xfa, 0x55, 0xcf, 0xb0, 0xad, 0x07, 0x9b, 0xb9, 0x09, 0x19, 0x71, 0xa9, 0x37, 0xcb, + 0x48, 0x6c, 0xcb, 0x37, 0x7d, 0x21, 0x18, 0x9a, 0x75, 0x28, 0x05, 0x78, 0x60, 0x5f, 0x73, 0xcd, + 0xb3, 0xd7, 0xa2, 0x60, 0x71, 0x19, 0xe7, 0x33, 0x74, 0x73, 0x2a, 0x0d, 0xb6, 0xc8, 0xd0, 0xe6, + 0x94, 0xd4, 0x00, 0x8f, 0xcd, 0xfd, 0x57, 0x69, 0x91, 0xa1, 0x60, 0xde, 0x59, 0xf5, 0xdf, 0xa4, + 0xbd, 0xdf, 0x83, 0x84, 0x8f, 0xcd, 0x1b, 0xc0, 0x1c, 0x7c, 0x2b, 0xa7, 0x1f, 0x06, 0x4c, 0xf9, + 0x68, 0x68, 0x23, 0x4c, 0xab, 0x80, 0xa0, 0x36, 0x09, 0x2e, 0x13, 0x3f, 0x62, 0x6b, 0x2c, 0xa8, + 0x6d, 0x7e, 0x2a, 0x91, 0x50, 0x50, 0xb7, 0x51, 0x90, 0x67, 0xba, 0xfb, 0xa0, 0x8d, 0x80, 0xbe, + 0xbb, 0xf5, 0xd9, 0xec, 0xe4, 0xc0, 0xc8, 0xd9, 0x4b, 0x57, 0xde, 0x73, 0x02, 0xa4, 0xa0, 0x7b, + 0xe9, 0x0a, 0x7f, 0x4c, 0xb0, 0xd5, 0x8b, 0x85, 0x8f, 0xe4, 0x63, 0xc1, 0x5e, 0x37, 0xcf, 0xca, + 0x91, 0xe2, 0x4a, 0x79, 0xeb, 0x61, 0xf9, 0xbd, 0x6e, 0xd0, 0x5e, 0x80, 0x3d, 0x29, 0xf9, 0x8c, + 0x55, 0x95, 0xfe, 0xd8, 0xa9, 0x7f, 0xc3, 0x48, 0xcb, 0x46, 0xe0, 0x53, 0xa7, 0x77, 0xc2, 0x90, + 0xf3, 0x85, 0x42, 0x25, 0xb2, 0x1f, 0x4e, 0xda, 0x40, 0x35, 0xdb, 0xdf, 0x4c, 0xda, 0xec, 0xe4, + 0xec, 0xf0, 0xd2, 0x52, 0xf7, 0x4b, 0x49, 0xf7, 0x50, 0x75, 0xec, 0x23, 0x49, 0xf7, 0x7b, 0x90, + 0xda, 0xd5, 0xe7, 0xd1, 0x9b, 0x87, 0x7c, 0x3e, 0x61, 0x79, 0x32, 0xfc, 0x9e, 0x7f, 0x85, 0x96, + 0xcf, 0x47, 0xf5, 0x9f, 0x8d, 0xd1, 0x1b, 0x94, 0xd8, 0x5e, 0x02, 0xdc, 0x63, 0xe7, 0xcb, 0xf9, + 0x44, 0xc4, 0x02, 0x5c, 0x02, 0x94, 0x7f, 0x1f, 0xd5, 0x02, 0xe2, 0x12, 0xa0, 0x07, 0x00, 0x7b, + 0xd3, 0x92, 0x31, 0xd4, 0x5e, 0x2d, 0x08, 0xda, 0xd3, 0x80, 0xcd, 0x22, 0x8c, 0xbd, 0x3a, 0x51, + 0x87, 0x97, 0xf6, 0xac, 0x8e, 0x94, 0x12, 0x59, 0x44, 0x9b, 0xb2, 0xc1, 0xad, 0xaa, 0x2f, 0x3f, + 0x5c, 0xb3, 0x5c, 0x2c, 0xe2, 0x72, 0x0d, 0x82, 0x5b, 0xd7, 0xd2, 0x01, 0x88, 0xe0, 0x46, 0x41, + 0x3b, 0x6a, 0x9b, 0x66, 0x9e, 0x5d, 0xed, 0xf3, 0x92, 0x2f, 0x45, 0x9a, 0x33, 0xf8, 0xf1, 0x12, + 0xd3, 0xa0, 0x2e, 0x43, 0x8c, 0x5a, 0x8a, 0xb5, 0x59, 0xae, 0x24, 0xd4, 0x7d, 0x42, 0xf9, 0xfd, + 0xf5, 0x4a, 0xf0, 0x12, 0x3e, 0x4f, 0x54, 0x56, 0x20, 0x44, 0x64, 0xb9, 0x24, 0x0c, 0xfa, 0xfe, + 0x24, 0xcd, 0xe7, 0x68, 0xdf, 0x9f, 0xb8, 0x1f, 0x10, 0xbe, 0x45, 0x03, 0x76, 0x40, 0xa9, 0x46, + 0x53, 0x03, 0x40, 0xbf, 0xb5, 0x8b, 0x36, 0xba, 0x4b, 0x10, 0x03, 0x0a, 0x27, 0x81, 0xab, 0x2f, + 0x0a, 0x96, 0xb3, 0xa4, 0xb9, 0x35, 0x87, 0xb9, 0xf2, 0x88, 0xa0, 0x2b, 0x48, 0xda, 0xb9, 0x48, + 0xca, 0x4f, 0x97, 0xf9, 0x49, 0xc9, 0x2f, 0xd2, 0x8c, 0x95, 0x60, 0x2e, 0x52, 0xea, 0x8e, 0x9c, + 0x98, 0x8b, 0x30, 0xce, 0x5e, 0xbf, 0x90, 0x52, 0xef, 0x47, 0x04, 0xa6, 0x65, 0x3c, 0x83, 0xd7, + 0x2f, 0x94, 0x8d, 0x36, 0x46, 0x9c, 0x0c, 0x06, 0x70, 0x27, 0xd1, 0x51, 0xae, 0xf3, 0xb5, 0x8c, + 0x0f, 0xfd, 0xd6, 0xa8, 0xfc, 0xac, 0x6e, 0x05, 0x12, 0x1d, 0x6d, 0x0e, 0x23, 0x89, 0x44, 0x27, + 0xac, 0x61, 0x97, 0x12, 0xc9, 0x1d, 0xeb, 0x6b, 0x45, 0x60, 0x29, 0x51, 0x36, 0x1a, 0x21, 0xb1, + 0x94, 0xb4, 0x20, 0x30, 0x21, 0x35, 0xc3, 0x60, 0x8e, 0x4e, 0x48, 0x46, 0x1a, 0x9c, 0x90, 0x5c, + 0xca, 0x4e, 0x14, 0x07, 0x79, 0x2a, 0xd2, 0x38, 0x9b, 0x30, 0x71, 0x12, 0x97, 0xf1, 0x82, 0x09, + 0x56, 0xc2, 0x89, 0x42, 0x23, 0x23, 0x8f, 0x21, 0x26, 0x0a, 0x8a, 0xd5, 0x0e, 0x7f, 0x33, 0x7a, + 0xbb, 0x5e, 0xf7, 0x59, 0xae, 0x7f, 0xfe, 0xe8, 0x99, 0xfc, 0xdd, 0xb4, 0xe1, 0x3b, 0xc6, 0xc6, + 0x44, 0x94, 0x2c, 0x5e, 0x34, 0xb6, 0xdf, 0x32, 0x7f, 0x97, 0xe0, 0xa3, 0x41, 0x1d, 0xcf, 0xc7, + 0x5c, 0xa4, 0x17, 0xf5, 0x36, 0x5b, 0xbf, 0x41, 0x04, 0xe2, 0xd9, 0x15, 0x8f, 0x02, 0x5f, 0x1d, + 0xc1, 0x38, 0x3b, 0x4f, 0xbb, 0xd2, 0x53, 0x56, 0x64, 0x70, 0x9e, 0xf6, 0xb4, 0x25, 0x40, 0xcc, + 0xd3, 0x28, 0x68, 0x07, 0xa7, 0x2b, 0x9e, 0xb2, 0x70, 0x65, 0xa6, 0xac, 0x5f, 0x65, 0xa6, 0xde, + 0x4b, 0x19, 0x59, 0xf4, 0xf6, 0x11, 0x5b, 0x9c, 0xb3, 0xb2, 0xba, 0x4c, 0x0b, 0xea, 0xd3, 0xbf, + 0x96, 0xe8, 0xfc, 0xf4, 0x2f, 0x81, 0xda, 0x95, 0xc0, 0x02, 0x07, 0xd5, 0x71, 0xbc, 0x60, 0xf2, + 0x1b, 0x2a, 0x60, 0x25, 0x70, 0x8c, 0x38, 0x10, 0xb1, 0x12, 0x90, 0xb0, 0xf3, 0x7e, 0x97, 0x65, + 0x4e, 0xd9, 0xbc, 0x8e, 0xb0, 0xf2, 0x24, 0x5e, 0x2f, 0x58, 0x2e, 0xb4, 0x49, 0x70, 0x26, 0xef, + 0x98, 0xc4, 0x79, 0xe2, 0x4c, 0xbe, 0x8f, 0x9e, 0x33, 0x35, 0x79, 0x0d, 0x7f, 0xc2, 0x4b, 0xa1, + 0x7e, 0xdc, 0xec, 0xac, 0xcc, 0xc0, 0xd4, 0xe4, 0x37, 0xaa, 0x47, 0x12, 0x53, 0x53, 0x58, 0xc3, + 0xf9, 0x21, 0x0b, 0xaf, 0x0c, 0x2f, 0x58, 0x69, 0xe2, 0xe4, 0xd9, 0x22, 0x4e, 0x33, 0x1d, 0x0d, + 0xdf, 0x0f, 0xd8, 0x26, 0x74, 0x88, 0x1f, 0xb2, 0xe8, 0xab, 0xeb, 0xfc, 0xf4, 0x47, 0xb8, 0x84, + 0xe0, 0x11, 0x41, 0x87, 0x7d, 0xe2, 0x11, 0x41, 0xb7, 0x96, 0xdd, 0xb9, 0x5b, 0x56, 0x72, 0x6b, + 0x49, 0xec, 0xf2, 0x04, 0x9e, 0x17, 0x3a, 0x36, 0x01, 0x48, 0xec, 0xdc, 0x83, 0x0a, 0x36, 0x35, + 0xb0, 0xd8, 0xf3, 0x34, 0x8f, 0xb3, 0xf4, 0x27, 0x30, 0xad, 0x77, 0xec, 0x34, 0x04, 0x91, 0x1a, + 0xe0, 0x24, 0xe6, 0x6a, 0x9f, 0x89, 0x69, 0x5a, 0x4f, 0xfd, 0xf7, 0x02, 0xed, 0x26, 0x89, 0x6e, + 0x57, 0x0e, 0xe9, 0x7c, 0xe6, 0x17, 0x36, 0xeb, 0xb8, 0x28, 0x26, 0xf5, 0xaa, 0x7a, 0xca, 0x66, + 0x2c, 0x2d, 0xc4, 0xf0, 0xe3, 0x70, 0x5b, 0x01, 0x9c, 0xb8, 0x68, 0xd1, 0x43, 0xcd, 0x79, 0x7c, + 0x5f, 0xcf, 0x25, 0x13, 0xf5, 0xab, 0x9f, 0x67, 0x15, 0x2b, 0x75, 0xa2, 0xb1, 0xcf, 0x04, 0x18, + 0x9d, 0x0e, 0x37, 0x72, 0xc0, 0xba, 0xa2, 0xc4, 0xe8, 0x0c, 0x6b, 0xd8, 0xc3, 0x3e, 0x87, 0xd3, + 0x9f, 0x6d, 0x97, 0xf7, 0x0d, 0x1f, 0x92, 0xc6, 0x1c, 0x8a, 0x38, 0xec, 0xa3, 0x69, 0x9b, 0xad, + 0xb5, 0xdd, 0x8e, 0xf3, 0xf5, 0x01, 0xbc, 0x32, 0x81, 0x58, 0x92, 0x18, 0x91, 0xad, 0x05, 0x70, + 0xe7, 0x30, 0xbc, 0xe4, 0x71, 0x32, 0x8b, 0x2b, 0x71, 0x12, 0xaf, 0x33, 0x1e, 0x27, 0x72, 0x5d, + 0x87, 0x87, 0xe1, 0x0d, 0x33, 0x72, 0x21, 0xea, 0x30, 0x9c, 0x82, 0xdd, 0xec, 0x4c, 0xfe, 0x98, + 0xa9, 0xbe, 0xcb, 0x09, 0xb3, 0x33, 0x59, 0x5e, 0x78, 0x8f, 0xf3, 0x4e, 0x18, 0xb2, 0xef, 0xa0, + 0x29, 0x91, 0x4c, 0x43, 0x6e, 0x61, 0x3a, 0x5e, 0x02, 0xf2, 0x7e, 0x80, 0xb0, 0x5f, 0x20, 0x51, + 0x7f, 0x6f, 0x7e, 0xbf, 0x4a, 0xe8, 0x8f, 0xa1, 0x3f, 0xc4, 0x74, 0x5d, 0x68, 0xe4, 0x7e, 0xc8, + 0x62, 0xbb, 0x27, 0x6d, 0xd3, 0xcc, 0xdd, 0xcb, 0x58, 0x8c, 0x93, 0xe4, 0x88, 0x55, 0xc8, 0x0b, + 0xe5, 0xb5, 0x70, 0x64, 0xa5, 0x44, 0x9a, 0xd9, 0xa6, 0x6c, 0xa0, 0xd7, 0xb2, 0x67, 0x49, 0x2a, + 0xb4, 0xac, 0xb9, 0x21, 0xfd, 0xb0, 0x6d, 0xa0, 0x4d, 0x11, 0xb5, 0xa2, 0x69, 0x3b, 0x97, 0xd7, + 0xcc, 0x94, 0xcf, 0xe7, 0x19, 0xd3, 0xd0, 0x29, 0x8b, 0xd5, 0xb7, 0x20, 0x77, 0xda, 0xb6, 0x50, + 0x90, 0x98, 0xcb, 0x83, 0x0a, 0x36, 0x8d, 0xac, 0x31, 0xf5, 0x48, 0xaa, 0x69, 0xd8, 0xcd, 0xb6, + 0x19, 0x0f, 0x20, 0xd2, 0x48, 0x14, 0xb4, 0xef, 0xbd, 0xd5, 0xe2, 0x7d, 0xd6, 0xb4, 0x04, 0xfc, + 0xd8, 0x94, 0x54, 0x76, 0xc4, 0xc4, 0x7b, 0x6f, 0x08, 0x66, 0xf7, 0x09, 0xc0, 0xc3, 0xd3, 0xf5, + 0x41, 0x02, 0xf7, 0x09, 0x50, 0x5f, 0x32, 0xc4, 0x3e, 0x81, 0x62, 0xfd, 0xae, 0x33, 0xe7, 0x5e, + 0x87, 0x71, 0x65, 0x2b, 0x87, 0x74, 0x1d, 0x0a, 0x86, 0xba, 0x8e, 0x52, 0xf0, 0x9b, 0xd4, 0x3d, + 0x5a, 0x43, 0x9a, 0x14, 0x3b, 0x57, 0xdb, 0xe8, 0xc2, 0x6c, 0xee, 0x5f, 0x0b, 0x4f, 0x59, 0x9c, + 0x98, 0x8a, 0x21, 0xba, 0xae, 0x9c, 0xc8, 0xfd, 0x31, 0x4e, 0x3b, 0xf9, 0x9d, 0x68, 0xa8, 0xaa, + 0x51, 0xba, 0x6e, 0x6e, 0x61, 0x45, 0xac, 0x09, 0x62, 0xa2, 0xf2, 0x09, 0x27, 0x71, 0xf3, 0xba, + 0x68, 0xca, 0xb5, 0x03, 0xfd, 0x5e, 0x66, 0x05, 0x12, 0x37, 0xbf, 0xd9, 0x5b, 0x34, 0x91, 0xb8, + 0x75, 0x6b, 0xd9, 0x79, 0xde, 0xec, 0xcf, 0xe5, 0x15, 0x30, 0xfc, 0x47, 0x35, 0x94, 0x90, 0x98, + 0xe7, 0x5b, 0x90, 0xb2, 0xfd, 0xf4, 0xfd, 0xff, 0xf8, 0xea, 0xc6, 0xe0, 0x67, 0x5f, 0xdd, 0x18, + 0xfc, 0xf7, 0x57, 0x37, 0x06, 0x3f, 0xfd, 0xfa, 0xc6, 0x1b, 0x3f, 0xfb, 0xfa, 0xc6, 0x1b, 0xff, + 0xf5, 0xf5, 0x8d, 0x37, 0xbe, 0x7c, 0x53, 0xff, 0x68, 0xf8, 0xf9, 0xff, 0x93, 0x3f, 0xfd, 0xfd, + 0xe4, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x14, 0xc2, 0x04, 0x4c, 0x58, 0x7c, 0x00, 0x00, } // This is a compile-time assertion to ensure that this generated file @@ -494,6 +494,7 @@ type ClientCommandsHandler interface { ObjectUndo(context.Context, *pb.RpcObjectUndoRequest) *pb.RpcObjectUndoResponse ObjectRedo(context.Context, *pb.RpcObjectRedoRequest) *pb.RpcObjectRedoResponse ObjectListExport(context.Context, *pb.RpcObjectListExportRequest) *pb.RpcObjectListExportResponse + ObjectExport(context.Context, *pb.RpcObjectExportRequest) *pb.RpcObjectExportResponse ObjectBookmarkFetch(context.Context, *pb.RpcObjectBookmarkFetchRequest) *pb.RpcObjectBookmarkFetchResponse ObjectToBookmark(context.Context, *pb.RpcObjectToBookmarkRequest) *pb.RpcObjectToBookmarkResponse ObjectImport(context.Context, *pb.RpcObjectImportRequest) *pb.RpcObjectImportResponse @@ -2617,6 +2618,26 @@ func ObjectListExport(b []byte) (resp []byte) { return resp } +func ObjectExport(b []byte) (resp []byte) { + defer func() { + if PanicHandler != nil { + if r := recover(); r != nil { + resp, _ = (&pb.RpcObjectExportResponse{Error: &pb.RpcObjectExportResponseError{Code: pb.RpcObjectExportResponseError_UNKNOWN_ERROR, Description: "panic recovered"}}).Marshal() + PanicHandler(r) + } + } + }() + + in := new(pb.RpcObjectExportRequest) + if err := in.Unmarshal(b); err != nil { + resp, _ = (&pb.RpcObjectExportResponse{Error: &pb.RpcObjectExportResponseError{Code: pb.RpcObjectExportResponseError_BAD_INPUT, Description: err.Error()}}).Marshal() + return resp + } + + resp, _ = clientCommandsHandler.ObjectExport(context.Background(), in).Marshal() + return resp +} + func ObjectBookmarkFetch(b []byte) (resp []byte) { defer func() { if PanicHandler != nil { @@ -6591,6 +6612,8 @@ func CommandAsync(cmd string, data []byte, callback func(data []byte)) { cd = ObjectRedo(data) case "ObjectListExport": cd = ObjectListExport(data) + case "ObjectExport": + cd = ObjectExport(data) case "ObjectBookmarkFetch": cd = ObjectBookmarkFetch(data) case "ObjectToBookmark": @@ -8307,6 +8330,20 @@ func (h *ClientCommandsHandlerProxy) ObjectListExport(ctx context.Context, req * call, _ := actualCall(ctx, req) return call.(*pb.RpcObjectListExportResponse) } +func (h *ClientCommandsHandlerProxy) ObjectExport(ctx context.Context, req *pb.RpcObjectExportRequest) *pb.RpcObjectExportResponse { + actualCall := func(ctx context.Context, req any) (any, error) { + return h.client.ObjectExport(ctx, req.(*pb.RpcObjectExportRequest)), nil + } + for _, interceptor := range h.interceptors { + toCall := actualCall + currentInterceptor := interceptor + actualCall = func(ctx context.Context, req any) (any, error) { + return currentInterceptor(ctx, req, "ObjectExport", toCall) + } + } + call, _ := actualCall(ctx, req) + return call.(*pb.RpcObjectExportResponse) +} func (h *ClientCommandsHandlerProxy) ObjectBookmarkFetch(ctx context.Context, req *pb.RpcObjectBookmarkFetchRequest) *pb.RpcObjectBookmarkFetchResponse { actualCall := func(ctx context.Context, req any) (any, error) { return h.client.ObjectBookmarkFetch(ctx, req.(*pb.RpcObjectBookmarkFetchRequest)), nil diff --git a/core/block/export/export.go b/core/block/export/export.go index 5d87faff1..cb0bdb64b 100644 --- a/core/block/export/export.go +++ b/core/block/export/export.go @@ -3,8 +3,10 @@ package export import ( "bytes" "context" + "encoding/base64" "fmt" "math/rand" + "net/url" "os" "path/filepath" "slices" @@ -70,7 +72,7 @@ var log = logging.Logger("anytype-mw-export") type Export interface { Export(ctx context.Context, req pb.RpcObjectListExportRequest) (path string, succeed int, err error) - ExportInMemory(ctx context.Context, spaceId string, objectIds []string, format model.ExportFormat, includeRelations bool) (res map[string][]byte, err error) + ExportSingleInMemory(ctx context.Context, spaceId string, objectId string, format model.ExportFormat) (res string, err error) app.Component } @@ -122,26 +124,18 @@ func (e *export) Export(ctx context.Context, req pb.RpcObjectListExportRequest) return exportCtx.exportObjects(ctx, queue) } -func (e *export) ExportInMemory(ctx context.Context, spaceId string, objectIds []string, format model.ExportFormat, includeRelations bool) (res map[string][]byte, err error) { +func (e *export) ExportSingleInMemory(ctx context.Context, spaceId string, objectId string, format model.ExportFormat) (res string, err error) { req := pb.RpcObjectListExportRequest{ - SpaceId: spaceId, - ObjectIds: objectIds, - IncludeFiles: false, - Format: format, - IncludeNested: true, + SpaceId: spaceId, + ObjectIds: []string{objectId}, + IncludeFiles: true, + Format: format, + IncludeNested: true, + IncludeArchived: true, } - res = make(map[string][]byte) exportCtx := newExportContext(e, req) - for _, objectId := range objectIds { - b, err := exportCtx.exportObject(ctx, objectId) - if err != nil { - return nil, err - } - res[objectId] = b - } - - return res, nil + return exportCtx.exportObject(ctx, objectId) } func (e *export) finishWithNotification(spaceId string, exportFormat model.ExportFormat, queue process.Queue, err error) { @@ -251,31 +245,38 @@ func (e *exportContext) getStateFilters(id string) *state.Filters { } // exportObject synchronously exports a single object and return the bytes slice -func (e *exportContext) exportObject(ctx context.Context, objectId string) ([]byte, error) { +func (e *exportContext) exportObject(ctx context.Context, objectId string) (string, error) { e.reqIds = []string{objectId} e.includeArchive = true err := e.docsForExport(ctx) if err != nil { - return nil, err + return "", err } var docNamer Namer - if e.format == model.Export_Markdown { - docNamer = &deepLinkNamer{gatewayUrl: e.gatewayUrl} + if e.format == model.Export_Markdown && e.gatewayUrl != "" { + u, err := url.Parse(e.gatewayUrl) + if err != nil { + return "", err + } + docNamer = &deepLinkNamer{gatewayUrl: *u} } else { docNamer = newNamer() } inMemoryWriter := &InMemoryWriter{fn: docNamer} err = e.writeDoc(ctx, inMemoryWriter, objectId, e.docs.transformToDetailsMap()) if err != nil { - return nil, err + return "", err } for _, v := range inMemoryWriter.data { - return v, nil + if e.format == model.Export_Protobuf { + return base64.StdEncoding.EncodeToString(v), nil + } + return string(v), nil } - return nil, fmt.Errorf("failed to find data in writer") + return "", fmt.Errorf("failed to find data in writer") } func (e *exportContext) exportObjects(ctx context.Context, queue process.Queue) (string, int, error) { diff --git a/core/block/export/writer.go b/core/block/export/writer.go index 87541154b..742ae07b4 100644 --- a/core/block/export/writer.go +++ b/core/block/export/writer.go @@ -196,7 +196,7 @@ func (d *InMemoryWriter) GetData(id string) []byte { // deepLinkNamer used to render a single-object export, in md format type deepLinkNamer struct { - gatewayUrl string + gatewayUrl url.URL } func (fn *deepLinkNamer) Get(path, hash, title, ext string) (name string) { @@ -206,10 +206,10 @@ func (fn *deepLinkNamer) Get(path, hash, title, ext string) (name string) { } // files links via gateway - u, err := url.Parse(fn.gatewayUrl) - if err != nil { + if fn.gatewayUrl.Host == "" { return "anytype://object?objectId=" + hash } + u := fn.gatewayUrl if mill.IsImageExt(ext) { u.Path = "image/" + hash } else { diff --git a/core/block/import/markdown/anymark/anyblocks.go b/core/block/import/markdown/anymark/anyblocks.go index aa43abd81..729b9855f 100644 --- a/core/block/import/markdown/anymark/anyblocks.go +++ b/core/block/import/markdown/anymark/anyblocks.go @@ -6,6 +6,7 @@ import ( "github.com/gogo/protobuf/types" + "github.com/anyproto/anytype-heart/pkg/lib/mill" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" "github.com/anyproto/anytype-heart/util/pbtypes" ) @@ -98,7 +99,6 @@ func ConvertTextToFile(filePath string) *model.BlockContentOfFile { return nil } - imageFormats := []string{"jpg", "jpeg", "png", "gif", "webp", "heic", "heif", "bmp", "tiff", "psd", "ico"} videoFormats := []string{"mp4", "m4v", "mov"} audioFormats := []string{"mp3", "ogg", "wav", "m4a", "flac"} pdfFormat := "pdf" @@ -107,11 +107,8 @@ func ConvertTextToFile(filePath string) *model.BlockContentOfFile { fileExt := filepath.Ext(filePath) if fileExt != "" { fileExt = fileExt[1:] - for _, ext := range imageFormats { - if strings.EqualFold(fileExt, ext) { - fileType = model.BlockContentFile_Image - break - } + if mill.IsImageExt(fileExt) { + fileType = model.BlockContentFile_Image } for _, ext := range videoFormats { diff --git a/core/export.go b/core/export.go index 641e04c12..c5ee4a36e 100644 --- a/core/export.go +++ b/core/export.go @@ -37,3 +37,31 @@ func (mw *Middleware) ObjectListExport(cctx context.Context, req *pb.RpcObjectLi }) return response(path, succeed, err) } + +func (mw *Middleware) ObjectExport(cctx context.Context, req *pb.RpcObjectExportRequest) *pb.RpcObjectExportResponse { + response := func(result string, err error) (res *pb.RpcObjectExportResponse) { + res = &pb.RpcObjectExportResponse{ + Error: &pb.RpcObjectExportResponseError{ + Code: pb.RpcObjectExportResponseError_NULL, + }, + } + if err != nil { + res.Error.Code = pb.RpcObjectExportResponseError_UNKNOWN_ERROR + res.Error.Description = getErrorDescription(err) + return + } else { + res.Result = result + } + return res + } + var ( + result string + err error + ) + err = mw.doBlockService(func(_ *block.Service) error { + es := mw.applicationService.GetApp().MustComponent(export.CName).(export.Export) + result, err = es.ExportSingleInMemory(cctx, req.SpaceId, req.ObjectId, req.Format) + return err + }) + return response(result, err) +} diff --git a/docs/proto.md b/docs/proto.md index bbd1169bf..85d6fde58 100644 --- a/docs/proto.md +++ b/docs/proto.md @@ -883,6 +883,10 @@ - [Rpc.Object.Duplicate.Request](#anytype-Rpc-Object-Duplicate-Request) - [Rpc.Object.Duplicate.Response](#anytype-Rpc-Object-Duplicate-Response) - [Rpc.Object.Duplicate.Response.Error](#anytype-Rpc-Object-Duplicate-Response-Error) + - [Rpc.Object.Export](#anytype-Rpc-Object-Export) + - [Rpc.Object.Export.Request](#anytype-Rpc-Object-Export-Request) + - [Rpc.Object.Export.Response](#anytype-Rpc-Object-Export-Response) + - [Rpc.Object.Export.Response.Error](#anytype-Rpc-Object-Export-Response-Error) - [Rpc.Object.Graph](#anytype-Rpc-Object-Graph) - [Rpc.Object.Graph.Edge](#anytype-Rpc-Object-Graph-Edge) - [Rpc.Object.Graph.Request](#anytype-Rpc-Object-Graph-Request) @@ -1512,6 +1516,7 @@ - [Rpc.Object.CrossSpaceSearchUnsubscribe.Response.Error.Code](#anytype-Rpc-Object-CrossSpaceSearchUnsubscribe-Response-Error-Code) - [Rpc.Object.DateByTimestamp.Response.Error.Code](#anytype-Rpc-Object-DateByTimestamp-Response-Error-Code) - [Rpc.Object.Duplicate.Response.Error.Code](#anytype-Rpc-Object-Duplicate-Response-Error-Code) + - [Rpc.Object.Export.Response.Error.Code](#anytype-Rpc-Object-Export-Response-Error-Code) - [Rpc.Object.Graph.Edge.Type](#anytype-Rpc-Object-Graph-Edge-Type) - [Rpc.Object.Graph.Response.Error.Code](#anytype-Rpc-Object-Graph-Response-Error-Code) - [Rpc.Object.GroupsSubscribe.Response.Error.Code](#anytype-Rpc-Object-GroupsSubscribe-Response-Error-Code) @@ -2137,6 +2142,7 @@ | ObjectUndo | [Rpc.Object.Undo.Request](#anytype-Rpc-Object-Undo-Request) | [Rpc.Object.Undo.Response](#anytype-Rpc-Object-Undo-Response) | | | ObjectRedo | [Rpc.Object.Redo.Request](#anytype-Rpc-Object-Redo-Request) | [Rpc.Object.Redo.Response](#anytype-Rpc-Object-Redo-Response) | | | ObjectListExport | [Rpc.Object.ListExport.Request](#anytype-Rpc-Object-ListExport-Request) | [Rpc.Object.ListExport.Response](#anytype-Rpc-Object-ListExport-Response) | | +| ObjectExport | [Rpc.Object.Export.Request](#anytype-Rpc-Object-Export-Request) | [Rpc.Object.Export.Response](#anytype-Rpc-Object-Export-Response) | | | ObjectBookmarkFetch | [Rpc.Object.BookmarkFetch.Request](#anytype-Rpc-Object-BookmarkFetch-Request) | [Rpc.Object.BookmarkFetch.Response](#anytype-Rpc-Object-BookmarkFetch-Response) | | | ObjectToBookmark | [Rpc.Object.ToBookmark.Request](#anytype-Rpc-Object-ToBookmark-Request) | [Rpc.Object.ToBookmark.Response](#anytype-Rpc-Object-ToBookmark-Response) | | | ObjectImport | [Rpc.Object.Import.Request](#anytype-Rpc-Object-Import-Request) | [Rpc.Object.Import.Response](#anytype-Rpc-Object-Import-Response) | | @@ -15099,6 +15105,66 @@ Get the info for page alongside with info for all inbound and outbound links fro + + +### Rpc.Object.Export + + + + + + + + + +### Rpc.Object.Export.Request + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| spaceId | [string](#string) | | | +| objectId | [string](#string) | | ids of documents for export, when empty - will export all available docs | +| format | [model.Export.Format](#anytype-model-Export-Format) | | export format | + + + + + + + + +### Rpc.Object.Export.Response + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| error | [Rpc.Object.Export.Response.Error](#anytype-Rpc-Object-Export-Response-Error) | | | +| result | [string](#string) | | | +| event | [ResponseEvent](#anytype-ResponseEvent) | | | + + + + + + + + +### Rpc.Object.Export.Response.Error + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| code | [Rpc.Object.Export.Response.Error.Code](#anytype-Rpc-Object-Export-Response-Error-Code) | | | +| description | [string](#string) | | | + + + + + + ### Rpc.Object.Graph @@ -24073,6 +24139,19 @@ Middleware-to-front-end response, that can contain a NULL error or a non-NULL er + + +### Rpc.Object.Export.Response.Error.Code + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| NULL | 0 | | +| UNKNOWN_ERROR | 1 | | +| BAD_INPUT | 2 | ... | + + + ### Rpc.Object.Graph.Edge.Type diff --git a/pb/commands.pb.go b/pb/commands.pb.go index e13583afa..fcd0b71ea 100644 --- a/pb/commands.pb.go +++ b/pb/commands.pb.go @@ -3539,6 +3539,34 @@ func (RpcObjectListExportResponseErrorCode) EnumDescriptor() ([]byte, []int) { return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 3, 0, 0} } +type RpcObjectExportResponseErrorCode int32 + +const ( + RpcObjectExportResponseError_NULL RpcObjectExportResponseErrorCode = 0 + RpcObjectExportResponseError_UNKNOWN_ERROR RpcObjectExportResponseErrorCode = 1 + RpcObjectExportResponseError_BAD_INPUT RpcObjectExportResponseErrorCode = 2 +) + +var RpcObjectExportResponseErrorCode_name = map[int32]string{ + 0: "NULL", + 1: "UNKNOWN_ERROR", + 2: "BAD_INPUT", +} + +var RpcObjectExportResponseErrorCode_value = map[string]int32{ + "NULL": 0, + "UNKNOWN_ERROR": 1, + "BAD_INPUT": 2, +} + +func (x RpcObjectExportResponseErrorCode) String() string { + return proto.EnumName(RpcObjectExportResponseErrorCode_name, int32(x)) +} + +func (RpcObjectExportResponseErrorCode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 1, 0, 0} +} + type RpcObjectImportRequestMode int32 const ( @@ -3561,7 +3589,7 @@ func (x RpcObjectImportRequestMode) String() string { } func (RpcObjectImportRequestMode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 0, 0} } type RpcObjectImportRequestPbParamsType int32 @@ -3586,7 +3614,7 @@ func (x RpcObjectImportRequestPbParamsType) String() string { } func (RpcObjectImportRequestPbParamsType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 0, 5, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 0, 5, 0} } type RpcObjectImportRequestCsvParamsMode int32 @@ -3611,7 +3639,7 @@ func (x RpcObjectImportRequestCsvParamsMode) String() string { } func (RpcObjectImportRequestCsvParamsMode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 0, 6, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 0, 6, 0} } type RpcObjectImportResponseErrorCode int32 @@ -3657,7 +3685,7 @@ func (x RpcObjectImportResponseErrorCode) String() string { } func (RpcObjectImportResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 1, 0, 0} } type RpcObjectImportNotionValidateTokenResponseErrorCode int32 @@ -3700,7 +3728,7 @@ func (x RpcObjectImportNotionValidateTokenResponseErrorCode) String() string { } func (RpcObjectImportNotionValidateTokenResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 2, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 2, 0, 1, 0, 0} } type RpcObjectImportListResponseErrorCode int32 @@ -3731,7 +3759,7 @@ func (x RpcObjectImportListResponseErrorCode) String() string { } func (RpcObjectImportListResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 50, 1, 0, 0} } type RpcObjectImportListImportResponseType int32 @@ -3762,7 +3790,7 @@ func (x RpcObjectImportListImportResponseType) String() string { } func (RpcObjectImportListImportResponseType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 2, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 50, 2, 0} } type RpcObjectImportUseCaseRequestUseCase int32 @@ -3790,7 +3818,7 @@ func (x RpcObjectImportUseCaseRequestUseCase) String() string { } func (RpcObjectImportUseCaseRequestUseCase) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 50, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 51, 0, 0} } type RpcObjectImportUseCaseResponseErrorCode int32 @@ -3818,7 +3846,7 @@ func (x RpcObjectImportUseCaseResponseErrorCode) String() string { } func (RpcObjectImportUseCaseResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 50, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 51, 1, 0, 0} } type RpcObjectImportExperienceResponseErrorCode int32 @@ -3849,7 +3877,7 @@ func (x RpcObjectImportExperienceResponseErrorCode) String() string { } func (RpcObjectImportExperienceResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 51, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 52, 1, 0, 0} } type RpcObjectDateByTimestampResponseErrorCode int32 @@ -3877,7 +3905,7 @@ func (x RpcObjectDateByTimestampResponseErrorCode) String() string { } func (RpcObjectDateByTimestampResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 52, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 53, 1, 0, 0} } type RpcObjectCollectionAddResponseErrorCode int32 @@ -30838,6 +30866,216 @@ func (m *RpcObjectListExportResponseError) GetDescription() string { return "" } +type RpcObjectExport struct { +} + +func (m *RpcObjectExport) Reset() { *m = RpcObjectExport{} } +func (m *RpcObjectExport) String() string { return proto.CompactTextString(m) } +func (*RpcObjectExport) ProtoMessage() {} +func (*RpcObjectExport) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48} +} +func (m *RpcObjectExport) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcObjectExport) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcObjectExport.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcObjectExport) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcObjectExport.Merge(m, src) +} +func (m *RpcObjectExport) XXX_Size() int { + return m.Size() +} +func (m *RpcObjectExport) XXX_DiscardUnknown() { + xxx_messageInfo_RpcObjectExport.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcObjectExport proto.InternalMessageInfo + +type RpcObjectExportRequest struct { + SpaceId string `protobuf:"bytes,10,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + // ids of documents for export, when empty - will export all available docs + ObjectId string `protobuf:"bytes,2,opt,name=objectId,proto3" json:"objectId,omitempty"` + // export format + Format model.ExportFormat `protobuf:"varint,3,opt,name=format,proto3,enum=anytype.model.ExportFormat" json:"format,omitempty"` +} + +func (m *RpcObjectExportRequest) Reset() { *m = RpcObjectExportRequest{} } +func (m *RpcObjectExportRequest) String() string { return proto.CompactTextString(m) } +func (*RpcObjectExportRequest) ProtoMessage() {} +func (*RpcObjectExportRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 0} +} +func (m *RpcObjectExportRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcObjectExportRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcObjectExportRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcObjectExportRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcObjectExportRequest.Merge(m, src) +} +func (m *RpcObjectExportRequest) XXX_Size() int { + return m.Size() +} +func (m *RpcObjectExportRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RpcObjectExportRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcObjectExportRequest proto.InternalMessageInfo + +func (m *RpcObjectExportRequest) GetSpaceId() string { + if m != nil { + return m.SpaceId + } + return "" +} + +func (m *RpcObjectExportRequest) GetObjectId() string { + if m != nil { + return m.ObjectId + } + return "" +} + +func (m *RpcObjectExportRequest) GetFormat() model.ExportFormat { + if m != nil { + return m.Format + } + return model.Export_Markdown +} + +type RpcObjectExportResponse struct { + Error *RpcObjectExportResponseError `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + Result string `protobuf:"bytes,2,opt,name=result,proto3" json:"result,omitempty"` + Event *ResponseEvent `protobuf:"bytes,3,opt,name=event,proto3" json:"event,omitempty"` +} + +func (m *RpcObjectExportResponse) Reset() { *m = RpcObjectExportResponse{} } +func (m *RpcObjectExportResponse) String() string { return proto.CompactTextString(m) } +func (*RpcObjectExportResponse) ProtoMessage() {} +func (*RpcObjectExportResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 1} +} +func (m *RpcObjectExportResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcObjectExportResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcObjectExportResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcObjectExportResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcObjectExportResponse.Merge(m, src) +} +func (m *RpcObjectExportResponse) XXX_Size() int { + return m.Size() +} +func (m *RpcObjectExportResponse) XXX_DiscardUnknown() { + xxx_messageInfo_RpcObjectExportResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcObjectExportResponse proto.InternalMessageInfo + +func (m *RpcObjectExportResponse) GetError() *RpcObjectExportResponseError { + if m != nil { + return m.Error + } + return nil +} + +func (m *RpcObjectExportResponse) GetResult() string { + if m != nil { + return m.Result + } + return "" +} + +func (m *RpcObjectExportResponse) GetEvent() *ResponseEvent { + if m != nil { + return m.Event + } + return nil +} + +type RpcObjectExportResponseError struct { + Code RpcObjectExportResponseErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.RpcObjectExportResponseErrorCode" json:"code,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` +} + +func (m *RpcObjectExportResponseError) Reset() { *m = RpcObjectExportResponseError{} } +func (m *RpcObjectExportResponseError) String() string { return proto.CompactTextString(m) } +func (*RpcObjectExportResponseError) ProtoMessage() {} +func (*RpcObjectExportResponseError) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 1, 0} +} +func (m *RpcObjectExportResponseError) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcObjectExportResponseError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcObjectExportResponseError.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcObjectExportResponseError) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcObjectExportResponseError.Merge(m, src) +} +func (m *RpcObjectExportResponseError) XXX_Size() int { + return m.Size() +} +func (m *RpcObjectExportResponseError) XXX_DiscardUnknown() { + xxx_messageInfo_RpcObjectExportResponseError.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcObjectExportResponseError proto.InternalMessageInfo + +func (m *RpcObjectExportResponseError) GetCode() RpcObjectExportResponseErrorCode { + if m != nil { + return m.Code + } + return RpcObjectExportResponseError_NULL +} + +func (m *RpcObjectExportResponseError) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + type RpcObjectImport struct { } @@ -30845,7 +31083,7 @@ func (m *RpcObjectImport) Reset() { *m = RpcObjectImport{} } func (m *RpcObjectImport) String() string { return proto.CompactTextString(m) } func (*RpcObjectImport) ProtoMessage() {} func (*RpcObjectImport) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49} } func (m *RpcObjectImport) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -30899,7 +31137,7 @@ func (m *RpcObjectImportRequest) Reset() { *m = RpcObjectImportRequest{} func (m *RpcObjectImportRequest) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportRequest) ProtoMessage() {} func (*RpcObjectImportRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 0} } func (m *RpcObjectImportRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -31097,7 +31335,7 @@ func (m *RpcObjectImportRequestNotionParams) Reset() { *m = RpcObjectImp func (m *RpcObjectImportRequestNotionParams) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportRequestNotionParams) ProtoMessage() {} func (*RpcObjectImportRequestNotionParams) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 0, 0} } func (m *RpcObjectImportRequestNotionParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -31141,7 +31379,7 @@ func (m *RpcObjectImportRequestMarkdownParams) Reset() { *m = RpcObjectI func (m *RpcObjectImportRequestMarkdownParams) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportRequestMarkdownParams) ProtoMessage() {} func (*RpcObjectImportRequestMarkdownParams) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 0, 1} } func (m *RpcObjectImportRequestMarkdownParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -31185,7 +31423,7 @@ func (m *RpcObjectImportRequestBookmarksParams) Reset() { *m = RpcObject func (m *RpcObjectImportRequestBookmarksParams) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportRequestBookmarksParams) ProtoMessage() {} func (*RpcObjectImportRequestBookmarksParams) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 0, 2} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 0, 2} } func (m *RpcObjectImportRequestBookmarksParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -31229,7 +31467,7 @@ func (m *RpcObjectImportRequestHtmlParams) Reset() { *m = RpcObjectImpor func (m *RpcObjectImportRequestHtmlParams) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportRequestHtmlParams) ProtoMessage() {} func (*RpcObjectImportRequestHtmlParams) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 0, 3} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 0, 3} } func (m *RpcObjectImportRequestHtmlParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -31273,7 +31511,7 @@ func (m *RpcObjectImportRequestTxtParams) Reset() { *m = RpcObjectImport func (m *RpcObjectImportRequestTxtParams) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportRequestTxtParams) ProtoMessage() {} func (*RpcObjectImportRequestTxtParams) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 0, 4} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 0, 4} } func (m *RpcObjectImportRequestTxtParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -31320,7 +31558,7 @@ func (m *RpcObjectImportRequestPbParams) Reset() { *m = RpcObjectImportR func (m *RpcObjectImportRequestPbParams) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportRequestPbParams) ProtoMessage() {} func (*RpcObjectImportRequestPbParams) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 0, 5} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 0, 5} } func (m *RpcObjectImportRequestPbParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -31389,7 +31627,7 @@ func (m *RpcObjectImportRequestCsvParams) Reset() { *m = RpcObjectImport func (m *RpcObjectImportRequestCsvParams) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportRequestCsvParams) ProtoMessage() {} func (*RpcObjectImportRequestCsvParams) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 0, 6} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 0, 6} } func (m *RpcObjectImportRequestCsvParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -31462,7 +31700,7 @@ func (m *RpcObjectImportRequestSnapshot) Reset() { *m = RpcObjectImportR func (m *RpcObjectImportRequestSnapshot) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportRequestSnapshot) ProtoMessage() {} func (*RpcObjectImportRequestSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 0, 7} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 0, 7} } func (m *RpcObjectImportRequestSnapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -31515,7 +31753,7 @@ func (m *RpcObjectImportResponse) Reset() { *m = RpcObjectImportResponse func (m *RpcObjectImportResponse) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportResponse) ProtoMessage() {} func (*RpcObjectImportResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 1} } func (m *RpcObjectImportResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -31574,7 +31812,7 @@ func (m *RpcObjectImportResponseError) Reset() { *m = RpcObjectImportRes func (m *RpcObjectImportResponseError) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportResponseError) ProtoMessage() {} func (*RpcObjectImportResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 1, 0} } func (m *RpcObjectImportResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -31624,7 +31862,7 @@ func (m *RpcObjectImportNotion) Reset() { *m = RpcObjectImportNotion{} } func (m *RpcObjectImportNotion) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportNotion) ProtoMessage() {} func (*RpcObjectImportNotion) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 2} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 2} } func (m *RpcObjectImportNotion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -31660,7 +31898,7 @@ func (m *RpcObjectImportNotionValidateToken) Reset() { *m = RpcObjectImp func (m *RpcObjectImportNotionValidateToken) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportNotionValidateToken) ProtoMessage() {} func (*RpcObjectImportNotionValidateToken) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 2, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 2, 0} } func (m *RpcObjectImportNotionValidateToken) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -31701,7 +31939,7 @@ func (m *RpcObjectImportNotionValidateTokenRequest) String() string { } func (*RpcObjectImportNotionValidateTokenRequest) ProtoMessage() {} func (*RpcObjectImportNotionValidateTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 2, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 2, 0, 0} } func (m *RpcObjectImportNotionValidateTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -31749,7 +31987,7 @@ func (m *RpcObjectImportNotionValidateTokenResponse) String() string { } func (*RpcObjectImportNotionValidateTokenResponse) ProtoMessage() {} func (*RpcObjectImportNotionValidateTokenResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 2, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 2, 0, 1} } func (m *RpcObjectImportNotionValidateTokenResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -31798,7 +32036,7 @@ func (m *RpcObjectImportNotionValidateTokenResponseError) String() string { } func (*RpcObjectImportNotionValidateTokenResponseError) ProtoMessage() {} func (*RpcObjectImportNotionValidateTokenResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 48, 2, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 2, 0, 1, 0} } func (m *RpcObjectImportNotionValidateTokenResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -31848,7 +32086,7 @@ func (m *RpcObjectImportList) Reset() { *m = RpcObjectImportList{} } func (m *RpcObjectImportList) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportList) ProtoMessage() {} func (*RpcObjectImportList) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 50} } func (m *RpcObjectImportList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -31884,7 +32122,7 @@ func (m *RpcObjectImportListRequest) Reset() { *m = RpcObjectImportListR func (m *RpcObjectImportListRequest) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportListRequest) ProtoMessage() {} func (*RpcObjectImportListRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 50, 0} } func (m *RpcObjectImportListRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -31922,7 +32160,7 @@ func (m *RpcObjectImportListResponse) Reset() { *m = RpcObjectImportList func (m *RpcObjectImportListResponse) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportListResponse) ProtoMessage() {} func (*RpcObjectImportListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 50, 1} } func (m *RpcObjectImportListResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -31974,7 +32212,7 @@ func (m *RpcObjectImportListResponseError) Reset() { *m = RpcObjectImpor func (m *RpcObjectImportListResponseError) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportListResponseError) ProtoMessage() {} func (*RpcObjectImportListResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 50, 1, 0} } func (m *RpcObjectImportListResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -32025,7 +32263,7 @@ func (m *RpcObjectImportListImportResponse) Reset() { *m = RpcObjectImpo func (m *RpcObjectImportListImportResponse) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportListImportResponse) ProtoMessage() {} func (*RpcObjectImportListImportResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 49, 2} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 50, 2} } func (m *RpcObjectImportListImportResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -32068,7 +32306,7 @@ func (m *RpcObjectImportUseCase) Reset() { *m = RpcObjectImportUseCase{} func (m *RpcObjectImportUseCase) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportUseCase) ProtoMessage() {} func (*RpcObjectImportUseCase) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 50} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 51} } func (m *RpcObjectImportUseCase) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -32106,7 +32344,7 @@ func (m *RpcObjectImportUseCaseRequest) Reset() { *m = RpcObjectImportUs func (m *RpcObjectImportUseCaseRequest) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportUseCaseRequest) ProtoMessage() {} func (*RpcObjectImportUseCaseRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 50, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 51, 0} } func (m *RpcObjectImportUseCaseRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -32158,7 +32396,7 @@ func (m *RpcObjectImportUseCaseResponse) Reset() { *m = RpcObjectImportU func (m *RpcObjectImportUseCaseResponse) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportUseCaseResponse) ProtoMessage() {} func (*RpcObjectImportUseCaseResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 50, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 51, 1} } func (m *RpcObjectImportUseCaseResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -32210,7 +32448,7 @@ func (m *RpcObjectImportUseCaseResponseError) Reset() { *m = RpcObjectIm func (m *RpcObjectImportUseCaseResponseError) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportUseCaseResponseError) ProtoMessage() {} func (*RpcObjectImportUseCaseResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 50, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 51, 1, 0} } func (m *RpcObjectImportUseCaseResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -32260,7 +32498,7 @@ func (m *RpcObjectImportExperience) Reset() { *m = RpcObjectImportExperi func (m *RpcObjectImportExperience) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportExperience) ProtoMessage() {} func (*RpcObjectImportExperience) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 51} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 52} } func (m *RpcObjectImportExperience) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -32300,7 +32538,7 @@ func (m *RpcObjectImportExperienceRequest) Reset() { *m = RpcObjectImpor func (m *RpcObjectImportExperienceRequest) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportExperienceRequest) ProtoMessage() {} func (*RpcObjectImportExperienceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 51, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 52, 0} } func (m *RpcObjectImportExperienceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -32366,7 +32604,7 @@ func (m *RpcObjectImportExperienceResponse) Reset() { *m = RpcObjectImpo func (m *RpcObjectImportExperienceResponse) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportExperienceResponse) ProtoMessage() {} func (*RpcObjectImportExperienceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 51, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 52, 1} } func (m *RpcObjectImportExperienceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -32420,7 +32658,7 @@ func (m *RpcObjectImportExperienceResponseError) Reset() { func (m *RpcObjectImportExperienceResponseError) String() string { return proto.CompactTextString(m) } func (*RpcObjectImportExperienceResponseError) ProtoMessage() {} func (*RpcObjectImportExperienceResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 51, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 52, 1, 0} } func (m *RpcObjectImportExperienceResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -32470,7 +32708,7 @@ func (m *RpcObjectDateByTimestamp) Reset() { *m = RpcObjectDateByTimesta func (m *RpcObjectDateByTimestamp) String() string { return proto.CompactTextString(m) } func (*RpcObjectDateByTimestamp) ProtoMessage() {} func (*RpcObjectDateByTimestamp) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 52} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 53} } func (m *RpcObjectDateByTimestamp) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -32508,7 +32746,7 @@ func (m *RpcObjectDateByTimestampRequest) Reset() { *m = RpcObjectDateBy func (m *RpcObjectDateByTimestampRequest) String() string { return proto.CompactTextString(m) } func (*RpcObjectDateByTimestampRequest) ProtoMessage() {} func (*RpcObjectDateByTimestampRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 52, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 53, 0} } func (m *RpcObjectDateByTimestampRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -32560,7 +32798,7 @@ func (m *RpcObjectDateByTimestampResponse) Reset() { *m = RpcObjectDateB func (m *RpcObjectDateByTimestampResponse) String() string { return proto.CompactTextString(m) } func (*RpcObjectDateByTimestampResponse) ProtoMessage() {} func (*RpcObjectDateByTimestampResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 52, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 53, 1} } func (m *RpcObjectDateByTimestampResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -32612,7 +32850,7 @@ func (m *RpcObjectDateByTimestampResponseError) Reset() { *m = RpcObject func (m *RpcObjectDateByTimestampResponseError) String() string { return proto.CompactTextString(m) } func (*RpcObjectDateByTimestampResponseError) ProtoMessage() {} func (*RpcObjectDateByTimestampResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 52, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 53, 1, 0} } func (m *RpcObjectDateByTimestampResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72787,6 +73025,7 @@ func init() { proto.RegisterEnum("anytype.RpcObjectListModifyDetailValuesResponseErrorCode", RpcObjectListModifyDetailValuesResponseErrorCode_name, RpcObjectListModifyDetailValuesResponseErrorCode_value) proto.RegisterEnum("anytype.RpcObjectApplyTemplateResponseErrorCode", RpcObjectApplyTemplateResponseErrorCode_name, RpcObjectApplyTemplateResponseErrorCode_value) proto.RegisterEnum("anytype.RpcObjectListExportResponseErrorCode", RpcObjectListExportResponseErrorCode_name, RpcObjectListExportResponseErrorCode_value) + proto.RegisterEnum("anytype.RpcObjectExportResponseErrorCode", RpcObjectExportResponseErrorCode_name, RpcObjectExportResponseErrorCode_value) proto.RegisterEnum("anytype.RpcObjectImportRequestMode", RpcObjectImportRequestMode_name, RpcObjectImportRequestMode_value) proto.RegisterEnum("anytype.RpcObjectImportRequestPbParamsType", RpcObjectImportRequestPbParamsType_name, RpcObjectImportRequestPbParamsType_value) proto.RegisterEnum("anytype.RpcObjectImportRequestCsvParamsMode", RpcObjectImportRequestCsvParamsMode_name, RpcObjectImportRequestCsvParamsMode_value) @@ -73416,6 +73655,10 @@ func init() { proto.RegisterType((*RpcObjectListExportRelationsWhiteList)(nil), "anytype.Rpc.Object.ListExport.RelationsWhiteList") proto.RegisterType((*RpcObjectListExportResponse)(nil), "anytype.Rpc.Object.ListExport.Response") proto.RegisterType((*RpcObjectListExportResponseError)(nil), "anytype.Rpc.Object.ListExport.Response.Error") + proto.RegisterType((*RpcObjectExport)(nil), "anytype.Rpc.Object.Export") + proto.RegisterType((*RpcObjectExportRequest)(nil), "anytype.Rpc.Object.Export.Request") + proto.RegisterType((*RpcObjectExportResponse)(nil), "anytype.Rpc.Object.Export.Response") + proto.RegisterType((*RpcObjectExportResponseError)(nil), "anytype.Rpc.Object.Export.Response.Error") proto.RegisterType((*RpcObjectImport)(nil), "anytype.Rpc.Object.Import") proto.RegisterType((*RpcObjectImportRequest)(nil), "anytype.Rpc.Object.Import.Request") proto.RegisterType((*RpcObjectImportRequestNotionParams)(nil), "anytype.Rpc.Object.Import.Request.NotionParams") @@ -74255,1288 +74498,1291 @@ func init() { func init() { proto.RegisterFile("pb/protos/commands.proto", fileDescriptor_8261c968b2e6f45c) } var fileDescriptor_8261c968b2e6f45c = []byte{ - // 20495 bytes of a gzipped FileDescriptorProto + // 20537 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7d, 0x98, 0x24, 0x49, - 0x55, 0x37, 0x3a, 0x95, 0x59, 0x55, 0xdd, 0x7d, 0xfa, 0x63, 0x6a, 0x72, 0x67, 0x67, 0x67, 0x63, - 0x97, 0xdd, 0x75, 0x58, 0x96, 0x75, 0x59, 0x7a, 0x61, 0x41, 0x64, 0x97, 0x5d, 0x96, 0xea, 0xea, - 0xea, 0xee, 0xda, 0xed, 0xae, 0x6a, 0xb2, 0xaa, 0x67, 0x58, 0xdf, 0xeb, 0x6d, 0x73, 0xaa, 0xa2, - 0xbb, 0x73, 0xa7, 0x3a, 0xb3, 0xc8, 0xcc, 0x9e, 0xd9, 0xe1, 0x3e, 0xef, 0x7d, 0x45, 0x44, 0x50, - 0x44, 0x44, 0x45, 0x45, 0x05, 0x04, 0x44, 0x04, 0x45, 0x64, 0xf9, 0x7a, 0x41, 0xf9, 0x50, 0x41, - 0x10, 0xbf, 0x50, 0xfc, 0x00, 0x94, 0x2b, 0xf8, 0x89, 0xef, 0xa3, 0xd7, 0xab, 0x57, 0x41, 0x7c, - 0xf5, 0xf5, 0x3e, 0x19, 0x11, 0x99, 0x19, 0x51, 0x5d, 0x99, 0x15, 0x59, 0x5d, 0x59, 0xbd, 0xea, - 0xfd, 0x2f, 0x33, 0x32, 0xf2, 0xc4, 0x89, 0xf3, 0x3b, 0x11, 0x71, 0x22, 0xe2, 0xc4, 0x09, 0x38, - 0xdb, 0xbb, 0x78, 0x57, 0xcf, 0xb1, 0x3d, 0xdb, 0xbd, 0xab, 0x6d, 0xef, 0xef, 0x1b, 0x56, 0xc7, - 0x5d, 0x24, 0xef, 0xda, 0x94, 0x61, 0x5d, 0xf5, 0xae, 0xf6, 0x30, 0xba, 0xb5, 0x77, 0x69, 0xf7, - 0xae, 0xae, 0x79, 0xf1, 0xae, 0xde, 0xc5, 0xbb, 0xf6, 0xed, 0x0e, 0xee, 0x06, 0x3f, 0x90, 0x17, - 0x96, 0x1d, 0xdd, 0x1e, 0x97, 0xab, 0x6b, 0xb7, 0x8d, 0xae, 0xeb, 0xd9, 0x0e, 0x66, 0x39, 0xcf, - 0x44, 0x45, 0xe2, 0xcb, 0xd8, 0xf2, 0x02, 0x0a, 0x37, 0xee, 0xda, 0xf6, 0x6e, 0x17, 0xd3, 0x6f, - 0x17, 0x0f, 0x76, 0xee, 0x72, 0x3d, 0xe7, 0xa0, 0xed, 0xb1, 0xaf, 0xb7, 0xf4, 0x7f, 0xed, 0x60, - 0xb7, 0xed, 0x98, 0x3d, 0xcf, 0x76, 0x68, 0x8e, 0x73, 0x8f, 0x3d, 0x36, 0x0d, 0xaa, 0xde, 0x6b, - 0xa3, 0xaf, 0x4c, 0x81, 0x5a, 0xee, 0xf5, 0xd0, 0xc7, 0x15, 0x80, 0x55, 0xec, 0x9d, 0xc7, 0x8e, - 0x6b, 0xda, 0x16, 0x3a, 0x09, 0x53, 0x3a, 0x7e, 0xe1, 0x01, 0x76, 0xbd, 0x7b, 0xf3, 0x2f, 0xff, - 0x0b, 0x35, 0x87, 0xde, 0xa2, 0xc0, 0xb4, 0x8e, 0xdd, 0x9e, 0x6d, 0xb9, 0x58, 0x7b, 0x1e, 0x14, - 0xb0, 0xe3, 0xd8, 0xce, 0xd9, 0xdc, 0x2d, 0xb9, 0xdb, 0x67, 0xef, 0xbe, 0x63, 0x91, 0x55, 0x7f, - 0x51, 0xef, 0xb5, 0x17, 0xcb, 0xbd, 0xde, 0x62, 0x44, 0x69, 0x31, 0xf8, 0x69, 0xb1, 0xea, 0xff, - 0xa1, 0xd3, 0x1f, 0xb5, 0xb3, 0x30, 0x75, 0x99, 0x66, 0x38, 0xab, 0xdc, 0x92, 0xbb, 0x7d, 0x46, - 0x0f, 0x5e, 0xfd, 0x2f, 0x1d, 0xec, 0x19, 0x66, 0xd7, 0x3d, 0xab, 0xd2, 0x2f, 0xec, 0x15, 0xbd, - 0x29, 0x07, 0x05, 0x42, 0x44, 0xab, 0x40, 0xbe, 0x6d, 0x77, 0x30, 0x29, 0x7e, 0xe1, 0xee, 0xbb, - 0xe4, 0x8b, 0x5f, 0xac, 0xd8, 0x1d, 0xac, 0x93, 0x9f, 0xb5, 0x5b, 0x60, 0x36, 0x10, 0x4b, 0xc4, - 0x06, 0x9f, 0x74, 0xee, 0x6e, 0xc8, 0xfb, 0xf9, 0xb5, 0x69, 0xc8, 0xd7, 0xb7, 0xd6, 0xd7, 0x4b, - 0x27, 0xb4, 0x53, 0x30, 0xbf, 0x55, 0x7f, 0xa8, 0xde, 0xb8, 0x50, 0xdf, 0xae, 0xea, 0x7a, 0x43, - 0x2f, 0xe5, 0xb4, 0x79, 0x98, 0x59, 0x2a, 0x2f, 0x6f, 0xd7, 0xea, 0x9b, 0x5b, 0xad, 0x92, 0x82, - 0x5e, 0xaf, 0xc2, 0x42, 0x13, 0x7b, 0xcb, 0xf8, 0xb2, 0xd9, 0xc6, 0x4d, 0xcf, 0xf0, 0x30, 0x7a, - 0x55, 0x2e, 0x14, 0xa6, 0xb6, 0xe5, 0x17, 0x1a, 0x7e, 0x62, 0x15, 0x78, 0xc6, 0xa1, 0x0a, 0x88, - 0x14, 0x16, 0xd9, 0xdf, 0x8b, 0x5c, 0x9a, 0xce, 0xd3, 0x39, 0xf7, 0x54, 0x98, 0xe5, 0xbe, 0x69, - 0x0b, 0x00, 0x4b, 0xe5, 0xca, 0x43, 0xab, 0x7a, 0x63, 0xab, 0xbe, 0x5c, 0x3a, 0xe1, 0xbf, 0xaf, - 0x34, 0xf4, 0x2a, 0x7b, 0xcf, 0xa1, 0xaf, 0xe5, 0x38, 0x30, 0x97, 0x45, 0x30, 0x17, 0x87, 0x33, - 0x33, 0x00, 0x50, 0xf4, 0x93, 0x21, 0x38, 0xab, 0x02, 0x38, 0xcf, 0x48, 0x47, 0x2e, 0x7b, 0x80, - 0x5e, 0xaa, 0xc0, 0x74, 0x73, 0xef, 0xc0, 0xeb, 0xd8, 0x57, 0x2c, 0x34, 0x13, 0x22, 0x83, 0xfe, - 0x86, 0x97, 0xc9, 0x73, 0x45, 0x99, 0xdc, 0x7e, 0xb8, 0x12, 0x8c, 0x42, 0x8c, 0x34, 0x7e, 0x3c, - 0x94, 0x46, 0x59, 0x90, 0xc6, 0x53, 0x65, 0x09, 0x65, 0x2f, 0x87, 0x1f, 0x79, 0x36, 0x14, 0x9a, - 0x3d, 0xa3, 0x8d, 0xd1, 0xaf, 0xab, 0x30, 0xb7, 0x8e, 0x8d, 0xcb, 0xb8, 0xdc, 0xeb, 0x39, 0xf6, - 0x65, 0x8c, 0x2a, 0x91, 0xbe, 0x9e, 0x85, 0x29, 0xd7, 0xcf, 0x54, 0xeb, 0x90, 0x1a, 0xcc, 0xe8, - 0xc1, 0xab, 0x76, 0x13, 0x80, 0xd9, 0xc1, 0x96, 0x67, 0x7a, 0x26, 0x76, 0xcf, 0x2a, 0xb7, 0xa8, - 0xb7, 0xcf, 0xe8, 0x5c, 0x0a, 0xfa, 0x8a, 0x22, 0xab, 0x63, 0x84, 0x8b, 0x45, 0x9e, 0x83, 0x18, - 0xa9, 0xbe, 0x59, 0x91, 0xd1, 0xb1, 0xa1, 0xe4, 0xd2, 0xc9, 0xf6, 0x67, 0x73, 0xe9, 0x85, 0xeb, - 0xe7, 0xa8, 0x37, 0xb6, 0x9b, 0x5b, 0x95, 0xb5, 0xed, 0xe6, 0x66, 0xb9, 0x52, 0x2d, 0x61, 0xed, - 0x34, 0x94, 0xc8, 0xe3, 0x76, 0xad, 0xb9, 0xbd, 0x5c, 0x5d, 0xaf, 0xb6, 0xaa, 0xcb, 0xa5, 0x1d, - 0x4d, 0x83, 0x05, 0xbd, 0xfa, 0xfc, 0xad, 0x6a, 0xb3, 0xb5, 0xbd, 0x52, 0xae, 0xad, 0x57, 0x97, - 0x4b, 0xbb, 0xfe, 0xcf, 0xeb, 0xb5, 0x8d, 0x5a, 0x6b, 0x5b, 0xaf, 0x96, 0x2b, 0x6b, 0xd5, 0xe5, - 0xd2, 0x9e, 0x76, 0x1d, 0x5c, 0x53, 0x6f, 0x6c, 0x97, 0x37, 0x37, 0xf5, 0xc6, 0xf9, 0xea, 0x36, - 0xfb, 0xa3, 0x59, 0x32, 0x69, 0x41, 0xad, 0xed, 0xe6, 0x5a, 0x59, 0xaf, 0x96, 0x97, 0xd6, 0xab, - 0xa5, 0x47, 0xd0, 0x4b, 0x54, 0x98, 0xdf, 0x30, 0x2e, 0xe1, 0xe6, 0x9e, 0xe1, 0x60, 0xe3, 0x62, - 0x17, 0xa3, 0x27, 0x4a, 0xe0, 0x89, 0x7e, 0x9d, 0xc7, 0xab, 0x2a, 0xe2, 0x75, 0xd7, 0x00, 0x01, - 0x0b, 0x45, 0xc4, 0x00, 0xf6, 0x4f, 0x61, 0x33, 0x58, 0x13, 0x00, 0x7b, 0x66, 0x4a, 0x7a, 0xe9, - 0x10, 0xfb, 0xb6, 0xc7, 0x01, 0x62, 0xe8, 0x0b, 0x2a, 0x2c, 0xd4, 0xac, 0xcb, 0xa6, 0x87, 0x57, - 0xb1, 0x85, 0x1d, 0x7f, 0x1c, 0x90, 0x82, 0xe1, 0x2d, 0x2a, 0x07, 0xc3, 0x8a, 0x08, 0xc3, 0xd3, - 0x06, 0x88, 0x4d, 0x2c, 0x23, 0x66, 0xb4, 0xbd, 0x11, 0x66, 0x4c, 0x92, 0xaf, 0x62, 0x76, 0x98, - 0xc4, 0xa2, 0x04, 0xed, 0x56, 0x98, 0xa7, 0x2f, 0x2b, 0x66, 0x17, 0x3f, 0x84, 0xaf, 0xb2, 0x71, - 0x57, 0x4c, 0x44, 0xdf, 0x1d, 0x36, 0xbe, 0x9a, 0x80, 0xe5, 0x37, 0xa4, 0x65, 0x2a, 0x1d, 0x98, - 0xaf, 0x79, 0x3c, 0x34, 0xbf, 0x43, 0xad, 0xcc, 0x44, 0xff, 0xaa, 0xc0, 0x6c, 0xd3, 0xb3, 0x7b, - 0xbe, 0xca, 0x9a, 0xd6, 0xae, 0x1c, 0xb8, 0x9f, 0xe4, 0xdb, 0x58, 0x45, 0x04, 0xf7, 0xa9, 0x03, - 0xe4, 0xc8, 0x15, 0x10, 0xd3, 0xc2, 0xbe, 0x12, 0xb6, 0xb0, 0x15, 0x01, 0x95, 0xbb, 0x53, 0x51, - 0xfb, 0x77, 0xd8, 0xbe, 0x5e, 0xa3, 0x42, 0x29, 0x50, 0x33, 0xaf, 0x72, 0xe0, 0x38, 0xd8, 0xf2, - 0xe4, 0x40, 0xf8, 0x43, 0x1e, 0x84, 0x35, 0x11, 0x84, 0xbb, 0x13, 0x94, 0x39, 0x28, 0x25, 0xc3, - 0x36, 0xf6, 0xd1, 0x10, 0xcd, 0x87, 0x04, 0x34, 0xbf, 0x31, 0x3d, 0x5b, 0xe9, 0x20, 0x5d, 0x1b, - 0x01, 0xd1, 0xd3, 0x50, 0xf2, 0xc7, 0xa4, 0x4a, 0xab, 0x76, 0xbe, 0xba, 0x5d, 0xab, 0x9f, 0xaf, - 0xb5, 0xaa, 0x25, 0x8c, 0xbe, 0x5f, 0x85, 0x39, 0xca, 0x9a, 0x8e, 0x2f, 0xdb, 0x97, 0x24, 0x7b, - 0xbd, 0x2f, 0xa4, 0x34, 0x16, 0xf8, 0x12, 0x62, 0x5a, 0xc6, 0x77, 0xa5, 0x30, 0x16, 0x12, 0xc8, - 0x3d, 0x9e, 0x7a, 0xab, 0x43, 0xcd, 0x60, 0x77, 0x40, 0x6b, 0x19, 0xd8, 0x5b, 0xbd, 0x26, 0x0f, - 0x40, 0x2b, 0x79, 0xde, 0xc4, 0x57, 0xd0, 0x46, 0x84, 0x89, 0xa0, 0xb6, 0xb9, 0xa1, 0x6a, 0xab, - 0x0c, 0x52, 0xdb, 0xf7, 0xf3, 0x63, 0xd6, 0x92, 0x88, 0xde, 0x9d, 0xb1, 0xe2, 0xf6, 0x39, 0x89, - 0x9f, 0x1d, 0x06, 0x8a, 0xa2, 0x88, 0x56, 0xe7, 0x8d, 0x30, 0x43, 0x1e, 0xeb, 0xc6, 0x3e, 0x66, - 0x6d, 0x28, 0x4a, 0xd0, 0xce, 0xc1, 0x1c, 0xcd, 0xd8, 0xb6, 0x2d, 0xbf, 0x3e, 0x79, 0x92, 0x41, - 0x48, 0xf3, 0x41, 0x6c, 0x3b, 0xd8, 0xf0, 0x6c, 0x87, 0xd0, 0x28, 0x50, 0x10, 0xb9, 0x24, 0xf4, - 0xe5, 0xb0, 0x15, 0x56, 0x05, 0xcd, 0x79, 0x7a, 0x9a, 0xaa, 0xa4, 0xd3, 0x9b, 0xcb, 0xa3, 0xb5, - 0x3f, 0xda, 0xea, 0xb6, 0x7d, 0xb4, 0x57, 0xc8, 0xd4, 0x0e, 0x6b, 0x67, 0x40, 0x63, 0xa9, 0x7e, - 0xde, 0x4a, 0xa3, 0xde, 0xaa, 0xd6, 0x5b, 0xa5, 0x9d, 0x81, 0x1a, 0xb5, 0x8b, 0xde, 0x9c, 0x87, - 0xfc, 0x83, 0xb6, 0x69, 0xa1, 0x97, 0xe6, 0x04, 0x95, 0xb0, 0xb0, 0x77, 0xc5, 0x76, 0x2e, 0x85, - 0x0d, 0x35, 0x4a, 0x48, 0xc6, 0x26, 0x52, 0x25, 0x75, 0xa8, 0x2a, 0xe5, 0x07, 0xa9, 0xd2, 0xf7, - 0xf1, 0xaa, 0x74, 0x9f, 0xa8, 0x4a, 0xb7, 0x0d, 0x90, 0xbf, 0xcf, 0x7c, 0x4c, 0x07, 0xf0, 0x89, - 0xb0, 0x03, 0x78, 0x40, 0x80, 0xf1, 0x29, 0x72, 0x64, 0xd2, 0x01, 0xf8, 0xf9, 0x4c, 0x1b, 0xfe, - 0x20, 0xa8, 0x77, 0x63, 0xa0, 0xde, 0x1b, 0xd0, 0x27, 0x98, 0x87, 0xbb, 0x8e, 0x47, 0x0e, 0x77, - 0x13, 0x97, 0xb4, 0x6b, 0xe1, 0xd4, 0x72, 0x6d, 0x65, 0xa5, 0xaa, 0x57, 0xeb, 0xad, 0xed, 0x7a, - 0xb5, 0x75, 0xa1, 0xa1, 0x3f, 0x54, 0xea, 0xa2, 0x37, 0xa9, 0x00, 0xbe, 0x84, 0x2a, 0x86, 0xd5, - 0xc6, 0x5d, 0xb9, 0x1e, 0xfd, 0xff, 0x56, 0xd2, 0xf5, 0x09, 0x11, 0xfd, 0x18, 0x38, 0x5f, 0xa7, - 0xc8, 0xb7, 0xca, 0x58, 0x62, 0xe9, 0x40, 0x7d, 0xfb, 0xe3, 0xc1, 0xf6, 0xbc, 0x06, 0x4e, 0x06, - 0xf4, 0x58, 0xf6, 0xc1, 0xd3, 0xbe, 0x77, 0xe6, 0x61, 0x81, 0xc1, 0x12, 0xcc, 0xe3, 0x5f, 0x9e, - 0x93, 0x99, 0xc8, 0x23, 0x98, 0x66, 0xd3, 0xf6, 0xa0, 0x7b, 0x0f, 0xdf, 0xb5, 0x55, 0x98, 0xed, - 0x61, 0x67, 0xdf, 0x74, 0x5d, 0xd3, 0xb6, 0xe8, 0x82, 0xdc, 0xc2, 0xdd, 0x4f, 0x0a, 0x25, 0x4e, - 0xd6, 0x2e, 0x17, 0x37, 0x0d, 0xc7, 0x33, 0xdb, 0x66, 0xcf, 0xb0, 0xbc, 0xcd, 0x28, 0xb3, 0xce, - 0xff, 0x89, 0x5e, 0x9d, 0x72, 0x5a, 0x23, 0xd6, 0x24, 0x46, 0x25, 0x7e, 0x21, 0xc5, 0x94, 0x24, - 0x91, 0x60, 0x3a, 0xb5, 0xf8, 0x78, 0xa6, 0x6a, 0x31, 0x00, 0xef, 0x5d, 0xed, 0x7a, 0xb8, 0xb6, - 0x56, 0xaf, 0x34, 0x74, 0xbd, 0x5a, 0x69, 0x6d, 0x6f, 0x56, 0xf5, 0x8d, 0x5a, 0xb3, 0x59, 0x6b, - 0xd4, 0x9b, 0x47, 0x69, 0xed, 0xe8, 0x53, 0x6a, 0xa8, 0x31, 0xcb, 0xb8, 0xdd, 0x35, 0x2d, 0x8c, - 0x1e, 0x38, 0xa2, 0xc2, 0x88, 0xab, 0x3e, 0xf2, 0x38, 0xb3, 0xf2, 0x63, 0x70, 0x7e, 0x63, 0x7a, - 0x9c, 0x07, 0x13, 0xfc, 0x0f, 0xdc, 0xfc, 0xbf, 0xa0, 0xc2, 0x29, 0xae, 0x21, 0xea, 0x78, 0x7f, - 0x6c, 0x2b, 0x79, 0xdf, 0xc6, 0xb7, 0xdd, 0x9a, 0x88, 0xe9, 0x20, 0x6b, 0xfa, 0x10, 0x1b, 0x31, - 0xb0, 0xbe, 0x3d, 0x84, 0x75, 0x5d, 0x80, 0xf5, 0xd9, 0x23, 0xd0, 0x4c, 0x87, 0xec, 0xcf, 0x65, - 0x8a, 0xec, 0xf5, 0x70, 0xed, 0x66, 0x59, 0x6f, 0xd5, 0x2a, 0xb5, 0xcd, 0xb2, 0x3f, 0x8e, 0x72, - 0x43, 0x76, 0x8c, 0xb9, 0x2e, 0x82, 0x3e, 0x10, 0xdf, 0x8f, 0xe4, 0xe1, 0xc6, 0xc1, 0x1d, 0x6d, - 0x65, 0xcf, 0xb0, 0x76, 0x31, 0x32, 0x65, 0xa0, 0x5e, 0x86, 0xa9, 0x36, 0xc9, 0x4e, 0x71, 0xe6, - 0xb7, 0x6e, 0x12, 0xfa, 0x72, 0x5a, 0x82, 0x1e, 0xfc, 0x8a, 0xde, 0xcd, 0x2b, 0x44, 0x4b, 0x54, - 0x88, 0xe7, 0x26, 0x83, 0x77, 0x88, 0xef, 0x18, 0xdd, 0xf8, 0x74, 0xa8, 0x1b, 0x17, 0x04, 0xdd, - 0xa8, 0x1c, 0x8d, 0x7c, 0x3a, 0x35, 0xf9, 0xb5, 0xc7, 0x43, 0x07, 0x10, 0xab, 0x4d, 0x66, 0xfc, - 0xa8, 0x30, 0xb0, 0xbb, 0x7f, 0x83, 0x0a, 0xc5, 0x65, 0xdc, 0xc5, 0xb2, 0x2b, 0x91, 0x7f, 0xab, - 0xc8, 0x6e, 0x88, 0x50, 0x18, 0x28, 0xed, 0xf8, 0xd5, 0x11, 0xcf, 0xdc, 0xc7, 0xae, 0x67, 0xec, - 0xf7, 0x88, 0xa8, 0x55, 0x3d, 0x4a, 0x40, 0xdf, 0xae, 0xc8, 0x6c, 0x97, 0x24, 0x14, 0xf3, 0x1f, - 0x63, 0x4d, 0xf1, 0x33, 0x0a, 0x4c, 0x37, 0xb1, 0xd7, 0x70, 0x3a, 0xd8, 0x41, 0xcd, 0x08, 0xa3, - 0x5b, 0x60, 0x96, 0x80, 0xe2, 0x4f, 0x33, 0x43, 0x9c, 0xf8, 0x24, 0xed, 0x36, 0x58, 0x08, 0x5f, - 0xc9, 0xef, 0xac, 0x1b, 0xef, 0x4b, 0x45, 0x7f, 0x97, 0x93, 0xdd, 0xc5, 0x65, 0x4b, 0x86, 0x8c, - 0x9b, 0x98, 0x56, 0x2a, 0xb7, 0x23, 0x9b, 0x48, 0x2a, 0xfb, 0x8d, 0xae, 0x77, 0x29, 0x00, 0x5b, - 0x96, 0x1b, 0xc8, 0xf5, 0x29, 0x29, 0xe4, 0x8a, 0xfe, 0x31, 0x97, 0x6e, 0x16, 0x13, 0x95, 0x13, - 0x23, 0xb1, 0x9f, 0x48, 0xb1, 0xb6, 0x10, 0x4b, 0x2c, 0x7b, 0x99, 0x7d, 0xf6, 0x24, 0x14, 0x2f, - 0x18, 0xdd, 0x2e, 0xf6, 0xd0, 0xeb, 0x55, 0x28, 0x56, 0x1c, 0x6c, 0x78, 0x18, 0xe1, 0x48, 0x74, - 0x08, 0xa6, 0x1d, 0xdb, 0xf6, 0x36, 0x0d, 0x6f, 0x8f, 0xc9, 0x2d, 0x7c, 0xd7, 0x9e, 0x0d, 0xd7, - 0xed, 0x1c, 0x74, 0xbb, 0x1e, 0x7e, 0xd4, 0xdb, 0x74, 0xcc, 0x7d, 0xc3, 0xb9, 0xba, 0x6e, 0x58, - 0xbb, 0x07, 0xc6, 0x2e, 0x66, 0xec, 0xc5, 0x7d, 0x66, 0xae, 0x06, 0x3f, 0xc3, 0x77, 0x3c, 0x0f, - 0x88, 0x42, 0xff, 0x7a, 0x41, 0x4e, 0x94, 0xc5, 0x45, 0xca, 0x5e, 0x4c, 0xcf, 0x83, 0x60, 0x7a, - 0xdf, 0xc2, 0xfb, 0xb6, 0x65, 0xb6, 0x03, 0x6b, 0x35, 0x78, 0x47, 0xbf, 0x14, 0xa2, 0xb1, 0x24, - 0xa0, 0xb1, 0x28, 0x5d, 0x4a, 0x3a, 0x28, 0x9a, 0x23, 0xf4, 0x3b, 0x37, 0xc3, 0x0d, 0xb4, 0x1b, - 0xd9, 0x6e, 0x35, 0xb6, 0x2b, 0x7a, 0xb5, 0xdc, 0xaa, 0x6e, 0xaf, 0x37, 0x2a, 0xe5, 0xf5, 0x6d, - 0xbd, 0xba, 0xd9, 0x28, 0x61, 0x7f, 0x76, 0x3e, 0xa5, 0xe3, 0xb6, 0x7d, 0x19, 0x3b, 0xe8, 0xc5, - 0x39, 0x39, 0x88, 0x12, 0x84, 0x92, 0x04, 0x9f, 0x2a, 0x03, 0xdf, 0xf7, 0x49, 0x7b, 0x8a, 0x30, - 0xc1, 0x32, 0xe6, 0x63, 0x5a, 0xcc, 0x2f, 0x4b, 0xf5, 0x31, 0x89, 0xa4, 0x1e, 0x07, 0x20, 0xfd, - 0x83, 0x02, 0x53, 0x15, 0xdb, 0xba, 0x8c, 0x1d, 0x8f, 0x9f, 0x64, 0xf1, 0x38, 0xe4, 0xfa, 0x70, - 0x38, 0x0b, 0x53, 0xd8, 0xf2, 0x1c, 0xbb, 0x17, 0xcc, 0xb2, 0x82, 0x57, 0xf4, 0xd6, 0xb4, 0x12, - 0x66, 0x25, 0xc7, 0xaf, 0xb6, 0x0e, 0x2e, 0x48, 0x60, 0x4f, 0xed, 0x6b, 0x3b, 0x6f, 0x4a, 0x83, - 0xcb, 0x60, 0x06, 0xb2, 0xef, 0xc7, 0xbe, 0xa8, 0xc2, 0x3c, 0x6d, 0xb7, 0x4d, 0x4c, 0xcc, 0x42, - 0xd4, 0xe0, 0xd7, 0x39, 0xfb, 0x84, 0xbf, 0x76, 0x42, 0x10, 0x7f, 0xd1, 0xe8, 0xf5, 0xc2, 0x35, - 0xef, 0xb5, 0x13, 0x3a, 0x7b, 0xa7, 0x6a, 0xbe, 0x54, 0x84, 0xbc, 0x71, 0xe0, 0xed, 0xa1, 0x7f, - 0x95, 0x9e, 0xf1, 0x0a, 0xfd, 0x08, 0xe3, 0x27, 0x06, 0x92, 0xd3, 0x50, 0xf0, 0xec, 0x4b, 0x38, - 0x90, 0x03, 0x7d, 0xf1, 0xe1, 0x30, 0x7a, 0xbd, 0x16, 0xf9, 0xc0, 0xe0, 0x08, 0xde, 0x7d, 0x03, - 0xcb, 0x68, 0xb7, 0xed, 0x03, 0xcb, 0xab, 0x05, 0xeb, 0xde, 0x51, 0x02, 0xfa, 0x6c, 0x4e, 0x66, - 0x06, 0x2d, 0xc1, 0x60, 0x3a, 0xc8, 0x2e, 0x8e, 0xd0, 0x94, 0x16, 0xe1, 0x8e, 0xf2, 0xe6, 0xe6, - 0x76, 0xab, 0xf1, 0x50, 0xb5, 0x1e, 0x59, 0xbb, 0xdb, 0xb5, 0xfa, 0x76, 0x6b, 0xad, 0xba, 0x5d, - 0xd9, 0xd2, 0xc9, 0xe2, 0x64, 0xb9, 0x52, 0x69, 0x6c, 0xd5, 0x5b, 0x25, 0x8c, 0xde, 0xa1, 0xc0, - 0x5c, 0xa5, 0x6b, 0xbb, 0x21, 0xc2, 0x37, 0x47, 0x08, 0x87, 0x62, 0xcc, 0x71, 0x62, 0x44, 0xff, - 0x33, 0x27, 0xeb, 0xe9, 0x10, 0x08, 0x84, 0x23, 0x1f, 0xd3, 0x4b, 0xbd, 0x55, 0xca, 0xd3, 0x61, - 0x38, 0xbd, 0xec, 0x9b, 0xc4, 0xe7, 0xab, 0x30, 0x55, 0xa6, 0x8a, 0x81, 0xfe, 0x38, 0x07, 0xc5, - 0x8a, 0x6d, 0xed, 0x98, 0xbb, 0xbe, 0x05, 0x89, 0x2d, 0xe3, 0x62, 0x17, 0x2f, 0x1b, 0x9e, 0x71, - 0xd9, 0xc4, 0x57, 0x48, 0x05, 0xa6, 0xf5, 0xbe, 0x54, 0x9f, 0x29, 0x96, 0x82, 0x2f, 0x1e, 0xec, - 0x12, 0xa6, 0xa6, 0x75, 0x3e, 0xc9, 0x1f, 0x3f, 0xe8, 0xeb, 0xa6, 0x83, 0x1d, 0xdc, 0xc5, 0x86, - 0x8b, 0xfd, 0xb9, 0x98, 0x85, 0xbb, 0x44, 0x69, 0xa7, 0xf5, 0xb8, 0xcf, 0xda, 0x39, 0x98, 0xa3, - 0x9f, 0x88, 0xfd, 0xe3, 0x12, 0x35, 0x9e, 0xd6, 0x85, 0x34, 0xed, 0xa9, 0x50, 0xc0, 0x8f, 0x7a, - 0x8e, 0x71, 0xb6, 0x43, 0xf0, 0xba, 0x6e, 0x91, 0xba, 0x3a, 0x2e, 0x06, 0xae, 0x8e, 0x8b, 0x4d, - 0xe2, 0x08, 0xa9, 0xd3, 0x5c, 0xe8, 0x53, 0xd3, 0xa1, 0xf5, 0xf2, 0x0e, 0x35, 0x52, 0x0c, 0x0d, - 0xf2, 0x96, 0xb1, 0x8f, 0x99, 0x5e, 0x90, 0x67, 0xed, 0x0e, 0x38, 0x69, 0x5c, 0x36, 0x3c, 0xc3, - 0x59, 0xb7, 0xdb, 0x46, 0x97, 0x0c, 0x9b, 0x41, 0xcb, 0xef, 0xff, 0x40, 0xb6, 0xa1, 0x3c, 0xdb, - 0xc1, 0x24, 0x57, 0xb0, 0x0d, 0x15, 0x24, 0xf8, 0xd4, 0xcd, 0xb6, 0x6d, 0x11, 0xfe, 0x55, 0x9d, - 0x3c, 0xfb, 0x52, 0xe9, 0x98, 0xae, 0x5f, 0x11, 0x42, 0xa5, 0x4e, 0xf7, 0x53, 0x9a, 0x57, 0xad, - 0x36, 0xd9, 0x82, 0x9a, 0xd6, 0xe3, 0x3e, 0x6b, 0x4b, 0x30, 0xcb, 0x76, 0x5f, 0x36, 0x7c, 0xbd, - 0x2a, 0x12, 0xbd, 0xba, 0x45, 0x74, 0x24, 0xa3, 0x78, 0x2e, 0xd6, 0xa3, 0x7c, 0x3a, 0xff, 0x93, - 0xf6, 0x3c, 0xb8, 0x81, 0xbd, 0x56, 0x0e, 0x5c, 0xcf, 0xde, 0xa7, 0xa0, 0xaf, 0x98, 0x5d, 0x5a, - 0x83, 0x29, 0x52, 0x83, 0xa4, 0x2c, 0xda, 0xdd, 0x70, 0xba, 0xe7, 0xe0, 0x1d, 0xec, 0x3c, 0x6c, - 0xec, 0x1f, 0x3c, 0xda, 0x72, 0x0c, 0xcb, 0xed, 0xd9, 0x8e, 0x77, 0x76, 0x9a, 0x30, 0x3f, 0xf0, - 0x9b, 0x76, 0x27, 0x9c, 0x7a, 0xc4, 0xb5, 0xad, 0x72, 0xcf, 0x5c, 0x37, 0x5d, 0x0f, 0x5b, 0xe5, - 0x4e, 0xc7, 0x39, 0x3b, 0x43, 0xca, 0x3a, 0xfc, 0x81, 0x75, 0xab, 0xd3, 0x50, 0xa4, 0xc2, 0x46, - 0xaf, 0x2a, 0x48, 0x7b, 0x9c, 0xb2, 0xea, 0x27, 0xda, 0x81, 0x4f, 0x83, 0x29, 0xd6, 0x1f, 0x12, - 0x58, 0x67, 0xef, 0x3e, 0xd3, 0xb7, 0xf4, 0xc1, 0xa8, 0xe8, 0x41, 0x36, 0xed, 0x19, 0x50, 0x6c, - 0x13, 0x21, 0x10, 0x84, 0x67, 0xef, 0xbe, 0x61, 0x70, 0xa1, 0x24, 0x8b, 0xce, 0xb2, 0xa2, 0xcf, - 0xa9, 0x52, 0x4e, 0xaa, 0x49, 0x1c, 0xa7, 0xeb, 0x03, 0xbe, 0xac, 0x8c, 0xd0, 0xc9, 0xde, 0x09, - 0xb7, 0xb3, 0x1e, 0x94, 0x59, 0x2b, 0xcb, 0xdb, 0x4b, 0x5b, 0xc1, 0x7c, 0xd5, 0xb7, 0x61, 0x9a, - 0xad, 0xb2, 0xde, 0xda, 0xae, 0x37, 0x96, 0xfd, 0x79, 0xee, 0x1d, 0x70, 0xdb, 0x90, 0xdc, 0xd5, - 0xd6, 0x76, 0xbd, 0xbc, 0x51, 0x2d, 0xed, 0x88, 0x96, 0x50, 0xb3, 0xd5, 0xd8, 0xdc, 0xd6, 0xb7, - 0xea, 0xf5, 0x5a, 0x7d, 0x95, 0x12, 0xf3, 0x4d, 0xcf, 0x33, 0x51, 0x86, 0x0b, 0x7a, 0xad, 0x55, - 0xdd, 0xae, 0x34, 0xea, 0x2b, 0xb5, 0xd5, 0x92, 0x39, 0xcc, 0x8c, 0x7a, 0x44, 0xbb, 0x05, 0x6e, - 0x14, 0x38, 0xa9, 0x35, 0xea, 0xfe, 0xe4, 0xbb, 0x52, 0xae, 0x57, 0xaa, 0xfe, 0x4c, 0xfb, 0x92, - 0x86, 0xe0, 0x5a, 0x4a, 0x6e, 0x7b, 0xa5, 0xb6, 0xce, 0xef, 0x97, 0x7d, 0x32, 0xa7, 0x9d, 0x85, - 0x6b, 0xf8, 0x6f, 0xb5, 0xfa, 0xf9, 0xf2, 0x7a, 0x6d, 0xb9, 0xf4, 0xab, 0x39, 0xed, 0x56, 0xb8, - 0x59, 0xf8, 0x8b, 0x6e, 0x7d, 0x6d, 0xd7, 0x96, 0xb7, 0x37, 0x6a, 0xcd, 0x8d, 0x72, 0xab, 0xb2, - 0x56, 0xfa, 0x14, 0x99, 0x98, 0x84, 0x96, 0x36, 0xe7, 0x39, 0xfa, 0x1a, 0xde, 0x02, 0x28, 0x8b, - 0x8a, 0xfa, 0x94, 0x81, 0xb0, 0x27, 0x5b, 0xbc, 0x1f, 0x0f, 0xc7, 0x92, 0x65, 0x41, 0x85, 0x9e, - 0x96, 0x82, 0x56, 0x3a, 0x1d, 0x6a, 0x8d, 0xa0, 0x42, 0xb7, 0xc0, 0x8d, 0xf5, 0x2a, 0x45, 0x4a, - 0xaf, 0x56, 0x1a, 0xe7, 0xab, 0xfa, 0xf6, 0x85, 0xf2, 0xfa, 0x7a, 0xb5, 0xb5, 0xbd, 0x52, 0xd3, - 0x9b, 0xad, 0xd2, 0x0e, 0xfa, 0x47, 0x25, 0x5c, 0x70, 0xe2, 0xa4, 0xf5, 0xc7, 0x4a, 0xda, 0x66, - 0x9d, 0xb8, 0xb0, 0xf4, 0x0d, 0x50, 0x74, 0x3d, 0xc3, 0x3b, 0x70, 0x59, 0xab, 0x7e, 0xc2, 0xe0, - 0x56, 0xbd, 0xd8, 0x24, 0x99, 0x74, 0x96, 0x19, 0x7d, 0x2e, 0x97, 0xa6, 0x99, 0x8e, 0x61, 0xcd, - 0xc9, 0x1c, 0x41, 0xc4, 0x37, 0x01, 0x0a, 0xb4, 0xbd, 0xd6, 0xdc, 0x2e, 0xaf, 0xeb, 0xd5, 0xf2, - 0xf2, 0xc3, 0xe1, 0x4a, 0x13, 0xd6, 0xae, 0x85, 0x53, 0x5b, 0xf5, 0xf2, 0xd2, 0x7a, 0x95, 0x34, - 0x97, 0x46, 0xbd, 0x5e, 0xad, 0xf8, 0x72, 0xff, 0x76, 0xb2, 0xaf, 0xe3, 0xdb, 0xdb, 0x84, 0x6f, - 0xdf, 0x26, 0xe2, 0xe4, 0xff, 0x17, 0xd2, 0xee, 0x4f, 0x91, 0x86, 0xf1, 0xb4, 0xc6, 0x8b, 0xc3, - 0x67, 0xa5, 0x3c, 0x9e, 0xa4, 0x38, 0x49, 0x87, 0xc7, 0xb7, 0x8c, 0x80, 0xc7, 0xb5, 0x70, 0x8a, - 0xc7, 0x83, 0x78, 0x3e, 0xc5, 0xc3, 0xf0, 0x3e, 0x15, 0xa6, 0x36, 0xcc, 0x5d, 0xe2, 0xfa, 0x79, - 0x10, 0x99, 0x1e, 0x0b, 0xa0, 0x84, 0x9e, 0x36, 0x8a, 0xd9, 0x11, 0xa6, 0xe9, 0x8a, 0xfc, 0x4a, - 0x8a, 0xd4, 0x54, 0xfc, 0xdd, 0xa9, 0x7b, 0x26, 0xc6, 0x70, 0x4c, 0xcf, 0xf4, 0xa7, 0xa9, 0x7a, - 0xa6, 0xc1, 0xb4, 0xd2, 0xc1, 0xe4, 0x1c, 0x0d, 0x26, 0xde, 0x33, 0x66, 0x0e, 0xa6, 0xc3, 0x71, - 0x82, 0x6c, 0xd2, 0xf8, 0x1f, 0xab, 0xf5, 0xc6, 0xd6, 0xea, 0xda, 0xf6, 0x8a, 0x5e, 0xad, 0xb2, - 0x65, 0xdd, 0x5d, 0xf4, 0x98, 0x02, 0xf3, 0x8c, 0x77, 0xe6, 0xf1, 0x70, 0x73, 0x2c, 0x7c, 0x4c, - 0xd0, 0xff, 0xc6, 0x4f, 0x29, 0x56, 0x45, 0x41, 0x3f, 0x3d, 0x49, 0x38, 0x89, 0x2e, 0x0f, 0x6f, - 0x0b, 0xc5, 0xfd, 0xa0, 0x20, 0xee, 0x67, 0xa5, 0xa6, 0x98, 0xfd, 0xb4, 0xe2, 0xaf, 0x66, 0xa0, - 0xd8, 0xc4, 0x5d, 0xdc, 0xf6, 0xd0, 0x0f, 0xa9, 0x23, 0x6b, 0x7b, 0x9c, 0x89, 0xac, 0xa6, 0x32, - 0x91, 0xf3, 0x19, 0x98, 0xc8, 0x85, 0xd1, 0x4d, 0xe4, 0x62, 0x5a, 0x13, 0x79, 0x2a, 0xc6, 0x44, - 0x4e, 0xea, 0x0f, 0xa6, 0x65, 0xfa, 0x83, 0x8f, 0x15, 0xd3, 0x8e, 0xbd, 0x14, 0xd2, 0xe3, 0x35, - 0xa9, 0xbf, 0xa7, 0x90, 0x66, 0xac, 0x1e, 0xc8, 0x71, 0x3a, 0xfd, 0x7f, 0x5d, 0x3e, 0x83, 0x25, - 0x40, 0xed, 0x89, 0x70, 0x73, 0xf4, 0xbe, 0x5d, 0x7d, 0x41, 0xad, 0xd9, 0x6a, 0x12, 0x3b, 0xba, - 0xd2, 0xd0, 0xf5, 0xad, 0x4d, 0xba, 0x79, 0x74, 0x06, 0xb4, 0x88, 0x8a, 0xbe, 0x55, 0xa7, 0x56, - 0xf3, 0xae, 0x48, 0x7d, 0xa5, 0x56, 0x5f, 0xde, 0x0e, 0x47, 0xa2, 0xfa, 0x4a, 0xa3, 0xb4, 0xa7, - 0x2d, 0xc2, 0x1d, 0x1c, 0x75, 0xd2, 0xb5, 0xd1, 0x12, 0xca, 0xf5, 0xe5, 0xed, 0x8d, 0x7a, 0x75, - 0xa3, 0x51, 0xaf, 0x55, 0x48, 0x7a, 0xb3, 0xda, 0x2a, 0x99, 0xbe, 0xf9, 0xd6, 0x67, 0xa7, 0x37, - 0xab, 0x65, 0xbd, 0xb2, 0x56, 0xd5, 0x69, 0x91, 0x8f, 0x68, 0xb7, 0xc1, 0xb9, 0x72, 0xbd, 0xd1, - 0xf2, 0x53, 0xca, 0xf5, 0x87, 0x5b, 0x0f, 0x6f, 0x56, 0xb7, 0x37, 0xf5, 0x46, 0xa5, 0xda, 0x6c, - 0xfa, 0xa3, 0x1f, 0xb3, 0xea, 0x4b, 0x5d, 0xed, 0xb9, 0x70, 0x2f, 0xc7, 0x5a, 0xb5, 0x45, 0x3c, - 0x15, 0x36, 0x1a, 0xc4, 0x59, 0x6d, 0xb9, 0xba, 0xbd, 0x56, 0x6e, 0x6e, 0xd7, 0xea, 0x95, 0xc6, - 0xc6, 0x66, 0xb9, 0x55, 0xf3, 0x07, 0xc9, 0x4d, 0xbd, 0xd1, 0x6a, 0x6c, 0x9f, 0xaf, 0xea, 0xcd, - 0x5a, 0xa3, 0x5e, 0xb2, 0xfc, 0x2a, 0x73, 0xa3, 0x6a, 0x60, 0xdd, 0xd8, 0xda, 0x8d, 0x70, 0x36, - 0x48, 0x5f, 0x6f, 0xf8, 0x82, 0xe6, 0xec, 0xfc, 0x1e, 0x6f, 0x1b, 0x35, 0x5b, 0x0d, 0x9d, 0x5a, - 0xfa, 0x1b, 0xb5, 0x55, 0xdd, 0x9f, 0x9e, 0x94, 0x5e, 0x98, 0xe9, 0x3c, 0xe0, 0x9f, 0x15, 0xc8, - 0x37, 0x3d, 0xbb, 0x87, 0xbe, 0x3e, 0xea, 0xe8, 0x6e, 0x02, 0x70, 0x88, 0x63, 0xc2, 0xb2, 0xe1, - 0x19, 0x6c, 0xed, 0x84, 0x4b, 0x41, 0xbf, 0x22, 0xbd, 0x9b, 0x1a, 0x59, 0x4a, 0x76, 0x2f, 0x66, - 0x60, 0xf8, 0x9a, 0xdc, 0xf1, 0xb2, 0x78, 0x42, 0xe9, 0xda, 0xc3, 0x77, 0x8d, 0xb2, 0x5f, 0x8a, - 0xe0, 0x0c, 0x07, 0xab, 0x2f, 0xff, 0x40, 0x65, 0xb0, 0x76, 0x1d, 0x5c, 0xd3, 0xa7, 0x7c, 0x44, - 0xe7, 0x76, 0xb4, 0xaf, 0x83, 0x27, 0x70, 0xea, 0x5f, 0xdd, 0x68, 0x9c, 0xaf, 0x86, 0x8a, 0xbe, - 0x5c, 0x6e, 0x95, 0x4b, 0xbb, 0xe8, 0x33, 0x2a, 0xe4, 0x37, 0xec, 0xcb, 0xfd, 0x9b, 0xd8, 0x16, - 0xbe, 0xc2, 0xed, 0x74, 0x04, 0xaf, 0xe2, 0x71, 0x1a, 0x29, 0xb1, 0x6f, 0xc4, 0x3b, 0xac, 0x7c, - 0x56, 0x49, 0x23, 0xf6, 0x8d, 0xa3, 0x7a, 0xa9, 0xfc, 0xd5, 0x28, 0x62, 0x8f, 0x11, 0x2d, 0xd6, - 0xce, 0xc1, 0x4d, 0xd1, 0x87, 0xda, 0x72, 0xb5, 0xde, 0xaa, 0xad, 0x3c, 0x1c, 0x09, 0xb7, 0xa6, - 0x4b, 0x89, 0x7f, 0x58, 0x37, 0x97, 0x3c, 0xbf, 0x3f, 0x0b, 0xa7, 0xa3, 0x6f, 0xab, 0xd5, 0x56, - 0xf0, 0xe5, 0x11, 0xf4, 0xd2, 0x02, 0xcc, 0xd1, 0x6e, 0x7f, 0xab, 0xd7, 0xf1, 0x2d, 0xe6, 0x67, - 0x44, 0xe8, 0xde, 0x0e, 0x27, 0x6b, 0x9b, 0x2b, 0xcd, 0xa6, 0x67, 0x3b, 0xc6, 0x2e, 0x26, 0x23, - 0x24, 0x95, 0x56, 0x7f, 0x32, 0x7a, 0xaf, 0xf4, 0x5a, 0xbc, 0x38, 0xd4, 0xd0, 0x32, 0x63, 0x50, - 0xff, 0xa2, 0xd4, 0xda, 0xb9, 0x04, 0xc1, 0x74, 0xe8, 0x3f, 0x32, 0xe6, 0x36, 0x17, 0x8f, 0xcb, - 0xce, 0xb9, 0x97, 0x29, 0x30, 0xd3, 0x32, 0xf7, 0xf1, 0x8b, 0x6c, 0x0b, 0xbb, 0xda, 0x14, 0xa8, - 0xab, 0x1b, 0xad, 0xd2, 0x09, 0xff, 0xc1, 0x9f, 0xca, 0xe4, 0xc8, 0x43, 0xd5, 0x2f, 0xc0, 0x7f, - 0x28, 0xb7, 0x4a, 0xaa, 0xff, 0xb0, 0x51, 0x6d, 0x95, 0xf2, 0xfe, 0x43, 0xbd, 0xda, 0x2a, 0x15, - 0xfc, 0x87, 0xcd, 0xf5, 0x56, 0xa9, 0xe8, 0x3f, 0xd4, 0x9a, 0xad, 0xd2, 0x94, 0xff, 0xb0, 0xd4, - 0x6c, 0x95, 0xa6, 0xfd, 0x87, 0xf3, 0xcd, 0x56, 0x69, 0xc6, 0x7f, 0xa8, 0xb4, 0x5a, 0x25, 0xf0, - 0x1f, 0x1e, 0x6c, 0xb6, 0x4a, 0xb3, 0xfe, 0x43, 0xb9, 0xd2, 0x2a, 0xcd, 0x91, 0x87, 0x6a, 0xab, - 0x34, 0xef, 0x3f, 0x34, 0x9b, 0xad, 0xd2, 0x02, 0xa1, 0xdc, 0x6c, 0x95, 0x4e, 0x92, 0xb2, 0x6a, - 0xad, 0x52, 0xc9, 0x7f, 0x58, 0x6b, 0xb6, 0x4a, 0xa7, 0x48, 0xe6, 0x66, 0xab, 0xa4, 0x91, 0x42, - 0x9b, 0xad, 0xd2, 0x35, 0x24, 0x4f, 0xb3, 0x55, 0x3a, 0x4d, 0x8a, 0x68, 0xb6, 0x4a, 0xd7, 0x12, - 0x36, 0xaa, 0xad, 0xd2, 0x19, 0x92, 0x47, 0x6f, 0x95, 0xae, 0x23, 0x9f, 0xea, 0xad, 0xd2, 0x59, - 0xc2, 0x58, 0xb5, 0x55, 0xba, 0x9e, 0x3c, 0xe8, 0xad, 0x12, 0x22, 0x9f, 0xca, 0xad, 0xd2, 0x0d, - 0xe8, 0x09, 0x30, 0xb3, 0x8a, 0x3d, 0x0a, 0x22, 0x2a, 0x81, 0xba, 0x8a, 0x3d, 0x7e, 0xf2, 0xfc, - 0xfa, 0x3c, 0x5c, 0xc7, 0x16, 0x5c, 0x56, 0x1c, 0x7b, 0x7f, 0x1d, 0xef, 0x1a, 0xed, 0xab, 0xd5, - 0x47, 0x7d, 0x53, 0x0e, 0xbd, 0x32, 0x27, 0xac, 0x2f, 0xf7, 0xa2, 0xde, 0x88, 0x3c, 0x27, 0x9a, - 0xbe, 0xc1, 0x8a, 0xb1, 0x2a, 0xae, 0x18, 0xc7, 0x19, 0x7b, 0x79, 0x19, 0x63, 0xef, 0xef, 0xf9, - 0xc6, 0x20, 0x6c, 0x0f, 0xe5, 0xfa, 0xb6, 0x87, 0xfc, 0x16, 0xd6, 0xc3, 0x8e, 0x6b, 0x5b, 0x46, - 0xb7, 0xc9, 0x9c, 0x81, 0xe8, 0xfc, 0xb2, 0x3f, 0x59, 0x7b, 0x7e, 0xd0, 0xa8, 0xa8, 0xc1, 0xf7, - 0x9c, 0xa4, 0x25, 0xa9, 0x7e, 0x09, 0xc5, 0xb4, 0xaf, 0x4f, 0x85, 0xed, 0xab, 0x25, 0xb4, 0xaf, - 0xe7, 0x1d, 0x81, 0x76, 0xba, 0xa6, 0x56, 0x1b, 0x6d, 0x92, 0x19, 0xb9, 0xca, 0x07, 0xbb, 0x51, - 0x2a, 0xfa, 0x8c, 0x02, 0x67, 0xaa, 0xd6, 0xa0, 0x49, 0x0a, 0xaf, 0x46, 0xef, 0xe0, 0xa1, 0xd9, - 0x14, 0x45, 0x7a, 0xef, 0xc0, 0x6a, 0x0f, 0xa6, 0x19, 0x23, 0xd1, 0xdf, 0x0c, 0x25, 0xda, 0x14, - 0x24, 0xfa, 0xc0, 0xe8, 0xa4, 0xd3, 0x09, 0xb4, 0x3e, 0xd6, 0xbe, 0x2b, 0x8f, 0xfe, 0x4c, 0x81, - 0x53, 0xd4, 0x9f, 0xef, 0x41, 0x3a, 0x27, 0x22, 0xbd, 0xbd, 0x68, 0x7d, 0x75, 0xa3, 0xf9, 0x13, - 0xd5, 0x6f, 0x2e, 0x05, 0xbd, 0x99, 0x17, 0xf8, 0x43, 0xa2, 0xc0, 0x63, 0xfa, 0xf1, 0xfe, 0xe2, - 0x62, 0x64, 0xfd, 0xab, 0xa1, 0xac, 0xeb, 0x82, 0xac, 0xef, 0x1d, 0x89, 0xea, 0xf1, 0x8a, 0xf9, - 0xcb, 0x79, 0x78, 0x02, 0xe5, 0x90, 0x29, 0x02, 0xed, 0x07, 0xcb, 0x56, 0x47, 0xc7, 0xae, 0x67, - 0x38, 0x9e, 0x10, 0xca, 0xa2, 0x6f, 0xd2, 0x9d, 0xcb, 0x60, 0xd2, 0xad, 0x0c, 0x9d, 0x74, 0xa3, - 0xf7, 0xf0, 0x06, 0xde, 0x05, 0x11, 0xd9, 0x72, 0x02, 0x06, 0x31, 0x35, 0x8c, 0x6b, 0x51, 0xa1, - 0xe5, 0xf7, 0x4d, 0x02, 0xca, 0x2b, 0x47, 0x2e, 0x21, 0x1d, 0xe2, 0xbf, 0x32, 0x5e, 0x4b, 0x3c, - 0xcf, 0x7f, 0x13, 0xcd, 0xc6, 0x52, 0x27, 0xd3, 0x29, 0xd4, 0xab, 0xa7, 0x61, 0x86, 0x74, 0x39, - 0xeb, 0xa6, 0x75, 0x09, 0xfd, 0xa9, 0x0a, 0x73, 0x75, 0x7c, 0xa5, 0xb2, 0x67, 0x74, 0xbb, 0xd8, - 0xda, 0xc5, 0xe8, 0x11, 0xc1, 0xb6, 0x37, 0x7a, 0xbd, 0x7a, 0xb4, 0x5b, 0x1b, 0xbc, 0x6a, 0x0f, - 0x40, 0xc1, 0x6d, 0xdb, 0x3d, 0xea, 0x55, 0xb6, 0xc0, 0xb9, 0x86, 0x89, 0x2b, 0xce, 0xe5, 0x03, - 0x6f, 0x6f, 0x91, 0x94, 0x55, 0xee, 0x99, 0x4d, 0xff, 0x07, 0x9d, 0xfe, 0xc7, 0xc6, 0xc9, 0xbf, - 0x18, 0xd8, 0x19, 0xe7, 0x12, 0x3a, 0xe3, 0x90, 0xf1, 0x45, 0x9e, 0xe9, 0x98, 0x45, 0x92, 0x5b, - 0x60, 0xb6, 0x1d, 0x64, 0x09, 0xcf, 0xcc, 0xf1, 0x49, 0xe8, 0xcf, 0x53, 0x75, 0xd7, 0x52, 0x85, - 0xa7, 0xd3, 0x2a, 0x3c, 0x66, 0x53, 0xf3, 0x5a, 0x38, 0xd5, 0x6a, 0x34, 0xb6, 0x37, 0xca, 0xf5, - 0x87, 0xa3, 0x58, 0x15, 0x3b, 0xe8, 0x75, 0x79, 0x58, 0x68, 0xda, 0xdd, 0xcb, 0x38, 0xc2, 0xb9, - 0x26, 0x38, 0x63, 0xf2, 0x72, 0xca, 0x1d, 0x92, 0x93, 0x76, 0x06, 0x8a, 0x86, 0xe5, 0x5e, 0xc1, - 0x81, 0xf9, 0xcf, 0xde, 0x18, 0x8c, 0x1f, 0xe1, 0x3b, 0x02, 0x5d, 0x84, 0xf1, 0xbe, 0x21, 0x92, - 0x14, 0xb9, 0x8a, 0x01, 0xf2, 0x1c, 0xcc, 0xb9, 0xd4, 0x67, 0xa3, 0xc5, 0xb9, 0xe6, 0x08, 0x69, - 0x84, 0x45, 0xea, 0x34, 0xa4, 0x32, 0x16, 0xc9, 0x1b, 0x7a, 0x53, 0xd8, 0x7f, 0x6c, 0x09, 0x10, - 0x97, 0x8f, 0xc2, 0x58, 0x3a, 0x90, 0xdf, 0x30, 0xee, 0x49, 0xfc, 0x59, 0x38, 0xcd, 0x9a, 0xfd, - 0x76, 0x65, 0xad, 0xbc, 0xbe, 0x5e, 0xad, 0xaf, 0x56, 0xb7, 0x6b, 0xcb, 0x74, 0x0f, 0x38, 0x4a, - 0x29, 0xb7, 0x5a, 0xd5, 0x8d, 0xcd, 0x56, 0x73, 0xbb, 0xfa, 0x82, 0x4a, 0xb5, 0xba, 0x4c, 0xdc, - 0xa1, 0xc9, 0x79, 0xc6, 0xc0, 0x71, 0xbd, 0x5c, 0x6f, 0x5e, 0xa8, 0xea, 0xa5, 0xbd, 0x73, 0x65, - 0x98, 0xe5, 0x06, 0x0a, 0x9f, 0xbb, 0x65, 0xbc, 0x63, 0x1c, 0x74, 0x99, 0x39, 0x5e, 0x3a, 0xe1, - 0x73, 0x47, 0x64, 0xd3, 0xb0, 0xba, 0x57, 0x4b, 0x39, 0xad, 0x04, 0x73, 0xfc, 0x98, 0x50, 0x52, - 0xd0, 0xbb, 0x6e, 0x84, 0x99, 0x0b, 0xb6, 0x73, 0x89, 0xf8, 0xf0, 0xa2, 0x0f, 0xd0, 0x98, 0x56, - 0x41, 0x74, 0x00, 0xce, 0x00, 0x7b, 0x83, 0xbc, 0xd3, 0x56, 0x40, 0x6d, 0x71, 0x68, 0x04, 0x80, - 0x5b, 0x60, 0xf6, 0x4a, 0x90, 0x3b, 0x6a, 0xe9, 0x5c, 0x12, 0xfa, 0x29, 0x39, 0x37, 0xac, 0xe1, - 0x45, 0x66, 0xbf, 0x9e, 0xff, 0x4e, 0x05, 0x8a, 0xab, 0xd8, 0x2b, 0x77, 0xbb, 0xbc, 0xdc, 0x5e, - 0x2b, 0x7d, 0xaa, 0x53, 0xa8, 0x44, 0xb9, 0xdb, 0x8d, 0x6f, 0x54, 0x9c, 0x80, 0x82, 0xd3, 0x47, - 0x42, 0x9a, 0xa4, 0xcf, 0xf4, 0x90, 0x02, 0xb3, 0x97, 0xd8, 0x2f, 0x45, 0x8e, 0xd2, 0x6f, 0xe1, - 0xcc, 0xa4, 0xa7, 0x47, 0xf1, 0xcc, 0x72, 0xc9, 0x2e, 0x4b, 0x41, 0x3e, 0xed, 0x21, 0x98, 0x3a, - 0x70, 0x71, 0xc5, 0x70, 0x83, 0xa1, 0x4d, 0xac, 0x69, 0xe3, 0xe2, 0x23, 0xb8, 0xed, 0x2d, 0xd6, - 0xf6, 0xfd, 0x89, 0xcf, 0x16, 0xcd, 0x18, 0x86, 0x08, 0x63, 0xef, 0x7a, 0x40, 0xc1, 0x9f, 0x76, - 0x5e, 0x31, 0xbd, 0xbd, 0xca, 0x9e, 0xe1, 0xb1, 0x6d, 0x94, 0xf0, 0x1d, 0xbd, 0x6a, 0x04, 0x38, - 0x13, 0x9d, 0x6c, 0x62, 0x0f, 0x87, 0xa7, 0x06, 0x71, 0x0c, 0x9e, 0x31, 0xa3, 0x80, 0xf8, 0xd7, - 0x0a, 0xe4, 0x1b, 0x3d, 0x6c, 0x49, 0x9f, 0x84, 0x0c, 0x65, 0xab, 0xf4, 0xc9, 0xf6, 0x4d, 0xf2, - 0x4e, 0xba, 0x61, 0xa5, 0xfd, 0x92, 0x63, 0x24, 0x7b, 0x17, 0xe4, 0x4d, 0x6b, 0xc7, 0x66, 0x96, - 0xed, 0x0d, 0x31, 0xb6, 0x4e, 0xcd, 0xda, 0xb1, 0x75, 0x92, 0x51, 0xd6, 0x3f, 0x37, 0xa9, 0xec, - 0xec, 0xc5, 0xfd, 0x37, 0xd3, 0x50, 0xa4, 0xea, 0x8c, 0x5e, 0xa3, 0x82, 0x5a, 0xee, 0x74, 0x62, - 0x04, 0xaf, 0x1c, 0x12, 0xbc, 0x4d, 0x7e, 0x0b, 0x31, 0x09, 0xdf, 0xc5, 0x40, 0x56, 0x92, 0x7d, - 0x3b, 0x6b, 0x52, 0xe5, 0x4e, 0x27, 0xfe, 0x14, 0x41, 0x58, 0xa0, 0x22, 0x16, 0xc8, 0xb7, 0x70, - 0x55, 0xae, 0x85, 0xa7, 0x1e, 0x08, 0x62, 0xf9, 0xcb, 0x1e, 0xa2, 0xbf, 0x57, 0x60, 0x6a, 0xdd, - 0x74, 0x3d, 0x1f, 0x9b, 0xb2, 0x0c, 0x36, 0x37, 0xc2, 0x4c, 0x20, 0x1a, 0xbf, 0xcb, 0xf3, 0xfb, - 0xf3, 0x28, 0x41, 0x9c, 0x89, 0x3f, 0x28, 0xa2, 0xf3, 0xcc, 0xe4, 0xda, 0x33, 0x2e, 0xe2, 0x4f, - 0x98, 0x45, 0xc5, 0x2a, 0xfd, 0xc5, 0xfe, 0x4c, 0x28, 0xf0, 0x0d, 0x41, 0xe0, 0xf7, 0x8c, 0x52, - 0x64, 0xf6, 0x42, 0xff, 0x3d, 0x05, 0xc0, 0x2f, 0x9b, 0x1d, 0xe3, 0x7d, 0xb2, 0x10, 0x9c, 0x23, - 0x41, 0xba, 0xaf, 0xe3, 0xa5, 0xbb, 0x21, 0x4a, 0xf7, 0x1b, 0x87, 0x57, 0x35, 0xe9, 0xb8, 0xae, - 0x56, 0x02, 0xd5, 0x0c, 0x45, 0xeb, 0x3f, 0xa2, 0x77, 0x86, 0x42, 0xdd, 0x14, 0x84, 0x7a, 0xdf, - 0x88, 0x25, 0x65, 0x2f, 0xd7, 0x3f, 0x54, 0x60, 0xaa, 0x89, 0x3d, 0xbf, 0x9b, 0x44, 0xe7, 0x65, - 0x7a, 0x78, 0xae, 0x6d, 0x2b, 0x92, 0x6d, 0xfb, 0xab, 0x39, 0xd9, 0x20, 0x5f, 0x91, 0x64, 0x18, - 0x4f, 0x31, 0xab, 0x0f, 0x6f, 0x91, 0x0a, 0xf2, 0x35, 0x8c, 0x5a, 0xf6, 0xd2, 0x7d, 0x87, 0x12, - 0xfa, 0x80, 0x88, 0xa7, 0xec, 0x78, 0xb3, 0x38, 0x77, 0xd8, 0x2c, 0x96, 0x3f, 0x65, 0xc7, 0xd7, - 0x31, 0xde, 0x31, 0x21, 0xb5, 0xb1, 0x31, 0x06, 0x9f, 0x81, 0x51, 0xe4, 0xf5, 0x12, 0x15, 0x8a, - 0x6c, 0xf3, 0xe0, 0x81, 0xe4, 0xbd, 0x83, 0xe1, 0x53, 0x8b, 0xf7, 0x8f, 0x60, 0xca, 0x25, 0x2d, - 0xcb, 0x87, 0x6c, 0x28, 0x1c, 0x1b, 0x77, 0x42, 0x81, 0x44, 0x21, 0x66, 0xe3, 0x5c, 0xe4, 0xee, - 0x11, 0x90, 0xa8, 0xfa, 0x5f, 0x75, 0x9a, 0x29, 0x35, 0x0a, 0x63, 0x58, 0xc9, 0x1f, 0x05, 0x85, - 0x2f, 0x6b, 0x00, 0x9b, 0x07, 0x17, 0xbb, 0xa6, 0xbb, 0x67, 0x5a, 0xc4, 0xfb, 0x6b, 0x8e, 0xbd, - 0xd2, 0x60, 0xba, 0x89, 0xe6, 0x5f, 0xac, 0x51, 0x50, 0x02, 0xf5, 0xc0, 0x31, 0xd9, 0x32, 0x80, - 0xff, 0xa8, 0xdd, 0x1f, 0x7a, 0x48, 0xe6, 0xfb, 0xc2, 0xa8, 0xf8, 0x62, 0x88, 0x38, 0x58, 0xe4, - 0x4a, 0x8f, 0x3c, 0x25, 0xf9, 0x88, 0xc9, 0x05, 0x31, 0x62, 0xb2, 0x70, 0xb6, 0xba, 0xd8, 0x77, - 0xb6, 0xda, 0xc7, 0xd1, 0x35, 0x5f, 0x84, 0x89, 0x53, 0x91, 0xaa, 0x93, 0x67, 0xff, 0x8f, 0x47, - 0x6c, 0xd3, 0x22, 0x9b, 0x3a, 0xcc, 0x83, 0x3f, 0x4a, 0xe0, 0xfb, 0xbc, 0x19, 0xc9, 0x3e, 0xef, - 0xa3, 0xd1, 0xdc, 0xc7, 0x96, 0x34, 0x9c, 0x53, 0x48, 0x4e, 0x60, 0x37, 0xdf, 0xc7, 0x2e, 0xfa, - 0x98, 0x74, 0x50, 0x45, 0x4e, 0xc6, 0x89, 0xb3, 0x18, 0xc6, 0x81, 0x12, 0x72, 0xc0, 0xed, 0x01, - 0x27, 0xf5, 0xc0, 0xc3, 0xe8, 0xa7, 0xd3, 0xe5, 0xfd, 0x11, 0xd6, 0x6b, 0x34, 0x58, 0x08, 0x0e, - 0xa9, 0x37, 0x96, 0x1e, 0xac, 0x56, 0x5a, 0x25, 0x7c, 0xf8, 0xe0, 0x3a, 0x39, 0xa2, 0x4e, 0x8f, - 0xa3, 0x47, 0x6b, 0x32, 0xe8, 0x7f, 0x28, 0x50, 0x64, 0xe6, 0xc6, 0x03, 0x47, 0x84, 0x10, 0xbd, - 0x7e, 0x14, 0x48, 0x12, 0x63, 0x85, 0xfc, 0x7a, 0x5a, 0x00, 0xc6, 0x60, 0x60, 0x3c, 0x9c, 0x19, - 0x00, 0xe8, 0x9f, 0x14, 0xc8, 0xfb, 0x66, 0x90, 0x5c, 0x24, 0x86, 0x4f, 0x49, 0xbb, 0xf1, 0x72, - 0x02, 0xf0, 0xc9, 0xc7, 0xe8, 0xf7, 0x12, 0xcc, 0xf4, 0x68, 0xc6, 0x30, 0x0e, 0xc8, 0xad, 0x12, - 0x9d, 0x11, 0xd6, 0xa3, 0xdf, 0xd0, 0xfb, 0xa4, 0x5c, 0x81, 0x93, 0xf9, 0x49, 0x07, 0x47, 0x75, - 0x1c, 0x41, 0x1b, 0x76, 0xd0, 0xbf, 0x28, 0x00, 0x3a, 0x76, 0xed, 0xee, 0x65, 0xbc, 0xe5, 0x98, - 0xe8, 0x86, 0x08, 0x00, 0xd6, 0xec, 0x73, 0x51, 0xb3, 0xff, 0xb4, 0x22, 0xeb, 0xd6, 0x2b, 0x68, - 0x5e, 0x40, 0x3c, 0x46, 0xfc, 0xcf, 0x85, 0x29, 0x26, 0x47, 0x66, 0x53, 0xca, 0x09, 0x3f, 0xf8, - 0x09, 0x7d, 0x50, 0xca, 0x2d, 0x58, 0x86, 0xa3, 0x74, 0x00, 0x54, 0x46, 0x00, 0xe0, 0x24, 0xcc, - 0x06, 0x00, 0x6c, 0xe9, 0xb5, 0x12, 0x46, 0xef, 0x56, 0x89, 0x87, 0x05, 0x1d, 0xdc, 0x8e, 0xde, - 0xd3, 0xfc, 0x99, 0xf4, 0x64, 0x9f, 0x93, 0x47, 0x58, 0x7e, 0x46, 0x00, 0xfd, 0x96, 0xd4, 0xec, - 0x5e, 0x82, 0xa1, 0xc7, 0x4b, 0x7f, 0x75, 0xae, 0x0a, 0xf3, 0x82, 0x55, 0xa2, 0x9d, 0x85, 0xd3, - 0x42, 0x02, 0x1d, 0xef, 0x3a, 0xa5, 0x13, 0x1a, 0x82, 0x33, 0xc2, 0x17, 0xf6, 0x82, 0x3b, 0xa5, - 0x1c, 0xfa, 0xbe, 0xcf, 0xe6, 0xc2, 0xf5, 0x9e, 0xf7, 0xe7, 0xd9, 0x4a, 0xdb, 0x27, 0xc4, 0xd0, - 0x93, 0x6d, 0xdb, 0xf2, 0xf0, 0xa3, 0x9c, 0x9b, 0x4a, 0x98, 0x90, 0x68, 0x35, 0x9c, 0x85, 0x29, - 0xcf, 0xe1, 0x5d, 0x57, 0x82, 0x57, 0x5e, 0xb1, 0x0a, 0xa2, 0x62, 0xd5, 0xe1, 0x9c, 0x69, 0xb5, - 0xbb, 0x07, 0x1d, 0xac, 0xe3, 0xae, 0xe1, 0xcb, 0xd0, 0x2d, 0xbb, 0xcb, 0xb8, 0x87, 0xad, 0x0e, - 0xb6, 0x3c, 0xca, 0x67, 0x70, 0x0a, 0x55, 0x22, 0xa7, 0xa8, 0x8c, 0xf7, 0x8b, 0xca, 0xf8, 0xe4, - 0x41, 0x4b, 0xb8, 0x09, 0xeb, 0x7d, 0xf7, 0x00, 0xd0, 0xba, 0x9d, 0x37, 0xf1, 0x15, 0xa6, 0x86, - 0xd7, 0xf7, 0xad, 0xfa, 0x35, 0xc2, 0x0c, 0x3a, 0x97, 0x19, 0x7d, 0x21, 0x54, 0xbf, 0xe7, 0x09, - 0xea, 0x77, 0xa7, 0x24, 0x0b, 0xe9, 0xb4, 0xae, 0x37, 0x82, 0xd6, 0xcd, 0xc3, 0x4c, 0xb4, 0x9b, - 0xac, 0x6a, 0xd7, 0xc3, 0xb5, 0x81, 0x87, 0x71, 0xbd, 0x5a, 0x5d, 0x6e, 0x6e, 0x6f, 0x6d, 0xae, - 0xea, 0xe5, 0xe5, 0x6a, 0x09, 0x7c, 0xfd, 0xa4, 0x7a, 0x19, 0x3a, 0x06, 0xe7, 0xd1, 0xef, 0x2b, - 0x50, 0x20, 0x47, 0xa8, 0xd1, 0x37, 0x8f, 0x49, 0x73, 0x5c, 0xc1, 0xe9, 0x29, 0x1c, 0x77, 0xe5, - 0xaf, 0x84, 0x60, 0xc2, 0x24, 0x5c, 0x1d, 0xe9, 0x4a, 0x88, 0x04, 0x42, 0xd9, 0xcf, 0x84, 0xfc, - 0x26, 0xd9, 0xdc, 0xb3, 0xaf, 0xfc, 0x67, 0x6e, 0x92, 0x7e, 0xfd, 0x8f, 0xb9, 0x49, 0x0e, 0x60, - 0x61, 0xe2, 0x4d, 0x72, 0x40, 0xbb, 0x4b, 0x68, 0xa6, 0xe8, 0x23, 0x85, 0x70, 0xfe, 0xf7, 0x71, - 0xe5, 0x48, 0x7b, 0x5f, 0x65, 0x98, 0x37, 0x2d, 0x0f, 0x3b, 0x96, 0xd1, 0x5d, 0xe9, 0x1a, 0xbb, - 0x81, 0x7d, 0xda, 0xbf, 0xe1, 0x51, 0xe3, 0xf2, 0xe8, 0xe2, 0x1f, 0xda, 0x4d, 0x00, 0x1e, 0xde, - 0xef, 0x75, 0x0d, 0x2f, 0x52, 0x3d, 0x2e, 0x85, 0xd7, 0xbe, 0xbc, 0xa8, 0x7d, 0x4f, 0x83, 0x6b, - 0x28, 0x68, 0xad, 0xab, 0x3d, 0xbc, 0x65, 0x99, 0x2f, 0x3c, 0x20, 0x91, 0x8a, 0xa9, 0x8e, 0x0e, - 0xfa, 0x24, 0xec, 0x00, 0x15, 0xc5, 0x1d, 0x20, 0xed, 0x3e, 0xb8, 0x9e, 0x84, 0x95, 0xc6, 0xfe, - 0x2f, 0x17, 0xcc, 0xce, 0x2e, 0xf6, 0x6a, 0x3b, 0x1b, 0xa6, 0xeb, 0x9a, 0xd6, 0x2e, 0x99, 0x8e, - 0x4f, 0xeb, 0xf1, 0x19, 0xd0, 0x5f, 0x4b, 0x47, 0x41, 0x0a, 0xfa, 0x8c, 0x21, 0x51, 0x90, 0xc2, - 0x76, 0xaa, 0xf6, 0xb5, 0xd3, 0x70, 0x55, 0x27, 0x2f, 0xb1, 0xaa, 0xc3, 0x63, 0x5a, 0x90, 0x5c, - 0x1d, 0x78, 0xa3, 0x54, 0x98, 0xa5, 0xa4, 0x6a, 0x64, 0xdf, 0xf7, 0x7d, 0x45, 0x85, 0x05, 0x5a, - 0xf4, 0x92, 0x6d, 0x5f, 0xda, 0x37, 0x9c, 0x4b, 0xe8, 0xfb, 0x8e, 0xb6, 0x8b, 0x9b, 0xb8, 0x7b, - 0x15, 0xb7, 0x25, 0xdb, 0xa7, 0xbc, 0xf9, 0x7e, 0xe5, 0x45, 0xbf, 0x29, 0x3d, 0x25, 0x11, 0xe4, - 0x19, 0x54, 0x6a, 0x32, 0xdb, 0x5b, 0x72, 0x07, 0x17, 0x65, 0x18, 0xcc, 0x1e, 0xf8, 0x5f, 0x0b, - 0x81, 0x0f, 0xc6, 0x11, 0x7e, 0x67, 0x60, 0x9c, 0xb8, 0xa3, 0x2f, 0x8e, 0x86, 0x5d, 0xc0, 0xd7, - 0x08, 0xd8, 0x95, 0x40, 0xbd, 0x14, 0x3a, 0x23, 0xf9, 0x8f, 0x7c, 0x85, 0xf2, 0xd9, 0xa1, 0x19, - 0xc3, 0xf2, 0x44, 0xd0, 0x3c, 0x2d, 0xb2, 0xd0, 0xe8, 0x65, 0x8a, 0xe9, 0xe7, 0xa5, 0x77, 0xdc, - 0x06, 0x0a, 0x88, 0x72, 0x37, 0x99, 0x56, 0x29, 0xb7, 0x5d, 0x27, 0xcf, 0x66, 0xf6, 0x68, 0xbe, - 0xb2, 0x00, 0x33, 0x41, 0x34, 0x2a, 0x72, 0x43, 0x5b, 0x88, 0xe1, 0x19, 0x28, 0xba, 0xf6, 0x81, - 0xd3, 0xc6, 0x6c, 0x0f, 0x94, 0xbd, 0x8d, 0xb0, 0x5f, 0x37, 0xd4, 0x5c, 0x38, 0x64, 0x91, 0xe4, - 0x53, 0x5b, 0x24, 0xf1, 0xf6, 0x6e, 0x82, 0xfd, 0x80, 0x5e, 0x25, 0x7d, 0xad, 0x86, 0x80, 0x59, - 0x13, 0x7b, 0x8f, 0x47, 0x23, 0xe0, 0x17, 0xa5, 0x76, 0x83, 0x86, 0xd4, 0x24, 0x9d, 0xca, 0x35, - 0x46, 0xb0, 0x83, 0x6f, 0x80, 0xeb, 0x82, 0x1c, 0xcc, 0x00, 0x26, 0x06, 0xef, 0x96, 0xbe, 0x5e, - 0x52, 0xd1, 0x4b, 0xf2, 0x50, 0xa2, 0xac, 0x35, 0x42, 0x5b, 0x10, 0xbd, 0x36, 0x77, 0xdc, 0x06, - 0x6f, 0xfc, 0x0c, 0xf6, 0x77, 0x14, 0xd9, 0xd0, 0xdd, 0x82, 0xe0, 0xa3, 0xda, 0xc5, 0x68, 0xd2, - 0x08, 0xcd, 0x2c, 0x41, 0xf9, 0xd0, 0x4f, 0xe7, 0x64, 0x22, 0x81, 0xcb, 0xb1, 0x98, 0x7d, 0xaf, - 0xf4, 0xd5, 0x7c, 0x10, 0x54, 0x70, 0xc5, 0xb1, 0xf7, 0xb7, 0x9c, 0x2e, 0xfa, 0x5f, 0x52, 0x17, - 0x2d, 0xc4, 0xcc, 0x2e, 0x94, 0xf8, 0xd9, 0x05, 0x59, 0x91, 0xee, 0x46, 0x5b, 0x61, 0xdd, 0x11, - 0x86, 0x6f, 0xed, 0x36, 0x58, 0x30, 0x3a, 0x9d, 0x4d, 0x63, 0x17, 0x57, 0xfc, 0x69, 0xbb, 0xe5, - 0xb1, 0x80, 0x63, 0x7d, 0xa9, 0x89, 0x53, 0x19, 0xb1, 0x8f, 0x9c, 0x3a, 0x64, 0x95, 0xca, 0x2f, - 0xc3, 0x0a, 0x20, 0x32, 0xf9, 0x4d, 0x64, 0xf8, 0xf3, 0x87, 0x8c, 0xf6, 0x9e, 0x11, 0x85, 0x47, - 0x64, 0x6f, 0x92, 0xbe, 0x58, 0x12, 0x7c, 0x67, 0xaf, 0x79, 0xbf, 0xa0, 0xc0, 0x94, 0x8f, 0x47, - 0xb9, 0xd3, 0x41, 0x4f, 0x12, 0xa2, 0x88, 0xc6, 0x7a, 0xc3, 0x7d, 0xa7, 0xb4, 0x1b, 0x62, 0x50, - 0x43, 0x4a, 0x3f, 0x06, 0x93, 0x48, 0x88, 0x8a, 0x20, 0x44, 0x39, 0x6f, 0xc3, 0xc4, 0x22, 0xb2, - 0x17, 0xdf, 0xa7, 0x14, 0x98, 0x0f, 0xe6, 0x19, 0x2b, 0xd8, 0x6b, 0xef, 0xa1, 0x7b, 0x64, 0xd7, - 0xb9, 0x58, 0x4b, 0x0c, 0xb7, 0x84, 0xbb, 0xe8, 0x5f, 0x73, 0x29, 0x55, 0x5e, 0x28, 0x39, 0x66, - 0x91, 0x30, 0x95, 0x2e, 0x26, 0x11, 0xcc, 0x5e, 0x98, 0x5f, 0x50, 0x00, 0x5a, 0x76, 0x38, 0x59, - 0x3e, 0x82, 0x24, 0xbf, 0x5f, 0x7a, 0xb7, 0x98, 0x55, 0x3c, 0x2a, 0x36, 0x7d, 0xcf, 0x21, 0xe9, - 0x4c, 0x35, 0xac, 0xa4, 0x89, 0xb4, 0xf5, 0x99, 0xe5, 0x83, 0x5e, 0xd7, 0x6c, 0x1b, 0x5e, 0xbf, - 0x07, 0x60, 0xbc, 0x78, 0xc9, 0xf5, 0xc6, 0xa9, 0x8c, 0xc6, 0xb0, 0x8c, 0x18, 0x59, 0xd2, 0x08, - 0x3e, 0x4a, 0x10, 0xc1, 0x47, 0xd2, 0xab, 0x67, 0x08, 0xf1, 0x09, 0xa8, 0xa7, 0x0a, 0x27, 0x1b, - 0x3d, 0x6c, 0x2d, 0x39, 0xd8, 0xe8, 0xb4, 0x9d, 0x83, 0xfd, 0x8b, 0x2e, 0xef, 0xbe, 0x9a, 0xac, - 0xa3, 0xdc, 0xca, 0xb5, 0x22, 0xac, 0x5c, 0xa3, 0xef, 0x50, 0x65, 0xa3, 0xa7, 0x71, 0xfb, 0x2b, - 0x1c, 0x0f, 0x23, 0x0c, 0x75, 0xa9, 0x9c, 0xae, 0xfa, 0x16, 0xa9, 0xf3, 0x69, 0x16, 0xa9, 0xdf, - 0x2e, 0x15, 0x8b, 0x4d, 0xaa, 0x5e, 0x13, 0xf1, 0x9d, 0x5b, 0x68, 0x62, 0x2f, 0x06, 0xde, 0x5b, - 0x61, 0xfe, 0x62, 0xf4, 0x25, 0x84, 0x58, 0x4c, 0x1c, 0xe0, 0xd1, 0xfa, 0x8e, 0xb4, 0x2b, 0x34, - 0x22, 0x0b, 0x31, 0xe8, 0x86, 0x08, 0x2a, 0x32, 0x6e, 0x73, 0xa9, 0x96, 0x5b, 0x12, 0xcb, 0xcf, - 0x1e, 0x85, 0x8f, 0x29, 0x30, 0x4b, 0x2e, 0x6d, 0x5e, 0xba, 0x4a, 0x0e, 0x72, 0x4a, 0x1a, 0x25, - 0xaf, 0xe4, 0xc5, 0xac, 0x41, 0xbe, 0x6b, 0x5a, 0x97, 0x02, 0x7f, 0x47, 0xff, 0x39, 0xba, 0x02, - 0x54, 0x19, 0x70, 0x05, 0x68, 0xb8, 0x4d, 0x12, 0x96, 0x7b, 0xa4, 0x3b, 0xe9, 0x87, 0x92, 0xcb, - 0x5e, 0x8c, 0x7f, 0x99, 0x87, 0x62, 0x13, 0x1b, 0x4e, 0x7b, 0x0f, 0xbd, 0x5f, 0x19, 0x38, 0x95, - 0x98, 0x16, 0xa7, 0x12, 0x2b, 0x30, 0xb5, 0x63, 0x76, 0x3d, 0xec, 0x50, 0x1f, 0x70, 0xbe, 0x6b, - 0xa7, 0x4d, 0x7c, 0xa9, 0x6b, 0xb7, 0x2f, 0x2d, 0x32, 0xd3, 0x7e, 0x31, 0x88, 0xde, 0xbc, 0xb8, - 0x42, 0x7e, 0xd2, 0x83, 0x9f, 0x7d, 0x83, 0xd0, 0xb5, 0x1d, 0x2f, 0xee, 0x36, 0xa0, 0x18, 0x2a, - 0x4d, 0xdb, 0xf1, 0x74, 0xfa, 0xa3, 0x0f, 0xf3, 0xce, 0x41, 0xb7, 0xdb, 0xc2, 0x8f, 0x7a, 0xc1, - 0xb4, 0x2e, 0x78, 0xf7, 0x8d, 0x45, 0x7b, 0x67, 0xc7, 0xc5, 0x74, 0x51, 0xa1, 0xa0, 0xb3, 0x37, - 0xed, 0x34, 0x14, 0xba, 0xe6, 0xbe, 0x49, 0x27, 0x22, 0x05, 0x9d, 0xbe, 0x68, 0x77, 0x40, 0x29, - 0x9a, 0x03, 0x51, 0x46, 0xcf, 0x16, 0x49, 0xd3, 0x3c, 0x94, 0xee, 0xeb, 0xcc, 0x25, 0x7c, 0xd5, - 0x3d, 0x3b, 0x45, 0xbe, 0x93, 0x67, 0xf1, 0xc0, 0x8d, 0xcc, 0x86, 0x09, 0x95, 0x78, 0xfc, 0x0c, - 0xd7, 0xc1, 0x6d, 0xdb, 0xe9, 0x04, 0xb2, 0x89, 0x9f, 0x60, 0xb0, 0x7c, 0xe9, 0xb6, 0x39, 0x06, - 0x16, 0x9e, 0xbd, 0xa6, 0xbd, 0xa7, 0xe8, 0x77, 0x9b, 0x7e, 0xd1, 0x17, 0x4c, 0x6f, 0x6f, 0x03, - 0x7b, 0x06, 0xfa, 0x4b, 0x75, 0xa0, 0xc6, 0xcd, 0xfe, 0xff, 0x1a, 0x37, 0x44, 0xe3, 0x68, 0xcc, - 0x2f, 0xef, 0xc0, 0xb1, 0x7c, 0x39, 0x32, 0x3f, 0x5a, 0x2e, 0x45, 0xbb, 0x0f, 0xae, 0x8f, 0xde, - 0x82, 0xa5, 0xd4, 0x65, 0xce, 0xb5, 0x76, 0x5a, 0x8f, 0xcf, 0xa0, 0x6d, 0xc2, 0x13, 0xe9, 0xc7, - 0xb5, 0xd6, 0xc6, 0xfa, 0x9a, 0xb9, 0xbb, 0xd7, 0x35, 0x77, 0xf7, 0x3c, 0xb7, 0x66, 0xb9, 0x1e, - 0x36, 0x3a, 0x8d, 0x1d, 0x9d, 0xde, 0xe3, 0x05, 0x84, 0x8e, 0x4c, 0x56, 0xd1, 0x47, 0x5c, 0x6e, - 0x74, 0xe3, 0x35, 0x25, 0xa6, 0xa5, 0x3c, 0xcb, 0x6f, 0x29, 0xee, 0x41, 0x37, 0xc4, 0xf4, 0xc6, - 0x3e, 0x4c, 0x23, 0x55, 0x3f, 0xe8, 0x92, 0xe6, 0x42, 0x32, 0xa7, 0x1d, 0xe7, 0x12, 0x38, 0xc9, - 0xbe, 0xd9, 0xfc, 0xaf, 0x22, 0x14, 0x56, 0x1d, 0xa3, 0xb7, 0x87, 0x5e, 0xc2, 0xf5, 0xcf, 0xe3, - 0x6a, 0x13, 0xa1, 0x76, 0x2a, 0xc3, 0xb4, 0x53, 0x1d, 0xa2, 0x9d, 0x79, 0x4e, 0x3b, 0xe3, 0x17, - 0x9d, 0xcf, 0xc1, 0x5c, 0xdb, 0xee, 0x76, 0x71, 0xdb, 0x97, 0x47, 0xad, 0x43, 0x56, 0x7b, 0x66, - 0x74, 0x21, 0x8d, 0x44, 0xb8, 0xc7, 0x5e, 0x93, 0xae, 0xb1, 0x53, 0xa5, 0x8f, 0x12, 0xd0, 0x6b, - 0x15, 0xc8, 0x57, 0x3b, 0xbb, 0x58, 0x58, 0x87, 0xcf, 0x71, 0xeb, 0xf0, 0x67, 0xa0, 0xe8, 0x19, - 0xce, 0x2e, 0xf6, 0x82, 0x75, 0x02, 0xfa, 0x16, 0x06, 0xde, 0x57, 0xb9, 0xc0, 0xfb, 0xdf, 0x08, - 0x79, 0x5f, 0x66, 0xcc, 0x2d, 0xfe, 0x89, 0x83, 0xe0, 0x27, 0xb2, 0x5f, 0xf4, 0x4b, 0x5c, 0xf4, - 0x6b, 0xad, 0x93, 0x1f, 0xfa, 0xb1, 0x2e, 0x1c, 0xc2, 0x9a, 0x5c, 0x49, 0xdc, 0xb6, 0xad, 0xda, - 0xbe, 0xb1, 0x8b, 0x59, 0x35, 0xa3, 0x84, 0xe0, 0x6b, 0x75, 0xdf, 0x7e, 0xc4, 0x64, 0x8b, 0x5a, - 0x51, 0x82, 0x5f, 0x85, 0x3d, 0xb3, 0xd3, 0xc1, 0x16, 0x6b, 0xd9, 0xec, 0xed, 0xdc, 0x4d, 0x90, - 0xf7, 0x79, 0xf0, 0xf5, 0xc7, 0x37, 0x16, 0x4a, 0x27, 0xb4, 0x39, 0xbf, 0x59, 0xd1, 0xc6, 0x5b, - 0xca, 0x89, 0x6b, 0xae, 0x32, 0x5e, 0x43, 0xb4, 0x72, 0x83, 0x1b, 0xd7, 0x53, 0xa1, 0x60, 0xd9, - 0x1d, 0x3c, 0x74, 0x10, 0xa2, 0xb9, 0xb4, 0x67, 0x42, 0x01, 0x77, 0xfc, 0x5e, 0x41, 0x25, 0xd9, - 0x6f, 0x4a, 0x96, 0xa5, 0x4e, 0x33, 0xa7, 0x73, 0x4d, 0x1a, 0xc4, 0x6d, 0xf6, 0x0d, 0xf0, 0xbb, - 0xa7, 0xe0, 0x24, 0xed, 0x03, 0x9a, 0x07, 0x17, 0x7d, 0x52, 0x17, 0x31, 0x7a, 0xcb, 0xe0, 0x81, - 0xeb, 0xa4, 0xa8, 0xec, 0xa7, 0xa1, 0xe0, 0x1e, 0x5c, 0x0c, 0x8d, 0x50, 0xfa, 0xc2, 0x37, 0x5d, - 0x65, 0x2c, 0xc3, 0x99, 0x3a, 0xea, 0x70, 0x26, 0x0c, 0x4d, 0x6a, 0xd0, 0xf8, 0xa3, 0x81, 0x8c, - 0x1e, 0xe8, 0x08, 0x06, 0xb2, 0x41, 0xc3, 0xd0, 0x59, 0x98, 0x32, 0x76, 0x3c, 0xec, 0x44, 0x66, - 0x22, 0x7b, 0xf5, 0x87, 0xca, 0x8b, 0x78, 0xc7, 0x76, 0x7c, 0xb1, 0xd0, 0x7b, 0x17, 0xc2, 0x77, - 0xae, 0xe5, 0x82, 0xb0, 0x83, 0x76, 0x27, 0x9c, 0xb2, 0xec, 0x65, 0xdc, 0x63, 0x72, 0xa6, 0x28, - 0xce, 0x93, 0x16, 0x70, 0xf8, 0xc3, 0xa1, 0xae, 0x64, 0xe1, 0x70, 0x57, 0x82, 0x3e, 0x9d, 0x76, - 0xce, 0xdc, 0x07, 0xf4, 0xd8, 0x2c, 0x34, 0xed, 0x39, 0x30, 0xd7, 0x61, 0x1e, 0x62, 0x6d, 0x33, - 0x6c, 0x25, 0xb1, 0xff, 0x09, 0x99, 0x23, 0x45, 0xca, 0xf3, 0x8a, 0xb4, 0x0a, 0xd3, 0xe4, 0xe8, - 0xb5, 0xaf, 0x49, 0x85, 0x3e, 0x8f, 0x7c, 0x32, 0xad, 0x0b, 0x2b, 0xc5, 0x89, 0x6d, 0xb1, 0xc2, - 0x7e, 0xd1, 0xc3, 0x9f, 0xd3, 0xcd, 0xbe, 0x93, 0x25, 0x94, 0x7d, 0x73, 0xfc, 0x99, 0x22, 0x5c, - 0x5f, 0x71, 0x6c, 0xd7, 0x25, 0x47, 0x70, 0xfa, 0x1b, 0xe6, 0x5b, 0x15, 0xe1, 0x0a, 0x9e, 0xc7, - 0x75, 0xf3, 0x1b, 0xd4, 0xa0, 0x26, 0xd7, 0x34, 0xfe, 0x4c, 0x3a, 0x68, 0x4d, 0xb8, 0xff, 0x10, - 0x23, 0xf4, 0xff, 0x1c, 0x8d, 0xe4, 0x3d, 0x39, 0x99, 0x38, 0x3a, 0x29, 0x65, 0x35, 0x81, 0x3b, - 0x97, 0x14, 0xb8, 0xa1, 0x9f, 0x9b, 0x2d, 0xcb, 0x0d, 0x1b, 0xcc, 0xcd, 0x43, 0xda, 0x8b, 0x18, - 0x77, 0x25, 0xf1, 0xc6, 0xdd, 0x98, 0xba, 0x73, 0xa5, 0xc5, 0x2c, 0x96, 0x44, 0x07, 0x7a, 0x92, - 0x6e, 0xdc, 0x4d, 0x4d, 0x3e, 0x7b, 0xe1, 0xfe, 0x4e, 0x1e, 0x4e, 0xae, 0x3a, 0xf6, 0x41, 0xcf, - 0x8d, 0x7a, 0xa0, 0x3f, 0x1e, 0xbc, 0x21, 0x5b, 0x94, 0x31, 0x0d, 0x6e, 0x81, 0x59, 0x87, 0x59, - 0x73, 0xd1, 0xf6, 0x2c, 0x9f, 0xc4, 0xf7, 0x5e, 0xea, 0x51, 0x7a, 0xaf, 0xa8, 0x9f, 0xc9, 0x0b, - 0xfd, 0x4c, 0x7f, 0xcf, 0x51, 0x18, 0xd0, 0x73, 0xfc, 0x91, 0x92, 0x72, 0x50, 0xed, 0x13, 0x51, - 0x4c, 0x7f, 0x51, 0x81, 0xe2, 0x2e, 0xc9, 0xc8, 0xba, 0x8b, 0xa7, 0xc8, 0xd5, 0x8c, 0x10, 0xd7, - 0xd9, 0xaf, 0x91, 0x5c, 0x55, 0x5e, 0x87, 0x53, 0x0d, 0x70, 0xc9, 0xdc, 0x66, 0xaf, 0x54, 0x6f, - 0xca, 0xc3, 0x5c, 0x58, 0x7a, 0xad, 0xe3, 0x0a, 0xd1, 0x5d, 0x39, 0x8d, 0x9a, 0x97, 0xd1, 0xa8, - 0x43, 0xeb, 0xcc, 0xe1, 0xa8, 0xa3, 0x72, 0xa3, 0xce, 0xc0, 0xd1, 0x65, 0x2e, 0x66, 0x74, 0x41, - 0x2f, 0x56, 0x65, 0x2f, 0xb1, 0x13, 0xbb, 0x56, 0x52, 0x9b, 0xc7, 0xf3, 0x60, 0x21, 0x79, 0x95, - 0xde, 0xf0, 0x5a, 0x65, 0xaf, 0x24, 0x1f, 0x56, 0xe0, 0xd4, 0xe1, 0xce, 0xfc, 0xeb, 0x44, 0x2f, - 0x35, 0xbf, 0x4e, 0x6e, 0xe8, 0xa5, 0x46, 0xde, 0xc4, 0x4d, 0xba, 0xc4, 0x20, 0x28, 0x82, 0xbd, - 0x37, 0xbc, 0x13, 0x97, 0x0b, 0x73, 0x22, 0x49, 0x34, 0x7b, 0x01, 0xfe, 0x80, 0x0a, 0x33, 0x4d, - 0xec, 0xad, 0x1b, 0x57, 0xed, 0x03, 0x0f, 0x19, 0xb2, 0xdb, 0x73, 0xcf, 0x86, 0x62, 0x97, 0xfc, - 0x42, 0x3a, 0x18, 0x3e, 0xe8, 0x28, 0xbf, 0xbf, 0x45, 0x7c, 0x83, 0x28, 0x69, 0x9d, 0xe5, 0x17, - 0xa3, 0xcf, 0xc8, 0xec, 0x8e, 0x86, 0xdc, 0x8d, 0x65, 0x6b, 0x27, 0xd5, 0xde, 0x69, 0x5c, 0xd1, - 0xd9, 0xc3, 0xf2, 0x1d, 0x2a, 0xcc, 0x37, 0xb1, 0x57, 0x73, 0x57, 0x8c, 0xcb, 0xb6, 0x63, 0x7a, - 0x18, 0xad, 0xca, 0x42, 0x73, 0x13, 0x80, 0x19, 0xfe, 0xc6, 0x62, 0x62, 0x71, 0x29, 0xe8, 0xa7, - 0xd3, 0x3a, 0x0a, 0x09, 0x7c, 0x8c, 0x05, 0x84, 0x54, 0x3e, 0x16, 0x49, 0xc5, 0x4f, 0xe0, 0x1a, - 0x6e, 0x85, 0x01, 0x51, 0x76, 0xda, 0x7b, 0xe6, 0x65, 0xdc, 0x49, 0x09, 0x44, 0xf0, 0x5b, 0x04, - 0x44, 0x48, 0x28, 0xb5, 0xfb, 0x8a, 0xc0, 0xc7, 0x38, 0xdc, 0x57, 0x92, 0x08, 0x4e, 0x24, 0xac, - 0x95, 0xdf, 0xf5, 0xb0, 0xf5, 0xcc, 0x07, 0x64, 0xc5, 0x1a, 0x99, 0x6c, 0x0a, 0x6f, 0xb2, 0x8d, - 0xd4, 0xb1, 0xd0, 0xb2, 0x87, 0xe9, 0x74, 0x3e, 0x8b, 0x8e, 0x65, 0x60, 0xd1, 0xd9, 0x0b, 0xfd, - 0x7d, 0x2a, 0x5c, 0x1b, 0xc6, 0x7b, 0x69, 0x62, 0x6f, 0xd9, 0x70, 0xf7, 0x2e, 0xda, 0x86, 0xd3, - 0x41, 0x95, 0x31, 0x1c, 0x38, 0x44, 0x7f, 0xc0, 0x83, 0x50, 0x17, 0x41, 0x18, 0xe8, 0x4a, 0x3a, - 0x90, 0x97, 0x71, 0x74, 0x32, 0x89, 0xde, 0xae, 0x3f, 0x17, 0x82, 0xf5, 0x7c, 0x01, 0xac, 0xfb, - 0x47, 0x65, 0x31, 0x7b, 0xe0, 0x7e, 0x98, 0x8e, 0x08, 0x9c, 0xd7, 0xf3, 0xc3, 0xb2, 0x80, 0xc5, - 0x78, 0xbd, 0xaa, 0xb1, 0x5e, 0xaf, 0x23, 0x8d, 0x11, 0x43, 0x3d, 0x96, 0xb3, 0x1d, 0x23, 0x8e, - 0xd1, 0x1b, 0xf9, 0x31, 0x15, 0x4a, 0x24, 0xe0, 0x17, 0xe7, 0x11, 0xce, 0xc7, 0xcf, 0x4e, 0x46, - 0xe7, 0x90, 0xf7, 0xf9, 0x54, 0x5a, 0xef, 0x73, 0xf4, 0xae, 0xb4, 0x3e, 0xe6, 0xfd, 0xdc, 0x8e, - 0x05, 0xb1, 0x54, 0x2e, 0xe4, 0x43, 0x38, 0xc8, 0x1e, 0xb4, 0xef, 0x51, 0x01, 0xfc, 0x06, 0xcd, - 0xce, 0x46, 0xbc, 0x40, 0x16, 0xae, 0xbb, 0x78, 0xbf, 0x7b, 0x1f, 0xa8, 0x6b, 0xfb, 0x80, 0xa2, - 0x14, 0xa3, 0x53, 0x17, 0x6f, 0x49, 0xeb, 0x5b, 0x19, 0x71, 0x35, 0x16, 0x58, 0x52, 0x79, 0x5b, - 0xc6, 0x96, 0x9d, 0x3d, 0x20, 0xff, 0x5d, 0x81, 0x42, 0xcb, 0x6e, 0x62, 0xef, 0xe8, 0xa6, 0x40, - 0xea, 0xa8, 0x01, 0xa4, 0xdc, 0x71, 0x44, 0x0d, 0x18, 0x44, 0x28, 0x7b, 0xd1, 0xbd, 0x57, 0x81, - 0xb9, 0x96, 0x5d, 0x09, 0x17, 0xa7, 0xe4, 0x7d, 0x55, 0xe5, 0x2f, 0xe2, 0x0f, 0x2b, 0x18, 0x15, - 0x73, 0xa4, 0x8b, 0xf8, 0x87, 0xd3, 0xcb, 0x5e, 0x6e, 0xf7, 0xc0, 0xc9, 0x2d, 0xab, 0x63, 0xeb, - 0xb8, 0x63, 0xb3, 0x95, 0x6e, 0x4d, 0x83, 0xfc, 0x81, 0xd5, 0xb1, 0x09, 0xcb, 0x05, 0x9d, 0x3c, - 0xfb, 0x69, 0x0e, 0xee, 0xd8, 0xcc, 0x37, 0x80, 0x3c, 0xa3, 0x3f, 0x53, 0x21, 0xef, 0xff, 0x2b, - 0x2f, 0xea, 0xc7, 0xd4, 0x94, 0x71, 0x10, 0x7c, 0xf2, 0x63, 0xb1, 0x84, 0x1e, 0xe0, 0xd6, 0xfe, - 0xa9, 0x07, 0xeb, 0x13, 0xe3, 0xca, 0xe3, 0x44, 0x11, 0xad, 0xf9, 0x6b, 0x67, 0x61, 0xea, 0x62, - 0xd7, 0x6e, 0x5f, 0x8a, 0x8e, 0xeb, 0xb3, 0x57, 0xed, 0x0e, 0x28, 0x38, 0x86, 0xb5, 0x8b, 0xd9, - 0x9e, 0xc2, 0xe9, 0xbe, 0xbe, 0x90, 0x78, 0xbd, 0xe8, 0x34, 0x0b, 0x7a, 0x57, 0x9a, 0x08, 0x0c, - 0x03, 0x2a, 0x9f, 0x4e, 0x1f, 0x96, 0x47, 0x38, 0x79, 0x56, 0x82, 0xb9, 0x4a, 0xb9, 0x4e, 0xef, - 0x31, 0x6c, 0x9c, 0xaf, 0x96, 0x54, 0x02, 0xb3, 0x2f, 0x93, 0x0c, 0x61, 0xf6, 0xc9, 0xff, 0xa7, - 0x85, 0x79, 0x40, 0xe5, 0x8f, 0x03, 0xe6, 0x4f, 0x29, 0x30, 0xbf, 0x6e, 0xba, 0x5e, 0x9c, 0xb7, - 0x7f, 0x42, 0xbc, 0xdf, 0x57, 0xa5, 0x35, 0x95, 0x85, 0x72, 0xa4, 0x03, 0xfd, 0xa6, 0x32, 0x87, - 0x93, 0x8a, 0x98, 0xcc, 0xb1, 0x14, 0xc2, 0x01, 0xbd, 0x78, 0x5e, 0x5a, 0x92, 0xa9, 0x0d, 0xa5, - 0xa8, 0x90, 0xc9, 0x1b, 0x4a, 0xb1, 0x65, 0x67, 0x2f, 0xdf, 0x3f, 0x53, 0xe0, 0x94, 0x5f, 0x7c, - 0xd2, 0xb2, 0x54, 0xbc, 0x98, 0x87, 0x2e, 0x4b, 0xa5, 0x5e, 0x19, 0x3f, 0xc4, 0xcb, 0x38, 0x56, - 0xc6, 0x87, 0x11, 0x9d, 0xb0, 0x98, 0x63, 0x96, 0x61, 0x87, 0x89, 0x39, 0x61, 0x19, 0x76, 0x74, - 0x31, 0x27, 0x2f, 0xc5, 0x8e, 0x28, 0xe6, 0x63, 0x5b, 0x60, 0xfd, 0x09, 0x35, 0x14, 0x73, 0xec, - 0xda, 0x46, 0x82, 0x98, 0x53, 0x9f, 0xe8, 0x15, 0x6f, 0xe4, 0x4f, 0x21, 0xf8, 0x31, 0xaf, 0x6f, - 0x8c, 0x02, 0xd3, 0x31, 0xae, 0x71, 0xfc, 0x88, 0x0a, 0x0b, 0x8c, 0x8b, 0xc1, 0x53, 0xe6, 0x04, - 0x8c, 0x52, 0x4f, 0x99, 0x53, 0x9f, 0x01, 0x12, 0x39, 0x9b, 0xfc, 0x19, 0xa0, 0xc4, 0xf2, 0xb3, - 0x07, 0xe7, 0x2f, 0xf2, 0x70, 0xc6, 0x67, 0x61, 0xc3, 0xee, 0x98, 0x3b, 0x57, 0x29, 0x17, 0xe7, - 0x8d, 0xee, 0x01, 0x76, 0xd1, 0x07, 0x14, 0x59, 0x94, 0xfe, 0x37, 0x00, 0xbb, 0x87, 0x1d, 0x1a, - 0xc7, 0x8d, 0x01, 0x75, 0x5f, 0x5c, 0x65, 0x0f, 0x97, 0x14, 0x5e, 0x7f, 0xd3, 0x08, 0x88, 0xe8, - 0x1c, 0x3d, 0xdf, 0x2a, 0x9c, 0x09, 0xbf, 0xf4, 0x3b, 0x78, 0xe4, 0x0e, 0x3b, 0x78, 0xdc, 0x0e, - 0xaa, 0xd1, 0xe9, 0x84, 0x50, 0xf5, 0x6f, 0x66, 0x93, 0x32, 0x75, 0x3f, 0x8b, 0x9f, 0xd3, 0xc5, - 0xd1, 0xd1, 0xbc, 0x98, 0x9c, 0x2e, 0xf6, 0xb4, 0x45, 0x28, 0xd2, 0xeb, 0xc0, 0xc3, 0x15, 0xfd, - 0xc1, 0x99, 0x59, 0x2e, 0xd1, 0xb4, 0x6b, 0x88, 0x6a, 0x78, 0x4f, 0x2a, 0xc9, 0x0c, 0xea, 0xa7, - 0x23, 0x3b, 0x59, 0x17, 0x14, 0xec, 0xb9, 0x23, 0x53, 0x9e, 0xcc, 0x6e, 0x58, 0xb9, 0xd7, 0xeb, - 0x5e, 0x6d, 0xb1, 0xc0, 0x03, 0xa9, 0x76, 0xc3, 0xb8, 0xf8, 0x05, 0xca, 0xa1, 0xf8, 0x05, 0xa9, - 0x77, 0xc3, 0x04, 0x3e, 0xc6, 0xb1, 0x1b, 0x96, 0x44, 0x70, 0x22, 0xf7, 0xf0, 0x10, 0xab, 0x99, - 0xdd, 0x46, 0xf0, 0x0f, 0x83, 0x3d, 0xab, 0x41, 0x74, 0x76, 0x19, 0x74, 0x51, 0x41, 0xe2, 0x2d, - 0x2c, 0xda, 0x33, 0xa1, 0xb8, 0x63, 0x3b, 0xfb, 0x46, 0xb0, 0x71, 0xdf, 0x7f, 0x52, 0x84, 0xdd, - 0x00, 0xb0, 0x42, 0xf2, 0xe8, 0x2c, 0xaf, 0x3f, 0x1f, 0x79, 0x91, 0xd9, 0x63, 0x41, 0x1f, 0xfd, - 0x47, 0xed, 0x56, 0x98, 0x67, 0xb1, 0x1f, 0xeb, 0xd8, 0xf5, 0x70, 0x87, 0x45, 0xb4, 0x10, 0x13, - 0xb5, 0x73, 0x30, 0xc7, 0x12, 0x56, 0xcc, 0x2e, 0x76, 0x59, 0x50, 0x0b, 0x21, 0x4d, 0x3b, 0x03, - 0x45, 0xd3, 0x7d, 0xd0, 0xb5, 0x2d, 0x16, 0x90, 0x8f, 0xbd, 0x69, 0xb7, 0xc3, 0x49, 0x96, 0x2f, - 0x34, 0x56, 0xe9, 0x81, 0x9d, 0xfe, 0x64, 0x5f, 0xb5, 0x2c, 0x7b, 0xd3, 0xb1, 0x77, 0x1d, 0xec, - 0xba, 0xe4, 0xd4, 0xd4, 0xb4, 0xce, 0xa5, 0x68, 0x0f, 0xc3, 0xa9, 0xae, 0x69, 0x5d, 0x72, 0x49, - 0x8c, 0xe0, 0x15, 0xe6, 0x36, 0x36, 0x37, 0x20, 0x76, 0x37, 0xd7, 0xd8, 0x98, 0x1c, 0xf8, 0x5f, - 0xf4, 0xc3, 0x54, 0xb4, 0x3b, 0xa0, 0xc4, 0xb8, 0x59, 0x32, 0xda, 0x97, 0xc8, 0x77, 0xe6, 0x8e, - 0x7a, 0x28, 0x9d, 0x13, 0x06, 0x0d, 0xa3, 0xbf, 0x20, 0x08, 0x83, 0x46, 0xd2, 0x7f, 0x4d, 0x0e, - 0xe6, 0x84, 0x02, 0x0c, 0xd0, 0x82, 0x6e, 0xd1, 0xbd, 0xb0, 0x67, 0x7a, 0xd8, 0x67, 0x8e, 0x9d, - 0x75, 0x79, 0xfa, 0x10, 0xe6, 0xf5, 0x43, 0x3f, 0xea, 0x03, 0x88, 0xf9, 0x7c, 0xd1, 0x0e, 0x8f, - 0x78, 0x96, 0xb9, 0xcc, 0x56, 0x15, 0xd2, 0xd0, 0x8b, 0x40, 0x3b, 0x4c, 0x8d, 0xf3, 0x02, 0xc9, - 0xa5, 0xf3, 0x02, 0xf1, 0xe5, 0x66, 0x74, 0xbb, 0xf6, 0x15, 0xdc, 0x09, 0xc9, 0x32, 0x5d, 0x3d, - 0x94, 0x8e, 0x3e, 0x33, 0xca, 0xbc, 0x30, 0xf5, 0xc5, 0x1a, 0x7e, 0x23, 0x3b, 0x68, 0xb7, 0x31, - 0xee, 0xb0, 0x83, 0x6b, 0xc1, 0x6b, 0xca, 0x2b, 0x37, 0x52, 0xcf, 0x22, 0x8f, 0xe9, 0xce, 0x8d, - 0x5f, 0xba, 0x16, 0x8a, 0xf4, 0xfe, 0x3a, 0xf4, 0x9a, 0x85, 0x81, 0x7d, 0xcd, 0x82, 0xd8, 0xd7, - 0x6c, 0xc1, 0x9c, 0x65, 0xfb, 0xc5, 0x6d, 0x1a, 0x8e, 0xb1, 0xef, 0x26, 0x2d, 0x12, 0x53, 0xba, - 0xa1, 0x45, 0x50, 0xe7, 0x7e, 0x5b, 0x3b, 0xa1, 0x0b, 0x64, 0xb4, 0xff, 0x1d, 0x4e, 0x5e, 0x64, - 0x01, 0x1e, 0x5c, 0x46, 0x59, 0x89, 0x77, 0xa1, 0xec, 0xa3, 0xbc, 0x24, 0xfe, 0xb9, 0x76, 0x42, - 0xef, 0x27, 0xa6, 0xfd, 0x17, 0x58, 0xf0, 0x5f, 0x3b, 0xf6, 0x95, 0x80, 0x71, 0x35, 0xde, 0x8e, - 0xec, 0x23, 0xbf, 0x21, 0xfc, 0xb8, 0x76, 0x42, 0xef, 0x23, 0xa5, 0x35, 0x00, 0xf6, 0xbc, 0xfd, - 0x2e, 0x23, 0x9c, 0x8f, 0x57, 0xc9, 0x3e, 0xc2, 0x6b, 0xe1, 0x4f, 0x6b, 0x27, 0x74, 0x8e, 0x84, - 0xb6, 0x0e, 0x33, 0xde, 0xa3, 0x1e, 0xa3, 0x57, 0x88, 0xf7, 0x5d, 0xe8, 0xa3, 0xd7, 0x0a, 0xfe, - 0x59, 0x3b, 0xa1, 0x47, 0x04, 0xb4, 0x1a, 0x4c, 0xf7, 0x2e, 0x32, 0x62, 0xc5, 0xf8, 0xfe, 0xae, - 0x8f, 0xd8, 0xe6, 0xc5, 0x90, 0x56, 0xf8, 0xbb, 0xcf, 0x58, 0xdb, 0xbd, 0xcc, 0x68, 0x4d, 0x49, - 0x33, 0x56, 0x09, 0xfe, 0xf1, 0x19, 0x0b, 0x09, 0x68, 0x35, 0x98, 0x71, 0x2d, 0xa3, 0xe7, 0xee, - 0xd9, 0x9e, 0x7b, 0x76, 0xba, 0xcf, 0xcd, 0x35, 0x9e, 0x5a, 0x93, 0xfd, 0xa3, 0x47, 0x7f, 0x6b, - 0xcf, 0x84, 0x6b, 0x0f, 0x7a, 0x1d, 0xc3, 0xc3, 0xd5, 0x47, 0x4d, 0xd7, 0x33, 0xad, 0xdd, 0x20, - 0x42, 0x31, 0x1d, 0x2c, 0x06, 0x7f, 0xd4, 0x16, 0xd9, 0x81, 0x37, 0x20, 0x6d, 0x13, 0xf5, 0xef, - 0xb5, 0xd2, 0x62, 0xb9, 0x73, 0x6e, 0xcf, 0x81, 0xbc, 0xff, 0x89, 0x0c, 0x2e, 0x0b, 0x83, 0xd7, - 0x71, 0xfb, 0x75, 0x87, 0x34, 0x60, 0xff, 0xa7, 0xbe, 0xf1, 0x69, 0xee, 0xd0, 0xf8, 0x74, 0x0b, - 0xcc, 0x9a, 0xee, 0x86, 0xb9, 0x4b, 0x8d, 0x63, 0x36, 0x7e, 0xf0, 0x49, 0x74, 0x31, 0xa1, 0x8e, - 0xaf, 0xd0, 0x81, 0xe3, 0x64, 0xb0, 0x98, 0x10, 0xa4, 0xa0, 0xdb, 0x60, 0x8e, 0x6f, 0x64, 0xf4, - 0x12, 0x5c, 0x33, 0x32, 0xad, 0xd9, 0x1b, 0xba, 0x15, 0x16, 0x44, 0x9d, 0xe6, 0x2c, 0x08, 0x35, - 0xe8, 0x0a, 0xd1, 0x13, 0xe1, 0x64, 0x5f, 0xc3, 0x0a, 0x42, 0xc6, 0xe4, 0xa2, 0x90, 0x31, 0xb7, - 0x00, 0x44, 0x5a, 0x3c, 0x90, 0xcc, 0xcd, 0x30, 0x13, 0xea, 0xe5, 0xc0, 0x0c, 0x5f, 0xca, 0xc1, - 0x74, 0xa0, 0x6c, 0x83, 0x32, 0xf8, 0x23, 0x93, 0xc5, 0xed, 0x0f, 0x05, 0x23, 0x13, 0x9f, 0xe6, - 0x9b, 0x09, 0x91, 0x57, 0x76, 0xcb, 0xf4, 0xba, 0xc1, 0xc9, 0xc6, 0xfe, 0x64, 0x6d, 0x13, 0xc0, - 0x24, 0x18, 0xb5, 0xa2, 0xa3, 0x8e, 0x4f, 0x4b, 0xd1, 0x1e, 0xa8, 0x3e, 0x70, 0x34, 0xce, 0x7d, - 0x1d, 0x3b, 0x87, 0x38, 0x03, 0x05, 0x1a, 0xa6, 0xff, 0x84, 0xb6, 0x00, 0x50, 0x7d, 0xc1, 0x66, - 0x55, 0xaf, 0x55, 0xeb, 0x95, 0x6a, 0x29, 0x87, 0x7e, 0x54, 0x81, 0x99, 0xb0, 0x11, 0x0c, 0xac, - 0x64, 0x95, 0xa9, 0xd6, 0xd0, 0x7b, 0x46, 0x0f, 0x37, 0x2a, 0x5e, 0xc9, 0x9e, 0x0d, 0xd7, 0x1d, - 0xb8, 0x78, 0xc5, 0x74, 0x5c, 0x4f, 0xb7, 0xaf, 0xac, 0xd8, 0x4e, 0x34, 0xb0, 0xd2, 0x00, 0xb7, - 0x71, 0x9f, 0x7d, 0x83, 0xb1, 0x83, 0xc9, 0x99, 0x37, 0xec, 0xb0, 0x85, 0xff, 0x28, 0xc1, 0xa7, - 0xeb, 0x39, 0x86, 0xe5, 0xf6, 0x6c, 0x17, 0xeb, 0xf6, 0x15, 0xb7, 0x6c, 0x75, 0x2a, 0x76, 0xf7, - 0x60, 0xdf, 0x72, 0x99, 0xc9, 0x17, 0xf7, 0xd9, 0x97, 0x0e, 0xb9, 0x45, 0x78, 0x01, 0xa0, 0xd2, - 0x58, 0x5f, 0xaf, 0x56, 0x5a, 0xb5, 0x46, 0xbd, 0x74, 0xc2, 0x97, 0x56, 0xab, 0xbc, 0xb4, 0xee, - 0x4b, 0xe7, 0x9b, 0x61, 0x3a, 0x68, 0xd3, 0x2c, 0xca, 0x4d, 0x2e, 0x88, 0x72, 0xa3, 0x95, 0x61, - 0x3a, 0x68, 0xe5, 0x6c, 0x44, 0x78, 0x52, 0xff, 0xa9, 0xe6, 0x7d, 0xc3, 0xf1, 0x88, 0x81, 0x12, - 0x10, 0x59, 0x32, 0x5c, 0xac, 0x87, 0xbf, 0x9d, 0x7b, 0x2a, 0xe3, 0x40, 0x83, 0x85, 0xf2, 0xfa, - 0xfa, 0x76, 0x43, 0xdf, 0xae, 0x37, 0x5a, 0x6b, 0xb5, 0xfa, 0x2a, 0x1d, 0x21, 0x6b, 0xab, 0xf5, - 0x86, 0x5e, 0xa5, 0x03, 0x64, 0xb3, 0x94, 0xa3, 0xb7, 0x58, 0x2f, 0x4d, 0x43, 0xb1, 0x47, 0xa4, - 0x8b, 0x3e, 0xaf, 0xa6, 0x0c, 0x67, 0x10, 0xe2, 0x14, 0x73, 0xcf, 0xae, 0x70, 0xa4, 0x40, 0x19, - 0x70, 0xe4, 0xf7, 0x1c, 0xcc, 0x51, 0x53, 0xdd, 0x25, 0xbb, 0x33, 0x04, 0x39, 0x55, 0x17, 0xd2, - 0xd0, 0xc7, 0x94, 0x14, 0x31, 0x0e, 0x06, 0x72, 0x94, 0xce, 0xb8, 0xf8, 0xdd, 0xdc, 0x68, 0x97, - 0x5a, 0xd4, 0xea, 0xad, 0xaa, 0x5e, 0x2f, 0xaf, 0xb3, 0x2c, 0xaa, 0x76, 0x16, 0x4e, 0xd7, 0x1b, - 0x2c, 0xa4, 0x63, 0x73, 0xbb, 0xd5, 0xd8, 0xae, 0x6d, 0x6c, 0x36, 0xf4, 0x56, 0xa9, 0xa0, 0x9d, - 0x01, 0x8d, 0x3e, 0x6f, 0xd7, 0x9a, 0xdb, 0x95, 0x72, 0xbd, 0x52, 0x5d, 0xaf, 0x2e, 0x97, 0x8a, - 0xda, 0x93, 0xe1, 0x89, 0xf4, 0x92, 0xa4, 0xc6, 0xca, 0xb6, 0xde, 0xb8, 0xd0, 0xf4, 0x11, 0xd4, - 0xab, 0xeb, 0x65, 0x5f, 0x91, 0xb8, 0xdb, 0xac, 0xa7, 0xb4, 0x6b, 0xe0, 0x24, 0xb9, 0xea, 0x7e, - 0xbd, 0x51, 0x5e, 0x66, 0xe5, 0x4d, 0x6b, 0x37, 0xc2, 0xd9, 0x5a, 0xbd, 0xb9, 0xb5, 0xb2, 0x52, - 0xab, 0xd4, 0xaa, 0xf5, 0xd6, 0xf6, 0x66, 0x55, 0xdf, 0xa8, 0x35, 0x9b, 0xfe, 0xbf, 0xa5, 0x19, - 0x72, 0x57, 0x30, 0xed, 0x33, 0xd1, 0xfb, 0x55, 0x98, 0x3f, 0x6f, 0x74, 0x4d, 0x7f, 0xa0, 0x20, - 0x97, 0x88, 0xf7, 0x9d, 0x06, 0xf2, 0xc8, 0x65, 0xe3, 0xec, 0x3c, 0x01, 0x79, 0x41, 0xdf, 0xae, - 0xa6, 0x3c, 0x0d, 0xc4, 0x80, 0xa0, 0x25, 0x2e, 0x0a, 0xa5, 0xc5, 0xcc, 0x5d, 0xdf, 0xa8, 0xa4, - 0x38, 0x0d, 0x24, 0x4f, 0x3e, 0x1d, 0xf8, 0x3f, 0x36, 0x2e, 0xf0, 0x4b, 0x30, 0xb7, 0x55, 0x2f, - 0x6f, 0xb5, 0xd6, 0x1a, 0x7a, 0xed, 0x9b, 0x48, 0x2c, 0xfb, 0x79, 0x98, 0x59, 0x69, 0xe8, 0x4b, - 0xb5, 0xe5, 0xe5, 0x6a, 0xbd, 0x54, 0xd0, 0xae, 0x83, 0x6b, 0x9a, 0x55, 0xfd, 0x7c, 0xad, 0x52, - 0xdd, 0xde, 0xaa, 0x97, 0xcf, 0x97, 0x6b, 0xeb, 0xa4, 0x8f, 0x28, 0x26, 0x5c, 0x80, 0x3e, 0x85, - 0xbe, 0x35, 0x0f, 0x40, 0xab, 0x4e, 0xae, 0x72, 0xe2, 0xae, 0xc9, 0xfe, 0xfd, 0xb4, 0x93, 0x86, - 0x88, 0x4c, 0x4c, 0xfb, 0xad, 0xc1, 0xb4, 0xc3, 0x3e, 0xb0, 0xd5, 0xb1, 0x61, 0x74, 0xe8, 0x63, - 0x40, 0x4d, 0x0f, 0x7f, 0x47, 0x1f, 0x48, 0x33, 0x47, 0x88, 0x65, 0x2c, 0x1d, 0x92, 0x2b, 0xe3, - 0x01, 0x12, 0xbd, 0x32, 0x07, 0x0b, 0x62, 0xc5, 0xfc, 0x4a, 0x10, 0x63, 0x4a, 0xae, 0x12, 0xe2, - 0xcf, 0x9c, 0x91, 0x75, 0xee, 0x19, 0x6c, 0x38, 0x85, 0xa0, 0x65, 0xd2, 0x83, 0xfd, 0x81, 0xc5, - 0x52, 0xca, 0xf9, 0xcc, 0xfb, 0x46, 0x47, 0x49, 0xd1, 0xa6, 0x40, 0x6d, 0x3d, 0xea, 0x95, 0x54, - 0xf4, 0x25, 0x15, 0xe6, 0x85, 0x7b, 0xb8, 0xd1, 0x1b, 0x73, 0x32, 0x77, 0xe4, 0x72, 0x37, 0x7c, - 0xe7, 0x8e, 0x7a, 0xc3, 0xf7, 0xb9, 0xbb, 0x60, 0x8a, 0xa5, 0x11, 0xf9, 0x36, 0xea, 0xbe, 0x29, - 0x70, 0x12, 0x66, 0x57, 0xab, 0xad, 0xed, 0x66, 0xab, 0xac, 0xb7, 0xaa, 0xcb, 0xa5, 0x9c, 0x3f, - 0xf0, 0x55, 0x37, 0x36, 0x5b, 0x0f, 0x97, 0x94, 0xf4, 0x0e, 0x96, 0xfd, 0x8c, 0x4c, 0xd8, 0xc1, - 0x32, 0xa9, 0xf8, 0xec, 0xe7, 0xaa, 0x9f, 0x56, 0xa1, 0x44, 0x39, 0xa8, 0x3e, 0xda, 0xc3, 0x8e, - 0x89, 0xad, 0x36, 0x46, 0x97, 0x64, 0x02, 0xbe, 0x1e, 0x0a, 0x75, 0x48, 0xfa, 0x73, 0xce, 0x4a, - 0xa4, 0x2f, 0x7d, 0x06, 0x76, 0xfe, 0x90, 0x81, 0xfd, 0x9b, 0x69, 0x3d, 0x2c, 0xfb, 0xd9, 0x1d, - 0x0b, 0x64, 0x9f, 0x4c, 0xe3, 0x61, 0x39, 0x84, 0x83, 0x89, 0xc4, 0x71, 0x8e, 0x19, 0x7f, 0x4b, - 0x2a, 0x7a, 0x85, 0x0a, 0x27, 0x97, 0x0d, 0x0f, 0x2f, 0x5d, 0x6d, 0x05, 0xf7, 0x64, 0xc6, 0xdc, - 0x6d, 0x9d, 0x3b, 0x74, 0xb7, 0x75, 0x74, 0xd5, 0xa6, 0xd2, 0x77, 0xd5, 0x26, 0x7a, 0x4f, 0xda, - 0x33, 0x99, 0x7d, 0x3c, 0x8c, 0x2d, 0xd8, 0x72, 0xba, 0xb3, 0x96, 0xc9, 0x5c, 0x64, 0xdf, 0xc0, - 0xde, 0x39, 0x03, 0x25, 0xca, 0x0a, 0xe7, 0x44, 0xf8, 0x03, 0xec, 0x3a, 0xf8, 0xed, 0x14, 0x31, - 0x1b, 0x83, 0x28, 0x18, 0x8a, 0x18, 0x05, 0x43, 0x58, 0x93, 0x56, 0xfb, 0x1d, 0x3f, 0xd2, 0x76, - 0x86, 0x9c, 0xc7, 0x60, 0x7c, 0x98, 0xdc, 0xec, 0x3a, 0xc3, 0xc4, 0xe2, 0x27, 0x73, 0x65, 0x31, - 0xbb, 0x25, 0xb4, 0x2a, 0x8b, 0x4c, 0xf2, 0xcd, 0xec, 0x69, 0xdd, 0xc7, 0x05, 0x8f, 0xcd, 0x84, - 0xeb, 0xca, 0xb3, 0x73, 0x1f, 0x1f, 0xc6, 0x41, 0xf6, 0x28, 0xfc, 0xab, 0x02, 0xf9, 0xa6, 0xed, - 0x78, 0xe3, 0xc2, 0x20, 0xed, 0x96, 0x37, 0x27, 0x81, 0x66, 0xfc, 0x9c, 0x33, 0xbb, 0x2d, 0xef, - 0xe4, 0xf2, 0x27, 0x10, 0xf6, 0xf2, 0x24, 0x2c, 0x50, 0x4e, 0xc2, 0x3b, 0x63, 0xfe, 0x45, 0xa1, - 0xfd, 0xd5, 0x43, 0xb2, 0x88, 0x90, 0x8d, 0x8f, 0x70, 0xcb, 0x39, 0x00, 0x45, 0x48, 0x43, 0x6f, - 0xe5, 0x71, 0x59, 0x16, 0x71, 0x19, 0x34, 0xe3, 0x0e, 0xaf, 0x5d, 0x19, 0x57, 0xcf, 0x94, 0x26, - 0x82, 0x66, 0x42, 0xe1, 0xd9, 0x23, 0xf2, 0x52, 0x15, 0x8a, 0xcc, 0xe5, 0x6f, 0xac, 0x08, 0xa4, - 0x6d, 0x19, 0xa1, 0x10, 0xe4, 0x5c, 0x03, 0xd5, 0x71, 0xb7, 0x8c, 0xe4, 0xf2, 0xb3, 0xc7, 0xe1, - 0xdf, 0x98, 0x2f, 0x6b, 0xf9, 0xb2, 0x61, 0x76, 0x8d, 0x8b, 0xdd, 0x14, 0x91, 0xab, 0x3f, 0x96, - 0xf2, 0xf4, 0x5e, 0x58, 0x55, 0xa1, 0xbc, 0x18, 0x89, 0x7f, 0x03, 0xcc, 0x38, 0xc2, 0x5e, 0x9f, - 0x6f, 0x45, 0xf5, 0xf9, 0x11, 0xb3, 0xef, 0x7a, 0x94, 0x33, 0xd5, 0x51, 0x3d, 0x29, 0x7e, 0x26, - 0x72, 0xb4, 0x68, 0xb6, 0xdc, 0xe9, 0xac, 0x60, 0xc3, 0x3b, 0x70, 0x70, 0x27, 0xd5, 0x10, 0xe1, - 0xf4, 0x6d, 0x87, 0x72, 0x92, 0x10, 0x62, 0x47, 0xae, 0x8b, 0xe8, 0x3c, 0x6b, 0x48, 0x6f, 0x10, - 0xf0, 0x32, 0x96, 0x2e, 0xe9, 0x67, 0x43, 0x48, 0x1a, 0x02, 0x24, 0xcf, 0x19, 0x8d, 0x89, 0xec, - 0x01, 0xf9, 0x21, 0x15, 0x16, 0xa8, 0x9d, 0x30, 0x6e, 0x4c, 0x3e, 0x94, 0xd2, 0x45, 0x88, 0xbb, - 0x95, 0x8b, 0x67, 0x67, 0x2c, 0xb0, 0xa4, 0x71, 0x28, 0x92, 0xe3, 0x23, 0x7b, 0x64, 0x5e, 0x76, - 0x0a, 0x80, 0x73, 0xfb, 0xfc, 0x58, 0x31, 0x8a, 0xe3, 0x88, 0xde, 0xc5, 0xe6, 0x1f, 0x4d, 0x21, - 0xa8, 0x38, 0xe7, 0xd2, 0x19, 0x6e, 0x48, 0x89, 0x89, 0x52, 0xa3, 0xca, 0xef, 0xa6, 0xb4, 0x79, - 0x99, 0xd3, 0xe5, 0xd0, 0xc1, 0x7d, 0xc4, 0x5e, 0xee, 0xe3, 0x29, 0x8c, 0xdf, 0x61, 0xac, 0xa4, - 0x43, 0x6d, 0x7d, 0x84, 0x99, 0xfd, 0x59, 0x38, 0xad, 0x57, 0xcb, 0xcb, 0x8d, 0xfa, 0xfa, 0xc3, - 0xfc, 0x15, 0x4d, 0x25, 0x95, 0x9f, 0x9c, 0x64, 0x02, 0xdb, 0x9b, 0x53, 0xf6, 0x81, 0xa2, 0xac, - 0x92, 0x66, 0x2b, 0xdc, 0xe2, 0xca, 0xf0, 0x5e, 0x4d, 0x82, 0xec, 0x71, 0xa2, 0xf0, 0x77, 0x45, - 0x98, 0xd5, 0x71, 0xdb, 0xde, 0xdf, 0xc7, 0x56, 0x07, 0x77, 0xd0, 0x9b, 0x55, 0x98, 0x0b, 0xf7, - 0xfb, 0x9a, 0xd8, 0x43, 0xff, 0x25, 0xc2, 0xe6, 0x1c, 0xcc, 0xf9, 0x95, 0x6b, 0x88, 0x81, 0xe2, - 0x85, 0x34, 0xed, 0x4e, 0x38, 0x15, 0xa0, 0xd0, 0xe8, 0x9b, 0xc2, 0x1c, 0xfe, 0x80, 0xde, 0xcb, - 0x63, 0xb4, 0x25, 0x62, 0xf4, 0x40, 0xbc, 0x30, 0x43, 0x76, 0x17, 0x79, 0x56, 0x63, 0xc0, 0xfa, - 0xed, 0x10, 0xac, 0x17, 0x08, 0x60, 0x2d, 0x1f, 0x91, 0xfe, 0x71, 0xa2, 0xf6, 0xf3, 0x2a, 0x9c, - 0x0e, 0x3a, 0xe2, 0xc9, 0xa1, 0xf5, 0x71, 0x1e, 0xad, 0x6f, 0x16, 0xd1, 0x5a, 0x95, 0x91, 0xe6, - 0x20, 0x96, 0x63, 0x50, 0xfb, 0x5c, 0x88, 0xda, 0xb7, 0x08, 0xa8, 0xad, 0x8f, 0xa9, 0x9c, 0xe3, - 0x44, 0xef, 0x43, 0x2a, 0x9c, 0xf5, 0xcd, 0xce, 0x8a, 0x6d, 0xed, 0x74, 0xcd, 0xb6, 0x67, 0x5a, - 0xbb, 0x91, 0x0b, 0xdb, 0xaa, 0xcc, 0xca, 0x66, 0x3f, 0xb6, 0xca, 0x61, 0x6c, 0xc5, 0xf8, 0x1a, - 0xb2, 0x6d, 0x2b, 0x8e, 0xad, 0x98, 0x21, 0x8c, 0x73, 0xce, 0x8e, 0x34, 0x87, 0x4f, 0x4a, 0xdf, - 0xfa, 0x24, 0x39, 0x38, 0x4e, 0xfc, 0x5e, 0x0a, 0x9c, 0xe9, 0xf1, 0x9d, 0x2a, 0x94, 0x88, 0xbf, - 0x24, 0xe9, 0xd9, 0xd9, 0xfd, 0xa5, 0x0d, 0xd1, 0x93, 0xbe, 0x17, 0x08, 0x28, 0xf0, 0xa4, 0x0f, - 0x12, 0xb4, 0xdb, 0x60, 0xa1, 0xbd, 0x87, 0xdb, 0x97, 0x6a, 0x56, 0xe0, 0x8b, 0x44, 0x1d, 0x57, - 0xfa, 0x52, 0xc5, 0xc1, 0xec, 0x21, 0x11, 0x4c, 0x71, 0xe1, 0x51, 0x98, 0xd8, 0xf0, 0x4c, 0xc5, - 0x34, 0xb4, 0x5f, 0x0d, 0x01, 0xaa, 0x0b, 0x00, 0xdd, 0x3b, 0x12, 0xd5, 0x74, 0xb0, 0xd4, 0x47, - 0x80, 0x05, 0xc1, 0x99, 0xc6, 0x66, 0xab, 0xd6, 0xa8, 0x6f, 0x6f, 0x35, 0xab, 0xcb, 0xdb, 0x4b, - 0x01, 0x38, 0xcd, 0x92, 0x8a, 0xbe, 0xac, 0xc0, 0x14, 0x65, 0xcb, 0x45, 0x4f, 0x89, 0x20, 0x18, - 0x7a, 0x84, 0x00, 0xbd, 0x53, 0x3a, 0x20, 0x50, 0x28, 0x08, 0x56, 0x4e, 0x4c, 0xc3, 0x78, 0x36, - 0x4c, 0x51, 0x90, 0x83, 0x5d, 0x80, 0x9b, 0x62, 0x2c, 0x3b, 0x46, 0x46, 0x0f, 0xb2, 0x4b, 0x06, - 0x07, 0x1a, 0xc2, 0x46, 0xf6, 0xd6, 0xf8, 0x8b, 0xf3, 0x74, 0xe9, 0xe0, 0x82, 0xe9, 0xed, 0x91, - 0x13, 0x06, 0xe8, 0xf9, 0x32, 0x1d, 0xd7, 0x9d, 0x50, 0xb8, 0xec, 0xe7, 0x1e, 0x72, 0x5a, 0x83, - 0x66, 0x42, 0x3f, 0x26, 0x1d, 0x8b, 0x5a, 0xd0, 0xcf, 0x90, 0xa7, 0x18, 0x70, 0x36, 0x20, 0xdf, - 0x35, 0x5d, 0x8f, 0xd9, 0xdc, 0xf7, 0xa4, 0x22, 0x14, 0x3c, 0xd4, 0x3c, 0xbc, 0xaf, 0x13, 0x32, - 0xe8, 0x41, 0xdf, 0x62, 0x8a, 0x52, 0x25, 0x4e, 0xac, 0x9c, 0x85, 0x29, 0x76, 0x92, 0x9a, 0x6d, - 0x4b, 0x05, 0xaf, 0x92, 0x5b, 0x41, 0x52, 0xb5, 0xcd, 0x5e, 0x07, 0xfe, 0xdf, 0x93, 0x30, 0xb5, - 0x66, 0xba, 0x9e, 0xed, 0x5c, 0x45, 0x6f, 0xc9, 0xc1, 0xd4, 0x79, 0xec, 0xb8, 0xa6, 0x6d, 0x1d, - 0x72, 0xcf, 0xba, 0x05, 0x66, 0x7b, 0x0e, 0xbe, 0x6c, 0xda, 0x07, 0x2e, 0x37, 0x4a, 0x70, 0x49, - 0x1a, 0x82, 0x69, 0xe3, 0xc0, 0xdb, 0xb3, 0x9d, 0x28, 0x00, 0x53, 0xf0, 0xae, 0xdd, 0x04, 0x40, - 0x9f, 0xeb, 0xc6, 0x3e, 0x0e, 0xee, 0x58, 0x8f, 0x52, 0x34, 0x0d, 0xf2, 0x9e, 0xb9, 0x8f, 0x59, - 0x44, 0x76, 0xf2, 0xec, 0x0b, 0x98, 0x44, 0x37, 0x65, 0x51, 0x64, 0x55, 0x3d, 0x78, 0x45, 0x7f, - 0xa0, 0xc2, 0xec, 0x2a, 0xf6, 0x18, 0xab, 0x2e, 0x7a, 0x55, 0x4e, 0xea, 0x12, 0x24, 0x7f, 0x5e, - 0xd2, 0x35, 0xdc, 0xe0, 0xbf, 0x70, 0xc8, 0x15, 0x13, 0xa3, 0xf0, 0xf0, 0x2a, 0x7f, 0x37, 0x04, - 0x89, 0x15, 0xea, 0xd5, 0xa8, 0xf3, 0x3e, 0xcb, 0xcc, 0x36, 0x8e, 0x0f, 0x7f, 0x10, 0x6d, 0xe2, - 0xc4, 0x38, 0x1b, 0x4c, 0xf6, 0x8b, 0x5c, 0x7d, 0x62, 0xbb, 0xa3, 0xe9, 0xcb, 0x2c, 0xc7, 0xa1, - 0x6b, 0x3f, 0x78, 0x4a, 0x8c, 0x8c, 0x1e, 0xe6, 0x96, 0x8c, 0xd0, 0x31, 0x9c, 0x93, 0x09, 0x5c, - 0xf4, 0xaa, 0xc2, 0x6c, 0x73, 0xcf, 0xbe, 0x12, 0xc8, 0xf1, 0x9b, 0xe5, 0x80, 0xbd, 0x11, 0x66, - 0x2e, 0xf7, 0x81, 0x1a, 0x25, 0xf0, 0x77, 0xcb, 0xa9, 0xe2, 0xdd, 0x72, 0x2f, 0x57, 0xd3, 0xc2, - 0xc4, 0x31, 0x17, 0x03, 0x93, 0x78, 0x1d, 0x9c, 0x92, 0xe2, 0x3a, 0x38, 0xed, 0x59, 0x30, 0xc5, - 0xb8, 0x66, 0xcb, 0xd4, 0xc9, 0x00, 0x07, 0x99, 0xf9, 0x0a, 0xe6, 0xc5, 0x0a, 0xa6, 0x43, 0x3e, - 0xbe, 0x72, 0xd9, 0x23, 0xff, 0x1b, 0x0a, 0x89, 0xcf, 0x14, 0x00, 0x5f, 0x19, 0x03, 0xf0, 0xe8, - 0x6b, 0x39, 0xd9, 0xcd, 0x9c, 0x50, 0x02, 0x21, 0x07, 0x47, 0xba, 0xe0, 0x6c, 0x28, 0xb9, 0xec, - 0xe5, 0xf9, 0xa3, 0x79, 0x98, 0x5b, 0x36, 0x77, 0x76, 0xc2, 0x4e, 0xf2, 0xd5, 0x92, 0x9d, 0x64, - 0xbc, 0x0b, 0x95, 0x6f, 0xe7, 0x1e, 0x38, 0x0e, 0xb6, 0x82, 0x4a, 0xb1, 0xe6, 0xd4, 0x97, 0xaa, - 0xdd, 0x0e, 0x27, 0x83, 0x71, 0x81, 0xef, 0x28, 0x67, 0xf4, 0xfe, 0x64, 0xf4, 0x15, 0x69, 0x4f, - 0x80, 0x40, 0xa2, 0x7c, 0x95, 0x62, 0x1a, 0xe0, 0x7d, 0x30, 0xbf, 0x47, 0x73, 0x93, 0xe5, 0xd2, - 0xa0, 0xb3, 0x3c, 0xd3, 0x17, 0xff, 0x7e, 0x03, 0xbb, 0xae, 0xb1, 0x8b, 0x75, 0x31, 0x73, 0x5f, - 0xf3, 0x55, 0xd3, 0xdc, 0xe6, 0x28, 0xe7, 0x54, 0x20, 0x51, 0x93, 0xec, 0xb5, 0xe3, 0x73, 0xe7, - 0x20, 0xbf, 0x62, 0x76, 0x31, 0xfa, 0x2e, 0x05, 0x66, 0xfc, 0x59, 0xb7, 0xd5, 0xf6, 0xdf, 0x38, - 0x87, 0xca, 0xbf, 0xcb, 0xc9, 0xde, 0x62, 0xec, 0xd3, 0x59, 0x0c, 0x69, 0xc4, 0xb4, 0x1b, 0xb9, - 0xdb, 0x8a, 0x13, 0x49, 0x4d, 0xe0, 0xce, 0x29, 0x7f, 0xea, 0xb1, 0xb3, 0xd3, 0xb5, 0x0d, 0x61, - 0xc3, 0xa0, 0xdf, 0x14, 0x8a, 0x0e, 0x01, 0xd6, 0x6d, 0x6f, 0xd3, 0xb4, 0xac, 0x30, 0xae, 0xc6, - 0xa1, 0x74, 0xd1, 0xd7, 0x25, 0x31, 0x34, 0x19, 0xa9, 0x3b, 0x2b, 0x3d, 0x46, 0xb3, 0x6f, 0x83, - 0x85, 0x8b, 0x57, 0x3d, 0xec, 0xb2, 0x5c, 0xac, 0xd8, 0xbc, 0xde, 0x97, 0xca, 0x5d, 0x2c, 0x90, - 0x14, 0xc2, 0x2c, 0xa1, 0xc0, 0x74, 0xa2, 0x5e, 0x1b, 0x61, 0x06, 0x78, 0x1a, 0x4a, 0xf5, 0xc6, - 0x72, 0x95, 0xf8, 0xf7, 0x06, 0x1e, 0x93, 0xbb, 0xe8, 0xfb, 0x55, 0x98, 0x23, 0x0e, 0x78, 0x01, - 0x0a, 0x4f, 0x94, 0x98, 0x8f, 0xa0, 0x2f, 0x48, 0xfb, 0xfe, 0x92, 0x2a, 0xf3, 0x05, 0xc4, 0x0b, - 0x7a, 0xc7, 0xec, 0xf6, 0x0b, 0xba, 0xa0, 0xf7, 0xa5, 0x0e, 0x00, 0x44, 0x1d, 0x08, 0xc8, 0xcf, - 0x4b, 0x39, 0x00, 0x0f, 0xe3, 0xee, 0xb8, 0x50, 0xf9, 0x05, 0x15, 0x66, 0xfd, 0x49, 0x4a, 0x00, - 0x4a, 0x43, 0x00, 0xc5, 0xb6, 0xba, 0x57, 0xa3, 0x65, 0x91, 0xe0, 0x35, 0x55, 0x23, 0xf9, 0x43, - 0xe9, 0x99, 0x3b, 0x11, 0x11, 0xc7, 0xcb, 0x84, 0xf0, 0xfb, 0xa0, 0xd4, 0x7c, 0x7e, 0x08, 0x73, - 0xc7, 0x05, 0xdf, 0x9b, 0x8a, 0x50, 0xdc, 0xea, 0x11, 0xe4, 0x3e, 0xaf, 0xca, 0x5c, 0xd2, 0x71, - 0xe8, 0xf0, 0x97, 0x6f, 0x66, 0x75, 0xed, 0xb6, 0xd1, 0xdd, 0x8c, 0x4e, 0xd1, 0x46, 0x09, 0xda, - 0xbd, 0xcc, 0x1f, 0x9c, 0x9e, 0x30, 0xbf, 0x2d, 0xf1, 0xfe, 0x0a, 0x22, 0x23, 0xee, 0xa0, 0xdd, - 0x9d, 0x70, 0xaa, 0x63, 0xba, 0xc6, 0xc5, 0x2e, 0xae, 0x5a, 0x6d, 0xe7, 0x2a, 0x15, 0x07, 0x9b, - 0x56, 0x1d, 0xfa, 0xa0, 0xdd, 0x0f, 0x05, 0xd7, 0xbb, 0xda, 0xa5, 0xf3, 0x44, 0xfe, 0x5c, 0x5e, - 0x6c, 0x51, 0x4d, 0x3f, 0xbb, 0x4e, 0xff, 0xe2, 0xdd, 0x3a, 0xa7, 0xe4, 0xdc, 0x3a, 0xb5, 0x67, - 0x40, 0xd1, 0x76, 0xcc, 0x5d, 0x93, 0x5e, 0x49, 0xb7, 0x70, 0x28, 0x4c, 0x2b, 0x35, 0x05, 0x1a, - 0x24, 0x8b, 0xce, 0xb2, 0x6a, 0xcf, 0x82, 0x19, 0x73, 0xdf, 0xd8, 0xc5, 0x0f, 0x99, 0x16, 0x3d, - 0xc4, 0xbe, 0x70, 0xf7, 0xd9, 0x43, 0x47, 0x0e, 0xd9, 0x77, 0x3d, 0xca, 0xaa, 0xdd, 0x07, 0xd7, - 0xb7, 0x1d, 0x6c, 0x78, 0xd8, 0x17, 0xd0, 0x05, 0xb3, 0xb3, 0x8b, 0xbd, 0xda, 0xce, 0x86, 0xe9, - 0xba, 0xa6, 0xb5, 0xcb, 0x6e, 0x9d, 0x8c, 0xcf, 0x80, 0x3e, 0xa8, 0xc8, 0x46, 0xa2, 0x23, 0x92, - 0xa1, 0x2a, 0x31, 0xc2, 0xed, 0xd8, 0x9c, 0x14, 0x55, 0x49, 0xe7, 0xd8, 0x37, 0x48, 0xc5, 0x88, - 0x8b, 0x67, 0x2b, 0xfb, 0xa1, 0xff, 0xf7, 0x14, 0x98, 0x5e, 0xb6, 0xaf, 0x58, 0xa4, 0x99, 0xdc, - 0x23, 0x67, 0x29, 0x0f, 0x38, 0x56, 0x2e, 0xde, 0xb3, 0x9c, 0x78, 0x86, 0x8c, 0xd4, 0x36, 0x28, - 0x32, 0x06, 0x86, 0xc4, 0x76, 0x27, 0x79, 0xfb, 0x6d, 0x52, 0x39, 0xd9, 0xcb, 0xf5, 0xb7, 0x54, - 0xc8, 0x2f, 0x3b, 0x76, 0x0f, 0xfd, 0x6c, 0x2e, 0x85, 0x93, 0x58, 0xc7, 0xb1, 0x7b, 0x2d, 0x72, - 0x7d, 0x65, 0xb4, 0x2f, 0xc2, 0xa7, 0x69, 0xf7, 0xc0, 0x74, 0xcf, 0x76, 0x4d, 0x2f, 0x98, 0x84, - 0x2c, 0xdc, 0xfd, 0x84, 0x81, 0x7d, 0xc1, 0x26, 0xcb, 0xa4, 0x87, 0xd9, 0xfd, 0x3e, 0x9f, 0x88, - 0xd0, 0x97, 0x8b, 0x2f, 0xc6, 0xe0, 0x0a, 0xcf, 0xbe, 0x54, 0xf4, 0x1a, 0x1e, 0xc9, 0xe7, 0x88, - 0x48, 0x3e, 0x69, 0x80, 0x84, 0x1d, 0xbb, 0x37, 0x16, 0xb7, 0x8e, 0xd7, 0x85, 0xa8, 0x3e, 0x57, - 0x40, 0xf5, 0x0e, 0xa9, 0x32, 0xb3, 0x47, 0xf4, 0x83, 0x79, 0x00, 0x62, 0xa4, 0x6c, 0xf9, 0xd3, - 0x27, 0x39, 0x0b, 0xed, 0x3b, 0xf2, 0x9c, 0x2c, 0xcb, 0xa2, 0x2c, 0x9f, 0x12, 0x63, 0x03, 0x11, - 0xf2, 0x31, 0x12, 0x2d, 0x43, 0xe1, 0xc0, 0xff, 0xcc, 0x24, 0x2a, 0x49, 0x82, 0xbc, 0xea, 0xf4, - 0x4f, 0xf4, 0x1b, 0x39, 0x28, 0x90, 0x04, 0xed, 0x26, 0x00, 0x62, 0x16, 0xd0, 0x23, 0x98, 0x39, - 0x62, 0x00, 0x70, 0x29, 0x44, 0x5b, 0xcd, 0x0e, 0xfb, 0x4c, 0x0d, 0xee, 0x28, 0xc1, 0xff, 0x9b, - 0x18, 0x0b, 0x84, 0x16, 0x33, 0x1f, 0xb8, 0x14, 0xff, 0x6f, 0xf2, 0xb6, 0x8e, 0x77, 0xe8, 0xcd, - 0x02, 0x79, 0x3d, 0x4a, 0x08, 0xff, 0x5e, 0x0f, 0xef, 0xa3, 0x0c, 0xfe, 0x26, 0x29, 0xfe, 0x54, - 0x9a, 0xa8, 0xe5, 0x52, 0x54, 0x44, 0x91, 0x64, 0xea, 0x4f, 0x46, 0x6f, 0x0e, 0xd5, 0x66, 0x59, - 0x50, 0x9b, 0xa7, 0xa5, 0x10, 0x6f, 0xf6, 0xca, 0xf3, 0xa5, 0x02, 0xcc, 0xd4, 0xed, 0x0e, 0xd3, - 0x1d, 0x6e, 0xba, 0xf9, 0xc9, 0x42, 0xaa, 0xe9, 0x66, 0x48, 0x23, 0x46, 0x41, 0x9e, 0x27, 0x2a, - 0x88, 0x1c, 0x05, 0x5e, 0x3f, 0xb4, 0x25, 0x28, 0x12, 0xed, 0x3d, 0x7c, 0xd1, 0x61, 0x12, 0x09, - 0x22, 0x5a, 0x9d, 0xfd, 0xf9, 0x1f, 0x4e, 0xc7, 0xfe, 0x1b, 0x14, 0x48, 0x05, 0x13, 0xf6, 0x86, - 0xc4, 0x8a, 0x2a, 0xc9, 0x15, 0x55, 0x93, 0x2b, 0x9a, 0xef, 0xaf, 0x68, 0x9a, 0x55, 0x84, 0x38, - 0x0d, 0xc9, 0x5e, 0xc7, 0xff, 0x7a, 0x0a, 0xa0, 0x6e, 0x5c, 0x36, 0x77, 0xe9, 0xde, 0xf2, 0x1f, - 0x04, 0xb3, 0x27, 0xb6, 0x0b, 0xfc, 0x3d, 0xdc, 0x40, 0x78, 0x0f, 0x4c, 0xb1, 0x71, 0x8f, 0x55, - 0xe4, 0x66, 0xa1, 0x22, 0x11, 0x15, 0x6a, 0xd4, 0x3e, 0xea, 0xe9, 0x41, 0x7e, 0xe1, 0x4e, 0x76, - 0xa5, 0xef, 0x4e, 0xf6, 0xc1, 0x3b, 0x18, 0x31, 0x37, 0xb5, 0xa3, 0xf7, 0x49, 0x9f, 0xa1, 0xe2, - 0xf8, 0xe1, 0x6a, 0x14, 0xd3, 0x04, 0x9f, 0x01, 0x53, 0x76, 0xb8, 0x1d, 0xae, 0xc6, 0xae, 0xa2, - 0xd5, 0xac, 0x1d, 0x5b, 0x0f, 0x72, 0x4a, 0x6e, 0x9d, 0x49, 0xf1, 0x31, 0x91, 0x63, 0x8a, 0x67, - 0x56, 0x83, 0x28, 0x8d, 0x7e, 0x3d, 0x2e, 0x98, 0xde, 0xde, 0xba, 0x69, 0x5d, 0x72, 0xd1, 0xb7, - 0xc8, 0x59, 0x90, 0x1c, 0xfe, 0x4a, 0x3a, 0xfc, 0xc5, 0x28, 0x49, 0x4d, 0x11, 0xb5, 0xfb, 0xe3, - 0xa8, 0x0c, 0xe6, 0x36, 0x06, 0xc0, 0x7b, 0xa1, 0x48, 0x19, 0x65, 0x9d, 0xe8, 0xb9, 0x58, 0xfc, - 0x42, 0x4a, 0x3a, 0xfb, 0x03, 0xbd, 0x37, 0xc4, 0xf1, 0xbc, 0x80, 0xe3, 0xd2, 0x91, 0x38, 0xcb, - 0x1c, 0xd2, 0x73, 0x4f, 0x87, 0x29, 0x26, 0x69, 0x6d, 0x81, 0x6f, 0xc5, 0xa5, 0x13, 0x1a, 0x40, - 0x71, 0xc3, 0xbe, 0x8c, 0x5b, 0x76, 0x29, 0xe7, 0x3f, 0xfb, 0xfc, 0xb5, 0xec, 0x92, 0x82, 0x5e, - 0x3f, 0x0d, 0xd3, 0x61, 0x78, 0xbc, 0xdf, 0x53, 0xa0, 0x54, 0x21, 0x33, 0xb4, 0x15, 0xc7, 0xde, - 0xa7, 0x35, 0x92, 0xf7, 0xc7, 0xff, 0x21, 0x69, 0x07, 0x91, 0x30, 0x6c, 0x5d, 0x7f, 0x61, 0x31, - 0x58, 0xd2, 0x25, 0x4c, 0x25, 0x58, 0xc2, 0x44, 0xef, 0x90, 0x72, 0x18, 0x91, 0x2d, 0x25, 0xfb, - 0xa6, 0xf6, 0x9b, 0x0a, 0x14, 0x2a, 0x5d, 0xdb, 0xc2, 0xfc, 0xa1, 0xd1, 0xa1, 0xa7, 0x13, 0x07, - 0xef, 0x63, 0xa0, 0x17, 0x2b, 0xb2, 0xb6, 0x46, 0x24, 0x00, 0xbf, 0x6c, 0x49, 0xd9, 0xca, 0x0d, - 0x52, 0x89, 0xa4, 0xb3, 0x17, 0xe8, 0x97, 0x15, 0x98, 0xa1, 0x91, 0xc8, 0xca, 0xdd, 0x2e, 0x7a, - 0x42, 0x24, 0xd4, 0x01, 0x21, 0x06, 0xd1, 0xcf, 0x4b, 0x1f, 0x8a, 0x0a, 0x6b, 0x15, 0xd2, 0x4e, - 0x11, 0x92, 0x2d, 0xdd, 0x19, 0x1d, 0xb9, 0x9d, 0xb8, 0xa1, 0x0c, 0x65, 0x2f, 0xea, 0xdf, 0x57, - 0x7c, 0x03, 0xc0, 0xba, 0xb4, 0xe9, 0xe0, 0xcb, 0x26, 0xbe, 0x82, 0x6e, 0x88, 0x84, 0x7d, 0x38, - 0xcc, 0xd2, 0xdb, 0xa4, 0x17, 0x71, 0x38, 0x92, 0xb1, 0x1b, 0x61, 0xb3, 0xdd, 0x28, 0x13, 0xeb, - 0xc5, 0xfb, 0x63, 0x5f, 0x71, 0x64, 0x74, 0x3e, 0xbb, 0xe4, 0x9a, 0x4d, 0x3c, 0x17, 0xd9, 0x0b, - 0xf6, 0xa3, 0x53, 0x30, 0xbd, 0x65, 0xb9, 0xbd, 0xae, 0xe1, 0xee, 0xa1, 0x7f, 0x51, 0xa1, 0x48, - 0xaf, 0xd7, 0x44, 0xdf, 0x20, 0x44, 0x73, 0x79, 0xe1, 0x01, 0x76, 0x02, 0x07, 0x1e, 0xfa, 0x12, - 0xd9, 0x47, 0x0a, 0x67, 0x1f, 0xa1, 0x0f, 0xaa, 0xb2, 0x93, 0xd4, 0xa0, 0x50, 0x76, 0x9f, 0x67, - 0x7c, 0x00, 0x91, 0x9e, 0xd9, 0xf6, 0x0e, 0x1c, 0xec, 0x0e, 0x0c, 0x20, 0x12, 0x4b, 0x65, 0x93, - 0xfe, 0xa5, 0x87, 0xbf, 0x23, 0x03, 0xa6, 0x58, 0xe2, 0xa1, 0xcd, 0xa8, 0xc3, 0x11, 0x0f, 0xce, - 0x40, 0xd1, 0x70, 0x3c, 0xd3, 0xf5, 0xd8, 0xf6, 0x2c, 0x7b, 0xf3, 0xbb, 0x4b, 0xfa, 0xb4, 0xe5, - 0x74, 0x83, 0xb8, 0x4f, 0x61, 0x02, 0xfa, 0x05, 0xa9, 0xf9, 0x63, 0x72, 0xcd, 0xd3, 0x41, 0xfe, - 0xd0, 0x08, 0x2b, 0xdc, 0xd7, 0xc1, 0x35, 0x7a, 0xb9, 0x55, 0xdd, 0xa6, 0x61, 0x82, 0xc2, 0x88, - 0x40, 0x1d, 0xf4, 0x1e, 0x95, 0x5b, 0xbf, 0xbb, 0x2a, 0x8c, 0x11, 0x4c, 0x8a, 0xd1, 0x18, 0x11, - 0x26, 0x24, 0xec, 0x75, 0x0b, 0x4b, 0xb8, 0xaa, 0xf4, 0x12, 0x2e, 0xfa, 0x19, 0xe9, 0xbd, 0xa8, - 0x50, 0x94, 0x43, 0xd6, 0x00, 0x93, 0xae, 0xdf, 0xfb, 0xb0, 0xd4, 0xbe, 0xd2, 0xb0, 0x92, 0x8e, - 0x11, 0xb6, 0xb7, 0x4e, 0xc1, 0xd4, 0xaa, 0xd1, 0xed, 0x62, 0xe7, 0xaa, 0x3f, 0x24, 0x95, 0x02, - 0x0e, 0x37, 0x0c, 0xcb, 0xdc, 0xc1, 0xae, 0x97, 0xdc, 0x59, 0xbe, 0x4f, 0x3a, 0xb4, 0x3b, 0x2b, - 0x63, 0xb1, 0x9f, 0x7e, 0x8c, 0xcc, 0xef, 0x82, 0xbc, 0x69, 0xed, 0xd8, 0xac, 0xcb, 0xec, 0x5f, - 0xf3, 0x0f, 0x7e, 0x26, 0x53, 0x17, 0x92, 0x51, 0x32, 0xba, 0xbb, 0x24, 0x17, 0xd9, 0xf7, 0x9c, - 0x3f, 0x97, 0x87, 0xf9, 0x80, 0x89, 0x9a, 0xd5, 0xc1, 0x8f, 0xf2, 0x4b, 0x31, 0xdf, 0x9f, 0x97, - 0x3d, 0x80, 0xdb, 0x5f, 0x1f, 0x42, 0x2a, 0x46, 0xa4, 0x2d, 0x80, 0xb6, 0xe1, 0xe1, 0x5d, 0xdb, - 0x31, 0xc3, 0xfe, 0xf0, 0x99, 0x69, 0xa8, 0x55, 0xe8, 0xdf, 0x57, 0x75, 0x8e, 0x8e, 0x76, 0x3f, - 0xcc, 0xe2, 0x30, 0xe2, 0x49, 0xb0, 0x54, 0x93, 0x88, 0x17, 0x9f, 0x1f, 0xfd, 0xbe, 0xd4, 0x39, - 0x5f, 0x99, 0x6a, 0xa6, 0xc3, 0x6c, 0x7b, 0xb4, 0x36, 0xb4, 0x55, 0xdf, 0x28, 0xeb, 0xcd, 0xb5, - 0xf2, 0xfa, 0x7a, 0xad, 0xbe, 0x1a, 0x86, 0xda, 0xd2, 0x60, 0x61, 0xb9, 0x71, 0xa1, 0xce, 0xc5, - 0x42, 0xcb, 0xa3, 0x4d, 0x98, 0x0e, 0xe4, 0x35, 0xc8, 0x93, 0x93, 0x97, 0x19, 0xf3, 0xe4, 0xe4, - 0x92, 0x7c, 0xe3, 0xcc, 0x6c, 0x87, 0xee, 0x3d, 0xe4, 0x19, 0xfd, 0x9a, 0x01, 0x05, 0xb2, 0xa6, - 0x8e, 0x1e, 0x23, 0x9b, 0x88, 0xbd, 0xae, 0xd1, 0xc6, 0x68, 0x3f, 0x85, 0x35, 0x1e, 0xdc, 0x35, - 0xa4, 0x1c, 0xba, 0x6b, 0x88, 0x3c, 0x32, 0xab, 0xef, 0xf4, 0xa0, 0x75, 0x7c, 0x9d, 0x66, 0x11, - 0x8f, 0xc4, 0x26, 0xee, 0xae, 0xd0, 0xe5, 0x7f, 0xc6, 0x66, 0x8c, 0x4a, 0xc6, 0xf3, 0x94, 0xce, - 0x12, 0x95, 0xdb, 0x87, 0x49, 0xe2, 0x28, 0xfb, 0x16, 0xff, 0xf9, 0x3c, 0x14, 0x9a, 0xbd, 0xae, - 0xe9, 0xa1, 0x1f, 0x51, 0xc6, 0x82, 0x19, 0xbd, 0x1f, 0x4a, 0x1d, 0x7a, 0x3f, 0x54, 0xb4, 0x67, - 0x9b, 0x97, 0xd8, 0xb3, 0x6d, 0xe1, 0x47, 0x3d, 0x71, 0xcf, 0xf6, 0x1e, 0x16, 0x2e, 0x93, 0xee, - 0xf8, 0x3e, 0x69, 0x80, 0x48, 0x49, 0xb5, 0x06, 0xc4, 0x61, 0x3d, 0xf7, 0x74, 0x16, 0x0e, 0x12, - 0xa0, 0xb8, 0xd4, 0x68, 0xb5, 0x1a, 0x1b, 0xa5, 0x13, 0x24, 0x8e, 0x58, 0x63, 0x93, 0x06, 0xe7, - 0xaa, 0xd5, 0xeb, 0x55, 0xbd, 0xa4, 0x90, 0x00, 0x95, 0xb5, 0xd6, 0x7a, 0xb5, 0xa4, 0x8a, 0x97, - 0x85, 0x24, 0x9a, 0xdf, 0x62, 0xd9, 0x59, 0xaa, 0x97, 0x9c, 0x21, 0x1e, 0xcf, 0x4f, 0xf6, 0xca, - 0xf5, 0x83, 0x2a, 0x14, 0x36, 0xb0, 0xb3, 0x8b, 0xd1, 0x0b, 0x53, 0x6c, 0xf2, 0xed, 0x98, 0x8e, - 0x4b, 0xc3, 0x79, 0x46, 0x9b, 0x7c, 0x7c, 0x9a, 0x76, 0x2b, 0xcc, 0xbb, 0xb8, 0x6d, 0x5b, 0x9d, - 0x20, 0x13, 0xed, 0x8f, 0xc4, 0x44, 0xf4, 0xda, 0x94, 0x90, 0x11, 0x46, 0xc7, 0xb2, 0x53, 0x97, - 0x06, 0x98, 0x41, 0xa5, 0x66, 0x0f, 0xcc, 0x57, 0x54, 0xff, 0xa7, 0xde, 0x55, 0xf4, 0x5a, 0xe9, - 0xdd, 0xd7, 0x3b, 0xa1, 0x78, 0x31, 0x88, 0x0b, 0xaf, 0xc6, 0xf6, 0xc7, 0x2c, 0x8f, 0xb6, 0x04, - 0xa7, 0x5c, 0xdc, 0xc5, 0x6d, 0x0f, 0x77, 0xfc, 0xa6, 0xab, 0x0f, 0xed, 0x14, 0x0e, 0x67, 0x47, - 0xbf, 0xcd, 0x03, 0x78, 0x9f, 0x08, 0xe0, 0x6d, 0x03, 0x44, 0xe9, 0x57, 0x28, 0xde, 0x56, 0xf6, - 0xab, 0xd1, 0xec, 0xda, 0xe1, 0xa2, 0x78, 0xf0, 0xee, 0x7f, 0xdb, 0xf3, 0xf6, 0xbb, 0xe4, 0x1b, - 0x3b, 0x9e, 0x10, 0xbc, 0x6b, 0x8b, 0x30, 0x65, 0x58, 0x57, 0xc9, 0xa7, 0x7c, 0x42, 0xad, 0x83, - 0x4c, 0xe8, 0xf5, 0x21, 0xf2, 0x0f, 0x08, 0xc8, 0x3f, 0x45, 0x8e, 0xdd, 0xec, 0x81, 0xff, 0xf6, - 0x29, 0x28, 0x6c, 0x1a, 0xae, 0x87, 0xd1, 0xff, 0xa3, 0xca, 0x22, 0x7f, 0x1b, 0x2c, 0xec, 0xd8, - 0xed, 0x03, 0x17, 0x77, 0xc4, 0x46, 0xd9, 0x97, 0x3a, 0x0e, 0xcc, 0xb5, 0x3b, 0xa0, 0x14, 0x24, - 0x32, 0xb2, 0xc1, 0x36, 0xfc, 0xa1, 0x74, 0x72, 0xf5, 0x84, 0xbb, 0x69, 0x38, 0x5e, 0x63, 0x87, - 0xa4, 0x85, 0x57, 0x4f, 0xf0, 0x89, 0x02, 0xf4, 0xc5, 0x04, 0xe8, 0xa7, 0xe2, 0xa1, 0x9f, 0x96, - 0x80, 0x5e, 0x2b, 0xc3, 0xf4, 0x8e, 0xd9, 0xc5, 0xe4, 0x87, 0x19, 0xf2, 0xc3, 0xa0, 0x31, 0x89, - 0xc8, 0x3e, 0x1c, 0x93, 0x56, 0xcc, 0x2e, 0xd6, 0xc3, 0xdf, 0x82, 0x89, 0x0c, 0x44, 0x13, 0x99, - 0x75, 0xea, 0x8d, 0xeb, 0x1b, 0x5e, 0x96, 0xb1, 0x8f, 0x83, 0xc5, 0x37, 0x8b, 0x1d, 0x8d, 0xe9, - 0x18, 0x9e, 0x41, 0xc0, 0x98, 0xd3, 0xc9, 0xb3, 0xe8, 0x17, 0xa2, 0xf6, 0xfb, 0x85, 0xbc, 0x4c, - 0x4d, 0xd7, 0x23, 0x06, 0xcc, 0xc6, 0xb4, 0xa8, 0x8b, 0x01, 0x40, 0xd4, 0x52, 0x0c, 0xdf, 0x7d, - 0x60, 0xda, 0x86, 0x83, 0xbd, 0x4d, 0xde, 0x13, 0xa3, 0xa0, 0x8b, 0x89, 0xc4, 0x11, 0xd0, 0x6d, - 0x1a, 0xfb, 0xf4, 0x6a, 0x89, 0x8a, 0xff, 0x8d, 0x39, 0x78, 0x1d, 0x4a, 0x8f, 0xfa, 0xdf, 0xc2, - 0xb8, 0xfb, 0xdf, 0x41, 0x75, 0xcc, 0xbe, 0x19, 0xbe, 0x31, 0x0f, 0x6a, 0xe5, 0xc0, 0x7b, 0x5c, - 0x77, 0xbf, 0xff, 0x2a, 0xed, 0xe7, 0xc2, 0xfa, 0xb3, 0x03, 0xef, 0x78, 0x7b, 0xdf, 0x94, 0x5a, - 0x22, 0xe7, 0x4f, 0x13, 0x57, 0xb7, 0xec, 0x75, 0xe4, 0x67, 0xd5, 0xd0, 0x3d, 0xf3, 0xa5, 0xb9, - 0xa3, 0x9b, 0xe6, 0x88, 0xf6, 0x4f, 0x5c, 0xcf, 0x10, 0xbe, 0x07, 0x1d, 0x4f, 0x5e, 0x88, 0x8e, - 0x4a, 0xb6, 0xd7, 0x89, 0x28, 0xe7, 0x74, 0xfa, 0x82, 0x7e, 0x54, 0xda, 0x69, 0x9d, 0x8a, 0x2d, - 0xd1, 0x95, 0x30, 0x9d, 0x4d, 0x25, 0x77, 0xfb, 0x76, 0x42, 0xb1, 0xd9, 0x03, 0xf6, 0xb7, 0xbc, - 0xab, 0x60, 0xf9, 0xc8, 0x88, 0xa1, 0x37, 0x48, 0x6f, 0x47, 0xd1, 0x6a, 0x0f, 0x59, 0x2f, 0x4c, - 0x27, 0x6f, 0xb9, 0xcd, 0xaa, 0xc4, 0x82, 0x27, 0x70, 0x57, 0x96, 0x0a, 0x45, 0xba, 0x05, 0x89, - 0xde, 0x2e, 0xdd, 0x44, 0xfc, 0xde, 0x48, 0x74, 0x21, 0x0c, 0xdf, 0xd3, 0xac, 0x39, 0x08, 0xae, - 0x86, 0xf9, 0x54, 0xae, 0x86, 0xe2, 0x29, 0x50, 0x89, 0x76, 0x44, 0xeb, 0x98, 0xf1, 0x74, 0x32, - 0x4d, 0x0b, 0x1b, 0xc8, 0x50, 0xf6, 0x78, 0x7f, 0x67, 0x01, 0xe6, 0x68, 0xd1, 0xd4, 0xc7, 0x19, - 0xbd, 0x47, 0xf9, 0xf7, 0x83, 0xba, 0x56, 0x87, 0xb9, 0x2b, 0x84, 0x6d, 0x7a, 0x07, 0x16, 0x5b, - 0xb9, 0xb8, 0x23, 0x71, 0xdd, 0x83, 0xd6, 0x33, 0xb8, 0x35, 0x4b, 0xf8, 0xdf, 0x97, 0x31, 0x5d, - 0xf0, 0xa7, 0x0e, 0x5c, 0x45, 0x62, 0x64, 0xf1, 0x49, 0xda, 0x19, 0x28, 0x5e, 0x36, 0xf1, 0x95, - 0x5a, 0x87, 0x59, 0xb7, 0xec, 0x0d, 0xfd, 0xa2, 0xf4, 0xbe, 0x2d, 0x0f, 0x37, 0xe3, 0x25, 0x5b, - 0x2d, 0x94, 0xdb, 0xbd, 0x1d, 0xca, 0xd6, 0x04, 0x4e, 0x24, 0x8b, 0xb7, 0x5b, 0x57, 0x52, 0x28, - 0x62, 0x9c, 0xe1, 0x2c, 0x06, 0x02, 0x49, 0x3c, 0xef, 0x42, 0x05, 0x30, 0xe6, 0x8b, 0xaf, 0xe5, - 0xa2, 0x53, 0x0c, 0x29, 0x3a, 0x7b, 0xc9, 0xbf, 0x59, 0x85, 0x99, 0x26, 0xf6, 0x56, 0x4c, 0xdc, - 0xed, 0xb8, 0xc8, 0x39, 0xba, 0x69, 0x74, 0x17, 0x14, 0x77, 0x08, 0xb1, 0x61, 0xe7, 0x16, 0x58, - 0x36, 0xf4, 0x46, 0x45, 0x76, 0x47, 0x98, 0xad, 0xbe, 0x05, 0xdc, 0x8e, 0x05, 0x26, 0x39, 0x8f, - 0xde, 0xe4, 0x92, 0x27, 0x10, 0x4a, 0x5c, 0x85, 0x39, 0x76, 0x1d, 0x6e, 0xb9, 0x6b, 0xee, 0x5a, - 0xe8, 0x60, 0x0c, 0x2d, 0x44, 0x7b, 0x1a, 0x14, 0x0c, 0x9f, 0x1a, 0xdb, 0x7a, 0x45, 0x03, 0x3b, - 0x4f, 0x52, 0x9e, 0x4e, 0x33, 0xa6, 0x08, 0xdc, 0x1b, 0x29, 0x76, 0xc0, 0xf3, 0x04, 0x03, 0xf7, - 0x0e, 0x2d, 0x3c, 0x7b, 0xc4, 0xbe, 0xa8, 0xc2, 0x69, 0xc6, 0xc0, 0x79, 0xec, 0x78, 0x66, 0xdb, - 0xe8, 0x52, 0xe4, 0x5e, 0x99, 0x1b, 0x07, 0x74, 0x6b, 0x30, 0x7f, 0x99, 0x27, 0xcb, 0x20, 0x3c, - 0x37, 0x10, 0x42, 0x81, 0x01, 0x5d, 0xfc, 0x31, 0x45, 0x00, 0x54, 0x41, 0xaa, 0x02, 0xcd, 0x09, - 0x06, 0x40, 0x95, 0x66, 0x22, 0x7b, 0x88, 0x5f, 0xc3, 0x02, 0xfb, 0x44, 0xdd, 0xe7, 0x1f, 0x48, - 0x63, 0xbb, 0x05, 0xb3, 0x04, 0x4b, 0xfa, 0x23, 0x5b, 0x86, 0x48, 0x50, 0xe2, 0xb0, 0xdf, 0x61, - 0x57, 0x34, 0x86, 0xff, 0xea, 0x3c, 0x1d, 0x74, 0x01, 0x20, 0xfa, 0xc4, 0x77, 0xd2, 0xb9, 0xb8, - 0x4e, 0x5a, 0x91, 0xeb, 0xa4, 0xdf, 0x26, 0x1d, 0x6a, 0x65, 0x30, 0xdb, 0x47, 0x57, 0x0f, 0xb9, - 0x20, 0x1b, 0xc3, 0x4b, 0xcf, 0x5e, 0x2f, 0x5e, 0xcf, 0xf4, 0x62, 0xf9, 0xa0, 0xd7, 0x35, 0xdb, - 0xfe, 0x7c, 0xea, 0x63, 0x63, 0x99, 0x4f, 0xf1, 0xfd, 0x81, 0xda, 0xd7, 0x1f, 0x1c, 0xc1, 0x92, - 0xbe, 0x1d, 0x4e, 0xd2, 0x22, 0x2a, 0x21, 0x5b, 0x05, 0x1a, 0x48, 0xa2, 0x2f, 0x59, 0x8c, 0x6a, - 0x28, 0xa9, 0x04, 0xa1, 0x10, 0x46, 0x58, 0xfa, 0x4c, 0x67, 0xec, 0xa6, 0x55, 0x90, 0x38, 0xce, - 0x26, 0xe0, 0x16, 0x9a, 0xa7, 0xd6, 0xee, 0x16, 0xb9, 0x45, 0x13, 0x7d, 0x2e, 0x3f, 0x8e, 0x11, - 0xe1, 0x79, 0x90, 0x27, 0x2e, 0xee, 0x6a, 0xec, 0x92, 0x46, 0x54, 0x64, 0x74, 0xc5, 0x29, 0x7e, - 0xd4, 0x5b, 0x3b, 0xa1, 0x93, 0x3f, 0xb5, 0x3b, 0xe0, 0xe4, 0x45, 0xa3, 0x7d, 0x69, 0xd7, 0xb1, - 0x0f, 0xc8, 0x7d, 0x83, 0x36, 0xbb, 0xb8, 0x90, 0x5c, 0x00, 0x2b, 0x7e, 0xd0, 0xee, 0x0e, 0x4c, - 0x87, 0xc2, 0x30, 0xd3, 0x61, 0xed, 0x04, 0x33, 0x1e, 0xb4, 0xa7, 0x87, 0x9d, 0x4e, 0x31, 0xb1, - 0xd3, 0x59, 0x3b, 0x11, 0x74, 0x3b, 0xda, 0x32, 0x4c, 0x77, 0xcc, 0xcb, 0x64, 0xab, 0x9a, 0xcc, - 0xba, 0x86, 0x1d, 0x7c, 0x5e, 0x36, 0x2f, 0xd3, 0x8d, 0xed, 0xb5, 0x13, 0x7a, 0xf8, 0xa7, 0xb6, - 0x0a, 0x33, 0x64, 0x5b, 0x80, 0x90, 0x99, 0x4e, 0x75, 0xa8, 0x79, 0xed, 0x84, 0x1e, 0xfd, 0xeb, - 0x5b, 0x1f, 0x79, 0x72, 0xf6, 0xe3, 0x81, 0x60, 0xbb, 0x3d, 0x97, 0x6a, 0xbb, 0xdd, 0x97, 0x05, - 0xdd, 0x70, 0x3f, 0x03, 0x85, 0x36, 0x91, 0xb0, 0xc2, 0x24, 0x4c, 0x5f, 0xb5, 0xfb, 0x20, 0xbf, - 0x6f, 0x38, 0xc1, 0xe4, 0xf9, 0xb6, 0xe1, 0x74, 0x37, 0x0c, 0xe7, 0x92, 0x8f, 0xa0, 0xff, 0xd7, - 0xd2, 0x14, 0x14, 0x88, 0xe0, 0xc2, 0x07, 0xf4, 0xb3, 0x79, 0x6a, 0x86, 0x54, 0x6c, 0xcb, 0x1f, - 0xf6, 0x5b, 0x76, 0x70, 0x40, 0xe6, 0x17, 0x73, 0xe3, 0xb1, 0x20, 0xaf, 0xe1, 0xc2, 0x0d, 0x5b, - 0xe6, 0x0b, 0x0f, 0xf0, 0x43, 0xf8, 0x2a, 0x5b, 0x12, 0x1d, 0xf4, 0xa9, 0xef, 0xc6, 0xfa, 0x7c, - 0xff, 0x8d, 0xf5, 0xd1, 0xf2, 0x41, 0x61, 0xb8, 0xa3, 0xca, 0x6f, 0x8f, 0x60, 0xba, 0xf4, 0x0b, - 0x22, 0x7e, 0x06, 0xde, 0x35, 0x2d, 0xae, 0xce, 0xc1, 0x6b, 0xca, 0x4e, 0x29, 0xad, 0x51, 0x33, - 0x84, 0xbd, 0xec, 0xfb, 0xa6, 0x9f, 0xce, 0xd3, 0x88, 0xab, 0xf4, 0x14, 0x86, 0x78, 0xc3, 0x2f, - 0xfa, 0xf5, 0xb1, 0x28, 0xcd, 0x80, 0x01, 0x47, 0x1d, 0x38, 0xe0, 0x1c, 0x3a, 0xa4, 0x9c, 0x1f, - 0x72, 0x48, 0xb9, 0x90, 0x6e, 0xe5, 0xf0, 0x23, 0xbc, 0xfe, 0x6c, 0x8a, 0xfa, 0x73, 0x6f, 0x0c, - 0x40, 0x83, 0xe4, 0x32, 0x16, 0xfb, 0xe6, 0xb1, 0x50, 0x53, 0x9a, 0x82, 0xa6, 0x3c, 0x30, 0x3a, - 0x23, 0xd9, 0x6b, 0xcb, 0x87, 0xf2, 0x70, 0x4d, 0xc4, 0x4c, 0x1d, 0x5f, 0x61, 0x8a, 0xf2, 0x7b, - 0x63, 0x51, 0x94, 0xf4, 0x31, 0x10, 0xb2, 0xd6, 0x98, 0xdf, 0x90, 0x3e, 0x3b, 0xd4, 0x0f, 0x54, - 0x28, 0x9b, 0x18, 0x65, 0x39, 0x03, 0x45, 0xda, 0xc3, 0x30, 0x68, 0xd8, 0x5b, 0xca, 0xee, 0x46, - 0xee, 0xc4, 0x91, 0x2c, 0x6f, 0x13, 0xd0, 0x1f, 0xb6, 0xae, 0xd1, 0x3a, 0x70, 0xac, 0x9a, 0xe5, - 0xd9, 0xe8, 0xdb, 0xc6, 0xa2, 0x38, 0xa1, 0x37, 0x9c, 0x3a, 0x8a, 0x37, 0xdc, 0x48, 0xab, 0x1c, - 0x41, 0x0d, 0x8e, 0x65, 0x95, 0x23, 0xa6, 0xf0, 0xec, 0xf1, 0x7b, 0x97, 0x0a, 0x67, 0xd8, 0x64, - 0x6b, 0x49, 0xb4, 0x10, 0xd1, 0xc3, 0xe3, 0x00, 0xf2, 0x74, 0x60, 0x26, 0xb1, 0x7b, 0x25, 0xc9, - 0x8b, 0x78, 0x52, 0x2a, 0xf1, 0x46, 0x1d, 0x61, 0x3a, 0xd8, 0xc7, 0xe1, 0x58, 0x90, 0x92, 0xbb, - 0x48, 0x27, 0x05, 0x1b, 0xd9, 0x63, 0xf6, 0x6a, 0x15, 0x8a, 0xf4, 0x9c, 0x16, 0xda, 0xca, 0xc4, - 0x61, 0x42, 0x8c, 0x11, 0x2d, 0xb1, 0x23, 0x47, 0xb9, 0xc9, 0xec, 0x0c, 0x5b, 0x9a, 0xbd, 0xb8, - 0x81, 0xac, 0x4c, 0xc0, 0x85, 0x50, 0x81, 0xd9, 0x26, 0xf6, 0x2a, 0x86, 0xe3, 0x98, 0xc6, 0xee, - 0xb8, 0x3c, 0xbe, 0x65, 0xbd, 0x87, 0xd1, 0x57, 0x73, 0xb2, 0xe7, 0x69, 0xc2, 0x85, 0xf0, 0x80, - 0xd5, 0x98, 0x48, 0x84, 0x6f, 0x91, 0x3a, 0x33, 0x33, 0x8c, 0xda, 0x04, 0x3c, 0xb6, 0x15, 0x98, - 0x0a, 0xce, 0xe2, 0xdd, 0x25, 0x9c, 0xcf, 0xdc, 0xf3, 0xf6, 0x83, 0x63, 0x30, 0xe4, 0xf9, 0xf0, - 0x19, 0x30, 0xf4, 0xba, 0x94, 0x8e, 0xf2, 0xc9, 0x07, 0x09, 0xd3, 0xb5, 0xb1, 0x34, 0xee, 0xf0, - 0xc7, 0x75, 0x74, 0xf0, 0xe7, 0xa7, 0xd8, 0x72, 0xe4, 0xba, 0xe1, 0xe1, 0x47, 0xd1, 0x1f, 0xa8, - 0x30, 0xd5, 0xc4, 0x9e, 0x3f, 0xde, 0x0a, 0xd7, 0x49, 0x8f, 0xaa, 0xe1, 0x1a, 0xb7, 0xe2, 0x31, - 0xc3, 0xd6, 0x30, 0x1e, 0x84, 0x99, 0x9e, 0x63, 0xb7, 0xb1, 0xeb, 0xb2, 0xd5, 0x0b, 0xde, 0x51, - 0x6d, 0xd0, 0xe8, 0x4f, 0x58, 0x5b, 0xdc, 0x0c, 0xfe, 0xd1, 0xa3, 0xdf, 0xd3, 0x9a, 0x01, 0x94, - 0x12, 0xab, 0xe0, 0xa4, 0xcd, 0x80, 0xa4, 0xc2, 0xb3, 0x07, 0xfa, 0x77, 0x54, 0x98, 0x6b, 0x62, - 0x2f, 0x94, 0x62, 0x8a, 0x4d, 0x8e, 0x78, 0x78, 0x05, 0x28, 0xd5, 0xa3, 0x41, 0x29, 0x7f, 0x19, - 0xab, 0x28, 0xcd, 0x90, 0xd8, 0x04, 0x2f, 0x63, 0x95, 0xe3, 0x60, 0x02, 0xc7, 0xd7, 0x9e, 0x04, - 0x33, 0x84, 0x17, 0xd2, 0x60, 0xbf, 0x3b, 0x1f, 0x35, 0xde, 0xcf, 0x66, 0xd4, 0x78, 0xef, 0x87, - 0xc2, 0xbe, 0xe1, 0x5c, 0x72, 0x49, 0xc3, 0x9d, 0x95, 0x31, 0xdb, 0x37, 0xfc, 0xec, 0x3a, 0xfd, - 0x6b, 0xb0, 0x9f, 0x66, 0x21, 0x9d, 0x9f, 0xe6, 0x5b, 0x94, 0x54, 0x23, 0x21, 0x9d, 0x3b, 0x8c, - 0xb1, 0xc9, 0xa7, 0x18, 0x37, 0x13, 0xca, 0xce, 0x5e, 0x39, 0x5e, 0xa9, 0xc2, 0xb4, 0x3f, 0x6e, - 0x13, 0x7b, 0xfc, 0xc2, 0xd1, 0xd5, 0x61, 0xb0, 0xa1, 0x9f, 0xb2, 0x07, 0x0e, 0x24, 0x32, 0x3e, - 0xf3, 0x3e, 0x45, 0x0f, 0x9c, 0x54, 0x78, 0xf6, 0x78, 0xbc, 0x9b, 0xe2, 0x41, 0xda, 0x03, 0xfa, - 0x49, 0x15, 0xd4, 0x55, 0xec, 0x4d, 0xda, 0x8a, 0x7c, 0xa7, 0x74, 0x88, 0x23, 0x41, 0x60, 0x84, - 0xe7, 0xc5, 0x55, 0x3c, 0x9e, 0x06, 0x24, 0x17, 0xdb, 0x48, 0x8a, 0x81, 0xec, 0x51, 0x7b, 0x3f, - 0x45, 0x8d, 0x6e, 0x2e, 0x7c, 0xeb, 0x18, 0x7a, 0xd5, 0xc9, 0x2e, 0x7c, 0x04, 0x02, 0x24, 0x34, - 0x8e, 0xab, 0xbd, 0x0d, 0x2a, 0x7c, 0x22, 0x97, 0x9f, 0x82, 0xdf, 0xd8, 0xf7, 0x70, 0xfb, 0x12, - 0xee, 0xf0, 0x97, 0xc9, 0x8d, 0x0a, 0xdd, 0x59, 0x98, 0x6a, 0x53, 0x6a, 0x04, 0xbc, 0x69, 0x3d, - 0x78, 0x4d, 0x71, 0x93, 0xbf, 0xd8, 0x11, 0xd1, 0xdf, 0x27, 0x78, 0x93, 0xbf, 0x44, 0xf1, 0x13, - 0x30, 0x5b, 0xe8, 0x2c, 0xa3, 0xd6, 0xb6, 0x2d, 0xf4, 0x5f, 0x8f, 0x0e, 0xcb, 0x8d, 0x30, 0x63, - 0xb6, 0x6d, 0x8b, 0x84, 0xa1, 0x08, 0x0e, 0x01, 0x85, 0x09, 0xc1, 0xd7, 0xea, 0xbe, 0xfd, 0x88, - 0xc9, 0x76, 0xcd, 0xa3, 0x84, 0x51, 0x8d, 0x09, 0x9f, 0xf5, 0xe3, 0x32, 0x26, 0x06, 0x94, 0x9d, - 0x3d, 0x64, 0x1f, 0x8f, 0xbc, 0xdb, 0x68, 0x57, 0xf8, 0xb8, 0x58, 0x05, 0x1e, 0x65, 0x38, 0xe3, - 0x6b, 0x71, 0x2c, 0xc3, 0x59, 0x02, 0x03, 0x13, 0xb8, 0x0d, 0x25, 0xc2, 0x31, 0xf3, 0x35, 0xe0, - 0x23, 0xa0, 0x33, 0x3e, 0xf3, 0x70, 0x44, 0x74, 0x8e, 0xc7, 0x44, 0xfc, 0x30, 0x0b, 0x91, 0xc9, - 0x2c, 0x1e, 0xf4, 0xdf, 0xc6, 0x01, 0xce, 0xbd, 0xa3, 0xf8, 0x2b, 0x50, 0x6f, 0x05, 0xf4, 0x0e, - 0x45, 0x36, 0x04, 0xca, 0x21, 0x09, 0xfa, 0x54, 0xc6, 0x82, 0xe0, 0xdb, 0xa4, 0x62, 0x93, 0xc8, - 0x94, 0x9f, 0x3d, 0x80, 0xaf, 0x50, 0x61, 0x81, 0xf8, 0x08, 0x74, 0xb1, 0xe1, 0xd0, 0x8e, 0x72, - 0x2c, 0x8e, 0xf2, 0xef, 0x96, 0x0e, 0xf0, 0x23, 0xca, 0x21, 0xe2, 0x63, 0x2c, 0x50, 0xc8, 0x45, - 0xf7, 0x91, 0x64, 0x61, 0x22, 0xdb, 0x28, 0xa5, 0x90, 0x05, 0xa6, 0xe2, 0xe3, 0xc1, 0x23, 0xa5, - 0x47, 0xae, 0x28, 0x8c, 0xa0, 0xb1, 0x4d, 0xd8, 0x23, 0x57, 0x86, 0x89, 0xec, 0x31, 0xf9, 0xc9, - 0xa7, 0xb1, 0x05, 0xe7, 0x96, 0x71, 0xb1, 0x8b, 0xd1, 0x1b, 0xf2, 0xe1, 0x89, 0xb6, 0xdf, 0x19, - 0x8b, 0x07, 0xe6, 0x11, 0x02, 0xe2, 0x6b, 0x90, 0x77, 0xec, 0x2b, 0x74, 0x69, 0x6b, 0x5e, 0x27, - 0xcf, 0xf4, 0x72, 0xcb, 0xee, 0xc1, 0xbe, 0x45, 0x4f, 0x86, 0xce, 0xeb, 0xc1, 0xab, 0x76, 0x2b, - 0xcc, 0x5f, 0x31, 0xbd, 0xbd, 0x35, 0x6c, 0x74, 0xb0, 0xa3, 0xdb, 0x57, 0x88, 0xc7, 0xdc, 0xb4, - 0x2e, 0x26, 0x8a, 0xfe, 0x2b, 0x12, 0xf6, 0xa5, 0x2f, 0x94, 0xc9, 0x1c, 0x7f, 0x4b, 0x63, 0x79, - 0xc6, 0x73, 0x95, 0xbd, 0xc2, 0x7c, 0x40, 0x85, 0x19, 0xdd, 0xbe, 0xc2, 0x94, 0xe4, 0xff, 0x3c, - 0x5e, 0x1d, 0x49, 0x3d, 0xd1, 0x23, 0x92, 0x0b, 0xd9, 0x9f, 0xf8, 0x44, 0x2f, 0xb1, 0xf8, 0x89, - 0x9c, 0x5c, 0x9a, 0xd3, 0xed, 0x2b, 0x4d, 0xec, 0xd1, 0x16, 0x81, 0xb6, 0xc7, 0xe4, 0x64, 0x6d, - 0xba, 0x94, 0x20, 0x9b, 0x87, 0x87, 0xef, 0x69, 0x77, 0x11, 0x42, 0x01, 0x85, 0x2c, 0x4e, 0x7a, - 0x17, 0x61, 0x28, 0x07, 0x13, 0x88, 0x91, 0xa2, 0xc2, 0xac, 0x6e, 0x5f, 0xf1, 0x87, 0x86, 0x15, - 0xb3, 0xdb, 0x1d, 0xcf, 0x08, 0x99, 0xd6, 0xf8, 0x0f, 0xc4, 0x10, 0x70, 0x31, 0x71, 0xe3, 0x7f, - 0x08, 0x03, 0xd9, 0xc3, 0xf0, 0x32, 0xda, 0x58, 0x82, 0x11, 0xda, 0x1a, 0x0f, 0x0e, 0xa3, 0x36, - 0x88, 0x90, 0x8d, 0x63, 0x6b, 0x10, 0x71, 0x1c, 0x4c, 0x64, 0xe7, 0x64, 0xa1, 0x42, 0x86, 0xf9, - 0xf1, 0xb6, 0x89, 0xf7, 0xa6, 0x73, 0x4d, 0x64, 0xc3, 0xae, 0xc0, 0xc8, 0x58, 0xd0, 0x48, 0xe1, - 0x82, 0x28, 0xc1, 0x43, 0xf6, 0x78, 0xfc, 0x92, 0x0a, 0x73, 0x94, 0x85, 0xc7, 0x89, 0x15, 0x30, - 0x52, 0xa3, 0xe2, 0x6b, 0x70, 0x3c, 0x8d, 0x2a, 0x81, 0x83, 0x89, 0xdc, 0x29, 0xea, 0xdb, 0x71, - 0x23, 0x1c, 0x1f, 0x8f, 0x43, 0x70, 0x64, 0x63, 0x6c, 0x8c, 0x47, 0xc8, 0x47, 0x31, 0xc6, 0x8e, - 0xe9, 0x18, 0xf9, 0xcb, 0xc2, 0x56, 0x34, 0x4e, 0x0c, 0x8e, 0xd0, 0x14, 0xc6, 0x08, 0xc3, 0x88, - 0x4d, 0xe1, 0x98, 0x90, 0xf8, 0x92, 0x0a, 0x40, 0x19, 0xd8, 0xb0, 0x2f, 0x93, 0xcb, 0x7c, 0xc6, - 0xd0, 0x9d, 0xf5, 0xbb, 0xd5, 0xab, 0x43, 0xdc, 0xea, 0x53, 0x86, 0x70, 0x49, 0xbb, 0x12, 0xc8, - 0x49, 0xd9, 0xaf, 0xe4, 0xc4, 0x57, 0x02, 0x93, 0xcb, 0xcf, 0x1e, 0xe3, 0x2f, 0x50, 0x6b, 0x2e, - 0x3a, 0x60, 0xfa, 0xc3, 0x63, 0x41, 0x99, 0x9b, 0xfd, 0xab, 0xe2, 0xec, 0xff, 0x08, 0xd8, 0x8e, - 0x6a, 0x23, 0x0e, 0x3b, 0x38, 0x9a, 0xbd, 0x8d, 0x78, 0x7c, 0x07, 0x44, 0xbf, 0x35, 0x0f, 0x27, - 0x59, 0x27, 0xf2, 0xef, 0x01, 0xe2, 0x94, 0xe7, 0xf0, 0x84, 0x4e, 0x72, 0x08, 0xca, 0xe3, 0x5a, - 0x90, 0x4a, 0xb3, 0x94, 0x29, 0xc1, 0xde, 0x44, 0x56, 0x37, 0x8a, 0xd5, 0x47, 0x7b, 0x86, 0xd5, - 0x91, 0x0f, 0xf7, 0x3b, 0x04, 0xf8, 0x60, 0xad, 0x51, 0x15, 0xd7, 0x1a, 0x07, 0xac, 0x4c, 0xa6, - 0xde, 0xb9, 0x26, 0x22, 0xa3, 0xec, 0x4e, 0x7c, 0xe7, 0x3a, 0xbe, 0xec, 0xec, 0x51, 0x7a, 0xaf, - 0x0a, 0xf9, 0xa6, 0xed, 0x78, 0xe8, 0xe5, 0x69, 0x5a, 0x27, 0x95, 0x7c, 0x04, 0x52, 0xf0, 0xae, - 0x55, 0x84, 0x3b, 0x9e, 0xef, 0x4a, 0x3e, 0xea, 0x6c, 0x78, 0x06, 0xf1, 0xea, 0xf6, 0xcb, 0xe7, - 0x2e, 0x7b, 0x4e, 0x1b, 0x4f, 0x87, 0xca, 0xaf, 0x19, 0x7f, 0x00, 0x23, 0xb3, 0x78, 0x3a, 0xb1, - 0x25, 0x67, 0x8f, 0xdb, 0x9b, 0x4e, 0x32, 0xdf, 0xd6, 0x15, 0xb3, 0x8b, 0xd1, 0xcb, 0xa9, 0xcb, - 0x48, 0xdd, 0xd8, 0xc7, 0xf2, 0x47, 0x62, 0x12, 0x5d, 0x5b, 0x49, 0x7c, 0x59, 0x35, 0x8a, 0x2f, - 0x9b, 0xb6, 0x41, 0xd1, 0x03, 0xe8, 0x94, 0xa5, 0x49, 0x37, 0xa8, 0x84, 0xb2, 0x27, 0x12, 0xa7, - 0xf3, 0x54, 0x13, 0x7b, 0xd4, 0xa8, 0x6c, 0x04, 0x37, 0xb0, 0x7c, 0xf3, 0x58, 0x22, 0x76, 0x86, - 0x17, 0xbc, 0xa8, 0x7d, 0x17, 0xbc, 0x7c, 0x80, 0x07, 0x67, 0x43, 0x04, 0xe7, 0x1b, 0xe3, 0x05, - 0x24, 0x32, 0x39, 0x16, 0x98, 0xde, 0x19, 0xc2, 0xb4, 0x29, 0xc0, 0x74, 0xdf, 0x88, 0x5c, 0x64, - 0x0f, 0xd8, 0xf7, 0x16, 0xe0, 0x24, 0x9d, 0xf4, 0x97, 0xad, 0x0e, 0x8b, 0xb0, 0xfa, 0x76, 0xe5, - 0x98, 0x37, 0xdb, 0x0e, 0x87, 0x60, 0x15, 0x62, 0x39, 0x17, 0xfa, 0xef, 0xd6, 0x5f, 0xa2, 0xe1, - 0x5c, 0xfd, 0x4e, 0x94, 0xec, 0xb4, 0xc9, 0xdf, 0xaf, 0x1f, 0xfe, 0x27, 0xde, 0x65, 0x34, 0x25, - 0x7f, 0x97, 0xd1, 0x6f, 0xa5, 0x5b, 0xb7, 0x23, 0x45, 0xf7, 0x09, 0x3c, 0x63, 0xdb, 0x29, 0xc5, - 0x8a, 0x9e, 0x04, 0x77, 0xff, 0x39, 0xdc, 0xc9, 0xa2, 0x08, 0x22, 0x23, 0xba, 0x93, 0x11, 0x02, - 0xc7, 0xe9, 0x4e, 0x36, 0x8c, 0x81, 0x09, 0xdc, 0x6a, 0x5f, 0x60, 0xbb, 0xf9, 0xa4, 0xdd, 0xa0, - 0x3f, 0x52, 0x32, 0x1f, 0xa5, 0xbf, 0x96, 0x4b, 0xe5, 0xff, 0x4c, 0xf8, 0x4a, 0x1e, 0xa6, 0xd3, - 0x78, 0x34, 0x27, 0x91, 0x9b, 0xc0, 0xba, 0x91, 0x42, 0x7c, 0xd1, 0x2f, 0x98, 0x1d, 0x6f, 0x6f, - 0x4c, 0x27, 0x3a, 0xae, 0xf8, 0xb4, 0x82, 0xeb, 0x91, 0xc9, 0x0b, 0xfa, 0x9f, 0xb9, 0x54, 0x21, - 0xa4, 0x42, 0x91, 0x10, 0xb6, 0x62, 0x44, 0x9c, 0x22, 0xf0, 0x53, 0x22, 0xbd, 0x09, 0x6a, 0xf4, - 0x79, 0xb3, 0x83, 0xed, 0xc7, 0xa1, 0x46, 0x13, 0xbe, 0xc6, 0xa7, 0xd1, 0x49, 0xe4, 0xfe, 0x93, - 0x6a, 0x74, 0x28, 0x92, 0x31, 0x69, 0x74, 0x22, 0xbd, 0xec, 0x65, 0xfc, 0xba, 0x39, 0x36, 0x91, - 0x5a, 0x37, 0xad, 0x4b, 0xe8, 0x1f, 0x8b, 0xc1, 0xc5, 0xcc, 0x17, 0x4c, 0x6f, 0x8f, 0xc5, 0x82, - 0xf9, 0x90, 0xf4, 0xdd, 0x28, 0x23, 0xc4, 0x7b, 0x11, 0xc3, 0x49, 0x15, 0x0e, 0x85, 0x93, 0x2a, - 0xc3, 0xbc, 0x69, 0x79, 0xd8, 0xb1, 0x8c, 0xee, 0x4a, 0xd7, 0xd8, 0x75, 0xcf, 0x4e, 0x0d, 0xbc, - 0xbc, 0xae, 0xc6, 0xe5, 0xd1, 0xc5, 0x3f, 0xf8, 0xeb, 0x2b, 0xa7, 0xc5, 0xeb, 0x2b, 0x63, 0xa2, - 0x5f, 0xcd, 0xc4, 0x47, 0xbf, 0x0a, 0xa3, 0x5b, 0xc1, 0xf0, 0xe0, 0xd8, 0xb2, 0xb6, 0x71, 0xca, - 0x70, 0x7f, 0x77, 0x49, 0x46, 0x61, 0x0b, 0x43, 0x3f, 0xfe, 0xb8, 0x9a, 0x6a, 0x75, 0xcf, 0x57, - 0x84, 0xc5, 0x7e, 0x25, 0x48, 0x6d, 0xa1, 0xf2, 0x95, 0x57, 0xfb, 0x2a, 0x1f, 0x9a, 0x3c, 0x79, - 0x09, 0x93, 0x87, 0x57, 0xaa, 0x82, 0x9c, 0x52, 0xa5, 0x59, 0x2c, 0x94, 0xa9, 0xed, 0x04, 0x4e, - 0x23, 0x15, 0xe0, 0x54, 0x10, 0xed, 0xb6, 0xd7, 0xc3, 0x86, 0x63, 0x58, 0x6d, 0x8c, 0x3e, 0xae, - 0x8c, 0xc3, 0xec, 0x5d, 0x81, 0x69, 0xb3, 0x6d, 0x5b, 0x4d, 0xf3, 0x45, 0xc1, 0xe5, 0x72, 0xc9, - 0x41, 0xd6, 0x89, 0x44, 0x6a, 0xec, 0x0f, 0x3d, 0xfc, 0x57, 0xab, 0xc1, 0x4c, 0xdb, 0x70, 0x3a, - 0x34, 0x08, 0x5f, 0xa1, 0xef, 0x22, 0xa7, 0x58, 0x42, 0x95, 0xe0, 0x17, 0x3d, 0xfa, 0x5b, 0x6b, - 0x88, 0x42, 0x2c, 0xf6, 0x45, 0xf3, 0x88, 0x25, 0xb6, 0x1c, 0xfd, 0x24, 0xc8, 0xdc, 0x97, 0x8e, - 0x83, 0xbb, 0xe4, 0x0e, 0x7a, 0xda, 0x43, 0xcc, 0xe8, 0x51, 0x42, 0xda, 0xe5, 0x01, 0x52, 0xd4, - 0x21, 0x34, 0x26, 0xbd, 0x3c, 0x20, 0xc5, 0x45, 0xf6, 0x9a, 0xf9, 0x58, 0x11, 0xe6, 0x69, 0xaf, - 0xc6, 0xc4, 0x89, 0x5e, 0x41, 0xae, 0x90, 0xf6, 0x1e, 0xc2, 0x57, 0x51, 0xf3, 0xe8, 0x63, 0x72, - 0x09, 0xd4, 0x4b, 0x61, 0xc0, 0x41, 0xff, 0x31, 0xed, 0xbe, 0x7d, 0xc0, 0xd7, 0x22, 0xe5, 0x69, - 0xd2, 0xfb, 0xf6, 0xc9, 0xc5, 0x67, 0x8f, 0xcf, 0xf7, 0xa9, 0xa0, 0x96, 0x3b, 0x1d, 0xd4, 0x3e, - 0x3a, 0x14, 0xb7, 0xc0, 0x6c, 0xd0, 0x66, 0xa2, 0x18, 0x90, 0x7c, 0x52, 0xda, 0x45, 0xd0, 0x50, - 0x36, 0xe5, 0xce, 0xc4, 0x77, 0x15, 0x12, 0xca, 0xce, 0x1e, 0x94, 0xcf, 0x4e, 0xb1, 0x46, 0xb3, - 0x64, 0xdb, 0x97, 0xc8, 0x51, 0x99, 0x9f, 0x52, 0xa1, 0xb0, 0x82, 0xbd, 0xf6, 0x1e, 0x72, 0xc7, - 0xd2, 0x66, 0x0e, 0x9c, 0x6e, 0xd0, 0x66, 0x0e, 0x9c, 0xee, 0xb0, 0xa0, 0x9c, 0x69, 0xa3, 0x3f, - 0x07, 0x6c, 0x2f, 0x12, 0x96, 0x27, 0x1d, 0xfd, 0x39, 0xb1, 0xf4, 0x09, 0x1c, 0x82, 0xcb, 0xc3, - 0x42, 0xb8, 0x02, 0x46, 0x31, 0xfb, 0xb9, 0xdc, 0xe3, 0x6e, 0x3d, 0x74, 0x88, 0xdd, 0x8c, 0x7e, - 0x2f, 0x5d, 0x88, 0xb5, 0x50, 0xe6, 0x62, 0xcd, 0x33, 0x5e, 0x98, 0x4c, 0x11, 0x7c, 0x4d, 0x8e, - 0xc1, 0x09, 0xac, 0x00, 0xa8, 0x30, 0x4d, 0x18, 0x5a, 0x36, 0x2f, 0x13, 0xd7, 0x43, 0x61, 0xa1, - 0xf2, 0xc5, 0x63, 0x59, 0xa8, 0xbc, 0x4f, 0x5c, 0xa8, 0x94, 0x8c, 0x98, 0x1c, 0xac, 0x53, 0xa6, - 0xf4, 0xc5, 0xf1, 0xff, 0x1f, 0xfb, 0x32, 0x65, 0x0a, 0x5f, 0x9c, 0x21, 0xe5, 0x4f, 0xc0, 0xf5, - 0xf0, 0x05, 0xac, 0xb3, 0x0e, 0x36, 0x64, 0xd1, 0xff, 0x38, 0x05, 0xf9, 0xf3, 0xfe, 0xc3, 0x3f, - 0x44, 0x37, 0x6a, 0xbd, 0x76, 0x0c, 0xc1, 0x1d, 0x9e, 0x0b, 0x79, 0x9f, 0x3e, 0x9b, 0xf6, 0xdc, - 0x21, 0xb7, 0x3b, 0xec, 0x33, 0xa2, 0x93, 0xff, 0xb4, 0x33, 0x50, 0x74, 0xed, 0x03, 0xa7, 0xed, - 0x9b, 0xdf, 0xbe, 0xc6, 0xb0, 0xb7, 0xb4, 0x41, 0x4d, 0x05, 0xd2, 0x8b, 0xe3, 0x73, 0x39, 0xe5, - 0x2e, 0x58, 0x52, 0x85, 0x0b, 0x96, 0x52, 0xec, 0x3f, 0x48, 0xf0, 0x96, 0xbd, 0x46, 0xfc, 0x11, - 0xb9, 0x6b, 0xb0, 0x33, 0x2e, 0xd8, 0x63, 0xc4, 0x72, 0x54, 0x75, 0x48, 0xeb, 0x30, 0x2e, 0x8a, - 0x36, 0x8c, 0x23, 0x3f, 0x51, 0x87, 0x71, 0x09, 0x1e, 0x26, 0x72, 0xca, 0xbd, 0xc8, 0x9c, 0x5c, - 0x1f, 0x1e, 0x27, 0xba, 0x79, 0x41, 0xe9, 0x8f, 0x84, 0xce, 0x18, 0x9d, 0x5f, 0x47, 0x46, 0xe7, - 0x98, 0xdc, 0x5f, 0x7f, 0x45, 0x25, 0x91, 0x34, 0x03, 0x23, 0x48, 0xfe, 0xa2, 0xa4, 0xd4, 0x10, - 0xf9, 0x63, 0xb0, 0x10, 0x47, 0x7a, 0x7e, 0xf4, 0xd0, 0xe2, 0xa2, 0xe8, 0x38, 0xfe, 0x27, 0x1d, - 0x5a, 0x5c, 0x96, 0x91, 0xec, 0x81, 0xfc, 0x09, 0x7a, 0x31, 0x59, 0xb9, 0xed, 0x99, 0x97, 0xc7, - 0xdc, 0xd2, 0xc4, 0xe1, 0x25, 0x65, 0x34, 0xe1, 0x43, 0x12, 0xa2, 0x1c, 0x4e, 0x3a, 0x9a, 0xb0, - 0x1c, 0x1b, 0xd9, 0xc3, 0xf4, 0xe7, 0x45, 0x5f, 0x7a, 0x6c, 0x6d, 0xe7, 0x27, 0xd9, 0x6a, 0x02, - 0x3e, 0x3a, 0x5a, 0xe7, 0x60, 0x8e, 0x5b, 0x3a, 0x08, 0x2e, 0xbc, 0x11, 0xd2, 0xd2, 0x1e, 0x94, - 0x0f, 0x45, 0x36, 0xf6, 0x85, 0x85, 0x14, 0x0b, 0xc6, 0x32, 0x4c, 0x4c, 0xe4, 0x3e, 0xb9, 0x60, - 0x0c, 0x9b, 0x10, 0x56, 0x1f, 0xe2, 0xb1, 0x6a, 0x88, 0x58, 0xdd, 0x23, 0x23, 0x26, 0xb9, 0x31, - 0x4d, 0x6a, 0xde, 0xf8, 0xae, 0x10, 0x2e, 0x5d, 0x80, 0xeb, 0xb9, 0x23, 0xf3, 0x91, 0x3d, 0x62, - 0x3f, 0x42, 0xbb, 0xc3, 0x26, 0x35, 0xd9, 0xc7, 0xd3, 0x1d, 0xb2, 0xd9, 0x80, 0x2a, 0xcc, 0x06, - 0x52, 0xfa, 0xeb, 0x47, 0x6e, 0xa8, 0x01, 0x73, 0xc3, 0x20, 0xca, 0x8f, 0xd9, 0x5f, 0x7f, 0x28, - 0x07, 0xd9, 0x83, 0xf3, 0x77, 0x2a, 0xc0, 0xaa, 0x63, 0x1f, 0xf4, 0x1a, 0x4e, 0x07, 0x3b, 0xe8, - 0x4f, 0xa2, 0x09, 0xc0, 0xf7, 0x8f, 0x61, 0x02, 0xb0, 0x09, 0xb0, 0x1b, 0x12, 0x67, 0x1a, 0xfe, - 0x34, 0x39, 0x73, 0x3f, 0x62, 0x4a, 0xe7, 0x68, 0x88, 0x57, 0xd6, 0x3e, 0x5f, 0xc4, 0x38, 0xa9, - 0xcf, 0x8a, 0xc8, 0x8d, 0x73, 0x02, 0xf0, 0xee, 0x10, 0xeb, 0x96, 0x80, 0xf5, 0xf3, 0x8e, 0xc0, - 0x49, 0xf6, 0x98, 0xff, 0xfd, 0x14, 0xcc, 0xd2, 0xed, 0x3e, 0x2a, 0xd3, 0xbf, 0x8a, 0x40, 0xff, - 0xe1, 0x31, 0x80, 0xbe, 0x05, 0x73, 0x76, 0x44, 0x9d, 0xf6, 0xa9, 0xfc, 0x02, 0x4c, 0x22, 0xec, - 0x1c, 0x5f, 0xba, 0x40, 0x06, 0xfd, 0x32, 0x8f, 0xbc, 0x2e, 0x22, 0x7f, 0x5f, 0x82, 0xbc, 0x39, - 0x8a, 0xe3, 0x84, 0xfe, 0x3d, 0x21, 0xf4, 0x5b, 0x02, 0xf4, 0xe5, 0xa3, 0xb0, 0x32, 0x81, 0x70, - 0xfd, 0x2a, 0xe4, 0xc9, 0xe9, 0xba, 0x9f, 0xce, 0x70, 0x7e, 0x7f, 0x16, 0xa6, 0x48, 0x93, 0x0d, - 0xe7, 0x1d, 0xc1, 0xab, 0xff, 0xc5, 0xd8, 0xf1, 0xb0, 0x13, 0xae, 0xdc, 0x06, 0xaf, 0x3e, 0x0f, - 0x81, 0x57, 0xb3, 0x7b, 0xb6, 0x48, 0x37, 0x32, 0xc3, 0x84, 0x91, 0x27, 0x25, 0xbc, 0xc4, 0xc7, - 0x76, 0xde, 0x6e, 0x94, 0x49, 0xc9, 0x10, 0x46, 0xb2, 0x07, 0xfe, 0x73, 0x79, 0x38, 0x4b, 0x57, - 0x95, 0x56, 0x1c, 0x7b, 0xbf, 0xef, 0x76, 0x2c, 0xf3, 0xe8, 0xba, 0x70, 0x1b, 0x2c, 0x78, 0x82, - 0x3f, 0x37, 0xd3, 0x89, 0xbe, 0x54, 0xf4, 0xdb, 0xbc, 0x4f, 0xc6, 0x0b, 0x44, 0x24, 0x97, 0x12, - 0x04, 0x18, 0xc7, 0x7b, 0xea, 0x85, 0x7a, 0x49, 0x46, 0xb9, 0x45, 0x2a, 0x75, 0xa4, 0x35, 0xcb, - 0x50, 0xa7, 0x0a, 0x32, 0x3a, 0xf5, 0xc1, 0x50, 0xa7, 0xfe, 0x8b, 0xa0, 0x53, 0xab, 0x47, 0x17, - 0xc9, 0x04, 0x56, 0x2e, 0x16, 0xa0, 0xb8, 0x62, 0x76, 0x3d, 0xec, 0xa0, 0x2f, 0xb0, 0x79, 0xd4, - 0x1b, 0x32, 0xec, 0x5e, 0x96, 0xa1, 0xb8, 0x43, 0x4a, 0x63, 0x06, 0xd9, 0x9d, 0x72, 0xd8, 0x50, - 0x0e, 0x75, 0xf6, 0x6f, 0xda, 0xd8, 0x71, 0x7d, 0x64, 0xc6, 0x36, 0x01, 0x4b, 0x11, 0x3b, 0x6e, - 0x38, 0x0b, 0x13, 0xb9, 0x36, 0xa9, 0xa8, 0xe3, 0x7d, 0x7f, 0x04, 0xb9, 0x94, 0x1d, 0xc2, 0x25, - 0x50, 0xcd, 0x8e, 0x4b, 0x9a, 0xde, 0x8c, 0xee, 0x3f, 0xa6, 0xf5, 0x64, 0xe9, 0x17, 0x15, 0x65, - 0x79, 0xd2, 0x9e, 0x2c, 0x52, 0x5c, 0x64, 0x8f, 0xd9, 0xd7, 0x88, 0x1b, 0x63, 0xaf, 0x6b, 0xb4, - 0xb1, 0xcf, 0x7d, 0x66, 0xa8, 0x2d, 0x80, 0x62, 0x06, 0x23, 0xbe, 0x62, 0xf2, 0xed, 0xb4, 0x70, - 0x84, 0x76, 0x3a, 0xea, 0x22, 0x57, 0x28, 0x73, 0x52, 0xf1, 0x63, 0x5b, 0xe4, 0x4a, 0x64, 0x63, - 0x02, 0x97, 0x62, 0x06, 0xc7, 0x3c, 0x27, 0xda, 0x5a, 0x47, 0xdd, 0x02, 0x60, 0xc2, 0x1a, 0xdb, - 0x91, 0xce, 0x51, 0xb6, 0x00, 0xe2, 0x79, 0x98, 0x00, 0x5a, 0x0b, 0x0c, 0xad, 0xcf, 0xb0, 0x61, - 0x34, 0xe3, 0x5d, 0x38, 0xd7, 0x76, 0xbc, 0x74, 0xbb, 0x70, 0x3e, 0x77, 0x3a, 0xf9, 0x2f, 0xed, - 0xb1, 0x20, 0xf1, 0xd4, 0xef, 0xb8, 0x86, 0xcf, 0x14, 0xc7, 0x82, 0x86, 0x31, 0x90, 0x3d, 0xbc, - 0xef, 0x38, 0xa6, 0xc1, 0x73, 0xd4, 0xe6, 0xc8, 0xda, 0xc0, 0xd8, 0x86, 0xce, 0x51, 0x9a, 0x63, - 0x3c, 0x0f, 0xd9, 0xe3, 0xf5, 0xb7, 0xdc, 0xc0, 0xf9, 0xb6, 0x09, 0x0e, 0x9c, 0x41, 0xcb, 0x2c, - 0x8c, 0xd8, 0x32, 0x47, 0xdd, 0x5d, 0x60, 0xb2, 0x1e, 0xdf, 0x80, 0x39, 0xca, 0xee, 0x42, 0x02, - 0x13, 0xd9, 0x23, 0xfe, 0x76, 0x15, 0x0a, 0xcd, 0xc9, 0x8f, 0x97, 0xa3, 0xce, 0x45, 0x88, 0xac, - 0x9a, 0x63, 0x1b, 0x2e, 0x47, 0x99, 0x8b, 0xc4, 0xb2, 0x30, 0x81, 0xb0, 0xf0, 0x27, 0x61, 0x8e, - 0x4c, 0xb8, 0x83, 0x4d, 0xbc, 0xbf, 0x65, 0xa3, 0xe6, 0x5b, 0x32, 0x6c, 0xab, 0x0f, 0xc2, 0x74, - 0xb0, 0x3b, 0xc4, 0x46, 0xce, 0x45, 0xb9, 0xf6, 0x19, 0x70, 0xa9, 0x87, 0xff, 0x1f, 0x69, 0xab, - 0x7d, 0xec, 0x3b, 0x81, 0xa3, 0x6e, 0xb5, 0x1f, 0xeb, 0x6e, 0xe0, 0x6f, 0x45, 0x23, 0xea, 0x7f, - 0xcd, 0x0e, 0xf3, 0xfe, 0x5d, 0xc2, 0xfc, 0x80, 0x5d, 0xc2, 0x8f, 0xf3, 0x58, 0x36, 0x45, 0x2c, - 0xef, 0x97, 0x15, 0xe1, 0x18, 0xc7, 0xda, 0xf7, 0x86, 0x70, 0x9e, 0x17, 0xe0, 0x5c, 0x3a, 0x12, - 0x2f, 0x13, 0x38, 0x96, 0x97, 0x8f, 0xc6, 0xdc, 0x4f, 0x64, 0xd8, 0x8e, 0xfb, 0x7c, 0xfe, 0xf3, - 0x87, 0x7c, 0xfe, 0x85, 0x96, 0x5e, 0x38, 0x62, 0x4b, 0xff, 0x04, 0xaf, 0x1d, 0x2d, 0x51, 0x3b, - 0x9e, 0x2b, 0x8f, 0xc8, 0xf8, 0x46, 0xe6, 0xf7, 0x85, 0xea, 0x71, 0x41, 0x50, 0x8f, 0xca, 0xd1, - 0x98, 0xc9, 0x5e, 0x3f, 0x7e, 0x35, 0x98, 0xd0, 0x1e, 0x73, 0x7b, 0x1f, 0x75, 0x23, 0x52, 0x10, - 0xe2, 0xd8, 0x46, 0xee, 0x51, 0x36, 0x22, 0x87, 0x71, 0x32, 0x81, 0x48, 0x61, 0xf3, 0x30, 0x4b, - 0x78, 0xba, 0x60, 0x76, 0x76, 0xb1, 0x87, 0x7e, 0x9c, 0x7a, 0xc0, 0x05, 0x71, 0x19, 0xc7, 0x14, - 0x3c, 0x27, 0xee, 0x34, 0x66, 0x5a, 0x7f, 0x01, 0xca, 0xe4, 0x22, 0xc7, 0xe0, 0xa4, 0xe3, 0xfb, - 0x0d, 0xe5, 0x20, 0x7b, 0xc8, 0x7e, 0x99, 0x3a, 0x73, 0xac, 0x1b, 0x57, 0xed, 0x03, 0x0f, 0xbd, - 0x74, 0x0c, 0x1d, 0xf4, 0x12, 0x14, 0xbb, 0x84, 0x1a, 0x73, 0xfa, 0x4f, 0x9e, 0xee, 0x30, 0x11, - 0xd0, 0xf2, 0x75, 0xf6, 0x67, 0x5a, 0xcf, 0xff, 0x48, 0x8e, 0x94, 0xce, 0xa4, 0x3d, 0xff, 0x87, - 0x94, 0x3f, 0x91, 0x1b, 0x60, 0xa6, 0xfd, 0xd2, 0xcd, 0x7d, 0xd3, 0x1b, 0x53, 0x7c, 0x81, 0xae, - 0x4f, 0x2b, 0x88, 0x2f, 0x40, 0x5e, 0xd2, 0x9e, 0x67, 0xe4, 0xa4, 0xe2, 0xff, 0x3e, 0xe9, 0xf3, - 0x8c, 0xc9, 0xc5, 0x67, 0x8f, 0xc9, 0x0f, 0xd2, 0x96, 0x75, 0x9e, 0xba, 0x76, 0x66, 0xe8, 0x35, - 0x3a, 0x72, 0x63, 0xa1, 0xac, 0x1d, 0x5f, 0x63, 0x19, 0x58, 0x7e, 0xf6, 0xc0, 0xfc, 0xd4, 0xd7, - 0x43, 0x61, 0x19, 0x5f, 0x3c, 0xd8, 0x45, 0xf7, 0xc1, 0x74, 0xcb, 0xc1, 0xb8, 0x66, 0xed, 0xd8, - 0xbe, 0x74, 0x3d, 0xff, 0x39, 0x80, 0x84, 0xbd, 0xf9, 0x78, 0xec, 0x61, 0xa3, 0x13, 0x9d, 0x6e, - 0x0a, 0x5e, 0xd1, 0x6b, 0x15, 0xc8, 0x37, 0x3d, 0xc3, 0x43, 0x33, 0x21, 0xb6, 0xe8, 0xa5, 0x3c, - 0x16, 0xf7, 0x89, 0x58, 0xdc, 0x26, 0xc8, 0x82, 0x70, 0xb0, 0xe8, 0xff, 0x1f, 0x03, 0x00, 0x82, - 0xe9, 0x47, 0x5c, 0xdb, 0xf2, 0x73, 0x04, 0x07, 0xf0, 0x82, 0x77, 0xf4, 0xfa, 0x50, 0xdc, 0x0f, - 0x08, 0xe2, 0x7e, 0x8a, 0x5c, 0x11, 0x13, 0x58, 0x69, 0x53, 0x60, 0xc6, 0x17, 0xed, 0x1a, 0x36, - 0x3a, 0x2e, 0xfa, 0xba, 0x48, 0xf9, 0x63, 0xc4, 0x8c, 0x3e, 0x2c, 0x1d, 0x2a, 0x92, 0xd6, 0x2a, - 0x24, 0x1e, 0xef, 0x2f, 0x10, 0x84, 0xca, 0x50, 0xc4, 0x50, 0x19, 0x77, 0x41, 0xde, 0xb4, 0x76, - 0x6c, 0xe6, 0xbd, 0x76, 0x43, 0x0c, 0x6d, 0x5f, 0x27, 0x74, 0x92, 0x51, 0x32, 0x8e, 0x64, 0x32, - 0x5b, 0x13, 0xb9, 0x92, 0x2d, 0xef, 0x97, 0x8e, 0xfe, 0x8f, 0xa1, 0xc2, 0xd6, 0x34, 0xc8, 0xf7, - 0x0c, 0x6f, 0x8f, 0x15, 0x4d, 0x9e, 0x7d, 0x1b, 0xf9, 0xc0, 0x32, 0x2c, 0xdb, 0xba, 0xba, 0x6f, - 0xbe, 0x28, 0xbc, 0xf9, 0x55, 0x48, 0xf3, 0x39, 0xdf, 0xc5, 0x16, 0x76, 0x0c, 0x0f, 0x37, 0x2f, - 0xef, 0x92, 0x39, 0xd6, 0xb4, 0xce, 0x27, 0xa5, 0xd6, 0x7f, 0x9f, 0xe3, 0x78, 0xfd, 0xdf, 0x31, - 0xbb, 0x98, 0xc4, 0x11, 0x62, 0xfa, 0x1f, 0xbc, 0xa7, 0xd2, 0xff, 0x01, 0x45, 0x64, 0x8f, 0xc6, - 0xbf, 0x28, 0x30, 0xd7, 0xf4, 0x15, 0xae, 0x79, 0xb0, 0xbf, 0x6f, 0x38, 0x57, 0xd1, 0x13, 0x23, - 0x54, 0x38, 0xd5, 0xcc, 0x09, 0xaa, 0x89, 0x7e, 0x45, 0xfa, 0xd2, 0x63, 0xd6, 0xb4, 0xb9, 0x12, - 0x52, 0xb7, 0x83, 0xa7, 0x43, 0xc1, 0x57, 0xef, 0xc0, 0x9f, 0x2f, 0xb1, 0x21, 0xd0, 0x9c, 0x92, - 0xf1, 0x96, 0x86, 0xf2, 0x36, 0x81, 0x58, 0x0f, 0x0a, 0x9c, 0x6c, 0x7a, 0x46, 0xfb, 0xd2, 0xaa, - 0xed, 0xd8, 0x07, 0x9e, 0x69, 0x61, 0x17, 0x3d, 0x21, 0x42, 0x20, 0xd0, 0xff, 0x5c, 0xa4, 0xff, - 0xe8, 0xdf, 0x72, 0xb2, 0xa3, 0x68, 0xd8, 0xad, 0xf2, 0xe4, 0x63, 0xc2, 0x27, 0xc9, 0x8d, 0x8b, - 0x32, 0x14, 0xb3, 0x17, 0xda, 0xdb, 0x54, 0x28, 0x55, 0x1f, 0xed, 0xd9, 0x8e, 0xb7, 0x6e, 0xb7, - 0x8d, 0xae, 0xeb, 0xd9, 0x0e, 0x46, 0x8d, 0x44, 0xa9, 0xf9, 0x3d, 0x4c, 0xc7, 0x6e, 0x47, 0x83, - 0x23, 0x7b, 0xe3, 0xd5, 0x4e, 0x15, 0x75, 0xfc, 0x97, 0xa5, 0x77, 0x19, 0xa9, 0x54, 0xfa, 0x39, - 0x8a, 0xd1, 0xf3, 0x41, 0x5d, 0x5a, 0x3a, 0x57, 0x7c, 0xb9, 0x9d, 0x47, 0x29, 0xa6, 0x26, 0xb0, - 0x54, 0xae, 0xc0, 0x7c, 0xf3, 0xe0, 0x62, 0x48, 0xc4, 0xe5, 0x8d, 0x90, 0x37, 0x4a, 0xc7, 0x48, - 0x60, 0x8a, 0xc7, 0x13, 0x8a, 0x91, 0xef, 0xad, 0x30, 0xef, 0xf2, 0xd9, 0x18, 0xde, 0x62, 0xa2, - 0x64, 0x6c, 0x84, 0xe1, 0xa5, 0x66, 0x2f, 0xc0, 0xf7, 0x29, 0x30, 0xdf, 0xe8, 0x61, 0x0b, 0x77, - 0xa8, 0x8f, 0x9d, 0x20, 0xc0, 0xd7, 0xa6, 0x14, 0xa0, 0x40, 0x28, 0x46, 0x80, 0x91, 0x3f, 0xec, - 0x72, 0x20, 0xbc, 0x28, 0x21, 0x95, 0xe0, 0x92, 0x4a, 0xcb, 0x5e, 0x70, 0x9f, 0x57, 0x60, 0x56, - 0x3f, 0xb0, 0x36, 0x1d, 0xdb, 0x1f, 0x8d, 0x1d, 0x74, 0x7f, 0xd4, 0x41, 0xdc, 0x09, 0xa7, 0x3a, - 0x07, 0x0e, 0x59, 0x7f, 0xaa, 0x59, 0x4d, 0xdc, 0xb6, 0xad, 0x8e, 0x4b, 0xea, 0x51, 0xd0, 0x0f, - 0x7f, 0xb8, 0x37, 0xff, 0xf2, 0xbf, 0x50, 0x73, 0xe8, 0x15, 0xd2, 0x81, 0x58, 0x68, 0xe5, 0xb9, - 0xa2, 0xe5, 0x7b, 0x02, 0xc9, 0x70, 0x2b, 0xc3, 0x4a, 0xc8, 0x5e, 0xb8, 0x9f, 0x51, 0x40, 0x2b, - 0xb7, 0xdb, 0xf6, 0x81, 0xe5, 0x35, 0x71, 0x17, 0xb7, 0xbd, 0x96, 0x63, 0xb4, 0x31, 0x6f, 0x3f, - 0x97, 0x40, 0xed, 0x98, 0x0e, 0xeb, 0x83, 0xfd, 0x47, 0x26, 0xc7, 0xd7, 0x4a, 0xef, 0x38, 0xd2, - 0x5a, 0x1e, 0x2e, 0x25, 0x85, 0x38, 0xe5, 0xf6, 0x15, 0x25, 0x0b, 0xca, 0x5e, 0xaa, 0x9f, 0x50, - 0x60, 0x26, 0xe8, 0xb1, 0x77, 0x65, 0x84, 0xf9, 0x83, 0x29, 0x27, 0x23, 0x21, 0xf1, 0x14, 0x32, - 0x7c, 0x2c, 0xc5, 0xac, 0x22, 0x8e, 0x7e, 0x3a, 0xd1, 0x95, 0xd3, 0x8b, 0xce, 0x7f, 0xad, 0x37, - 0xb6, 0x57, 0x1a, 0xeb, 0xcb, 0x55, 0xbd, 0xa4, 0xa2, 0x2f, 0x28, 0x90, 0xdf, 0x34, 0xad, 0x5d, - 0x3e, 0x5e, 0xd6, 0x69, 0xdf, 0x8e, 0xec, 0xe0, 0x47, 0x59, 0x4b, 0xa7, 0x2f, 0xda, 0xdd, 0x70, - 0xda, 0x3a, 0xd8, 0xbf, 0x88, 0x9d, 0xc6, 0x0e, 0x19, 0x65, 0xdd, 0x96, 0xdd, 0xc4, 0x16, 0x35, - 0x42, 0x0b, 0xfa, 0xc0, 0x6f, 0xa2, 0x09, 0x26, 0x31, 0x79, 0xf0, 0x39, 0x89, 0x91, 0x78, 0xc8, - 0x94, 0xc2, 0x31, 0x95, 0x6a, 0xda, 0x30, 0x80, 0x78, 0xf6, 0x9a, 0xfa, 0x6b, 0x05, 0xb8, 0xb6, - 0x6c, 0x5d, 0x25, 0x36, 0x05, 0xed, 0xe0, 0x2b, 0x7b, 0x86, 0xb5, 0x8b, 0xc9, 0x00, 0x11, 0x4a, - 0x9c, 0x0f, 0x20, 0x9f, 0x13, 0x03, 0xc8, 0x6b, 0x3a, 0x4c, 0xd9, 0x4e, 0x07, 0x3b, 0x4b, 0x57, - 0x09, 0x4f, 0xfd, 0xcb, 0xce, 0xac, 0x4d, 0x0e, 0x2a, 0x62, 0x91, 0x91, 0x5f, 0x6c, 0xd0, 0xff, - 0xf5, 0x80, 0xd0, 0xb9, 0x3b, 0x61, 0x8a, 0xa5, 0x69, 0x73, 0x30, 0xdd, 0xd0, 0x97, 0xab, 0xfa, - 0x76, 0x6d, 0xb9, 0x74, 0x42, 0xbb, 0x06, 0x4e, 0xd6, 0x5a, 0x55, 0xbd, 0xdc, 0xaa, 0x35, 0xea, - 0xdb, 0x24, 0xbd, 0x94, 0x43, 0x2f, 0xcb, 0xcb, 0x7a, 0xf6, 0x26, 0x33, 0x33, 0x08, 0x56, 0x1d, - 0xa6, 0xda, 0x34, 0x03, 0x19, 0x42, 0x67, 0x53, 0xd5, 0x8e, 0x11, 0xa4, 0x09, 0x7a, 0x40, 0x48, - 0xbb, 0x09, 0xe0, 0x8a, 0x63, 0x5b, 0xbb, 0xd1, 0x99, 0xb6, 0x69, 0x9d, 0x4b, 0x41, 0x2f, 0xcd, - 0x41, 0x91, 0xfe, 0x43, 0x2e, 0xcc, 0x20, 0x4f, 0x91, 0xe0, 0x83, 0x77, 0xdf, 0xe2, 0x25, 0xf2, - 0x8a, 0x26, 0x5a, 0xec, 0xd5, 0xd7, 0x45, 0x2a, 0x03, 0x6a, 0x09, 0xb3, 0xaa, 0xdc, 0x05, 0x45, - 0xfa, 0x2f, 0xf3, 0x3a, 0x88, 0x0f, 0x7e, 0x49, 0xb3, 0x49, 0xfa, 0x29, 0xcb, 0xcb, 0x34, 0x7b, - 0x6d, 0xfe, 0x88, 0x02, 0xd3, 0x75, 0xec, 0x55, 0xf6, 0x70, 0xfb, 0x12, 0x7a, 0xb2, 0xb8, 0x00, - 0xda, 0x35, 0xb1, 0xe5, 0x3d, 0xbc, 0xdf, 0x0d, 0x17, 0x40, 0x83, 0x04, 0xf4, 0x9d, 0x7c, 0xe7, - 0xfb, 0x3c, 0x51, 0x7f, 0xee, 0x18, 0x50, 0xd7, 0xa0, 0x84, 0x18, 0x95, 0x39, 0x03, 0x45, 0x07, - 0xbb, 0x07, 0xdd, 0x60, 0x11, 0x8d, 0xbd, 0xa1, 0x37, 0x85, 0xe2, 0xac, 0x08, 0xe2, 0xbc, 0x4b, - 0xbe, 0x88, 0x09, 0x44, 0xd3, 0xcc, 0xc3, 0x54, 0xcd, 0x32, 0x3d, 0xd3, 0xe8, 0xa2, 0x57, 0xe4, - 0x61, 0xbe, 0x89, 0xbd, 0x4d, 0xc3, 0x31, 0xf6, 0xb1, 0x87, 0x1d, 0x17, 0x7d, 0x55, 0xec, 0x13, - 0x7a, 0x5d, 0xc3, 0xdb, 0xb1, 0x9d, 0xfd, 0x40, 0x35, 0x83, 0x77, 0x5f, 0x35, 0x2f, 0x63, 0xc7, - 0x8d, 0xf8, 0x0a, 0x5e, 0xfd, 0x2f, 0x57, 0x6c, 0xe7, 0x92, 0x3f, 0x08, 0xb2, 0x69, 0x1a, 0x7b, - 0xf5, 0xe9, 0x75, 0xed, 0xdd, 0x75, 0x7c, 0x19, 0x07, 0xc1, 0xba, 0xc2, 0x77, 0x7f, 0x2e, 0xd0, - 0xb1, 0xeb, 0xb6, 0xe7, 0x77, 0xda, 0xeb, 0xf6, 0x2e, 0x8d, 0x66, 0x3a, 0xad, 0x8b, 0x89, 0x51, - 0x2e, 0xe3, 0x32, 0x26, 0xb9, 0x8a, 0x7c, 0x2e, 0x96, 0xa8, 0x2d, 0x82, 0x16, 0xfe, 0xd6, 0xc2, - 0x5d, 0xbc, 0x8f, 0x3d, 0xe7, 0x2a, 0xb9, 0xb4, 0x60, 0x5a, 0x1f, 0xf0, 0x85, 0x0d, 0xd0, 0xf2, - 0x93, 0x75, 0x26, 0xbd, 0x45, 0x41, 0x72, 0x47, 0x9a, 0xac, 0xcb, 0x50, 0x9c, 0xc8, 0xa5, 0x4c, - 0xaa, 0x6f, 0xcd, 0xfc, 0xa8, 0x0a, 0x79, 0x32, 0x78, 0xbe, 0x3d, 0x27, 0xac, 0x30, 0xed, 0x63, - 0xd7, 0x35, 0x76, 0x71, 0xb0, 0xc2, 0xc4, 0x5e, 0xb5, 0x7b, 0xa0, 0xd0, 0x25, 0x98, 0xd2, 0xc1, - 0xe1, 0x89, 0x42, 0xcd, 0x7c, 0x03, 0xc3, 0xa7, 0x15, 0x8e, 0x04, 0x04, 0x6e, 0x9d, 0xfe, 0x71, - 0xee, 0x41, 0x28, 0x50, 0xf8, 0x67, 0xa0, 0xb0, 0x5c, 0x5d, 0xda, 0x5a, 0x2d, 0x9d, 0xf0, 0x1f, - 0x03, 0xfe, 0x66, 0xa0, 0xb0, 0x52, 0x6e, 0x95, 0xd7, 0x4b, 0x8a, 0x5f, 0x8f, 0x5a, 0x7d, 0xa5, - 0x51, 0x52, 0xfd, 0xc4, 0xcd, 0x72, 0xbd, 0x56, 0x29, 0xe5, 0xb5, 0x59, 0x98, 0xba, 0x50, 0xd6, - 0xeb, 0xb5, 0xfa, 0x6a, 0xa9, 0x80, 0xfe, 0x9c, 0xc7, 0xef, 0x5e, 0x11, 0xbf, 0x5b, 0xe3, 0x78, - 0x1a, 0x04, 0xd9, 0x8f, 0x85, 0x90, 0xdd, 0x2f, 0x40, 0xf6, 0xf5, 0x32, 0x44, 0x26, 0xe0, 0xce, - 0x54, 0x84, 0xa9, 0x4d, 0xc7, 0x6e, 0x63, 0xd7, 0x45, 0x3f, 0xa4, 0x40, 0xb1, 0x62, 0x58, 0x6d, - 0xdc, 0x45, 0xd7, 0x47, 0x50, 0x51, 0x57, 0xd1, 0x5c, 0xe0, 0x2a, 0x8a, 0xfe, 0x2e, 0x27, 0xdb, - 0xfb, 0x31, 0xba, 0x8b, 0x94, 0x66, 0x8c, 0x7c, 0xe4, 0x7a, 0xb9, 0x44, 0x52, 0x13, 0xb8, 0xb8, - 0x45, 0x81, 0x19, 0xb6, 0x1a, 0x70, 0x11, 0xf3, 0xf3, 0xf0, 0xaf, 0xe6, 0x64, 0x27, 0x87, 0x41, - 0x0d, 0x42, 0x32, 0x31, 0xf2, 0x90, 0x9b, 0x08, 0x0e, 0xa3, 0x36, 0x81, 0xcd, 0x43, 0x05, 0x66, - 0xb7, 0x2c, 0x77, 0x90, 0x50, 0xe4, 0xa3, 0xbc, 0x07, 0xd5, 0xe0, 0x08, 0x1d, 0x29, 0xca, 0xfb, - 0x70, 0x7a, 0xd9, 0x0b, 0xe6, 0xab, 0x39, 0x38, 0xbd, 0x8a, 0x2d, 0xec, 0x98, 0x6d, 0x5a, 0x83, - 0x40, 0x12, 0xf7, 0x8b, 0x92, 0x78, 0xb2, 0xc0, 0xf9, 0xa0, 0x3f, 0x44, 0x09, 0xbc, 0x21, 0x94, - 0xc0, 0xf3, 0x04, 0x09, 0xdc, 0x29, 0x49, 0x67, 0x02, 0xb7, 0x75, 0xcf, 0xc0, 0x5c, 0xdd, 0xf6, - 0xcc, 0x1d, 0xb3, 0x4d, 0x7d, 0xd0, 0x7e, 0x44, 0x85, 0xfc, 0xba, 0xe9, 0x7a, 0xa8, 0x1c, 0x75, - 0x27, 0xb7, 0xc0, 0xac, 0x69, 0xb5, 0xbb, 0x07, 0x1d, 0xac, 0x63, 0x83, 0xf6, 0x2b, 0xd3, 0x3a, - 0x9f, 0x14, 0x6d, 0xed, 0xfb, 0x6c, 0xa9, 0xc1, 0xd6, 0xfe, 0x6f, 0x4a, 0x2f, 0xc3, 0xf0, 0x2c, - 0x90, 0x70, 0x87, 0x31, 0x76, 0x57, 0x19, 0xe6, 0x2d, 0x2e, 0x6b, 0x60, 0xb0, 0xf7, 0x87, 0xbb, - 0xe7, 0xc9, 0xe9, 0xe2, 0x1f, 0xe8, 0x03, 0x52, 0x8d, 0x75, 0x18, 0x43, 0xe9, 0x90, 0x59, 0x19, - 0x61, 0x92, 0xac, 0xc1, 0x42, 0xad, 0xde, 0xaa, 0xea, 0xf5, 0xf2, 0x3a, 0xcb, 0xa2, 0xa2, 0x7f, - 0x51, 0xa0, 0xa0, 0xe3, 0x5e, 0xf7, 0x2a, 0x1f, 0xcf, 0x98, 0x39, 0x8a, 0xe7, 0x42, 0x47, 0x71, - 0x6d, 0x05, 0xc0, 0x68, 0xfb, 0x05, 0x93, 0x0b, 0x9f, 0x94, 0x81, 0x51, 0x32, 0x85, 0x0a, 0x96, - 0xc3, 0xdc, 0x3a, 0xf7, 0x27, 0x7a, 0xa5, 0xf4, 0xce, 0x91, 0x40, 0x8d, 0x70, 0x18, 0xd3, 0x27, - 0x7c, 0x50, 0x6a, 0xb3, 0x67, 0x28, 0xb9, 0xe3, 0x11, 0xff, 0x17, 0x15, 0xc8, 0xb7, 0xfc, 0xde, - 0x92, 0xeb, 0x38, 0x7f, 0x7d, 0x34, 0x1d, 0xf7, 0xc9, 0xc4, 0xe8, 0xf8, 0x03, 0x30, 0xc7, 0x6b, - 0x2c, 0x73, 0x95, 0x48, 0x54, 0x71, 0xe1, 0x87, 0x51, 0x34, 0x7c, 0x00, 0x3b, 0xc7, 0x23, 0xe2, - 0x4f, 0x3e, 0x05, 0x60, 0x03, 0xef, 0x5f, 0xc4, 0x8e, 0xbb, 0x67, 0xf6, 0xd0, 0x5f, 0xaa, 0x30, - 0xb3, 0x8a, 0xbd, 0xa6, 0x67, 0x78, 0x07, 0x6e, 0xdf, 0x76, 0xa7, 0x65, 0x57, 0x8c, 0xf6, 0x1e, - 0x66, 0xdd, 0x51, 0xf0, 0x8a, 0xde, 0xa3, 0xca, 0xfa, 0x13, 0x45, 0xe5, 0x2c, 0x86, 0x65, 0xc4, - 0x60, 0xf2, 0x54, 0xc8, 0x77, 0x0c, 0xcf, 0x60, 0x58, 0x5c, 0xdf, 0x87, 0x45, 0x44, 0x48, 0x27, - 0xd9, 0xd0, 0xcf, 0x29, 0x32, 0x0e, 0x45, 0x12, 0xe5, 0xa7, 0x03, 0xe1, 0x03, 0xb9, 0x11, 0x50, - 0x38, 0x05, 0xf3, 0xf5, 0x46, 0x6b, 0x7b, 0xbd, 0xb1, 0xba, 0x5a, 0xf5, 0x53, 0x4b, 0xaa, 0x76, - 0x06, 0xb4, 0xcd, 0xf2, 0xc3, 0x1b, 0xd5, 0x7a, 0x6b, 0xbb, 0xde, 0x58, 0xae, 0xb2, 0x3f, 0xf3, - 0xda, 0x49, 0x98, 0xad, 0x94, 0x2b, 0x6b, 0x41, 0x42, 0x41, 0x3b, 0x0b, 0xa7, 0x37, 0xaa, 0x1b, - 0x4b, 0x55, 0xbd, 0xb9, 0x56, 0xdb, 0xdc, 0xf6, 0xc9, 0xac, 0x34, 0xb6, 0xea, 0xcb, 0xa5, 0xa2, - 0x86, 0xe0, 0x0c, 0xf7, 0xe5, 0x82, 0xde, 0xa8, 0xaf, 0x6e, 0x37, 0x5b, 0xe5, 0x56, 0xb5, 0x34, - 0xa5, 0x5d, 0x03, 0x27, 0x2b, 0xe5, 0x3a, 0xc9, 0x5e, 0x69, 0xd4, 0xeb, 0xd5, 0x4a, 0xab, 0x34, - 0x8d, 0xfe, 0x2d, 0x0f, 0xb3, 0x35, 0xb7, 0x6e, 0xec, 0xe3, 0xf3, 0x46, 0xd7, 0xec, 0xa0, 0x57, - 0x70, 0x33, 0x8f, 0x5b, 0x61, 0xde, 0xa1, 0x8f, 0xb8, 0xd3, 0x32, 0x31, 0x45, 0x73, 0x5e, 0x17, - 0x13, 0xfd, 0x39, 0xb9, 0x45, 0x08, 0x04, 0x73, 0x72, 0xfa, 0xa6, 0x2d, 0x01, 0xd0, 0xa7, 0x56, - 0x74, 0xf5, 0xe8, 0xb9, 0xfe, 0xd6, 0x64, 0xec, 0x63, 0x17, 0x3b, 0x97, 0xcd, 0x36, 0x0e, 0x72, - 0xea, 0xdc, 0x5f, 0xe8, 0x4b, 0xaa, 0xec, 0xfe, 0x22, 0x07, 0x2a, 0x57, 0x9d, 0x98, 0xde, 0xf0, - 0xbb, 0x54, 0x99, 0xdd, 0x41, 0x29, 0x92, 0xe9, 0x34, 0xe5, 0xd5, 0xca, 0x68, 0xcb, 0xb6, 0xad, - 0x46, 0x63, 0xbb, 0xb9, 0xd6, 0xd0, 0x5b, 0x25, 0x55, 0x9b, 0x83, 0x69, 0xff, 0x75, 0xbd, 0x51, - 0x5f, 0x2d, 0xe5, 0xb5, 0x6b, 0xe1, 0xd4, 0x5a, 0xb9, 0xb9, 0x5d, 0xab, 0x9f, 0x2f, 0xaf, 0xd7, - 0x96, 0xb7, 0x2b, 0x6b, 0x65, 0xbd, 0x59, 0x2a, 0x68, 0xd7, 0xc3, 0xb5, 0xad, 0x5a, 0x55, 0xdf, - 0x5e, 0xa9, 0x96, 0x5b, 0x5b, 0x7a, 0xb5, 0xb9, 0x5d, 0x6f, 0x6c, 0xd7, 0xcb, 0x1b, 0xd5, 0x52, - 0xd1, 0x6f, 0xfe, 0xe4, 0x53, 0xa4, 0x36, 0x53, 0x87, 0x95, 0x71, 0x3a, 0x46, 0x19, 0x67, 0xfa, - 0x95, 0x11, 0x78, 0xb5, 0xd2, 0xab, 0xcd, 0xaa, 0x7e, 0xbe, 0x5a, 0x9a, 0x1d, 0xa4, 0x6b, 0x73, - 0xda, 0x69, 0x28, 0xf9, 0x3c, 0x6c, 0xd7, 0x9a, 0x41, 0xce, 0xe5, 0xd2, 0x3c, 0xfa, 0x44, 0x11, - 0xce, 0xe8, 0x78, 0xd7, 0x74, 0x3d, 0xec, 0x6c, 0x1a, 0x57, 0xf7, 0xb1, 0xe5, 0x05, 0x9d, 0xfc, - 0x3f, 0xa5, 0x56, 0xc6, 0x0d, 0x98, 0xef, 0x51, 0x1a, 0x1b, 0xd8, 0xdb, 0xb3, 0x3b, 0x6c, 0x14, - 0x7e, 0x72, 0x6c, 0xcf, 0xb1, 0xb8, 0xc9, 0x67, 0xd7, 0xc5, 0xbf, 0x39, 0xdd, 0x56, 0x13, 0x74, - 0x3b, 0x3f, 0x8a, 0x6e, 0x6b, 0x37, 0xc2, 0xcc, 0x81, 0x8b, 0x9d, 0xea, 0xbe, 0x61, 0x76, 0x83, - 0xab, 0x23, 0xc3, 0x04, 0xf4, 0xae, 0xbc, 0xec, 0x89, 0x15, 0xae, 0x2e, 0x83, 0xc5, 0x18, 0xd3, - 0xb7, 0xde, 0x04, 0xc0, 0x2a, 0xbb, 0xe5, 0x74, 0x99, 0xb2, 0x72, 0x29, 0x3e, 0x7f, 0x17, 0xcd, - 0x6e, 0xd7, 0xb4, 0x76, 0xc3, 0x7d, 0xff, 0x28, 0x01, 0xbd, 0x5a, 0x95, 0x39, 0xc1, 0x92, 0x96, - 0xb7, 0x74, 0xad, 0xe9, 0x95, 0xca, 0x84, 0xfb, 0xdd, 0xc3, 0x4d, 0xa7, 0xa8, 0x95, 0x60, 0x8e, - 0xa4, 0xb1, 0x16, 0x58, 0x9a, 0xf2, 0xfb, 0xe0, 0x80, 0xdc, 0x46, 0xb5, 0xb5, 0xd6, 0x58, 0x0e, - 0xbf, 0x4d, 0xfb, 0x24, 0x7d, 0x66, 0xca, 0xf5, 0x87, 0x49, 0x6b, 0x9c, 0xd1, 0x9e, 0x00, 0xd7, - 0x73, 0x1d, 0x76, 0x79, 0x5d, 0xaf, 0x96, 0x97, 0x1f, 0xde, 0xae, 0xbe, 0xa0, 0xd6, 0x6c, 0x35, - 0xc5, 0xc6, 0x15, 0xb4, 0xa3, 0x59, 0x9f, 0xdf, 0xea, 0x46, 0xb9, 0xb6, 0xce, 0xfa, 0xf7, 0x95, - 0x86, 0xbe, 0x51, 0x6e, 0x95, 0xe6, 0xd0, 0x8f, 0xaa, 0x50, 0x5a, 0xc5, 0xde, 0xa6, 0xed, 0x78, - 0x46, 0x77, 0xdd, 0xb4, 0x2e, 0x6d, 0x39, 0x5d, 0x61, 0xb2, 0x29, 0x1d, 0xa6, 0x43, 0x1c, 0x22, - 0x05, 0x82, 0xf1, 0x3b, 0xe2, 0x3d, 0x92, 0x2d, 0x52, 0xa6, 0x28, 0x01, 0xbd, 0x58, 0x91, 0x59, - 0xee, 0x96, 0x2f, 0x35, 0x9d, 0x9e, 0xbc, 0x64, 0xd2, 0xe3, 0xf3, 0x00, 0xd4, 0x8a, 0xe8, 0xe5, - 0x79, 0x98, 0x5e, 0x31, 0x2d, 0xa3, 0x6b, 0xbe, 0x48, 0x88, 0x8e, 0x19, 0xf5, 0x31, 0xb9, 0x84, - 0x3e, 0x46, 0x19, 0x69, 0xfc, 0xfc, 0x01, 0x55, 0x76, 0x79, 0x81, 0x93, 0x7d, 0xc0, 0x64, 0xcc, - 0xe0, 0xf9, 0x51, 0x45, 0x66, 0x79, 0x61, 0x38, 0xbd, 0x74, 0x18, 0x7e, 0xea, 0xdf, 0x87, 0x8d, - 0xd5, 0xd7, 0xbe, 0xa7, 0x07, 0xa9, 0xc2, 0x0c, 0xfa, 0x5d, 0x15, 0xd0, 0x2a, 0xf6, 0xce, 0x63, - 0x27, 0x9c, 0x0a, 0x90, 0x5e, 0x9f, 0xd9, 0xdb, 0x5c, 0x93, 0x7d, 0x3b, 0x0f, 0xe0, 0x05, 0x11, - 0xc0, 0x72, 0x42, 0xe3, 0x89, 0x21, 0x1d, 0xd3, 0x78, 0x6b, 0x50, 0x74, 0xc9, 0x77, 0xa6, 0x66, - 0x4f, 0x8f, 0x1f, 0x2e, 0x09, 0x31, 0x9e, 0x3a, 0x25, 0xac, 0x33, 0x02, 0xe8, 0x6b, 0xe1, 0x24, - 0xe8, 0x9b, 0x04, 0xed, 0x58, 0x39, 0x32, 0xb3, 0xe9, 0xf4, 0xc5, 0xc9, 0x56, 0x5d, 0x06, 0xd9, - 0x37, 0xe8, 0xa3, 0x05, 0x38, 0x3d, 0xa8, 0x3a, 0xe8, 0xe7, 0x73, 0xc2, 0x0e, 0x3b, 0x26, 0x43, - 0x7e, 0x8e, 0x6d, 0x20, 0xfa, 0x2f, 0xda, 0x33, 0xe1, 0xda, 0x70, 0x19, 0xae, 0x65, 0xd7, 0xf1, - 0x15, 0xb7, 0x8b, 0x3d, 0x0f, 0x3b, 0xa4, 0x6a, 0xd3, 0xfa, 0xe0, 0x8f, 0xda, 0xb3, 0xe1, 0x3a, - 0xd3, 0x72, 0xcd, 0x0e, 0x76, 0x5a, 0x66, 0xcf, 0x2d, 0x5b, 0x9d, 0xd6, 0x81, 0x67, 0x3b, 0xa6, - 0xc1, 0x2e, 0x3a, 0x9c, 0xd6, 0xe3, 0x3e, 0x6b, 0x77, 0x40, 0xc9, 0x74, 0x1b, 0xd6, 0x45, 0xdb, - 0x70, 0x3a, 0xa6, 0xb5, 0xbb, 0x6e, 0xba, 0x1e, 0xf3, 0x00, 0x3e, 0x94, 0x8e, 0xfe, 0x4a, 0x95, - 0x3d, 0x4c, 0x37, 0x04, 0xd6, 0x98, 0x0e, 0xe5, 0x3b, 0x55, 0x99, 0xe3, 0x71, 0xe9, 0x68, 0xa7, - 0x53, 0x96, 0x97, 0x4d, 0xda, 0x90, 0x18, 0x3c, 0x82, 0x93, 0xae, 0x85, 0xa6, 0x07, 0x86, 0xc0, - 0xf9, 0xaa, 0x5e, 0x5b, 0xa9, 0x55, 0x7d, 0xb3, 0xe2, 0x5a, 0x38, 0x15, 0x7d, 0x5b, 0x7e, 0x78, - 0xbb, 0x59, 0xad, 0xb7, 0x4a, 0xd3, 0x7e, 0x3f, 0x45, 0x93, 0x57, 0xca, 0xb5, 0xf5, 0xea, 0xf2, - 0x76, 0xab, 0xe1, 0x7f, 0x59, 0x1e, 0xcd, 0xb4, 0x40, 0x2f, 0xcd, 0xc3, 0x49, 0x22, 0xdb, 0xab, - 0x44, 0xaa, 0xbe, 0x50, 0xfa, 0x7c, 0x6d, 0x43, 0x80, 0x66, 0xa8, 0x78, 0xd1, 0xef, 0x48, 0xdf, - 0xe3, 0xc8, 0x41, 0xd8, 0x57, 0x46, 0x8c, 0x66, 0x7c, 0x55, 0x91, 0x89, 0x50, 0x21, 0x4d, 0x36, - 0x9d, 0x52, 0xfc, 0xf3, 0xa4, 0x47, 0x9c, 0x78, 0xf0, 0x89, 0x95, 0x59, 0x21, 0x3f, 0xbf, 0x60, - 0xb3, 0xa6, 0x13, 0x75, 0x58, 0x00, 0x20, 0x29, 0x44, 0x83, 0xa8, 0x1e, 0x0c, 0x1c, 0xaf, 0xe2, - 0xf4, 0xa0, 0x5c, 0x69, 0xd5, 0xce, 0x57, 0xe3, 0xf4, 0xe0, 0xd3, 0x2a, 0x4c, 0xaf, 0x62, 0xcf, - 0x9f, 0x53, 0xb9, 0xe8, 0x39, 0x12, 0xeb, 0x3f, 0xbe, 0x19, 0x43, 0x2e, 0xbe, 0x0f, 0x97, 0x01, - 0xe8, 0x1b, 0xfa, 0x8e, 0x51, 0x4c, 0x90, 0xa0, 0xe8, 0x98, 0xf1, 0xea, 0x1b, 0xa1, 0xe0, 0xf9, - 0x9f, 0xd9, 0x32, 0xf4, 0xd7, 0xc5, 0x0e, 0x57, 0x3e, 0x91, 0x65, 0xc3, 0x33, 0x74, 0x9a, 0x9f, - 0x1b, 0x9d, 0x24, 0x6d, 0x97, 0x18, 0x46, 0xfe, 0x3d, 0xda, 0x9f, 0x7f, 0xae, 0xc2, 0xb5, 0xb4, - 0x7d, 0x94, 0x7b, 0xbd, 0xa6, 0x67, 0x3b, 0x58, 0xc7, 0x6d, 0x6c, 0xf6, 0xbc, 0xbe, 0xf5, 0x3d, - 0x87, 0xa6, 0x06, 0x9b, 0xcd, 0xec, 0x15, 0xfd, 0xa4, 0x2a, 0x1b, 0xe1, 0xf7, 0x50, 0x7b, 0xec, - 0x2b, 0x2f, 0xa6, 0xb1, 0x7f, 0x5c, 0x91, 0x89, 0xd9, 0x9b, 0x92, 0x78, 0x3a, 0xa0, 0x7e, 0xe9, - 0x18, 0x80, 0x0a, 0x56, 0x6e, 0xf4, 0x6a, 0xa5, 0x5a, 0xdb, 0xf4, 0x07, 0x81, 0x9b, 0xe1, 0x86, - 0xcd, 0x2d, 0xbd, 0xb2, 0x56, 0x6e, 0x56, 0xb7, 0xf5, 0xea, 0x6a, 0xad, 0xd9, 0x62, 0x4e, 0x59, - 0xf4, 0xaf, 0x29, 0xed, 0x46, 0x38, 0xdb, 0xdc, 0x5a, 0x6a, 0x56, 0xf4, 0xda, 0x26, 0x49, 0xd7, - 0xab, 0xf5, 0xea, 0x05, 0xf6, 0x75, 0x1a, 0x7d, 0xb8, 0x04, 0xb3, 0xfe, 0x04, 0xa0, 0x49, 0xe7, - 0x05, 0xe8, 0x6f, 0xf2, 0x30, 0xab, 0x63, 0xd7, 0xee, 0x5e, 0x26, 0x73, 0x84, 0x49, 0x4d, 0x3d, - 0xbe, 0xa2, 0xca, 0x9e, 0xdf, 0xe6, 0x98, 0x5d, 0xe4, 0x18, 0x8d, 0x9f, 0x68, 0x1a, 0x97, 0x0d, - 0xb3, 0x6b, 0x5c, 0x64, 0x5d, 0xcd, 0xb4, 0x1e, 0x25, 0x68, 0x8b, 0xa0, 0xd9, 0x57, 0x2c, 0xec, - 0x34, 0xdb, 0x57, 0xaa, 0xde, 0x5e, 0xb9, 0xd3, 0x71, 0xb0, 0xeb, 0xb2, 0xd5, 0x8b, 0x01, 0x5f, - 0xb4, 0xdb, 0xe1, 0x24, 0x49, 0xe5, 0x32, 0x53, 0x07, 0x99, 0xfe, 0xe4, 0x30, 0x67, 0xd9, 0xba, - 0x1a, 0xe4, 0x2c, 0x70, 0x39, 0xa3, 0x64, 0xfe, 0xb8, 0x44, 0x51, 0x3c, 0xa5, 0x73, 0x0b, 0xcc, - 0x5a, 0xc6, 0x3e, 0xae, 0x3e, 0xda, 0x33, 0x1d, 0xec, 0x12, 0xc7, 0x18, 0x55, 0xe7, 0x93, 0xd0, - 0x47, 0xa5, 0xce, 0x9b, 0xcb, 0x49, 0x2c, 0x9d, 0xee, 0xaf, 0x8e, 0xa0, 0xfa, 0x03, 0xfa, 0x19, - 0x15, 0x7d, 0x58, 0x85, 0x39, 0xc6, 0x54, 0xd9, 0xba, 0x5a, 0xeb, 0xa0, 0x9b, 0x05, 0xe3, 0xd7, - 0xf0, 0xd3, 0x02, 0xe3, 0x97, 0xbc, 0xa0, 0xef, 0x56, 0x65, 0xdd, 0x9d, 0x07, 0x54, 0x9c, 0x94, - 0x11, 0xef, 0x38, 0xba, 0x63, 0x1f, 0x30, 0x47, 0xd5, 0x69, 0x9d, 0xbe, 0x64, 0xb9, 0xa8, 0x87, - 0x7e, 0x51, 0xca, 0x99, 0x5a, 0xb2, 0x1a, 0xc7, 0x04, 0xe0, 0x27, 0x55, 0x58, 0x60, 0x5c, 0x35, - 0xd9, 0x39, 0x1f, 0xa9, 0x03, 0x6f, 0xdf, 0x2b, 0x6d, 0x08, 0x0e, 0xa8, 0x3f, 0x2b, 0xe9, 0x71, - 0x03, 0xe4, 0x2f, 0x4b, 0x05, 0x47, 0x93, 0xae, 0xc8, 0x31, 0x41, 0xf9, 0x58, 0x1e, 0x66, 0xb7, - 0x5c, 0xec, 0x30, 0xbf, 0x7d, 0xf4, 0xa6, 0x3c, 0xa8, 0xab, 0x58, 0xd8, 0x48, 0x7d, 0x95, 0xb4, - 0x87, 0x2f, 0x5f, 0x59, 0x8e, 0xa8, 0x6f, 0x23, 0xc5, 0xc0, 0x76, 0x1b, 0x2c, 0x50, 0x91, 0x96, - 0x3d, 0xcf, 0x37, 0x12, 0x03, 0x6f, 0xda, 0xbe, 0xd4, 0x71, 0x6c, 0x15, 0x91, 0xb2, 0xfc, 0x2c, - 0x15, 0x9f, 0xa7, 0x75, 0xbc, 0x43, 0xe7, 0xb3, 0x79, 0xbd, 0x2f, 0x95, 0x5c, 0xae, 0xdf, 0xc3, - 0xf4, 0xfc, 0x0a, 0x97, 0xb9, 0x40, 0x32, 0x0f, 0xfa, 0x84, 0xfe, 0x46, 0xca, 0x57, 0x57, 0x5e, - 0x3a, 0xe9, 0x74, 0xa1, 0x37, 0x1e, 0x93, 0xe4, 0x34, 0x94, 0xfc, 0x1c, 0x64, 0xff, 0x45, 0xaf, - 0x36, 0x1b, 0xeb, 0xe7, 0xab, 0x83, 0x97, 0x31, 0x0a, 0xe8, 0x65, 0x2a, 0xcc, 0x2c, 0x39, 0xb6, - 0xd1, 0x69, 0x1b, 0xae, 0x87, 0xbe, 0xa6, 0xc0, 0xdc, 0xa6, 0x71, 0xb5, 0x6b, 0x1b, 0x1d, 0xe2, - 0xdf, 0xdf, 0xd7, 0x17, 0xf4, 0xe8, 0xa7, 0xa0, 0x2f, 0x60, 0xaf, 0xe2, 0xc1, 0xc0, 0xf0, 0xe8, - 0x5e, 0x4e, 0xe6, 0xba, 0xc6, 0x70, 0x9b, 0x4f, 0x19, 0x14, 0xac, 0x34, 0xe0, 0x6b, 0x91, 0xe7, - 0x29, 0xc6, 0xa2, 0xfc, 0xb0, 0x5c, 0xf8, 0x51, 0x19, 0x92, 0xc7, 0xb3, 0x2b, 0xff, 0xf2, 0x69, - 0x28, 0x2e, 0x63, 0x62, 0xc5, 0xfd, 0x77, 0x05, 0xa6, 0x9a, 0xd8, 0x23, 0x16, 0xdc, 0x3d, 0x82, - 0xa7, 0x70, 0x87, 0x64, 0x88, 0x9c, 0xd8, 0x83, 0x77, 0x7f, 0xb2, 0xce, 0x9d, 0xb7, 0x26, 0xcf, - 0x29, 0x3c, 0x12, 0x69, 0xb9, 0x8b, 0xac, 0xcc, 0x23, 0x79, 0x24, 0x26, 0x92, 0xca, 0xde, 0xd7, - 0xea, 0x3d, 0x0a, 0x73, 0xad, 0xe2, 0x7a, 0xbd, 0x1f, 0xe7, 0xf5, 0x33, 0xd1, 0xdb, 0x8c, 0x31, - 0x9f, 0xe0, 0x1c, 0xf5, 0x0c, 0x98, 0xa2, 0x32, 0x0f, 0xe6, 0xa3, 0xfd, 0x7e, 0x0a, 0x94, 0x04, - 0x39, 0x7b, 0x1d, 0xe4, 0x94, 0x74, 0x51, 0x8b, 0x2f, 0x7c, 0x22, 0x31, 0x08, 0xe6, 0xea, 0xd8, - 0xbb, 0x62, 0x3b, 0x97, 0x9a, 0x9e, 0xe1, 0x61, 0xf4, 0xcf, 0x0a, 0xa8, 0x4d, 0xec, 0xf1, 0xd1, - 0x4f, 0xea, 0x70, 0x8a, 0x56, 0x88, 0x65, 0x24, 0xfd, 0x37, 0xad, 0xc8, 0x2d, 0x03, 0x85, 0xc0, - 0xe5, 0xd3, 0x0f, 0xff, 0x8a, 0x7e, 0x68, 0x60, 0xd0, 0x27, 0x65, 0xc0, 0xa4, 0x81, 0x49, 0x86, - 0x67, 0xd0, 0x57, 0xb0, 0x18, 0x3d, 0xfd, 0x88, 0x94, 0x59, 0x2d, 0x47, 0xf3, 0x78, 0xba, 0x82, - 0xc7, 0x9e, 0x04, 0xf9, 0xca, 0x9e, 0xe1, 0xa1, 0x77, 0xab, 0x00, 0xe5, 0x4e, 0x67, 0x83, 0xfa, - 0x80, 0xf3, 0x0e, 0x69, 0xe7, 0x60, 0xae, 0xbd, 0x67, 0x44, 0x37, 0x67, 0xd0, 0xfe, 0x40, 0x48, - 0xd3, 0x9e, 0x19, 0x39, 0x93, 0x53, 0xa9, 0xa2, 0x3e, 0x98, 0xfc, 0x32, 0x18, 0xed, 0xd0, 0xd1, - 0x5c, 0x0c, 0x85, 0x99, 0x78, 0x84, 0xce, 0xff, 0x7d, 0x31, 0x62, 0x2f, 0x7e, 0x0e, 0xc7, 0x48, - 0x87, 0x07, 0x6c, 0xa2, 0x84, 0x94, 0x27, 0xbd, 0xe5, 0x02, 0x7a, 0x24, 0xf3, 0x35, 0x91, 0xd0, - 0xb5, 0x5a, 0xb5, 0x63, 0x06, 0xa2, 0x65, 0x01, 0xb3, 0xd0, 0x2b, 0x73, 0xe9, 0xe0, 0x4b, 0x16, - 0xdc, 0xf3, 0x60, 0x1e, 0x77, 0x4c, 0x0f, 0x07, 0xb5, 0x64, 0x02, 0x4c, 0x82, 0x58, 0xfc, 0x01, - 0xbd, 0x44, 0x3a, 0xe8, 0x1a, 0x11, 0xe8, 0xe1, 0x1a, 0xc5, 0xb4, 0x3f, 0xb9, 0x30, 0x6a, 0x72, - 0x34, 0xb3, 0x07, 0xeb, 0x3b, 0x54, 0xb8, 0xb6, 0x65, 0xef, 0xee, 0x76, 0x71, 0x20, 0x26, 0x4c, - 0xbd, 0x33, 0x91, 0x31, 0x4e, 0xb8, 0xc8, 0x4e, 0x90, 0xfd, 0x88, 0x19, 0x1e, 0x25, 0xf3, 0x5f, - 0xc4, 0x13, 0x53, 0x89, 0xb3, 0x28, 0x22, 0xae, 0x81, 0x7c, 0xc6, 0xa0, 0x20, 0x17, 0xf0, 0x59, - 0x9a, 0x6c, 0xf6, 0x40, 0x7c, 0x56, 0x81, 0x79, 0x7a, 0x2f, 0x62, 0xa0, 0xa0, 0x0f, 0x8d, 0x11, - 0x00, 0xf4, 0xb5, 0x9c, 0xac, 0x9f, 0x2d, 0x91, 0x89, 0xc0, 0x49, 0x8c, 0x88, 0xe5, 0x82, 0xaa, - 0x0c, 0x25, 0x37, 0x81, 0x9b, 0x3a, 0xf3, 0x30, 0xbb, 0x8a, 0x83, 0x96, 0xe6, 0xa2, 0xf7, 0xa7, - 0xec, 0x89, 0xce, 0xc1, 0x1c, 0xb9, 0x1c, 0xac, 0xc1, 0x8e, 0x49, 0xd2, 0x55, 0x33, 0x21, 0x4d, - 0xbb, 0x15, 0xe6, 0x2f, 0xe2, 0x1d, 0xdb, 0xc1, 0x0d, 0xe1, 0x2c, 0xa5, 0x98, 0x38, 0x38, 0x3c, - 0x9d, 0x76, 0x3b, 0x9c, 0x64, 0x8e, 0xee, 0x4b, 0xfe, 0x5c, 0xdf, 0x70, 0xae, 0xb2, 0x83, 0x69, - 0xfd, 0xc9, 0xe8, 0xcf, 0xf9, 0x06, 0xb3, 0x24, 0xa2, 0x78, 0xe7, 0x61, 0xb1, 0x73, 0x95, 0x8e, - 0x19, 0x9d, 0x9e, 0x05, 0xd3, 0x4c, 0x47, 0x02, 0x83, 0x2e, 0xa9, 0x07, 0x0d, 0xf3, 0x6a, 0xcf, - 0x82, 0x19, 0x5f, 0x44, 0xc4, 0x6e, 0x60, 0x5d, 0xef, 0xd9, 0x01, 0x3f, 0x92, 0xef, 0x7a, 0x94, - 0x15, 0xfd, 0x44, 0xa8, 0x33, 0x55, 0x41, 0x67, 0x9e, 0x9e, 0x86, 0xf9, 0x89, 0xdc, 0x4f, 0x5e, - 0xe2, 0xca, 0x5f, 0xba, 0x5a, 0xeb, 0xb8, 0x68, 0x23, 0x9d, 0xd6, 0xdc, 0x04, 0x10, 0x36, 0xbf, - 0x20, 0x70, 0x06, 0x97, 0x22, 0xc6, 0xc6, 0x4f, 0x3c, 0x0a, 0xd8, 0x2f, 0x0e, 0xc2, 0xce, 0x78, - 0x01, 0x95, 0x3c, 0x42, 0x28, 0xc3, 0x49, 0xf6, 0xe8, 0xfc, 0x58, 0x1e, 0xae, 0x0d, 0x4f, 0x38, - 0xad, 0x1b, 0x6e, 0xd4, 0xb2, 0x1f, 0x4e, 0x07, 0x91, 0x70, 0xa4, 0x24, 0x6c, 0x8e, 0xa7, 0xa1, - 0xe0, 0x1e, 0x5c, 0x0c, 0x1d, 0x01, 0xe9, 0x0b, 0x7a, 0xab, 0x9a, 0x6a, 0xac, 0x1a, 0xc8, 0xdf, - 0x98, 0x1b, 0xe1, 0x9d, 0x70, 0xca, 0x3a, 0xd8, 0x0f, 0xb1, 0x20, 0x3d, 0x0d, 0xeb, 0x59, 0x0e, - 0x7f, 0x10, 0x9b, 0x6c, 0x5e, 0xbe, 0xc9, 0xa6, 0x18, 0x49, 0x65, 0x2a, 0x9d, 0xbd, 0x7a, 0x7c, - 0xaa, 0xef, 0x08, 0x5a, 0x25, 0xb5, 0x52, 0x50, 0xf8, 0x15, 0x1e, 0xfe, 0x7f, 0xcc, 0xa5, 0xea, - 0x79, 0x87, 0x9f, 0x5c, 0x4b, 0xd1, 0x13, 0x1e, 0xe7, 0xb1, 0xb5, 0xcf, 0x28, 0x80, 0x9a, 0x91, - 0x43, 0x0e, 0x03, 0x75, 0xd3, 0xc1, 0x97, 0x4d, 0x7c, 0x45, 0x70, 0xdf, 0x7a, 0x9b, 0x74, 0x1c, - 0x6a, 0x51, 0x57, 0x0e, 0x11, 0x8d, 0x5f, 0x17, 0x1f, 0x80, 0x8b, 0x5c, 0xbc, 0xe9, 0x74, 0x25, - 0x66, 0x2f, 0xd5, 0xdf, 0xcf, 0xc3, 0x9c, 0x8e, 0x8d, 0x4e, 0xd8, 0x71, 0xfd, 0x5f, 0x9c, 0x49, - 0xf2, 0x1c, 0xc8, 0x7b, 0xd1, 0xda, 0xc2, 0x93, 0x0f, 0x57, 0x84, 0xff, 0x93, 0xbc, 0x90, 0x25, - 0x06, 0xf2, 0xd3, 0x21, 0x0d, 0x57, 0x24, 0xec, 0x19, 0x55, 0xc6, 0x9e, 0xc9, 0x0f, 0xb2, 0x67, - 0x6e, 0x87, 0x93, 0x5d, 0xc3, 0xf5, 0x96, 0x2f, 0xb6, 0xcc, 0x7d, 0xec, 0x7a, 0xc6, 0x7e, 0x8f, - 0x58, 0x2e, 0xaa, 0xde, 0x9f, 0x2c, 0xde, 0x5d, 0x9e, 0x78, 0x86, 0x69, 0x50, 0x15, 0x8f, 0x1e, - 0xe7, 0xf5, 0x43, 0x52, 0x07, 0x96, 0x86, 0x95, 0x9d, 0x4e, 0x33, 0x1e, 0x1c, 0x61, 0x3d, 0xe4, - 0x0c, 0x68, 0x1b, 0xd5, 0x66, 0xb3, 0xbc, 0x4a, 0xce, 0x31, 0x04, 0x8e, 0x2d, 0x9d, 0x73, 0x4f, - 0xf2, 0xc5, 0x47, 0x91, 0xd6, 0xe6, 0xa2, 0xf1, 0xa2, 0x74, 0x42, 0x9b, 0x85, 0x29, 0x07, 0xf7, - 0xba, 0x26, 0x76, 0x4b, 0x39, 0xf4, 0x55, 0x05, 0x8a, 0x5b, 0x96, 0x83, 0x8d, 0x0e, 0x7a, 0x7e, - 0x7c, 0xb7, 0x37, 0xa2, 0x52, 0x88, 0xb1, 0x9a, 0x12, 0x57, 0x12, 0x59, 0xbf, 0xe5, 0x33, 0x32, - 0x16, 0xf8, 0xe4, 0x96, 0x10, 0xe3, 0x4b, 0xcd, 0xbc, 0x49, 0x9f, 0x9b, 0x82, 0x42, 0x75, 0xbf, - 0xe7, 0x5d, 0x3d, 0xf7, 0x24, 0x98, 0x6f, 0x7a, 0x0e, 0x36, 0xf6, 0xb9, 0x8d, 0x60, 0xcf, 0xbe, - 0x84, 0xad, 0x60, 0x23, 0x98, 0xbc, 0xdc, 0x7b, 0x0f, 0x4c, 0x59, 0xf6, 0xb6, 0x71, 0xe0, 0xed, - 0x69, 0x37, 0x1f, 0x8a, 0xa0, 0xc2, 0xd4, 0xaf, 0xc1, 0x42, 0xd6, 0x7d, 0xe9, 0x3e, 0x32, 0x1d, - 0x28, 0x5a, 0x76, 0xf9, 0xc0, 0xdb, 0x5b, 0xba, 0xf1, 0x93, 0x7f, 0x72, 0x53, 0xee, 0xd3, 0x7f, - 0x72, 0x53, 0xee, 0x8b, 0x7f, 0x72, 0x53, 0xee, 0x7b, 0xff, 0xf4, 0xa6, 0x13, 0x9f, 0xfe, 0xd3, - 0x9b, 0x4e, 0x7c, 0xf6, 0x4f, 0x6f, 0x3a, 0xf1, 0x4d, 0x4a, 0xef, 0xe2, 0xc5, 0x22, 0xa1, 0xf2, - 0x8c, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xe6, 0x5f, 0xbf, 0xe6, 0x92, 0x1a, 0x02, 0x00, + 0x55, 0x37, 0x3a, 0x55, 0x59, 0x55, 0xdd, 0x7d, 0xfa, 0x63, 0x6a, 0x72, 0x67, 0x66, 0x67, 0x63, + 0x97, 0xd9, 0x75, 0x58, 0x96, 0x75, 0x59, 0x7a, 0x61, 0x41, 0x64, 0x97, 0x5d, 0x96, 0xea, 0xea, + 0xea, 0xee, 0xda, 0xed, 0xae, 0x6a, 0xb2, 0xaa, 0x67, 0x58, 0xdf, 0xeb, 0x2d, 0x73, 0xaa, 0xa2, + 0xbb, 0x73, 0xa7, 0x3a, 0xb3, 0xc8, 0xcc, 0x9e, 0xd9, 0xe6, 0x3e, 0xef, 0x7d, 0x45, 0x44, 0x50, + 0x44, 0x44, 0x45, 0x45, 0x05, 0x04, 0x44, 0x04, 0x45, 0xe4, 0xfb, 0x05, 0xe5, 0x43, 0x05, 0x41, + 0x44, 0x45, 0xf1, 0x03, 0x50, 0xae, 0xe0, 0x27, 0xbe, 0x8f, 0x5e, 0xaf, 0x5e, 0x05, 0xf1, 0xd5, + 0xd7, 0xfb, 0x64, 0x44, 0x64, 0x66, 0x44, 0x75, 0x65, 0x56, 0x64, 0x75, 0x65, 0xf5, 0x2a, 0xf7, + 0xbf, 0xcc, 0xc8, 0xc8, 0x13, 0x27, 0xce, 0xef, 0x44, 0xc4, 0x89, 0x88, 0x13, 0x27, 0xe0, 0x5c, + 0xef, 0xf2, 0x5d, 0x3d, 0xdb, 0x72, 0x2d, 0xe7, 0xae, 0xb6, 0xb5, 0xb7, 0xa7, 0x9b, 0x1d, 0x67, + 0x91, 0xbc, 0xab, 0x53, 0xba, 0x79, 0xe0, 0x1e, 0xf4, 0x30, 0xba, 0xb5, 0x77, 0x65, 0xe7, 0xae, + 0xae, 0x71, 0xf9, 0xae, 0xde, 0xe5, 0xbb, 0xf6, 0xac, 0x0e, 0xee, 0xfa, 0x3f, 0x90, 0x17, 0x96, + 0x1d, 0xdd, 0x1e, 0x95, 0xab, 0x6b, 0xb5, 0xf5, 0xae, 0xe3, 0x5a, 0x36, 0x66, 0x39, 0xcf, 0x86, + 0x45, 0xe2, 0xab, 0xd8, 0x74, 0x7d, 0x0a, 0x37, 0xed, 0x58, 0xd6, 0x4e, 0x17, 0xd3, 0x6f, 0x97, + 0xf7, 0xb7, 0xef, 0x72, 0x5c, 0x7b, 0xbf, 0xed, 0xb2, 0xaf, 0xb7, 0xf4, 0x7f, 0xed, 0x60, 0xa7, + 0x6d, 0x1b, 0x3d, 0xd7, 0xb2, 0x69, 0x8e, 0x0b, 0x7f, 0xf3, 0x9e, 0x69, 0x50, 0xb4, 0x5e, 0x1b, + 0x7d, 0x65, 0x0a, 0x94, 0x52, 0xaf, 0x87, 0x3e, 0x96, 0x05, 0x58, 0xc5, 0xee, 0x45, 0x6c, 0x3b, + 0x86, 0x65, 0xa2, 0x93, 0x30, 0xa5, 0xe1, 0xe7, 0xef, 0x63, 0xc7, 0xbd, 0x37, 0xf7, 0xd2, 0xbf, + 0x54, 0x32, 0xe8, 0x4d, 0x59, 0x98, 0xd6, 0xb0, 0xd3, 0xb3, 0x4c, 0x07, 0xab, 0xcf, 0x81, 0x3c, + 0xb6, 0x6d, 0xcb, 0x3e, 0x97, 0xb9, 0x25, 0x73, 0xfb, 0xec, 0xdd, 0x77, 0x2c, 0xb2, 0xea, 0x2f, + 0x6a, 0xbd, 0xf6, 0x62, 0xa9, 0xd7, 0x5b, 0x0c, 0x29, 0x2d, 0xfa, 0x3f, 0x2d, 0x56, 0xbc, 0x3f, + 0x34, 0xfa, 0xa3, 0x7a, 0x0e, 0xa6, 0xae, 0xd2, 0x0c, 0xe7, 0xb2, 0xb7, 0x64, 0x6e, 0x9f, 0xd1, + 0xfc, 0x57, 0xef, 0x4b, 0x07, 0xbb, 0xba, 0xd1, 0x75, 0xce, 0x29, 0xf4, 0x0b, 0x7b, 0x45, 0x6f, + 0xc8, 0x40, 0x9e, 0x10, 0x51, 0xcb, 0x90, 0x6b, 0x5b, 0x1d, 0x4c, 0x8a, 0x5f, 0xb8, 0xfb, 0x2e, + 0xf9, 0xe2, 0x17, 0xcb, 0x56, 0x07, 0x6b, 0xe4, 0x67, 0xf5, 0x16, 0x98, 0xf5, 0xc5, 0x12, 0xb2, + 0xc1, 0x27, 0x5d, 0xb8, 0x1b, 0x72, 0x5e, 0x7e, 0x75, 0x1a, 0x72, 0xb5, 0xad, 0xf5, 0xf5, 0xe2, + 0x09, 0xf5, 0x14, 0xcc, 0x6f, 0xd5, 0x1e, 0xaa, 0xd5, 0x2f, 0xd5, 0x5a, 0x15, 0x4d, 0xab, 0x6b, + 0xc5, 0x8c, 0x3a, 0x0f, 0x33, 0x4b, 0xa5, 0xe5, 0x56, 0xb5, 0xb6, 0xb9, 0xd5, 0x2c, 0x66, 0xd1, + 0x6b, 0x15, 0x58, 0x68, 0x60, 0x77, 0x19, 0x5f, 0x35, 0xda, 0xb8, 0xe1, 0xea, 0x2e, 0x46, 0xaf, + 0xc8, 0x04, 0xc2, 0x54, 0xb7, 0xbc, 0x42, 0x83, 0x4f, 0xac, 0x02, 0x4f, 0x3b, 0x54, 0x01, 0x91, + 0xc2, 0x22, 0xfb, 0x7b, 0x91, 0x4b, 0xd3, 0x78, 0x3a, 0x17, 0x9e, 0x0c, 0xb3, 0xdc, 0x37, 0x75, + 0x01, 0x60, 0xa9, 0x54, 0x7e, 0x68, 0x55, 0xab, 0x6f, 0xd5, 0x96, 0x8b, 0x27, 0xbc, 0xf7, 0x95, + 0xba, 0x56, 0x61, 0xef, 0x19, 0xf4, 0xb5, 0x0c, 0x07, 0xe6, 0xb2, 0x08, 0xe6, 0xe2, 0x70, 0x66, + 0x06, 0x00, 0x8a, 0x7e, 0x3a, 0x00, 0x67, 0x55, 0x00, 0xe7, 0x69, 0xc9, 0xc8, 0xa5, 0x0f, 0xd0, + 0x8b, 0xb3, 0x30, 0xdd, 0xd8, 0xdd, 0x77, 0x3b, 0xd6, 0x35, 0x13, 0xcd, 0x04, 0xc8, 0xa0, 0xbf, + 0xe5, 0x65, 0xf2, 0x6c, 0x51, 0x26, 0xb7, 0x1f, 0xae, 0x04, 0xa3, 0x10, 0x21, 0x8d, 0x9f, 0x0c, + 0xa4, 0x51, 0x12, 0xa4, 0xf1, 0x64, 0x59, 0x42, 0xe9, 0xcb, 0xe1, 0xc7, 0x9e, 0x09, 0xf9, 0x46, + 0x4f, 0x6f, 0x63, 0xf4, 0x29, 0x05, 0xe6, 0xd6, 0xb1, 0x7e, 0x15, 0x97, 0x7a, 0x3d, 0xdb, 0xba, + 0x8a, 0x51, 0x39, 0xd4, 0xd7, 0x73, 0x30, 0xe5, 0x78, 0x99, 0xaa, 0x1d, 0x52, 0x83, 0x19, 0xcd, + 0x7f, 0x55, 0xcf, 0x03, 0x18, 0x1d, 0x6c, 0xba, 0x86, 0x6b, 0x60, 0xe7, 0x5c, 0xf6, 0x16, 0xe5, + 0xf6, 0x19, 0x8d, 0x4b, 0x41, 0x5f, 0xc9, 0xca, 0xea, 0x18, 0xe1, 0x62, 0x91, 0xe7, 0x20, 0x42, + 0xaa, 0x6f, 0xcc, 0xca, 0xe8, 0xd8, 0x50, 0x72, 0xc9, 0x64, 0xfb, 0xf3, 0x99, 0xe4, 0xc2, 0xf5, + 0x72, 0xd4, 0xea, 0xad, 0xc6, 0x56, 0x79, 0xad, 0xd5, 0xd8, 0x2c, 0x95, 0x2b, 0x45, 0xac, 0x9e, + 0x86, 0x22, 0x79, 0x6c, 0x55, 0x1b, 0xad, 0xe5, 0xca, 0x7a, 0xa5, 0x59, 0x59, 0x2e, 0x6e, 0xab, + 0x2a, 0x2c, 0x68, 0x95, 0xe7, 0x6e, 0x55, 0x1a, 0xcd, 0xd6, 0x4a, 0xa9, 0xba, 0x5e, 0x59, 0x2e, + 0xee, 0x78, 0x3f, 0xaf, 0x57, 0x37, 0xaa, 0xcd, 0x96, 0x56, 0x29, 0x95, 0xd7, 0x2a, 0xcb, 0xc5, + 0x5d, 0xf5, 0x7a, 0xb8, 0xae, 0x56, 0x6f, 0x95, 0x36, 0x37, 0xb5, 0xfa, 0xc5, 0x4a, 0x8b, 0xfd, + 0xd1, 0x28, 0x1a, 0xb4, 0xa0, 0x66, 0xab, 0xb1, 0x56, 0xd2, 0x2a, 0xa5, 0xa5, 0xf5, 0x4a, 0xf1, + 0x11, 0xf4, 0x22, 0x05, 0xe6, 0x37, 0xf4, 0x2b, 0xb8, 0xb1, 0xab, 0xdb, 0x58, 0xbf, 0xdc, 0xc5, + 0xe8, 0xf1, 0x12, 0x78, 0xa2, 0x4f, 0xf1, 0x78, 0x55, 0x44, 0xbc, 0xee, 0x1a, 0x20, 0x60, 0xa1, + 0x88, 0x08, 0xc0, 0xfe, 0x39, 0x68, 0x06, 0x6b, 0x02, 0x60, 0x4f, 0x4f, 0x48, 0x2f, 0x19, 0x62, + 0xdf, 0xf1, 0x18, 0x40, 0x0c, 0x7d, 0x41, 0x81, 0x85, 0xaa, 0x79, 0xd5, 0x70, 0xf1, 0x2a, 0x36, + 0xb1, 0xed, 0x8d, 0x03, 0x52, 0x30, 0xbc, 0x49, 0xe1, 0x60, 0x58, 0x11, 0x61, 0x78, 0xca, 0x00, + 0xb1, 0x89, 0x65, 0x44, 0x8c, 0xb6, 0x37, 0xc1, 0x8c, 0x41, 0xf2, 0x95, 0x8d, 0x0e, 0x93, 0x58, + 0x98, 0xa0, 0xde, 0x0a, 0xf3, 0xf4, 0x65, 0xc5, 0xe8, 0xe2, 0x87, 0xf0, 0x01, 0x1b, 0x77, 0xc5, + 0x44, 0xf4, 0xbd, 0x41, 0xe3, 0xab, 0x0a, 0x58, 0x7e, 0x53, 0x52, 0xa6, 0x92, 0x81, 0xf9, 0xaa, + 0xc7, 0x42, 0xf3, 0x3b, 0xd4, 0xca, 0x0c, 0xf4, 0x6f, 0x59, 0x98, 0x6d, 0xb8, 0x56, 0xcf, 0x53, + 0x59, 0xc3, 0xdc, 0x91, 0x03, 0xf7, 0x13, 0x7c, 0x1b, 0x2b, 0x8b, 0xe0, 0x3e, 0x79, 0x80, 0x1c, + 0xb9, 0x02, 0x22, 0x5a, 0xd8, 0x57, 0x82, 0x16, 0xb6, 0x22, 0xa0, 0x72, 0x77, 0x22, 0x6a, 0xff, + 0x01, 0xdb, 0xd7, 0xab, 0x14, 0x28, 0xfa, 0x6a, 0xe6, 0x96, 0xf7, 0x6d, 0x1b, 0x9b, 0xae, 0x1c, + 0x08, 0x7f, 0xc4, 0x83, 0xb0, 0x26, 0x82, 0x70, 0x77, 0x8c, 0x32, 0xfb, 0xa5, 0xa4, 0xd8, 0xc6, + 0x3e, 0x12, 0xa0, 0xf9, 0x90, 0x80, 0xe6, 0x37, 0x27, 0x67, 0x2b, 0x19, 0xa4, 0x6b, 0x23, 0x20, + 0x7a, 0x1a, 0x8a, 0xde, 0x98, 0x54, 0x6e, 0x56, 0x2f, 0x56, 0x5a, 0xd5, 0xda, 0xc5, 0x6a, 0xb3, + 0x52, 0xc4, 0xe8, 0x07, 0x15, 0x98, 0xa3, 0xac, 0x69, 0xf8, 0xaa, 0x75, 0x45, 0xb2, 0xd7, 0xfb, + 0x42, 0x42, 0x63, 0x81, 0x2f, 0x21, 0xa2, 0x65, 0x7c, 0x4f, 0x02, 0x63, 0x21, 0x86, 0xdc, 0x63, + 0xa9, 0xb7, 0x3a, 0xd4, 0x0c, 0x76, 0x06, 0xb4, 0x96, 0x81, 0xbd, 0xd5, 0xab, 0x72, 0x00, 0xb4, + 0x92, 0x17, 0x0d, 0x7c, 0x0d, 0x6d, 0x84, 0x98, 0x08, 0x6a, 0x9b, 0x19, 0xaa, 0xb6, 0xd9, 0x41, + 0x6a, 0xfb, 0x3e, 0x7e, 0xcc, 0x5a, 0x12, 0xd1, 0xbb, 0x33, 0x52, 0xdc, 0x1e, 0x27, 0xd1, 0xb3, + 0x43, 0x5f, 0x51, 0xb2, 0xa2, 0xd5, 0x79, 0x13, 0xcc, 0x90, 0xc7, 0x9a, 0xbe, 0x87, 0x59, 0x1b, + 0x0a, 0x13, 0xd4, 0x0b, 0x30, 0x47, 0x33, 0xb6, 0x2d, 0xd3, 0xab, 0x4f, 0x8e, 0x64, 0x10, 0xd2, + 0x3c, 0x10, 0xdb, 0x36, 0xd6, 0x5d, 0xcb, 0x26, 0x34, 0xf2, 0x14, 0x44, 0x2e, 0x09, 0x7d, 0x39, + 0x68, 0x85, 0x15, 0x41, 0x73, 0x9e, 0x9a, 0xa4, 0x2a, 0xc9, 0xf4, 0xe6, 0xea, 0x68, 0xed, 0x8f, + 0xb6, 0xba, 0x96, 0x87, 0xf6, 0x0a, 0x99, 0xda, 0x61, 0xf5, 0x2c, 0xa8, 0x2c, 0xd5, 0xcb, 0x5b, + 0xae, 0xd7, 0x9a, 0x95, 0x5a, 0xb3, 0xb8, 0x3d, 0x50, 0xa3, 0x76, 0xd0, 0x1b, 0x73, 0x90, 0x7b, + 0xd0, 0x32, 0x4c, 0xf4, 0xe2, 0x8c, 0xa0, 0x12, 0x26, 0x76, 0xaf, 0x59, 0xf6, 0x95, 0xa0, 0xa1, + 0x86, 0x09, 0xf1, 0xd8, 0x84, 0xaa, 0xa4, 0x0c, 0x55, 0xa5, 0xdc, 0x20, 0x55, 0xfa, 0x01, 0x5e, + 0x95, 0xee, 0x13, 0x55, 0xe9, 0xb6, 0x01, 0xf2, 0xf7, 0x98, 0x8f, 0xe8, 0x00, 0x3e, 0x1e, 0x74, + 0x00, 0x0f, 0x08, 0x30, 0x3e, 0x49, 0x8e, 0x4c, 0x32, 0x00, 0x3f, 0x9f, 0x6a, 0xc3, 0x1f, 0x04, + 0xf5, 0x4e, 0x04, 0xd4, 0xbb, 0x03, 0xfa, 0x04, 0xe3, 0x70, 0xd7, 0xf1, 0xc8, 0xe1, 0x6e, 0xe2, + 0x8a, 0x7a, 0x06, 0x4e, 0x2d, 0x57, 0x57, 0x56, 0x2a, 0x5a, 0xa5, 0xd6, 0x6c, 0xd5, 0x2a, 0xcd, + 0x4b, 0x75, 0xed, 0xa1, 0x62, 0x17, 0xbd, 0x41, 0x01, 0xf0, 0x24, 0x54, 0xd6, 0xcd, 0x36, 0xee, + 0xca, 0xf5, 0xe8, 0xff, 0x77, 0x36, 0x59, 0x9f, 0x10, 0xd2, 0x8f, 0x80, 0xf3, 0x35, 0x59, 0xf9, + 0x56, 0x19, 0x49, 0x2c, 0x19, 0xa8, 0x6f, 0x7d, 0x2c, 0xd8, 0x9e, 0xd7, 0xc1, 0x49, 0x9f, 0x1e, + 0xcb, 0x3e, 0x78, 0xda, 0xf7, 0xf6, 0x1c, 0x2c, 0x30, 0x58, 0xfc, 0x79, 0xfc, 0x4b, 0x33, 0x32, + 0x13, 0x79, 0x04, 0xd3, 0x6c, 0xda, 0xee, 0x77, 0xef, 0xc1, 0xbb, 0xba, 0x0a, 0xb3, 0x3d, 0x6c, + 0xef, 0x19, 0x8e, 0x63, 0x58, 0x26, 0x5d, 0x90, 0x5b, 0xb8, 0xfb, 0x09, 0x81, 0xc4, 0xc9, 0xda, + 0xe5, 0xe2, 0xa6, 0x6e, 0xbb, 0x46, 0xdb, 0xe8, 0xe9, 0xa6, 0xbb, 0x19, 0x66, 0xd6, 0xf8, 0x3f, + 0xd1, 0x2b, 0x13, 0x4e, 0x6b, 0xc4, 0x9a, 0x44, 0xa8, 0xc4, 0x2f, 0x25, 0x98, 0x92, 0xc4, 0x12, + 0x4c, 0xa6, 0x16, 0x1f, 0x4b, 0x55, 0x2d, 0x06, 0xe0, 0xbd, 0xa3, 0xde, 0x00, 0x67, 0xaa, 0xb5, + 0x72, 0x5d, 0xd3, 0x2a, 0xe5, 0x66, 0x6b, 0xb3, 0xa2, 0x6d, 0x54, 0x1b, 0x8d, 0x6a, 0xbd, 0xd6, + 0x38, 0x4a, 0x6b, 0x47, 0x9f, 0x54, 0x02, 0x8d, 0x59, 0xc6, 0xed, 0xae, 0x61, 0x62, 0xf4, 0xc0, + 0x11, 0x15, 0x46, 0x5c, 0xf5, 0x91, 0xc7, 0x99, 0x95, 0x1f, 0x81, 0xf3, 0xeb, 0x93, 0xe3, 0x3c, + 0x98, 0xe0, 0x7f, 0xe2, 0xe6, 0xff, 0x05, 0x05, 0x4e, 0x71, 0x0d, 0x51, 0xc3, 0x7b, 0x63, 0x5b, + 0xc9, 0xfb, 0x0e, 0xbe, 0xed, 0x56, 0x45, 0x4c, 0x07, 0x59, 0xd3, 0x87, 0xd8, 0x88, 0x80, 0xf5, + 0xad, 0x01, 0xac, 0xeb, 0x02, 0xac, 0xcf, 0x1c, 0x81, 0x66, 0x32, 0x64, 0x7f, 0x21, 0x55, 0x64, + 0x6f, 0x80, 0x33, 0x9b, 0x25, 0xad, 0x59, 0x2d, 0x57, 0x37, 0x4b, 0xde, 0x38, 0xca, 0x0d, 0xd9, + 0x11, 0xe6, 0xba, 0x08, 0xfa, 0x40, 0x7c, 0x3f, 0x9c, 0x83, 0x9b, 0x06, 0x77, 0xb4, 0xe5, 0x5d, + 0xdd, 0xdc, 0xc1, 0xc8, 0x90, 0x81, 0x7a, 0x19, 0xa6, 0xda, 0x24, 0x3b, 0xc5, 0x99, 0xdf, 0xba, + 0x89, 0xe9, 0xcb, 0x69, 0x09, 0x9a, 0xff, 0x2b, 0x7a, 0x17, 0xaf, 0x10, 0x4d, 0x51, 0x21, 0x9e, + 0x1d, 0x0f, 0xde, 0x21, 0xbe, 0x23, 0x74, 0xe3, 0xd3, 0x81, 0x6e, 0x5c, 0x12, 0x74, 0xa3, 0x7c, + 0x34, 0xf2, 0xc9, 0xd4, 0xe4, 0x37, 0x1e, 0x0b, 0x1d, 0x40, 0xa4, 0x36, 0x19, 0xd1, 0xa3, 0xc2, + 0xc0, 0xee, 0xfe, 0x75, 0x0a, 0x14, 0x96, 0x71, 0x17, 0xcb, 0xae, 0x44, 0xfe, 0x5d, 0x56, 0x76, + 0x43, 0x84, 0xc2, 0x40, 0x69, 0x47, 0xaf, 0x8e, 0xb8, 0xc6, 0x1e, 0x76, 0x5c, 0x7d, 0xaf, 0x47, + 0x44, 0xad, 0x68, 0x61, 0x02, 0xfa, 0xce, 0xac, 0xcc, 0x76, 0x49, 0x4c, 0x31, 0xff, 0x39, 0xd6, + 0x14, 0x3f, 0x93, 0x85, 0xe9, 0x06, 0x76, 0xeb, 0x76, 0x07, 0xdb, 0xa8, 0x11, 0x62, 0x74, 0x0b, + 0xcc, 0x12, 0x50, 0xbc, 0x69, 0x66, 0x80, 0x13, 0x9f, 0xa4, 0xde, 0x06, 0x0b, 0xc1, 0x2b, 0xf9, + 0x9d, 0x75, 0xe3, 0x7d, 0xa9, 0xe8, 0xef, 0x33, 0xb2, 0xbb, 0xb8, 0x6c, 0xc9, 0x90, 0x71, 0x13, + 0xd1, 0x4a, 0xe5, 0x76, 0x64, 0x63, 0x49, 0xa5, 0xbf, 0xd1, 0xf5, 0x8e, 0x2c, 0xc0, 0x96, 0xe9, + 0xf8, 0x72, 0x7d, 0x52, 0x02, 0xb9, 0xa2, 0x7f, 0xca, 0x24, 0x9b, 0xc5, 0x84, 0xe5, 0x44, 0x48, + 0xec, 0xa7, 0x12, 0xac, 0x2d, 0x44, 0x12, 0x4b, 0x5f, 0x66, 0x9f, 0x3d, 0x09, 0x85, 0x4b, 0x7a, + 0xb7, 0x8b, 0x5d, 0xf4, 0x5a, 0x05, 0x0a, 0x65, 0x1b, 0xeb, 0x2e, 0x46, 0x38, 0x14, 0x1d, 0x82, + 0x69, 0xdb, 0xb2, 0xdc, 0x4d, 0xdd, 0xdd, 0x65, 0x72, 0x0b, 0xde, 0xd5, 0x67, 0xc2, 0xf5, 0xdb, + 0xfb, 0xdd, 0xae, 0x8b, 0x1f, 0x75, 0x37, 0x6d, 0x63, 0x4f, 0xb7, 0x0f, 0xd6, 0x75, 0x73, 0x67, + 0x5f, 0xdf, 0xc1, 0x8c, 0xbd, 0xa8, 0xcf, 0xcc, 0xd5, 0xe0, 0xe7, 0xf8, 0x8e, 0xe7, 0x01, 0x51, + 0xe8, 0xdf, 0x28, 0xc8, 0x89, 0xb2, 0xb8, 0x48, 0xd9, 0x8b, 0xe8, 0x79, 0x10, 0x4c, 0xef, 0x99, + 0x78, 0xcf, 0x32, 0x8d, 0xb6, 0x6f, 0xad, 0xfa, 0xef, 0xe8, 0x57, 0x02, 0x34, 0x96, 0x04, 0x34, + 0x16, 0xa5, 0x4b, 0x49, 0x06, 0x45, 0x63, 0x84, 0x7e, 0xe7, 0x66, 0xb8, 0x91, 0x76, 0x23, 0xad, + 0x66, 0xbd, 0x55, 0xd6, 0x2a, 0xa5, 0x66, 0xa5, 0xb5, 0x5e, 0x2f, 0x97, 0xd6, 0x5b, 0x5a, 0x65, + 0xb3, 0x5e, 0xc4, 0xde, 0xec, 0x7c, 0x4a, 0xc3, 0x6d, 0xeb, 0x2a, 0xb6, 0xd1, 0x0b, 0x33, 0x72, + 0x10, 0xc5, 0x08, 0x25, 0x0e, 0x3e, 0x45, 0x06, 0xbe, 0x1f, 0x90, 0xf6, 0x14, 0x61, 0x82, 0x65, + 0xcc, 0x47, 0xb4, 0x98, 0x5f, 0x95, 0xea, 0x63, 0x62, 0x49, 0x3d, 0x06, 0x40, 0xfa, 0xc7, 0x2c, + 0x4c, 0x95, 0x2d, 0xf3, 0x2a, 0xb6, 0x5d, 0x7e, 0x92, 0xc5, 0xe3, 0x90, 0xe9, 0xc3, 0xe1, 0x1c, + 0x4c, 0x61, 0xd3, 0xb5, 0xad, 0x9e, 0x3f, 0xcb, 0xf2, 0x5f, 0xd1, 0x9b, 0x93, 0x4a, 0x98, 0x95, + 0x1c, 0xbd, 0xda, 0x3a, 0xb8, 0x20, 0x81, 0x3d, 0xa5, 0xaf, 0xed, 0xbc, 0x21, 0x09, 0x2e, 0x83, + 0x19, 0x48, 0xbf, 0x1f, 0xfb, 0xa2, 0x02, 0xf3, 0xb4, 0xdd, 0x36, 0x30, 0x31, 0x0b, 0x51, 0x9d, + 0x5f, 0xe7, 0xec, 0x13, 0xfe, 0xda, 0x09, 0x41, 0xfc, 0x05, 0xbd, 0xd7, 0x0b, 0xd6, 0xbc, 0xd7, + 0x4e, 0x68, 0xec, 0x9d, 0xaa, 0xf9, 0x52, 0x01, 0x72, 0xfa, 0xbe, 0xbb, 0x8b, 0xfe, 0x4d, 0x7a, + 0xc6, 0x2b, 0xf4, 0x23, 0x8c, 0x9f, 0x08, 0x48, 0x4e, 0x43, 0xde, 0xb5, 0xae, 0x60, 0x5f, 0x0e, + 0xf4, 0xc5, 0x83, 0x43, 0xef, 0xf5, 0x9a, 0xe4, 0x03, 0x83, 0xc3, 0x7f, 0xf7, 0x0c, 0x2c, 0xbd, + 0xdd, 0xb6, 0xf6, 0x4d, 0xb7, 0xea, 0xaf, 0x7b, 0x87, 0x09, 0xe8, 0xb3, 0x19, 0x99, 0x19, 0xb4, + 0x04, 0x83, 0xc9, 0x20, 0xbb, 0x3c, 0x42, 0x53, 0x5a, 0x84, 0x3b, 0x4a, 0x9b, 0x9b, 0xad, 0x66, + 0xfd, 0xa1, 0x4a, 0x2d, 0xb4, 0x76, 0x5b, 0xd5, 0x5a, 0xab, 0xb9, 0x56, 0x69, 0x95, 0xb7, 0x34, + 0xb2, 0x38, 0x59, 0x2a, 0x97, 0xeb, 0x5b, 0xb5, 0x66, 0x11, 0xa3, 0xb7, 0x65, 0x61, 0xae, 0xdc, + 0xb5, 0x9c, 0x00, 0xe1, 0x9b, 0x43, 0x84, 0x03, 0x31, 0x66, 0x38, 0x31, 0xa2, 0xff, 0x99, 0x91, + 0xf5, 0x74, 0xf0, 0x05, 0xc2, 0x91, 0x8f, 0xe8, 0xa5, 0xde, 0x2c, 0xe5, 0xe9, 0x30, 0x9c, 0x5e, + 0xfa, 0x4d, 0xe2, 0xf3, 0x15, 0x98, 0x2a, 0x51, 0xc5, 0x40, 0x7f, 0x92, 0x81, 0x42, 0xd9, 0x32, + 0xb7, 0x8d, 0x1d, 0xcf, 0x82, 0xc4, 0xa6, 0x7e, 0xb9, 0x8b, 0x97, 0x75, 0x57, 0xbf, 0x6a, 0xe0, + 0x6b, 0xa4, 0x02, 0xd3, 0x5a, 0x5f, 0xaa, 0xc7, 0x14, 0x4b, 0xc1, 0x97, 0xf7, 0x77, 0x08, 0x53, + 0xd3, 0x1a, 0x9f, 0xe4, 0x8d, 0x1f, 0xf4, 0x75, 0xd3, 0xc6, 0x36, 0xee, 0x62, 0xdd, 0xc1, 0xde, + 0x5c, 0xcc, 0xc4, 0x5d, 0xa2, 0xb4, 0xd3, 0x5a, 0xd4, 0x67, 0xf5, 0x02, 0xcc, 0xd1, 0x4f, 0xc4, + 0xfe, 0x71, 0x88, 0x1a, 0x4f, 0x6b, 0x42, 0x9a, 0xfa, 0x64, 0xc8, 0xe3, 0x47, 0x5d, 0x5b, 0x3f, + 0xd7, 0x21, 0x78, 0x5d, 0xbf, 0x48, 0x5d, 0x1d, 0x17, 0x7d, 0x57, 0xc7, 0xc5, 0x06, 0x71, 0x84, + 0xd4, 0x68, 0x2e, 0xf4, 0xc9, 0xe9, 0xc0, 0x7a, 0x79, 0x9b, 0x12, 0x2a, 0x86, 0x0a, 0x39, 0x53, + 0xdf, 0xc3, 0x4c, 0x2f, 0xc8, 0xb3, 0x7a, 0x07, 0x9c, 0xd4, 0xaf, 0xea, 0xae, 0x6e, 0xaf, 0x5b, + 0x6d, 0xbd, 0x4b, 0x86, 0x4d, 0xbf, 0xe5, 0xf7, 0x7f, 0x20, 0xdb, 0x50, 0xae, 0x65, 0x63, 0x92, + 0xcb, 0xdf, 0x86, 0xf2, 0x13, 0x3c, 0xea, 0x46, 0xdb, 0x32, 0x09, 0xff, 0x8a, 0x46, 0x9e, 0x3d, + 0xa9, 0x74, 0x0c, 0xc7, 0xab, 0x08, 0xa1, 0x52, 0xa3, 0xfb, 0x29, 0x8d, 0x03, 0xb3, 0x4d, 0xb6, + 0xa0, 0xa6, 0xb5, 0xa8, 0xcf, 0xea, 0x12, 0xcc, 0xb2, 0xdd, 0x97, 0x0d, 0x4f, 0xaf, 0x0a, 0x44, + 0xaf, 0x6e, 0x11, 0x1d, 0xc9, 0x28, 0x9e, 0x8b, 0xb5, 0x30, 0x9f, 0xc6, 0xff, 0xa4, 0x3e, 0x07, + 0x6e, 0x64, 0xaf, 0xe5, 0x7d, 0xc7, 0xb5, 0xf6, 0x28, 0xe8, 0x2b, 0x46, 0x97, 0xd6, 0x60, 0x8a, + 0xd4, 0x20, 0x2e, 0x8b, 0x7a, 0x37, 0x9c, 0xee, 0xd9, 0x78, 0x1b, 0xdb, 0x0f, 0xeb, 0x7b, 0xfb, + 0x8f, 0x36, 0x6d, 0xdd, 0x74, 0x7a, 0x96, 0xed, 0x9e, 0x9b, 0x26, 0xcc, 0x0f, 0xfc, 0xa6, 0xde, + 0x09, 0xa7, 0x1e, 0x71, 0x2c, 0xb3, 0xd4, 0x33, 0xd6, 0x0d, 0xc7, 0xc5, 0x66, 0xa9, 0xd3, 0xb1, + 0xcf, 0xcd, 0x90, 0xb2, 0x0e, 0x7f, 0x60, 0xdd, 0xea, 0x34, 0x14, 0xa8, 0xb0, 0xd1, 0x2b, 0xf2, + 0xd2, 0x1e, 0xa7, 0xac, 0xfa, 0xb1, 0x76, 0xe0, 0x53, 0x60, 0x8a, 0xf5, 0x87, 0x04, 0xd6, 0xd9, + 0xbb, 0xcf, 0xf6, 0x2d, 0x7d, 0x30, 0x2a, 0x9a, 0x9f, 0x4d, 0x7d, 0x1a, 0x14, 0xda, 0x44, 0x08, + 0x04, 0xe1, 0xd9, 0xbb, 0x6f, 0x1c, 0x5c, 0x28, 0xc9, 0xa2, 0xb1, 0xac, 0xe8, 0x73, 0x8a, 0x94, + 0x93, 0x6a, 0x1c, 0xc7, 0xc9, 0xfa, 0x80, 0x2f, 0x67, 0x47, 0xe8, 0x64, 0xef, 0x84, 0xdb, 0x59, + 0x0f, 0xca, 0xac, 0x95, 0xe5, 0xd6, 0xd2, 0x96, 0x3f, 0x5f, 0xf5, 0x6c, 0x98, 0x46, 0xb3, 0xa4, + 0x35, 0x5b, 0xb5, 0xfa, 0xb2, 0x37, 0xcf, 0xbd, 0x03, 0x6e, 0x1b, 0x92, 0xbb, 0xd2, 0x6c, 0xd5, + 0x4a, 0x1b, 0x95, 0xe2, 0xb6, 0x68, 0x09, 0x35, 0x9a, 0xf5, 0xcd, 0x96, 0xb6, 0x55, 0xab, 0x55, + 0x6b, 0xab, 0x94, 0x98, 0x67, 0x7a, 0x9e, 0x0d, 0x33, 0x5c, 0xd2, 0xaa, 0xcd, 0x4a, 0xab, 0x5c, + 0xaf, 0xad, 0x54, 0x57, 0x8b, 0xc6, 0x30, 0x33, 0xea, 0x11, 0xf5, 0x16, 0xb8, 0x49, 0xe0, 0xa4, + 0x5a, 0xaf, 0x79, 0x93, 0xef, 0x72, 0xa9, 0x56, 0xae, 0x78, 0x33, 0xed, 0x2b, 0x2a, 0x82, 0x33, + 0x94, 0x5c, 0x6b, 0xa5, 0xba, 0xce, 0xef, 0x97, 0x7d, 0x22, 0xa3, 0x9e, 0x83, 0xeb, 0xf8, 0x6f, + 0xd5, 0xda, 0xc5, 0xd2, 0x7a, 0x75, 0xb9, 0xf8, 0xeb, 0x19, 0xf5, 0x56, 0xb8, 0x59, 0xf8, 0x8b, + 0x6e, 0x7d, 0xb5, 0xaa, 0xcb, 0xad, 0x8d, 0x6a, 0x63, 0xa3, 0xd4, 0x2c, 0xaf, 0x15, 0x3f, 0x49, + 0x26, 0x26, 0x81, 0xa5, 0xcd, 0x79, 0x8e, 0xbe, 0x8a, 0xb7, 0x00, 0x4a, 0xa2, 0xa2, 0x3e, 0x69, + 0x20, 0xec, 0xf1, 0x16, 0xef, 0xc7, 0x82, 0xb1, 0x64, 0x59, 0x50, 0xa1, 0xa7, 0x24, 0xa0, 0x95, + 0x4c, 0x87, 0x9a, 0x23, 0xa8, 0xd0, 0x2d, 0x70, 0x53, 0xad, 0x42, 0x91, 0xd2, 0x2a, 0xe5, 0xfa, + 0xc5, 0x8a, 0xd6, 0xba, 0x54, 0x5a, 0x5f, 0xaf, 0x34, 0x5b, 0x2b, 0x55, 0xad, 0xd1, 0x2c, 0x6e, + 0xa3, 0x7f, 0xca, 0x06, 0x0b, 0x4e, 0x9c, 0xb4, 0xfe, 0x24, 0x9b, 0xb4, 0x59, 0xc7, 0x2e, 0x2c, + 0x7d, 0x13, 0x14, 0x1c, 0x57, 0x77, 0xf7, 0x1d, 0xd6, 0xaa, 0x1f, 0x37, 0xb8, 0x55, 0x2f, 0x36, + 0x48, 0x26, 0x8d, 0x65, 0x46, 0x9f, 0xcb, 0x24, 0x69, 0xa6, 0x63, 0x58, 0x73, 0x32, 0x46, 0x10, + 0xf1, 0x79, 0x40, 0xbe, 0xb6, 0x57, 0x1b, 0xad, 0xd2, 0xba, 0x56, 0x29, 0x2d, 0x3f, 0x1c, 0xac, + 0x34, 0x61, 0xf5, 0x0c, 0x9c, 0xda, 0xaa, 0x95, 0x96, 0xd6, 0x2b, 0xa4, 0xb9, 0xd4, 0x6b, 0xb5, + 0x4a, 0xd9, 0x93, 0xfb, 0x77, 0x92, 0x7d, 0x1d, 0xcf, 0xde, 0x26, 0x7c, 0x7b, 0x36, 0x11, 0x27, + 0xff, 0xbf, 0x94, 0x76, 0x7f, 0x0a, 0x35, 0x8c, 0xa7, 0x35, 0x5e, 0x1c, 0x3e, 0x2b, 0xe5, 0xf1, + 0x24, 0xc5, 0x49, 0x32, 0x3c, 0xbe, 0x6d, 0x04, 0x3c, 0xce, 0xc0, 0x29, 0x1e, 0x0f, 0xe2, 0xf9, + 0x14, 0x0d, 0xc3, 0x7b, 0x15, 0x98, 0xda, 0x30, 0x76, 0x88, 0xeb, 0xe7, 0x7e, 0x68, 0x7a, 0x2c, + 0x40, 0x36, 0xf0, 0xb4, 0xc9, 0x1a, 0x1d, 0x61, 0x9a, 0x9e, 0x95, 0x5f, 0x49, 0x91, 0x9a, 0x8a, + 0xbf, 0x2b, 0x71, 0xcf, 0xc4, 0x18, 0x8e, 0xe8, 0x99, 0xfe, 0x2c, 0x51, 0xcf, 0x34, 0x98, 0x56, + 0x32, 0x98, 0xec, 0xa3, 0xc1, 0xc4, 0x7b, 0xc6, 0xcc, 0xc1, 0x74, 0x30, 0x4e, 0x90, 0x4d, 0x1a, + 0xef, 0x63, 0xa5, 0x56, 0xdf, 0x5a, 0x5d, 0x6b, 0xad, 0x68, 0x95, 0x0a, 0x5b, 0xd6, 0xdd, 0x41, + 0xef, 0xcc, 0xc2, 0x3c, 0xe3, 0x9d, 0x79, 0x3c, 0xdc, 0x1c, 0x09, 0x1f, 0x13, 0xf4, 0xbf, 0xf3, + 0x53, 0x8a, 0x55, 0x51, 0xd0, 0x4f, 0x8d, 0x13, 0x4e, 0xac, 0xcb, 0xc3, 0x5b, 0x02, 0x71, 0x3f, + 0x28, 0x88, 0xfb, 0x19, 0x89, 0x29, 0xa6, 0x3f, 0xad, 0xf8, 0xeb, 0x19, 0x28, 0x34, 0x70, 0x17, + 0xb7, 0x5d, 0xf4, 0x23, 0xca, 0xc8, 0xda, 0x1e, 0x65, 0x22, 0x2b, 0x89, 0x4c, 0xe4, 0x5c, 0x0a, + 0x26, 0x72, 0x7e, 0x74, 0x13, 0xb9, 0x90, 0xd4, 0x44, 0x9e, 0x8a, 0x30, 0x91, 0xe3, 0xfa, 0x83, + 0x69, 0x99, 0xfe, 0xe0, 0xa3, 0x85, 0xa4, 0x63, 0x2f, 0x85, 0xf4, 0x78, 0x4d, 0xea, 0xef, 0xcb, + 0x27, 0x19, 0xab, 0x07, 0x72, 0x9c, 0x4c, 0xff, 0x5f, 0x93, 0x4b, 0x61, 0x09, 0x50, 0x7d, 0x3c, + 0xdc, 0x1c, 0xbe, 0xb7, 0x2a, 0xcf, 0xab, 0x36, 0x9a, 0x0d, 0x62, 0x47, 0x97, 0xeb, 0x9a, 0xb6, + 0xb5, 0x49, 0x37, 0x8f, 0xce, 0x82, 0x1a, 0x52, 0xd1, 0xb6, 0x6a, 0xd4, 0x6a, 0xde, 0x11, 0xa9, + 0xaf, 0x54, 0x6b, 0xcb, 0xad, 0x60, 0x24, 0xaa, 0xad, 0xd4, 0x8b, 0xbb, 0xea, 0x22, 0xdc, 0xc1, + 0x51, 0x27, 0x5d, 0x1b, 0x2d, 0xa1, 0x54, 0x5b, 0x6e, 0x6d, 0xd4, 0x2a, 0x1b, 0xf5, 0x5a, 0xb5, + 0x4c, 0xd2, 0x1b, 0x95, 0x66, 0xd1, 0xf0, 0xcc, 0xb7, 0x3e, 0x3b, 0xbd, 0x51, 0x29, 0x69, 0xe5, + 0xb5, 0x8a, 0x46, 0x8b, 0x7c, 0x44, 0xbd, 0x0d, 0x2e, 0x94, 0x6a, 0xf5, 0xa6, 0x97, 0x52, 0xaa, + 0x3d, 0xdc, 0x7c, 0x78, 0xb3, 0xd2, 0xda, 0xd4, 0xea, 0xe5, 0x4a, 0xa3, 0xe1, 0x8d, 0x7e, 0xcc, + 0xaa, 0x2f, 0x76, 0xd5, 0x67, 0xc3, 0xbd, 0x1c, 0x6b, 0x95, 0x26, 0xf1, 0x54, 0xd8, 0xa8, 0x13, + 0x67, 0xb5, 0xe5, 0x4a, 0x6b, 0xad, 0xd4, 0x68, 0x55, 0x6b, 0xe5, 0xfa, 0xc6, 0x66, 0xa9, 0x59, + 0xf5, 0x06, 0xc9, 0x4d, 0xad, 0xde, 0xac, 0xb7, 0x2e, 0x56, 0xb4, 0x46, 0xb5, 0x5e, 0x2b, 0x9a, + 0x5e, 0x95, 0xb9, 0x51, 0xd5, 0xb7, 0x6e, 0x2c, 0xf5, 0x26, 0x38, 0xe7, 0xa7, 0xaf, 0xd7, 0x3d, + 0x41, 0x73, 0x76, 0x7e, 0x8f, 0xb7, 0x8d, 0x1a, 0xcd, 0xba, 0x46, 0x2d, 0xfd, 0x8d, 0xea, 0xaa, + 0xe6, 0x4d, 0x4f, 0x8a, 0xcf, 0x4f, 0x75, 0x1e, 0xf0, 0x2f, 0x59, 0xc8, 0x35, 0x5c, 0xab, 0x87, + 0xbe, 0x31, 0xec, 0xe8, 0xce, 0x03, 0xd8, 0xc4, 0x31, 0x61, 0x59, 0x77, 0x75, 0xb6, 0x76, 0xc2, + 0xa5, 0xa0, 0x5f, 0x93, 0xde, 0x4d, 0x0d, 0x2d, 0x25, 0xab, 0x17, 0x31, 0x30, 0x7c, 0x4d, 0xee, + 0x78, 0x59, 0x34, 0xa1, 0x64, 0xed, 0xe1, 0x7b, 0x46, 0xd9, 0x2f, 0x45, 0x70, 0x96, 0x83, 0xd5, + 0x93, 0xbf, 0xaf, 0x32, 0x58, 0xbd, 0x1e, 0xae, 0xeb, 0x53, 0x3e, 0xa2, 0x73, 0xdb, 0xea, 0x37, + 0xc0, 0xe3, 0x38, 0xf5, 0xaf, 0x6c, 0xd4, 0x2f, 0x56, 0x02, 0x45, 0x5f, 0x2e, 0x35, 0x4b, 0xc5, + 0x1d, 0xf4, 0x19, 0x05, 0x72, 0x1b, 0xd6, 0xd5, 0xfe, 0x4d, 0x6c, 0x13, 0x5f, 0xe3, 0x76, 0x3a, + 0xfc, 0x57, 0xf1, 0x38, 0x8d, 0x94, 0xd8, 0x37, 0xa2, 0x1d, 0x56, 0x3e, 0x9b, 0x4d, 0x22, 0xf6, + 0x8d, 0xa3, 0x7a, 0xa9, 0xfc, 0xf5, 0x28, 0x62, 0x8f, 0x10, 0x2d, 0x56, 0x2f, 0xc0, 0xf9, 0xf0, + 0x43, 0x75, 0xb9, 0x52, 0x6b, 0x56, 0x57, 0x1e, 0x0e, 0x85, 0x5b, 0xd5, 0xa4, 0xc4, 0x3f, 0xac, + 0x9b, 0x8b, 0x9f, 0xdf, 0x9f, 0x83, 0xd3, 0xe1, 0xb7, 0xd5, 0x4a, 0xd3, 0xff, 0xf2, 0x08, 0x7a, + 0x71, 0x1e, 0xe6, 0x68, 0xb7, 0xbf, 0xd5, 0xeb, 0x78, 0x16, 0xf3, 0xd3, 0x42, 0x74, 0x6f, 0x87, + 0x93, 0xd5, 0xcd, 0x95, 0x46, 0xc3, 0xb5, 0x6c, 0x7d, 0x07, 0x93, 0x11, 0x92, 0x4a, 0xab, 0x3f, + 0x19, 0xbd, 0x47, 0x7a, 0x2d, 0x5e, 0x1c, 0x6a, 0x68, 0x99, 0x11, 0xa8, 0x7f, 0x51, 0x6a, 0xed, + 0x5c, 0x82, 0x60, 0x32, 0xf4, 0x1f, 0x19, 0x73, 0x9b, 0x8b, 0xc6, 0x65, 0xfb, 0xc2, 0x4b, 0xb2, + 0x30, 0xd3, 0x34, 0xf6, 0xf0, 0x0b, 0x2c, 0x13, 0x3b, 0xea, 0x14, 0x28, 0xab, 0x1b, 0xcd, 0xe2, + 0x09, 0xef, 0xc1, 0x9b, 0xca, 0x64, 0xc8, 0x43, 0xc5, 0x2b, 0xc0, 0x7b, 0x28, 0x35, 0x8b, 0x8a, + 0xf7, 0xb0, 0x51, 0x69, 0x16, 0x73, 0xde, 0x43, 0xad, 0xd2, 0x2c, 0xe6, 0xbd, 0x87, 0xcd, 0xf5, + 0x66, 0xb1, 0xe0, 0x3d, 0x54, 0x1b, 0xcd, 0xe2, 0x94, 0xf7, 0xb0, 0xd4, 0x68, 0x16, 0xa7, 0xbd, + 0x87, 0x8b, 0x8d, 0x66, 0x71, 0xc6, 0x7b, 0x28, 0x37, 0x9b, 0x45, 0xf0, 0x1e, 0x1e, 0x6c, 0x34, + 0x8b, 0xb3, 0xde, 0x43, 0xa9, 0xdc, 0x2c, 0xce, 0x91, 0x87, 0x4a, 0xb3, 0x38, 0xef, 0x3d, 0x34, + 0x1a, 0xcd, 0xe2, 0x02, 0xa1, 0xdc, 0x68, 0x16, 0x4f, 0x92, 0xb2, 0xaa, 0xcd, 0x62, 0xd1, 0x7b, + 0x58, 0x6b, 0x34, 0x8b, 0xa7, 0x48, 0xe6, 0x46, 0xb3, 0xa8, 0x92, 0x42, 0x1b, 0xcd, 0xe2, 0x75, + 0x24, 0x4f, 0xa3, 0x59, 0x3c, 0x4d, 0x8a, 0x68, 0x34, 0x8b, 0x67, 0x08, 0x1b, 0x95, 0x66, 0xf1, + 0x2c, 0xc9, 0xa3, 0x35, 0x8b, 0xd7, 0x93, 0x4f, 0xb5, 0x66, 0xf1, 0x1c, 0x61, 0xac, 0xd2, 0x2c, + 0xde, 0x40, 0x1e, 0xb4, 0x66, 0x11, 0x91, 0x4f, 0xa5, 0x66, 0xf1, 0x46, 0xf4, 0x38, 0x98, 0x59, + 0xc5, 0x2e, 0x05, 0x11, 0x15, 0x41, 0x59, 0xc5, 0x2e, 0x3f, 0x79, 0x7e, 0x6d, 0x0e, 0xae, 0x67, + 0x0b, 0x2e, 0x2b, 0xb6, 0xb5, 0xb7, 0x8e, 0x77, 0xf4, 0xf6, 0x41, 0xe5, 0x51, 0xcf, 0x94, 0x43, + 0x2f, 0xcf, 0x08, 0xeb, 0xcb, 0xbd, 0xb0, 0x37, 0x22, 0xcf, 0xb1, 0xa6, 0xaf, 0xbf, 0x62, 0xac, + 0x88, 0x2b, 0xc6, 0x51, 0xc6, 0x5e, 0x4e, 0xc6, 0xd8, 0xfb, 0x07, 0xbe, 0x31, 0x08, 0xdb, 0x43, + 0x99, 0xbe, 0xed, 0x21, 0xaf, 0x85, 0xf5, 0xb0, 0xed, 0x58, 0xa6, 0xde, 0x6d, 0x30, 0x67, 0x20, + 0x3a, 0xbf, 0xec, 0x4f, 0x56, 0x9f, 0xeb, 0x37, 0x2a, 0x6a, 0xf0, 0x3d, 0x2b, 0x6e, 0x49, 0xaa, + 0x5f, 0x42, 0x11, 0xed, 0xeb, 0x93, 0x41, 0xfb, 0x6a, 0x0a, 0xed, 0xeb, 0x39, 0x47, 0xa0, 0x9d, + 0xac, 0xa9, 0x55, 0x47, 0x9b, 0x64, 0x86, 0xae, 0xf2, 0xfe, 0x6e, 0x94, 0x82, 0x3e, 0x93, 0x85, + 0xb3, 0x15, 0x73, 0xd0, 0x24, 0x85, 0x57, 0xa3, 0xb7, 0xf1, 0xd0, 0x6c, 0x8a, 0x22, 0xbd, 0x77, + 0x60, 0xb5, 0x07, 0xd3, 0x8c, 0x90, 0xe8, 0x6f, 0x05, 0x12, 0x6d, 0x08, 0x12, 0x7d, 0x60, 0x74, + 0xd2, 0xc9, 0x04, 0x5a, 0x1b, 0x6b, 0xdf, 0x95, 0x43, 0x7f, 0x9e, 0x85, 0x53, 0xd4, 0x9f, 0xef, + 0x41, 0x3a, 0x27, 0x22, 0xbd, 0xbd, 0x68, 0x7d, 0x75, 0xc3, 0xf9, 0x13, 0xd5, 0x6f, 0x2e, 0x05, + 0xbd, 0x91, 0x17, 0xf8, 0x43, 0xa2, 0xc0, 0x23, 0xfa, 0xf1, 0xfe, 0xe2, 0x22, 0x64, 0xfd, 0xeb, + 0x81, 0xac, 0x6b, 0x82, 0xac, 0xef, 0x1d, 0x89, 0xea, 0xf1, 0x8a, 0xf9, 0xcb, 0x39, 0x78, 0x1c, + 0xe5, 0x90, 0x29, 0x02, 0xed, 0x07, 0x4b, 0x66, 0x47, 0xc3, 0x8e, 0xab, 0xdb, 0xae, 0x10, 0xca, + 0xa2, 0x6f, 0xd2, 0x9d, 0x49, 0x61, 0xd2, 0x9d, 0x1d, 0x3a, 0xe9, 0x46, 0xef, 0xe6, 0x0d, 0xbc, + 0x4b, 0x22, 0xb2, 0xa5, 0x18, 0x0c, 0x22, 0x6a, 0x18, 0xd5, 0xa2, 0x02, 0xcb, 0xef, 0x5b, 0x04, + 0x94, 0x57, 0x8e, 0x5c, 0x42, 0x32, 0xc4, 0x7f, 0x6d, 0xbc, 0x96, 0x78, 0x8e, 0xff, 0x26, 0x9a, + 0x8d, 0xc5, 0x4e, 0xaa, 0x53, 0xa8, 0x57, 0x4e, 0xc3, 0x0c, 0xe9, 0x72, 0xd6, 0x0d, 0xf3, 0x0a, + 0xfa, 0x33, 0x05, 0xe6, 0x6a, 0xf8, 0x5a, 0x79, 0x57, 0xef, 0x76, 0xb1, 0xb9, 0x83, 0xd1, 0x23, + 0x82, 0x6d, 0xaf, 0xf7, 0x7a, 0xb5, 0x70, 0xb7, 0xd6, 0x7f, 0x55, 0x1f, 0x80, 0xbc, 0xd3, 0xb6, + 0x7a, 0xd4, 0xab, 0x6c, 0x81, 0x73, 0x0d, 0x13, 0x57, 0x9c, 0x4b, 0xfb, 0xee, 0xee, 0x22, 0x29, + 0xab, 0xd4, 0x33, 0x1a, 0xde, 0x0f, 0x1a, 0xfd, 0x8f, 0x8d, 0x93, 0x7f, 0x39, 0xb0, 0x33, 0xce, + 0xc4, 0x74, 0xc6, 0x01, 0xe3, 0x8b, 0x3c, 0xd3, 0x11, 0x8b, 0x24, 0xb7, 0xc0, 0x6c, 0xdb, 0xcf, + 0x12, 0x9c, 0x99, 0xe3, 0x93, 0xd0, 0x5f, 0x24, 0xea, 0xae, 0xa5, 0x0a, 0x4f, 0xa6, 0x55, 0x78, + 0xcc, 0xa6, 0xe6, 0x19, 0x38, 0xd5, 0xac, 0xd7, 0x5b, 0x1b, 0xa5, 0xda, 0xc3, 0x61, 0xac, 0x8a, + 0x6d, 0xf4, 0x9a, 0x1c, 0x2c, 0x34, 0xac, 0xee, 0x55, 0x1c, 0xe2, 0x5c, 0x15, 0x9c, 0x31, 0x79, + 0x39, 0x65, 0x0e, 0xc9, 0x49, 0x3d, 0x0b, 0x05, 0xdd, 0x74, 0xae, 0x61, 0xdf, 0xfc, 0x67, 0x6f, + 0x0c, 0xc6, 0x0f, 0xf3, 0x1d, 0x81, 0x26, 0xc2, 0x78, 0xdf, 0x10, 0x49, 0x8a, 0x5c, 0x45, 0x00, + 0x79, 0x01, 0xe6, 0x1c, 0xea, 0xb3, 0xd1, 0xe4, 0x5c, 0x73, 0x84, 0x34, 0xc2, 0x22, 0x75, 0x1a, + 0x52, 0x18, 0x8b, 0xe4, 0x0d, 0xbd, 0x21, 0xe8, 0x3f, 0xb6, 0x04, 0x88, 0x4b, 0x47, 0x61, 0x2c, + 0x19, 0xc8, 0xaf, 0x1b, 0xf7, 0x24, 0xfe, 0x1c, 0x9c, 0x66, 0xcd, 0xbe, 0x55, 0x5e, 0x2b, 0xad, + 0xaf, 0x57, 0x6a, 0xab, 0x95, 0x56, 0x75, 0x99, 0xee, 0x01, 0x87, 0x29, 0xa5, 0x66, 0xb3, 0xb2, + 0xb1, 0xd9, 0x6c, 0xb4, 0x2a, 0xcf, 0x2b, 0x57, 0x2a, 0xcb, 0xc4, 0x1d, 0x9a, 0x9c, 0x67, 0xf4, + 0x1d, 0xd7, 0x4b, 0xb5, 0xc6, 0xa5, 0x8a, 0x56, 0xdc, 0xbd, 0x50, 0x82, 0x59, 0x6e, 0xa0, 0xf0, + 0xb8, 0x5b, 0xc6, 0xdb, 0xfa, 0x7e, 0x97, 0x99, 0xe3, 0xc5, 0x13, 0x1e, 0x77, 0x44, 0x36, 0x75, + 0xb3, 0x7b, 0x50, 0xcc, 0xa8, 0x45, 0x98, 0xe3, 0xc7, 0x84, 0x62, 0x16, 0xbd, 0xe3, 0x26, 0x98, + 0xb9, 0x64, 0xd9, 0x57, 0x88, 0x0f, 0x2f, 0x7a, 0x3f, 0x8d, 0x69, 0xe5, 0x47, 0x07, 0xe0, 0x0c, + 0xb0, 0xd7, 0xc9, 0x3b, 0x6d, 0xf9, 0xd4, 0x16, 0x87, 0x46, 0x00, 0xb8, 0x05, 0x66, 0xaf, 0xf9, + 0xb9, 0xc3, 0x96, 0xce, 0x25, 0xa1, 0x9f, 0x91, 0x73, 0xc3, 0x1a, 0x5e, 0x64, 0xfa, 0xeb, 0xf9, + 0x6f, 0xcf, 0x42, 0x61, 0x15, 0xbb, 0xa5, 0x6e, 0x97, 0x97, 0xdb, 0xab, 0xa5, 0x4f, 0x75, 0x0a, + 0x95, 0x28, 0x75, 0xbb, 0xd1, 0x8d, 0x8a, 0x13, 0x90, 0x7f, 0xfa, 0x48, 0x48, 0x93, 0xf4, 0x99, + 0x1e, 0x52, 0x60, 0xfa, 0x12, 0xfb, 0x95, 0xd0, 0x51, 0xfa, 0x4d, 0x9c, 0x99, 0xf4, 0xd4, 0x30, + 0x9e, 0x59, 0x26, 0xde, 0x65, 0xc9, 0xcf, 0xa7, 0x3e, 0x04, 0x53, 0xfb, 0x0e, 0x2e, 0xeb, 0x8e, + 0x3f, 0xb4, 0x89, 0x35, 0xad, 0x5f, 0x7e, 0x04, 0xb7, 0xdd, 0xc5, 0xea, 0x9e, 0x37, 0xf1, 0xd9, + 0xa2, 0x19, 0x83, 0x10, 0x61, 0xec, 0x5d, 0xf3, 0x29, 0x78, 0xd3, 0xce, 0x6b, 0x86, 0xbb, 0x5b, + 0xde, 0xd5, 0x5d, 0xb6, 0x8d, 0x12, 0xbc, 0xa3, 0x57, 0x8c, 0x00, 0x67, 0xac, 0x93, 0x4d, 0xe4, + 0xe1, 0xf0, 0xc4, 0x20, 0x8e, 0xc1, 0x33, 0x66, 0x14, 0x10, 0xff, 0x26, 0x0b, 0xb9, 0x7a, 0x0f, + 0x9b, 0xd2, 0x27, 0x21, 0x03, 0xd9, 0x66, 0xfb, 0x64, 0xfb, 0x06, 0x79, 0x27, 0xdd, 0xa0, 0xd2, + 0x5e, 0xc9, 0x11, 0x92, 0xbd, 0x0b, 0x72, 0x86, 0xb9, 0x6d, 0x31, 0xcb, 0xf6, 0xc6, 0x08, 0x5b, + 0xa7, 0x6a, 0x6e, 0x5b, 0x1a, 0xc9, 0x28, 0xeb, 0x9f, 0x1b, 0x57, 0x76, 0xfa, 0xe2, 0xfe, 0xdb, + 0x69, 0x28, 0x50, 0x75, 0x46, 0xaf, 0x52, 0x40, 0x29, 0x75, 0x3a, 0x11, 0x82, 0xcf, 0x1e, 0x12, + 0xbc, 0x45, 0x7e, 0x0b, 0x30, 0x09, 0xde, 0xc5, 0x40, 0x56, 0x92, 0x7d, 0x3b, 0x6b, 0x52, 0xa5, + 0x4e, 0x27, 0xfa, 0x14, 0x41, 0x50, 0x60, 0x56, 0x2c, 0x90, 0x6f, 0xe1, 0x8a, 0x5c, 0x0b, 0x4f, + 0x3c, 0x10, 0x44, 0xf2, 0x97, 0x3e, 0x44, 0xff, 0x90, 0x85, 0xa9, 0x75, 0xc3, 0x71, 0x3d, 0x6c, + 0x4a, 0x32, 0xd8, 0xdc, 0x04, 0x33, 0xbe, 0x68, 0xbc, 0x2e, 0xcf, 0xeb, 0xcf, 0xc3, 0x04, 0x71, + 0x26, 0xfe, 0xa0, 0x88, 0xce, 0xd3, 0xe3, 0x6b, 0xcf, 0xb8, 0x88, 0x3e, 0x61, 0x16, 0x16, 0x9b, + 0xed, 0x2f, 0xf6, 0xe7, 0x02, 0x81, 0x6f, 0x08, 0x02, 0xbf, 0x67, 0x94, 0x22, 0xd3, 0x17, 0xfa, + 0xef, 0x67, 0x01, 0xbc, 0xb2, 0xd9, 0x31, 0xde, 0x27, 0x0a, 0xc1, 0x39, 0x62, 0xa4, 0xfb, 0x1a, + 0x5e, 0xba, 0x1b, 0xa2, 0x74, 0xbf, 0x79, 0x78, 0x55, 0xe3, 0x8e, 0xeb, 0xaa, 0x45, 0x50, 0x8c, + 0x40, 0xb4, 0xde, 0x23, 0x7a, 0x7b, 0x20, 0xd4, 0x4d, 0x41, 0xa8, 0xf7, 0x8d, 0x58, 0x52, 0xfa, + 0x72, 0xfd, 0xa3, 0x2c, 0x4c, 0x35, 0xb0, 0xeb, 0x75, 0x93, 0xe8, 0xa2, 0x4c, 0x0f, 0xcf, 0xb5, + 0xed, 0xac, 0x64, 0xdb, 0xfe, 0x6a, 0x46, 0x36, 0xc8, 0x57, 0x28, 0x19, 0xc6, 0x53, 0xc4, 0xea, + 0xc3, 0x9b, 0xa4, 0x82, 0x7c, 0x0d, 0xa3, 0x96, 0xbe, 0x74, 0xdf, 0x96, 0x0d, 0x7c, 0x40, 0xc4, + 0x53, 0x76, 0xbc, 0x59, 0x9c, 0x39, 0x6c, 0x16, 0xcb, 0x9f, 0xb2, 0xe3, 0xeb, 0x18, 0xed, 0x98, + 0x90, 0xd8, 0xd8, 0x18, 0x83, 0xcf, 0xc0, 0x28, 0xf2, 0x7a, 0x91, 0x02, 0x05, 0xb6, 0x79, 0xf0, + 0x40, 0xfc, 0xde, 0xc1, 0xf0, 0xa9, 0xc5, 0xfb, 0x46, 0x30, 0xe5, 0xe2, 0x96, 0xe5, 0x03, 0x36, + 0xb2, 0x1c, 0x1b, 0x77, 0x42, 0x9e, 0x44, 0x21, 0x66, 0xe3, 0x5c, 0xe8, 0xee, 0xe1, 0x93, 0xa8, + 0x78, 0x5f, 0x35, 0x9a, 0x29, 0x31, 0x0a, 0x63, 0x58, 0xc9, 0x1f, 0x05, 0x85, 0x2f, 0xab, 0x00, + 0x9b, 0xfb, 0x97, 0xbb, 0x86, 0xb3, 0x6b, 0x98, 0xc4, 0xfb, 0x6b, 0x8e, 0xbd, 0xd2, 0x60, 0xba, + 0xb1, 0xe6, 0x5f, 0xa4, 0x51, 0x50, 0x04, 0x65, 0xdf, 0x36, 0xd8, 0x32, 0x80, 0xf7, 0xa8, 0xde, + 0x1f, 0x78, 0x48, 0xe6, 0xfa, 0xc2, 0xa8, 0x78, 0x62, 0x08, 0x39, 0x58, 0xe4, 0x4a, 0x0f, 0x3d, + 0x25, 0xf9, 0x88, 0xc9, 0x79, 0x31, 0x62, 0xb2, 0x70, 0xb6, 0xba, 0xd0, 0x77, 0xb6, 0xda, 0xc3, + 0xd1, 0x31, 0x5e, 0x80, 0x89, 0x53, 0x91, 0xa2, 0x91, 0x67, 0xef, 0x8f, 0x47, 0x2c, 0xc3, 0x24, + 0x9b, 0x3a, 0xcc, 0x83, 0x3f, 0x4c, 0xe0, 0xfb, 0xbc, 0x19, 0xc9, 0x3e, 0xef, 0x23, 0xe1, 0xdc, + 0xc7, 0x92, 0x34, 0x9c, 0x13, 0x48, 0x4e, 0x60, 0x37, 0xd7, 0xc7, 0x2e, 0xfa, 0xa8, 0x74, 0x50, + 0x45, 0x4e, 0xc6, 0xb1, 0xb3, 0x18, 0xc6, 0x41, 0x36, 0xe0, 0x80, 0xdb, 0x03, 0x8e, 0xeb, 0x81, + 0x87, 0xd1, 0x4f, 0xa6, 0xcb, 0x7b, 0x23, 0xac, 0xd7, 0xa8, 0xb0, 0xe0, 0x1f, 0x52, 0xaf, 0x2f, + 0x3d, 0x58, 0x29, 0x37, 0x8b, 0xf8, 0xf0, 0xc1, 0x75, 0x72, 0x44, 0x9d, 0x1e, 0x47, 0x0f, 0xd7, + 0x64, 0xd0, 0xff, 0xc8, 0x42, 0x81, 0x99, 0x1b, 0x0f, 0x1c, 0x11, 0x42, 0xf4, 0xda, 0x51, 0x20, + 0x89, 0x8d, 0x15, 0xf2, 0xa9, 0xa4, 0x00, 0x8c, 0xc1, 0xc0, 0x78, 0x38, 0x35, 0x00, 0xd0, 0x3f, + 0x67, 0x21, 0xe7, 0x99, 0x41, 0x72, 0x91, 0x18, 0x3e, 0x29, 0xed, 0xc6, 0xcb, 0x09, 0xc0, 0x23, + 0x1f, 0xa1, 0xdf, 0x4b, 0x30, 0xd3, 0xa3, 0x19, 0x83, 0x38, 0x20, 0xb7, 0x4a, 0x74, 0x46, 0x58, + 0x0b, 0x7f, 0x43, 0xef, 0x95, 0x72, 0x05, 0x8e, 0xe7, 0x27, 0x19, 0x1c, 0x95, 0x71, 0x04, 0x6d, + 0xd8, 0x46, 0xff, 0x9a, 0x05, 0xd0, 0xb0, 0x63, 0x75, 0xaf, 0xe2, 0x2d, 0xdb, 0x40, 0x37, 0x86, + 0x00, 0xb0, 0x66, 0x9f, 0x09, 0x9b, 0xfd, 0xa7, 0xb3, 0xb2, 0x6e, 0xbd, 0x82, 0xe6, 0xf9, 0xc4, + 0x23, 0xc4, 0xff, 0x6c, 0x98, 0x62, 0x72, 0x64, 0x36, 0xa5, 0x9c, 0xf0, 0xfd, 0x9f, 0xd0, 0x07, + 0xa4, 0xdc, 0x82, 0x65, 0x38, 0x4a, 0x06, 0x40, 0x79, 0x04, 0x00, 0x4e, 0xc2, 0xac, 0x0f, 0xc0, + 0x96, 0x56, 0x2d, 0x62, 0xf4, 0x2e, 0x85, 0x78, 0x58, 0xd0, 0xc1, 0xed, 0xe8, 0x3d, 0xcd, 0x9f, + 0x4b, 0x4f, 0xf6, 0x39, 0x79, 0x04, 0xe5, 0xa7, 0x04, 0xd0, 0x6f, 0x4b, 0xcd, 0xee, 0x25, 0x18, + 0x7a, 0xac, 0xf4, 0x57, 0x17, 0x2a, 0x30, 0x2f, 0x58, 0x25, 0xea, 0x39, 0x38, 0x2d, 0x24, 0xd0, + 0xf1, 0xae, 0x53, 0x3c, 0xa1, 0x22, 0x38, 0x2b, 0x7c, 0x61, 0x2f, 0xb8, 0x53, 0xcc, 0xa0, 0x4f, + 0xfd, 0x51, 0x26, 0x58, 0xef, 0x79, 0x5f, 0x8e, 0xad, 0xb4, 0x7d, 0x5c, 0x0c, 0x3d, 0xd9, 0xb6, + 0x4c, 0x17, 0x3f, 0xca, 0xb9, 0xa9, 0x04, 0x09, 0xb1, 0x56, 0xc3, 0x39, 0x98, 0x72, 0x6d, 0xde, + 0x75, 0xc5, 0x7f, 0xe5, 0x15, 0x2b, 0x2f, 0x2a, 0x56, 0x0d, 0x2e, 0x18, 0x66, 0xbb, 0xbb, 0xdf, + 0xc1, 0x1a, 0xee, 0xea, 0x9e, 0x0c, 0x9d, 0x92, 0xb3, 0x8c, 0x7b, 0xd8, 0xec, 0x60, 0xd3, 0xa5, + 0x7c, 0xfa, 0xa7, 0x50, 0x25, 0x72, 0x8a, 0xca, 0x78, 0xbf, 0xa8, 0x8c, 0x4f, 0x1c, 0xb4, 0x84, + 0x1b, 0xb3, 0xde, 0x77, 0x0f, 0x00, 0xad, 0xdb, 0x45, 0x03, 0x5f, 0x63, 0x6a, 0x78, 0x43, 0xdf, + 0xaa, 0x5f, 0x3d, 0xc8, 0xa0, 0x71, 0x99, 0xd1, 0x17, 0x02, 0xf5, 0x7b, 0x8e, 0xa0, 0x7e, 0x77, + 0x4a, 0xb2, 0x90, 0x4c, 0xeb, 0x7a, 0x23, 0x68, 0xdd, 0x3c, 0xcc, 0x84, 0xbb, 0xc9, 0x8a, 0x7a, + 0x03, 0x9c, 0xf1, 0x3d, 0x8c, 0x6b, 0x95, 0xca, 0x72, 0xa3, 0xb5, 0xb5, 0xb9, 0xaa, 0x95, 0x96, + 0x2b, 0x45, 0xf0, 0xf4, 0x93, 0xea, 0x65, 0xe0, 0x18, 0x9c, 0x43, 0x7f, 0x90, 0x85, 0x3c, 0x39, + 0x42, 0x8d, 0xbe, 0x75, 0x4c, 0x9a, 0xe3, 0x08, 0x4e, 0x4f, 0xc1, 0xb8, 0x2b, 0x7f, 0x25, 0x04, + 0x13, 0x26, 0xe1, 0xea, 0x48, 0x57, 0x42, 0xc4, 0x10, 0x4a, 0x7f, 0x26, 0xe4, 0x35, 0xc9, 0xc6, + 0xae, 0x75, 0xed, 0xeb, 0xb9, 0x49, 0x7a, 0xf5, 0x3f, 0xe6, 0x26, 0x39, 0x80, 0x85, 0x89, 0x37, + 0xc9, 0x01, 0xed, 0x2e, 0xa6, 0x99, 0xa2, 0x0f, 0xe7, 0x83, 0xf9, 0xdf, 0xc7, 0xb2, 0x47, 0xda, + 0xfb, 0x2a, 0xc1, 0xbc, 0x61, 0xba, 0xd8, 0x36, 0xf5, 0xee, 0x4a, 0x57, 0xdf, 0xf1, 0xed, 0xd3, + 0xfe, 0x0d, 0x8f, 0x2a, 0x97, 0x47, 0x13, 0xff, 0x50, 0xcf, 0x03, 0xb8, 0x78, 0xaf, 0xd7, 0xd5, + 0xdd, 0x50, 0xf5, 0xb8, 0x14, 0x5e, 0xfb, 0x72, 0xa2, 0xf6, 0x3d, 0x05, 0xae, 0xa3, 0xa0, 0x35, + 0x0f, 0x7a, 0x78, 0xcb, 0x34, 0x9e, 0xbf, 0x4f, 0x22, 0x15, 0x53, 0x1d, 0x1d, 0xf4, 0x49, 0xd8, + 0x01, 0x2a, 0x88, 0x3b, 0x40, 0xea, 0x7d, 0x70, 0x03, 0x09, 0x2b, 0x8d, 0xbd, 0x5f, 0x2e, 0x19, + 0x9d, 0x1d, 0xec, 0x56, 0xb7, 0x37, 0x0c, 0xc7, 0x31, 0xcc, 0x1d, 0x32, 0x1d, 0x9f, 0xd6, 0xa2, + 0x33, 0xa0, 0xbf, 0x91, 0x8e, 0x82, 0xe4, 0xf7, 0x19, 0x43, 0xa2, 0x20, 0x05, 0xed, 0x54, 0xe9, + 0x6b, 0xa7, 0xc1, 0xaa, 0x4e, 0x4e, 0x62, 0x55, 0x87, 0xc7, 0x34, 0x2f, 0xb9, 0x3a, 0xf0, 0x7a, + 0xa9, 0x30, 0x4b, 0x71, 0xd5, 0x48, 0xbf, 0xef, 0xfb, 0x8a, 0x02, 0x0b, 0xb4, 0xe8, 0x25, 0xcb, + 0xba, 0xb2, 0xa7, 0xdb, 0x57, 0xd0, 0x0f, 0x1c, 0x6d, 0x17, 0x37, 0x76, 0xf7, 0x2a, 0x6a, 0x4b, + 0xb6, 0x4f, 0x79, 0x73, 0xfd, 0xca, 0x8b, 0x7e, 0x4b, 0x7a, 0x4a, 0x22, 0xc8, 0xd3, 0xaf, 0xd4, + 0x64, 0xb6, 0xb7, 0xe4, 0x0e, 0x2e, 0xca, 0x30, 0x98, 0x3e, 0xf0, 0xbf, 0x11, 0x00, 0xef, 0x8f, + 0x23, 0xfc, 0xce, 0xc0, 0x38, 0x71, 0x47, 0x5f, 0x1c, 0x0d, 0x3b, 0x9f, 0xaf, 0x11, 0xb0, 0x2b, + 0x82, 0x72, 0x25, 0x70, 0x46, 0xf2, 0x1e, 0xf9, 0x0a, 0xe5, 0xd2, 0x43, 0x33, 0x82, 0xe5, 0x89, + 0xa0, 0x79, 0x5a, 0x64, 0xa1, 0xde, 0x4b, 0x15, 0xd3, 0xcf, 0x4b, 0xef, 0xb8, 0x0d, 0x14, 0x10, + 0xe5, 0x6e, 0x32, 0xad, 0x52, 0x6e, 0xbb, 0x4e, 0x9e, 0xcd, 0xf4, 0xd1, 0x7c, 0x79, 0x1e, 0x66, + 0xfc, 0x68, 0x54, 0xe4, 0x86, 0xb6, 0x00, 0xc3, 0xb3, 0x50, 0x70, 0xac, 0x7d, 0xbb, 0x8d, 0xd9, + 0x1e, 0x28, 0x7b, 0x1b, 0x61, 0xbf, 0x6e, 0xa8, 0xb9, 0x70, 0xc8, 0x22, 0xc9, 0x25, 0xb6, 0x48, + 0xa2, 0xed, 0xdd, 0x18, 0xfb, 0x01, 0xbd, 0x42, 0xfa, 0x5a, 0x0d, 0x01, 0xb3, 0x06, 0x76, 0x1f, + 0x8b, 0x46, 0xc0, 0x2f, 0x4b, 0xed, 0x06, 0x0d, 0xa9, 0x49, 0x32, 0x95, 0xab, 0x8f, 0x60, 0x07, + 0xdf, 0x08, 0xd7, 0xfb, 0x39, 0x98, 0x01, 0x4c, 0x0c, 0xde, 0x2d, 0x6d, 0xbd, 0xa8, 0xa0, 0x17, + 0xe5, 0xa0, 0x48, 0x59, 0xab, 0x07, 0xb6, 0x20, 0x7a, 0x75, 0xe6, 0xb8, 0x0d, 0xde, 0xe8, 0x19, + 0xec, 0xef, 0x66, 0x65, 0x43, 0x77, 0x0b, 0x82, 0x0f, 0x6b, 0x17, 0xa1, 0x49, 0x23, 0x34, 0xb3, + 0x18, 0xe5, 0x43, 0x3f, 0x9b, 0x91, 0x89, 0x04, 0x2e, 0xc7, 0x62, 0xfa, 0xbd, 0xd2, 0x57, 0x73, + 0x7e, 0x50, 0xc1, 0x15, 0xdb, 0xda, 0xdb, 0xb2, 0xbb, 0xe8, 0x7f, 0x49, 0x5d, 0xb4, 0x10, 0x31, + 0xbb, 0xc8, 0x46, 0xcf, 0x2e, 0xc8, 0x8a, 0x74, 0x37, 0xdc, 0x0a, 0xeb, 0x8e, 0x30, 0x7c, 0xab, + 0xb7, 0xc1, 0x82, 0xde, 0xe9, 0x6c, 0xea, 0x3b, 0xb8, 0xec, 0x4d, 0xdb, 0x4d, 0x97, 0x05, 0x1c, + 0xeb, 0x4b, 0x8d, 0x9d, 0xca, 0x88, 0x7d, 0xe4, 0xd4, 0x21, 0xab, 0x54, 0x7e, 0x19, 0x56, 0x00, + 0x91, 0xc9, 0x6f, 0x22, 0xc3, 0x9f, 0x37, 0x64, 0xb4, 0x77, 0xf5, 0x30, 0x3c, 0x22, 0x7b, 0x93, + 0xf4, 0xc5, 0x92, 0xe0, 0x3b, 0x7d, 0xcd, 0xfb, 0xa5, 0x2c, 0x4c, 0x79, 0x78, 0x94, 0x3a, 0x1d, + 0xf4, 0x04, 0x21, 0x8a, 0x68, 0xa4, 0x37, 0xdc, 0x77, 0x4b, 0xbb, 0x21, 0xfa, 0x35, 0xa4, 0xf4, + 0x23, 0x30, 0x09, 0x85, 0x98, 0x15, 0x84, 0x28, 0xe7, 0x6d, 0x18, 0x5b, 0x44, 0xfa, 0xe2, 0xfb, + 0x64, 0x16, 0xe6, 0xfd, 0x79, 0xc6, 0x0a, 0x76, 0xdb, 0xbb, 0xe8, 0x1e, 0xd9, 0x75, 0x2e, 0xd6, + 0x12, 0x83, 0x2d, 0xe1, 0x2e, 0xfa, 0xb7, 0x4c, 0x42, 0x95, 0x17, 0x4a, 0x8e, 0x58, 0x24, 0x4c, + 0xa4, 0x8b, 0x71, 0x04, 0xd3, 0x17, 0xe6, 0x17, 0xb2, 0x00, 0x4d, 0x2b, 0x98, 0x2c, 0x1f, 0x41, + 0x92, 0x3f, 0x28, 0xbd, 0x5b, 0xcc, 0x2a, 0x1e, 0x16, 0x9b, 0xbc, 0xe7, 0x90, 0x74, 0xa6, 0x1a, + 0x56, 0xd2, 0x44, 0xda, 0xfa, 0xcc, 0xf2, 0x7e, 0xaf, 0x6b, 0xb4, 0x75, 0xb7, 0xdf, 0x03, 0x30, + 0x5a, 0xbc, 0xe4, 0x7a, 0xe3, 0x44, 0x46, 0x63, 0x50, 0x46, 0x84, 0x2c, 0x69, 0x04, 0x9f, 0xac, + 0x1f, 0xc1, 0x47, 0xd2, 0xab, 0x67, 0x08, 0xf1, 0x09, 0xa8, 0xa7, 0x02, 0x27, 0xeb, 0x3d, 0x6c, + 0x2e, 0xd9, 0x58, 0xef, 0xb4, 0xed, 0xfd, 0xbd, 0xcb, 0x0e, 0xef, 0xbe, 0x1a, 0xaf, 0xa3, 0xdc, + 0xca, 0x75, 0x56, 0x58, 0xb9, 0x46, 0xdf, 0xa5, 0xc8, 0x46, 0x4f, 0xe3, 0xf6, 0x57, 0x38, 0x1e, + 0x46, 0x18, 0xea, 0x12, 0x39, 0x5d, 0xf5, 0x2d, 0x52, 0xe7, 0x92, 0x2c, 0x52, 0xbf, 0x55, 0x2a, + 0x16, 0x9b, 0x54, 0xbd, 0x26, 0xe2, 0x3b, 0xb7, 0xd0, 0xc0, 0x6e, 0x04, 0xbc, 0xb7, 0xc2, 0xfc, + 0xe5, 0xf0, 0x4b, 0x00, 0xb1, 0x98, 0x38, 0xc0, 0xa3, 0xf5, 0x6d, 0x49, 0x57, 0x68, 0x44, 0x16, + 0x22, 0xd0, 0x0d, 0x10, 0xcc, 0xca, 0xb8, 0xcd, 0x25, 0x5a, 0x6e, 0x89, 0x2d, 0x3f, 0x7d, 0x14, + 0x3e, 0x9a, 0x85, 0x59, 0x72, 0x69, 0xf3, 0xd2, 0x01, 0x39, 0xc8, 0x29, 0x69, 0x94, 0xbc, 0x9c, + 0x17, 0xb3, 0x0a, 0xb9, 0xae, 0x61, 0x5e, 0xf1, 0xfd, 0x1d, 0xbd, 0xe7, 0xf0, 0x0a, 0xd0, 0xec, + 0x80, 0x2b, 0x40, 0x83, 0x6d, 0x92, 0xa0, 0xdc, 0x23, 0xdd, 0x49, 0x3f, 0x94, 0x5c, 0xfa, 0x62, + 0xfc, 0xab, 0x1c, 0x14, 0x1a, 0x58, 0xb7, 0xdb, 0xbb, 0xe8, 0x7d, 0xd9, 0x81, 0x53, 0x89, 0x69, + 0x71, 0x2a, 0xb1, 0x02, 0x53, 0xdb, 0x46, 0xd7, 0xc5, 0x36, 0xf5, 0x01, 0xe7, 0xbb, 0x76, 0xda, + 0xc4, 0x97, 0xba, 0x56, 0xfb, 0xca, 0x22, 0x33, 0xed, 0x17, 0xfd, 0xe8, 0xcd, 0x8b, 0x2b, 0xe4, + 0x27, 0xcd, 0xff, 0xd9, 0x33, 0x08, 0x1d, 0xcb, 0x76, 0xa3, 0x6e, 0x03, 0x8a, 0xa0, 0xd2, 0xb0, + 0x6c, 0x57, 0xa3, 0x3f, 0x7a, 0x30, 0x6f, 0xef, 0x77, 0xbb, 0x4d, 0xfc, 0xa8, 0xeb, 0x4f, 0xeb, + 0xfc, 0x77, 0xcf, 0x58, 0xb4, 0xb6, 0xb7, 0x1d, 0x4c, 0x17, 0x15, 0xf2, 0x1a, 0x7b, 0x53, 0x4f, + 0x43, 0xbe, 0x6b, 0xec, 0x19, 0x74, 0x22, 0x92, 0xd7, 0xe8, 0x8b, 0x7a, 0x07, 0x14, 0xc3, 0x39, + 0x10, 0x65, 0xf4, 0x5c, 0x81, 0x34, 0xcd, 0x43, 0xe9, 0x9e, 0xce, 0x5c, 0xc1, 0x07, 0xce, 0xb9, + 0x29, 0xf2, 0x9d, 0x3c, 0x8b, 0x07, 0x6e, 0x64, 0x36, 0x4c, 0xa8, 0xc4, 0xa3, 0x67, 0xb8, 0x36, + 0x6e, 0x5b, 0x76, 0xc7, 0x97, 0x4d, 0xf4, 0x04, 0x83, 0xe5, 0x4b, 0xb6, 0xcd, 0x31, 0xb0, 0xf0, + 0xf4, 0x35, 0xed, 0xdd, 0x05, 0xaf, 0xdb, 0xf4, 0x8a, 0xbe, 0x64, 0xb8, 0xbb, 0x1b, 0xd8, 0xd5, + 0xd1, 0x5f, 0x29, 0x03, 0x35, 0x6e, 0xf6, 0xff, 0xd7, 0xb8, 0x21, 0x1a, 0x47, 0x63, 0x7e, 0xb9, + 0xfb, 0xb6, 0xe9, 0xc9, 0x91, 0xf9, 0xd1, 0x72, 0x29, 0xea, 0x7d, 0x70, 0x43, 0xf8, 0xe6, 0x2f, + 0xa5, 0x2e, 0x73, 0xae, 0xb5, 0xd3, 0x5a, 0x74, 0x06, 0x75, 0x13, 0x1e, 0x4f, 0x3f, 0xae, 0x35, + 0x37, 0xd6, 0xd7, 0x8c, 0x9d, 0xdd, 0xae, 0xb1, 0xb3, 0xeb, 0x3a, 0x55, 0xd3, 0x71, 0xb1, 0xde, + 0xa9, 0x6f, 0x6b, 0xf4, 0x1e, 0x2f, 0x20, 0x74, 0x64, 0xb2, 0x8a, 0x3e, 0xe2, 0x72, 0xa3, 0x1b, + 0xaf, 0x29, 0x11, 0x2d, 0xe5, 0x19, 0x5e, 0x4b, 0x71, 0xf6, 0xbb, 0x01, 0xa6, 0x37, 0xf5, 0x61, + 0x1a, 0xaa, 0xfa, 0x7e, 0x97, 0x34, 0x17, 0x92, 0x39, 0xe9, 0x38, 0x17, 0xc3, 0x49, 0xfa, 0xcd, + 0xe6, 0x7f, 0x15, 0x20, 0xbf, 0x6a, 0xeb, 0xbd, 0x5d, 0xf4, 0x22, 0xae, 0x7f, 0x1e, 0x57, 0x9b, + 0x08, 0xb4, 0x33, 0x3b, 0x4c, 0x3b, 0x95, 0x21, 0xda, 0x99, 0xe3, 0xb4, 0x33, 0x7a, 0xd1, 0xf9, + 0x02, 0xcc, 0xb5, 0xad, 0x6e, 0x17, 0xb7, 0x3d, 0x79, 0x54, 0x3b, 0x64, 0xb5, 0x67, 0x46, 0x13, + 0xd2, 0x48, 0x84, 0x7b, 0xec, 0x36, 0xe8, 0x1a, 0x3b, 0x55, 0xfa, 0x30, 0x01, 0xbd, 0x3a, 0x0b, + 0xb9, 0x4a, 0x67, 0x07, 0x0b, 0xeb, 0xf0, 0x19, 0x6e, 0x1d, 0xfe, 0x2c, 0x14, 0x5c, 0xdd, 0xde, + 0xc1, 0xae, 0xbf, 0x4e, 0x40, 0xdf, 0x82, 0xc0, 0xfb, 0x0a, 0x17, 0x78, 0xff, 0x9b, 0x21, 0xe7, + 0xc9, 0x8c, 0xb9, 0xc5, 0x3f, 0x7e, 0x10, 0xfc, 0x44, 0xf6, 0x8b, 0x5e, 0x89, 0x8b, 0x5e, 0xad, + 0x35, 0xf2, 0x43, 0x3f, 0xd6, 0xf9, 0x43, 0x58, 0x93, 0x2b, 0x89, 0xdb, 0x96, 0x59, 0xdd, 0xd3, + 0x77, 0x30, 0xab, 0x66, 0x98, 0xe0, 0x7f, 0xad, 0xec, 0x59, 0x8f, 0x18, 0x6c, 0x51, 0x2b, 0x4c, + 0xf0, 0xaa, 0xb0, 0x6b, 0x74, 0x3a, 0xd8, 0x64, 0x2d, 0x9b, 0xbd, 0x5d, 0x38, 0x0f, 0x39, 0x8f, + 0x07, 0x4f, 0x7f, 0x3c, 0x63, 0xa1, 0x78, 0x42, 0x9d, 0xf3, 0x9a, 0x15, 0x6d, 0xbc, 0xc5, 0x8c, + 0xb8, 0xe6, 0x2a, 0xe3, 0x35, 0x44, 0x2b, 0x37, 0xb8, 0x71, 0x3d, 0x19, 0xf2, 0xa6, 0xd5, 0xc1, + 0x43, 0x07, 0x21, 0x9a, 0x4b, 0x7d, 0x3a, 0xe4, 0x71, 0xc7, 0xeb, 0x15, 0x14, 0x92, 0xfd, 0x7c, + 0xbc, 0x2c, 0x35, 0x9a, 0x39, 0x99, 0x6b, 0xd2, 0x20, 0x6e, 0xd3, 0x6f, 0x80, 0xdf, 0x3b, 0x05, + 0x27, 0x69, 0x1f, 0xd0, 0xd8, 0xbf, 0xec, 0x91, 0xba, 0x8c, 0xd1, 0x9b, 0x06, 0x0f, 0x5c, 0x27, + 0x45, 0x65, 0x3f, 0x0d, 0x79, 0x67, 0xff, 0x72, 0x60, 0x84, 0xd2, 0x17, 0xbe, 0xe9, 0x66, 0xc7, + 0x32, 0x9c, 0x29, 0xa3, 0x0e, 0x67, 0xc2, 0xd0, 0xa4, 0xf8, 0x8d, 0x3f, 0x1c, 0xc8, 0xe8, 0x81, + 0x0e, 0x7f, 0x20, 0x1b, 0x34, 0x0c, 0x9d, 0x83, 0x29, 0x7d, 0xdb, 0xc5, 0x76, 0x68, 0x26, 0xb2, + 0x57, 0x6f, 0xa8, 0xbc, 0x8c, 0xb7, 0x2d, 0xdb, 0x13, 0x0b, 0xbd, 0x77, 0x21, 0x78, 0xe7, 0x5a, + 0x2e, 0x08, 0x3b, 0x68, 0x77, 0xc2, 0x29, 0xd3, 0x5a, 0xc6, 0x3d, 0x26, 0x67, 0x8a, 0xe2, 0x3c, + 0x69, 0x01, 0x87, 0x3f, 0x1c, 0xea, 0x4a, 0x16, 0x0e, 0x77, 0x25, 0xe8, 0xd3, 0x49, 0xe7, 0xcc, + 0x7d, 0x40, 0x8f, 0xcd, 0x42, 0x53, 0x9f, 0x05, 0x73, 0x1d, 0xe6, 0x21, 0xd6, 0x36, 0x82, 0x56, + 0x12, 0xf9, 0x9f, 0x90, 0x39, 0x54, 0xa4, 0x1c, 0xaf, 0x48, 0xab, 0x30, 0x4d, 0x8e, 0x5e, 0x7b, + 0x9a, 0x94, 0xef, 0xf3, 0xc8, 0x27, 0xd3, 0xba, 0xa0, 0x52, 0x9c, 0xd8, 0x16, 0xcb, 0xec, 0x17, + 0x2d, 0xf8, 0x39, 0xd9, 0xec, 0x3b, 0x5e, 0x42, 0xe9, 0x37, 0xc7, 0x9f, 0x2b, 0xc0, 0x0d, 0x65, + 0xdb, 0x72, 0x1c, 0x72, 0x04, 0xa7, 0xbf, 0x61, 0xbe, 0x39, 0x2b, 0x5c, 0xc1, 0xf3, 0x98, 0x6e, + 0x7e, 0x83, 0x1a, 0xd4, 0xe4, 0x9a, 0xc6, 0x9f, 0x4b, 0x07, 0xad, 0x09, 0xf6, 0x1f, 0x22, 0x84, + 0xfe, 0xf5, 0xd1, 0x48, 0xde, 0x9d, 0x91, 0x89, 0xa3, 0x93, 0x50, 0x56, 0x13, 0xb8, 0x73, 0x29, + 0x0b, 0x37, 0xf6, 0x73, 0xb3, 0x65, 0x3a, 0x41, 0x83, 0xb9, 0x79, 0x48, 0x7b, 0x11, 0xe3, 0xae, + 0xc4, 0xde, 0xb8, 0x1b, 0x51, 0x77, 0xae, 0xb4, 0x88, 0xc5, 0x92, 0xf0, 0x40, 0x4f, 0xdc, 0x8d, + 0xbb, 0x89, 0xc9, 0xa7, 0x2f, 0xdc, 0xdf, 0xcd, 0xc1, 0xc9, 0x55, 0xdb, 0xda, 0xef, 0x39, 0x61, + 0x0f, 0xf4, 0x27, 0x83, 0x37, 0x64, 0x0b, 0x32, 0xa6, 0xc1, 0x2d, 0x30, 0x6b, 0x33, 0x6b, 0x2e, + 0xdc, 0x9e, 0xe5, 0x93, 0xf8, 0xde, 0x4b, 0x39, 0x4a, 0xef, 0x15, 0xf6, 0x33, 0x39, 0xa1, 0x9f, + 0xe9, 0xef, 0x39, 0xf2, 0x03, 0x7a, 0x8e, 0x3f, 0xce, 0x26, 0x1c, 0x54, 0xfb, 0x44, 0x14, 0xd1, + 0x5f, 0x94, 0xa1, 0xb0, 0x43, 0x32, 0xb2, 0xee, 0xe2, 0x49, 0x72, 0x35, 0x23, 0xc4, 0x35, 0xf6, + 0x6b, 0x28, 0x57, 0x85, 0xd7, 0xe1, 0x44, 0x03, 0x5c, 0x3c, 0xb7, 0xe9, 0x2b, 0xd5, 0x1b, 0x72, + 0x30, 0x17, 0x94, 0x5e, 0xed, 0x38, 0x42, 0x74, 0x57, 0x4e, 0xa3, 0xe6, 0x65, 0x34, 0xea, 0xd0, + 0x3a, 0x73, 0x30, 0xea, 0x28, 0xdc, 0xa8, 0x33, 0x70, 0x74, 0x99, 0x8b, 0x18, 0x5d, 0xd0, 0x0b, + 0x15, 0xd9, 0x4b, 0xec, 0xc4, 0xae, 0x95, 0xd4, 0xe6, 0xb1, 0x3c, 0x58, 0x48, 0x5e, 0xa5, 0x37, + 0xbc, 0x56, 0xe9, 0x2b, 0xc9, 0x87, 0xb2, 0x70, 0xea, 0x70, 0x67, 0xfe, 0x0d, 0xa2, 0x97, 0x9a, + 0x57, 0x27, 0x27, 0xf0, 0x52, 0x23, 0x6f, 0xe2, 0x26, 0x5d, 0x6c, 0x10, 0x14, 0xc1, 0xde, 0x1b, + 0xde, 0x89, 0xcb, 0x85, 0x39, 0x91, 0x24, 0x9a, 0xbe, 0x00, 0x7f, 0x48, 0x81, 0x99, 0x06, 0x76, + 0xd7, 0xf5, 0x03, 0x6b, 0xdf, 0x45, 0xba, 0xec, 0xf6, 0xdc, 0x33, 0xa1, 0xd0, 0x25, 0xbf, 0x90, + 0x0e, 0x86, 0x0f, 0x3a, 0xca, 0xef, 0x6f, 0x11, 0xdf, 0x20, 0x4a, 0x5a, 0x63, 0xf9, 0xc5, 0xe8, + 0x33, 0x32, 0xbb, 0xa3, 0x01, 0x77, 0x63, 0xd9, 0xda, 0x49, 0xb4, 0x77, 0x1a, 0x55, 0x74, 0xfa, + 0xb0, 0x7c, 0x97, 0x02, 0xf3, 0x0d, 0xec, 0x56, 0x9d, 0x15, 0xfd, 0xaa, 0x65, 0x1b, 0x2e, 0x46, + 0xab, 0xb2, 0xd0, 0x9c, 0x07, 0x30, 0x82, 0xdf, 0x58, 0x4c, 0x2c, 0x2e, 0x05, 0xfd, 0x6c, 0x52, + 0x47, 0x21, 0x81, 0x8f, 0xb1, 0x80, 0x90, 0xc8, 0xc7, 0x22, 0xae, 0xf8, 0x09, 0x5c, 0xc3, 0x9d, + 0x65, 0x40, 0x94, 0xec, 0xf6, 0xae, 0x71, 0x15, 0x77, 0x12, 0x02, 0xe1, 0xff, 0x16, 0x02, 0x11, + 0x10, 0x4a, 0xec, 0xbe, 0x22, 0xf0, 0x31, 0x0e, 0xf7, 0x95, 0x38, 0x82, 0x13, 0x09, 0x6b, 0xe5, + 0x75, 0x3d, 0x6c, 0x3d, 0xf3, 0x01, 0x59, 0xb1, 0x86, 0x26, 0x5b, 0x96, 0x37, 0xd9, 0x46, 0xea, + 0x58, 0x68, 0xd9, 0xc3, 0x74, 0x3a, 0x97, 0x46, 0xc7, 0x32, 0xb0, 0xe8, 0xf4, 0x85, 0xfe, 0x5e, + 0x05, 0xce, 0x04, 0xf1, 0x5e, 0x1a, 0xd8, 0x5d, 0xd6, 0x9d, 0xdd, 0xcb, 0x96, 0x6e, 0x77, 0x50, + 0x79, 0x0c, 0x07, 0x0e, 0xd1, 0x1f, 0xf2, 0x20, 0xd4, 0x44, 0x10, 0x06, 0xba, 0x92, 0x0e, 0xe4, + 0x65, 0x1c, 0x9d, 0x4c, 0xac, 0xb7, 0xeb, 0x2f, 0x04, 0x60, 0x3d, 0x57, 0x00, 0xeb, 0xfe, 0x51, + 0x59, 0x4c, 0x1f, 0xb8, 0x1f, 0xa5, 0x23, 0x02, 0xe7, 0xf5, 0xfc, 0xb0, 0x2c, 0x60, 0x11, 0x5e, + 0xaf, 0x4a, 0xa4, 0xd7, 0xeb, 0x48, 0x63, 0xc4, 0x50, 0x8f, 0xe5, 0x74, 0xc7, 0x88, 0x63, 0xf4, + 0x46, 0x7e, 0xa7, 0x02, 0x45, 0x12, 0xf0, 0x8b, 0xf3, 0x08, 0xe7, 0xe3, 0x67, 0xc7, 0xa3, 0x73, + 0xc8, 0xfb, 0x7c, 0x2a, 0xa9, 0xf7, 0x39, 0x7a, 0x47, 0x52, 0x1f, 0xf3, 0x7e, 0x6e, 0xc7, 0x82, + 0x58, 0x22, 0x17, 0xf2, 0x21, 0x1c, 0xa4, 0x0f, 0xda, 0xf7, 0x29, 0x00, 0x5e, 0x83, 0x66, 0x67, + 0x23, 0x9e, 0x27, 0x0b, 0xd7, 0x5d, 0xbc, 0xdf, 0xbd, 0x07, 0xd4, 0x99, 0x3e, 0xa0, 0x28, 0xc5, + 0xf0, 0xd4, 0xc5, 0x9b, 0x92, 0xfa, 0x56, 0x86, 0x5c, 0x8d, 0x05, 0x96, 0x44, 0xde, 0x96, 0x91, + 0x65, 0xa7, 0x0f, 0xc8, 0x7f, 0xcf, 0x42, 0xbe, 0x69, 0x35, 0xb0, 0x7b, 0x74, 0x53, 0x20, 0x71, + 0xd4, 0x00, 0x52, 0xee, 0x38, 0xa2, 0x06, 0x0c, 0x22, 0x94, 0xbe, 0xe8, 0xde, 0x93, 0x85, 0xb9, + 0xa6, 0x55, 0x0e, 0x16, 0xa7, 0xe4, 0x7d, 0x55, 0xe5, 0x2f, 0xe2, 0x0f, 0x2a, 0x18, 0x16, 0x73, + 0xa4, 0x8b, 0xf8, 0x87, 0xd3, 0x4b, 0x5f, 0x6e, 0xf7, 0xc0, 0xc9, 0x2d, 0xb3, 0x63, 0x69, 0xb8, + 0x63, 0xb1, 0x95, 0x6e, 0x55, 0x85, 0xdc, 0xbe, 0xd9, 0xb1, 0x08, 0xcb, 0x79, 0x8d, 0x3c, 0x7b, + 0x69, 0x36, 0xee, 0x58, 0xcc, 0x37, 0x80, 0x3c, 0xa3, 0x3f, 0x57, 0x20, 0xe7, 0xfd, 0x2b, 0x2f, + 0xea, 0x77, 0x2a, 0x09, 0xe3, 0x20, 0x78, 0xe4, 0xc7, 0x62, 0x09, 0x3d, 0xc0, 0xad, 0xfd, 0x53, + 0x0f, 0xd6, 0xc7, 0x47, 0x95, 0xc7, 0x89, 0x22, 0x5c, 0xf3, 0x57, 0xcf, 0xc1, 0xd4, 0xe5, 0xae, + 0xd5, 0xbe, 0x12, 0x1e, 0xd7, 0x67, 0xaf, 0xea, 0x1d, 0x90, 0xb7, 0x75, 0x73, 0x07, 0xb3, 0x3d, + 0x85, 0xd3, 0x7d, 0x7d, 0x21, 0xf1, 0x7a, 0xd1, 0x68, 0x16, 0xf4, 0x8e, 0x24, 0x11, 0x18, 0x06, + 0x54, 0x3e, 0x99, 0x3e, 0x2c, 0x8f, 0x70, 0xf2, 0xac, 0x08, 0x73, 0xe5, 0x52, 0x8d, 0xde, 0x63, + 0x58, 0xbf, 0x58, 0x29, 0x2a, 0x04, 0x66, 0x4f, 0x26, 0x29, 0xc2, 0xec, 0x91, 0xff, 0xba, 0x85, + 0x79, 0x40, 0xe5, 0x8f, 0x03, 0xe6, 0x4f, 0x66, 0x61, 0x7e, 0xdd, 0x70, 0xdc, 0x28, 0x6f, 0xff, + 0x98, 0x78, 0xbf, 0xaf, 0x48, 0x6a, 0x2a, 0x0b, 0xe5, 0x48, 0x07, 0xfa, 0x4d, 0x64, 0x0e, 0xc7, + 0x15, 0x31, 0x99, 0x63, 0x29, 0x84, 0x03, 0x7a, 0xf1, 0xbc, 0xb4, 0x24, 0x13, 0x1b, 0x4a, 0x61, + 0x21, 0x93, 0x37, 0x94, 0x22, 0xcb, 0x4e, 0x5f, 0xbe, 0x7f, 0x9e, 0x85, 0x53, 0x5e, 0xf1, 0x71, + 0xcb, 0x52, 0xd1, 0x62, 0x1e, 0xba, 0x2c, 0x95, 0x78, 0x65, 0xfc, 0x10, 0x2f, 0xe3, 0x58, 0x19, + 0x1f, 0x46, 0x74, 0xc2, 0x62, 0x8e, 0x58, 0x86, 0x1d, 0x26, 0xe6, 0x98, 0x65, 0xd8, 0xd1, 0xc5, + 0x1c, 0xbf, 0x14, 0x3b, 0xa2, 0x98, 0x8f, 0x6d, 0x81, 0xf5, 0xa7, 0x94, 0x40, 0xcc, 0x91, 0x6b, + 0x1b, 0x31, 0x62, 0x4e, 0x7c, 0xa2, 0x57, 0xbc, 0x91, 0x3f, 0x81, 0xe0, 0xc7, 0xbc, 0xbe, 0x31, + 0x0a, 0x4c, 0xc7, 0xb8, 0xc6, 0xf1, 0x63, 0x0a, 0x2c, 0x30, 0x2e, 0x06, 0x4f, 0x99, 0x63, 0x30, + 0x4a, 0x3c, 0x65, 0x4e, 0x7c, 0x06, 0x48, 0xe4, 0x6c, 0xf2, 0x67, 0x80, 0x62, 0xcb, 0x4f, 0x1f, + 0x9c, 0xbf, 0xcc, 0xc1, 0x59, 0x8f, 0x85, 0x0d, 0xab, 0x63, 0x6c, 0x1f, 0x50, 0x2e, 0x2e, 0xea, + 0xdd, 0x7d, 0xec, 0xa0, 0xf7, 0x67, 0x65, 0x51, 0xfa, 0xdf, 0x00, 0xac, 0x1e, 0xb6, 0x69, 0x1c, + 0x37, 0x06, 0xd4, 0x7d, 0x51, 0x95, 0x3d, 0x5c, 0x52, 0x70, 0xfd, 0x4d, 0xdd, 0x27, 0xa2, 0x71, + 0xf4, 0x3c, 0xab, 0x70, 0x26, 0xf8, 0xd2, 0xef, 0xe0, 0x91, 0x39, 0xec, 0xe0, 0x71, 0x3b, 0x28, + 0x7a, 0xa7, 0x13, 0x40, 0xd5, 0xbf, 0x99, 0x4d, 0xca, 0xd4, 0xbc, 0x2c, 0x5e, 0x4e, 0x07, 0x87, + 0x47, 0xf3, 0x22, 0x72, 0x3a, 0xd8, 0x55, 0x17, 0xa1, 0x40, 0xaf, 0x03, 0x0f, 0x56, 0xf4, 0x07, + 0x67, 0x66, 0xb9, 0x44, 0xd3, 0xae, 0x2e, 0xaa, 0xe1, 0x3d, 0x89, 0x24, 0x33, 0xa8, 0x9f, 0x0e, + 0xed, 0x64, 0x4d, 0x50, 0xb0, 0x67, 0x8f, 0x4c, 0x79, 0x32, 0xbb, 0x61, 0xa5, 0x5e, 0xaf, 0x7b, + 0xd0, 0x64, 0x81, 0x07, 0x12, 0xed, 0x86, 0x71, 0xf1, 0x0b, 0xb2, 0x87, 0xe2, 0x17, 0x24, 0xde, + 0x0d, 0x13, 0xf8, 0x18, 0xc7, 0x6e, 0x58, 0x1c, 0xc1, 0x89, 0xdc, 0xc3, 0x43, 0xac, 0x66, 0x76, + 0x1b, 0xc1, 0x3f, 0x0e, 0xf6, 0xac, 0x06, 0xd1, 0xd9, 0x65, 0xd0, 0x45, 0x05, 0xb1, 0xb7, 0xb0, + 0xa8, 0x4f, 0x87, 0xc2, 0xb6, 0x65, 0xef, 0xe9, 0xfe, 0xc6, 0x7d, 0xff, 0x49, 0x11, 0x76, 0x03, + 0xc0, 0x0a, 0xc9, 0xa3, 0xb1, 0xbc, 0xde, 0x7c, 0xe4, 0x05, 0x46, 0x8f, 0x05, 0x7d, 0xf4, 0x1e, + 0xd5, 0x5b, 0x61, 0x9e, 0xc5, 0x7e, 0xac, 0x61, 0xc7, 0xc5, 0x1d, 0x16, 0xd1, 0x42, 0x4c, 0x54, + 0x2f, 0xc0, 0x1c, 0x4b, 0x58, 0x31, 0xba, 0xd8, 0x61, 0x41, 0x2d, 0x84, 0x34, 0xf5, 0x2c, 0x14, + 0x0c, 0xe7, 0x41, 0xc7, 0x32, 0x59, 0x40, 0x3e, 0xf6, 0xa6, 0xde, 0x0e, 0x27, 0x59, 0xbe, 0xc0, + 0x58, 0xa5, 0x07, 0x76, 0xfa, 0x93, 0x3d, 0xd5, 0x32, 0xad, 0x4d, 0xdb, 0xda, 0xb1, 0xb1, 0xe3, + 0x90, 0x53, 0x53, 0xd3, 0x1a, 0x97, 0xa2, 0x3e, 0x0c, 0xa7, 0xba, 0x86, 0x79, 0xc5, 0x21, 0x31, + 0x82, 0x57, 0x98, 0xdb, 0xd8, 0xdc, 0x80, 0xd8, 0xdd, 0x5c, 0x63, 0x63, 0x72, 0xe0, 0x7f, 0xd1, + 0x0e, 0x53, 0x51, 0xef, 0x80, 0x22, 0xe3, 0x66, 0x49, 0x6f, 0x5f, 0x21, 0xdf, 0x99, 0x3b, 0xea, + 0xa1, 0x74, 0x4e, 0x18, 0x34, 0x8c, 0xfe, 0x82, 0x20, 0x0c, 0x1a, 0x49, 0xff, 0x55, 0x19, 0x98, + 0x13, 0x0a, 0xd0, 0x41, 0xf5, 0xbb, 0x45, 0xe7, 0xd2, 0xae, 0xe1, 0x62, 0x8f, 0x39, 0x76, 0xd6, + 0xe5, 0xa9, 0x43, 0x98, 0xd7, 0x0e, 0xfd, 0xa8, 0x0d, 0x20, 0xe6, 0xf1, 0x45, 0x3b, 0x3c, 0xe2, + 0x59, 0xe6, 0x30, 0x5b, 0x55, 0x48, 0x43, 0x2f, 0x00, 0xf5, 0x30, 0x35, 0xce, 0x0b, 0x24, 0x93, + 0xcc, 0x0b, 0xc4, 0x93, 0x9b, 0xde, 0xed, 0x5a, 0xd7, 0x70, 0x27, 0x20, 0xcb, 0x74, 0xf5, 0x50, + 0x3a, 0xfa, 0xcc, 0x28, 0xf3, 0xc2, 0xc4, 0x17, 0x6b, 0x78, 0x8d, 0x6c, 0xbf, 0xdd, 0xc6, 0xb8, + 0xc3, 0x0e, 0xae, 0xf9, 0xaf, 0x09, 0xaf, 0xdc, 0x48, 0x3c, 0x8b, 0x3c, 0xa6, 0x3b, 0x37, 0xde, + 0x17, 0xde, 0x7c, 0xb2, 0x2f, 0xd3, 0xd5, 0xc4, 0x9d, 0x8f, 0x1f, 0xa9, 0x53, 0x41, 0xef, 0x49, + 0x7a, 0x5a, 0x34, 0x16, 0xd3, 0xb3, 0xde, 0xe0, 0xee, 0xec, 0x77, 0x83, 0xe3, 0x4e, 0xf4, 0x2d, + 0x21, 0x7a, 0x89, 0x0e, 0x90, 0x1e, 0x13, 0x72, 0xbf, 0x72, 0x06, 0x0a, 0xf4, 0xe6, 0x41, 0xf4, + 0xaa, 0x85, 0x81, 0xd0, 0x2d, 0x88, 0xd0, 0x6d, 0xc1, 0x9c, 0x69, 0x79, 0xc5, 0x6d, 0xea, 0xb6, + 0xbe, 0xe7, 0xc4, 0x2d, 0xef, 0x53, 0xba, 0x81, 0x2d, 0x57, 0xe3, 0x7e, 0x5b, 0x3b, 0xa1, 0x09, + 0x64, 0xd4, 0xff, 0x1d, 0x4e, 0x5e, 0x66, 0xa1, 0x39, 0x1c, 0x46, 0x39, 0x1b, 0xed, 0xfc, 0xda, + 0x47, 0x79, 0x49, 0xfc, 0x73, 0xed, 0x84, 0xd6, 0x4f, 0x4c, 0xfd, 0x2f, 0xb0, 0xe0, 0xbd, 0x76, + 0xac, 0x6b, 0x3e, 0xe3, 0x4a, 0xf4, 0x0c, 0xa0, 0x8f, 0xfc, 0x86, 0xf0, 0xe3, 0xda, 0x09, 0xad, + 0x8f, 0x94, 0x5a, 0x07, 0xd8, 0x75, 0xf7, 0xba, 0x8c, 0x70, 0x2e, 0xba, 0x33, 0xe9, 0x23, 0xbc, + 0x16, 0xfc, 0xb4, 0x76, 0x42, 0xe3, 0x48, 0xa8, 0xeb, 0x30, 0xe3, 0x3e, 0xea, 0x32, 0x7a, 0xf9, + 0x68, 0xaf, 0x93, 0x3e, 0x7a, 0x4d, 0xff, 0x9f, 0xb5, 0x13, 0x5a, 0x48, 0x40, 0xad, 0xc2, 0x74, + 0xef, 0x32, 0x23, 0x56, 0x88, 0x1e, 0xa9, 0xfa, 0x88, 0x6d, 0x5e, 0x0e, 0x68, 0x05, 0xbf, 0x7b, + 0x8c, 0xb5, 0x9d, 0xab, 0x8c, 0xd6, 0x94, 0x34, 0x63, 0x65, 0xff, 0x1f, 0x8f, 0xb1, 0x80, 0x80, + 0x5a, 0x85, 0x19, 0xc7, 0xd4, 0x7b, 0xce, 0xae, 0xe5, 0x3a, 0xe7, 0xa6, 0xfb, 0x1c, 0x94, 0xa3, + 0xa9, 0x35, 0xd8, 0x3f, 0x5a, 0xf8, 0xb7, 0xfa, 0x74, 0x38, 0xb3, 0xdf, 0xeb, 0xe8, 0x2e, 0xae, + 0x3c, 0x6a, 0x38, 0xae, 0x61, 0xee, 0xf8, 0xb1, 0xa5, 0xe9, 0x30, 0x3f, 0xf8, 0xa3, 0xba, 0xc8, + 0x8e, 0x2a, 0x02, 0x69, 0x97, 0xa8, 0x7f, 0x97, 0x9c, 0x16, 0xcb, 0x9d, 0x50, 0x7c, 0x16, 0xe4, + 0xbc, 0x4f, 0xc4, 0x2c, 0x58, 0x18, 0xbc, 0x02, 0xdf, 0xaf, 0x3b, 0xa4, 0x01, 0x7b, 0x3f, 0xf5, + 0x59, 0x16, 0x73, 0x87, 0x2c, 0x8b, 0x5b, 0x60, 0xd6, 0x70, 0x36, 0x8c, 0x1d, 0x3a, 0xad, 0x61, + 0x23, 0x3f, 0x9f, 0x44, 0x97, 0x81, 0x6a, 0xf8, 0x1a, 0x1d, 0xf2, 0x4f, 0xfa, 0xcb, 0x40, 0x7e, + 0x0a, 0xba, 0x0d, 0xe6, 0xf8, 0x46, 0x46, 0xaf, 0x2f, 0x36, 0xc2, 0x49, 0x11, 0x7b, 0x43, 0xb7, + 0xc2, 0x82, 0xa8, 0xd3, 0x9c, 0xed, 0xa7, 0xf8, 0x83, 0x18, 0x7a, 0x3c, 0x9c, 0xec, 0x6b, 0x58, + 0x7e, 0xb0, 0x9f, 0x4c, 0x18, 0xec, 0xe7, 0x16, 0x80, 0x50, 0x8b, 0x07, 0x92, 0xb9, 0x19, 0x66, + 0x02, 0xbd, 0x1c, 0x98, 0xe1, 0x4b, 0x19, 0x98, 0xf6, 0x95, 0x6d, 0x50, 0x06, 0xcf, 0xa6, 0x30, + 0xb9, 0x9d, 0x3d, 0xdf, 0xa6, 0xe0, 0xd3, 0x3c, 0x03, 0x2f, 0xf4, 0xa7, 0x6f, 0x1a, 0x6e, 0xd7, + 0x3f, 0x93, 0xda, 0x9f, 0xac, 0x6e, 0x02, 0x18, 0x04, 0xa3, 0x66, 0x78, 0x48, 0xf5, 0x29, 0x09, + 0xda, 0x03, 0xd5, 0x07, 0x8e, 0xc6, 0x85, 0x6f, 0x60, 0x27, 0x48, 0x67, 0x20, 0x4f, 0x2f, 0x58, + 0x38, 0xa1, 0x2e, 0x00, 0x54, 0x9e, 0xb7, 0x59, 0xd1, 0xaa, 0x95, 0x5a, 0xb9, 0x52, 0xcc, 0xa0, + 0x1f, 0xcf, 0xc2, 0x4c, 0xd0, 0x08, 0x06, 0x56, 0xb2, 0xc2, 0x54, 0x6b, 0xe8, 0x0d, 0xb1, 0x87, + 0x1b, 0x15, 0xaf, 0x64, 0xcf, 0x84, 0xeb, 0xf7, 0x1d, 0xbc, 0x62, 0xd8, 0x8e, 0xab, 0x59, 0xd7, + 0x56, 0x2c, 0x3b, 0x34, 0x89, 0x68, 0x68, 0xe2, 0xa8, 0xcf, 0x9e, 0xa9, 0xdf, 0xc1, 0xe4, 0xb4, + 0x22, 0xb6, 0xd9, 0x96, 0x4d, 0x98, 0xe0, 0xd1, 0x75, 0x6d, 0xdd, 0x74, 0x7a, 0x96, 0x83, 0x35, + 0xeb, 0x9a, 0x53, 0x32, 0x3b, 0x65, 0xab, 0xbb, 0xbf, 0x67, 0x3a, 0xcc, 0x58, 0x8f, 0xfa, 0xec, + 0x49, 0x87, 0xdc, 0xff, 0xbc, 0x00, 0x50, 0xae, 0xaf, 0xaf, 0x57, 0xca, 0xcd, 0x6a, 0xbd, 0x56, + 0x3c, 0xe1, 0x49, 0xab, 0x59, 0x5a, 0x5a, 0xf7, 0xa4, 0xf3, 0xad, 0x30, 0xed, 0xb7, 0x69, 0x16, + 0x9f, 0x28, 0xe3, 0xc7, 0x27, 0x52, 0x4b, 0x30, 0xed, 0xb7, 0x72, 0x36, 0x22, 0x3c, 0xa1, 0xff, + 0x3c, 0xfa, 0x9e, 0x6e, 0xbb, 0xc4, 0xb4, 0xf4, 0x89, 0x2c, 0xe9, 0x0e, 0xd6, 0x82, 0xdf, 0x2e, + 0x3c, 0x99, 0x71, 0xa0, 0xc2, 0x42, 0x69, 0x7d, 0xbd, 0x55, 0xd7, 0x5a, 0xb5, 0x7a, 0x73, 0xad, + 0x5a, 0x5b, 0xa5, 0x23, 0x64, 0x75, 0xb5, 0x56, 0xd7, 0x2a, 0x74, 0x80, 0x6c, 0x14, 0x33, 0xf4, + 0xfe, 0xf1, 0xa5, 0x69, 0x28, 0xf4, 0x88, 0x74, 0xd1, 0xe7, 0x95, 0x84, 0xa6, 0x45, 0x80, 0x53, + 0xc4, 0x0d, 0xc9, 0xc2, 0x61, 0x90, 0xec, 0x80, 0xc3, 0xda, 0x17, 0x60, 0x8e, 0x9a, 0x43, 0x0e, + 0xd9, 0x57, 0x23, 0xc8, 0x29, 0x9a, 0x90, 0x86, 0x3e, 0x9a, 0x4d, 0x60, 0x5c, 0x0c, 0xe4, 0x28, + 0x99, 0x71, 0xf1, 0x7b, 0x99, 0xd1, 0xae, 0x23, 0xa9, 0xd6, 0x9a, 0x15, 0xad, 0x56, 0x5a, 0x67, + 0x59, 0x14, 0xf5, 0x1c, 0x9c, 0xae, 0xd5, 0x59, 0x30, 0xce, 0x46, 0xab, 0x59, 0x6f, 0x55, 0x37, + 0x36, 0xeb, 0x5a, 0xb3, 0x98, 0x57, 0xcf, 0x82, 0x4a, 0x9f, 0x5b, 0xd5, 0x46, 0xab, 0x5c, 0xaa, + 0x95, 0x2b, 0xeb, 0x95, 0xe5, 0x62, 0x41, 0x7d, 0x22, 0x3c, 0x9e, 0x5e, 0x6f, 0x55, 0x5f, 0x69, + 0x69, 0xf5, 0x4b, 0x0d, 0x0f, 0x41, 0xad, 0xb2, 0x5e, 0xf2, 0x14, 0x89, 0xbb, 0x87, 0x7c, 0x4a, + 0xbd, 0x0e, 0x4e, 0xae, 0x54, 0xd7, 0x2b, 0xad, 0xf5, 0x7a, 0x69, 0x99, 0x95, 0x37, 0xad, 0xde, + 0x04, 0xe7, 0xaa, 0xb5, 0xc6, 0xd6, 0xca, 0x4a, 0xb5, 0x5c, 0xad, 0xd4, 0x9a, 0xad, 0xcd, 0x8a, + 0xb6, 0x51, 0x6d, 0x34, 0xbc, 0x7f, 0x8b, 0x33, 0xe4, 0x96, 0x67, 0xda, 0x67, 0x7a, 0x46, 0xec, + 0xfc, 0x45, 0xbd, 0x6b, 0x78, 0x03, 0x05, 0xb9, 0xfe, 0xbd, 0xef, 0x1c, 0x97, 0x4b, 0xae, 0x89, + 0x67, 0x27, 0x41, 0xc8, 0x0b, 0xfa, 0x4e, 0x25, 0xe1, 0x39, 0x2e, 0x06, 0x04, 0x2d, 0x71, 0x51, + 0x28, 0x2d, 0x62, 0xd5, 0xe1, 0xf5, 0xd9, 0x04, 0xe7, 0xb8, 0xe4, 0xc9, 0x27, 0x03, 0xff, 0x27, + 0xc6, 0x05, 0x7e, 0x11, 0xe6, 0xb6, 0x6a, 0xa5, 0xad, 0xe6, 0x5a, 0x5d, 0xab, 0x7e, 0x0b, 0xb9, + 0x85, 0x60, 0x1e, 0x66, 0x56, 0xea, 0xda, 0x52, 0x75, 0x79, 0xb9, 0x52, 0x2b, 0xe6, 0xd5, 0xeb, + 0xe1, 0xba, 0x46, 0x45, 0xbb, 0x58, 0x2d, 0x57, 0x5a, 0x5b, 0xb5, 0xd2, 0xc5, 0x52, 0x75, 0x9d, + 0xf4, 0x11, 0x85, 0x98, 0xab, 0xeb, 0xa7, 0xd0, 0xb7, 0xe7, 0x00, 0x68, 0xd5, 0xc9, 0x25, 0x5c, + 0xdc, 0x05, 0xe7, 0x7f, 0x90, 0x74, 0xba, 0x17, 0x92, 0x89, 0x68, 0xbf, 0x55, 0x98, 0xb6, 0xd9, + 0x07, 0xb6, 0xae, 0x39, 0x8c, 0x0e, 0x7d, 0xf4, 0xa9, 0x69, 0xc1, 0xef, 0xe8, 0xfd, 0x49, 0x66, + 0x77, 0x91, 0x8c, 0x25, 0x43, 0x72, 0x65, 0x3c, 0x40, 0xa2, 0x97, 0x67, 0x60, 0x41, 0xac, 0x98, + 0x57, 0x09, 0x62, 0x4c, 0xc9, 0x55, 0x42, 0xfc, 0x99, 0x33, 0xb2, 0x2e, 0x3c, 0x8d, 0x0d, 0xa7, + 0xe0, 0xb7, 0x4c, 0x1a, 0x92, 0xc1, 0xb7, 0x58, 0x8a, 0x19, 0x8f, 0x79, 0xcf, 0xe8, 0x28, 0x66, + 0xd5, 0x29, 0x50, 0x9a, 0x8f, 0xba, 0x45, 0x05, 0x7d, 0x49, 0x81, 0x79, 0xe1, 0x06, 0x75, 0x6f, + 0xf6, 0x25, 0x71, 0xbb, 0x31, 0x77, 0x37, 0x7b, 0xe6, 0xa8, 0x77, 0xb3, 0x5f, 0xb8, 0x0b, 0xa6, + 0x58, 0x1a, 0x91, 0x6f, 0xbd, 0xe6, 0x99, 0x02, 0x27, 0x61, 0x76, 0xb5, 0xd2, 0x6c, 0x35, 0x9a, + 0x25, 0xad, 0x59, 0x59, 0x2e, 0x66, 0xbc, 0x81, 0xaf, 0xb2, 0xb1, 0xd9, 0x7c, 0xb8, 0x98, 0x4d, + 0xee, 0x1a, 0xdb, 0xcf, 0xc8, 0x84, 0x5d, 0x63, 0xe3, 0x8a, 0x4f, 0x7f, 0xae, 0xfa, 0x69, 0x05, + 0x8a, 0x94, 0x83, 0xca, 0xa3, 0x3d, 0x6c, 0x1b, 0xd8, 0x6c, 0x63, 0x74, 0x45, 0x26, 0x54, 0xef, + 0xa1, 0x20, 0x95, 0xa4, 0x3f, 0xe7, 0xac, 0x44, 0xfa, 0xd2, 0x67, 0x60, 0xe7, 0x0e, 0x19, 0xd8, + 0xbf, 0x95, 0xd4, 0x37, 0xb6, 0x9f, 0xdd, 0xb1, 0x40, 0xf6, 0x89, 0x24, 0xbe, 0xb1, 0x43, 0x38, + 0x98, 0x48, 0x04, 0xee, 0x88, 0xf1, 0xb7, 0xa8, 0xa0, 0x97, 0x29, 0x70, 0x72, 0x59, 0x77, 0xf1, + 0xd2, 0x41, 0xd3, 0xbf, 0xe1, 0x34, 0xe2, 0x56, 0xf2, 0xcc, 0xa1, 0x5b, 0xc9, 0xc3, 0x4b, 0x52, + 0xb3, 0x7d, 0x97, 0xa4, 0xa2, 0x77, 0x27, 0x3d, 0x4d, 0xdb, 0xc7, 0xc3, 0xd8, 0xc2, 0x64, 0x27, + 0x3b, 0x25, 0x1b, 0xcf, 0x45, 0xfa, 0x0d, 0xec, 0xed, 0x33, 0x50, 0xa4, 0xac, 0x70, 0xee, 0x9f, + 0x3f, 0xc4, 0x2e, 0xf2, 0x6f, 0x25, 0x88, 0xb6, 0xe9, 0xc7, 0x2f, 0xc9, 0x8a, 0xf1, 0x4b, 0x84, + 0xdd, 0x04, 0xa5, 0xdf, 0x65, 0x27, 0x69, 0x67, 0xc8, 0xf9, 0x7a, 0x46, 0x07, 0x38, 0x4e, 0xaf, + 0x33, 0x8c, 0x2d, 0x7e, 0x32, 0x97, 0x4d, 0xb3, 0xfb, 0x5d, 0x2b, 0xb2, 0xc8, 0xc4, 0xdf, 0xa9, + 0x9f, 0xd4, 0xf1, 0x5f, 0xf0, 0xb5, 0x8d, 0xb9, 0x68, 0x3e, 0x3d, 0xc7, 0xff, 0x61, 0x1c, 0xa4, + 0x8f, 0xc2, 0xbf, 0x65, 0x21, 0xd7, 0xb0, 0x6c, 0x77, 0x5c, 0x18, 0x24, 0x75, 0x56, 0xe0, 0x24, + 0xd0, 0x88, 0x9e, 0x73, 0xa6, 0xe7, 0xac, 0x10, 0x5f, 0xfe, 0x04, 0x02, 0x96, 0x9e, 0x84, 0x05, + 0xca, 0x49, 0x70, 0xdb, 0xcf, 0xbf, 0x66, 0x69, 0x7f, 0xf5, 0x90, 0x2c, 0x22, 0x64, 0xcb, 0x2a, + 0x70, 0x16, 0xf0, 0x41, 0x11, 0xd2, 0xd0, 0x9b, 0x79, 0x5c, 0x96, 0x45, 0x5c, 0x06, 0xcd, 0xb8, + 0x83, 0x0b, 0x73, 0xc6, 0xd5, 0x33, 0x25, 0x89, 0x7d, 0x1a, 0x53, 0x78, 0xfa, 0x88, 0xbc, 0x58, + 0x81, 0x02, 0x73, 0xd6, 0x1c, 0x2b, 0x02, 0x49, 0x5b, 0x46, 0x20, 0x04, 0x39, 0xa7, 0x4e, 0x65, + 0xdc, 0x2d, 0x23, 0xbe, 0xfc, 0xf4, 0x71, 0xf8, 0x77, 0xe6, 0x85, 0x5c, 0xba, 0xaa, 0x1b, 0x5d, + 0xfd, 0x72, 0x37, 0x41, 0xcc, 0xf1, 0x8f, 0x26, 0x3c, 0x77, 0x19, 0x54, 0x55, 0x28, 0x2f, 0x42, + 0xe2, 0xdf, 0x04, 0x33, 0xb6, 0xb0, 0x4b, 0xeb, 0x59, 0x51, 0x7d, 0x1e, 0xe0, 0xec, 0xbb, 0x16, + 0xe6, 0x4c, 0x74, 0xc8, 0x52, 0x8a, 0x9f, 0x89, 0x1c, 0x0a, 0x9b, 0x2d, 0x75, 0x3a, 0x2b, 0x58, + 0x77, 0xf7, 0x6d, 0xdc, 0x49, 0x34, 0x44, 0xd8, 0x7d, 0x1b, 0xd9, 0x9c, 0x24, 0x84, 0xa8, 0x9f, + 0xeb, 0x22, 0x3a, 0xcf, 0x18, 0xd2, 0x1b, 0xf8, 0xbc, 0x8c, 0xa5, 0x4b, 0xfa, 0xf9, 0x00, 0x92, + 0xba, 0x00, 0xc9, 0xb3, 0x46, 0x63, 0x22, 0x7d, 0x40, 0x7e, 0x44, 0x81, 0x05, 0x6a, 0x27, 0x8c, + 0x1b, 0x93, 0x0f, 0x26, 0x74, 0xee, 0xe2, 0xee, 0x53, 0xe3, 0xd9, 0x19, 0x0b, 0x2c, 0x49, 0x5c, + 0xc1, 0xe4, 0xf8, 0x48, 0x1f, 0x99, 0x97, 0x9c, 0x02, 0xe0, 0x1c, 0x76, 0x3f, 0x5a, 0x08, 0x23, + 0x70, 0xa2, 0x77, 0xb0, 0xf9, 0x47, 0x43, 0x08, 0x07, 0xcf, 0x39, 0xe3, 0x06, 0x1b, 0x52, 0x62, + 0xa2, 0xd4, 0xa8, 0xf2, 0x7b, 0x09, 0x6d, 0x5e, 0xe6, 0x2e, 0x3b, 0x74, 0x70, 0x1f, 0xb1, 0x97, + 0xfb, 0x58, 0x02, 0xe3, 0x77, 0x18, 0x2b, 0xc9, 0x50, 0x5b, 0x1f, 0x61, 0x66, 0x7f, 0x0e, 0x4e, + 0x6b, 0x95, 0xd2, 0x72, 0xbd, 0xb6, 0xfe, 0x30, 0x7f, 0xb9, 0x56, 0x51, 0xe1, 0x27, 0x27, 0xa9, + 0xc0, 0xf6, 0xc6, 0x84, 0x7d, 0xa0, 0x28, 0xab, 0xb8, 0xd9, 0x0a, 0xb7, 0xb8, 0x32, 0xbc, 0x57, + 0x93, 0x20, 0x7b, 0x9c, 0x28, 0xfc, 0x7d, 0x01, 0x66, 0x35, 0xdc, 0xb6, 0xf6, 0xf6, 0xb0, 0xd9, + 0xc1, 0x1d, 0xf4, 0x46, 0x05, 0xe6, 0x82, 0xfd, 0xbe, 0x06, 0x76, 0xd1, 0x7f, 0x09, 0xb1, 0xb9, + 0x00, 0x73, 0x5e, 0xe5, 0xea, 0x62, 0x88, 0x7f, 0x21, 0x4d, 0xbd, 0x13, 0x4e, 0xf9, 0x28, 0xd4, + 0xfb, 0xa6, 0x30, 0x87, 0x3f, 0x88, 0x1e, 0x39, 0x5b, 0x22, 0x46, 0x0f, 0x44, 0x0b, 0x33, 0x60, + 0x77, 0x91, 0x67, 0x35, 0x02, 0xac, 0xdf, 0x09, 0xc0, 0x7a, 0x9e, 0x00, 0xd6, 0xf2, 0x11, 0xe9, + 0x1f, 0x27, 0x6a, 0xbf, 0xa8, 0xc0, 0x69, 0xbf, 0x23, 0x9e, 0x1c, 0x5a, 0x1f, 0xe3, 0xd1, 0xfa, + 0x56, 0x11, 0xad, 0x55, 0x19, 0x69, 0x0e, 0x62, 0x39, 0x02, 0xb5, 0xcf, 0x05, 0xa8, 0x7d, 0x9b, + 0x80, 0xda, 0xfa, 0x98, 0xca, 0x39, 0x4e, 0xf4, 0x3e, 0xa8, 0xc0, 0x39, 0xcf, 0xec, 0x2c, 0x5b, + 0xe6, 0x76, 0xd7, 0x68, 0xbb, 0x86, 0xb9, 0x13, 0x3a, 0x1f, 0xae, 0xca, 0xac, 0x6c, 0xf6, 0x63, + 0x9b, 0x3d, 0x8c, 0xad, 0x18, 0x19, 0x45, 0xb6, 0x6d, 0x45, 0xb1, 0x15, 0x31, 0x84, 0x71, 0x6e, + 0xf5, 0xa1, 0xe6, 0xf0, 0x49, 0xc9, 0x5b, 0x9f, 0x24, 0x07, 0xc7, 0x89, 0xdf, 0x8b, 0x81, 0x33, + 0x3d, 0xbe, 0x5b, 0x81, 0x22, 0xf1, 0x74, 0x25, 0x3d, 0x3b, 0xbb, 0x79, 0xb6, 0x2e, 0x9e, 0x81, + 0xe8, 0xf9, 0x02, 0xf2, 0xcf, 0x40, 0xf8, 0x09, 0xea, 0x6d, 0xb0, 0xd0, 0xde, 0xc5, 0xed, 0x2b, + 0x55, 0xd3, 0xf7, 0x45, 0xa2, 0x8e, 0x2b, 0x7d, 0xa9, 0xe2, 0x60, 0xf6, 0x90, 0x08, 0xa6, 0xb8, + 0xf0, 0x28, 0x4c, 0x6c, 0x78, 0xa6, 0x22, 0x1a, 0xda, 0xaf, 0x07, 0x00, 0xd5, 0x04, 0x80, 0xee, + 0x1d, 0x89, 0x6a, 0x32, 0x58, 0x6a, 0x23, 0xc0, 0x82, 0xe0, 0x6c, 0x7d, 0xb3, 0x59, 0xad, 0xd7, + 0x5a, 0x5b, 0x8d, 0xca, 0x72, 0x6b, 0xc9, 0x07, 0xa7, 0x51, 0x54, 0xd0, 0x97, 0xb3, 0x30, 0x45, + 0xd9, 0x72, 0xd0, 0x93, 0x42, 0x08, 0x86, 0x1e, 0xfe, 0x40, 0x6f, 0x97, 0x0e, 0xe5, 0x14, 0x08, + 0x82, 0x95, 0x13, 0xd1, 0x30, 0x9e, 0x09, 0x53, 0x14, 0x64, 0x7f, 0x17, 0xe0, 0x7c, 0x84, 0x65, + 0xc7, 0xc8, 0x68, 0x7e, 0x76, 0xc9, 0xb0, 0x4e, 0x43, 0xd8, 0x48, 0xdf, 0x1a, 0x7f, 0x61, 0x8e, + 0x2e, 0x1d, 0x5c, 0x32, 0xdc, 0x5d, 0x72, 0x36, 0x04, 0x3d, 0x57, 0xa6, 0xe3, 0xba, 0x13, 0xf2, + 0x57, 0xbd, 0xdc, 0x43, 0xce, 0xd9, 0xd0, 0x4c, 0xe8, 0x27, 0xa4, 0xa3, 0x88, 0x0b, 0xfa, 0x19, + 0xf0, 0x14, 0x01, 0xce, 0x06, 0xe4, 0xba, 0x86, 0xe3, 0x32, 0x9b, 0xfb, 0x9e, 0x44, 0x84, 0xfc, + 0x87, 0xaa, 0x8b, 0xf7, 0x34, 0x42, 0x06, 0x3d, 0xe8, 0x59, 0x4c, 0x61, 0xaa, 0xc4, 0x59, 0xa3, + 0x73, 0x30, 0xc5, 0xce, 0xc0, 0xb3, 0x6d, 0x29, 0xff, 0x55, 0x72, 0x2b, 0x48, 0xaa, 0xb6, 0xe9, + 0xeb, 0xc0, 0xff, 0x7b, 0x12, 0xa6, 0xd6, 0x0c, 0xc7, 0xb5, 0xec, 0x03, 0xf4, 0xa6, 0x0c, 0x4c, + 0x5d, 0xc4, 0xb6, 0x63, 0x58, 0xe6, 0x21, 0xf7, 0xac, 0x5b, 0x60, 0xb6, 0x67, 0xe3, 0xab, 0x86, + 0xb5, 0xef, 0x70, 0xa3, 0x04, 0x97, 0xa4, 0x22, 0x98, 0xd6, 0xf7, 0xdd, 0x5d, 0xcb, 0x0e, 0x43, + 0x67, 0xf9, 0xef, 0xea, 0x79, 0x00, 0xfa, 0x5c, 0xd3, 0xf7, 0xb0, 0x7f, 0x3b, 0x7e, 0x98, 0xa2, + 0xaa, 0x90, 0x73, 0x8d, 0x3d, 0xcc, 0x62, 0xe9, 0x93, 0x67, 0x4f, 0xc0, 0x24, 0x2e, 0x2d, 0x8b, + 0xff, 0xab, 0x68, 0xfe, 0x2b, 0xfa, 0x43, 0x05, 0x66, 0x57, 0xb1, 0xcb, 0x58, 0x75, 0xd0, 0x2b, + 0x32, 0x52, 0xd7, 0x57, 0x79, 0xf3, 0x92, 0xae, 0xee, 0xf8, 0xff, 0x05, 0x43, 0xae, 0x98, 0x18, + 0x06, 0xf6, 0x57, 0xf8, 0x5b, 0x3d, 0x48, 0x94, 0x57, 0xb7, 0x4a, 0x8f, 0x5d, 0xb0, 0xcc, 0x6c, + 0xe3, 0xf8, 0xf0, 0x07, 0xd1, 0x26, 0x8e, 0x8d, 0x90, 0xc2, 0x64, 0xbf, 0xc8, 0xd5, 0x27, 0xb2, + 0x3b, 0x9a, 0xbe, 0xca, 0x72, 0x1c, 0xba, 0xb0, 0x85, 0xa7, 0xc4, 0xc8, 0x68, 0x41, 0x6e, 0xc9, + 0xd8, 0x2a, 0xc3, 0x39, 0x99, 0xc0, 0x15, 0xbd, 0x0a, 0xcc, 0x36, 0x76, 0xad, 0x6b, 0xbe, 0x1c, + 0xbf, 0x55, 0x0e, 0xd8, 0x9b, 0x60, 0xe6, 0x6a, 0x1f, 0xa8, 0x61, 0x02, 0x7f, 0x2b, 0xa0, 0x22, + 0xde, 0x0a, 0xf8, 0x52, 0x25, 0x29, 0x4c, 0x1c, 0x73, 0x11, 0x30, 0x89, 0x17, 0xf9, 0x65, 0x13, + 0x5c, 0xe4, 0xa7, 0x3e, 0x03, 0xa6, 0x18, 0xd7, 0x6c, 0x99, 0x3a, 0x1e, 0x60, 0x3f, 0x33, 0x5f, + 0xc1, 0x9c, 0x58, 0xc1, 0x64, 0xc8, 0x47, 0x57, 0x2e, 0x7d, 0xe4, 0x7f, 0x33, 0x4b, 0x22, 0x6b, + 0xf9, 0xc0, 0x97, 0xc7, 0x00, 0x3c, 0xfa, 0x5a, 0x46, 0x76, 0x33, 0x27, 0x90, 0x40, 0xc0, 0xc1, + 0x91, 0xae, 0xa6, 0x1b, 0x4a, 0x2e, 0x7d, 0x79, 0xfe, 0x78, 0x0e, 0xe6, 0x96, 0x8d, 0xed, 0xed, + 0xa0, 0x93, 0x7c, 0xa5, 0x64, 0x27, 0x19, 0xed, 0x42, 0xe5, 0xd9, 0xb9, 0xfb, 0xb6, 0x8d, 0x4d, + 0xbf, 0x52, 0xac, 0x39, 0xf5, 0xa5, 0xaa, 0xb7, 0xc3, 0x49, 0x7f, 0x5c, 0xe0, 0x3b, 0xca, 0x19, + 0xad, 0x3f, 0x19, 0x7d, 0x45, 0xda, 0x13, 0xc0, 0x97, 0x28, 0x5f, 0xa5, 0x88, 0x06, 0x78, 0x1f, + 0xcc, 0xef, 0xd2, 0xdc, 0x64, 0xb9, 0xd4, 0xef, 0x2c, 0xcf, 0xf6, 0xdd, 0x5c, 0xb0, 0x81, 0x1d, + 0x47, 0xdf, 0xc1, 0x9a, 0x98, 0xb9, 0xaf, 0xf9, 0x2a, 0x49, 0xee, 0xe1, 0x94, 0x73, 0x2a, 0x90, + 0xa8, 0x49, 0xfa, 0xda, 0xf1, 0xb9, 0x0b, 0x90, 0x5b, 0x31, 0xba, 0x18, 0x7d, 0x4f, 0x16, 0x66, + 0xbc, 0x59, 0xb7, 0xd9, 0xf6, 0xde, 0x38, 0x87, 0xca, 0xbf, 0xcf, 0xc8, 0xde, 0x3f, 0xed, 0xd1, + 0x59, 0x0c, 0x68, 0x44, 0xb4, 0x1b, 0xb9, 0x7b, 0xa6, 0x63, 0x49, 0x4d, 0xe0, 0xb6, 0x30, 0x6f, + 0xea, 0xb1, 0xbd, 0xdd, 0xb5, 0x74, 0x61, 0xc3, 0xa0, 0xdf, 0x14, 0x0a, 0x8f, 0x6f, 0xd6, 0x2c, + 0x77, 0xd3, 0x30, 0xcd, 0x20, 0x22, 0xca, 0xa1, 0x74, 0xd1, 0xd7, 0x25, 0x36, 0xa8, 0x1c, 0xa9, + 0x3b, 0x2b, 0x3d, 0x42, 0xb3, 0x6f, 0x83, 0x85, 0xcb, 0x07, 0x2e, 0x76, 0x58, 0x2e, 0x56, 0x6c, + 0x4e, 0xeb, 0x4b, 0xe5, 0xae, 0x84, 0x88, 0x0b, 0x3e, 0x17, 0x53, 0x60, 0x32, 0x51, 0xaf, 0x8d, + 0x30, 0x03, 0x3c, 0x0d, 0xc5, 0x5a, 0x7d, 0xb9, 0x42, 0xfc, 0x7b, 0x7d, 0x8f, 0xc9, 0x1d, 0xf4, + 0x83, 0x0a, 0xcc, 0x11, 0x07, 0x3c, 0x1f, 0x85, 0xc7, 0x4b, 0xcc, 0x47, 0xd0, 0x17, 0xa4, 0x7d, + 0x7f, 0x49, 0x95, 0xf9, 0x02, 0xa2, 0x05, 0xbd, 0x6d, 0x74, 0xfb, 0x05, 0x9d, 0xd7, 0xfa, 0x52, + 0x07, 0x00, 0xa2, 0x0c, 0x04, 0xe4, 0x17, 0xa5, 0x1c, 0x80, 0x87, 0x71, 0x77, 0x5c, 0xa8, 0xfc, + 0x92, 0x02, 0xb3, 0xde, 0x24, 0xc5, 0x07, 0xa5, 0x2e, 0x80, 0x62, 0x99, 0xdd, 0x83, 0x70, 0x59, + 0xc4, 0x7f, 0x4d, 0xd4, 0x48, 0xfe, 0x48, 0x7a, 0xe6, 0x4e, 0x44, 0xc4, 0xf1, 0x32, 0x21, 0xfc, + 0x3e, 0x20, 0x35, 0x9f, 0x1f, 0xc2, 0xdc, 0x71, 0xc1, 0xf7, 0x86, 0x02, 0x14, 0xb6, 0x7a, 0x04, + 0xb9, 0xcf, 0x2b, 0x32, 0xd7, 0xab, 0x1c, 0x3a, 0xfc, 0xe5, 0x99, 0x59, 0x5d, 0xab, 0xad, 0x77, + 0x37, 0xc3, 0xf3, 0xcf, 0x61, 0x82, 0x7a, 0x2f, 0xf3, 0x07, 0xa7, 0xc7, 0x78, 0x6f, 0x8b, 0xbd, + 0x79, 0x84, 0xc8, 0x88, 0x3b, 0x68, 0x77, 0x27, 0x9c, 0xea, 0x18, 0x8e, 0x7e, 0xb9, 0x8b, 0x2b, + 0x66, 0xdb, 0x3e, 0xa0, 0xe2, 0x60, 0xd3, 0xaa, 0x43, 0x1f, 0xd4, 0xfb, 0x21, 0xef, 0xb8, 0x07, + 0x5d, 0x3a, 0x4f, 0xe4, 0xcf, 0xe5, 0x45, 0x16, 0xd5, 0xf0, 0xb2, 0x6b, 0xf4, 0x2f, 0xde, 0xad, + 0x73, 0x4a, 0xce, 0xad, 0x53, 0x7d, 0x1a, 0x14, 0x2c, 0xdb, 0xd8, 0x31, 0xe8, 0x65, 0x82, 0x0b, + 0x87, 0x02, 0xec, 0x52, 0x53, 0xa0, 0x4e, 0xb2, 0x68, 0x2c, 0xab, 0xfa, 0x0c, 0x98, 0x31, 0xf6, + 0xf4, 0x1d, 0xfc, 0x90, 0x61, 0xd2, 0xf0, 0x03, 0x0b, 0x77, 0x9f, 0x3b, 0x74, 0xe4, 0x90, 0x7d, + 0xd7, 0xc2, 0xac, 0xea, 0x7d, 0x70, 0x43, 0xdb, 0xc6, 0xba, 0x8b, 0x3d, 0x01, 0x5d, 0x32, 0x3a, + 0x3b, 0xd8, 0xad, 0x6e, 0x6f, 0x18, 0x8e, 0x63, 0x98, 0x3b, 0xec, 0xbe, 0xd0, 0xe8, 0x0c, 0xe8, + 0x03, 0x59, 0xd9, 0x18, 0x82, 0x44, 0x32, 0x54, 0x25, 0x46, 0xb8, 0xd7, 0x9c, 0x93, 0xa2, 0x22, + 0xe9, 0x1c, 0xfb, 0x3a, 0xa9, 0xe8, 0x7e, 0xd1, 0x6c, 0xa5, 0x3f, 0xf4, 0xff, 0x7e, 0x16, 0xa6, + 0x97, 0xad, 0x6b, 0x26, 0x69, 0x26, 0xf7, 0xc8, 0x59, 0xca, 0x03, 0x02, 0x02, 0x88, 0x37, 0x64, + 0xc7, 0x9e, 0x21, 0x23, 0xb5, 0xf5, 0x8b, 0x8c, 0x80, 0x21, 0xb6, 0xdd, 0x49, 0x1e, 0x3b, 0x8f, + 0x2b, 0x27, 0x7d, 0xb9, 0xfe, 0xb6, 0x02, 0xb9, 0x65, 0xdb, 0xea, 0xa1, 0x9f, 0xcf, 0x24, 0x70, + 0x12, 0xeb, 0xd8, 0x56, 0xaf, 0x49, 0x2e, 0x1e, 0x0d, 0xf7, 0x45, 0xf8, 0x34, 0xf5, 0x1e, 0x98, + 0xee, 0x59, 0x8e, 0xe1, 0xfa, 0x93, 0x90, 0x85, 0xbb, 0x1f, 0x37, 0xb0, 0x2f, 0xd8, 0x64, 0x99, + 0xb4, 0x20, 0xbb, 0xd7, 0xe7, 0x13, 0x11, 0x7a, 0x72, 0xf1, 0xc4, 0xe8, 0x5f, 0xbe, 0xda, 0x97, + 0x8a, 0x5e, 0xc5, 0x23, 0xf9, 0x2c, 0x11, 0xc9, 0x27, 0x0c, 0x90, 0xb0, 0x6d, 0xf5, 0xc6, 0xe2, + 0xd6, 0xf1, 0x9a, 0x00, 0xd5, 0x67, 0x0b, 0xa8, 0xde, 0x21, 0x55, 0x66, 0xfa, 0x88, 0x7e, 0x20, + 0x07, 0x40, 0x8c, 0x94, 0x2d, 0x6f, 0xfa, 0x24, 0x67, 0xa1, 0x7d, 0x57, 0x8e, 0x93, 0x65, 0x49, + 0x94, 0xe5, 0x93, 0x22, 0x6c, 0x20, 0x42, 0x3e, 0x42, 0xa2, 0x25, 0xc8, 0xef, 0x7b, 0x9f, 0x99, + 0x44, 0x25, 0x49, 0x90, 0x57, 0x8d, 0xfe, 0x89, 0x7e, 0x33, 0x03, 0x79, 0x92, 0xa0, 0x9e, 0x07, + 0x20, 0x66, 0x01, 0x3d, 0x82, 0x99, 0x21, 0x06, 0x00, 0x97, 0x42, 0xb4, 0xd5, 0xe8, 0xb0, 0xcf, + 0xd4, 0xe0, 0x0e, 0x13, 0xbc, 0xbf, 0x89, 0xb1, 0x40, 0x68, 0x31, 0xf3, 0x81, 0x4b, 0xf1, 0xfe, + 0x26, 0x6f, 0xeb, 0x78, 0x9b, 0xde, 0x09, 0x91, 0xd3, 0xc2, 0x84, 0xe0, 0xef, 0xf5, 0xe0, 0x26, + 0x51, 0xff, 0x6f, 0x92, 0xe2, 0x4d, 0xa5, 0x89, 0x5a, 0x2e, 0x85, 0x45, 0x14, 0x48, 0xa6, 0xfe, + 0x64, 0xf4, 0xc6, 0x40, 0x6d, 0x96, 0x05, 0xb5, 0x79, 0x4a, 0x02, 0xf1, 0xa6, 0xaf, 0x3c, 0x5f, + 0xca, 0xc3, 0x4c, 0xcd, 0xea, 0x30, 0xdd, 0xe1, 0xa6, 0x9b, 0x9f, 0xc8, 0x27, 0x9a, 0x6e, 0x06, + 0x34, 0x22, 0x14, 0xe4, 0x39, 0xa2, 0x82, 0xc8, 0x51, 0xe0, 0xf5, 0x43, 0x5d, 0x82, 0x02, 0xd1, + 0xde, 0xc3, 0x57, 0x54, 0xc6, 0x91, 0x20, 0xa2, 0xd5, 0xd8, 0x9f, 0xff, 0xe9, 0x74, 0xec, 0xbf, + 0x41, 0x9e, 0x54, 0x30, 0x66, 0x6f, 0x48, 0xac, 0x68, 0x36, 0xbe, 0xa2, 0x4a, 0x7c, 0x45, 0x73, + 0xfd, 0x15, 0x4d, 0xb2, 0x8a, 0x10, 0xa5, 0x21, 0xe9, 0xeb, 0xf8, 0xdf, 0x4c, 0x01, 0xd4, 0xf4, + 0xab, 0xc6, 0x0e, 0xdd, 0x5b, 0xfe, 0x43, 0x7f, 0xf6, 0xc4, 0x76, 0x81, 0xbf, 0x8f, 0x1b, 0x08, + 0xef, 0x81, 0x29, 0x36, 0xee, 0xb1, 0x8a, 0xdc, 0x2c, 0x54, 0x24, 0xa4, 0x42, 0x8d, 0xda, 0x47, + 0x5d, 0xcd, 0xcf, 0x2f, 0xdc, 0xa6, 0x9f, 0xed, 0xbb, 0x4d, 0x7f, 0xf0, 0x0e, 0x46, 0xc4, 0x1d, + 0xfb, 0xe8, 0xbd, 0xd2, 0x67, 0xa8, 0x38, 0x7e, 0xb8, 0x1a, 0x45, 0x34, 0xc1, 0xa7, 0xc1, 0x94, + 0x15, 0x6c, 0x87, 0x2b, 0x91, 0xab, 0x68, 0x55, 0x73, 0xdb, 0xd2, 0xfc, 0x9c, 0x92, 0x5b, 0x67, + 0x52, 0x7c, 0x4c, 0xe4, 0x98, 0xe2, 0xd9, 0x55, 0x3f, 0xbe, 0xa6, 0x57, 0x8f, 0x4b, 0x86, 0xbb, + 0xbb, 0x6e, 0x98, 0x57, 0x1c, 0xf4, 0x6d, 0x72, 0x16, 0x24, 0x87, 0x7f, 0x36, 0x19, 0xfe, 0x62, + 0x7c, 0xab, 0x86, 0x88, 0xda, 0xfd, 0x51, 0x54, 0x06, 0x73, 0x1b, 0x01, 0xe0, 0xbd, 0x50, 0xa0, + 0x8c, 0xb2, 0x4e, 0xf4, 0x42, 0x24, 0x7e, 0x01, 0x25, 0x8d, 0xfd, 0x81, 0xde, 0x13, 0xe0, 0x78, + 0x51, 0xc0, 0x71, 0xe9, 0x48, 0x9c, 0xa5, 0x0e, 0xe9, 0x85, 0xa7, 0xc2, 0x14, 0x93, 0xb4, 0xba, + 0xc0, 0xb7, 0xe2, 0xe2, 0x09, 0x15, 0xa0, 0xb0, 0x61, 0x5d, 0xc5, 0x4d, 0xab, 0x98, 0xf1, 0x9e, + 0x3d, 0xfe, 0x9a, 0x56, 0x31, 0x8b, 0x5e, 0x3b, 0x0d, 0xd3, 0x41, 0x60, 0xc3, 0xdf, 0xcf, 0x42, + 0xb1, 0x4c, 0x66, 0x68, 0x2b, 0xb6, 0xb5, 0x47, 0x6b, 0x24, 0xef, 0x8f, 0xff, 0x23, 0xd2, 0x0e, + 0x22, 0x41, 0xc0, 0xc1, 0xfe, 0xc2, 0x22, 0xb0, 0xa4, 0x4b, 0x98, 0x59, 0x7f, 0x09, 0x13, 0xbd, + 0x4d, 0xca, 0x61, 0x44, 0xb6, 0x94, 0xf4, 0x9b, 0xda, 0x6f, 0x65, 0x21, 0x5f, 0xee, 0x5a, 0x26, + 0xe6, 0x0f, 0x8d, 0x0e, 0x3d, 0x9d, 0x38, 0x78, 0x1f, 0x03, 0xbd, 0x30, 0x2b, 0x6b, 0x6b, 0x84, + 0x02, 0xf0, 0xca, 0x96, 0x94, 0xad, 0xdc, 0x20, 0x15, 0x4b, 0x3a, 0x7d, 0x81, 0x7e, 0x39, 0x0b, + 0x33, 0x34, 0x12, 0x59, 0xa9, 0xdb, 0x45, 0x8f, 0x0b, 0x85, 0x3a, 0x20, 0x38, 0x24, 0xfa, 0x45, + 0xe9, 0x43, 0x51, 0x41, 0xad, 0x02, 0xda, 0x09, 0x82, 0xe9, 0x25, 0x3b, 0xa3, 0x23, 0xb7, 0x13, + 0x37, 0x94, 0xa1, 0xf4, 0x45, 0xfd, 0x07, 0x59, 0xcf, 0x00, 0x30, 0xaf, 0x6c, 0xda, 0xf8, 0xaa, + 0x81, 0xaf, 0xa1, 0x1b, 0x43, 0x61, 0x1f, 0x0e, 0xb3, 0xf4, 0x16, 0xe9, 0x45, 0x1c, 0x8e, 0x64, + 0xe4, 0x46, 0xd8, 0x6c, 0x37, 0xcc, 0xc4, 0x7a, 0xf1, 0xfe, 0xd8, 0x57, 0x1c, 0x19, 0x8d, 0xcf, + 0x2e, 0xb9, 0x66, 0x13, 0xcd, 0x45, 0xfa, 0x82, 0xfd, 0xc8, 0x14, 0x4c, 0x6f, 0x99, 0x4e, 0xaf, + 0xab, 0x3b, 0xbb, 0xe8, 0x5f, 0x15, 0x28, 0xd0, 0x8b, 0x51, 0xd1, 0x37, 0x09, 0xd1, 0x5c, 0x9e, + 0xbf, 0x8f, 0x6d, 0xdf, 0x81, 0x87, 0xbe, 0x84, 0xf6, 0x51, 0x96, 0xb3, 0x8f, 0xd0, 0x07, 0x14, + 0xd9, 0x49, 0xaa, 0x5f, 0x28, 0xbb, 0x89, 0x35, 0x3a, 0x80, 0x48, 0xcf, 0x68, 0xbb, 0xfb, 0x36, + 0x76, 0x06, 0x06, 0x10, 0x89, 0xa4, 0xb2, 0x49, 0xff, 0xd2, 0x82, 0xdf, 0x91, 0x0e, 0x53, 0x2c, + 0xf1, 0xd0, 0x66, 0xd4, 0xe1, 0x88, 0x07, 0x67, 0xa1, 0xa0, 0xdb, 0xae, 0xe1, 0xb8, 0x6c, 0x7b, + 0x96, 0xbd, 0x79, 0xdd, 0x25, 0x7d, 0xda, 0xb2, 0xbb, 0x7e, 0xdc, 0xa7, 0x20, 0x01, 0xfd, 0x92, + 0xd4, 0xfc, 0x31, 0xbe, 0xe6, 0xc9, 0x20, 0x7f, 0x68, 0x84, 0x15, 0xee, 0xeb, 0xe1, 0x3a, 0xad, + 0xd4, 0xac, 0xb4, 0x68, 0x98, 0xa0, 0x20, 0x22, 0x50, 0x07, 0xbd, 0x5b, 0xe1, 0xd6, 0xef, 0x0e, + 0x84, 0x31, 0x82, 0x49, 0x31, 0x1c, 0x23, 0x82, 0x84, 0x98, 0xbd, 0x6e, 0x61, 0x09, 0x57, 0x91, + 0x5e, 0xc2, 0x45, 0x3f, 0x27, 0xbd, 0x17, 0x15, 0x88, 0x72, 0xc8, 0x1a, 0x60, 0xdc, 0xc5, 0x89, + 0x1f, 0x92, 0xda, 0x57, 0x1a, 0x56, 0xd2, 0x31, 0xc2, 0xf6, 0xe6, 0x29, 0x98, 0x5a, 0xd5, 0xbb, + 0x5d, 0x6c, 0x1f, 0x78, 0x43, 0x52, 0xd1, 0xe7, 0x70, 0x43, 0x37, 0x8d, 0x6d, 0xec, 0xb8, 0xf1, + 0x9d, 0xe5, 0x7b, 0xa5, 0x83, 0xf2, 0xb3, 0x32, 0x16, 0xfb, 0xe9, 0x47, 0xc8, 0xfc, 0x2e, 0xc8, + 0x19, 0xe6, 0xb6, 0xc5, 0xba, 0xcc, 0xfe, 0x35, 0x7f, 0xff, 0x67, 0x32, 0x75, 0x21, 0x19, 0x25, + 0xe3, 0xf2, 0x4b, 0x72, 0x91, 0x7e, 0xcf, 0xf9, 0x0b, 0x39, 0x98, 0xf7, 0x99, 0xa8, 0x9a, 0x1d, + 0xfc, 0x28, 0xbf, 0x14, 0xf3, 0x83, 0x39, 0xd9, 0x03, 0xb8, 0xfd, 0xf5, 0x21, 0xa4, 0x22, 0x44, + 0xda, 0x04, 0x68, 0xeb, 0x2e, 0xde, 0xb1, 0x6c, 0x23, 0xe8, 0x0f, 0x9f, 0x9e, 0x84, 0x5a, 0x99, + 0xfe, 0x7d, 0xa0, 0x71, 0x74, 0xd4, 0xfb, 0x61, 0x16, 0x07, 0x11, 0x4f, 0xfc, 0xa5, 0x9a, 0x58, + 0xbc, 0xf8, 0xfc, 0xe8, 0x0f, 0xa4, 0xce, 0xf9, 0xca, 0x54, 0x33, 0x19, 0x66, 0xad, 0xd1, 0xda, + 0xd0, 0x56, 0x6d, 0xa3, 0xa4, 0x35, 0xd6, 0x4a, 0xeb, 0xeb, 0xd5, 0xda, 0x6a, 0x10, 0x6a, 0x4b, + 0x85, 0x85, 0xe5, 0xfa, 0xa5, 0x1a, 0x17, 0x0b, 0x2d, 0x87, 0x36, 0x61, 0xda, 0x97, 0xd7, 0x20, + 0x4f, 0x4e, 0x5e, 0x66, 0xcc, 0x93, 0x93, 0x4b, 0xf2, 0x8c, 0x33, 0xa3, 0x1d, 0xb8, 0xf7, 0x90, + 0x67, 0xf4, 0x1b, 0x3a, 0xe4, 0xc9, 0x9a, 0x3a, 0x7a, 0x27, 0xd9, 0x44, 0xec, 0x75, 0xf5, 0x36, + 0x46, 0x7b, 0x09, 0xac, 0x71, 0xff, 0x96, 0xa8, 0xec, 0xa1, 0x5b, 0xa2, 0xc8, 0x23, 0xb3, 0xfa, + 0x4e, 0x0f, 0x5a, 0xc7, 0xd7, 0x68, 0x16, 0xf1, 0x48, 0x6c, 0xec, 0xee, 0x0a, 0x5d, 0xfe, 0x67, + 0x6c, 0x46, 0xa8, 0x64, 0x34, 0x4f, 0x69, 0x84, 0xff, 0x8d, 0xe3, 0x28, 0xfd, 0x16, 0xff, 0xf9, + 0x1c, 0xe4, 0x1b, 0xbd, 0xae, 0xe1, 0xa2, 0x1f, 0xcb, 0x8e, 0x05, 0x33, 0x7a, 0xb3, 0x97, 0x32, + 0xf4, 0x66, 0xaf, 0x70, 0xcf, 0x36, 0x27, 0xb1, 0x67, 0xdb, 0xc4, 0x8f, 0xba, 0xe2, 0x9e, 0xed, + 0x3d, 0x2c, 0x5c, 0x26, 0xdd, 0xf1, 0x7d, 0xc2, 0x00, 0x91, 0x92, 0x6a, 0x0d, 0x88, 0xc3, 0x7a, + 0xe1, 0xa9, 0x2c, 0x1c, 0x24, 0x40, 0x61, 0xa9, 0xde, 0x6c, 0xd6, 0x37, 0x8a, 0x27, 0x48, 0x1c, + 0xb1, 0xfa, 0x26, 0x0d, 0xce, 0x55, 0xad, 0xd5, 0x2a, 0x5a, 0x31, 0x4b, 0x02, 0x54, 0x56, 0x9b, + 0xeb, 0x95, 0xa2, 0x22, 0x5e, 0xf3, 0x12, 0x6b, 0x7e, 0x8b, 0x65, 0xa7, 0xa9, 0x5e, 0x72, 0x86, + 0x78, 0x34, 0x3f, 0xe9, 0x2b, 0xd7, 0x0f, 0x2b, 0x90, 0xdf, 0xc0, 0xf6, 0x0e, 0x46, 0xcf, 0x4f, + 0xb0, 0xc9, 0xb7, 0x6d, 0xd8, 0x0e, 0x0d, 0xe7, 0x19, 0x6e, 0xf2, 0xf1, 0x69, 0xea, 0xad, 0x30, + 0xef, 0xe0, 0xb6, 0x65, 0x76, 0xfc, 0x4c, 0xb4, 0x3f, 0x12, 0x13, 0xd1, 0xab, 0x13, 0x42, 0x46, + 0x18, 0x1d, 0xcb, 0x4e, 0x5d, 0x12, 0x60, 0x06, 0x95, 0x9a, 0x3e, 0x30, 0x5f, 0x51, 0xbc, 0x9f, + 0x7a, 0x07, 0xe8, 0xd5, 0xd2, 0xbb, 0xaf, 0x77, 0x42, 0xe1, 0xb2, 0x1f, 0xd1, 0x5f, 0x89, 0xec, + 0x8f, 0x59, 0x1e, 0x75, 0x09, 0x4e, 0x39, 0xb8, 0x8b, 0xdb, 0x2e, 0xee, 0x78, 0x4d, 0x57, 0x1b, + 0xda, 0x29, 0x1c, 0xce, 0x8e, 0x7e, 0x87, 0x07, 0xf0, 0x3e, 0x11, 0xc0, 0xdb, 0x06, 0x88, 0xd2, + 0xab, 0x50, 0xb4, 0xad, 0xec, 0x55, 0xa3, 0xd1, 0xb5, 0x82, 0x45, 0x71, 0xff, 0xdd, 0xfb, 0xb6, + 0xeb, 0xee, 0x75, 0xc9, 0x37, 0x76, 0x3c, 0xc1, 0x7f, 0x57, 0x17, 0x61, 0x4a, 0x37, 0x0f, 0xc8, + 0xa7, 0x5c, 0x4c, 0xad, 0xfd, 0x4c, 0xe8, 0xb5, 0x01, 0xf2, 0x0f, 0x08, 0xc8, 0x3f, 0x49, 0x8e, + 0xdd, 0xf4, 0x81, 0xff, 0xce, 0x29, 0xc8, 0x6f, 0xea, 0x8e, 0x8b, 0xd1, 0xff, 0xa3, 0xc8, 0x22, + 0x7f, 0x1b, 0x2c, 0x6c, 0x5b, 0xed, 0x7d, 0x07, 0x77, 0xc4, 0x46, 0xd9, 0x97, 0x3a, 0x0e, 0xcc, + 0xd5, 0x3b, 0xa0, 0xe8, 0x27, 0x32, 0xb2, 0xfe, 0x36, 0xfc, 0xa1, 0x74, 0x72, 0x69, 0x88, 0xb3, + 0xa9, 0xdb, 0x6e, 0x7d, 0x9b, 0xa4, 0x05, 0x97, 0x86, 0xf0, 0x89, 0x02, 0xf4, 0x85, 0x18, 0xe8, + 0xa7, 0xa2, 0xa1, 0x9f, 0x96, 0x80, 0x5e, 0x2d, 0xc1, 0xf4, 0xb6, 0xd1, 0xc5, 0xe4, 0x87, 0x19, + 0xf2, 0xc3, 0xa0, 0x31, 0x89, 0xc8, 0x3e, 0x18, 0x93, 0x56, 0x8c, 0x2e, 0xd6, 0x82, 0xdf, 0xfc, + 0x89, 0x0c, 0x84, 0x13, 0x99, 0x75, 0xea, 0x8d, 0xeb, 0x19, 0x5e, 0xa6, 0xbe, 0x87, 0xfd, 0xc5, + 0x37, 0x93, 0x1d, 0x8d, 0xe9, 0xe8, 0xae, 0x4e, 0xc0, 0x98, 0xd3, 0xc8, 0xb3, 0xe8, 0x17, 0xa2, + 0xf4, 0xfb, 0x85, 0xbc, 0x44, 0x49, 0xd6, 0x23, 0xfa, 0xcc, 0x46, 0xb4, 0xa8, 0xcb, 0x3e, 0x40, + 0xd4, 0x52, 0x0c, 0xde, 0x3d, 0x60, 0xda, 0xba, 0x8d, 0xdd, 0x4d, 0xde, 0x13, 0x23, 0xaf, 0x89, + 0x89, 0xc4, 0x11, 0xd0, 0x69, 0xe8, 0x7b, 0xf4, 0x52, 0x90, 0xb2, 0xf7, 0x8d, 0x39, 0x78, 0x1d, + 0x4a, 0x0f, 0xfb, 0xdf, 0xfc, 0xb8, 0xfb, 0xdf, 0x41, 0x75, 0x4c, 0xbf, 0x19, 0xbe, 0x3e, 0x07, + 0x4a, 0x79, 0xdf, 0x7d, 0x4c, 0x77, 0xbf, 0xff, 0x26, 0xed, 0xe7, 0xc2, 0xfa, 0xb3, 0x7d, 0xf7, + 0x78, 0x7b, 0xdf, 0x84, 0x5a, 0x22, 0xe7, 0x4f, 0x13, 0x55, 0xb7, 0xf4, 0x75, 0xe4, 0xe7, 0x95, + 0xc0, 0x3d, 0xf3, 0xc5, 0x99, 0xa3, 0x9b, 0xe6, 0x88, 0xf6, 0x4f, 0x5c, 0xcf, 0x10, 0xbc, 0xfb, + 0x1d, 0x4f, 0x4e, 0x88, 0x8e, 0x4a, 0xb6, 0xd7, 0x89, 0x28, 0xe7, 0x34, 0xfa, 0x82, 0x7e, 0x5c, + 0xda, 0x69, 0x9d, 0x8a, 0x2d, 0xd6, 0x95, 0x30, 0x99, 0x4d, 0x25, 0x77, 0x6f, 0x7a, 0x4c, 0xb1, + 0xe9, 0x03, 0xf6, 0x77, 0xbc, 0xab, 0x60, 0xe9, 0xc8, 0x88, 0xa1, 0xd7, 0x49, 0x6f, 0x47, 0xd1, + 0x6a, 0x0f, 0x59, 0x2f, 0x4c, 0x26, 0x6f, 0xb9, 0xcd, 0xaa, 0xd8, 0x82, 0x27, 0x70, 0xcb, 0x99, + 0x02, 0x05, 0xba, 0x05, 0x89, 0xde, 0x2a, 0xdd, 0x44, 0xbc, 0xde, 0x48, 0x74, 0x21, 0x0c, 0xde, + 0x93, 0xac, 0x39, 0x08, 0xae, 0x86, 0xb9, 0x44, 0xae, 0x86, 0xe2, 0x29, 0x50, 0x89, 0x76, 0x44, + 0xeb, 0x98, 0xf2, 0x74, 0x32, 0x49, 0x0b, 0x1b, 0xc8, 0x50, 0xfa, 0x78, 0x7f, 0x77, 0x1e, 0xe6, + 0x68, 0xd1, 0xd4, 0xc7, 0x19, 0xbd, 0x3b, 0xfb, 0x1f, 0x07, 0x75, 0xb5, 0x06, 0x73, 0xd7, 0x08, + 0xdb, 0xf4, 0xf6, 0x32, 0xb6, 0x72, 0x71, 0x47, 0xec, 0xba, 0x07, 0xad, 0xa7, 0x7f, 0xdf, 0x99, + 0xf0, 0xbf, 0x27, 0x63, 0xba, 0xe0, 0x4f, 0x1d, 0xb8, 0x0a, 0xc4, 0xc8, 0xe2, 0x93, 0xd4, 0xb3, + 0x50, 0xb8, 0x6a, 0xe0, 0x6b, 0xd5, 0x0e, 0xb3, 0x6e, 0xd9, 0x1b, 0xfa, 0x65, 0xe9, 0x7d, 0x5b, + 0x1e, 0x6e, 0xc6, 0x4b, 0xba, 0x5a, 0x28, 0xb7, 0x7b, 0x3b, 0x94, 0xad, 0x09, 0x9c, 0x48, 0x16, + 0xef, 0x25, 0x2f, 0x27, 0x50, 0xc4, 0x28, 0xc3, 0x59, 0x0c, 0x04, 0x12, 0x7b, 0xde, 0x85, 0x0a, + 0x60, 0xcc, 0x57, 0x96, 0xcb, 0x45, 0xa7, 0x18, 0x52, 0x74, 0xfa, 0x92, 0x7f, 0xa3, 0x02, 0x33, + 0x0d, 0xec, 0xae, 0x18, 0xb8, 0xdb, 0x71, 0x90, 0x7d, 0x74, 0xd3, 0xe8, 0x2e, 0x28, 0x6c, 0x13, + 0x62, 0xc3, 0xce, 0x2d, 0xb0, 0x6c, 0xe8, 0xf5, 0x59, 0xd9, 0x1d, 0x61, 0xb6, 0xfa, 0xe6, 0x73, + 0x3b, 0x16, 0x98, 0xe4, 0x3c, 0x7a, 0xe3, 0x4b, 0x9e, 0x40, 0x28, 0x71, 0x05, 0xe6, 0xd8, 0x45, + 0xc6, 0xa5, 0xae, 0xb1, 0x63, 0xf2, 0xf7, 0x02, 0x8e, 0xdc, 0x42, 0xd4, 0xa7, 0x40, 0x5e, 0xf7, + 0xa8, 0xb1, 0xad, 0x57, 0x34, 0xb0, 0xf3, 0x24, 0xe5, 0x69, 0x34, 0x63, 0x82, 0xc0, 0xbd, 0xa1, + 0x62, 0xfb, 0x3c, 0x4f, 0x30, 0x70, 0xef, 0xd0, 0xc2, 0xd3, 0x47, 0xec, 0x8b, 0x0a, 0x9c, 0x66, + 0x0c, 0x5c, 0xc4, 0xb6, 0x6b, 0xb4, 0xf5, 0x2e, 0x45, 0xee, 0xe5, 0x99, 0x71, 0x40, 0xb7, 0x06, + 0xf3, 0x57, 0x79, 0xb2, 0x0c, 0xc2, 0x0b, 0x03, 0x21, 0x14, 0x18, 0xd0, 0xc4, 0x1f, 0x13, 0x04, + 0x40, 0x15, 0xa4, 0x2a, 0xd0, 0x9c, 0x60, 0x00, 0x54, 0x69, 0x26, 0xd2, 0x87, 0xf8, 0x55, 0x2c, + 0xb0, 0x4f, 0xd8, 0x7d, 0xfe, 0xa1, 0x34, 0xb6, 0x5b, 0x30, 0x4b, 0xb0, 0xa4, 0x3f, 0xb2, 0x65, + 0x88, 0x18, 0x25, 0x0e, 0xfa, 0x1d, 0x76, 0x45, 0x63, 0xf0, 0xaf, 0xc6, 0xd3, 0x41, 0x97, 0x00, + 0xc2, 0x4f, 0x7c, 0x27, 0x9d, 0x89, 0xea, 0xa4, 0xb3, 0x72, 0x9d, 0xf4, 0x5b, 0xa4, 0x43, 0xad, + 0x0c, 0x66, 0xfb, 0xe8, 0xea, 0x21, 0x17, 0x64, 0x63, 0x78, 0xe9, 0xe9, 0xeb, 0xc5, 0x6b, 0x99, + 0x5e, 0x2c, 0xef, 0xf7, 0xba, 0x46, 0xdb, 0x9b, 0x4f, 0x7d, 0x74, 0x2c, 0xf3, 0x29, 0xbe, 0x3f, + 0x50, 0xfa, 0xfa, 0x83, 0x23, 0x58, 0xd2, 0xb7, 0xc3, 0x49, 0x5a, 0x44, 0x39, 0x60, 0x2b, 0x4f, + 0x03, 0x49, 0xf4, 0x25, 0x8b, 0x51, 0x0d, 0x25, 0x95, 0x20, 0x10, 0xc2, 0x08, 0x4b, 0x9f, 0xc9, + 0x8c, 0xdd, 0xa4, 0x0a, 0x12, 0xc5, 0xd9, 0x04, 0xdc, 0x42, 0x73, 0xd4, 0xda, 0xdd, 0x22, 0xb7, + 0x68, 0xa2, 0xcf, 0xe5, 0xc6, 0x31, 0x22, 0x3c, 0x07, 0x72, 0xc4, 0xc5, 0x5d, 0x89, 0x5c, 0xd2, + 0x08, 0x8b, 0x0c, 0xaf, 0x38, 0xc5, 0x8f, 0xba, 0x6b, 0x27, 0x34, 0xf2, 0xa7, 0x7a, 0x07, 0x9c, + 0xbc, 0xac, 0xb7, 0xaf, 0xec, 0xd8, 0xd6, 0x3e, 0xb9, 0x6f, 0xd0, 0x62, 0x17, 0x17, 0x92, 0x0b, + 0x60, 0xc5, 0x0f, 0xea, 0xdd, 0xbe, 0xe9, 0x90, 0x1f, 0x66, 0x3a, 0xac, 0x9d, 0x60, 0xc6, 0x83, + 0xfa, 0xd4, 0xa0, 0xd3, 0x29, 0xc4, 0x76, 0x3a, 0x6b, 0x27, 0xfc, 0x6e, 0x47, 0x5d, 0x86, 0xe9, + 0x8e, 0x71, 0x95, 0x6c, 0x55, 0x93, 0x59, 0xd7, 0xb0, 0x83, 0xcf, 0xcb, 0xc6, 0x55, 0xba, 0xb1, + 0xbd, 0x76, 0x42, 0x0b, 0xfe, 0x54, 0x57, 0x61, 0x86, 0x6c, 0x0b, 0x10, 0x32, 0xd3, 0x89, 0x0e, + 0x35, 0xaf, 0x9d, 0xd0, 0xc2, 0x7f, 0x3d, 0xeb, 0x23, 0x47, 0xce, 0x7e, 0x3c, 0xe0, 0x6f, 0xb7, + 0x67, 0x12, 0x6d, 0xb7, 0x7b, 0xb2, 0xa0, 0x1b, 0xee, 0x67, 0x21, 0xdf, 0x26, 0x12, 0xce, 0x32, + 0x09, 0xd3, 0x57, 0xf5, 0x3e, 0xc8, 0xed, 0xe9, 0xb6, 0x3f, 0x79, 0xbe, 0x6d, 0x38, 0xdd, 0x0d, + 0xdd, 0xbe, 0xe2, 0x21, 0xe8, 0xfd, 0xb5, 0x34, 0x05, 0x79, 0x22, 0xb8, 0xe0, 0x01, 0xfd, 0x7c, + 0x8e, 0x9a, 0x21, 0x65, 0xcb, 0xf4, 0x86, 0xfd, 0xa6, 0xe5, 0x1f, 0x90, 0xf9, 0xe5, 0xcc, 0x78, + 0x2c, 0xc8, 0xeb, 0xb8, 0x70, 0xc3, 0xa6, 0xf1, 0xfc, 0x7d, 0xfc, 0x10, 0x3e, 0x60, 0x4b, 0xa2, + 0x83, 0x3e, 0xa9, 0xe7, 0x01, 0x5c, 0xe6, 0x2d, 0x1c, 0x04, 0x52, 0xe2, 0x52, 0xc2, 0xe5, 0x83, + 0xfc, 0x70, 0x47, 0x95, 0xdf, 0x19, 0xc1, 0x74, 0xe9, 0x17, 0x44, 0xf4, 0x0c, 0xbc, 0x6b, 0x98, + 0x5c, 0x9d, 0xfd, 0xd7, 0x84, 0x9d, 0x52, 0x52, 0xa3, 0x66, 0x08, 0x7b, 0xe9, 0xf7, 0x4d, 0x3f, + 0x9b, 0xa3, 0x11, 0x57, 0xe9, 0x29, 0x0c, 0xf1, 0x86, 0x5f, 0xf4, 0xa9, 0xb1, 0x28, 0xcd, 0x80, + 0x01, 0x47, 0x19, 0x38, 0xe0, 0x1c, 0x3a, 0xa4, 0x9c, 0x1b, 0x72, 0x48, 0x39, 0x9f, 0x6c, 0xe5, + 0xf0, 0xc3, 0xbc, 0xfe, 0x6c, 0x8a, 0xfa, 0x73, 0x6f, 0x04, 0x40, 0x83, 0xe4, 0x32, 0x16, 0xfb, + 0xe6, 0x9d, 0x81, 0xa6, 0x34, 0x04, 0x4d, 0x79, 0x60, 0x74, 0x46, 0xd2, 0xd7, 0x96, 0x0f, 0xe6, + 0xe0, 0xba, 0x90, 0x99, 0x1a, 0xbe, 0xc6, 0x14, 0xe5, 0xf7, 0xc7, 0xa2, 0x28, 0xc9, 0x63, 0x20, + 0xa4, 0xad, 0x31, 0xbf, 0x29, 0x7d, 0x76, 0xa8, 0x1f, 0xa8, 0x40, 0x36, 0xd1, 0x77, 0xe4, 0xd3, + 0x1e, 0xc6, 0xbf, 0x23, 0x9f, 0xbe, 0x25, 0xec, 0x6e, 0xe4, 0x4e, 0x1c, 0xc9, 0xf2, 0x36, 0x01, + 0xfd, 0x61, 0xeb, 0x1a, 0xcd, 0x7d, 0xdb, 0xac, 0x9a, 0xae, 0x85, 0xbe, 0x63, 0x2c, 0x8a, 0x13, + 0x78, 0xc3, 0x29, 0xa3, 0x78, 0xc3, 0x8d, 0xb4, 0xca, 0xe1, 0xd7, 0xe0, 0x58, 0x56, 0x39, 0x22, + 0x0a, 0x4f, 0x1f, 0xbf, 0x77, 0x28, 0x70, 0x96, 0x4d, 0xb6, 0x96, 0x44, 0x0b, 0x11, 0x3d, 0x3c, + 0x0e, 0x20, 0x4f, 0xfb, 0x66, 0x12, 0xbb, 0x57, 0x92, 0xbc, 0x88, 0x27, 0xa5, 0x62, 0x6f, 0xd4, + 0x11, 0xa6, 0x83, 0x7d, 0x1c, 0x8e, 0x05, 0x29, 0xb9, 0x8b, 0x74, 0x12, 0xb0, 0x91, 0x3e, 0x66, + 0xaf, 0x54, 0xa0, 0x40, 0xcf, 0x69, 0xa1, 0xad, 0x54, 0x1c, 0x26, 0xc4, 0x18, 0xd1, 0x12, 0x3b, + 0x72, 0x94, 0x9b, 0xd4, 0xce, 0xb0, 0x25, 0xd9, 0x8b, 0x1b, 0xc8, 0xca, 0x04, 0x5c, 0x08, 0xb3, + 0x30, 0xdb, 0xc0, 0x6e, 0x59, 0xb7, 0x6d, 0x43, 0xdf, 0x19, 0x97, 0xc7, 0xb7, 0xac, 0xf7, 0x30, + 0xfa, 0x6a, 0x46, 0xf6, 0x3c, 0x4d, 0xb0, 0x10, 0xee, 0xb3, 0x1a, 0x11, 0x89, 0xf0, 0x4d, 0x52, + 0x67, 0x66, 0x86, 0x51, 0x9b, 0x80, 0xc7, 0x76, 0x16, 0xa6, 0xfc, 0xb3, 0x78, 0x77, 0x09, 0xe7, + 0x33, 0x77, 0xdd, 0x3d, 0xff, 0x18, 0x0c, 0x79, 0x3e, 0x7c, 0x06, 0x0c, 0xbd, 0x26, 0xa1, 0xa3, + 0x7c, 0xfc, 0x41, 0xc2, 0x64, 0x6d, 0x2c, 0x89, 0x3b, 0xfc, 0x71, 0x1d, 0x1d, 0xfc, 0xc5, 0x29, + 0xb6, 0x1c, 0xb9, 0xae, 0xbb, 0xf8, 0x51, 0xf4, 0x87, 0x0a, 0x4c, 0x35, 0xb0, 0xeb, 0x8d, 0xb7, + 0xc2, 0x75, 0xd2, 0xa3, 0x6a, 0xb8, 0xca, 0xad, 0x78, 0xcc, 0xb0, 0x35, 0x8c, 0x07, 0x61, 0xa6, + 0x67, 0x5b, 0x6d, 0xec, 0x38, 0x6c, 0xf5, 0x82, 0x77, 0x54, 0x1b, 0x34, 0xfa, 0x13, 0xd6, 0x16, + 0x37, 0xfd, 0x7f, 0xb4, 0xf0, 0xf7, 0xa4, 0x66, 0x00, 0xa5, 0xc4, 0x2a, 0x38, 0x69, 0x33, 0x20, + 0xae, 0xf0, 0xf4, 0x81, 0xfe, 0x5d, 0x05, 0xe6, 0x1a, 0xd8, 0x0d, 0xa4, 0x98, 0x60, 0x93, 0x23, + 0x1a, 0x5e, 0x01, 0x4a, 0xe5, 0x68, 0x50, 0xca, 0x5f, 0xc6, 0x2a, 0x4a, 0x33, 0x20, 0x36, 0xc1, + 0xcb, 0x58, 0xe5, 0x38, 0x98, 0xc0, 0xf1, 0xb5, 0x27, 0xc0, 0x0c, 0xe1, 0x85, 0x34, 0xd8, 0xef, + 0xcd, 0x85, 0x8d, 0xf7, 0xb3, 0x29, 0x35, 0xde, 0xfb, 0x21, 0xbf, 0xa7, 0xdb, 0x57, 0x1c, 0xd2, + 0x70, 0x67, 0x65, 0xcc, 0xf6, 0x0d, 0x2f, 0xbb, 0x46, 0xff, 0x1a, 0xec, 0xa7, 0x99, 0x4f, 0xe6, + 0xa7, 0xf9, 0xa6, 0x6c, 0xa2, 0x91, 0x90, 0xce, 0x1d, 0xc6, 0xd8, 0xe4, 0x13, 0x8c, 0x9b, 0x31, + 0x65, 0xa7, 0xaf, 0x1c, 0x2f, 0x57, 0x60, 0xda, 0x1b, 0xb7, 0x89, 0x3d, 0x7e, 0xe9, 0xe8, 0xea, + 0x30, 0xd8, 0xd0, 0x4f, 0xd8, 0x03, 0xfb, 0x12, 0x19, 0x9f, 0x79, 0x9f, 0xa0, 0x07, 0x8e, 0x2b, + 0x3c, 0x7d, 0x3c, 0xde, 0x45, 0xf1, 0x20, 0xed, 0x01, 0xfd, 0xb4, 0x02, 0xca, 0x2a, 0x76, 0x27, + 0x6d, 0x45, 0xbe, 0x5d, 0x3a, 0xc4, 0x91, 0x20, 0x30, 0xc2, 0xf3, 0xe2, 0x2a, 0x1e, 0x4f, 0x03, + 0x92, 0x8b, 0x6d, 0x24, 0xc5, 0x40, 0xfa, 0xa8, 0xbd, 0x8f, 0xa2, 0x46, 0x37, 0x17, 0xbe, 0x7d, + 0x0c, 0xbd, 0xea, 0x64, 0x17, 0x3e, 0x7c, 0x01, 0x12, 0x1a, 0xc7, 0xd5, 0xde, 0x06, 0x15, 0x3e, + 0x91, 0xcb, 0x4f, 0xc1, 0x6b, 0xec, 0xbb, 0xb8, 0x7d, 0x05, 0x77, 0xf8, 0xcb, 0xe4, 0x46, 0x85, + 0xee, 0x1c, 0x4c, 0xb5, 0x29, 0x35, 0x02, 0xde, 0xb4, 0xe6, 0xbf, 0x26, 0xb8, 0xc9, 0x5f, 0xec, + 0x88, 0xe8, 0xef, 0x13, 0xbc, 0xc9, 0x5f, 0xa2, 0xf8, 0x09, 0x98, 0x2d, 0x74, 0x96, 0x51, 0x6d, + 0x5b, 0x26, 0xfa, 0xaf, 0x47, 0x87, 0xe5, 0x26, 0x98, 0x31, 0xda, 0x96, 0x49, 0xc2, 0x50, 0xf8, + 0x87, 0x80, 0x82, 0x04, 0xff, 0x6b, 0x65, 0xcf, 0x7a, 0xc4, 0x60, 0xbb, 0xe6, 0x61, 0xc2, 0xa8, + 0xc6, 0x84, 0xc7, 0xfa, 0x71, 0x19, 0x13, 0x03, 0xca, 0x4e, 0x1f, 0xb2, 0x8f, 0x85, 0xde, 0x6d, + 0xb4, 0x2b, 0x7c, 0x4c, 0xac, 0x02, 0x8f, 0x32, 0x9c, 0xf1, 0xb5, 0x38, 0x96, 0xe1, 0x2c, 0x86, + 0x81, 0x09, 0xdc, 0x86, 0x12, 0xe2, 0x98, 0xfa, 0x1a, 0xf0, 0x11, 0xd0, 0x19, 0x9f, 0x79, 0x38, + 0x22, 0x3a, 0xc7, 0x63, 0x22, 0x7e, 0x88, 0x85, 0xc8, 0x64, 0x16, 0x0f, 0xfa, 0x6f, 0xe3, 0x00, + 0xe7, 0xde, 0x51, 0xfc, 0x15, 0xa8, 0xb7, 0x02, 0x7a, 0x5b, 0x56, 0x36, 0x04, 0xca, 0x21, 0x09, + 0x7a, 0x54, 0xc6, 0x82, 0xe0, 0x5b, 0xa4, 0x62, 0x93, 0xc8, 0x94, 0x9f, 0x3e, 0x80, 0x2f, 0x53, + 0x60, 0x81, 0xf8, 0x08, 0x74, 0xb1, 0x6e, 0xd3, 0x8e, 0x72, 0x2c, 0x8e, 0xf2, 0xef, 0x92, 0x0e, + 0xf0, 0x23, 0xca, 0x21, 0xe4, 0x63, 0x2c, 0x50, 0xc8, 0x45, 0xf7, 0x91, 0x64, 0x61, 0x22, 0xdb, + 0x28, 0xc5, 0x80, 0x05, 0xa6, 0xe2, 0xe3, 0xc1, 0x23, 0xa1, 0x47, 0xae, 0x28, 0x0c, 0xbf, 0xb1, + 0x4d, 0xd8, 0x23, 0x57, 0x86, 0x89, 0xf4, 0x31, 0xf9, 0xe9, 0xa7, 0xb0, 0x05, 0xe7, 0xa6, 0x7e, + 0xb9, 0x8b, 0xd1, 0xeb, 0x72, 0xc1, 0x89, 0xb6, 0xdf, 0x1d, 0x8b, 0x07, 0xe6, 0x11, 0x02, 0xe2, + 0xab, 0x90, 0xb3, 0xad, 0x6b, 0x74, 0x69, 0x6b, 0x5e, 0x23, 0xcf, 0xf4, 0x72, 0xcb, 0xee, 0xfe, + 0x9e, 0x49, 0x4f, 0x86, 0xce, 0x6b, 0xfe, 0xab, 0x7a, 0x2b, 0xcc, 0x5f, 0x33, 0xdc, 0xdd, 0x35, + 0xac, 0x77, 0xb0, 0xad, 0x59, 0xd7, 0x88, 0xc7, 0xdc, 0xb4, 0x26, 0x26, 0x8a, 0xfe, 0x2b, 0x12, + 0xf6, 0xa5, 0x27, 0x94, 0xc9, 0x1c, 0x7f, 0x4b, 0x62, 0x79, 0x46, 0x73, 0x95, 0xbe, 0xc2, 0xbc, + 0x5f, 0x81, 0x19, 0xcd, 0xba, 0xc6, 0x94, 0xe4, 0xff, 0x3c, 0x5e, 0x1d, 0x49, 0x3c, 0xd1, 0x23, + 0x92, 0x0b, 0xd8, 0x9f, 0xf8, 0x44, 0x2f, 0xb6, 0xf8, 0x89, 0x9c, 0x5c, 0x9a, 0xd3, 0xac, 0x6b, + 0x0d, 0xec, 0xd2, 0x16, 0x81, 0x5a, 0x63, 0x72, 0xb2, 0x36, 0x1c, 0x4a, 0x90, 0xcd, 0xc3, 0x83, + 0xf7, 0xa4, 0xbb, 0x08, 0x81, 0x80, 0x02, 0x16, 0x27, 0xbd, 0x8b, 0x30, 0x94, 0x83, 0x09, 0xc4, + 0x48, 0x51, 0x60, 0x56, 0xb3, 0xae, 0x79, 0x43, 0xc3, 0x8a, 0xd1, 0xed, 0x8e, 0x67, 0x84, 0x4c, + 0x6a, 0xfc, 0xfb, 0x62, 0xf0, 0xb9, 0x98, 0xb8, 0xf1, 0x3f, 0x84, 0x81, 0xf4, 0x61, 0x78, 0x09, + 0x6d, 0x2c, 0xfe, 0x08, 0x6d, 0x8e, 0x07, 0x87, 0x51, 0x1b, 0x44, 0xc0, 0xc6, 0xb1, 0x35, 0x88, + 0x28, 0x0e, 0x26, 0xb2, 0x73, 0xb2, 0x50, 0x26, 0xc3, 0xfc, 0x78, 0xdb, 0xc4, 0x7b, 0x92, 0xb9, + 0x26, 0xb2, 0x61, 0x57, 0x60, 0x64, 0x2c, 0x68, 0x24, 0x70, 0x41, 0x94, 0xe0, 0x21, 0x7d, 0x3c, + 0x7e, 0x45, 0x81, 0x39, 0xca, 0xc2, 0x63, 0xc4, 0x0a, 0x18, 0xa9, 0x51, 0xf1, 0x35, 0x38, 0x9e, + 0x46, 0x15, 0xc3, 0xc1, 0x44, 0xee, 0x14, 0xf5, 0xec, 0xb8, 0x11, 0x8e, 0x8f, 0x47, 0x21, 0x38, + 0xb2, 0x31, 0x36, 0xc6, 0x23, 0xe4, 0xa3, 0x18, 0x63, 0xc7, 0x74, 0x8c, 0xfc, 0x25, 0x41, 0x2b, + 0x1a, 0x27, 0x06, 0x47, 0x68, 0x0a, 0x63, 0x84, 0x61, 0xc4, 0xa6, 0x70, 0x4c, 0x48, 0x7c, 0x49, + 0x01, 0xa0, 0x0c, 0x6c, 0x58, 0x57, 0xc9, 0x65, 0x3e, 0x63, 0xe8, 0xce, 0xfa, 0xdd, 0xea, 0x95, + 0x21, 0x6e, 0xf5, 0x09, 0x43, 0xb8, 0x24, 0x5d, 0x09, 0xe4, 0xa4, 0xec, 0x55, 0x72, 0xe2, 0x2b, + 0x81, 0xf1, 0xe5, 0xa7, 0x8f, 0xf1, 0x17, 0xa8, 0x35, 0x17, 0x1e, 0x30, 0xfd, 0xd1, 0xb1, 0xa0, + 0xcc, 0xcd, 0xfe, 0x15, 0x71, 0xf6, 0x7f, 0x04, 0x6c, 0x47, 0xb5, 0x11, 0x87, 0x1d, 0x1c, 0x4d, + 0xdf, 0x46, 0x3c, 0xbe, 0x03, 0xa2, 0xdf, 0x9e, 0x83, 0x93, 0xac, 0x13, 0xf9, 0x8f, 0x00, 0x71, + 0xc2, 0x73, 0x78, 0x42, 0x27, 0x39, 0x04, 0xe5, 0x71, 0x2d, 0x48, 0x25, 0x59, 0xca, 0x94, 0x60, + 0x6f, 0x22, 0xab, 0x1b, 0x85, 0xca, 0xa3, 0x3d, 0xdd, 0xec, 0xc8, 0x87, 0xfb, 0x1d, 0x02, 0xbc, + 0xbf, 0xd6, 0xa8, 0x88, 0x6b, 0x8d, 0x03, 0x56, 0x26, 0x13, 0xef, 0x5c, 0x13, 0x91, 0x51, 0x76, + 0x27, 0xbe, 0x73, 0x1d, 0x5d, 0x76, 0xfa, 0x28, 0xbd, 0x47, 0x81, 0x5c, 0xc3, 0xb2, 0x5d, 0xf4, + 0xd2, 0x24, 0xad, 0x93, 0x4a, 0x3e, 0x04, 0xc9, 0x7f, 0x57, 0xcb, 0xc2, 0x1d, 0xcf, 0x77, 0xc5, + 0x1f, 0x75, 0xd6, 0x5d, 0x9d, 0x78, 0x75, 0x7b, 0xe5, 0x73, 0x97, 0x3d, 0x27, 0x8d, 0xa7, 0x43, + 0xe5, 0xd7, 0x88, 0x3e, 0x80, 0x91, 0x5a, 0x3c, 0x9d, 0xc8, 0x92, 0xd3, 0xc7, 0xed, 0x0d, 0x27, + 0x99, 0x6f, 0xeb, 0x8a, 0xd1, 0xc5, 0xe8, 0xa5, 0xd4, 0x65, 0xa4, 0xa6, 0xef, 0x61, 0xf9, 0x23, + 0x31, 0xb1, 0xae, 0xad, 0x24, 0xbe, 0xac, 0x12, 0xc6, 0x97, 0x4d, 0xda, 0xa0, 0xe8, 0x01, 0x74, + 0xca, 0xd2, 0xa4, 0x1b, 0x54, 0x4c, 0xd9, 0x13, 0x89, 0xd3, 0x79, 0xaa, 0x81, 0x5d, 0x6a, 0x54, + 0xd6, 0xfd, 0x1b, 0x58, 0xbe, 0x75, 0x2c, 0x11, 0x3b, 0x83, 0x0b, 0x5e, 0x94, 0xbe, 0x0b, 0x5e, + 0xde, 0xcf, 0x83, 0xb3, 0x21, 0x82, 0xf3, 0xcd, 0xd1, 0x02, 0x12, 0x99, 0x1c, 0x0b, 0x4c, 0x6f, + 0x0f, 0x60, 0xda, 0x14, 0x60, 0xba, 0x6f, 0x44, 0x2e, 0xd2, 0x07, 0xec, 0xfb, 0xf3, 0x70, 0x92, + 0x4e, 0xfa, 0x4b, 0x66, 0x87, 0x45, 0x58, 0x7d, 0x6b, 0xf6, 0x98, 0x37, 0xdb, 0x0e, 0x87, 0x60, + 0x15, 0x62, 0x39, 0xe7, 0xfb, 0xef, 0xd6, 0x5f, 0xa2, 0xe1, 0x5c, 0xbd, 0x4e, 0x94, 0xec, 0xb4, + 0xc9, 0xdf, 0xaf, 0x1f, 0xfc, 0x27, 0xde, 0x65, 0x34, 0x25, 0x7f, 0x97, 0xd1, 0x6f, 0x27, 0x5b, + 0xb7, 0x23, 0x45, 0xf7, 0x09, 0x3c, 0x65, 0xdb, 0x29, 0xc1, 0x8a, 0x9e, 0x04, 0x77, 0x5f, 0x1f, + 0xee, 0x64, 0x61, 0x04, 0x91, 0x11, 0xdd, 0xc9, 0x08, 0x81, 0xe3, 0x74, 0x27, 0x1b, 0xc6, 0xc0, + 0x04, 0x6e, 0xb5, 0xcf, 0xb3, 0xdd, 0x7c, 0xd2, 0x6e, 0xd0, 0x1f, 0x67, 0x53, 0x1f, 0xa5, 0xbf, + 0x96, 0x49, 0xe4, 0xff, 0x4c, 0xf8, 0x8a, 0x1f, 0xa6, 0x93, 0x78, 0x34, 0xc7, 0x91, 0x9b, 0xc0, + 0xba, 0x51, 0x96, 0xf8, 0xa2, 0x5f, 0x32, 0x3a, 0xee, 0xee, 0x98, 0x4e, 0x74, 0x5c, 0xf3, 0x68, + 0xf9, 0xd7, 0x23, 0x93, 0x17, 0xf4, 0x3f, 0x33, 0x89, 0x42, 0x48, 0x05, 0x22, 0x21, 0x6c, 0x45, + 0x88, 0x38, 0x41, 0xe0, 0xa7, 0x58, 0x7a, 0x13, 0xd4, 0xe8, 0x8b, 0x46, 0x07, 0x5b, 0x8f, 0x41, + 0x8d, 0x26, 0x7c, 0x8d, 0x4f, 0xa3, 0xe3, 0xc8, 0x7d, 0x9d, 0x6a, 0x74, 0x20, 0x92, 0x31, 0x69, + 0x74, 0x2c, 0xbd, 0xf4, 0x65, 0xfc, 0x9a, 0x39, 0x36, 0x91, 0x5a, 0x37, 0xcc, 0x2b, 0xe8, 0x9f, + 0x0a, 0xfe, 0xc5, 0xcc, 0x97, 0x0c, 0x77, 0x97, 0xc5, 0x82, 0xf9, 0xa0, 0xf4, 0xdd, 0x28, 0x23, + 0xc4, 0x7b, 0x11, 0xc3, 0x49, 0xe5, 0x0f, 0x85, 0x93, 0x2a, 0xc1, 0xbc, 0x61, 0xba, 0xd8, 0x36, + 0xf5, 0xee, 0x4a, 0x57, 0xdf, 0x71, 0xce, 0x4d, 0x0d, 0xbc, 0xbc, 0xae, 0xca, 0xe5, 0xd1, 0xc4, + 0x3f, 0xf8, 0xeb, 0x2b, 0xa7, 0xc5, 0xeb, 0x2b, 0x23, 0xa2, 0x5f, 0xcd, 0x44, 0x47, 0xbf, 0x0a, + 0xa2, 0x5b, 0xc1, 0xf0, 0xe0, 0xd8, 0xb2, 0xb6, 0x71, 0xc2, 0x70, 0x7f, 0x77, 0x49, 0x46, 0x61, + 0x0b, 0x42, 0x3f, 0xfe, 0xa4, 0x92, 0x68, 0x75, 0xcf, 0x53, 0x84, 0xc5, 0x7e, 0x25, 0x48, 0x6c, + 0xa1, 0xf2, 0x95, 0x57, 0xfa, 0x2a, 0x1f, 0x98, 0x3c, 0x39, 0x09, 0x93, 0x87, 0x57, 0xaa, 0xbc, + 0x9c, 0x52, 0x25, 0x59, 0x2c, 0x94, 0xa9, 0xed, 0x04, 0x4e, 0x23, 0xe5, 0xe1, 0x94, 0x1f, 0xed, + 0xb6, 0xd7, 0xc3, 0xba, 0xad, 0x9b, 0x6d, 0x8c, 0x3e, 0x96, 0x1d, 0x87, 0xd9, 0xbb, 0x02, 0xd3, + 0x46, 0xdb, 0x32, 0x1b, 0xc6, 0x0b, 0xfc, 0xcb, 0xe5, 0xe2, 0x83, 0xac, 0x13, 0x89, 0x54, 0xd9, + 0x1f, 0x5a, 0xf0, 0xaf, 0x5a, 0x85, 0x99, 0xb6, 0x6e, 0x77, 0x68, 0x10, 0xbe, 0x7c, 0xdf, 0x45, + 0x4e, 0x91, 0x84, 0xca, 0xfe, 0x2f, 0x5a, 0xf8, 0xb7, 0x5a, 0x17, 0x85, 0x58, 0xe8, 0x8b, 0xe6, + 0x11, 0x49, 0x6c, 0x39, 0xfc, 0x49, 0x90, 0xb9, 0x27, 0x1d, 0x1b, 0x77, 0xc9, 0x1d, 0xf4, 0xb4, + 0x87, 0x98, 0xd1, 0xc2, 0x84, 0xa4, 0xcb, 0x03, 0xa4, 0xa8, 0x43, 0x68, 0x4c, 0x7a, 0x79, 0x40, + 0x8a, 0x8b, 0xf4, 0x35, 0xf3, 0x9d, 0x05, 0x98, 0xa7, 0xbd, 0x1a, 0x13, 0x27, 0x7a, 0x19, 0xb9, + 0x42, 0xda, 0x7d, 0x08, 0x1f, 0xa0, 0xc6, 0xd1, 0xc7, 0xe4, 0x22, 0x28, 0x57, 0x82, 0x80, 0x83, + 0xde, 0x63, 0xd2, 0x7d, 0x7b, 0x9f, 0xaf, 0x45, 0xca, 0xd3, 0xa4, 0xf7, 0xed, 0xe3, 0x8b, 0x4f, + 0x1f, 0x9f, 0x1f, 0x50, 0x40, 0x29, 0x75, 0x3a, 0xa8, 0x7d, 0x74, 0x28, 0x6e, 0x81, 0x59, 0xbf, + 0xcd, 0x84, 0x31, 0x20, 0xf9, 0xa4, 0xa4, 0x8b, 0xa0, 0x81, 0x6c, 0x4a, 0x9d, 0x89, 0xef, 0x2a, + 0xc4, 0x94, 0x9d, 0x3e, 0x28, 0x9f, 0x9d, 0x62, 0x8d, 0x66, 0xc9, 0xb2, 0xae, 0x90, 0xa3, 0x32, + 0x3f, 0xa3, 0x40, 0x7e, 0x05, 0xbb, 0xed, 0x5d, 0xe4, 0x8c, 0xa5, 0xcd, 0xec, 0xdb, 0x5d, 0xbf, + 0xcd, 0xec, 0xdb, 0xdd, 0x61, 0x41, 0x39, 0x93, 0x46, 0x7f, 0xf6, 0xd9, 0x5e, 0x24, 0x2c, 0x4f, + 0x3a, 0xfa, 0x73, 0x6c, 0xe9, 0x13, 0x38, 0x04, 0x97, 0x83, 0x85, 0x60, 0x05, 0x8c, 0x62, 0xf6, + 0x0b, 0x99, 0xc7, 0xdc, 0x7a, 0xe8, 0x10, 0xbb, 0x19, 0xfd, 0x7e, 0xb2, 0x10, 0x6b, 0x81, 0xcc, + 0xc5, 0x9a, 0xa7, 0xbc, 0x30, 0x99, 0x20, 0xf8, 0x9a, 0x1c, 0x83, 0x13, 0x58, 0x01, 0x50, 0x60, + 0x9a, 0x30, 0xb4, 0x6c, 0x5c, 0x25, 0xae, 0x87, 0xc2, 0x42, 0xe5, 0x0b, 0xc7, 0xb2, 0x50, 0x79, + 0x9f, 0xb8, 0x50, 0x29, 0x19, 0x31, 0xd9, 0x5f, 0xa7, 0x4c, 0xe8, 0x8b, 0xe3, 0xfd, 0x3f, 0xf6, + 0x65, 0xca, 0x04, 0xbe, 0x38, 0x43, 0xca, 0x9f, 0x80, 0xeb, 0xe1, 0xf3, 0x58, 0x67, 0xed, 0x6f, + 0xc8, 0xa2, 0xff, 0x71, 0x0a, 0x72, 0x17, 0xbd, 0x87, 0x7f, 0x0c, 0x6f, 0xd4, 0x7a, 0xf5, 0x18, + 0x82, 0x3b, 0x3c, 0x1b, 0x72, 0x1e, 0x7d, 0x36, 0xed, 0xb9, 0x43, 0x6e, 0x77, 0xd8, 0x63, 0x44, + 0x23, 0xff, 0xa9, 0x67, 0xa1, 0xe0, 0x58, 0xfb, 0x76, 0xdb, 0x33, 0xbf, 0x3d, 0x8d, 0x61, 0x6f, + 0x49, 0x83, 0x9a, 0x0a, 0xa4, 0x17, 0xc7, 0xe7, 0x72, 0xca, 0x5d, 0xb0, 0xa4, 0x08, 0x17, 0x2c, + 0x25, 0xd8, 0x7f, 0x90, 0xe0, 0x2d, 0x7d, 0x8d, 0xf8, 0x63, 0x72, 0xd7, 0x60, 0x67, 0x5c, 0xb0, + 0x47, 0x88, 0xe5, 0xa8, 0xea, 0x90, 0xd4, 0x61, 0x5c, 0x14, 0x6d, 0x10, 0x47, 0x7e, 0xa2, 0x0e, + 0xe3, 0x12, 0x3c, 0x4c, 0xe4, 0x94, 0x7b, 0x81, 0x39, 0xb9, 0x3e, 0x3c, 0x4e, 0x74, 0x73, 0x82, + 0xd2, 0x1f, 0x09, 0x9d, 0x31, 0x3a, 0xbf, 0x8e, 0x8c, 0xce, 0x31, 0xb9, 0xbf, 0xfe, 0x9a, 0x42, + 0x22, 0x69, 0xfa, 0x46, 0x90, 0xfc, 0x45, 0x49, 0x89, 0x21, 0xf2, 0xc6, 0x60, 0x21, 0x8e, 0xf4, + 0xfc, 0xe8, 0xa1, 0xc5, 0x45, 0xd1, 0x71, 0xfc, 0x4f, 0x3a, 0xb4, 0xb8, 0x2c, 0x23, 0xe9, 0x03, + 0xf9, 0x53, 0xf4, 0x62, 0xb2, 0x52, 0xdb, 0x35, 0xae, 0x8e, 0xb9, 0xa5, 0x89, 0xc3, 0x4b, 0xc2, + 0x68, 0xc2, 0x87, 0x24, 0x44, 0x39, 0x9c, 0x74, 0x34, 0x61, 0x39, 0x36, 0xd2, 0x87, 0xe9, 0x2f, + 0x0a, 0x9e, 0xf4, 0xd8, 0xda, 0xce, 0x4f, 0xb3, 0xd5, 0x04, 0x7c, 0x74, 0xb4, 0x2e, 0xc0, 0x1c, + 0xb7, 0x74, 0xe0, 0x5f, 0x78, 0x23, 0xa4, 0x25, 0x3d, 0x28, 0x1f, 0x88, 0x6c, 0xec, 0x0b, 0x0b, + 0x09, 0x16, 0x8c, 0x65, 0x98, 0x98, 0xc8, 0x7d, 0x72, 0xfe, 0x18, 0x36, 0x21, 0xac, 0x3e, 0xc8, + 0x63, 0x55, 0x17, 0xb1, 0xba, 0x47, 0x46, 0x4c, 0x72, 0x63, 0x9a, 0xd4, 0xbc, 0xf1, 0x1d, 0x01, + 0x5c, 0x9a, 0x00, 0xd7, 0xb3, 0x47, 0xe6, 0x23, 0x7d, 0xc4, 0x7e, 0x8c, 0x76, 0x87, 0x0d, 0x6a, + 0xb2, 0x8f, 0xa7, 0x3b, 0x64, 0xb3, 0x01, 0x45, 0x98, 0x0d, 0x24, 0xf4, 0xd7, 0x0f, 0xdd, 0x50, + 0x7d, 0xe6, 0x86, 0x41, 0x94, 0x1b, 0xb3, 0xbf, 0xfe, 0x50, 0x0e, 0xd2, 0x07, 0xe7, 0xef, 0x15, + 0x80, 0x55, 0xdb, 0xda, 0xef, 0xd5, 0xed, 0x0e, 0xb6, 0xd1, 0x9f, 0x86, 0x13, 0x80, 0x1f, 0x1c, + 0xc3, 0x04, 0x60, 0x13, 0x60, 0x27, 0x20, 0xce, 0x34, 0xfc, 0x29, 0x72, 0xe6, 0x7e, 0xc8, 0x94, + 0xc6, 0xd1, 0x10, 0xaf, 0xac, 0x7d, 0xae, 0x88, 0x71, 0x5c, 0x9f, 0x15, 0x92, 0x1b, 0xe7, 0x04, + 0xe0, 0x5d, 0x01, 0xd6, 0x4d, 0x01, 0xeb, 0xe7, 0x1c, 0x81, 0x93, 0xf4, 0x31, 0xff, 0x87, 0x29, + 0x98, 0xa5, 0xdb, 0x7d, 0x54, 0xa6, 0x7f, 0x1d, 0x82, 0xfe, 0xa3, 0x63, 0x00, 0x7d, 0x0b, 0xe6, + 0xac, 0x90, 0x3a, 0xed, 0x53, 0xf9, 0x05, 0x98, 0x58, 0xd8, 0x39, 0xbe, 0x34, 0x81, 0x0c, 0xfa, + 0x55, 0x1e, 0x79, 0x4d, 0x44, 0xfe, 0xbe, 0x18, 0x79, 0x73, 0x14, 0xc7, 0x09, 0xfd, 0xbb, 0x03, + 0xe8, 0xb7, 0x04, 0xe8, 0x4b, 0x47, 0x61, 0x65, 0x02, 0xe1, 0xfa, 0x15, 0xc8, 0x91, 0xd3, 0x75, + 0x3f, 0x9b, 0xe2, 0xfc, 0xfe, 0x1c, 0x4c, 0x91, 0x26, 0x1b, 0xcc, 0x3b, 0xfc, 0x57, 0xef, 0x8b, + 0xbe, 0xed, 0x62, 0x3b, 0x58, 0xb9, 0xf5, 0x5f, 0x3d, 0x1e, 0x7c, 0xaf, 0x66, 0xe7, 0x5c, 0x81, + 0x6e, 0x64, 0x06, 0x09, 0x23, 0x4f, 0x4a, 0x78, 0x89, 0x8f, 0xed, 0xbc, 0xdd, 0x28, 0x93, 0x92, + 0x21, 0x8c, 0xa4, 0x0f, 0xfc, 0xe7, 0x72, 0x70, 0x8e, 0xae, 0x2a, 0xad, 0xd8, 0xd6, 0x5e, 0xdf, + 0xed, 0x58, 0xc6, 0xd1, 0x75, 0xe1, 0x36, 0x58, 0x70, 0x05, 0x7f, 0x6e, 0xa6, 0x13, 0x7d, 0xa9, + 0xe8, 0x77, 0x78, 0x9f, 0x8c, 0xe7, 0x89, 0x48, 0x2e, 0xc5, 0x08, 0x30, 0x8a, 0xf7, 0xc4, 0x0b, + 0xf5, 0x92, 0x8c, 0x72, 0x8b, 0x54, 0xca, 0x48, 0x6b, 0x96, 0x81, 0x4e, 0xe5, 0x65, 0x74, 0xea, + 0x03, 0x81, 0x4e, 0xfd, 0x17, 0x41, 0xa7, 0x56, 0x8f, 0x2e, 0x92, 0x09, 0xac, 0x5c, 0x2c, 0x40, + 0x61, 0xc5, 0xe8, 0xba, 0xd8, 0x46, 0x5f, 0x60, 0xf3, 0xa8, 0xd7, 0xa5, 0xd8, 0xbd, 0x2c, 0x43, + 0x61, 0x9b, 0x94, 0xc6, 0x0c, 0xb2, 0x3b, 0xe5, 0xb0, 0xa1, 0x1c, 0x6a, 0xec, 0xdf, 0xa4, 0xb1, + 0xe3, 0xfa, 0xc8, 0x8c, 0x6d, 0x02, 0x96, 0x20, 0x76, 0xdc, 0x70, 0x16, 0x26, 0x72, 0x6d, 0x52, + 0x41, 0xc3, 0x7b, 0xde, 0x08, 0x72, 0x25, 0x3d, 0x84, 0x8b, 0xa0, 0x18, 0x1d, 0x87, 0x34, 0xbd, + 0x19, 0xcd, 0x7b, 0x4c, 0xea, 0xc9, 0xd2, 0x2f, 0x2a, 0xca, 0xf2, 0xa4, 0x3d, 0x59, 0xa4, 0xb8, + 0x48, 0x1f, 0xb3, 0xaf, 0x11, 0x37, 0xc6, 0x5e, 0x57, 0x6f, 0x63, 0x8f, 0xfb, 0xd4, 0x50, 0x5b, + 0x80, 0xac, 0xe1, 0x8f, 0xf8, 0x59, 0x83, 0x6f, 0xa7, 0xf9, 0x23, 0xb4, 0xd3, 0x51, 0x17, 0xb9, + 0x02, 0x99, 0x93, 0x8a, 0x1f, 0xdb, 0x22, 0x57, 0x2c, 0x1b, 0x13, 0xb8, 0x14, 0xd3, 0x3f, 0xe6, + 0x39, 0xd1, 0xd6, 0x3a, 0xea, 0x16, 0x00, 0x13, 0xd6, 0xd8, 0x8e, 0x74, 0x8e, 0xb2, 0x05, 0x10, + 0xcd, 0xc3, 0x04, 0xd0, 0x5a, 0x60, 0x68, 0x7d, 0x86, 0x0d, 0xa3, 0x29, 0xef, 0xc2, 0x39, 0x96, + 0xed, 0x26, 0xdb, 0x85, 0xf3, 0xb8, 0xd3, 0xc8, 0x7f, 0x49, 0x8f, 0x05, 0x89, 0xa7, 0x7e, 0xc7, + 0x35, 0x7c, 0x26, 0x38, 0x16, 0x34, 0x8c, 0x81, 0xf4, 0xe1, 0x7d, 0xdb, 0x31, 0x0d, 0x9e, 0xa3, + 0x36, 0x47, 0xd6, 0x06, 0xc6, 0x36, 0x74, 0x8e, 0xd2, 0x1c, 0xa3, 0x79, 0x48, 0x1f, 0xaf, 0xbf, + 0xe3, 0x06, 0xce, 0xb7, 0x4c, 0x70, 0xe0, 0xf4, 0x5b, 0x66, 0x7e, 0xc4, 0x96, 0x39, 0xea, 0xee, + 0x02, 0x93, 0xf5, 0xf8, 0x06, 0xcc, 0x51, 0x76, 0x17, 0x62, 0x98, 0x48, 0x1f, 0xf1, 0xb7, 0x2a, + 0x90, 0x6f, 0x4c, 0x7e, 0xbc, 0x1c, 0x75, 0x2e, 0x42, 0x64, 0xd5, 0x18, 0xdb, 0x70, 0x39, 0xca, + 0x5c, 0x24, 0x92, 0x85, 0x09, 0x84, 0x85, 0x3f, 0x09, 0x73, 0x64, 0xc2, 0xed, 0x6f, 0xe2, 0xfd, + 0x1d, 0x1b, 0x35, 0xdf, 0x94, 0x62, 0x5b, 0x7d, 0x10, 0xa6, 0xfd, 0xdd, 0x21, 0x36, 0x72, 0x2e, + 0xca, 0xb5, 0x4f, 0x9f, 0x4b, 0x2d, 0xf8, 0xff, 0x48, 0x5b, 0xed, 0x63, 0xdf, 0x09, 0x1c, 0x75, + 0xab, 0xfd, 0x58, 0x77, 0x03, 0x7f, 0x3b, 0x1c, 0x51, 0xff, 0x6b, 0x7a, 0x98, 0xf7, 0xef, 0x12, + 0xe6, 0x06, 0xec, 0x12, 0x7e, 0x8c, 0xc7, 0xb2, 0x21, 0x62, 0x79, 0xbf, 0xac, 0x08, 0xc7, 0x38, + 0xd6, 0xbe, 0x27, 0x80, 0xf3, 0xa2, 0x00, 0xe7, 0xd2, 0x91, 0x78, 0x99, 0xc0, 0xb1, 0xbc, 0x5c, + 0x38, 0xe6, 0x7e, 0x3c, 0xc5, 0x76, 0xdc, 0xe7, 0xf3, 0x9f, 0x3b, 0xe4, 0xf3, 0x2f, 0xb4, 0xf4, + 0xfc, 0x11, 0x5b, 0xfa, 0xc7, 0x79, 0xed, 0x68, 0x8a, 0xda, 0xf1, 0x6c, 0x79, 0x44, 0xc6, 0x37, + 0x32, 0xbf, 0x37, 0x50, 0x8f, 0x4b, 0x82, 0x7a, 0x94, 0x8f, 0xc6, 0x4c, 0xfa, 0xfa, 0xf1, 0xeb, + 0xfe, 0x84, 0xf6, 0x98, 0xdb, 0xfb, 0xa8, 0x1b, 0x91, 0x82, 0x10, 0xc7, 0x36, 0x72, 0x8f, 0xb2, + 0x11, 0x39, 0x8c, 0x93, 0x09, 0x44, 0x0a, 0x9b, 0x87, 0x59, 0xc2, 0xd3, 0x25, 0xa3, 0xb3, 0x83, + 0x5d, 0xf4, 0x93, 0xd4, 0x03, 0xce, 0x8f, 0xcb, 0x38, 0xa6, 0xe0, 0x39, 0x51, 0xa7, 0x31, 0x93, + 0xfa, 0x0b, 0x50, 0x26, 0x17, 0x39, 0x06, 0x27, 0x1d, 0xdf, 0x6f, 0x28, 0x07, 0xe9, 0x43, 0xf6, + 0xab, 0xd4, 0x99, 0x63, 0x5d, 0x3f, 0xb0, 0xf6, 0x5d, 0xf4, 0xe2, 0x31, 0x74, 0xd0, 0x4b, 0x50, + 0xe8, 0x12, 0x6a, 0xcc, 0xe9, 0x3f, 0x7e, 0xba, 0xc3, 0x44, 0x40, 0xcb, 0xd7, 0xd8, 0x9f, 0x49, + 0x3d, 0xff, 0x43, 0x39, 0x52, 0x3a, 0x93, 0xf6, 0xfc, 0x1f, 0x52, 0xfe, 0x44, 0x6e, 0x80, 0x99, + 0xf6, 0x4a, 0x37, 0xf6, 0x0c, 0x77, 0x4c, 0xf1, 0x05, 0xba, 0x1e, 0x2d, 0x3f, 0xbe, 0x00, 0x79, + 0x49, 0x7a, 0x9e, 0x91, 0x93, 0x8a, 0xf7, 0xfb, 0xa4, 0xcf, 0x33, 0xc6, 0x17, 0x9f, 0x3e, 0x26, + 0x3f, 0x4c, 0x5b, 0xd6, 0x45, 0xea, 0xda, 0x99, 0xa2, 0xd7, 0xe8, 0xc8, 0x8d, 0x85, 0xb2, 0x76, + 0x7c, 0x8d, 0x65, 0x60, 0xf9, 0xe9, 0x03, 0xf3, 0x33, 0xdf, 0x08, 0xf9, 0x65, 0x7c, 0x79, 0x7f, + 0x07, 0xdd, 0x07, 0xd3, 0x4d, 0x1b, 0xe3, 0xaa, 0xb9, 0x6d, 0x79, 0xd2, 0x75, 0xbd, 0x67, 0x1f, + 0x12, 0xf6, 0xe6, 0xe1, 0xb1, 0x8b, 0xf5, 0x4e, 0x78, 0xba, 0xc9, 0x7f, 0x45, 0xaf, 0xce, 0x42, + 0xae, 0xe1, 0xea, 0x2e, 0x9a, 0x09, 0xb0, 0x45, 0x2f, 0xe6, 0xb1, 0xb8, 0x4f, 0xc4, 0xe2, 0x36, + 0x41, 0x16, 0x84, 0x83, 0x45, 0xef, 0xff, 0x08, 0x00, 0x10, 0x4c, 0x3f, 0xe2, 0x58, 0xa6, 0x97, + 0xc3, 0x3f, 0x80, 0xe7, 0xbf, 0xa3, 0xd7, 0x06, 0xe2, 0x7e, 0x40, 0x10, 0xf7, 0x93, 0xe4, 0x8a, + 0x98, 0xc0, 0x4a, 0x5b, 0x16, 0x66, 0x3c, 0xd1, 0xae, 0x61, 0xbd, 0xe3, 0xa0, 0x6f, 0x08, 0x95, + 0x3f, 0x42, 0xcc, 0xe8, 0x43, 0xd2, 0xa1, 0x22, 0x69, 0xad, 0x02, 0xe2, 0xd1, 0xfe, 0x02, 0x7e, + 0xa8, 0x8c, 0xac, 0x18, 0x2a, 0xe3, 0x2e, 0xc8, 0x19, 0xe6, 0xb6, 0xc5, 0xbc, 0xd7, 0x6e, 0x8c, + 0xa0, 0xed, 0xe9, 0x84, 0x46, 0x32, 0x4a, 0xc6, 0x91, 0x8c, 0x67, 0x6b, 0x22, 0x57, 0xb2, 0xe5, + 0xbc, 0xd2, 0xd1, 0xff, 0x31, 0x54, 0xd8, 0xaa, 0x0a, 0xb9, 0x9e, 0xee, 0xee, 0xb2, 0xa2, 0xc9, + 0xb3, 0x67, 0x23, 0xef, 0x9b, 0xba, 0x69, 0x99, 0x07, 0x7b, 0xc6, 0x0b, 0x82, 0x9b, 0x5f, 0x85, + 0x34, 0x8f, 0xf3, 0x1d, 0x6c, 0x62, 0x5b, 0x77, 0x71, 0xe3, 0xea, 0x0e, 0x99, 0x63, 0x4d, 0x6b, + 0x7c, 0x52, 0x62, 0xfd, 0xf7, 0x38, 0x8e, 0xd6, 0xff, 0x6d, 0xa3, 0x8b, 0x49, 0x1c, 0x21, 0xa6, + 0xff, 0xfe, 0x7b, 0x22, 0xfd, 0x1f, 0x50, 0x44, 0xfa, 0x68, 0xfc, 0x6b, 0x16, 0xe6, 0x1a, 0x9e, + 0xc2, 0x35, 0xf6, 0xf7, 0xf6, 0x74, 0xfb, 0x00, 0x3d, 0x3e, 0x44, 0x85, 0x53, 0xcd, 0x8c, 0xa0, + 0x9a, 0xe8, 0xd7, 0xa4, 0x2f, 0x3d, 0x66, 0x4d, 0x9b, 0x2b, 0x21, 0x71, 0x3b, 0x78, 0x2a, 0xe4, + 0x3d, 0xf5, 0xf6, 0xfd, 0xf9, 0x62, 0x1b, 0x02, 0xcd, 0x29, 0x19, 0x6f, 0x69, 0x28, 0x6f, 0x13, + 0x88, 0xf5, 0x90, 0x85, 0x93, 0x0d, 0x57, 0x6f, 0x5f, 0x59, 0xb5, 0x6c, 0x6b, 0xdf, 0x35, 0x4c, + 0xec, 0xa0, 0xc7, 0x85, 0x08, 0xf8, 0xfa, 0x9f, 0x09, 0xf5, 0x1f, 0xfd, 0x7b, 0x46, 0x76, 0x14, + 0x0d, 0xba, 0x55, 0x9e, 0x7c, 0x44, 0xf8, 0x24, 0xb9, 0x71, 0x51, 0x86, 0x62, 0xfa, 0x42, 0x7b, + 0x8b, 0x02, 0xc5, 0xca, 0xa3, 0x3d, 0xcb, 0x76, 0xd7, 0xad, 0xb6, 0xde, 0x75, 0x5c, 0xcb, 0xc6, + 0xa8, 0x1e, 0x2b, 0x35, 0xaf, 0x87, 0xe9, 0x58, 0xed, 0x70, 0x70, 0x64, 0x6f, 0xbc, 0xda, 0x29, + 0xa2, 0x8e, 0xff, 0xaa, 0xf4, 0x2e, 0x23, 0x95, 0x4a, 0x3f, 0x47, 0x11, 0x7a, 0x3e, 0xa8, 0x4b, + 0x4b, 0xe6, 0x8a, 0x2f, 0xb7, 0xf3, 0x28, 0xc5, 0xd4, 0x04, 0x96, 0xca, 0xb3, 0x30, 0xdf, 0xd8, + 0xbf, 0x1c, 0x10, 0x71, 0x78, 0x23, 0xe4, 0xf5, 0xd2, 0x31, 0x12, 0x98, 0xe2, 0xf1, 0x84, 0x22, + 0xe4, 0x7b, 0x2b, 0xcc, 0x3b, 0x7c, 0x36, 0x86, 0xb7, 0x98, 0x28, 0x19, 0x1b, 0x61, 0x78, 0xa9, + 0xe9, 0x0b, 0xf0, 0xbd, 0x59, 0x98, 0xaf, 0xf7, 0xb0, 0x89, 0x3b, 0xd4, 0xc7, 0x4e, 0x10, 0xe0, + 0xab, 0x13, 0x0a, 0x50, 0x20, 0x14, 0x21, 0xc0, 0xd0, 0x1f, 0x76, 0xd9, 0x17, 0x5e, 0x98, 0x90, + 0x48, 0x70, 0x71, 0xa5, 0xa5, 0x2f, 0xb8, 0xcf, 0x67, 0x61, 0x56, 0xdb, 0x37, 0x37, 0x6d, 0xcb, + 0x1b, 0x8d, 0x6d, 0x74, 0x7f, 0xd8, 0x41, 0xdc, 0x09, 0xa7, 0x3a, 0xfb, 0x36, 0x59, 0x7f, 0xaa, + 0x9a, 0x0d, 0xdc, 0xb6, 0xcc, 0x8e, 0x43, 0xea, 0x91, 0xd7, 0x0e, 0x7f, 0xb8, 0x37, 0xf7, 0xd2, + 0xbf, 0x54, 0x32, 0xe8, 0x65, 0xd2, 0x81, 0x58, 0x68, 0xe5, 0xb9, 0xa2, 0xe5, 0x7b, 0x02, 0xc9, + 0x70, 0x2b, 0xc3, 0x4a, 0x48, 0x5f, 0xb8, 0x9f, 0xc9, 0x82, 0x5a, 0x6a, 0xb7, 0xad, 0x7d, 0xd3, + 0x6d, 0xe0, 0x2e, 0x6e, 0xbb, 0x4d, 0x5b, 0x6f, 0x63, 0xde, 0x7e, 0x2e, 0x82, 0xd2, 0x31, 0x6c, + 0xd6, 0x07, 0x7b, 0x8f, 0x4c, 0x8e, 0xaf, 0x96, 0xde, 0x71, 0xa4, 0xb5, 0x3c, 0x5c, 0x4a, 0x02, + 0x71, 0xca, 0xed, 0x2b, 0x4a, 0x16, 0x94, 0xbe, 0x54, 0x3f, 0x9e, 0x85, 0x19, 0xbf, 0xc7, 0xde, + 0x91, 0x11, 0xe6, 0x0f, 0x27, 0x9c, 0x8c, 0x04, 0xc4, 0x13, 0xc8, 0xf0, 0x9d, 0x09, 0x66, 0x15, + 0x51, 0xf4, 0x93, 0x89, 0xae, 0x94, 0x5c, 0x74, 0xde, 0x6b, 0xad, 0xde, 0x5a, 0xa9, 0xaf, 0x2f, + 0x57, 0xb4, 0xa2, 0x82, 0xbe, 0x90, 0x85, 0xdc, 0xa6, 0x61, 0xee, 0xf0, 0xf1, 0xb2, 0x4e, 0x7b, + 0x76, 0x64, 0x07, 0x3f, 0xca, 0x5a, 0x3a, 0x7d, 0x51, 0xef, 0x86, 0xd3, 0xe6, 0xfe, 0xde, 0x65, + 0x6c, 0xd7, 0xb7, 0xc9, 0x28, 0xeb, 0x34, 0xad, 0x06, 0x36, 0xa9, 0x11, 0x9a, 0xd7, 0x06, 0x7e, + 0x13, 0x4d, 0x30, 0x89, 0xc9, 0x83, 0xc7, 0x49, 0x84, 0xc4, 0x03, 0xa6, 0xb2, 0x1c, 0x53, 0x89, + 0xa6, 0x0d, 0x03, 0x88, 0xa7, 0xaf, 0xa9, 0xbf, 0x91, 0x87, 0x33, 0x25, 0xf3, 0x80, 0xd8, 0x14, + 0xb4, 0x83, 0x2f, 0xef, 0xea, 0xe6, 0x0e, 0x26, 0x03, 0x44, 0x20, 0x71, 0x3e, 0x80, 0x7c, 0x46, + 0x0c, 0x20, 0xaf, 0x6a, 0x30, 0x65, 0xd9, 0x1d, 0x6c, 0x2f, 0x1d, 0x10, 0x9e, 0xfa, 0x97, 0x9d, + 0x59, 0x9b, 0x1c, 0x54, 0xc4, 0x22, 0x23, 0xbf, 0x58, 0xa7, 0xff, 0x6b, 0x3e, 0xa1, 0x0b, 0x77, + 0xc2, 0x14, 0x4b, 0x53, 0xe7, 0x60, 0xba, 0xae, 0x2d, 0x57, 0xb4, 0x56, 0x75, 0xb9, 0x78, 0x42, + 0xbd, 0x0e, 0x4e, 0x56, 0x9b, 0x15, 0xad, 0xd4, 0xac, 0xd6, 0x6b, 0x2d, 0x92, 0x5e, 0xcc, 0xa0, + 0x97, 0xe4, 0x64, 0x3d, 0x7b, 0xe3, 0x99, 0x19, 0x04, 0xab, 0x06, 0x53, 0x6d, 0x9a, 0x81, 0x0c, + 0xa1, 0xb3, 0x89, 0x6a, 0xc7, 0x08, 0xd2, 0x04, 0xcd, 0x27, 0xa4, 0x9e, 0x07, 0xb8, 0x66, 0x5b, + 0xe6, 0x4e, 0x78, 0xa6, 0x6d, 0x5a, 0xe3, 0x52, 0xd0, 0x8b, 0x33, 0x50, 0xa0, 0xff, 0x90, 0x0b, + 0x33, 0xc8, 0x53, 0x28, 0x78, 0xff, 0xdd, 0xb3, 0x78, 0x89, 0xbc, 0xc2, 0x89, 0x16, 0x7b, 0xf5, + 0x74, 0x91, 0xca, 0x80, 0x5a, 0xc2, 0xac, 0x2a, 0x77, 0x41, 0x81, 0xfe, 0xcb, 0xbc, 0x0e, 0xa2, + 0x83, 0x5f, 0xd2, 0x6c, 0x92, 0x7e, 0xca, 0xf2, 0x32, 0x4d, 0x5f, 0x9b, 0x3f, 0x9c, 0x85, 0xe9, + 0x1a, 0x76, 0xcb, 0xbb, 0xb8, 0x7d, 0x05, 0x3d, 0x51, 0x5c, 0x00, 0xed, 0x1a, 0xd8, 0x74, 0x1f, + 0xde, 0xeb, 0x06, 0x0b, 0xa0, 0x7e, 0x02, 0xfa, 0x6e, 0xbe, 0xf3, 0x7d, 0x8e, 0xa8, 0x3f, 0x77, + 0x0c, 0xa8, 0xab, 0x5f, 0x42, 0x84, 0xca, 0x9c, 0x85, 0x82, 0x8d, 0x9d, 0xfd, 0xae, 0xbf, 0x88, + 0xc6, 0xde, 0xd0, 0x1b, 0x02, 0x71, 0x96, 0x05, 0x71, 0xde, 0x25, 0x5f, 0xc4, 0x04, 0xa2, 0x69, + 0xe6, 0x60, 0xaa, 0x6a, 0x1a, 0xae, 0xa1, 0x77, 0xd1, 0xcb, 0x72, 0x30, 0xdf, 0xc0, 0xee, 0xa6, + 0x6e, 0xeb, 0x7b, 0xd8, 0xc5, 0xb6, 0x83, 0xbe, 0x2a, 0xf6, 0x09, 0xbd, 0xae, 0xee, 0x6e, 0x5b, + 0xf6, 0x9e, 0xaf, 0x9a, 0xfe, 0xbb, 0xa7, 0x9a, 0x57, 0xb1, 0xed, 0x84, 0x7c, 0xf9, 0xaf, 0xde, + 0x97, 0x6b, 0x96, 0x7d, 0xc5, 0x1b, 0x04, 0xd9, 0x34, 0x8d, 0xbd, 0x7a, 0xf4, 0xba, 0xd6, 0xce, + 0x3a, 0xbe, 0x8a, 0xfd, 0x60, 0x5d, 0xc1, 0xbb, 0x37, 0x17, 0xe8, 0x58, 0x35, 0xcb, 0xf5, 0x3a, + 0xed, 0x75, 0x6b, 0x87, 0x46, 0x33, 0x9d, 0xd6, 0xc4, 0xc4, 0x30, 0x97, 0x7e, 0x15, 0x93, 0x5c, + 0x05, 0x3e, 0x17, 0x4b, 0x54, 0x17, 0x41, 0x0d, 0x7e, 0x6b, 0xe2, 0x2e, 0xde, 0xc3, 0xae, 0x7d, + 0x40, 0x2e, 0x2d, 0x98, 0xd6, 0x06, 0x7c, 0x61, 0x03, 0xb4, 0xfc, 0x64, 0x9d, 0x49, 0x6f, 0x51, + 0x90, 0xdc, 0x91, 0x26, 0xeb, 0x32, 0x14, 0x27, 0x72, 0x29, 0x93, 0xe2, 0x59, 0x33, 0x3f, 0xae, + 0x40, 0x8e, 0x0c, 0x9e, 0x6f, 0xcd, 0x08, 0x2b, 0x4c, 0x7b, 0xd8, 0x71, 0xf4, 0x1d, 0xec, 0xaf, + 0x30, 0xb1, 0x57, 0xf5, 0x1e, 0xc8, 0x77, 0x09, 0xa6, 0x74, 0x70, 0x78, 0xbc, 0x50, 0x33, 0xcf, + 0xc0, 0xf0, 0x68, 0x05, 0x23, 0x01, 0x81, 0x5b, 0xa3, 0x7f, 0x5c, 0x78, 0x10, 0xf2, 0x14, 0xfe, + 0x19, 0xc8, 0x2f, 0x57, 0x96, 0xb6, 0x56, 0x8b, 0x27, 0xbc, 0x47, 0x9f, 0xbf, 0x19, 0xc8, 0xaf, + 0x94, 0x9a, 0xa5, 0xf5, 0x62, 0xd6, 0xab, 0x47, 0xb5, 0xb6, 0x52, 0x2f, 0x2a, 0x5e, 0xe2, 0x66, + 0xa9, 0x56, 0x2d, 0x17, 0x73, 0xea, 0x2c, 0x4c, 0x5d, 0x2a, 0x69, 0xb5, 0x6a, 0x6d, 0xb5, 0x98, + 0x47, 0x7f, 0xc1, 0xe3, 0x77, 0xaf, 0x88, 0xdf, 0xad, 0x51, 0x3c, 0x0d, 0x82, 0xec, 0x27, 0x02, + 0xc8, 0xee, 0x17, 0x20, 0xfb, 0x46, 0x19, 0x22, 0x13, 0x70, 0x67, 0x2a, 0xc0, 0xd4, 0xa6, 0x6d, + 0xb5, 0xb1, 0xe3, 0xa0, 0x1f, 0xc9, 0x42, 0xa1, 0xac, 0x9b, 0x6d, 0xdc, 0x45, 0x37, 0x84, 0x50, + 0x51, 0x57, 0xd1, 0x8c, 0xef, 0x2a, 0x8a, 0xfe, 0x3e, 0x23, 0xdb, 0xfb, 0x31, 0xba, 0x8b, 0x94, + 0x66, 0x84, 0x7c, 0xe4, 0x7a, 0xb9, 0x58, 0x52, 0x13, 0xb8, 0xb8, 0x25, 0x0b, 0x33, 0x6c, 0x35, + 0xe0, 0x32, 0xe6, 0xe7, 0xe1, 0x5f, 0xcd, 0xc8, 0x4e, 0x0e, 0xfd, 0x1a, 0x04, 0x64, 0x22, 0xe4, + 0x21, 0x37, 0x11, 0x1c, 0x46, 0x6d, 0x02, 0x9b, 0x87, 0x59, 0x98, 0xdd, 0x32, 0x9d, 0x41, 0x42, + 0x91, 0x8f, 0xf2, 0xee, 0x57, 0x83, 0x23, 0x74, 0xa4, 0x28, 0xef, 0xc3, 0xe9, 0xa5, 0x2f, 0x98, + 0xaf, 0x66, 0xe0, 0xf4, 0x2a, 0x36, 0xb1, 0x6d, 0xb4, 0x69, 0x0d, 0x7c, 0x49, 0xdc, 0x2f, 0x4a, + 0xe2, 0x89, 0x02, 0xe7, 0x83, 0xfe, 0x10, 0x25, 0xf0, 0xba, 0x40, 0x02, 0xcf, 0x11, 0x24, 0x70, + 0xa7, 0x24, 0x9d, 0x09, 0xdc, 0xd6, 0x3d, 0x03, 0x73, 0x35, 0xcb, 0x35, 0xb6, 0x8d, 0x36, 0xf5, + 0x41, 0xfb, 0x31, 0x05, 0x72, 0xeb, 0x86, 0xe3, 0xa2, 0x52, 0xd8, 0x9d, 0xdc, 0x02, 0xb3, 0x86, + 0xd9, 0xee, 0xee, 0x77, 0xb0, 0x86, 0x75, 0xda, 0xaf, 0x4c, 0x6b, 0x7c, 0x52, 0xb8, 0xb5, 0xef, + 0xb1, 0xa5, 0xf8, 0x5b, 0xfb, 0xbf, 0x25, 0xbd, 0x0c, 0xc3, 0xb3, 0x40, 0xc2, 0x1d, 0x46, 0xd8, + 0x5d, 0x25, 0x98, 0x37, 0xb9, 0xac, 0xbe, 0xc1, 0xde, 0x1f, 0xee, 0x9e, 0x27, 0xa7, 0x89, 0x7f, + 0xa0, 0xf7, 0x4b, 0x35, 0xd6, 0x61, 0x0c, 0x25, 0x43, 0x66, 0x65, 0x84, 0x49, 0xb2, 0x0a, 0x0b, + 0xd5, 0x5a, 0xb3, 0xa2, 0xd5, 0x4a, 0xeb, 0x2c, 0x8b, 0x82, 0xfe, 0x35, 0x0b, 0x79, 0x0d, 0xf7, + 0xba, 0x07, 0x7c, 0x3c, 0x63, 0xe6, 0x28, 0x9e, 0x09, 0x1c, 0xc5, 0xd5, 0x15, 0x00, 0xbd, 0xed, + 0x15, 0x4c, 0x2e, 0x7c, 0xca, 0x0e, 0x8c, 0x92, 0x29, 0x54, 0xb0, 0x14, 0xe4, 0xd6, 0xb8, 0x3f, + 0xd1, 0xcb, 0xa5, 0x77, 0x8e, 0x04, 0x6a, 0x84, 0xc3, 0x88, 0x3e, 0xe1, 0x03, 0x52, 0x9b, 0x3d, + 0x43, 0xc9, 0x1d, 0x8f, 0xf8, 0xbf, 0x98, 0x85, 0x5c, 0xd3, 0xeb, 0x2d, 0xb9, 0x8e, 0xf3, 0x53, + 0xa3, 0xe9, 0xb8, 0x47, 0x26, 0x42, 0xc7, 0x1f, 0x80, 0x39, 0x5e, 0x63, 0x99, 0xab, 0x44, 0xac, + 0x8a, 0x0b, 0x3f, 0x8c, 0xa2, 0xe1, 0x03, 0xd8, 0x39, 0x1e, 0x11, 0x7f, 0xe2, 0x49, 0x00, 0x1b, + 0x78, 0xef, 0x32, 0xb6, 0x9d, 0x5d, 0xa3, 0x87, 0xfe, 0x4a, 0x81, 0x99, 0x55, 0xec, 0x36, 0x5c, + 0xdd, 0xdd, 0x77, 0xfa, 0xb6, 0x3b, 0x4d, 0xab, 0xac, 0xb7, 0x77, 0x31, 0xeb, 0x8e, 0xfc, 0x57, + 0xf4, 0x6e, 0x45, 0xd6, 0x9f, 0x28, 0x2c, 0x67, 0x31, 0x28, 0x23, 0x02, 0x93, 0x27, 0x43, 0xae, + 0xa3, 0xbb, 0x3a, 0xc3, 0xe2, 0x86, 0x3e, 0x2c, 0x42, 0x42, 0x1a, 0xc9, 0x86, 0x7e, 0x21, 0x2b, + 0xe3, 0x50, 0x24, 0x51, 0x7e, 0x32, 0x10, 0xde, 0x9f, 0x19, 0x01, 0x85, 0x53, 0x30, 0x5f, 0xab, + 0x37, 0x5b, 0xeb, 0xf5, 0xd5, 0xd5, 0x8a, 0x97, 0x5a, 0x54, 0xd4, 0xb3, 0xa0, 0x6e, 0x96, 0x1e, + 0xde, 0xa8, 0xd4, 0x9a, 0xad, 0x5a, 0x7d, 0xb9, 0xc2, 0xfe, 0xcc, 0xa9, 0x27, 0x61, 0xb6, 0x5c, + 0x2a, 0xaf, 0xf9, 0x09, 0x79, 0xf5, 0x1c, 0x9c, 0xde, 0xa8, 0x6c, 0x2c, 0x55, 0xb4, 0xc6, 0x5a, + 0x75, 0xb3, 0xe5, 0x91, 0x59, 0xa9, 0x6f, 0xd5, 0x96, 0x8b, 0x05, 0x15, 0xc1, 0x59, 0xee, 0xcb, + 0x25, 0xad, 0x5e, 0x5b, 0x6d, 0x35, 0x9a, 0xa5, 0x66, 0xa5, 0x38, 0xa5, 0x5e, 0x07, 0x27, 0xcb, + 0xa5, 0x1a, 0xc9, 0x5e, 0xae, 0xd7, 0x6a, 0x95, 0x72, 0xb3, 0x38, 0x8d, 0xfe, 0x3d, 0x07, 0xb3, + 0x55, 0xa7, 0xa6, 0xef, 0xe1, 0x8b, 0x7a, 0xd7, 0xe8, 0xa0, 0x97, 0x71, 0x33, 0x8f, 0x5b, 0x61, + 0xde, 0xa6, 0x8f, 0xb8, 0xd3, 0x34, 0x30, 0x45, 0x73, 0x5e, 0x13, 0x13, 0xbd, 0x39, 0xb9, 0x49, + 0x08, 0xf8, 0x73, 0x72, 0xfa, 0xa6, 0x2e, 0x01, 0xd0, 0xa7, 0x66, 0x78, 0xf5, 0xe8, 0x85, 0xfe, + 0xd6, 0xa4, 0xef, 0x61, 0x07, 0xdb, 0x57, 0x8d, 0x36, 0xf6, 0x73, 0x6a, 0xdc, 0x5f, 0xe8, 0x4b, + 0x8a, 0xec, 0xfe, 0x22, 0x07, 0x2a, 0x57, 0x9d, 0x88, 0xde, 0xf0, 0x7b, 0x14, 0x99, 0xdd, 0x41, + 0x29, 0x92, 0xc9, 0x34, 0xe5, 0x95, 0xd9, 0xd1, 0x96, 0x6d, 0x9b, 0xf5, 0x7a, 0xab, 0xb1, 0x56, + 0xd7, 0x9a, 0x45, 0x45, 0x9d, 0x83, 0x69, 0xef, 0x75, 0xbd, 0x5e, 0x5b, 0x2d, 0xe6, 0xd4, 0x33, + 0x70, 0x6a, 0xad, 0xd4, 0x68, 0x55, 0x6b, 0x17, 0x4b, 0xeb, 0xd5, 0xe5, 0x56, 0x79, 0xad, 0xa4, + 0x35, 0x8a, 0x79, 0xf5, 0x06, 0x38, 0xd3, 0xac, 0x56, 0xb4, 0xd6, 0x4a, 0xa5, 0xd4, 0xdc, 0xd2, + 0x2a, 0x8d, 0x56, 0xad, 0xde, 0xaa, 0x95, 0x36, 0x2a, 0xc5, 0x82, 0xd7, 0xfc, 0xc9, 0xa7, 0x50, + 0x6d, 0xa6, 0x0e, 0x2b, 0xe3, 0x74, 0x84, 0x32, 0xce, 0xf4, 0x2b, 0x23, 0xf0, 0x6a, 0xa5, 0x55, + 0x1a, 0x15, 0xed, 0x62, 0xa5, 0x38, 0x3b, 0x48, 0xd7, 0xe6, 0xd4, 0xd3, 0x50, 0xf4, 0x78, 0x68, + 0x55, 0x1b, 0x7e, 0xce, 0xe5, 0xe2, 0x3c, 0xfa, 0x78, 0x01, 0xce, 0x6a, 0x78, 0xc7, 0x70, 0x5c, + 0x6c, 0x6f, 0xea, 0x07, 0x7b, 0xd8, 0x74, 0xfd, 0x4e, 0xfe, 0x9f, 0x13, 0x2b, 0xe3, 0x06, 0xcc, + 0xf7, 0x28, 0x8d, 0x0d, 0xec, 0xee, 0x5a, 0x1d, 0x36, 0x0a, 0x3f, 0x31, 0xb2, 0xe7, 0x58, 0xdc, + 0xe4, 0xb3, 0x6b, 0xe2, 0xdf, 0x9c, 0x6e, 0x2b, 0x31, 0xba, 0x9d, 0x1b, 0x45, 0xb7, 0xd5, 0x9b, + 0x60, 0x66, 0xdf, 0xc1, 0x76, 0x65, 0x4f, 0x37, 0xba, 0xfe, 0xd5, 0x91, 0x41, 0x02, 0x7a, 0x47, + 0x4e, 0xf6, 0xc4, 0x0a, 0x57, 0x97, 0xc1, 0x62, 0x8c, 0xe8, 0x5b, 0xcf, 0x03, 0xb0, 0xca, 0x6e, + 0xd9, 0x5d, 0xa6, 0xac, 0x5c, 0x8a, 0xc7, 0xdf, 0x65, 0xa3, 0xdb, 0x35, 0xcc, 0x9d, 0x60, 0xdf, + 0x3f, 0x4c, 0x40, 0xaf, 0x54, 0x64, 0x4e, 0xb0, 0x24, 0xe5, 0x2d, 0x59, 0x6b, 0x7a, 0x79, 0x76, + 0xc2, 0xfd, 0xee, 0xe1, 0xa6, 0x53, 0x50, 0x8b, 0x30, 0x47, 0xd2, 0x58, 0x0b, 0x2c, 0x4e, 0x79, + 0x7d, 0xb0, 0x4f, 0x6e, 0xa3, 0xd2, 0x5c, 0xab, 0x2f, 0x07, 0xdf, 0xa6, 0x3d, 0x92, 0x1e, 0x33, + 0xa5, 0xda, 0xc3, 0xa4, 0x35, 0xce, 0xa8, 0x8f, 0x83, 0x1b, 0xb8, 0x0e, 0xbb, 0xb4, 0xae, 0x55, + 0x4a, 0xcb, 0x0f, 0xb7, 0x2a, 0xcf, 0xab, 0x36, 0x9a, 0x0d, 0xb1, 0x71, 0xf9, 0xed, 0x68, 0xd6, + 0xe3, 0xb7, 0xb2, 0x51, 0xaa, 0xae, 0xb3, 0xfe, 0x7d, 0xa5, 0xae, 0x6d, 0x94, 0x9a, 0xc5, 0x39, + 0xf4, 0xe3, 0x0a, 0x14, 0x57, 0xb1, 0xbb, 0x69, 0xd9, 0xae, 0xde, 0x5d, 0x37, 0xcc, 0x2b, 0x5b, + 0x76, 0x57, 0x98, 0x6c, 0x4a, 0x87, 0xe9, 0x10, 0x87, 0x48, 0x81, 0x60, 0xf4, 0x8e, 0x78, 0x8f, + 0x64, 0x0b, 0x95, 0x29, 0x4c, 0x40, 0x2f, 0xcc, 0xca, 0x2c, 0x77, 0xcb, 0x97, 0x9a, 0x4c, 0x4f, + 0x5e, 0x34, 0xe9, 0xf1, 0x79, 0x00, 0x6a, 0x05, 0xf4, 0xd2, 0x1c, 0x4c, 0xaf, 0x18, 0xa6, 0xde, + 0x35, 0x5e, 0x20, 0x44, 0xc7, 0x0c, 0xfb, 0x98, 0x4c, 0x4c, 0x1f, 0x93, 0x1d, 0x69, 0xfc, 0xfc, + 0x21, 0x45, 0x76, 0x79, 0x81, 0x93, 0xbd, 0xcf, 0x64, 0xc4, 0xe0, 0xf9, 0x91, 0xac, 0xcc, 0xf2, + 0xc2, 0x70, 0x7a, 0xc9, 0x30, 0xfc, 0xe4, 0x7f, 0x0c, 0x1b, 0xab, 0xaf, 0x7d, 0x4f, 0x0f, 0x52, + 0x85, 0x19, 0xf4, 0x7b, 0x0a, 0xa0, 0x55, 0xec, 0x5e, 0xc4, 0x76, 0x30, 0x15, 0x20, 0xbd, 0x3e, + 0xb3, 0xb7, 0xb9, 0x26, 0xfb, 0x56, 0x1e, 0xc0, 0x4b, 0x22, 0x80, 0xa5, 0x98, 0xc6, 0x13, 0x41, + 0x3a, 0xa2, 0xf1, 0x56, 0xa1, 0xe0, 0x90, 0xef, 0x4c, 0xcd, 0x9e, 0x1a, 0x3d, 0x5c, 0x12, 0x62, + 0x3c, 0x75, 0x4a, 0x58, 0x63, 0x04, 0xd0, 0xd7, 0x82, 0x49, 0xd0, 0xb7, 0x08, 0xda, 0xb1, 0x72, + 0x64, 0x66, 0x93, 0xe9, 0x8b, 0x9d, 0xae, 0xba, 0x0c, 0xb2, 0x6f, 0xd0, 0x47, 0xf2, 0x70, 0x7a, + 0x50, 0x75, 0xd0, 0x2f, 0x66, 0x84, 0x1d, 0x76, 0x4c, 0x86, 0xfc, 0x0c, 0xdb, 0x40, 0xf4, 0x5e, + 0xd4, 0xa7, 0xc3, 0x99, 0x60, 0x19, 0xae, 0x69, 0xd5, 0xf0, 0x35, 0xa7, 0x8b, 0x5d, 0x17, 0xdb, + 0xa4, 0x6a, 0xd3, 0xda, 0xe0, 0x8f, 0xea, 0x33, 0xe1, 0x7a, 0xc3, 0x74, 0x8c, 0x0e, 0xb6, 0x9b, + 0x46, 0xcf, 0x29, 0x99, 0x9d, 0xe6, 0xbe, 0x6b, 0xd9, 0x86, 0xce, 0x2e, 0x3a, 0x9c, 0xd6, 0xa2, + 0x3e, 0xab, 0x77, 0x40, 0xd1, 0x70, 0xea, 0xe6, 0x65, 0x4b, 0xb7, 0x3b, 0x86, 0xb9, 0xb3, 0x6e, + 0x38, 0x2e, 0xf3, 0x00, 0x3e, 0x94, 0x8e, 0xfe, 0x5a, 0x91, 0x3d, 0x4c, 0x37, 0x04, 0xd6, 0x88, + 0x0e, 0xe5, 0xbb, 0x15, 0x99, 0xe3, 0x71, 0xc9, 0x68, 0x27, 0x53, 0x96, 0x97, 0x4c, 0xda, 0x90, + 0x18, 0x3c, 0x82, 0x93, 0xae, 0x85, 0xa6, 0xfb, 0x86, 0xc0, 0xc5, 0x8a, 0x56, 0x5d, 0xa9, 0x56, + 0x3c, 0xb3, 0xe2, 0x0c, 0x9c, 0x0a, 0xbf, 0x2d, 0x3f, 0xdc, 0x6a, 0x54, 0x6a, 0xcd, 0xe2, 0xb4, + 0xd7, 0x4f, 0xd1, 0xe4, 0x95, 0x52, 0x75, 0xbd, 0xb2, 0xdc, 0x6a, 0xd6, 0xbd, 0x2f, 0xcb, 0xa3, + 0x99, 0x16, 0xe8, 0xc5, 0x39, 0x38, 0x49, 0x64, 0x7b, 0x40, 0xa4, 0xea, 0x09, 0xa5, 0xcf, 0xd7, + 0x36, 0x00, 0x68, 0x86, 0x8a, 0x17, 0xfd, 0xae, 0xf4, 0x3d, 0x8e, 0x1c, 0x84, 0x7d, 0x65, 0x44, + 0x68, 0xc6, 0x57, 0xb3, 0x32, 0x11, 0x2a, 0xa4, 0xc9, 0x26, 0x53, 0x8a, 0x7f, 0x99, 0xf4, 0x88, + 0x13, 0x0d, 0x3e, 0xb1, 0x32, 0xcb, 0xe4, 0xe7, 0xe7, 0x6d, 0x56, 0x35, 0xa2, 0x0e, 0x0b, 0x00, + 0x24, 0x85, 0x68, 0x10, 0xd5, 0x83, 0x81, 0xe3, 0x55, 0x94, 0x1e, 0x94, 0xca, 0xcd, 0xea, 0xc5, + 0x4a, 0x94, 0x1e, 0x7c, 0x5a, 0x81, 0xe9, 0x55, 0xec, 0x7a, 0x73, 0x2a, 0x07, 0x3d, 0x4b, 0x62, + 0xfd, 0xc7, 0x33, 0x63, 0xc8, 0xc5, 0xf7, 0xc1, 0x32, 0x00, 0x7d, 0x43, 0xdf, 0x35, 0x8a, 0x09, + 0xe2, 0x17, 0x1d, 0x31, 0x5e, 0x7d, 0x33, 0xe4, 0x5d, 0xef, 0x33, 0x5b, 0x86, 0xfe, 0x86, 0xc8, + 0xe1, 0xca, 0x23, 0xb2, 0xac, 0xbb, 0xba, 0x46, 0xf3, 0x73, 0xa3, 0x93, 0xa4, 0xed, 0x12, 0xc1, + 0xc8, 0x7f, 0x44, 0xfb, 0xf3, 0x2f, 0x14, 0x38, 0x43, 0xdb, 0x47, 0xa9, 0xd7, 0x6b, 0xb8, 0x96, + 0x8d, 0x35, 0xdc, 0xc6, 0x46, 0xcf, 0xed, 0x5b, 0xdf, 0xb3, 0x69, 0xaa, 0xbf, 0xd9, 0xcc, 0x5e, + 0xd1, 0x4f, 0x2b, 0xb2, 0x11, 0x7e, 0x0f, 0xb5, 0xc7, 0xbe, 0xf2, 0x22, 0x1a, 0xfb, 0xc7, 0xb2, + 0x32, 0x31, 0x7b, 0x13, 0x12, 0x4f, 0x06, 0xd4, 0xaf, 0x1c, 0x03, 0x50, 0xfe, 0xca, 0x8d, 0x56, + 0x29, 0x57, 0xaa, 0x9b, 0xde, 0x20, 0x70, 0x33, 0xdc, 0xb8, 0xb9, 0xa5, 0x95, 0xd7, 0x4a, 0x8d, + 0x4a, 0x4b, 0xab, 0xac, 0x56, 0x1b, 0x4d, 0xe6, 0x94, 0x45, 0xff, 0x9a, 0x52, 0x6f, 0x82, 0x73, + 0x8d, 0xad, 0xa5, 0x46, 0x59, 0xab, 0x6e, 0x92, 0x74, 0xad, 0x52, 0xab, 0x5c, 0x62, 0x5f, 0xa7, + 0xd1, 0x87, 0x8a, 0x30, 0xeb, 0x4d, 0x00, 0x1a, 0x74, 0x5e, 0x80, 0xfe, 0x36, 0x07, 0xb3, 0x1a, + 0x76, 0xac, 0xee, 0x55, 0x32, 0x47, 0x98, 0xd4, 0xd4, 0xe3, 0x2b, 0x8a, 0xec, 0xf9, 0x6d, 0x8e, + 0xd9, 0x45, 0x8e, 0xd1, 0xe8, 0x89, 0xa6, 0x7e, 0x55, 0x37, 0xba, 0xfa, 0x65, 0xd6, 0xd5, 0x4c, + 0x6b, 0x61, 0x82, 0xba, 0x08, 0xaa, 0x75, 0xcd, 0xc4, 0x76, 0xa3, 0x7d, 0xad, 0xe2, 0xee, 0x96, + 0x3a, 0x1d, 0x1b, 0x3b, 0x0e, 0x5b, 0xbd, 0x18, 0xf0, 0x45, 0xbd, 0x1d, 0x4e, 0x92, 0x54, 0x2e, + 0x33, 0x75, 0x90, 0xe9, 0x4f, 0x0e, 0x72, 0x96, 0xcc, 0x03, 0x3f, 0x67, 0x9e, 0xcb, 0x19, 0x26, + 0xf3, 0xc7, 0x25, 0x0a, 0xe2, 0x29, 0x9d, 0x5b, 0x60, 0xd6, 0xd4, 0xf7, 0x70, 0xe5, 0xd1, 0x9e, + 0x61, 0x63, 0x87, 0x38, 0xc6, 0x28, 0x1a, 0x9f, 0x84, 0x3e, 0x22, 0x75, 0xde, 0x5c, 0x4e, 0x62, + 0xc9, 0x74, 0x7f, 0x75, 0x04, 0xd5, 0x1f, 0xd0, 0xcf, 0x28, 0xe8, 0x43, 0x0a, 0xcc, 0x31, 0xa6, + 0x4a, 0xe6, 0x41, 0xb5, 0x83, 0x6e, 0x16, 0x8c, 0x5f, 0xdd, 0x4b, 0xf3, 0x8d, 0x5f, 0xf2, 0x82, + 0xbe, 0x57, 0x91, 0x75, 0x77, 0x1e, 0x50, 0x71, 0x52, 0x46, 0xb4, 0xe3, 0xe8, 0xb6, 0xb5, 0xcf, + 0x1c, 0x55, 0xa7, 0x35, 0xfa, 0x92, 0xe6, 0xa2, 0x1e, 0xfa, 0x65, 0x29, 0x67, 0x6a, 0xc9, 0x6a, + 0x1c, 0x13, 0x80, 0x9f, 0x50, 0x60, 0x81, 0x71, 0xd5, 0x60, 0xe7, 0x7c, 0xa4, 0x0e, 0xbc, 0x7d, + 0xbf, 0xb4, 0x21, 0x38, 0xa0, 0xfe, 0xac, 0xa4, 0xc7, 0x0c, 0x90, 0xbf, 0x2a, 0x15, 0x1c, 0x4d, + 0xba, 0x22, 0xc7, 0x04, 0xe5, 0x3b, 0x73, 0x30, 0xbb, 0xe5, 0x60, 0x9b, 0xf9, 0xed, 0xa3, 0x37, + 0xe4, 0x40, 0x59, 0xc5, 0xc2, 0x46, 0xea, 0x2b, 0xa4, 0x3d, 0x7c, 0xf9, 0xca, 0x72, 0x44, 0x3d, + 0x1b, 0x29, 0x02, 0xb6, 0xdb, 0x60, 0x81, 0x8a, 0xb4, 0xe4, 0xba, 0x9e, 0x91, 0xe8, 0x7b, 0xd3, + 0xf6, 0xa5, 0x8e, 0x63, 0xab, 0x88, 0x94, 0xe5, 0x65, 0x29, 0x7b, 0x3c, 0xad, 0xe3, 0x6d, 0x3a, + 0x9f, 0xcd, 0x69, 0x7d, 0xa9, 0xe4, 0x72, 0xfd, 0x1e, 0xa6, 0xe7, 0x57, 0xb8, 0xcc, 0x79, 0x92, + 0x79, 0xd0, 0x27, 0xf4, 0xb7, 0x52, 0xbe, 0xba, 0xf2, 0xd2, 0x49, 0xa6, 0x0b, 0xbd, 0xf1, 0x98, + 0x24, 0xa7, 0xa1, 0xe8, 0xe5, 0x20, 0xfb, 0x2f, 0x5a, 0xa5, 0x51, 0x5f, 0xbf, 0x58, 0x19, 0xbc, + 0x8c, 0x91, 0x47, 0x2f, 0x51, 0x60, 0x66, 0xc9, 0xb6, 0xf4, 0x4e, 0x5b, 0x77, 0x5c, 0xf4, 0xb5, + 0x2c, 0xcc, 0x6d, 0xea, 0x07, 0x5d, 0x4b, 0xef, 0x10, 0xff, 0xfe, 0xbe, 0xbe, 0xa0, 0x47, 0x3f, + 0xf9, 0x7d, 0x01, 0x7b, 0x15, 0x0f, 0x06, 0x06, 0x47, 0xf7, 0x32, 0x32, 0xd7, 0x35, 0x06, 0xdb, + 0x7c, 0xd9, 0x41, 0xc1, 0x4a, 0x7d, 0xbe, 0x16, 0x79, 0x9e, 0x22, 0x2c, 0xca, 0x0f, 0xc9, 0x85, + 0x1f, 0x95, 0x21, 0x79, 0x3c, 0xbb, 0xf2, 0x2f, 0x9d, 0x86, 0xc2, 0x32, 0x26, 0x56, 0xdc, 0x7f, + 0xcf, 0xc2, 0x54, 0x03, 0xbb, 0xc4, 0x82, 0xbb, 0x47, 0xf0, 0x14, 0xee, 0x90, 0x0c, 0xa1, 0x13, + 0xbb, 0xff, 0xee, 0x4d, 0xd6, 0xb9, 0xf3, 0xd6, 0xe4, 0x39, 0x81, 0x47, 0x22, 0x2d, 0x77, 0x91, + 0x95, 0x79, 0x24, 0x8f, 0xc4, 0x58, 0x52, 0xe9, 0xfb, 0x5a, 0xbd, 0x3b, 0xcb, 0x5c, 0xab, 0xb8, + 0x5e, 0xef, 0x27, 0x79, 0xfd, 0x8c, 0xf5, 0x36, 0x63, 0xcc, 0xc7, 0x38, 0x47, 0x3d, 0x0d, 0xa6, + 0xa8, 0xcc, 0xfd, 0xf9, 0x68, 0xbf, 0x9f, 0x02, 0x25, 0x41, 0xce, 0x5e, 0xfb, 0x39, 0x25, 0x5d, + 0xd4, 0xa2, 0x0b, 0x9f, 0x48, 0x0c, 0x82, 0xb9, 0x1a, 0x76, 0xaf, 0x59, 0xf6, 0x95, 0x86, 0xab, + 0xbb, 0x18, 0xfd, 0x4b, 0x16, 0x94, 0x06, 0x76, 0xf9, 0xe8, 0x27, 0x35, 0x38, 0x45, 0x2b, 0xc4, + 0x32, 0x92, 0xfe, 0x9b, 0x56, 0xe4, 0x96, 0x81, 0x42, 0xe0, 0xf2, 0x69, 0x87, 0x7f, 0x45, 0x3f, + 0x32, 0x30, 0xe8, 0x53, 0x76, 0xc0, 0xa4, 0x81, 0x49, 0x86, 0x67, 0xd0, 0x53, 0xb0, 0x08, 0x3d, + 0xfd, 0xb0, 0x94, 0x59, 0x2d, 0x47, 0xf3, 0x78, 0xba, 0x82, 0x77, 0x3e, 0x01, 0x72, 0xe5, 0x5d, + 0xdd, 0x45, 0xef, 0x52, 0x00, 0x4a, 0x9d, 0xce, 0x06, 0xf5, 0x01, 0xe7, 0x1d, 0xd2, 0x2e, 0xc0, + 0x5c, 0x7b, 0x57, 0x0f, 0x6f, 0xce, 0xa0, 0xfd, 0x81, 0x90, 0xa6, 0x3e, 0x3d, 0x74, 0x26, 0xa7, + 0x52, 0x45, 0x7d, 0x30, 0x79, 0x65, 0x30, 0xda, 0x81, 0xa3, 0xb9, 0x18, 0x0a, 0x33, 0xf6, 0x08, + 0x9d, 0xf7, 0xfb, 0x62, 0xc8, 0x5e, 0xf4, 0x1c, 0x8e, 0x91, 0x0e, 0x0e, 0xd8, 0x84, 0x09, 0x09, + 0x4f, 0x7a, 0xcb, 0x05, 0xf4, 0x88, 0xe7, 0x6b, 0x22, 0xa1, 0x6b, 0xd5, 0x4a, 0xc7, 0xf0, 0x45, + 0xcb, 0x02, 0x66, 0xa1, 0x97, 0x67, 0x92, 0xc1, 0x17, 0x2f, 0xb8, 0xe7, 0xc0, 0x3c, 0xee, 0x18, + 0x2e, 0xf6, 0x6b, 0xc9, 0x04, 0x18, 0x07, 0xb1, 0xf8, 0x03, 0x7a, 0x91, 0x74, 0xd0, 0x35, 0x22, + 0xd0, 0xc3, 0x35, 0x8a, 0x68, 0x7f, 0x72, 0x61, 0xd4, 0xe4, 0x68, 0xa6, 0x0f, 0xd6, 0x77, 0x29, + 0x70, 0xa6, 0x69, 0xed, 0xec, 0x74, 0xb1, 0x2f, 0x26, 0x4c, 0xbd, 0x33, 0x91, 0x3e, 0x4e, 0xb8, + 0xc8, 0x4e, 0x90, 0xf5, 0x88, 0x11, 0x1c, 0x25, 0xf3, 0x5e, 0xc4, 0x13, 0x53, 0xb1, 0xb3, 0x28, + 0x22, 0xae, 0x81, 0x7c, 0x46, 0xa0, 0x20, 0x17, 0xf0, 0x59, 0x9a, 0x6c, 0xfa, 0x40, 0x7c, 0x36, + 0x0b, 0xf3, 0xf4, 0x5e, 0x44, 0x5f, 0x41, 0x1f, 0x1a, 0x23, 0x00, 0xe8, 0x6b, 0x19, 0x59, 0x3f, + 0x5b, 0x22, 0x13, 0x81, 0x93, 0x08, 0x11, 0xcb, 0x05, 0x55, 0x19, 0x4a, 0x6e, 0x02, 0x37, 0x75, + 0xe6, 0x60, 0x76, 0x15, 0xfb, 0x2d, 0xcd, 0x41, 0xef, 0x4b, 0xd8, 0x13, 0x5d, 0x80, 0x39, 0x72, + 0x39, 0x58, 0x9d, 0x1d, 0x93, 0xa4, 0xab, 0x66, 0x42, 0x9a, 0x7a, 0x2b, 0xcc, 0x5f, 0xc6, 0xdb, + 0x96, 0x8d, 0xeb, 0xc2, 0x59, 0x4a, 0x31, 0x71, 0x70, 0x78, 0x3a, 0xf5, 0x76, 0x38, 0xc9, 0x1c, + 0xdd, 0x97, 0xbc, 0xb9, 0xbe, 0x6e, 0x1f, 0xb0, 0x83, 0x69, 0xfd, 0xc9, 0xe8, 0x2f, 0xf8, 0x06, + 0xb3, 0x24, 0xa2, 0x78, 0xe7, 0x61, 0xb1, 0x73, 0x95, 0x8e, 0x18, 0x9d, 0x9e, 0x01, 0xd3, 0x4c, + 0x47, 0x7c, 0x83, 0x2e, 0xae, 0x07, 0x0d, 0xf2, 0xaa, 0xcf, 0x80, 0x19, 0x4f, 0x44, 0xc4, 0x6e, + 0x60, 0x5d, 0xef, 0xb9, 0x01, 0x3f, 0x92, 0xef, 0x5a, 0x98, 0x15, 0xfd, 0x54, 0xa0, 0x33, 0x15, + 0x41, 0x67, 0x9e, 0x9a, 0x84, 0xf9, 0x89, 0xdc, 0x4f, 0x5e, 0xe4, 0xca, 0x5f, 0x3a, 0xa8, 0x76, + 0x1c, 0xb4, 0x91, 0x4c, 0x6b, 0xce, 0x03, 0x04, 0xcd, 0xcf, 0x0f, 0x9c, 0xc1, 0xa5, 0x88, 0xb1, + 0xf1, 0x63, 0x8f, 0x02, 0xf6, 0x8b, 0x83, 0xb0, 0x33, 0x5e, 0x40, 0x25, 0x8f, 0x10, 0xca, 0x70, + 0x92, 0x3e, 0x3a, 0x3f, 0x91, 0x83, 0x33, 0xc1, 0x09, 0xa7, 0x75, 0xdd, 0x09, 0x5b, 0xf6, 0xc3, + 0xc9, 0x20, 0x12, 0x8e, 0x94, 0x04, 0xcd, 0xf1, 0x34, 0xe4, 0x9d, 0xfd, 0xcb, 0x81, 0x23, 0x20, + 0x7d, 0x41, 0x6f, 0x56, 0x12, 0x8d, 0x55, 0x03, 0xf9, 0x1b, 0x73, 0x23, 0xbc, 0x13, 0x4e, 0x99, + 0xfb, 0x7b, 0x01, 0x16, 0xa4, 0xa7, 0x61, 0x3d, 0xcb, 0xe1, 0x0f, 0x62, 0x93, 0xcd, 0xc9, 0x37, + 0xd9, 0x04, 0x23, 0xa9, 0x4c, 0xa5, 0xd3, 0x57, 0x8f, 0x4f, 0xf6, 0x1d, 0x41, 0x2b, 0x27, 0x56, + 0x0a, 0x0a, 0x7f, 0x96, 0x87, 0xff, 0x9f, 0x32, 0x89, 0x7a, 0xde, 0xe1, 0x27, 0xd7, 0x12, 0xf4, + 0x84, 0xc7, 0x79, 0x6c, 0xed, 0x33, 0x59, 0x40, 0x8d, 0xd0, 0x21, 0x87, 0x81, 0xba, 0x69, 0xe3, + 0xab, 0x06, 0xbe, 0x26, 0xb8, 0x6f, 0xbd, 0x45, 0x3a, 0x0e, 0xb5, 0xa8, 0x2b, 0x87, 0x88, 0x46, + 0xaf, 0x8b, 0x0f, 0xc0, 0x45, 0x2e, 0xde, 0x74, 0xb2, 0x12, 0xd3, 0x97, 0xea, 0x1f, 0xe4, 0x60, + 0x4e, 0xc3, 0x7a, 0x27, 0xe8, 0xb8, 0xfe, 0x2f, 0xce, 0x24, 0x79, 0x16, 0xe4, 0xdc, 0x70, 0x6d, + 0xe1, 0x89, 0x87, 0x2b, 0xc2, 0xff, 0x49, 0x5e, 0xc8, 0x12, 0x03, 0xf9, 0xe9, 0x90, 0x86, 0x67, + 0x25, 0xec, 0x19, 0x45, 0xc6, 0x9e, 0xc9, 0x0d, 0xb2, 0x67, 0x6e, 0x87, 0x93, 0x5d, 0xdd, 0x71, + 0x97, 0x2f, 0x37, 0x8d, 0x3d, 0xec, 0xb8, 0xfa, 0x5e, 0x8f, 0x58, 0x2e, 0x8a, 0xd6, 0x9f, 0x2c, + 0xde, 0x5d, 0x1e, 0x7b, 0x86, 0x69, 0x50, 0x15, 0x8f, 0x1e, 0xe7, 0xf5, 0x83, 0x52, 0x07, 0x96, + 0x86, 0x95, 0x9d, 0x4c, 0x33, 0x1e, 0x1c, 0x61, 0x3d, 0xe4, 0x2c, 0xa8, 0x1b, 0x95, 0x46, 0xa3, + 0xb4, 0x4a, 0xce, 0x31, 0xf8, 0x8e, 0x2d, 0x9d, 0x0b, 0x4f, 0xf0, 0xc4, 0x47, 0x91, 0x56, 0xe7, + 0xc2, 0xf1, 0xa2, 0x78, 0x42, 0x9d, 0x85, 0x29, 0x1b, 0xf7, 0xba, 0x06, 0x76, 0x8a, 0x19, 0xf4, + 0xd5, 0x2c, 0x14, 0xb6, 0x4c, 0x1b, 0xeb, 0x1d, 0xf4, 0xdc, 0xe8, 0x6e, 0x6f, 0x44, 0xa5, 0x10, + 0x63, 0x35, 0xc5, 0xae, 0x24, 0xb2, 0x7e, 0xcb, 0x63, 0x64, 0x2c, 0xf0, 0xc9, 0x2d, 0x21, 0x46, + 0x97, 0x9a, 0x7a, 0x93, 0xbe, 0x30, 0x05, 0xf9, 0xca, 0x5e, 0xcf, 0x3d, 0xb8, 0xf0, 0x04, 0x98, + 0x6f, 0xb8, 0x36, 0xd6, 0xf7, 0xb8, 0x8d, 0x60, 0xd7, 0xba, 0x82, 0x4d, 0x7f, 0x23, 0x98, 0xbc, + 0xdc, 0x7b, 0x0f, 0x4c, 0x99, 0x56, 0x4b, 0xdf, 0x77, 0x77, 0xd5, 0x9b, 0x0f, 0x45, 0x50, 0x61, + 0xea, 0x57, 0x67, 0x21, 0xeb, 0xbe, 0x74, 0x1f, 0x99, 0x0e, 0x14, 0x4c, 0xab, 0xb4, 0xef, 0xee, + 0x2e, 0xdd, 0xf4, 0x89, 0x3f, 0x3d, 0x9f, 0xf9, 0xf4, 0x9f, 0x9e, 0xcf, 0x7c, 0xf1, 0x4f, 0xcf, + 0x67, 0xbe, 0xff, 0xcf, 0xce, 0x9f, 0xf8, 0xf4, 0x9f, 0x9d, 0x3f, 0xf1, 0xd9, 0x3f, 0x3b, 0x7f, + 0xe2, 0x5b, 0xb2, 0xbd, 0xcb, 0x97, 0x0b, 0x84, 0xca, 0xd3, 0xfe, 0xbf, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x1c, 0x26, 0x7f, 0xb9, 0x4c, 0x1c, 0x02, 0x00, } func (m *Rpc) Marshal() (dAtA []byte, err error) { @@ -91334,6 +91580,160 @@ func (m *RpcObjectListExportResponseError) MarshalToSizedBuffer(dAtA []byte) (in return len(dAtA) - i, nil } +func (m *RpcObjectExport) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcObjectExport) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcObjectExport) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *RpcObjectExportRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcObjectExportRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcObjectExportRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.SpaceId) > 0 { + i -= len(m.SpaceId) + copy(dAtA[i:], m.SpaceId) + i = encodeVarintCommands(dAtA, i, uint64(len(m.SpaceId))) + i-- + dAtA[i] = 0x52 + } + if m.Format != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Format)) + i-- + dAtA[i] = 0x18 + } + if len(m.ObjectId) > 0 { + i -= len(m.ObjectId) + copy(dAtA[i:], m.ObjectId) + i = encodeVarintCommands(dAtA, i, uint64(len(m.ObjectId))) + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} + +func (m *RpcObjectExportResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcObjectExportResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcObjectExportResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Event != nil { + { + size, err := m.Event.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if len(m.Result) > 0 { + i -= len(m.Result) + copy(dAtA[i:], m.Result) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Result))) + i-- + dAtA[i] = 0x12 + } + if m.Error != nil { + { + size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RpcObjectExportResponseError) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcObjectExportResponseError) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcObjectExportResponseError) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if m.Code != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Code)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *RpcObjectImport) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -128749,6 +129149,72 @@ func (m *RpcObjectListExportResponseError) Size() (n int) { return n } +func (m *RpcObjectExport) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *RpcObjectExportRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ObjectId) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + if m.Format != 0 { + n += 1 + sovCommands(uint64(m.Format)) + } + l = len(m.SpaceId) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcObjectExportResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Error != nil { + l = m.Error.Size() + n += 1 + l + sovCommands(uint64(l)) + } + l = len(m.Result) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + if m.Event != nil { + l = m.Event.Size() + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcObjectExportResponseError) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Code != 0 { + n += 1 + sovCommands(uint64(m.Code)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + func (m *RpcObjectImport) Size() (n int) { if m == nil { return 0 @@ -184388,6 +184854,444 @@ func (m *RpcObjectListExportResponseError) Unmarshal(dAtA []byte) error { } return nil } +func (m *RpcObjectExport) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Export: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Export: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcObjectExportRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Request: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ObjectId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Format", wireType) + } + m.Format = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Format |= model.ExportFormat(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SpaceId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SpaceId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcObjectExportResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Response: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Error == nil { + m.Error = &RpcObjectExportResponseError{} + } + if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Result", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Result = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Event", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Event == nil { + m.Event = &ResponseEvent{} + } + if err := m.Event.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcObjectExportResponseError) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Error: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Error: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + m.Code = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Code |= RpcObjectExportResponseErrorCode(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *RpcObjectImport) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pb/protos/commands.proto b/pb/protos/commands.proto index 30d5ca172..7d6bab320 100644 --- a/pb/protos/commands.proto +++ b/pb/protos/commands.proto @@ -2873,6 +2873,35 @@ message Rpc { } + message Export { + message Request { + string spaceId = 10; + // ids of documents for export, when empty - will export all available docs + string objectId = 2; + // export format + anytype.model.Export.Format format = 3; + } + + message Response { + Error error = 1; + string result = 2; + ResponseEvent event = 3; + + message Error { + Code code = 1; + string description = 2; + + enum Code { + NULL = 0; + UNKNOWN_ERROR = 1; + BAD_INPUT = 2; + // ... + } + } + } + + } + message Import { message Request { option (no_auth) = true; diff --git a/pb/protos/service/service.proto b/pb/protos/service/service.proto index af0d7b498..eee645148 100644 --- a/pb/protos/service/service.proto +++ b/pb/protos/service/service.proto @@ -126,6 +126,7 @@ service ClientCommands { rpc ObjectUndo (anytype.Rpc.Object.Undo.Request) returns (anytype.Rpc.Object.Undo.Response); rpc ObjectRedo (anytype.Rpc.Object.Redo.Request) returns (anytype.Rpc.Object.Redo.Response); rpc ObjectListExport (anytype.Rpc.Object.ListExport.Request) returns (anytype.Rpc.Object.ListExport.Response); + rpc ObjectExport (anytype.Rpc.Object.Export.Request) returns (anytype.Rpc.Object.Export.Response); rpc ObjectBookmarkFetch (anytype.Rpc.Object.BookmarkFetch.Request) returns (anytype.Rpc.Object.BookmarkFetch.Response); rpc ObjectToBookmark (anytype.Rpc.Object.ToBookmark.Request) returns (anytype.Rpc.Object.ToBookmark.Response); rpc ObjectImport (anytype.Rpc.Object.Import.Request) returns (anytype.Rpc.Object.Import.Response); diff --git a/pb/service/service.pb.go b/pb/service/service.pb.go index 94803f037..de05a45aa 100644 --- a/pb/service/service.pb.go +++ b/pb/service/service.pb.go @@ -26,356 +26,356 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package func init() { proto.RegisterFile("pb/protos/service/service.proto", fileDescriptor_93a29dc403579097) } var fileDescriptor_93a29dc403579097 = []byte{ - // 5574 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x9d, 0xdf, 0x8f, 0x1c, 0x49, - 0x52, 0xf8, 0xb7, 0x5f, 0xbe, 0xfb, 0xa5, 0x8e, 0x5b, 0xa0, 0x17, 0x96, 0xbd, 0xe5, 0xce, 0xf6, - 0x7a, 0xed, 0x19, 0xdb, 0xe3, 0xe9, 0xf1, 0xda, 0xfb, 0x8b, 0x3b, 0x24, 0x68, 0xcf, 0xd8, 0xb3, - 0x73, 0x37, 0x33, 0x3b, 0x4c, 0xf7, 0xd8, 0x62, 0x25, 0x24, 0x6a, 0xba, 0x72, 0x7a, 0x8a, 0xa9, - 0xae, 0xac, 0xab, 0xca, 0x6e, 0xbb, 0x0f, 0x81, 0x40, 0x20, 0x10, 0x08, 0xc4, 0x89, 0x5f, 0x82, - 0x27, 0x24, 0xfe, 0x02, 0xfe, 0x0c, 0x1e, 0xef, 0x91, 0x47, 0xb4, 0xfb, 0x2f, 0x20, 0x9e, 0x51, - 0x65, 0x66, 0xe5, 0x8f, 0xa8, 0x88, 0xac, 0x9a, 0xe5, 0xc9, 0xd6, 0xc4, 0x27, 0x22, 0x32, 0x2b, - 0x23, 0x33, 0x23, 0xb3, 0xb2, 0xb2, 0xa3, 0x9b, 0xc5, 0xf9, 0x4e, 0x51, 0x72, 0xc1, 0xab, 0x9d, - 0x8a, 0x95, 0xab, 0x74, 0xc6, 0x9a, 0x7f, 0x47, 0xf2, 0xcf, 0xc3, 0x37, 0xe3, 0x7c, 0x2d, 0xd6, - 0x05, 0x7b, 0xef, 0x5d, 0x4b, 0xce, 0xf8, 0x62, 0x11, 0xe7, 0x49, 0xa5, 0x90, 0xf7, 0xde, 0xb1, - 0x12, 0xb6, 0x62, 0xb9, 0xd0, 0x7f, 0x7f, 0xfc, 0xdf, 0xff, 0x33, 0x88, 0xde, 0xda, 0xcd, 0x52, - 0x96, 0x8b, 0x5d, 0xad, 0x31, 0xfc, 0x32, 0xfa, 0xf6, 0xb8, 0x28, 0xf6, 0x99, 0x78, 0xc1, 0xca, - 0x2a, 0xe5, 0xf9, 0xf0, 0x83, 0x91, 0x76, 0x30, 0x3a, 0x2d, 0x66, 0xa3, 0x71, 0x51, 0x8c, 0xac, - 0x70, 0x74, 0xca, 0x7e, 0xbc, 0x64, 0x95, 0x78, 0xef, 0x4e, 0x18, 0xaa, 0x0a, 0x9e, 0x57, 0x6c, - 0x78, 0x11, 0xfd, 0xd2, 0xb8, 0x28, 0x26, 0x4c, 0xec, 0xb1, 0xba, 0x02, 0x13, 0x11, 0x0b, 0x36, - 0xdc, 0x6c, 0xa9, 0xfa, 0x80, 0xf1, 0x71, 0xaf, 0x1b, 0xd4, 0x7e, 0xa6, 0xd1, 0xb7, 0x6a, 0x3f, - 0x97, 0x4b, 0x91, 0xf0, 0x57, 0xf9, 0xf0, 0xfd, 0xb6, 0xa2, 0x16, 0x19, 0xdb, 0xb7, 0x43, 0x88, - 0xb6, 0xfa, 0x32, 0xfa, 0xf9, 0x97, 0x71, 0x96, 0x31, 0xb1, 0x5b, 0xb2, 0xba, 0xe0, 0xbe, 0x8e, - 0x12, 0x8d, 0x94, 0xcc, 0xd8, 0xfd, 0x20, 0xc8, 0x68, 0xc3, 0x5f, 0x46, 0xdf, 0x56, 0x92, 0x53, - 0x36, 0xe3, 0x2b, 0x56, 0x0e, 0x51, 0x2d, 0x2d, 0x24, 0x1e, 0x79, 0x0b, 0x82, 0xb6, 0x77, 0x79, - 0xbe, 0x62, 0xa5, 0xc0, 0x6d, 0x6b, 0x61, 0xd8, 0xb6, 0x85, 0xb4, 0xed, 0xbf, 0x1c, 0x44, 0xdf, - 0x1d, 0xcf, 0x66, 0x7c, 0x99, 0x8b, 0x43, 0x3e, 0x8b, 0xb3, 0xc3, 0x34, 0xbf, 0x3a, 0x66, 0xaf, - 0x76, 0x2f, 0x6b, 0x3e, 0x9f, 0xb3, 0xe1, 0x13, 0xff, 0xa9, 0x2a, 0x74, 0x64, 0xd8, 0x91, 0x0b, - 0x1b, 0xdf, 0x1f, 0x5d, 0x4f, 0x49, 0x97, 0xe5, 0x6f, 0x07, 0xd1, 0x0d, 0x58, 0x96, 0x09, 0xcf, - 0x56, 0xcc, 0x96, 0xe6, 0xe3, 0x0e, 0xc3, 0x3e, 0x6e, 0xca, 0xf3, 0xc9, 0x75, 0xd5, 0x74, 0x89, - 0xb2, 0xe8, 0x6d, 0x37, 0x5c, 0x26, 0xac, 0x92, 0xdd, 0xe9, 0x3e, 0x1d, 0x11, 0x1a, 0x31, 0x9e, - 0x1f, 0xf4, 0x41, 0xb5, 0xb7, 0x34, 0x1a, 0x6a, 0x6f, 0x19, 0xaf, 0x8c, 0xb3, 0x7b, 0xa8, 0x05, - 0x87, 0x30, 0xbe, 0xee, 0xf7, 0x20, 0xb5, 0xab, 0xdf, 0x8b, 0x7e, 0xe1, 0x25, 0x2f, 0xaf, 0xaa, - 0x22, 0x9e, 0x31, 0xdd, 0x15, 0xee, 0xfa, 0xda, 0x8d, 0x14, 0xf6, 0x86, 0x8d, 0x2e, 0xcc, 0x09, - 0xda, 0x46, 0xf8, 0x45, 0xc1, 0xe0, 0x18, 0x64, 0x15, 0x6b, 0x21, 0x15, 0xb4, 0x10, 0xd2, 0xb6, - 0xaf, 0xa2, 0xa1, 0xb5, 0x7d, 0xfe, 0xfb, 0x6c, 0x26, 0xc6, 0x49, 0x02, 0x5b, 0xc5, 0xea, 0x4a, - 0x62, 0x34, 0x4e, 0x12, 0xaa, 0x55, 0x70, 0x54, 0x3b, 0x7b, 0x15, 0xbd, 0x03, 0x9c, 0x1d, 0xa6, - 0x95, 0x74, 0xb8, 0x1d, 0xb6, 0xa2, 0x31, 0xe3, 0x74, 0xd4, 0x17, 0xd7, 0x8e, 0xff, 0x78, 0x10, - 0x7d, 0x07, 0xf1, 0x7c, 0xca, 0x16, 0x7c, 0xc5, 0x86, 0x8f, 0xba, 0xad, 0x29, 0xd2, 0xf8, 0xff, - 0xf0, 0x1a, 0x1a, 0x48, 0x98, 0x4c, 0x58, 0xc6, 0x66, 0x82, 0x0c, 0x13, 0x25, 0xee, 0x0c, 0x13, - 0x83, 0x39, 0x3d, 0xac, 0x11, 0xee, 0x33, 0xb1, 0xbb, 0x2c, 0x4b, 0x96, 0x0b, 0xb2, 0x2d, 0x2d, - 0xd2, 0xd9, 0x96, 0x1e, 0x8a, 0xd4, 0x67, 0x9f, 0x89, 0x71, 0x96, 0x91, 0xf5, 0x51, 0xe2, 0xce, - 0xfa, 0x18, 0x4c, 0x7b, 0x98, 0x45, 0xbf, 0xe8, 0x3c, 0x31, 0x71, 0x90, 0x5f, 0xf0, 0x21, 0xfd, - 0x2c, 0xa4, 0xdc, 0xf8, 0xd8, 0xec, 0xe4, 0x90, 0x6a, 0x3c, 0x7b, 0x5d, 0xf0, 0x92, 0x6e, 0x16, - 0x25, 0xee, 0xac, 0x86, 0xc1, 0xb4, 0x87, 0xdf, 0x8d, 0xde, 0xd2, 0xa3, 0x64, 0x33, 0x9f, 0xdd, - 0x41, 0x87, 0x50, 0x38, 0xa1, 0xdd, 0xed, 0xa0, 0x5a, 0xe6, 0x8f, 0xd2, 0x79, 0x59, 0x8f, 0x3e, - 0xb8, 0x79, 0x2d, 0xed, 0x30, 0x6f, 0x29, 0x6d, 0x9e, 0x47, 0xbf, 0xec, 0x9b, 0xdf, 0x8d, 0xf3, - 0x19, 0xcb, 0x86, 0x0f, 0x42, 0xea, 0x8a, 0x31, 0xae, 0xb6, 0x7a, 0xb1, 0x76, 0xb0, 0xd3, 0x84, - 0x1e, 0x4c, 0x3f, 0x40, 0xb5, 0xc1, 0x50, 0x7a, 0x27, 0x0c, 0xb5, 0x6c, 0xef, 0xb1, 0x8c, 0x91, - 0xb6, 0x95, 0xb0, 0xc3, 0xb6, 0x81, 0xb4, 0xed, 0x32, 0xfa, 0x15, 0xd3, 0xcc, 0x75, 0x5e, 0x20, - 0xe5, 0xf5, 0xa4, 0xb3, 0x45, 0xb4, 0xa3, 0x0b, 0x19, 0x5f, 0x0f, 0xfb, 0xc1, 0xad, 0xfa, 0xe8, - 0x11, 0x05, 0xaf, 0x0f, 0x18, 0x4f, 0xee, 0x84, 0x21, 0x6d, 0xfb, 0xaf, 0x06, 0xd1, 0xf7, 0xb4, - 0xec, 0x59, 0x1e, 0x9f, 0x67, 0x4c, 0x4e, 0xf1, 0xc7, 0x4c, 0xbc, 0xe2, 0xe5, 0xd5, 0x64, 0x9d, - 0xcf, 0x88, 0x74, 0x06, 0x87, 0x3b, 0xd2, 0x19, 0x52, 0x49, 0x17, 0xe6, 0x0f, 0xa2, 0x77, 0x9b, - 0xa0, 0xb8, 0x8c, 0xf3, 0x39, 0xfb, 0x61, 0xc5, 0xf3, 0x71, 0x91, 0x8e, 0x93, 0xa4, 0x1c, 0x8e, - 0xf0, 0xa6, 0x87, 0x9c, 0x29, 0xc1, 0x4e, 0x6f, 0xde, 0x49, 0x9f, 0xf5, 0x53, 0x16, 0xbc, 0x80, - 0xe9, 0x73, 0xf3, 0xf8, 0x04, 0x2f, 0xa8, 0xf4, 0xd9, 0x47, 0x5a, 0x56, 0x8f, 0xea, 0x39, 0x08, - 0xb7, 0x7a, 0xe4, 0x4e, 0x3a, 0xb7, 0x43, 0x88, 0x9d, 0x03, 0x9a, 0x07, 0xc5, 0xf3, 0x8b, 0x74, - 0x7e, 0x56, 0x24, 0x75, 0x1f, 0xba, 0x8f, 0xd7, 0xd9, 0x41, 0x88, 0x39, 0x80, 0x40, 0xb5, 0xb7, - 0xbf, 0xb1, 0x59, 0xa6, 0x1e, 0x97, 0x9e, 0x97, 0x7c, 0x71, 0xc8, 0xe6, 0xf1, 0x6c, 0xad, 0x07, - 0xd3, 0x8f, 0x42, 0xa3, 0x18, 0xa4, 0x4d, 0x21, 0x3e, 0xbe, 0xa6, 0x96, 0x2e, 0xcf, 0xbf, 0x0e, - 0xa2, 0x3b, 0x5e, 0x9c, 0xe8, 0x60, 0x52, 0xa5, 0x1f, 0xe7, 0xc9, 0x29, 0xab, 0x44, 0x5c, 0x8a, - 0xe1, 0xf7, 0x03, 0x31, 0x40, 0xe8, 0x98, 0xb2, 0xfd, 0xe0, 0x1b, 0xe9, 0xda, 0x56, 0x9f, 0xd4, - 0xb3, 0x84, 0x1e, 0x7f, 0xfc, 0x56, 0x97, 0x12, 0x38, 0xfa, 0xdc, 0x0e, 0x21, 0xb6, 0xd5, 0xa5, - 0xe0, 0x20, 0x5f, 0xa5, 0x82, 0xed, 0xb3, 0x9c, 0x95, 0xed, 0x56, 0x57, 0xaa, 0x3e, 0x42, 0xb4, - 0x3a, 0x81, 0xda, 0x91, 0xce, 0xf3, 0x66, 0x32, 0x8d, 0xad, 0x80, 0x91, 0x56, 0xae, 0xf1, 0xb0, - 0x1f, 0x6c, 0x97, 0xca, 0x8e, 0xcf, 0x53, 0xb6, 0xe2, 0x57, 0x70, 0xa9, 0xec, 0x9a, 0x50, 0x00, - 0xb1, 0x54, 0x46, 0x41, 0x9b, 0x0e, 0x38, 0x7e, 0x5e, 0xa4, 0xec, 0x15, 0x48, 0x07, 0x5c, 0xe5, - 0x5a, 0x4c, 0xa4, 0x03, 0x08, 0xa6, 0x3d, 0x1c, 0x47, 0x3f, 0x27, 0x85, 0x3f, 0xe4, 0x69, 0x3e, - 0xbc, 0x89, 0x28, 0xd5, 0x02, 0x63, 0xf5, 0x16, 0x0d, 0x80, 0x12, 0xd7, 0x7f, 0xd5, 0x73, 0xf3, - 0x5d, 0x42, 0x09, 0x4c, 0xcb, 0x1b, 0x5d, 0x98, 0xcd, 0xc3, 0xa4, 0xb0, 0x1e, 0xbf, 0x26, 0x97, - 0x71, 0x99, 0xe6, 0xf3, 0x21, 0xa6, 0xeb, 0xc8, 0x89, 0x3c, 0x0c, 0xe3, 0x40, 0x08, 0x6b, 0xc5, - 0x71, 0x51, 0x94, 0xf5, 0xb0, 0x88, 0x85, 0xb0, 0x8f, 0x04, 0x43, 0xb8, 0x85, 0xe2, 0xde, 0xf6, - 0xd8, 0x2c, 0x4b, 0xf3, 0xa0, 0x37, 0x8d, 0xf4, 0xf1, 0x66, 0x51, 0x10, 0xbc, 0x87, 0x2c, 0x5e, - 0xb1, 0xa6, 0x66, 0xd8, 0x93, 0x71, 0x81, 0x60, 0xf0, 0x02, 0xd0, 0x2e, 0x7a, 0xa5, 0xf8, 0x28, - 0xbe, 0x62, 0xf5, 0x03, 0x66, 0xf5, 0xa4, 0x3a, 0xc4, 0xf4, 0x3d, 0x82, 0x58, 0xf4, 0xe2, 0xa4, - 0x76, 0xb5, 0x8c, 0xde, 0x91, 0xf2, 0x93, 0xb8, 0x14, 0xe9, 0x2c, 0x2d, 0xe2, 0xbc, 0x59, 0x4c, - 0x61, 0xfd, 0xba, 0x45, 0x19, 0x97, 0xdb, 0x3d, 0x69, 0xed, 0xf6, 0x9f, 0x06, 0xd1, 0xfb, 0xd0, - 0xef, 0x09, 0x2b, 0x17, 0xa9, 0x5c, 0x93, 0x57, 0x6a, 0x10, 0x1e, 0x7e, 0x1a, 0x36, 0xda, 0x52, - 0x30, 0xa5, 0xf9, 0xec, 0xfa, 0x8a, 0x36, 0x13, 0x9b, 0xe8, 0x75, 0xca, 0x17, 0x65, 0xd2, 0xda, - 0xb3, 0x9a, 0x34, 0x8b, 0x0f, 0x29, 0x24, 0x32, 0xb1, 0x16, 0x04, 0x7a, 0xf8, 0x59, 0x5e, 0x35, - 0xd6, 0xb1, 0x1e, 0x6e, 0xc5, 0xc1, 0x1e, 0xee, 0x61, 0xb6, 0x87, 0x9f, 0x2c, 0xcf, 0xb3, 0xb4, - 0xba, 0x4c, 0xf3, 0xb9, 0x4e, 0xbb, 0x7d, 0x5d, 0x2b, 0x86, 0x99, 0xf7, 0x66, 0x27, 0x87, 0x39, - 0xd1, 0xc1, 0x42, 0x3a, 0x01, 0x61, 0xb2, 0xd9, 0xc9, 0xd9, 0xd5, 0x90, 0x95, 0xd6, 0xcb, 0x70, - 0xb0, 0x1a, 0x72, 0x54, 0x6b, 0x29, 0xb1, 0x1a, 0x6a, 0x53, 0x76, 0x35, 0xe4, 0xd6, 0xa1, 0xe2, - 0xd9, 0x8a, 0x9d, 0x95, 0x29, 0x58, 0x0d, 0x79, 0xe5, 0x6b, 0x18, 0x62, 0x35, 0x44, 0xb1, 0x76, - 0xa0, 0xb2, 0xc4, 0x3e, 0x13, 0x13, 0x11, 0x8b, 0x65, 0x05, 0x06, 0x2a, 0xc7, 0x86, 0x41, 0x88, - 0x81, 0x8a, 0x40, 0xb5, 0xb7, 0xdf, 0x8e, 0x22, 0xb5, 0x83, 0x21, 0x77, 0x99, 0xfc, 0xb9, 0x47, - 0x6f, 0x6d, 0x78, 0x5b, 0x4c, 0xef, 0x07, 0x08, 0x9b, 0xf0, 0xa8, 0xbf, 0xcb, 0xcd, 0xb3, 0x21, - 0xaa, 0x21, 0x45, 0x44, 0xc2, 0x03, 0x10, 0x58, 0xd0, 0xc9, 0x25, 0x7f, 0x85, 0x17, 0xb4, 0x96, - 0x84, 0x0b, 0xaa, 0x09, 0xbb, 0x9d, 0xad, 0x0b, 0x8a, 0x6d, 0x67, 0x37, 0xc5, 0x08, 0x6d, 0x67, - 0x43, 0xc6, 0xc6, 0x8c, 0x6b, 0xf8, 0x29, 0xe7, 0x57, 0x8b, 0xb8, 0xbc, 0x02, 0x31, 0xe3, 0x29, - 0x37, 0x0c, 0x11, 0x33, 0x14, 0x6b, 0x63, 0xc6, 0x75, 0x58, 0xa7, 0xcb, 0x67, 0x65, 0x06, 0x62, - 0xc6, 0xb3, 0xa1, 0x11, 0x22, 0x66, 0x08, 0xd4, 0x8e, 0x4e, 0xae, 0xb7, 0x09, 0x83, 0x1b, 0x28, - 0x9e, 0xfa, 0x84, 0x51, 0x1b, 0x28, 0x08, 0x06, 0x43, 0x68, 0xbf, 0x8c, 0x8b, 0x4b, 0x3c, 0x84, - 0xa4, 0x28, 0x1c, 0x42, 0x0d, 0x02, 0xdb, 0x7b, 0xc2, 0xe2, 0x72, 0x76, 0x89, 0xb7, 0xb7, 0x92, - 0x85, 0xdb, 0xdb, 0x30, 0xb0, 0xbd, 0x95, 0xe0, 0x65, 0x2a, 0x2e, 0x8f, 0x98, 0x88, 0xf1, 0xf6, - 0xf6, 0x99, 0x70, 0x7b, 0xb7, 0x58, 0x9b, 0x8f, 0xbb, 0x0e, 0x27, 0xcb, 0xf3, 0x6a, 0x56, 0xa6, - 0xe7, 0x6c, 0x18, 0xb0, 0x62, 0x20, 0x22, 0x1f, 0x27, 0x61, 0xed, 0xf3, 0xa7, 0x83, 0xe8, 0x66, - 0xd3, 0xec, 0xbc, 0xaa, 0xf4, 0xdc, 0xe7, 0xbb, 0xff, 0x18, 0x6f, 0x5f, 0x02, 0x27, 0x5e, 0x30, - 0xf4, 0x50, 0x73, 0x72, 0x03, 0xbc, 0x48, 0x67, 0x79, 0x65, 0x0a, 0xf5, 0x69, 0x1f, 0xeb, 0x8e, - 0x02, 0x91, 0x1b, 0xf4, 0x52, 0xb4, 0x69, 0x99, 0x6e, 0x9f, 0x46, 0x76, 0x90, 0x54, 0x20, 0x2d, - 0x6b, 0x9e, 0xb7, 0x43, 0x10, 0x69, 0x19, 0x4e, 0xc2, 0x50, 0xd8, 0x2f, 0xf9, 0xb2, 0xa8, 0x3a, - 0x42, 0x01, 0x40, 0xe1, 0x50, 0x68, 0xc3, 0xda, 0xe7, 0xeb, 0xe8, 0x57, 0xdd, 0xf0, 0x73, 0x1f, - 0xf6, 0x36, 0x1d, 0x53, 0xd8, 0x23, 0x1e, 0xf5, 0xc5, 0x6d, 0x46, 0xd1, 0x78, 0x16, 0x7b, 0x4c, - 0xc4, 0x69, 0x56, 0x0d, 0x37, 0x70, 0x1b, 0x8d, 0x9c, 0xc8, 0x28, 0x30, 0x0e, 0x8e, 0x6f, 0x7b, - 0xcb, 0x22, 0x4b, 0x67, 0xed, 0xd7, 0x3b, 0x5a, 0xd7, 0x88, 0xc3, 0xe3, 0x9b, 0x8b, 0xc1, 0xf1, - 0xba, 0x4e, 0xfd, 0xe4, 0x7f, 0xa6, 0xeb, 0x82, 0xe1, 0xe3, 0xb5, 0x87, 0x84, 0xc7, 0x6b, 0x88, - 0xc2, 0xfa, 0x4c, 0x98, 0x38, 0x8c, 0xd7, 0x7c, 0x49, 0x8c, 0xd7, 0x46, 0x1c, 0xae, 0x8f, 0x8b, - 0xd9, 0xb5, 0x81, 0xf1, 0x70, 0x90, 0x0b, 0x56, 0xe6, 0x71, 0xf6, 0x3c, 0x8b, 0xe7, 0xd5, 0x90, - 0x18, 0x63, 0x7c, 0x8a, 0x58, 0x1b, 0xd0, 0x34, 0xf2, 0x18, 0x0f, 0xaa, 0xe7, 0xf1, 0x8a, 0x97, - 0xa9, 0xa0, 0x1f, 0xa3, 0x45, 0x3a, 0x1f, 0xa3, 0x87, 0xa2, 0xde, 0xc6, 0xe5, 0xec, 0x32, 0x5d, - 0xb1, 0x24, 0xe0, 0xad, 0x41, 0x7a, 0x78, 0x73, 0x50, 0xa4, 0xd1, 0x26, 0x7c, 0x59, 0xce, 0x18, - 0xd9, 0x68, 0x4a, 0xdc, 0xd9, 0x68, 0x06, 0xd3, 0x1e, 0xfe, 0x6c, 0x10, 0xfd, 0x9a, 0x92, 0xba, - 0xef, 0x5c, 0xf6, 0xe2, 0xea, 0xf2, 0x9c, 0xc7, 0x65, 0x32, 0xfc, 0x10, 0xb3, 0x83, 0xa2, 0xc6, - 0xf5, 0xe3, 0xeb, 0xa8, 0xc0, 0xc7, 0x5a, 0xe7, 0xdd, 0xb6, 0xc7, 0xa1, 0x8f, 0xd5, 0x43, 0xc2, - 0x8f, 0x15, 0xa2, 0x70, 0x00, 0x91, 0x72, 0xb5, 0x25, 0xb7, 0x41, 0xea, 0xfb, 0xfb, 0x72, 0x9b, - 0x9d, 0x1c, 0x1c, 0x1f, 0x6b, 0xa1, 0x1f, 0x2d, 0xdb, 0x94, 0x0d, 0x3c, 0x62, 0x46, 0x7d, 0x71, - 0xd2, 0xb3, 0xe9, 0x15, 0x61, 0xcf, 0xad, 0x9e, 0x31, 0xea, 0x8b, 0x13, 0x9e, 0x9d, 0x61, 0x2d, - 0xe4, 0x19, 0x19, 0xda, 0x46, 0x7d, 0x71, 0x98, 0x7d, 0x69, 0xa6, 0x99, 0x17, 0x1e, 0x04, 0xec, - 0xc0, 0xb9, 0x61, 0xab, 0x17, 0xab, 0x1d, 0xfe, 0xc5, 0x20, 0xfa, 0xae, 0xf5, 0x78, 0xc4, 0x93, - 0xf4, 0x62, 0xad, 0xa0, 0x17, 0x71, 0xb6, 0x64, 0xd5, 0xf0, 0x31, 0x65, 0xad, 0xcd, 0x9a, 0x12, - 0x3c, 0xb9, 0x96, 0x0e, 0xec, 0x3b, 0xe3, 0xa2, 0xc8, 0xd6, 0x53, 0xb6, 0x28, 0x32, 0xb2, 0xef, - 0x78, 0x48, 0xb8, 0xef, 0x40, 0x14, 0x66, 0xe5, 0x53, 0x5e, 0xe7, 0xfc, 0x68, 0x56, 0x2e, 0x45, - 0xe1, 0xac, 0xbc, 0x41, 0x60, 0xae, 0x34, 0xe5, 0xbb, 0x3c, 0xcb, 0xd8, 0x4c, 0xb4, 0xcf, 0x6d, - 0x18, 0x4d, 0x4b, 0x84, 0x73, 0x25, 0x40, 0xda, 0x5d, 0xb9, 0x66, 0x0d, 0x19, 0x97, 0xec, 0xe9, - 0xfa, 0x30, 0xcd, 0xaf, 0x86, 0x78, 0x5a, 0x60, 0x01, 0x62, 0x57, 0x0e, 0x05, 0xe1, 0x5a, 0xf5, - 0x2c, 0x4f, 0x38, 0xbe, 0x56, 0xad, 0x25, 0xe1, 0xb5, 0xaa, 0x26, 0xa0, 0xc9, 0x53, 0x46, 0x99, - 0xac, 0x25, 0x61, 0x93, 0x9a, 0xc0, 0x86, 0x42, 0xfd, 0xee, 0x86, 0x1c, 0x0a, 0xc1, 0xdb, 0x9a, - 0xcd, 0x4e, 0x0e, 0x46, 0x68, 0xb3, 0x68, 0x7d, 0xce, 0xc4, 0xec, 0x12, 0x8f, 0x50, 0x0f, 0x09, - 0x47, 0x28, 0x44, 0x61, 0x95, 0xa6, 0xdc, 0x2c, 0xba, 0x37, 0xf0, 0xf8, 0x68, 0x2d, 0xb8, 0x37, - 0x3b, 0x39, 0xb8, 0x8c, 0x3c, 0x58, 0xc8, 0x67, 0x86, 0x06, 0xb9, 0x92, 0x85, 0x97, 0x91, 0x86, - 0x81, 0xa5, 0x57, 0x02, 0xb9, 0x97, 0xb5, 0x41, 0x2b, 0x7a, 0xbb, 0x59, 0x9b, 0x9d, 0x9c, 0x76, - 0xf2, 0x0f, 0x66, 0x19, 0xa7, 0xa4, 0xc7, 0xbc, 0xee, 0x23, 0x2f, 0xe2, 0x2c, 0x4d, 0x62, 0xc1, - 0xa6, 0xfc, 0x8a, 0xe5, 0xf8, 0x8a, 0x49, 0x97, 0x56, 0xf1, 0x23, 0x4f, 0x21, 0xbc, 0x62, 0x0a, - 0x2b, 0xc2, 0x38, 0x51, 0xf4, 0x59, 0xc5, 0x76, 0xe3, 0x8a, 0x18, 0xc9, 0x3c, 0x24, 0x1c, 0x27, - 0x10, 0x85, 0xf9, 0xaa, 0x92, 0x3f, 0x7b, 0x5d, 0xb0, 0x32, 0x65, 0xf9, 0x8c, 0xe1, 0xf9, 0x2a, - 0xa4, 0xc2, 0xf9, 0x2a, 0x42, 0xc3, 0xb5, 0xda, 0x5e, 0x2c, 0xd8, 0xd3, 0xf5, 0x34, 0x5d, 0xb0, - 0x4a, 0xc4, 0x8b, 0x02, 0x5f, 0xab, 0x01, 0x28, 0xbc, 0x56, 0x6b, 0xc3, 0xad, 0xad, 0x21, 0x33, - 0x20, 0xb6, 0x8f, 0x7b, 0x41, 0x22, 0x70, 0xdc, 0x8b, 0x40, 0xe1, 0x83, 0xb5, 0x00, 0xfa, 0x92, - 0xa0, 0x65, 0x25, 0xf8, 0x92, 0x80, 0xa6, 0x5b, 0x1b, 0x6e, 0x86, 0x99, 0xd4, 0x5d, 0xb3, 0xa3, - 0xe8, 0x13, 0xb7, 0x8b, 0x6e, 0xf5, 0x62, 0xf1, 0x1d, 0xbe, 0x53, 0x96, 0xc5, 0x72, 0xda, 0x0a, - 0x6c, 0xa3, 0x35, 0x4c, 0x9f, 0x1d, 0x3e, 0x87, 0xd5, 0x0e, 0xff, 0x64, 0x10, 0xbd, 0x87, 0x79, - 0xfc, 0xa2, 0x90, 0x7e, 0x1f, 0x75, 0xdb, 0x52, 0x24, 0x71, 0x9e, 0x2d, 0xac, 0x61, 0x8f, 0x64, - 0x34, 0x22, 0x7b, 0xdc, 0x4d, 0x17, 0xc0, 0x4f, 0xda, 0x4c, 0xf9, 0x21, 0x47, 0x1c, 0xc9, 0x08, - 0xf1, 0x76, 0x3d, 0xe4, 0x97, 0xab, 0x02, 0xeb, 0x21, 0x63, 0x43, 0x8b, 0x89, 0xf5, 0x10, 0x82, - 0xd9, 0xde, 0xe9, 0x56, 0xef, 0x65, 0x2a, 0x2e, 0x65, 0xbe, 0x05, 0x7a, 0xa7, 0x57, 0x56, 0x03, - 0x11, 0xbd, 0x93, 0x84, 0x61, 0x46, 0xd2, 0x80, 0x75, 0xdf, 0xc4, 0xc6, 0x72, 0x63, 0xc8, 0xed, - 0x99, 0xf7, 0xba, 0x41, 0x18, 0xaf, 0x8d, 0x58, 0x2f, 0x7d, 0x1e, 0x84, 0x2c, 0x80, 0xe5, 0xcf, - 0x56, 0x2f, 0x56, 0x3b, 0xfc, 0xa3, 0xe8, 0x3b, 0xad, 0x8a, 0x3d, 0x67, 0xb1, 0x58, 0x96, 0x2c, - 0x19, 0xee, 0x74, 0x94, 0xbb, 0x01, 0x8d, 0xeb, 0x47, 0xfd, 0x15, 0x5a, 0x39, 0x7a, 0xc3, 0xa9, - 0xb0, 0x32, 0x65, 0x78, 0x1c, 0x32, 0xe9, 0xb3, 0xc1, 0x1c, 0x9d, 0xd6, 0x69, 0x2d, 0xb3, 0xdd, - 0xe8, 0x1a, 0xaf, 0xe2, 0x34, 0x93, 0x2f, 0x6b, 0x3f, 0x0c, 0x19, 0xf5, 0xd0, 0xe0, 0x32, 0x9b, - 0x54, 0x69, 0x8d, 0xcc, 0xb2, 0x8f, 0x3b, 0xcb, 0xb3, 0x87, 0xf4, 0x48, 0x80, 0xac, 0xce, 0xb6, - 0x7b, 0xd2, 0xda, 0xad, 0x68, 0xa6, 0xbc, 0xfa, 0xcf, 0x6e, 0x90, 0x63, 0x5e, 0xb5, 0x2a, 0x12, - 0xe9, 0xdb, 0x3d, 0x69, 0xed, 0xf5, 0x0f, 0xa3, 0x77, 0xdb, 0x5e, 0xf5, 0x44, 0xb4, 0xd3, 0x69, - 0x0a, 0xcc, 0x45, 0x8f, 0xfa, 0x2b, 0x68, 0xf7, 0xff, 0x6c, 0xf6, 0xa5, 0x95, 0xff, 0x19, 0x5f, - 0x2c, 0x58, 0x9e, 0xb0, 0xa4, 0xd1, 0xa8, 0xea, 0xf5, 0xd3, 0x67, 0xb4, 0x5d, 0xa3, 0x30, 0x72, - 0x35, 0x4c, 0x89, 0x7e, 0xfd, 0x1b, 0x68, 0xea, 0xa2, 0xfd, 0xfb, 0x20, 0xba, 0x8f, 0x16, 0xad, - 0x09, 0x5c, 0xaf, 0x88, 0xbf, 0xd5, 0xc7, 0x11, 0xa6, 0x69, 0x8a, 0x3a, 0xfe, 0x3f, 0x58, 0xd0, - 0x45, 0xfe, 0x97, 0x41, 0x74, 0xdb, 0x2a, 0xd6, 0xe1, 0xbd, 0xcb, 0xf3, 0x8b, 0x2c, 0x9d, 0x09, - 0xf9, 0x46, 0x56, 0xab, 0xd0, 0x8f, 0x93, 0xd2, 0xe8, 0x7e, 0x9c, 0x01, 0x4d, 0xbb, 0x78, 0xfd, - 0x3c, 0xad, 0x04, 0x2f, 0xd7, 0x93, 0x4b, 0xfe, 0xaa, 0xf9, 0x60, 0xc8, 0x1f, 0x97, 0x35, 0x30, - 0x72, 0x08, 0x62, 0xf1, 0x8a, 0x93, 0x2d, 0x57, 0xf6, 0xc3, 0xa2, 0x8a, 0x70, 0xe5, 0x10, 0x1d, - 0xae, 0x7c, 0xd2, 0xce, 0x4a, 0x4d, 0xad, 0xec, 0x57, 0x50, 0x9b, 0x78, 0x51, 0xdb, 0x5f, 0x42, - 0xdd, 0xeb, 0x06, 0x6d, 0x6e, 0xaa, 0xc5, 0x7b, 0xe9, 0xc5, 0x85, 0xa9, 0x13, 0x5e, 0x52, 0x17, - 0x21, 0x72, 0x53, 0x02, 0xb5, 0xcb, 0xab, 0xe7, 0x69, 0xc6, 0xe4, 0xbb, 0x9b, 0x2f, 0x2e, 0x2e, - 0x32, 0x1e, 0x27, 0x60, 0x79, 0x55, 0x8b, 0x47, 0xae, 0x9c, 0x58, 0x5e, 0x61, 0x9c, 0x3d, 0x15, - 0x52, 0x4b, 0xeb, 0xe8, 0xce, 0x67, 0x69, 0x06, 0xcf, 0x1b, 0x4b, 0x4d, 0x23, 0x24, 0x4e, 0x85, - 0xb4, 0x20, 0x9b, 0x02, 0xd5, 0xa2, 0x3a, 0x2a, 0x9b, 0xf2, 0xdf, 0x6d, 0x2b, 0x3a, 0x62, 0x22, - 0x05, 0x42, 0x30, 0xbb, 0xcb, 0x50, 0x0b, 0xcf, 0x0a, 0x69, 0xfc, 0x56, 0x5b, 0x4b, 0x49, 0x88, - 0x5d, 0x06, 0x9f, 0xb0, 0xab, 0xe5, 0xfa, 0xef, 0x7b, 0xfc, 0x55, 0x2e, 0x8d, 0xde, 0x6e, 0xab, - 0x34, 0x32, 0x62, 0xb5, 0x0c, 0x19, 0x6d, 0xf8, 0x47, 0xd1, 0xff, 0x97, 0x86, 0x4b, 0x5e, 0x0c, - 0x6f, 0x20, 0x0a, 0xa5, 0x73, 0x3a, 0xf7, 0x26, 0x29, 0xb7, 0x87, 0x48, 0x4c, 0x6c, 0x9c, 0x55, - 0xf1, 0x1c, 0x1e, 0xa9, 0xb7, 0x2d, 0x2e, 0xa5, 0xc4, 0x21, 0x92, 0x36, 0xe5, 0x47, 0xc5, 0x31, - 0x4f, 0xb4, 0x75, 0xa4, 0x86, 0x46, 0x18, 0x8a, 0x0a, 0x17, 0xb2, 0x69, 0xeb, 0x71, 0xbc, 0x4a, - 0xe7, 0x26, 0xb5, 0x50, 0x03, 0x58, 0x05, 0xd2, 0x56, 0xcb, 0x8c, 0x1c, 0x88, 0x48, 0x5b, 0x49, - 0x58, 0xfb, 0xfc, 0xfb, 0x41, 0x74, 0xcb, 0x32, 0xfb, 0xcd, 0xbe, 0xec, 0x41, 0x7e, 0xc1, 0xeb, - 0x24, 0xf7, 0x30, 0xcd, 0xaf, 0xaa, 0xe1, 0x27, 0x94, 0x49, 0x9c, 0x37, 0x45, 0xf9, 0xf4, 0xda, - 0x7a, 0x76, 0x7d, 0xd2, 0x6c, 0x5a, 0xda, 0x93, 0x0b, 0x4a, 0x03, 0xac, 0x4f, 0xcc, 0xde, 0x26, - 0xe4, 0x88, 0xf5, 0x49, 0x88, 0xb7, 0x4d, 0x6c, 0x9c, 0x67, 0x3c, 0x87, 0x4d, 0x6c, 0x2d, 0xd4, - 0x42, 0xa2, 0x89, 0x5b, 0x90, 0x1d, 0x8f, 0x1b, 0x91, 0xda, 0x5f, 0x1b, 0x67, 0x19, 0x18, 0x8f, - 0x8d, 0xaa, 0x01, 0x88, 0xf1, 0x18, 0x05, 0xb5, 0x9f, 0xd3, 0xe8, 0x5b, 0xf5, 0x23, 0x3d, 0x29, - 0xd9, 0x2a, 0x65, 0xf0, 0x90, 0x8d, 0x23, 0x21, 0xfa, 0xbf, 0x4f, 0xd8, 0x9e, 0x75, 0x96, 0x57, - 0x45, 0x16, 0x57, 0x97, 0xfa, 0xd8, 0x85, 0x5f, 0xe7, 0x46, 0x08, 0x0f, 0x5e, 0xdc, 0xed, 0xa0, - 0xec, 0xa0, 0xde, 0xc8, 0xcc, 0x10, 0xb3, 0x81, 0xab, 0xb6, 0x86, 0x99, 0xcd, 0x4e, 0xce, 0xbe, - 0xdb, 0xd8, 0x8f, 0xb3, 0x8c, 0x95, 0xeb, 0x46, 0x76, 0x14, 0xe7, 0xe9, 0x05, 0xab, 0x04, 0x78, - 0xb7, 0xa1, 0xa9, 0x11, 0xc4, 0x88, 0x77, 0x1b, 0x01, 0xdc, 0xae, 0xdb, 0x80, 0xe7, 0x83, 0x3c, - 0x61, 0xaf, 0xc1, 0xba, 0x0d, 0xda, 0x91, 0x0c, 0xb1, 0x6e, 0xa3, 0x58, 0xbb, 0xc7, 0xff, 0x34, - 0xe3, 0xb3, 0x2b, 0x3d, 0x05, 0xf8, 0x0d, 0x2c, 0x25, 0x70, 0x0e, 0xb8, 0x1d, 0x42, 0xec, 0x24, - 0x20, 0x05, 0xa7, 0xac, 0xc8, 0xe2, 0x19, 0x3c, 0x69, 0xa5, 0x74, 0xb4, 0x8c, 0x98, 0x04, 0x20, - 0x03, 0x8a, 0xab, 0x4f, 0x70, 0x61, 0xc5, 0x05, 0x07, 0xb8, 0x6e, 0x87, 0x10, 0x3b, 0x0d, 0x4a, - 0xc1, 0xa4, 0xc8, 0x52, 0x01, 0xba, 0x81, 0xd2, 0x90, 0x12, 0xa2, 0x1b, 0xf8, 0x04, 0x30, 0x79, - 0xc4, 0xca, 0x39, 0x43, 0x4d, 0x4a, 0x49, 0xd0, 0x64, 0x43, 0xd8, 0x63, 0xe5, 0xaa, 0xee, 0xbc, - 0x58, 0x83, 0x63, 0xe5, 0xba, 0x5a, 0xbc, 0x58, 0x13, 0xc7, 0xca, 0x3d, 0x00, 0x14, 0xf1, 0x24, - 0xae, 0x04, 0x5e, 0x44, 0x29, 0x09, 0x16, 0xb1, 0x21, 0xec, 0x1c, 0xad, 0x8a, 0xb8, 0x14, 0x60, - 0x8e, 0xd6, 0x05, 0x70, 0xce, 0x1a, 0xdc, 0x24, 0xe5, 0x76, 0x24, 0x51, 0xad, 0xc2, 0xc4, 0xf3, - 0x94, 0x65, 0x49, 0x05, 0x46, 0x12, 0xfd, 0xdc, 0x1b, 0x29, 0x31, 0x92, 0xb4, 0x29, 0x10, 0x4a, - 0xfa, 0x4d, 0x08, 0x56, 0x3b, 0xf0, 0x12, 0xe4, 0x76, 0x08, 0xb1, 0xe3, 0x53, 0x53, 0xe8, 0xdd, - 0xb8, 0x2c, 0xd3, 0x7a, 0xf2, 0xdf, 0xc0, 0x0b, 0xd4, 0xc8, 0x89, 0xf1, 0x09, 0xe3, 0x40, 0xf7, - 0x6a, 0x06, 0x6e, 0xac, 0x60, 0x70, 0xe8, 0xfe, 0x20, 0xc8, 0xd8, 0x8c, 0x53, 0x4a, 0x9c, 0x97, - 0xe5, 0xd8, 0xd3, 0x44, 0xde, 0x95, 0x6f, 0x74, 0x61, 0xce, 0x37, 0x67, 0xc6, 0xc5, 0x11, 0x5f, - 0xb1, 0x29, 0x7f, 0xf6, 0x3a, 0xad, 0xea, 0xe5, 0x96, 0x9e, 0xb9, 0x9f, 0x10, 0x96, 0x30, 0x98, - 0xf8, 0xe6, 0xac, 0x53, 0xc9, 0x26, 0x10, 0xa0, 0x2c, 0xc7, 0xec, 0x15, 0x9a, 0x40, 0x40, 0x8b, - 0x86, 0x23, 0x12, 0x88, 0x10, 0x6f, 0x77, 0xcc, 0x8c, 0x73, 0x7d, 0xd1, 0xc0, 0x94, 0x37, 0xb9, - 0x1c, 0x65, 0x0d, 0x82, 0xc4, 0xa6, 0x45, 0x50, 0xc1, 0xae, 0x2f, 0x8d, 0x7f, 0xdb, 0xc5, 0xee, - 0x11, 0x76, 0xda, 0xdd, 0xec, 0x7e, 0x0f, 0x12, 0x71, 0x65, 0x4f, 0x7c, 0x50, 0xae, 0xda, 0x07, - 0x3e, 0xee, 0xf7, 0x20, 0x9d, 0xdd, 0x37, 0xb7, 0x5a, 0x4f, 0xe3, 0xd9, 0xd5, 0xbc, 0xe4, 0xcb, - 0x3c, 0xd9, 0xe5, 0x19, 0x2f, 0xc1, 0xee, 0x9b, 0x57, 0x6a, 0x80, 0x12, 0xbb, 0x6f, 0x1d, 0x2a, - 0x36, 0x83, 0x73, 0x4b, 0x31, 0xce, 0xd2, 0x39, 0x5c, 0x51, 0x7b, 0x86, 0x24, 0x40, 0x64, 0x70, - 0x28, 0x88, 0x04, 0x91, 0x5a, 0x71, 0x8b, 0x74, 0x16, 0x67, 0xca, 0xdf, 0x0e, 0x6d, 0xc6, 0x03, - 0x3b, 0x83, 0x08, 0x51, 0x40, 0xea, 0x39, 0x5d, 0x96, 0xf9, 0x41, 0x2e, 0x38, 0x59, 0xcf, 0x06, - 0xe8, 0xac, 0xa7, 0x03, 0x82, 0x61, 0x75, 0xca, 0x5e, 0xd7, 0xa5, 0xa9, 0xff, 0xc1, 0x86, 0xd5, - 0xfa, 0xef, 0x23, 0x2d, 0x0f, 0x0d, 0xab, 0x80, 0x03, 0x95, 0xd1, 0x4e, 0x54, 0xc0, 0x04, 0xb4, - 0xfd, 0x30, 0xb9, 0xd7, 0x0d, 0xe2, 0x7e, 0x26, 0x62, 0x9d, 0xb1, 0x90, 0x1f, 0x09, 0xf4, 0xf1, - 0xd3, 0x80, 0x76, 0xbb, 0xc5, 0xab, 0xcf, 0x25, 0x9b, 0x5d, 0xb5, 0x0e, 0xb0, 0xf9, 0x05, 0x55, - 0x08, 0xb1, 0xdd, 0x42, 0xa0, 0x78, 0x13, 0x1d, 0xcc, 0x78, 0x1e, 0x6a, 0xa2, 0x5a, 0xde, 0xa7, - 0x89, 0x34, 0x67, 0x17, 0xbf, 0x46, 0xaa, 0x23, 0x53, 0x35, 0xd3, 0x16, 0x61, 0xc1, 0x85, 0x88, - 0xc5, 0x2f, 0x09, 0xdb, 0x9c, 0x1c, 0xfa, 0x3c, 0x6a, 0x9f, 0xee, 0x6f, 0x59, 0x39, 0xa2, 0x4f, - 0xf7, 0x53, 0x2c, 0x5d, 0x49, 0x15, 0x23, 0x1d, 0x56, 0xfc, 0x38, 0x79, 0xd8, 0x0f, 0xb6, 0x4b, - 0x1e, 0xcf, 0xe7, 0x6e, 0xc6, 0xe2, 0x52, 0x79, 0xdd, 0x0e, 0x18, 0xb2, 0x18, 0xb1, 0xe4, 0x09, - 0xe0, 0x60, 0x08, 0xf3, 0x3c, 0xef, 0xf2, 0x5c, 0xb0, 0x5c, 0x60, 0x43, 0x98, 0x6f, 0x4c, 0x83, - 0xa1, 0x21, 0x8c, 0x52, 0x00, 0x71, 0x2b, 0xf7, 0x83, 0x98, 0x38, 0x8e, 0x17, 0x68, 0xc6, 0xa6, - 0xf6, 0x7a, 0x94, 0x3c, 0x14, 0xb7, 0x80, 0x73, 0x5e, 0xe7, 0xba, 0x5e, 0xa6, 0x71, 0x39, 0x37, - 0xbb, 0x1b, 0xc9, 0xf0, 0x11, 0x6d, 0xc7, 0x27, 0x89, 0xd7, 0xb9, 0x61, 0x0d, 0x30, 0xec, 0x1c, - 0x2c, 0xe2, 0xb9, 0xa9, 0x29, 0x52, 0x03, 0x29, 0x6f, 0x55, 0xf5, 0x5e, 0x37, 0x08, 0xfc, 0xbc, - 0x48, 0x13, 0xc6, 0x03, 0x7e, 0xa4, 0xbc, 0x8f, 0x1f, 0x08, 0x82, 0xec, 0xad, 0xae, 0xb7, 0x5a, - 0xd1, 0x8d, 0xf3, 0x44, 0xaf, 0x63, 0x47, 0xc4, 0xe3, 0x01, 0x5c, 0x28, 0x7b, 0x23, 0x78, 0xd0, - 0x47, 0x9b, 0x0d, 0xda, 0x50, 0x1f, 0x35, 0xfb, 0xaf, 0x7d, 0xfa, 0x28, 0x06, 0x6b, 0x9f, 0x3f, - 0xd1, 0x7d, 0x74, 0x2f, 0x16, 0x71, 0x9d, 0xb7, 0xbf, 0x48, 0xd9, 0x2b, 0xbd, 0x10, 0x46, 0xea, - 0xdb, 0x50, 0x23, 0xf9, 0x71, 0x32, 0x58, 0x15, 0xef, 0xf4, 0xe6, 0x03, 0xbe, 0xf5, 0x0a, 0xa1, - 0xd3, 0x37, 0x58, 0x2a, 0xec, 0xf4, 0xe6, 0x03, 0xbe, 0xf5, 0xad, 0x07, 0x9d, 0xbe, 0xc1, 0xd5, - 0x07, 0x3b, 0xbd, 0x79, 0xed, 0xfb, 0x4f, 0x9b, 0x8e, 0xeb, 0x3a, 0xaf, 0xf3, 0xb0, 0x99, 0x48, - 0x57, 0x0c, 0x4b, 0x27, 0x7d, 0x7b, 0x06, 0x0d, 0xa5, 0x93, 0xb4, 0x8a, 0x73, 0xef, 0x18, 0x56, - 0x8a, 0x13, 0x5e, 0xa5, 0xf2, 0x38, 0xc6, 0x93, 0x1e, 0x46, 0x1b, 0x38, 0xb4, 0x68, 0x0a, 0x29, - 0xd9, 0x17, 0xcb, 0x1e, 0x6a, 0xcf, 0xab, 0x3f, 0x0c, 0xd8, 0x6b, 0x1f, 0x5b, 0xdf, 0xee, 0x49, - 0xdb, 0x57, 0xbc, 0x1e, 0xe3, 0xbe, 0x5b, 0x0e, 0xb5, 0x2a, 0xfa, 0x7a, 0xf9, 0x51, 0x7f, 0x05, - 0xed, 0xfe, 0xcf, 0x9b, 0x75, 0x05, 0xf4, 0xaf, 0x3b, 0xc1, 0xe3, 0x3e, 0x16, 0x41, 0x47, 0x78, - 0x72, 0x2d, 0x1d, 0x5d, 0x90, 0xbf, 0x6e, 0x16, 0xd0, 0x0d, 0x2a, 0xbf, 0xda, 0x91, 0x5f, 0xfb, - 0xea, 0x3e, 0x11, 0x6a, 0x56, 0x0b, 0xc3, 0x9e, 0xf1, 0xf1, 0x35, 0xb5, 0x9c, 0x5b, 0xe8, 0x3c, - 0x58, 0x7f, 0x5d, 0xea, 0x94, 0x27, 0x64, 0xd9, 0xa1, 0x61, 0x81, 0x3e, 0xb9, 0xae, 0x1a, 0xd5, - 0x57, 0x1c, 0x58, 0xde, 0xc3, 0xf2, 0xa4, 0xa7, 0x61, 0xef, 0x66, 0x96, 0x8f, 0xae, 0xa7, 0xa4, - 0xcb, 0xf2, 0x6f, 0x83, 0xe8, 0xae, 0xc7, 0xda, 0xf7, 0x09, 0x60, 0xd7, 0xe3, 0x07, 0x01, 0xfb, - 0x94, 0x92, 0x29, 0xdc, 0x6f, 0x7c, 0x33, 0x65, 0x7b, 0x65, 0x9b, 0xa7, 0xf2, 0x3c, 0xcd, 0x04, - 0x2b, 0xdb, 0x57, 0xb6, 0xf9, 0x76, 0x15, 0x35, 0xa2, 0xaf, 0x6c, 0x0b, 0xe0, 0xce, 0x95, 0x6d, - 0x88, 0x67, 0xf4, 0xca, 0x36, 0xd4, 0x5a, 0xf0, 0xca, 0xb6, 0xb0, 0x06, 0x35, 0xbc, 0x37, 0x45, - 0x50, 0xfb, 0xd6, 0xbd, 0x2c, 0xfa, 0xdb, 0xd8, 0x8f, 0xaf, 0xa3, 0x42, 0x4c, 0x70, 0x8a, 0x93, - 0x27, 0x1a, 0x7b, 0x3c, 0x53, 0xef, 0x54, 0xe3, 0x4e, 0x6f, 0x5e, 0xfb, 0xfe, 0xb1, 0x5e, 0xdd, - 0x98, 0xe1, 0x9c, 0x97, 0xf2, 0xba, 0xbe, 0xad, 0xd0, 0xf0, 0x5c, 0x5b, 0x70, 0x5b, 0xfe, 0x61, - 0x3f, 0x98, 0xa8, 0x6e, 0x4d, 0xe8, 0x46, 0x1f, 0x75, 0x19, 0x02, 0x4d, 0xbe, 0xd3, 0x9b, 0x27, - 0xa6, 0x11, 0xe5, 0x5b, 0xb5, 0x76, 0x0f, 0x63, 0x7e, 0x5b, 0x3f, 0xea, 0xaf, 0xa0, 0xdd, 0xaf, - 0x74, 0xda, 0xe8, 0xba, 0x97, 0xed, 0xbc, 0xdd, 0x65, 0x6a, 0xe2, 0x35, 0xf3, 0xa8, 0x2f, 0x1e, - 0x4a, 0x20, 0xdc, 0x29, 0xb4, 0x2b, 0x81, 0x40, 0xa7, 0xd1, 0x8f, 0xae, 0xa7, 0xa4, 0xcb, 0xf2, - 0x77, 0x83, 0xe8, 0x26, 0x59, 0x16, 0x1d, 0x07, 0x9f, 0xf4, 0xb5, 0x0c, 0xe2, 0xe1, 0xd3, 0x6b, - 0xeb, 0xe9, 0x42, 0xfd, 0xe3, 0x20, 0xba, 0x15, 0x28, 0x94, 0x0a, 0x90, 0x6b, 0x58, 0xf7, 0x03, - 0xe5, 0xb3, 0xeb, 0x2b, 0x52, 0xd3, 0xbd, 0x8b, 0x4f, 0xda, 0xd7, 0x6f, 0x05, 0x6c, 0x4f, 0xe8, - 0xeb, 0xb7, 0xba, 0xb5, 0xe0, 0x26, 0x4f, 0x7c, 0xde, 0x2c, 0xba, 0xd0, 0x4d, 0x1e, 0x79, 0x16, - 0x31, 0x78, 0x8d, 0x08, 0xc6, 0x61, 0x4e, 0x9e, 0xbd, 0x2e, 0xe2, 0x3c, 0xa1, 0x9d, 0x28, 0x79, - 0xb7, 0x13, 0xc3, 0xc1, 0xcd, 0xb1, 0x5a, 0x7a, 0xca, 0x9b, 0x85, 0xd4, 0x7d, 0x4a, 0xdf, 0x20, - 0xc1, 0xcd, 0xb1, 0x16, 0x4a, 0x78, 0xd3, 0x59, 0x63, 0xc8, 0x1b, 0x48, 0x16, 0x1f, 0xf4, 0x41, - 0x41, 0x8a, 0x6e, 0xbc, 0x99, 0x3d, 0xf7, 0x87, 0x21, 0x2b, 0xad, 0x7d, 0xf7, 0xed, 0x9e, 0x34, - 0xe1, 0x76, 0xc2, 0xc4, 0xe7, 0x2c, 0x4e, 0x58, 0x19, 0x74, 0x6b, 0xa8, 0x5e, 0x6e, 0x5d, 0x1a, - 0x73, 0xbb, 0xcb, 0xb3, 0xe5, 0x22, 0xd7, 0x8d, 0x49, 0xba, 0x75, 0xa9, 0x6e, 0xb7, 0x80, 0x86, - 0xdb, 0x82, 0xd6, 0xad, 0x4c, 0x2f, 0x1f, 0x84, 0xcd, 0x78, 0x59, 0xe5, 0x56, 0x2f, 0x96, 0xae, - 0xa7, 0x0e, 0xa3, 0x8e, 0x7a, 0x82, 0x48, 0xda, 0xee, 0x49, 0xc3, 0xfd, 0x39, 0xc7, 0xad, 0x89, - 0xa7, 0x9d, 0x0e, 0x5b, 0xad, 0x90, 0x7a, 0xd4, 0x5f, 0x01, 0xee, 0x86, 0xea, 0xa8, 0x3a, 0x4c, - 0x2b, 0xf1, 0x3c, 0xcd, 0xb2, 0xe1, 0x56, 0x20, 0x4c, 0x1a, 0x28, 0xb8, 0x1b, 0x8a, 0xc0, 0x44, - 0x24, 0x37, 0xbb, 0x87, 0xf9, 0xb0, 0xcb, 0x8e, 0xa4, 0x7a, 0x45, 0xb2, 0x4b, 0x83, 0x1d, 0x2d, - 0xe7, 0x51, 0x9b, 0xda, 0x8e, 0xc2, 0x0f, 0xae, 0x55, 0xe1, 0x9d, 0xde, 0x3c, 0x78, 0xdd, 0x2e, - 0x29, 0x39, 0xb3, 0xdc, 0xa1, 0x4c, 0x78, 0x33, 0xc9, 0xdd, 0x0e, 0x0a, 0xec, 0x0a, 0xaa, 0x6e, - 0xf4, 0x32, 0x4d, 0xe6, 0x4c, 0xa0, 0x6f, 0x8a, 0x5c, 0x20, 0xf8, 0xa6, 0x08, 0x80, 0xa0, 0xe9, - 0xd4, 0xdf, 0xcd, 0x76, 0xe8, 0x41, 0x82, 0x35, 0x9d, 0x56, 0x76, 0xa8, 0x50, 0xd3, 0xa1, 0x34, - 0x18, 0x0d, 0x8c, 0x5b, 0x7d, 0xf1, 0xc2, 0x83, 0x90, 0x19, 0x70, 0xfb, 0xc2, 0x56, 0x2f, 0x16, - 0xcc, 0x28, 0xd6, 0x61, 0xba, 0x48, 0x05, 0x36, 0xa3, 0x38, 0x36, 0x6a, 0x24, 0x34, 0xa3, 0xb4, - 0x51, 0xaa, 0x7a, 0x75, 0x8e, 0x70, 0x90, 0x84, 0xab, 0xa7, 0x98, 0x7e, 0xd5, 0x33, 0x6c, 0xeb, - 0xc5, 0x66, 0x6e, 0x42, 0x46, 0x5c, 0xea, 0xc5, 0x32, 0x12, 0xdb, 0xf2, 0x83, 0x5c, 0x08, 0x86, - 0x46, 0x1d, 0x4a, 0x01, 0x6e, 0xd8, 0xd7, 0x5c, 0xf3, 0xee, 0xb5, 0x28, 0x58, 0x5c, 0xc6, 0xf9, - 0x0c, 0x5d, 0x9c, 0x4a, 0x83, 0x2d, 0x32, 0xb4, 0x38, 0x25, 0x35, 0xc0, 0x6b, 0x73, 0xff, 0x53, - 0x5a, 0xa4, 0x2b, 0x98, 0x6f, 0x56, 0xfd, 0x2f, 0x69, 0xef, 0xf7, 0x20, 0xe1, 0x6b, 0xf3, 0x06, - 0x30, 0x1b, 0xdf, 0xca, 0xe9, 0x87, 0x01, 0x53, 0x3e, 0x1a, 0x5a, 0x08, 0xd3, 0x2a, 0x20, 0xa8, - 0x4d, 0x82, 0xcb, 0xc4, 0x8f, 0xd8, 0x1a, 0x0b, 0x6a, 0x9b, 0x9f, 0x4a, 0x24, 0x14, 0xd4, 0x6d, - 0x14, 0xe4, 0x99, 0xee, 0x3a, 0x68, 0x23, 0xa0, 0xef, 0x2e, 0x7d, 0x36, 0x3b, 0x39, 0xd0, 0x73, - 0xf6, 0xd2, 0x95, 0xf7, 0x9e, 0x00, 0x29, 0xe8, 0x5e, 0xba, 0xc2, 0x5f, 0x13, 0x6c, 0xf5, 0x62, - 0xe1, 0x2b, 0xf9, 0x58, 0xb0, 0xd7, 0xcd, 0xbb, 0x72, 0xa4, 0xb8, 0x52, 0xde, 0x7a, 0x59, 0x7e, - 0xaf, 0x1b, 0xb4, 0x07, 0x60, 0x4f, 0x4a, 0x3e, 0x63, 0x55, 0xa5, 0xef, 0x24, 0xf5, 0x4f, 0x18, - 0x69, 0xd9, 0x08, 0xdc, 0x48, 0x7a, 0x27, 0x0c, 0x39, 0x17, 0x09, 0x2a, 0x91, 0xbd, 0xdf, 0x68, - 0x03, 0xd5, 0x6c, 0x5f, 0x6d, 0xb4, 0xd9, 0xc9, 0xd9, 0xee, 0xa5, 0xa5, 0xee, 0x85, 0x46, 0xf7, - 0x50, 0x75, 0xec, 0x2e, 0xa3, 0xfb, 0x3d, 0x48, 0xed, 0xea, 0xf3, 0xe8, 0xcd, 0x43, 0x3e, 0x9f, - 0xb0, 0x3c, 0x19, 0x7e, 0xcf, 0x3f, 0x42, 0xcb, 0xe7, 0xa3, 0xfa, 0xcf, 0xc6, 0xe8, 0x0d, 0x4a, - 0x6c, 0x0f, 0x01, 0xee, 0xb1, 0xf3, 0xe5, 0x7c, 0x22, 0x62, 0x01, 0x0e, 0x01, 0xca, 0xbf, 0x8f, - 0x6a, 0x01, 0x71, 0x08, 0xd0, 0x03, 0x80, 0xbd, 0x69, 0xc9, 0x18, 0x6a, 0xaf, 0x16, 0x04, 0xed, - 0x69, 0xc0, 0x66, 0x11, 0xc6, 0x5e, 0x9d, 0xa8, 0xc3, 0x43, 0x7b, 0x56, 0x47, 0x4a, 0x89, 0x2c, - 0xa2, 0x4d, 0xd9, 0xe0, 0x56, 0xd5, 0x97, 0xf7, 0xcb, 0x2c, 0x17, 0x8b, 0xb8, 0x5c, 0x83, 0xe0, - 0xd6, 0xb5, 0x74, 0x00, 0x22, 0xb8, 0x51, 0xd0, 0xf6, 0xda, 0xe6, 0x31, 0xcf, 0xae, 0xf6, 0x79, - 0xc9, 0x97, 0x22, 0xcd, 0x19, 0xbc, 0x63, 0xc4, 0x3c, 0x50, 0x97, 0x21, 0x7a, 0x2d, 0xc5, 0xda, - 0x2c, 0x57, 0x12, 0xea, 0x3c, 0xa1, 0xbc, 0x26, 0xbd, 0x12, 0xbc, 0x84, 0xef, 0x13, 0x95, 0x15, - 0x08, 0x11, 0x59, 0x2e, 0x09, 0x83, 0xb6, 0x3f, 0x49, 0xf3, 0x39, 0xda, 0xf6, 0x27, 0xee, 0x3d, - 0xbf, 0xb7, 0x68, 0xc0, 0x76, 0x28, 0xf5, 0xd0, 0x54, 0x07, 0xd0, 0x5f, 0xed, 0xa2, 0x0f, 0xdd, - 0x25, 0x88, 0x0e, 0x85, 0x93, 0xc0, 0xd5, 0x17, 0x05, 0xcb, 0x59, 0xd2, 0x9c, 0x9a, 0xc3, 0x5c, - 0x79, 0x44, 0xd0, 0x15, 0x24, 0xed, 0x58, 0x24, 0xe5, 0xa7, 0xcb, 0xfc, 0xa4, 0xe4, 0x17, 0x69, - 0xc6, 0x4a, 0x30, 0x16, 0x29, 0x75, 0x47, 0x4e, 0x8c, 0x45, 0x18, 0x67, 0x8f, 0x5f, 0x48, 0xa9, - 0x77, 0xd7, 0xff, 0xb4, 0x8c, 0x67, 0xf0, 0xf8, 0x85, 0xb2, 0xd1, 0xc6, 0x88, 0x9d, 0xc1, 0x00, - 0xee, 0x24, 0x3a, 0xca, 0x75, 0xbe, 0x96, 0xf1, 0xa1, 0xbf, 0x1a, 0x95, 0xb7, 0xdf, 0x56, 0x20, - 0xd1, 0xd1, 0xe6, 0x30, 0x92, 0x48, 0x74, 0xc2, 0x1a, 0x76, 0x2a, 0x91, 0xdc, 0xb1, 0x3e, 0x56, - 0x04, 0xa6, 0x12, 0x65, 0xa3, 0x11, 0x12, 0x53, 0x49, 0x0b, 0x02, 0x03, 0x52, 0xd3, 0x0d, 0xe6, - 0xe8, 0x80, 0x64, 0xa4, 0xc1, 0x01, 0xc9, 0xa5, 0xec, 0x40, 0x71, 0x90, 0xa7, 0x22, 0x8d, 0xb3, - 0x09, 0x13, 0x27, 0x71, 0x19, 0x2f, 0x98, 0x60, 0x25, 0x1c, 0x28, 0x34, 0x32, 0xf2, 0x18, 0x62, - 0xa0, 0xa0, 0x58, 0xed, 0xf0, 0x37, 0xa3, 0xb7, 0xeb, 0x79, 0x9f, 0xe5, 0xfa, 0x57, 0x8a, 0x9e, - 0xc9, 0x9f, 0x37, 0x1b, 0xbe, 0x63, 0x6c, 0x4c, 0x44, 0xc9, 0xe2, 0x45, 0x63, 0xfb, 0x2d, 0xf3, - 0x77, 0x09, 0x3e, 0x1a, 0xd4, 0xf1, 0x7c, 0xcc, 0x45, 0x7a, 0x51, 0x2f, 0xb3, 0xf5, 0x17, 0x44, - 0x20, 0x9e, 0x5d, 0xf1, 0x28, 0x70, 0xeb, 0x08, 0xc6, 0xd9, 0x71, 0xda, 0x95, 0x9e, 0xb2, 0x22, - 0x83, 0xe3, 0xb4, 0xa7, 0x2d, 0x01, 0x62, 0x9c, 0x46, 0x41, 0xdb, 0x39, 0x5d, 0xf1, 0x94, 0x85, - 0x2b, 0x33, 0x65, 0xfd, 0x2a, 0x33, 0xf5, 0x3e, 0xca, 0xc8, 0xa2, 0xb7, 0x8f, 0xd8, 0xe2, 0x9c, - 0x95, 0xd5, 0x65, 0x5a, 0x50, 0x37, 0xf4, 0x5a, 0xa2, 0xf3, 0x86, 0x5e, 0x02, 0xb5, 0x33, 0x81, - 0x05, 0x0e, 0xaa, 0xe3, 0x78, 0xc1, 0xe4, 0x1d, 0x2a, 0x60, 0x26, 0x70, 0x8c, 0x38, 0x10, 0x31, - 0x13, 0x90, 0xb0, 0xf3, 0x7d, 0x97, 0x65, 0x4e, 0xd9, 0xbc, 0x8e, 0xb0, 0xf2, 0x24, 0x5e, 0x2f, - 0x58, 0x2e, 0xb4, 0x49, 0xb0, 0x27, 0xef, 0x98, 0xc4, 0x79, 0x62, 0x4f, 0xbe, 0x8f, 0x9e, 0x33, - 0x34, 0x79, 0x0f, 0xfe, 0x84, 0x97, 0x42, 0xfd, 0x06, 0xd9, 0x59, 0x99, 0x81, 0xa1, 0xc9, 0x7f, - 0xa8, 0x1e, 0x49, 0x0c, 0x4d, 0x61, 0x0d, 0xe7, 0xf7, 0x26, 0xbc, 0x32, 0xbc, 0x60, 0xa5, 0x89, - 0x93, 0x67, 0x8b, 0x38, 0xcd, 0x74, 0x34, 0x7c, 0x3f, 0x60, 0x9b, 0xd0, 0x21, 0x7e, 0x6f, 0xa2, - 0xaf, 0xae, 0xf3, 0x0b, 0x1d, 0xe1, 0x12, 0x82, 0x57, 0x04, 0x1d, 0xf6, 0x89, 0x57, 0x04, 0xdd, - 0x5a, 0x76, 0xe5, 0x6e, 0x59, 0xc9, 0xad, 0x25, 0xb1, 0xcb, 0x13, 0xb8, 0x5f, 0xe8, 0xd8, 0x04, - 0x20, 0xb1, 0x72, 0x0f, 0x2a, 0xd8, 0xd4, 0xc0, 0x62, 0xcf, 0xd3, 0x3c, 0xce, 0xd2, 0x9f, 0xc0, - 0xb4, 0xde, 0xb1, 0xd3, 0x10, 0x44, 0x6a, 0x80, 0x93, 0x98, 0xab, 0x7d, 0x26, 0xa6, 0x69, 0x3d, - 0xf4, 0xdf, 0x0b, 0x3c, 0x37, 0x49, 0x74, 0xbb, 0x72, 0x48, 0xe7, 0x36, 0x5e, 0xf8, 0x58, 0xc7, - 0x45, 0x31, 0xa9, 0x67, 0xd5, 0x53, 0x36, 0x63, 0x69, 0x21, 0x86, 0x1f, 0x87, 0x9f, 0x15, 0xc0, - 0x89, 0x83, 0x16, 0x3d, 0xd4, 0x9c, 0xd7, 0xf7, 0xf5, 0x58, 0x32, 0x51, 0x3f, 0xce, 0x79, 0x56, - 0xb1, 0x52, 0x27, 0x1a, 0xfb, 0x4c, 0x80, 0xde, 0xe9, 0x70, 0x23, 0x07, 0xac, 0x2b, 0x4a, 0xf4, - 0xce, 0xb0, 0x86, 0xdd, 0xec, 0x73, 0x38, 0x7d, 0xbb, 0xba, 0x3c, 0x6f, 0xf8, 0x90, 0x34, 0xe6, - 0x50, 0xc4, 0x66, 0x1f, 0x4d, 0xdb, 0x6c, 0xad, 0xed, 0x76, 0x9c, 0xaf, 0x0f, 0xe0, 0x91, 0x09, - 0xc4, 0x92, 0xc4, 0x88, 0x6c, 0x2d, 0x80, 0x3b, 0x9b, 0xe1, 0x25, 0x8f, 0x93, 0x59, 0x5c, 0x89, - 0x93, 0x78, 0x9d, 0xf1, 0x38, 0x91, 0xf3, 0x3a, 0xdc, 0x0c, 0x6f, 0x98, 0x91, 0x0b, 0x51, 0x9b, - 0xe1, 0x14, 0xec, 0x66, 0x67, 0xf2, 0x37, 0x47, 0xf5, 0x59, 0x4e, 0x98, 0x9d, 0xc9, 0xf2, 0xc2, - 0x73, 0x9c, 0x77, 0xc2, 0x90, 0xfd, 0x06, 0x4d, 0x89, 0x64, 0x1a, 0x72, 0x0b, 0xd3, 0xf1, 0x12, - 0x90, 0xf7, 0x03, 0x84, 0xbd, 0x81, 0x44, 0xfd, 0xbd, 0xf9, 0x99, 0x29, 0xa1, 0xef, 0x2c, 0x7f, - 0x88, 0xe9, 0xba, 0xd0, 0xc8, 0xbd, 0xc8, 0x62, 0xbb, 0x27, 0x6d, 0xd3, 0xcc, 0xdd, 0xcb, 0x58, - 0x8c, 0x93, 0xe4, 0x88, 0x55, 0xc8, 0x07, 0xe5, 0xb5, 0x70, 0x64, 0xa5, 0x44, 0x9a, 0xd9, 0xa6, - 0x6c, 0xa0, 0xd7, 0xb2, 0x67, 0x49, 0x2a, 0xb4, 0xac, 0x39, 0x21, 0xfd, 0xb0, 0x6d, 0xa0, 0x4d, - 0x11, 0xb5, 0xa2, 0x69, 0x3b, 0x96, 0xd7, 0xcc, 0x94, 0xcf, 0xe7, 0x19, 0xd3, 0xd0, 0x29, 0x8b, - 0xd5, 0x95, 0x8d, 0x3b, 0x6d, 0x5b, 0x28, 0x48, 0x8c, 0xe5, 0x41, 0x05, 0x9b, 0x46, 0xd6, 0x98, - 0x7a, 0x25, 0xd5, 0x3c, 0xd8, 0xcd, 0xb6, 0x19, 0x0f, 0x20, 0xd2, 0x48, 0x14, 0xb4, 0xdf, 0xbd, - 0xd5, 0xe2, 0x7d, 0xd6, 0x3c, 0x09, 0x78, 0xd9, 0x94, 0x54, 0x76, 0xc4, 0xc4, 0x77, 0x6f, 0x08, - 0x66, 0xd7, 0x09, 0xc0, 0xc3, 0xd3, 0xf5, 0x41, 0x02, 0xd7, 0x09, 0x50, 0x5f, 0x32, 0xc4, 0x3a, - 0x81, 0x62, 0xfd, 0xa6, 0x33, 0xfb, 0x5e, 0x87, 0x71, 0x65, 0x2b, 0x87, 0x34, 0x1d, 0x0a, 0x86, - 0x9a, 0x8e, 0x52, 0xf0, 0x1f, 0xa9, 0xbb, 0xb5, 0x86, 0x3c, 0x52, 0x6c, 0x5f, 0x6d, 0xa3, 0x0b, - 0xb3, 0xb9, 0x7f, 0x2d, 0x3c, 0x65, 0x71, 0x62, 0x2a, 0x86, 0xe8, 0xba, 0x72, 0x22, 0xf7, 0xc7, - 0x38, 0xed, 0xe4, 0x77, 0xa2, 0xa1, 0xaa, 0x46, 0xe9, 0xba, 0xb9, 0x85, 0x15, 0xb1, 0x26, 0x88, - 0x81, 0xca, 0x27, 0x9c, 0xc4, 0xcd, 0x6b, 0xa2, 0x29, 0xd7, 0x0e, 0xf4, 0x77, 0x99, 0x15, 0x48, - 0xdc, 0xfc, 0xc7, 0xde, 0xa2, 0x89, 0xc4, 0xad, 0x5b, 0xcb, 0x8e, 0xf3, 0x66, 0x7d, 0x2e, 0x8f, - 0x80, 0xe1, 0xbf, 0x7d, 0xa1, 0x84, 0xc4, 0x38, 0xdf, 0x82, 0x94, 0xed, 0xa7, 0xef, 0xff, 0xc7, - 0x57, 0x37, 0x06, 0x3f, 0xfb, 0xea, 0xc6, 0xe0, 0xbf, 0xbe, 0xba, 0x31, 0xf8, 0xe9, 0xd7, 0x37, - 0xde, 0xf8, 0xd9, 0xd7, 0x37, 0xde, 0xf8, 0xcf, 0xaf, 0x6f, 0xbc, 0xf1, 0xe5, 0x9b, 0xfa, 0xb7, - 0xbd, 0xcf, 0xff, 0x9f, 0xfc, 0x85, 0xee, 0x27, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x49, 0x2e, - 0xb9, 0x13, 0xff, 0x7b, 0x00, 0x00, + // 5583 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x9d, 0x5b, 0x8f, 0x1c, 0x49, + 0x56, 0xf8, 0xa7, 0x5e, 0xfe, 0xf3, 0x27, 0x97, 0x1d, 0xa0, 0x06, 0x86, 0xd9, 0x61, 0xd7, 0xf6, + 0x78, 0xec, 0x6e, 0xdb, 0xed, 0xae, 0xf6, 0xd8, 0x73, 0x63, 0x17, 0x09, 0xca, 0xdd, 0x76, 0x4f, + 0xef, 0x76, 0xf7, 0x34, 0x5d, 0xd5, 0xb6, 0x18, 0x09, 0x89, 0xec, 0xca, 0xe8, 0xea, 0xa4, 0xb3, + 0x32, 0x72, 0x33, 0xa3, 0xca, 0xae, 0x45, 0x20, 0x10, 0x08, 0x04, 0x02, 0xb1, 0xe2, 0x26, 0x78, + 0x42, 0xe2, 0x13, 0xf0, 0x31, 0x78, 0x41, 0xda, 0x47, 0x1e, 0xd1, 0xcc, 0x87, 0xe0, 0x15, 0x65, + 0x44, 0x64, 0x5c, 0x4e, 0x9e, 0x13, 0x99, 0x3d, 0x3c, 0xd9, 0xea, 0xf3, 0x3b, 0xe7, 0xc4, 0xe5, + 0x44, 0xc4, 0x89, 0xc8, 0xc8, 0xac, 0xe8, 0x66, 0x71, 0xbe, 0x53, 0x94, 0x5c, 0xf0, 0x6a, 0xa7, + 0x62, 0xe5, 0x2a, 0x9d, 0xb1, 0xe6, 0xdf, 0x91, 0xfc, 0xf3, 0xf0, 0xcd, 0x38, 0x5f, 0x8b, 0x75, + 0xc1, 0xde, 0x7b, 0xd7, 0x92, 0x33, 0xbe, 0x58, 0xc4, 0x79, 0x52, 0x29, 0xe4, 0xbd, 0x77, 0xac, + 0x84, 0xad, 0x58, 0x2e, 0xf4, 0xdf, 0x1f, 0xff, 0xe7, 0xff, 0x0c, 0xa2, 0xb7, 0x76, 0xb3, 0x94, + 0xe5, 0x62, 0x57, 0x6b, 0x0c, 0xbf, 0x8c, 0xbe, 0x3d, 0x2e, 0x8a, 0x7d, 0x26, 0x5e, 0xb0, 0xb2, + 0x4a, 0x79, 0x3e, 0xfc, 0x60, 0xa4, 0x1d, 0x8c, 0x4e, 0x8b, 0xd9, 0x68, 0x5c, 0x14, 0x23, 0x2b, + 0x1c, 0x9d, 0xb2, 0x1f, 0x2f, 0x59, 0x25, 0xde, 0xbb, 0x13, 0x86, 0xaa, 0x82, 0xe7, 0x15, 0x1b, + 0x5e, 0x44, 0xbf, 0x34, 0x2e, 0x8a, 0x09, 0x13, 0x7b, 0xac, 0xae, 0xc0, 0x44, 0xc4, 0x82, 0x0d, + 0x37, 0x5b, 0xaa, 0x3e, 0x60, 0x7c, 0xdc, 0xeb, 0x06, 0xb5, 0x9f, 0x69, 0xf4, 0xad, 0xda, 0xcf, + 0xe5, 0x52, 0x24, 0xfc, 0x55, 0x3e, 0x7c, 0xbf, 0xad, 0xa8, 0x45, 0xc6, 0xf6, 0xed, 0x10, 0xa2, + 0xad, 0xbe, 0x8c, 0x7e, 0xfe, 0x65, 0x9c, 0x65, 0x4c, 0xec, 0x96, 0xac, 0x2e, 0xb8, 0xaf, 0xa3, + 0x44, 0x23, 0x25, 0x33, 0x76, 0x3f, 0x08, 0x32, 0xda, 0xf0, 0x97, 0xd1, 0xb7, 0x95, 0xe4, 0x94, + 0xcd, 0xf8, 0x8a, 0x95, 0x43, 0x54, 0x4b, 0x0b, 0x89, 0x26, 0x6f, 0x41, 0xd0, 0xf6, 0x2e, 0xcf, + 0x57, 0xac, 0x14, 0xb8, 0x6d, 0x2d, 0x0c, 0xdb, 0xb6, 0x90, 0xb6, 0xfd, 0x97, 0x83, 0xe8, 0xbb, + 0xe3, 0xd9, 0x8c, 0x2f, 0x73, 0x71, 0xc8, 0x67, 0x71, 0x76, 0x98, 0xe6, 0x57, 0xc7, 0xec, 0xd5, + 0xee, 0x65, 0xcd, 0xe7, 0x73, 0x36, 0x7c, 0xe2, 0xb7, 0xaa, 0x42, 0x47, 0x86, 0x1d, 0xb9, 0xb0, + 0xf1, 0xfd, 0xd1, 0xf5, 0x94, 0x74, 0x59, 0xfe, 0x76, 0x10, 0xdd, 0x80, 0x65, 0x99, 0xf0, 0x6c, + 0xc5, 0x6c, 0x69, 0x3e, 0xee, 0x30, 0xec, 0xe3, 0xa6, 0x3c, 0x9f, 0x5c, 0x57, 0x4d, 0x97, 0x28, + 0x8b, 0xde, 0x76, 0xc3, 0x65, 0xc2, 0x2a, 0x39, 0x9c, 0xee, 0xd3, 0x11, 0xa1, 0x11, 0xe3, 0xf9, + 0x41, 0x1f, 0x54, 0x7b, 0x4b, 0xa3, 0xa1, 0xf6, 0x96, 0xf1, 0xca, 0x38, 0xbb, 0x87, 0x5a, 0x70, + 0x08, 0xe3, 0xeb, 0x7e, 0x0f, 0x52, 0xbb, 0xfa, 0xbd, 0xe8, 0x17, 0x5e, 0xf2, 0xf2, 0xaa, 0x2a, + 0xe2, 0x19, 0xd3, 0x43, 0xe1, 0xae, 0xaf, 0xdd, 0x48, 0xe1, 0x68, 0xd8, 0xe8, 0xc2, 0x9c, 0xa0, + 0x6d, 0x84, 0x5f, 0x14, 0x0c, 0xce, 0x41, 0x56, 0xb1, 0x16, 0x52, 0x41, 0x0b, 0x21, 0x6d, 0xfb, + 0x2a, 0x1a, 0x5a, 0xdb, 0xe7, 0xbf, 0xcf, 0x66, 0x62, 0x9c, 0x24, 0xb0, 0x57, 0xac, 0xae, 0x24, + 0x46, 0xe3, 0x24, 0xa1, 0x7a, 0x05, 0x47, 0xb5, 0xb3, 0x57, 0xd1, 0x3b, 0xc0, 0xd9, 0x61, 0x5a, + 0x49, 0x87, 0xdb, 0x61, 0x2b, 0x1a, 0x33, 0x4e, 0x47, 0x7d, 0x71, 0xed, 0xf8, 0x8f, 0x07, 0xd1, + 0x77, 0x10, 0xcf, 0xa7, 0x6c, 0xc1, 0x57, 0x6c, 0xf8, 0xa8, 0xdb, 0x9a, 0x22, 0x8d, 0xff, 0x0f, + 0xaf, 0xa1, 0x81, 0x84, 0xc9, 0x84, 0x65, 0x6c, 0x26, 0xc8, 0x30, 0x51, 0xe2, 0xce, 0x30, 0x31, + 0x98, 0x33, 0xc2, 0x1a, 0xe1, 0x3e, 0x13, 0xbb, 0xcb, 0xb2, 0x64, 0xb9, 0x20, 0xfb, 0xd2, 0x22, + 0x9d, 0x7d, 0xe9, 0xa1, 0x48, 0x7d, 0xf6, 0x99, 0x18, 0x67, 0x19, 0x59, 0x1f, 0x25, 0xee, 0xac, + 0x8f, 0xc1, 0xb4, 0x87, 0x59, 0xf4, 0x8b, 0x4e, 0x8b, 0x89, 0x83, 0xfc, 0x82, 0x0f, 0xe9, 0xb6, + 0x90, 0x72, 0xe3, 0x63, 0xb3, 0x93, 0x43, 0xaa, 0xf1, 0xec, 0x75, 0xc1, 0x4b, 0xba, 0x5b, 0x94, + 0xb8, 0xb3, 0x1a, 0x06, 0xd3, 0x1e, 0x7e, 0x37, 0x7a, 0x4b, 0xcf, 0x92, 0xcd, 0x7a, 0x76, 0x07, + 0x9d, 0x42, 0xe1, 0x82, 0x76, 0xb7, 0x83, 0x6a, 0x99, 0x3f, 0x4a, 0xe7, 0x65, 0x3d, 0xfb, 0xe0, + 0xe6, 0xb5, 0xb4, 0xc3, 0xbc, 0xa5, 0xb4, 0x79, 0x1e, 0xfd, 0xb2, 0x6f, 0x7e, 0x37, 0xce, 0x67, + 0x2c, 0x1b, 0x3e, 0x08, 0xa9, 0x2b, 0xc6, 0xb8, 0xda, 0xea, 0xc5, 0xda, 0xc9, 0x4e, 0x13, 0x7a, + 0x32, 0xfd, 0x00, 0xd5, 0x06, 0x53, 0xe9, 0x9d, 0x30, 0xd4, 0xb2, 0xbd, 0xc7, 0x32, 0x46, 0xda, + 0x56, 0xc2, 0x0e, 0xdb, 0x06, 0xd2, 0xb6, 0xcb, 0xe8, 0x57, 0x4c, 0x37, 0xd7, 0x79, 0x81, 0x94, + 0xd7, 0x8b, 0xce, 0x16, 0xd1, 0x8f, 0x2e, 0x64, 0x7c, 0x3d, 0xec, 0x07, 0xb7, 0xea, 0xa3, 0x67, + 0x14, 0xbc, 0x3e, 0x60, 0x3e, 0xb9, 0x13, 0x86, 0xb4, 0xed, 0xbf, 0x1a, 0x44, 0xdf, 0xd3, 0xb2, + 0x67, 0x79, 0x7c, 0x9e, 0x31, 0xb9, 0xc4, 0x1f, 0x33, 0xf1, 0x8a, 0x97, 0x57, 0x93, 0x75, 0x3e, + 0x23, 0xd2, 0x19, 0x1c, 0xee, 0x48, 0x67, 0x48, 0x25, 0x5d, 0x98, 0x3f, 0x88, 0xde, 0x6d, 0x82, + 0xe2, 0x32, 0xce, 0xe7, 0xec, 0x87, 0x15, 0xcf, 0xc7, 0x45, 0x3a, 0x4e, 0x92, 0x72, 0x38, 0xc2, + 0xbb, 0x1e, 0x72, 0xa6, 0x04, 0x3b, 0xbd, 0x79, 0x27, 0x7d, 0xd6, 0xad, 0x2c, 0x78, 0x01, 0xd3, + 0xe7, 0xa6, 0xf9, 0x04, 0x2f, 0xa8, 0xf4, 0xd9, 0x47, 0x5a, 0x56, 0x8f, 0xea, 0x35, 0x08, 0xb7, + 0x7a, 0xe4, 0x2e, 0x3a, 0xb7, 0x43, 0x88, 0x5d, 0x03, 0x9a, 0x86, 0xe2, 0xf9, 0x45, 0x3a, 0x3f, + 0x2b, 0x92, 0x7a, 0x0c, 0xdd, 0xc7, 0xeb, 0xec, 0x20, 0xc4, 0x1a, 0x40, 0xa0, 0xda, 0xdb, 0xdf, + 0xd8, 0x2c, 0x53, 0xcf, 0x4b, 0xcf, 0x4b, 0xbe, 0x38, 0x64, 0xf3, 0x78, 0xb6, 0xd6, 0x93, 0xe9, + 0x47, 0xa1, 0x59, 0x0c, 0xd2, 0xa6, 0x10, 0x1f, 0x5f, 0x53, 0x4b, 0x97, 0xe7, 0x5f, 0x07, 0xd1, + 0x1d, 0x2f, 0x4e, 0x74, 0x30, 0xa9, 0xd2, 0x8f, 0xf3, 0xe4, 0x94, 0x55, 0x22, 0x2e, 0xc5, 0xf0, + 0xfb, 0x81, 0x18, 0x20, 0x74, 0x4c, 0xd9, 0x7e, 0xf0, 0x8d, 0x74, 0x6d, 0xaf, 0x4f, 0xea, 0x55, + 0x42, 0xcf, 0x3f, 0x7e, 0xaf, 0x4b, 0x09, 0x9c, 0x7d, 0x6e, 0x87, 0x10, 0xdb, 0xeb, 0x52, 0x70, + 0x90, 0xaf, 0x52, 0xc1, 0xf6, 0x59, 0xce, 0xca, 0x76, 0xaf, 0x2b, 0x55, 0x1f, 0x21, 0x7a, 0x9d, + 0x40, 0xed, 0x4c, 0xe7, 0x79, 0x33, 0x99, 0xc6, 0x56, 0xc0, 0x48, 0x2b, 0xd7, 0x78, 0xd8, 0x0f, + 0xb6, 0x5b, 0x65, 0xc7, 0xe7, 0x29, 0x5b, 0xf1, 0x2b, 0xb8, 0x55, 0x76, 0x4d, 0x28, 0x80, 0xd8, + 0x2a, 0xa3, 0xa0, 0x4d, 0x07, 0x1c, 0x3f, 0x2f, 0x52, 0xf6, 0x0a, 0xa4, 0x03, 0xae, 0x72, 0x2d, + 0x26, 0xd2, 0x01, 0x04, 0xd3, 0x1e, 0x8e, 0xa3, 0x9f, 0x93, 0xc2, 0x1f, 0xf2, 0x34, 0x1f, 0xde, + 0x44, 0x94, 0x6a, 0x81, 0xb1, 0x7a, 0x8b, 0x06, 0x40, 0x89, 0xeb, 0xbf, 0xea, 0xb5, 0xf9, 0x2e, + 0xa1, 0x04, 0x96, 0xe5, 0x8d, 0x2e, 0xcc, 0xe6, 0x61, 0x52, 0x58, 0xcf, 0x5f, 0x93, 0xcb, 0xb8, + 0x4c, 0xf3, 0xf9, 0x10, 0xd3, 0x75, 0xe4, 0x44, 0x1e, 0x86, 0x71, 0x20, 0x84, 0xb5, 0xe2, 0xb8, + 0x28, 0xca, 0x7a, 0x5a, 0xc4, 0x42, 0xd8, 0x47, 0x82, 0x21, 0xdc, 0x42, 0x71, 0x6f, 0x7b, 0x6c, + 0x96, 0xa5, 0x79, 0xd0, 0x9b, 0x46, 0xfa, 0x78, 0xb3, 0x28, 0x08, 0xde, 0x43, 0x16, 0xaf, 0x58, + 0x53, 0x33, 0xac, 0x65, 0x5c, 0x20, 0x18, 0xbc, 0x00, 0xb4, 0x9b, 0x5e, 0x29, 0x3e, 0x8a, 0xaf, + 0x58, 0xdd, 0xc0, 0xac, 0x5e, 0x54, 0x87, 0x98, 0xbe, 0x47, 0x10, 0x9b, 0x5e, 0x9c, 0xd4, 0xae, + 0x96, 0xd1, 0x3b, 0x52, 0x7e, 0x12, 0x97, 0x22, 0x9d, 0xa5, 0x45, 0x9c, 0x37, 0x9b, 0x29, 0x6c, + 0x5c, 0xb7, 0x28, 0xe3, 0x72, 0xbb, 0x27, 0xad, 0xdd, 0xfe, 0xd3, 0x20, 0x7a, 0x1f, 0xfa, 0x3d, + 0x61, 0xe5, 0x22, 0x95, 0x7b, 0xf2, 0x4a, 0x4d, 0xc2, 0xc3, 0x4f, 0xc3, 0x46, 0x5b, 0x0a, 0xa6, + 0x34, 0x9f, 0x5d, 0x5f, 0xd1, 0x66, 0x62, 0x13, 0xbd, 0x4f, 0xf9, 0xa2, 0x4c, 0x5a, 0x67, 0x56, + 0x93, 0x66, 0xf3, 0x21, 0x85, 0x44, 0x26, 0xd6, 0x82, 0xc0, 0x08, 0x3f, 0xcb, 0xab, 0xc6, 0x3a, + 0x36, 0xc2, 0xad, 0x38, 0x38, 0xc2, 0x3d, 0xcc, 0x8e, 0xf0, 0x93, 0xe5, 0x79, 0x96, 0x56, 0x97, + 0x69, 0x3e, 0xd7, 0x69, 0xb7, 0xaf, 0x6b, 0xc5, 0x30, 0xf3, 0xde, 0xec, 0xe4, 0x30, 0x27, 0x3a, + 0x58, 0x48, 0x27, 0x20, 0x4c, 0x36, 0x3b, 0x39, 0xbb, 0x1b, 0xb2, 0xd2, 0x7a, 0x1b, 0x0e, 0x76, + 0x43, 0x8e, 0x6a, 0x2d, 0x25, 0x76, 0x43, 0x6d, 0xca, 0xee, 0x86, 0xdc, 0x3a, 0x54, 0x3c, 0x5b, + 0xb1, 0xb3, 0x32, 0x05, 0xbb, 0x21, 0xaf, 0x7c, 0x0d, 0x43, 0xec, 0x86, 0x28, 0xd6, 0x4e, 0x54, + 0x96, 0xd8, 0x67, 0x62, 0x22, 0x62, 0xb1, 0xac, 0xc0, 0x44, 0xe5, 0xd8, 0x30, 0x08, 0x31, 0x51, + 0x11, 0xa8, 0xf6, 0xf6, 0xdb, 0x51, 0xa4, 0x4e, 0x30, 0xe4, 0x29, 0x93, 0xbf, 0xf6, 0xe8, 0xa3, + 0x0d, 0xef, 0x88, 0xe9, 0xfd, 0x00, 0x61, 0x13, 0x1e, 0xf5, 0x77, 0x79, 0x78, 0x36, 0x44, 0x35, + 0xa4, 0x88, 0x48, 0x78, 0x00, 0x02, 0x0b, 0x3a, 0xb9, 0xe4, 0xaf, 0xf0, 0x82, 0xd6, 0x92, 0x70, + 0x41, 0x35, 0x61, 0x8f, 0xb3, 0x75, 0x41, 0xb1, 0xe3, 0xec, 0xa6, 0x18, 0xa1, 0xe3, 0x6c, 0xc8, + 0xd8, 0x98, 0x71, 0x0d, 0x3f, 0xe5, 0xfc, 0x6a, 0x11, 0x97, 0x57, 0x20, 0x66, 0x3c, 0xe5, 0x86, + 0x21, 0x62, 0x86, 0x62, 0x6d, 0xcc, 0xb8, 0x0e, 0xeb, 0x74, 0xf9, 0xac, 0xcc, 0x40, 0xcc, 0x78, + 0x36, 0x34, 0x42, 0xc4, 0x0c, 0x81, 0xda, 0xd9, 0xc9, 0xf5, 0x36, 0x61, 0xf0, 0x00, 0xc5, 0x53, + 0x9f, 0x30, 0xea, 0x00, 0x05, 0xc1, 0x60, 0x08, 0xed, 0x97, 0x71, 0x71, 0x89, 0x87, 0x90, 0x14, + 0x85, 0x43, 0xa8, 0x41, 0x60, 0x7f, 0x4f, 0x58, 0x5c, 0xce, 0x2e, 0xf1, 0xfe, 0x56, 0xb2, 0x70, + 0x7f, 0x1b, 0x06, 0xf6, 0xb7, 0x12, 0xbc, 0x4c, 0xc5, 0xe5, 0x11, 0x13, 0x31, 0xde, 0xdf, 0x3e, + 0x13, 0xee, 0xef, 0x16, 0x6b, 0xf3, 0x71, 0xd7, 0xe1, 0x64, 0x79, 0x5e, 0xcd, 0xca, 0xf4, 0x9c, + 0x0d, 0x03, 0x56, 0x0c, 0x44, 0xe4, 0xe3, 0x24, 0xac, 0x7d, 0xfe, 0x74, 0x10, 0xdd, 0x6c, 0xba, + 0x9d, 0x57, 0x95, 0x5e, 0xfb, 0x7c, 0xf7, 0x1f, 0xe3, 0xfd, 0x4b, 0xe0, 0xc4, 0x03, 0x86, 0x1e, + 0x6a, 0x4e, 0x6e, 0x80, 0x17, 0xe9, 0x2c, 0xaf, 0x4c, 0xa1, 0x3e, 0xed, 0x63, 0xdd, 0x51, 0x20, + 0x72, 0x83, 0x5e, 0x8a, 0x36, 0x2d, 0xd3, 0xfd, 0xd3, 0xc8, 0x0e, 0x92, 0x0a, 0xa4, 0x65, 0x4d, + 0x7b, 0x3b, 0x04, 0x91, 0x96, 0xe1, 0x24, 0x0c, 0x85, 0xfd, 0x92, 0x2f, 0x8b, 0xaa, 0x23, 0x14, + 0x00, 0x14, 0x0e, 0x85, 0x36, 0xac, 0x7d, 0xbe, 0x8e, 0x7e, 0xd5, 0x0d, 0x3f, 0xb7, 0xb1, 0xb7, + 0xe9, 0x98, 0xc2, 0x9a, 0x78, 0xd4, 0x17, 0xb7, 0x19, 0x45, 0xe3, 0x59, 0xec, 0x31, 0x11, 0xa7, + 0x59, 0x35, 0xdc, 0xc0, 0x6d, 0x34, 0x72, 0x22, 0xa3, 0xc0, 0x38, 0x38, 0xbf, 0xed, 0x2d, 0x8b, + 0x2c, 0x9d, 0xb5, 0x1f, 0xef, 0x68, 0x5d, 0x23, 0x0e, 0xcf, 0x6f, 0x2e, 0x06, 0xe7, 0xeb, 0x3a, + 0xf5, 0x93, 0xff, 0x99, 0xae, 0x0b, 0x86, 0xcf, 0xd7, 0x1e, 0x12, 0x9e, 0xaf, 0x21, 0x0a, 0xeb, + 0x33, 0x61, 0xe2, 0x30, 0x5e, 0xf3, 0x25, 0x31, 0x5f, 0x1b, 0x71, 0xb8, 0x3e, 0x2e, 0x66, 0xf7, + 0x06, 0xc6, 0xc3, 0x41, 0x2e, 0x58, 0x99, 0xc7, 0xd9, 0xf3, 0x2c, 0x9e, 0x57, 0x43, 0x62, 0x8e, + 0xf1, 0x29, 0x62, 0x6f, 0x40, 0xd3, 0x48, 0x33, 0x1e, 0x54, 0xcf, 0xe3, 0x15, 0x2f, 0x53, 0x41, + 0x37, 0xa3, 0x45, 0x3a, 0x9b, 0xd1, 0x43, 0x51, 0x6f, 0xe3, 0x72, 0x76, 0x99, 0xae, 0x58, 0x12, + 0xf0, 0xd6, 0x20, 0x3d, 0xbc, 0x39, 0x28, 0xd2, 0x69, 0x13, 0xbe, 0x2c, 0x67, 0x8c, 0xec, 0x34, + 0x25, 0xee, 0xec, 0x34, 0x83, 0x69, 0x0f, 0x7f, 0x36, 0x88, 0x7e, 0x4d, 0x49, 0xdd, 0x67, 0x2e, + 0x7b, 0x71, 0x75, 0x79, 0xce, 0xe3, 0x32, 0x19, 0x7e, 0x88, 0xd9, 0x41, 0x51, 0xe3, 0xfa, 0xf1, + 0x75, 0x54, 0x60, 0xb3, 0xd6, 0x79, 0xb7, 0x1d, 0x71, 0x68, 0xb3, 0x7a, 0x48, 0xb8, 0x59, 0x21, + 0x0a, 0x27, 0x10, 0x29, 0x57, 0x47, 0x72, 0x1b, 0xa4, 0xbe, 0x7f, 0x2e, 0xb7, 0xd9, 0xc9, 0xc1, + 0xf9, 0xb1, 0x16, 0xfa, 0xd1, 0xb2, 0x4d, 0xd9, 0xc0, 0x23, 0x66, 0xd4, 0x17, 0x27, 0x3d, 0x9b, + 0x51, 0x11, 0xf6, 0xdc, 0x1a, 0x19, 0xa3, 0xbe, 0x38, 0xe1, 0xd9, 0x99, 0xd6, 0x42, 0x9e, 0x91, + 0xa9, 0x6d, 0xd4, 0x17, 0x87, 0xd9, 0x97, 0x66, 0x9a, 0x75, 0xe1, 0x41, 0xc0, 0x0e, 0x5c, 0x1b, + 0xb6, 0x7a, 0xb1, 0xda, 0xe1, 0x5f, 0x0c, 0xa2, 0xef, 0x5a, 0x8f, 0x47, 0x3c, 0x49, 0x2f, 0xd6, + 0x0a, 0x7a, 0x11, 0x67, 0x4b, 0x56, 0x0d, 0x1f, 0x53, 0xd6, 0xda, 0xac, 0x29, 0xc1, 0x93, 0x6b, + 0xe9, 0xc0, 0xb1, 0x33, 0x2e, 0x8a, 0x6c, 0x3d, 0x65, 0x8b, 0x22, 0x23, 0xc7, 0x8e, 0x87, 0x84, + 0xc7, 0x0e, 0x44, 0x61, 0x56, 0x3e, 0xe5, 0x75, 0xce, 0x8f, 0x66, 0xe5, 0x52, 0x14, 0xce, 0xca, + 0x1b, 0x04, 0xe6, 0x4a, 0x53, 0xbe, 0xcb, 0xb3, 0x8c, 0xcd, 0x44, 0xfb, 0xde, 0x86, 0xd1, 0xb4, + 0x44, 0x38, 0x57, 0x02, 0xa4, 0x3d, 0x95, 0x6b, 0xf6, 0x90, 0x71, 0xc9, 0x9e, 0xae, 0x0f, 0xd3, + 0xfc, 0x6a, 0x88, 0xa7, 0x05, 0x16, 0x20, 0x4e, 0xe5, 0x50, 0x10, 0xee, 0x55, 0xcf, 0xf2, 0x84, + 0xe3, 0x7b, 0xd5, 0x5a, 0x12, 0xde, 0xab, 0x6a, 0x02, 0x9a, 0x3c, 0x65, 0x94, 0xc9, 0x5a, 0x12, + 0x36, 0xa9, 0x09, 0x6c, 0x2a, 0xd4, 0xcf, 0x6e, 0xc8, 0xa9, 0x10, 0x3c, 0xad, 0xd9, 0xec, 0xe4, + 0xe0, 0x9e, 0x4b, 0x3b, 0x40, 0x23, 0x02, 0x18, 0xff, 0x20, 0xc8, 0xc0, 0xd0, 0x6f, 0x76, 0xc3, + 0xcf, 0x99, 0x98, 0x5d, 0xe2, 0xa1, 0xef, 0x21, 0xe1, 0xd0, 0x87, 0x28, 0x6c, 0xab, 0x29, 0x37, + 0xbb, 0xf9, 0x0d, 0x3c, 0xf0, 0x5a, 0x3b, 0xf9, 0xcd, 0x4e, 0x0e, 0xb6, 0xd5, 0xc1, 0x82, 0x6e, + 0x2b, 0x25, 0x0b, 0xb7, 0x95, 0x61, 0x60, 0xe9, 0x95, 0x40, 0x1e, 0x92, 0x6d, 0xd0, 0x8a, 0xde, + 0x31, 0xd9, 0x66, 0x27, 0xa7, 0x9d, 0xfc, 0x83, 0xd9, 0x1f, 0x2a, 0xe9, 0x31, 0xaf, 0x07, 0xdf, + 0x8b, 0x38, 0x4b, 0x93, 0x58, 0xb0, 0x29, 0xbf, 0x62, 0x39, 0xbe, 0x15, 0xd3, 0xa5, 0x55, 0xfc, + 0xc8, 0x53, 0x08, 0x6f, 0xc5, 0xc2, 0x8a, 0x30, 0x4e, 0x14, 0x7d, 0x56, 0xb1, 0xdd, 0xb8, 0x22, + 0xa6, 0x48, 0x0f, 0x09, 0xc7, 0x09, 0x44, 0x61, 0x22, 0xac, 0xe4, 0xcf, 0x5e, 0x17, 0xac, 0x4c, + 0x59, 0x3e, 0x63, 0x78, 0x22, 0x0c, 0xa9, 0x70, 0x22, 0x8c, 0xd0, 0x70, 0x13, 0xb8, 0x17, 0x0b, + 0xf6, 0x74, 0x3d, 0x4d, 0x17, 0xac, 0x12, 0xf1, 0xa2, 0xc0, 0x37, 0x81, 0x00, 0x0a, 0x6f, 0x02, + 0xdb, 0x70, 0xeb, 0xcc, 0xc9, 0xcc, 0xb4, 0xed, 0x7b, 0x64, 0x90, 0x08, 0xdc, 0x23, 0x23, 0x50, + 0xd8, 0xb0, 0x16, 0x40, 0x9f, 0x3e, 0xb4, 0xac, 0x04, 0x9f, 0x3e, 0xd0, 0x74, 0xeb, 0x24, 0xcf, + 0x30, 0x93, 0x7a, 0x68, 0x76, 0x14, 0x7d, 0xe2, 0x0e, 0xd1, 0xad, 0x5e, 0x2c, 0x7e, 0x74, 0x78, + 0xca, 0xb2, 0x58, 0xae, 0x87, 0x81, 0xf3, 0xb9, 0x86, 0xe9, 0x73, 0x74, 0xe8, 0xb0, 0xda, 0xe1, + 0x9f, 0x0c, 0xa2, 0xf7, 0x30, 0x8f, 0x5f, 0x14, 0xd2, 0xef, 0xa3, 0x6e, 0x5b, 0x8a, 0x24, 0x2e, + 0xca, 0x85, 0x35, 0xec, 0x5d, 0x8f, 0x46, 0x64, 0xef, 0xd1, 0xe9, 0x02, 0xf8, 0xd9, 0xa0, 0x29, + 0x3f, 0xe4, 0x88, 0xbb, 0x1e, 0x21, 0xde, 0x6e, 0xb4, 0xfc, 0x72, 0x55, 0x60, 0xa3, 0x65, 0x6c, + 0x68, 0x31, 0xb1, 0xd1, 0x42, 0x30, 0x3b, 0x3a, 0xdd, 0xea, 0xbd, 0x4c, 0xc5, 0xa5, 0x4c, 0xe4, + 0xc0, 0xe8, 0xf4, 0xca, 0x6a, 0x20, 0x62, 0x74, 0x92, 0x30, 0x4c, 0x75, 0x1a, 0xb0, 0x1e, 0x9b, + 0xd8, 0x5c, 0x6e, 0x0c, 0xb9, 0x23, 0xf3, 0x5e, 0x37, 0x08, 0xe3, 0xb5, 0x11, 0xeb, 0x3d, 0xd5, + 0x83, 0x90, 0x05, 0xb0, 0xaf, 0xda, 0xea, 0xc5, 0x6a, 0x87, 0x7f, 0x14, 0x7d, 0xa7, 0x55, 0xb1, + 0xe7, 0x2c, 0x16, 0xcb, 0x92, 0x25, 0xc3, 0x9d, 0x8e, 0x72, 0x37, 0xa0, 0x71, 0xfd, 0xa8, 0xbf, + 0x42, 0x2b, 0xf9, 0x6f, 0x38, 0x15, 0x56, 0xa6, 0x0c, 0x8f, 0x43, 0x26, 0x7d, 0x36, 0x98, 0xfc, + 0xd3, 0x3a, 0xad, 0xfd, 0xbb, 0x1b, 0x5d, 0xe3, 0x55, 0x9c, 0x66, 0xf2, 0x29, 0xf0, 0x87, 0x21, + 0xa3, 0x1e, 0x1a, 0xdc, 0xbf, 0x93, 0x2a, 0xad, 0x99, 0x59, 0x8e, 0x71, 0x67, 0xdf, 0xf7, 0x90, + 0x9e, 0x09, 0x90, 0x6d, 0xdf, 0x76, 0x4f, 0x5a, 0xbb, 0x15, 0xcd, 0x92, 0x57, 0xff, 0xd9, 0x0d, + 0x72, 0xcc, 0xab, 0x56, 0x45, 0x22, 0x7d, 0xbb, 0x27, 0xad, 0xbd, 0xfe, 0x61, 0xf4, 0x6e, 0xdb, + 0xab, 0x5e, 0x88, 0x76, 0x3a, 0x4d, 0x81, 0xb5, 0xe8, 0x51, 0x7f, 0x05, 0xed, 0xfe, 0x9f, 0xcd, + 0x81, 0xb7, 0xf2, 0x3f, 0xe3, 0x8b, 0x05, 0xcb, 0x13, 0x96, 0x34, 0x1a, 0x55, 0xbd, 0x31, 0xfb, + 0x8c, 0xb6, 0x6b, 0x14, 0x46, 0xae, 0x86, 0x29, 0xd1, 0xaf, 0x7f, 0x03, 0x4d, 0x5d, 0xb4, 0x7f, + 0x1f, 0x44, 0xf7, 0xd1, 0xa2, 0x35, 0x81, 0xeb, 0x15, 0xf1, 0xb7, 0xfa, 0x38, 0xc2, 0x34, 0x4d, + 0x51, 0xc7, 0xff, 0x07, 0x0b, 0xba, 0xc8, 0xff, 0x32, 0x88, 0x6e, 0x5b, 0xc5, 0x3a, 0xbc, 0x77, + 0x79, 0x7e, 0x91, 0xa5, 0x33, 0x21, 0x1f, 0xf5, 0x6a, 0x15, 0xba, 0x39, 0x29, 0x8d, 0xee, 0xe6, + 0x0c, 0x68, 0xda, 0x5d, 0xf1, 0xe7, 0x69, 0x25, 0x78, 0xb9, 0x9e, 0x5c, 0xf2, 0x57, 0xcd, 0x9b, + 0x48, 0xfe, 0xbc, 0xac, 0x81, 0x91, 0x43, 0x10, 0xbb, 0x62, 0x9c, 0x6c, 0xb9, 0xb2, 0x6f, 0x2c, + 0x55, 0x84, 0x2b, 0x87, 0xe8, 0x70, 0xe5, 0x93, 0x76, 0x55, 0x6a, 0x6a, 0x65, 0x5f, 0xaf, 0xda, + 0xc4, 0x8b, 0xda, 0x7e, 0xc5, 0xea, 0x5e, 0x37, 0x68, 0x73, 0x53, 0x2d, 0xde, 0x4b, 0x2f, 0x2e, + 0x4c, 0x9d, 0xf0, 0x92, 0xba, 0x08, 0x91, 0x9b, 0x12, 0xa8, 0xdd, 0x5e, 0x3d, 0x4f, 0x33, 0x26, + 0x1f, 0x0a, 0x7d, 0x71, 0x71, 0x91, 0xf1, 0x38, 0x01, 0xdb, 0xab, 0x5a, 0x3c, 0x72, 0xe5, 0xc4, + 0xf6, 0x0a, 0xe3, 0xec, 0x75, 0x93, 0x5a, 0x5a, 0x47, 0x77, 0x3e, 0x4b, 0x33, 0x78, 0x91, 0x59, + 0x6a, 0x1a, 0x21, 0x71, 0xdd, 0xa4, 0x05, 0xd9, 0x14, 0xa8, 0x16, 0xd5, 0x51, 0xd9, 0x94, 0xff, + 0x6e, 0x5b, 0xd1, 0x11, 0x13, 0x29, 0x10, 0x82, 0xd9, 0xe3, 0x8b, 0x5a, 0x78, 0x56, 0x48, 0xe3, + 0xb7, 0xda, 0x5a, 0x4a, 0x42, 0x1c, 0x5f, 0xf8, 0x84, 0xdd, 0x2d, 0xd7, 0x7f, 0xdf, 0xe3, 0xaf, + 0x72, 0x69, 0xf4, 0x76, 0x5b, 0xa5, 0x91, 0x11, 0xbb, 0x65, 0xc8, 0x68, 0xc3, 0x3f, 0x8a, 0xfe, + 0xbf, 0x34, 0x5c, 0xf2, 0x62, 0x78, 0x03, 0x51, 0x28, 0x9d, 0x6b, 0xbf, 0x37, 0x49, 0xb9, 0xbd, + 0x9d, 0x62, 0x62, 0xe3, 0xac, 0x8a, 0xe7, 0xf0, 0xae, 0xbe, 0xed, 0x71, 0x29, 0x25, 0x6e, 0xa7, + 0xb4, 0x29, 0x3f, 0x2a, 0x8e, 0x79, 0xa2, 0xad, 0x23, 0x35, 0x34, 0xc2, 0x50, 0x54, 0xb8, 0x90, + 0x4d, 0x5b, 0x8f, 0xe3, 0x55, 0x3a, 0x37, 0xa9, 0x85, 0x9a, 0xc0, 0x2a, 0x90, 0xb6, 0x5a, 0x66, + 0xe4, 0x40, 0x44, 0xda, 0x4a, 0xc2, 0xda, 0xe7, 0xdf, 0x0f, 0xa2, 0x5b, 0x96, 0xd9, 0x6f, 0x0e, + 0x7c, 0x0f, 0xf2, 0x0b, 0x5e, 0x27, 0xb9, 0x87, 0x69, 0x7e, 0x55, 0x0d, 0x3f, 0xa1, 0x4c, 0xe2, + 0xbc, 0x29, 0xca, 0xa7, 0xd7, 0xd6, 0xb3, 0xfb, 0x93, 0xe6, 0x34, 0xd4, 0x5e, 0x89, 0x50, 0x1a, + 0x60, 0x7f, 0x62, 0x0e, 0x4d, 0x21, 0x47, 0xec, 0x4f, 0x42, 0xbc, 0xed, 0x62, 0xe3, 0x3c, 0xe3, + 0x39, 0xec, 0x62, 0x6b, 0xa1, 0x16, 0x12, 0x5d, 0xdc, 0x82, 0xec, 0x7c, 0xdc, 0x88, 0xd4, 0xf9, + 0xda, 0x38, 0xcb, 0xc0, 0x7c, 0x6c, 0x54, 0x0d, 0x40, 0xcc, 0xc7, 0x28, 0xa8, 0xfd, 0x9c, 0x46, + 0xdf, 0xaa, 0x9b, 0xf4, 0xa4, 0x64, 0xab, 0x94, 0xc1, 0xdb, 0x3b, 0x8e, 0x84, 0x18, 0xff, 0x3e, + 0x61, 0x47, 0xd6, 0x59, 0x5e, 0x15, 0x59, 0x5c, 0x5d, 0xea, 0xfb, 0x1c, 0x7e, 0x9d, 0x1b, 0x21, + 0xbc, 0xd1, 0x71, 0xb7, 0x83, 0xb2, 0x93, 0x7a, 0x23, 0x33, 0x53, 0xcc, 0x06, 0xae, 0xda, 0x9a, + 0x66, 0x36, 0x3b, 0x39, 0xfb, 0xd0, 0x64, 0x3f, 0xce, 0x32, 0x56, 0xae, 0x1b, 0xd9, 0x51, 0x9c, + 0xa7, 0x17, 0xac, 0x12, 0xe0, 0xa1, 0x89, 0xa6, 0x46, 0x10, 0x23, 0x1e, 0x9a, 0x04, 0x70, 0xbb, + 0x6f, 0x03, 0x9e, 0x0f, 0xf2, 0x84, 0xbd, 0x06, 0xfb, 0x36, 0x68, 0x47, 0x32, 0xc4, 0xbe, 0x8d, + 0x62, 0xed, 0xc3, 0x83, 0xa7, 0x19, 0x9f, 0x5d, 0xe9, 0x25, 0xc0, 0xef, 0x60, 0x29, 0x81, 0x6b, + 0xc0, 0xed, 0x10, 0x62, 0x17, 0x01, 0x29, 0x38, 0x65, 0x45, 0x16, 0xcf, 0xe0, 0x15, 0x2e, 0xa5, + 0xa3, 0x65, 0xc4, 0x22, 0x00, 0x19, 0x50, 0x5c, 0x7d, 0x35, 0x0c, 0x2b, 0x2e, 0xb8, 0x19, 0x76, + 0x3b, 0x84, 0xd8, 0x65, 0x50, 0x0a, 0x26, 0x45, 0x96, 0x0a, 0x30, 0x0c, 0x94, 0x86, 0x94, 0x10, + 0xc3, 0xc0, 0x27, 0x80, 0xc9, 0x23, 0x56, 0xce, 0x19, 0x6a, 0x52, 0x4a, 0x82, 0x26, 0x1b, 0xc2, + 0xde, 0x57, 0x57, 0x75, 0xe7, 0xc5, 0x1a, 0xdc, 0x57, 0xd7, 0xd5, 0xe2, 0xc5, 0x9a, 0xb8, 0xaf, + 0xee, 0x01, 0xa0, 0x88, 0x27, 0x71, 0x25, 0xf0, 0x22, 0x4a, 0x49, 0xb0, 0x88, 0x0d, 0x61, 0xd7, + 0x68, 0x55, 0xc4, 0xa5, 0x00, 0x6b, 0xb4, 0x2e, 0x80, 0x73, 0x89, 0xe1, 0x26, 0x29, 0xb7, 0x33, + 0x89, 0xea, 0x15, 0x26, 0x9e, 0xa7, 0x2c, 0x4b, 0x2a, 0x30, 0x93, 0xe8, 0x76, 0x6f, 0xa4, 0xc4, + 0x4c, 0xd2, 0xa6, 0x40, 0x28, 0xe9, 0x27, 0x20, 0x58, 0xed, 0xc0, 0x03, 0x90, 0xdb, 0x21, 0xc4, + 0xce, 0x4f, 0x4d, 0xa1, 0x77, 0xe3, 0xb2, 0x4c, 0xeb, 0xc5, 0x7f, 0x03, 0x2f, 0x50, 0x23, 0x27, + 0xe6, 0x27, 0x8c, 0x03, 0xc3, 0xab, 0x99, 0xb8, 0xb1, 0x82, 0xc1, 0xa9, 0xfb, 0x83, 0x20, 0x63, + 0x33, 0x4e, 0x29, 0x71, 0x9e, 0xc2, 0x63, 0xad, 0x89, 0x3c, 0x84, 0xdf, 0xe8, 0xc2, 0x9c, 0x97, + 0xd9, 0x8c, 0x8b, 0x23, 0xbe, 0x62, 0x53, 0xfe, 0xec, 0x75, 0x5a, 0xd5, 0xdb, 0x2d, 0xbd, 0x72, + 0x3f, 0x21, 0x2c, 0x61, 0x30, 0xf1, 0x32, 0x5b, 0xa7, 0x92, 0x4d, 0x20, 0x40, 0x59, 0x8e, 0xd9, + 0x2b, 0x34, 0x81, 0x80, 0x16, 0x0d, 0x47, 0x24, 0x10, 0x21, 0xde, 0x9e, 0x98, 0x19, 0xe7, 0xfa, + 0x0b, 0x06, 0x53, 0xde, 0xe4, 0x72, 0x94, 0x35, 0x08, 0x12, 0x87, 0x16, 0x41, 0x05, 0xbb, 0xbf, + 0x34, 0xfe, 0xed, 0x10, 0xbb, 0x47, 0xd8, 0x69, 0x0f, 0xb3, 0xfb, 0x3d, 0x48, 0xc4, 0x95, 0xbd, + 0x4a, 0x42, 0xb9, 0x6a, 0xdf, 0x24, 0xb9, 0xdf, 0x83, 0x74, 0x4e, 0xdf, 0xdc, 0x6a, 0x3d, 0x8d, + 0x67, 0x57, 0xf3, 0x92, 0x2f, 0xf3, 0x64, 0x97, 0x67, 0xbc, 0x04, 0xa7, 0x6f, 0x5e, 0xa9, 0x01, + 0x4a, 0x9c, 0xbe, 0x75, 0xa8, 0xd8, 0x0c, 0xce, 0x2d, 0xc5, 0x38, 0x4b, 0xe7, 0x70, 0x47, 0xed, + 0x19, 0x92, 0x00, 0x91, 0xc1, 0xa1, 0x20, 0x12, 0x44, 0x6a, 0xc7, 0x2d, 0xd2, 0x59, 0x9c, 0x29, + 0x7f, 0x3b, 0xb4, 0x19, 0x0f, 0xec, 0x0c, 0x22, 0x44, 0x01, 0xa9, 0xe7, 0x74, 0x59, 0xe6, 0x07, + 0xb9, 0xe0, 0x64, 0x3d, 0x1b, 0xa0, 0xb3, 0x9e, 0x0e, 0x08, 0xa6, 0xd5, 0x29, 0x7b, 0x5d, 0x97, + 0xa6, 0xfe, 0x07, 0x9b, 0x56, 0xeb, 0xbf, 0x8f, 0xb4, 0x3c, 0x34, 0xad, 0x02, 0x0e, 0x54, 0x46, + 0x3b, 0x51, 0x01, 0x13, 0xd0, 0xf6, 0xc3, 0xe4, 0x5e, 0x37, 0x88, 0xfb, 0x99, 0x88, 0x75, 0xc6, + 0x42, 0x7e, 0x24, 0xd0, 0xc7, 0x4f, 0x03, 0xda, 0xe3, 0x16, 0xaf, 0x3e, 0x97, 0x6c, 0x76, 0xd5, + 0xba, 0x19, 0xe7, 0x17, 0x54, 0x21, 0xc4, 0x71, 0x0b, 0x81, 0xe2, 0x5d, 0x74, 0x30, 0xe3, 0x79, + 0xa8, 0x8b, 0x6a, 0x79, 0x9f, 0x2e, 0xd2, 0x9c, 0xdd, 0xfc, 0x1a, 0xa9, 0x8e, 0x4c, 0xd5, 0x4d, + 0x5b, 0x84, 0x05, 0x17, 0x22, 0x36, 0xbf, 0x24, 0x6c, 0x73, 0x72, 0xe8, 0xf3, 0xa8, 0xfd, 0xda, + 0x40, 0xcb, 0xca, 0x11, 0xfd, 0xda, 0x00, 0xc5, 0xd2, 0x95, 0x54, 0x31, 0xd2, 0x61, 0xc5, 0x8f, + 0x93, 0x87, 0xfd, 0x60, 0xbb, 0xe5, 0xf1, 0x7c, 0xee, 0x66, 0x2c, 0x2e, 0x95, 0xd7, 0xed, 0x80, + 0x21, 0x8b, 0x11, 0x5b, 0x9e, 0x00, 0x0e, 0xa6, 0x30, 0xcf, 0xf3, 0x2e, 0xcf, 0x05, 0xcb, 0x05, + 0x36, 0x85, 0xf9, 0xc6, 0x34, 0x18, 0x9a, 0xc2, 0x28, 0x05, 0x10, 0xb7, 0xf2, 0x3c, 0x88, 0x89, + 0xe3, 0x78, 0x81, 0x66, 0x6c, 0xea, 0xac, 0x47, 0xc9, 0x43, 0x71, 0x0b, 0x38, 0xe7, 0x71, 0xae, + 0xeb, 0x65, 0x1a, 0x97, 0x73, 0x73, 0xba, 0x91, 0x0c, 0x1f, 0xd1, 0x76, 0x7c, 0x92, 0x78, 0x9c, + 0x1b, 0xd6, 0x00, 0xd3, 0xce, 0xc1, 0x22, 0x9e, 0x9b, 0x9a, 0x22, 0x35, 0x90, 0xf2, 0x56, 0x55, + 0xef, 0x75, 0x83, 0xc0, 0xcf, 0x8b, 0x34, 0x61, 0x3c, 0xe0, 0x47, 0xca, 0xfb, 0xf8, 0x81, 0x20, + 0xc8, 0xde, 0xea, 0x7a, 0xab, 0x1d, 0xdd, 0x38, 0x4f, 0xf4, 0x3e, 0x76, 0x44, 0x34, 0x0f, 0xe0, + 0x42, 0xd9, 0x1b, 0xc1, 0x83, 0x31, 0xda, 0x1c, 0xd0, 0x86, 0xc6, 0xa8, 0x39, 0x7f, 0xed, 0x33, + 0x46, 0x31, 0x58, 0xfb, 0xfc, 0x89, 0x1e, 0xa3, 0x7b, 0xb1, 0x88, 0xeb, 0xbc, 0xfd, 0x45, 0xca, + 0x5e, 0xe9, 0x8d, 0x30, 0x52, 0xdf, 0x86, 0x1a, 0xc9, 0xb7, 0x9e, 0xc1, 0xae, 0x78, 0xa7, 0x37, + 0x1f, 0xf0, 0xad, 0x77, 0x08, 0x9d, 0xbe, 0xc1, 0x56, 0x61, 0xa7, 0x37, 0x1f, 0xf0, 0xad, 0x3f, + 0xa7, 0xd0, 0xe9, 0x1b, 0x7c, 0x53, 0x61, 0xa7, 0x37, 0xaf, 0x7d, 0xff, 0x69, 0x33, 0x70, 0x5d, + 0xe7, 0x75, 0x1e, 0x36, 0x13, 0xe9, 0x8a, 0x61, 0xe9, 0xa4, 0x6f, 0xcf, 0xa0, 0xa1, 0x74, 0x92, + 0x56, 0x71, 0x3e, 0x68, 0x86, 0x95, 0xe2, 0x84, 0x57, 0xa9, 0xbc, 0x8e, 0xf1, 0xa4, 0x87, 0xd1, + 0x06, 0x0e, 0x6d, 0x9a, 0x42, 0x4a, 0xf6, 0xc1, 0xb2, 0x87, 0xda, 0x8b, 0xf0, 0x0f, 0x03, 0xf6, + 0xda, 0xf7, 0xe1, 0xb7, 0x7b, 0xd2, 0xf6, 0x11, 0xaf, 0xc7, 0xb8, 0xcf, 0x96, 0x43, 0xbd, 0x8a, + 0x3e, 0x5e, 0x7e, 0xd4, 0x5f, 0x41, 0xbb, 0xff, 0xf3, 0x66, 0x5f, 0x01, 0xfd, 0xeb, 0x41, 0xf0, + 0xb8, 0x8f, 0x45, 0x30, 0x10, 0x9e, 0x5c, 0x4b, 0x47, 0x17, 0xe4, 0xaf, 0x9b, 0x0d, 0x74, 0x83, + 0xca, 0xd7, 0x81, 0xe4, 0x6b, 0xc4, 0x7a, 0x4c, 0x84, 0xba, 0xd5, 0xc2, 0x70, 0x64, 0x7c, 0x7c, + 0x4d, 0x2d, 0xe7, 0xf3, 0x76, 0x1e, 0xac, 0x5f, 0x5b, 0x75, 0xca, 0x13, 0xb2, 0xec, 0xd0, 0xb0, + 0x40, 0x9f, 0x5c, 0x57, 0x8d, 0x1a, 0x2b, 0x0e, 0x2c, 0x3f, 0xf0, 0xf2, 0xa4, 0xa7, 0x61, 0xef, + 0x93, 0x2f, 0x1f, 0x5d, 0x4f, 0x49, 0x97, 0xe5, 0xdf, 0x06, 0xd1, 0x5d, 0x8f, 0xb5, 0xcf, 0x13, + 0xc0, 0xa9, 0xc7, 0x0f, 0x02, 0xf6, 0x29, 0x25, 0x53, 0xb8, 0xdf, 0xf8, 0x66, 0xca, 0xf6, 0x5b, + 0x70, 0x9e, 0xca, 0xf3, 0x34, 0x13, 0xac, 0x6c, 0x7f, 0x0b, 0xce, 0xb7, 0xab, 0xa8, 0x11, 0xfd, + 0x2d, 0xb8, 0x00, 0xee, 0x7c, 0x0b, 0x0e, 0xf1, 0x8c, 0x7e, 0x0b, 0x0e, 0xb5, 0x16, 0xfc, 0x16, + 0x5c, 0x58, 0x83, 0x9a, 0xde, 0x9b, 0x22, 0xa8, 0x73, 0xeb, 0x5e, 0x16, 0xfd, 0x63, 0xec, 0xc7, + 0xd7, 0x51, 0x21, 0x16, 0x38, 0xc5, 0xc9, 0x1b, 0x8d, 0x3d, 0xda, 0xd4, 0xbb, 0xd5, 0xb8, 0xd3, + 0x9b, 0xd7, 0xbe, 0x7f, 0xac, 0x77, 0x37, 0x66, 0x3a, 0xe7, 0xa5, 0xfc, 0x0e, 0xe0, 0x56, 0x68, + 0x7a, 0xae, 0x2d, 0xb8, 0x3d, 0xff, 0xb0, 0x1f, 0x4c, 0x54, 0xb7, 0x26, 0x74, 0xa7, 0x8f, 0xba, + 0x0c, 0x81, 0x2e, 0xdf, 0xe9, 0xcd, 0x13, 0xcb, 0x88, 0xf2, 0xad, 0x7a, 0xbb, 0x87, 0x31, 0xbf, + 0xaf, 0x1f, 0xf5, 0x57, 0xd0, 0xee, 0x57, 0x3a, 0x6d, 0x74, 0xdd, 0xcb, 0x7e, 0xde, 0xee, 0x32, + 0x35, 0xf1, 0xba, 0x79, 0xd4, 0x17, 0x0f, 0x25, 0x10, 0xee, 0x12, 0xda, 0x95, 0x40, 0xa0, 0xcb, + 0xe8, 0x47, 0xd7, 0x53, 0xd2, 0x65, 0xf9, 0xbb, 0x41, 0x74, 0x93, 0x2c, 0x8b, 0x8e, 0x83, 0x4f, + 0xfa, 0x5a, 0x06, 0xf1, 0xf0, 0xe9, 0xb5, 0xf5, 0x74, 0xa1, 0xfe, 0x71, 0x10, 0xdd, 0x0a, 0x14, + 0x4a, 0x05, 0xc8, 0x35, 0xac, 0xfb, 0x81, 0xf2, 0xd9, 0xf5, 0x15, 0xa9, 0xe5, 0xde, 0xc5, 0x27, + 0xed, 0xef, 0x7a, 0x05, 0x6c, 0x4f, 0xe8, 0xef, 0x7a, 0x75, 0x6b, 0xc1, 0x43, 0x9e, 0xf8, 0xbc, + 0xd9, 0x74, 0xa1, 0x87, 0x3c, 0xf2, 0x2e, 0x62, 0xf0, 0xfb, 0x24, 0x18, 0x87, 0x39, 0x79, 0xf6, + 0xba, 0x88, 0xf3, 0x84, 0x76, 0xa2, 0xe4, 0xdd, 0x4e, 0x0c, 0x07, 0x0f, 0xc7, 0x6a, 0xe9, 0x29, + 0x6f, 0x36, 0x52, 0xf7, 0x29, 0x7d, 0x83, 0x04, 0x0f, 0xc7, 0x5a, 0x28, 0xe1, 0x4d, 0x67, 0x8d, + 0x21, 0x6f, 0x20, 0x59, 0x7c, 0xd0, 0x07, 0x05, 0x29, 0xba, 0xf1, 0x66, 0xce, 0xdc, 0x1f, 0x86, + 0xac, 0xb4, 0xce, 0xdd, 0xb7, 0x7b, 0xd2, 0x84, 0xdb, 0x09, 0x13, 0x9f, 0xb3, 0x38, 0x61, 0x65, + 0xd0, 0xad, 0xa1, 0x7a, 0xb9, 0x75, 0x69, 0xcc, 0xed, 0x2e, 0xcf, 0x96, 0x8b, 0x5c, 0x77, 0x26, + 0xe9, 0xd6, 0xa5, 0xba, 0xdd, 0x02, 0x1a, 0x1e, 0x0b, 0x5a, 0xb7, 0x32, 0xbd, 0x7c, 0x10, 0x36, + 0xe3, 0x65, 0x95, 0x5b, 0xbd, 0x58, 0xba, 0x9e, 0x3a, 0x8c, 0x3a, 0xea, 0x09, 0x22, 0x69, 0xbb, + 0x27, 0x0d, 0xcf, 0xe7, 0x1c, 0xb7, 0x26, 0x9e, 0x76, 0x3a, 0x6c, 0xb5, 0x42, 0xea, 0x51, 0x7f, + 0x05, 0x78, 0x1a, 0xaa, 0xa3, 0xea, 0x30, 0xad, 0xc4, 0xf3, 0x34, 0xcb, 0x86, 0x5b, 0x81, 0x30, + 0x69, 0xa0, 0xe0, 0x69, 0x28, 0x02, 0x13, 0x91, 0xdc, 0x9c, 0x1e, 0xe6, 0xc3, 0x2e, 0x3b, 0x92, + 0xea, 0x15, 0xc9, 0x2e, 0x0d, 0x4e, 0xb4, 0x9c, 0xa6, 0x36, 0xb5, 0x1d, 0x85, 0x1b, 0xae, 0x55, + 0xe1, 0x9d, 0xde, 0x3c, 0x78, 0xdc, 0x2e, 0x29, 0xb9, 0xb2, 0xdc, 0xa1, 0x4c, 0x78, 0x2b, 0xc9, + 0xdd, 0x0e, 0x0a, 0x9c, 0x0a, 0xaa, 0x61, 0xf4, 0x32, 0x4d, 0xe6, 0x4c, 0xa0, 0x4f, 0x8a, 0x5c, + 0x20, 0xf8, 0xa4, 0x08, 0x80, 0xa0, 0xeb, 0xd4, 0xdf, 0xcd, 0x71, 0xe8, 0x41, 0x82, 0x75, 0x9d, + 0x56, 0x76, 0xa8, 0x50, 0xd7, 0xa1, 0x34, 0x98, 0x0d, 0x8c, 0x5b, 0xfd, 0x45, 0x87, 0x07, 0x21, + 0x33, 0xe0, 0xb3, 0x0e, 0x5b, 0xbd, 0x58, 0xb0, 0xa2, 0x58, 0x87, 0xe9, 0x22, 0x15, 0xd8, 0x8a, + 0xe2, 0xd8, 0xa8, 0x91, 0xd0, 0x8a, 0xd2, 0x46, 0xa9, 0xea, 0xd5, 0x39, 0xc2, 0x41, 0x12, 0xae, + 0x9e, 0x62, 0xfa, 0x55, 0xcf, 0xb0, 0xad, 0x07, 0x9b, 0xb9, 0x09, 0x19, 0x71, 0xa9, 0x37, 0xcb, + 0x48, 0x6c, 0xcb, 0x37, 0x7d, 0x21, 0x18, 0x9a, 0x75, 0x28, 0x05, 0x78, 0x60, 0x5f, 0x73, 0xcd, + 0xb3, 0xd7, 0xa2, 0x60, 0x71, 0x19, 0xe7, 0x33, 0x74, 0x73, 0x2a, 0x0d, 0xb6, 0xc8, 0xd0, 0xe6, + 0x94, 0xd4, 0x00, 0x8f, 0xcd, 0xfd, 0x57, 0x69, 0x91, 0xa1, 0x60, 0xde, 0x59, 0xf5, 0xdf, 0xa4, + 0xbd, 0xdf, 0x83, 0x84, 0x8f, 0xcd, 0x1b, 0xc0, 0x1c, 0x7c, 0x2b, 0xa7, 0x1f, 0x06, 0x4c, 0xf9, + 0x68, 0x68, 0x23, 0x4c, 0xab, 0x80, 0xa0, 0x36, 0x09, 0x2e, 0x13, 0x3f, 0x62, 0x6b, 0x2c, 0xa8, + 0x6d, 0x7e, 0x2a, 0x91, 0x50, 0x50, 0xb7, 0x51, 0x90, 0x67, 0xba, 0xfb, 0xa0, 0x8d, 0x80, 0xbe, + 0xbb, 0xf5, 0xd9, 0xec, 0xe4, 0xc0, 0xc8, 0xd9, 0x4b, 0x57, 0xde, 0x73, 0x02, 0xa4, 0xa0, 0x7b, + 0xe9, 0x0a, 0x7f, 0x4c, 0xb0, 0xd5, 0x8b, 0x85, 0x8f, 0xe4, 0x63, 0xc1, 0x5e, 0x37, 0xcf, 0xca, + 0x91, 0xe2, 0x4a, 0x79, 0xeb, 0x61, 0xf9, 0xbd, 0x6e, 0xd0, 0x5e, 0x80, 0x3d, 0x29, 0xf9, 0x8c, + 0x55, 0x95, 0xfe, 0xd8, 0xa9, 0x7f, 0xc3, 0x48, 0xcb, 0x46, 0xe0, 0x53, 0xa7, 0x77, 0xc2, 0x90, + 0xf3, 0x85, 0x42, 0x25, 0xb2, 0x1f, 0x4e, 0xda, 0x40, 0x35, 0xdb, 0xdf, 0x4c, 0xda, 0xec, 0xe4, + 0xec, 0xf0, 0xd2, 0x52, 0xf7, 0x4b, 0x49, 0xf7, 0x50, 0x75, 0xec, 0x23, 0x49, 0xf7, 0x7b, 0x90, + 0xda, 0xd5, 0xe7, 0xd1, 0x9b, 0x87, 0x7c, 0x3e, 0x61, 0x79, 0x32, 0xfc, 0x9e, 0x7f, 0x85, 0x96, + 0xcf, 0x47, 0xf5, 0x9f, 0x8d, 0xd1, 0x1b, 0x94, 0xd8, 0x5e, 0x02, 0xdc, 0x63, 0xe7, 0xcb, 0xf9, + 0x44, 0xc4, 0x02, 0x5c, 0x02, 0x94, 0x7f, 0x1f, 0xd5, 0x02, 0xe2, 0x12, 0xa0, 0x07, 0x00, 0x7b, + 0xd3, 0x92, 0x31, 0xd4, 0x5e, 0x2d, 0x08, 0xda, 0xd3, 0x80, 0xcd, 0x22, 0x8c, 0xbd, 0x3a, 0x51, + 0x87, 0x97, 0xf6, 0xac, 0x8e, 0x94, 0x12, 0x59, 0x44, 0x9b, 0xb2, 0xc1, 0xad, 0xaa, 0x2f, 0x3f, + 0x5c, 0xb3, 0x5c, 0x2c, 0xe2, 0x72, 0x0d, 0x82, 0x5b, 0xd7, 0xd2, 0x01, 0x88, 0xe0, 0x46, 0x41, + 0x3b, 0x6a, 0x9b, 0x66, 0x9e, 0x5d, 0xed, 0xf3, 0x92, 0x2f, 0x45, 0x9a, 0x33, 0xf8, 0xf1, 0x12, + 0xd3, 0xa0, 0x2e, 0x43, 0x8c, 0x5a, 0x8a, 0xb5, 0x59, 0xae, 0x24, 0xd4, 0x7d, 0x42, 0xf9, 0xfd, + 0xf5, 0x4a, 0xf0, 0x12, 0x3e, 0x4f, 0x54, 0x56, 0x20, 0x44, 0x64, 0xb9, 0x24, 0x0c, 0xfa, 0xfe, + 0x24, 0xcd, 0xe7, 0x68, 0xdf, 0x9f, 0xb8, 0x1f, 0x10, 0xbe, 0x45, 0x03, 0x76, 0x40, 0xa9, 0x46, + 0x53, 0x03, 0x40, 0xbf, 0xb5, 0x8b, 0x36, 0xba, 0x4b, 0x10, 0x03, 0x0a, 0x27, 0x81, 0xab, 0x2f, + 0x0a, 0x96, 0xb3, 0xa4, 0xb9, 0x35, 0x87, 0xb9, 0xf2, 0x88, 0xa0, 0x2b, 0x48, 0xda, 0xb9, 0x48, + 0xca, 0x4f, 0x97, 0xf9, 0x49, 0xc9, 0x2f, 0xd2, 0x8c, 0x95, 0x60, 0x2e, 0x52, 0xea, 0x8e, 0x9c, + 0x98, 0x8b, 0x30, 0xce, 0x5e, 0xbf, 0x90, 0x52, 0xef, 0x47, 0x04, 0xa6, 0x65, 0x3c, 0x83, 0xd7, + 0x2f, 0x94, 0x8d, 0x36, 0x46, 0x9c, 0x0c, 0x06, 0x70, 0x27, 0xd1, 0x51, 0xae, 0xf3, 0xb5, 0x8c, + 0x0f, 0xfd, 0xd6, 0xa8, 0xfc, 0xac, 0x6e, 0x05, 0x12, 0x1d, 0x6d, 0x0e, 0x23, 0x89, 0x44, 0x27, + 0xac, 0x61, 0x97, 0x12, 0xc9, 0x1d, 0xeb, 0x6b, 0x45, 0x60, 0x29, 0x51, 0x36, 0x1a, 0x21, 0xb1, + 0x94, 0xb4, 0x20, 0x30, 0x21, 0x35, 0xc3, 0x60, 0x8e, 0x4e, 0x48, 0x46, 0x1a, 0x9c, 0x90, 0x5c, + 0xca, 0x4e, 0x14, 0x07, 0x79, 0x2a, 0xd2, 0x38, 0x9b, 0x30, 0x71, 0x12, 0x97, 0xf1, 0x82, 0x09, + 0x56, 0xc2, 0x89, 0x42, 0x23, 0x23, 0x8f, 0x21, 0x26, 0x0a, 0x8a, 0xd5, 0x0e, 0x7f, 0x33, 0x7a, + 0xbb, 0x5e, 0xf7, 0x59, 0xae, 0x7f, 0xfe, 0xe8, 0x99, 0xfc, 0xdd, 0xb4, 0xe1, 0x3b, 0xc6, 0xc6, + 0x44, 0x94, 0x2c, 0x5e, 0x34, 0xb6, 0xdf, 0x32, 0x7f, 0x97, 0xe0, 0xa3, 0x41, 0x1d, 0xcf, 0xc7, + 0x5c, 0xa4, 0x17, 0xf5, 0x36, 0x5b, 0xbf, 0x41, 0x04, 0xe2, 0xd9, 0x15, 0x8f, 0x02, 0x5f, 0x1d, + 0xc1, 0x38, 0x3b, 0x4f, 0xbb, 0xd2, 0x53, 0x56, 0x64, 0x70, 0x9e, 0xf6, 0xb4, 0x25, 0x40, 0xcc, + 0xd3, 0x28, 0x68, 0x07, 0xa7, 0x2b, 0x9e, 0xb2, 0x70, 0x65, 0xa6, 0xac, 0x5f, 0x65, 0xa6, 0xde, + 0x4b, 0x19, 0x59, 0xf4, 0xf6, 0x11, 0x5b, 0x9c, 0xb3, 0xb2, 0xba, 0x4c, 0x0b, 0xea, 0xd3, 0xbf, + 0x96, 0xe8, 0xfc, 0xf4, 0x2f, 0x81, 0xda, 0x95, 0xc0, 0x02, 0x07, 0xd5, 0x71, 0xbc, 0x60, 0xf2, + 0x1b, 0x2a, 0x60, 0x25, 0x70, 0x8c, 0x38, 0x10, 0xb1, 0x12, 0x90, 0xb0, 0xf3, 0x7e, 0x97, 0x65, + 0x4e, 0xd9, 0xbc, 0x8e, 0xb0, 0xf2, 0x24, 0x5e, 0x2f, 0x58, 0x2e, 0xb4, 0x49, 0x70, 0x26, 0xef, + 0x98, 0xc4, 0x79, 0xe2, 0x4c, 0xbe, 0x8f, 0x9e, 0x33, 0x35, 0x79, 0x0d, 0x7f, 0xc2, 0x4b, 0xa1, + 0x7e, 0xdc, 0xec, 0xac, 0xcc, 0xc0, 0xd4, 0xe4, 0x37, 0xaa, 0x47, 0x12, 0x53, 0x53, 0x58, 0xc3, + 0xf9, 0x21, 0x0b, 0xaf, 0x0c, 0x2f, 0x58, 0x69, 0xe2, 0xe4, 0xd9, 0x22, 0x4e, 0x33, 0x1d, 0x0d, + 0xdf, 0x0f, 0xd8, 0x26, 0x74, 0x88, 0x1f, 0xb2, 0xe8, 0xab, 0xeb, 0xfc, 0xf4, 0x47, 0xb8, 0x84, + 0xe0, 0x11, 0x41, 0x87, 0x7d, 0xe2, 0x11, 0x41, 0xb7, 0x96, 0xdd, 0xb9, 0x5b, 0x56, 0x72, 0x6b, + 0x49, 0xec, 0xf2, 0x04, 0x9e, 0x17, 0x3a, 0x36, 0x01, 0x48, 0xec, 0xdc, 0x83, 0x0a, 0x36, 0x35, + 0xb0, 0xd8, 0xf3, 0x34, 0x8f, 0xb3, 0xf4, 0x27, 0x30, 0xad, 0x77, 0xec, 0x34, 0x04, 0x91, 0x1a, + 0xe0, 0x24, 0xe6, 0x6a, 0x9f, 0x89, 0x69, 0x5a, 0x4f, 0xfd, 0xf7, 0x02, 0xed, 0x26, 0x89, 0x6e, + 0x57, 0x0e, 0xe9, 0x7c, 0xe6, 0x17, 0x36, 0xeb, 0xb8, 0x28, 0x26, 0xf5, 0xaa, 0x7a, 0xca, 0x66, + 0x2c, 0x2d, 0xc4, 0xf0, 0xe3, 0x70, 0x5b, 0x01, 0x9c, 0xb8, 0x68, 0xd1, 0x43, 0xcd, 0x79, 0x7c, + 0x5f, 0xcf, 0x25, 0x13, 0xf5, 0xab, 0x9f, 0x67, 0x15, 0x2b, 0x75, 0xa2, 0xb1, 0xcf, 0x04, 0x18, + 0x9d, 0x0e, 0x37, 0x72, 0xc0, 0xba, 0xa2, 0xc4, 0xe8, 0x0c, 0x6b, 0xd8, 0xc3, 0x3e, 0x87, 0xd3, + 0x9f, 0x6d, 0x97, 0xf7, 0x0d, 0x1f, 0x92, 0xc6, 0x1c, 0x8a, 0x38, 0xec, 0xa3, 0x69, 0x9b, 0xad, + 0xb5, 0xdd, 0x8e, 0xf3, 0xf5, 0x01, 0xbc, 0x32, 0x81, 0x58, 0x92, 0x18, 0x91, 0xad, 0x05, 0x70, + 0xe7, 0x30, 0xbc, 0xe4, 0x71, 0x32, 0x8b, 0x2b, 0x71, 0x12, 0xaf, 0x33, 0x1e, 0x27, 0x72, 0x5d, + 0x87, 0x87, 0xe1, 0x0d, 0x33, 0x72, 0x21, 0xea, 0x30, 0x9c, 0x82, 0xdd, 0xec, 0x4c, 0xfe, 0x98, + 0xa9, 0xbe, 0xcb, 0x09, 0xb3, 0x33, 0x59, 0x5e, 0x78, 0x8f, 0xf3, 0x4e, 0x18, 0xb2, 0xef, 0xa0, + 0x29, 0x91, 0x4c, 0x43, 0x6e, 0x61, 0x3a, 0x5e, 0x02, 0xf2, 0x7e, 0x80, 0xb0, 0x5f, 0x20, 0x51, + 0x7f, 0x6f, 0x7e, 0xbf, 0x4a, 0xe8, 0x8f, 0xa1, 0x3f, 0xc4, 0x74, 0x5d, 0x68, 0xe4, 0x7e, 0xc8, + 0x62, 0xbb, 0x27, 0x6d, 0xd3, 0xcc, 0xdd, 0xcb, 0x58, 0x8c, 0x93, 0xe4, 0x88, 0x55, 0xc8, 0x0b, + 0xe5, 0xb5, 0x70, 0x64, 0xa5, 0x44, 0x9a, 0xd9, 0xa6, 0x6c, 0xa0, 0xd7, 0xb2, 0x67, 0x49, 0x2a, + 0xb4, 0xac, 0xb9, 0x21, 0xfd, 0xb0, 0x6d, 0xa0, 0x4d, 0x11, 0xb5, 0xa2, 0x69, 0x3b, 0x97, 0xd7, + 0xcc, 0x94, 0xcf, 0xe7, 0x19, 0xd3, 0xd0, 0x29, 0x8b, 0xd5, 0xb7, 0x20, 0x77, 0xda, 0xb6, 0x50, + 0x90, 0x98, 0xcb, 0x83, 0x0a, 0x36, 0x8d, 0xac, 0x31, 0xf5, 0x48, 0xaa, 0x69, 0xd8, 0xcd, 0xb6, + 0x19, 0x0f, 0x20, 0xd2, 0x48, 0x14, 0xb4, 0xef, 0xbd, 0xd5, 0xe2, 0x7d, 0xd6, 0xb4, 0x04, 0xfc, + 0xd8, 0x94, 0x54, 0x76, 0xc4, 0xc4, 0x7b, 0x6f, 0x08, 0x66, 0xf7, 0x09, 0xc0, 0xc3, 0xd3, 0xf5, + 0x41, 0x02, 0xf7, 0x09, 0x50, 0x5f, 0x32, 0xc4, 0x3e, 0x81, 0x62, 0xfd, 0xae, 0x33, 0xe7, 0x5e, + 0x87, 0x71, 0x65, 0x2b, 0x87, 0x74, 0x1d, 0x0a, 0x86, 0xba, 0x8e, 0x52, 0xf0, 0x9b, 0xd4, 0x3d, + 0x5a, 0x43, 0x9a, 0x14, 0x3b, 0x57, 0xdb, 0xe8, 0xc2, 0x6c, 0xee, 0x5f, 0x0b, 0x4f, 0x59, 0x9c, + 0x98, 0x8a, 0x21, 0xba, 0xae, 0x9c, 0xc8, 0xfd, 0x31, 0x4e, 0x3b, 0xf9, 0x9d, 0x68, 0xa8, 0xaa, + 0x51, 0xba, 0x6e, 0x6e, 0x61, 0x45, 0xac, 0x09, 0x62, 0xa2, 0xf2, 0x09, 0x27, 0x71, 0xf3, 0xba, + 0x68, 0xca, 0xb5, 0x03, 0xfd, 0x5e, 0x66, 0x05, 0x12, 0x37, 0xbf, 0xd9, 0x5b, 0x34, 0x91, 0xb8, + 0x75, 0x6b, 0xd9, 0x79, 0xde, 0xec, 0xcf, 0xe5, 0x15, 0x30, 0xfc, 0x47, 0x35, 0x94, 0x90, 0x98, + 0xe7, 0x5b, 0x90, 0xb2, 0xfd, 0xf4, 0xfd, 0xff, 0xf8, 0xea, 0xc6, 0xe0, 0x67, 0x5f, 0xdd, 0x18, + 0xfc, 0xf7, 0x57, 0x37, 0x06, 0x3f, 0xfd, 0xfa, 0xc6, 0x1b, 0x3f, 0xfb, 0xfa, 0xc6, 0x1b, 0xff, + 0xf5, 0xf5, 0x8d, 0x37, 0xbe, 0x7c, 0x53, 0xff, 0x68, 0xf8, 0xf9, 0xff, 0x93, 0x3f, 0xfd, 0xfd, + 0xe4, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x14, 0xc2, 0x04, 0x4c, 0x58, 0x7c, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -500,6 +500,7 @@ type ClientCommandsClient interface { ObjectUndo(ctx context.Context, in *pb.RpcObjectUndoRequest, opts ...grpc.CallOption) (*pb.RpcObjectUndoResponse, error) ObjectRedo(ctx context.Context, in *pb.RpcObjectRedoRequest, opts ...grpc.CallOption) (*pb.RpcObjectRedoResponse, error) ObjectListExport(ctx context.Context, in *pb.RpcObjectListExportRequest, opts ...grpc.CallOption) (*pb.RpcObjectListExportResponse, error) + ObjectExport(ctx context.Context, in *pb.RpcObjectExportRequest, opts ...grpc.CallOption) (*pb.RpcObjectExportResponse, error) ObjectBookmarkFetch(ctx context.Context, in *pb.RpcObjectBookmarkFetchRequest, opts ...grpc.CallOption) (*pb.RpcObjectBookmarkFetchResponse, error) ObjectToBookmark(ctx context.Context, in *pb.RpcObjectToBookmarkRequest, opts ...grpc.CallOption) (*pb.RpcObjectToBookmarkResponse, error) ObjectImport(ctx context.Context, in *pb.RpcObjectImportRequest, opts ...grpc.CallOption) (*pb.RpcObjectImportResponse, error) @@ -1593,6 +1594,15 @@ func (c *clientCommandsClient) ObjectListExport(ctx context.Context, in *pb.RpcO return out, nil } +func (c *clientCommandsClient) ObjectExport(ctx context.Context, in *pb.RpcObjectExportRequest, opts ...grpc.CallOption) (*pb.RpcObjectExportResponse, error) { + out := new(pb.RpcObjectExportResponse) + err := c.cc.Invoke(ctx, "/anytype.ClientCommands/ObjectExport", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *clientCommandsClient) ObjectBookmarkFetch(ctx context.Context, in *pb.RpcObjectBookmarkFetchRequest, opts ...grpc.CallOption) (*pb.RpcObjectBookmarkFetchResponse, error) { out := new(pb.RpcObjectBookmarkFetchResponse) err := c.cc.Invoke(ctx, "/anytype.ClientCommands/ObjectBookmarkFetch", in, out, opts...) @@ -3438,6 +3448,7 @@ type ClientCommandsServer interface { ObjectUndo(context.Context, *pb.RpcObjectUndoRequest) *pb.RpcObjectUndoResponse ObjectRedo(context.Context, *pb.RpcObjectRedoRequest) *pb.RpcObjectRedoResponse ObjectListExport(context.Context, *pb.RpcObjectListExportRequest) *pb.RpcObjectListExportResponse + ObjectExport(context.Context, *pb.RpcObjectExportRequest) *pb.RpcObjectExportResponse ObjectBookmarkFetch(context.Context, *pb.RpcObjectBookmarkFetchRequest) *pb.RpcObjectBookmarkFetchResponse ObjectToBookmark(context.Context, *pb.RpcObjectToBookmarkRequest) *pb.RpcObjectToBookmarkResponse ObjectImport(context.Context, *pb.RpcObjectImportRequest) *pb.RpcObjectImportResponse @@ -3963,6 +3974,9 @@ func (*UnimplementedClientCommandsServer) ObjectRedo(ctx context.Context, req *p func (*UnimplementedClientCommandsServer) ObjectListExport(ctx context.Context, req *pb.RpcObjectListExportRequest) *pb.RpcObjectListExportResponse { return nil } +func (*UnimplementedClientCommandsServer) ObjectExport(ctx context.Context, req *pb.RpcObjectExportRequest) *pb.RpcObjectExportResponse { + return nil +} func (*UnimplementedClientCommandsServer) ObjectBookmarkFetch(ctx context.Context, req *pb.RpcObjectBookmarkFetchRequest) *pb.RpcObjectBookmarkFetchResponse { return nil } @@ -6230,6 +6244,24 @@ func _ClientCommands_ObjectListExport_Handler(srv interface{}, ctx context.Conte return interceptor(ctx, in, info, handler) } +func _ClientCommands_ObjectExport_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(pb.RpcObjectExportRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ClientCommandsServer).ObjectExport(ctx, in), nil + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/anytype.ClientCommands/ObjectExport", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ClientCommandsServer).ObjectExport(ctx, req.(*pb.RpcObjectExportRequest)), nil + } + return interceptor(ctx, in, info, handler) +} + func _ClientCommands_ObjectBookmarkFetch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(pb.RpcObjectBookmarkFetchRequest) if err := dec(in); err != nil { @@ -10034,6 +10066,10 @@ var _ClientCommands_serviceDesc = grpc.ServiceDesc{ MethodName: "ObjectListExport", Handler: _ClientCommands_ObjectListExport_Handler, }, + { + MethodName: "ObjectExport", + Handler: _ClientCommands_ObjectExport_Handler, + }, { MethodName: "ObjectBookmarkFetch", Handler: _ClientCommands_ObjectBookmarkFetch_Handler, From f2bb2aab6379499bb6742685272092ad754c1da1 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 25 Mar 2025 18:35:25 +0100 Subject: [PATCH 088/132] GO-4459: Add missing mock --- .../mock_service/mock_ClientCommandsServer.go | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/pb/service/mock_service/mock_ClientCommandsServer.go b/pb/service/mock_service/mock_ClientCommandsServer.go index f6351e05f..86ed7f77e 100644 --- a/pb/service/mock_service/mock_ClientCommandsServer.go +++ b/pb/service/mock_service/mock_ClientCommandsServer.go @@ -6100,6 +6100,55 @@ func (_c *MockClientCommandsServer_ChatUnsubscribe_Call) RunAndReturn(run func(c return _c } +// ChatUnsubscribeFromMessagePreviews provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ChatUnsubscribeFromMessagePreviews(_a0 context.Context, _a1 *pb.RpcChatUnsubscribeFromMessagePreviewsRequest) *pb.RpcChatUnsubscribeFromMessagePreviewsResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ChatUnsubscribeFromMessagePreviews") + } + + var r0 *pb.RpcChatUnsubscribeFromMessagePreviewsResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcChatUnsubscribeFromMessagePreviewsRequest) *pb.RpcChatUnsubscribeFromMessagePreviewsResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcChatUnsubscribeFromMessagePreviewsResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ChatUnsubscribeFromMessagePreviews_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChatUnsubscribeFromMessagePreviews' +type MockClientCommandsServer_ChatUnsubscribeFromMessagePreviews_Call struct { + *mock.Call +} + +// ChatUnsubscribeFromMessagePreviews is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcChatUnsubscribeFromMessagePreviewsRequest +func (_e *MockClientCommandsServer_Expecter) ChatUnsubscribeFromMessagePreviews(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ChatUnsubscribeFromMessagePreviews_Call { + return &MockClientCommandsServer_ChatUnsubscribeFromMessagePreviews_Call{Call: _e.mock.On("ChatUnsubscribeFromMessagePreviews", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ChatUnsubscribeFromMessagePreviews_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcChatUnsubscribeFromMessagePreviewsRequest)) *MockClientCommandsServer_ChatUnsubscribeFromMessagePreviews_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcChatUnsubscribeFromMessagePreviewsRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ChatUnsubscribeFromMessagePreviews_Call) Return(_a0 *pb.RpcChatUnsubscribeFromMessagePreviewsResponse) *MockClientCommandsServer_ChatUnsubscribeFromMessagePreviews_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ChatUnsubscribeFromMessagePreviews_Call) RunAndReturn(run func(context.Context, *pb.RpcChatUnsubscribeFromMessagePreviewsRequest) *pb.RpcChatUnsubscribeFromMessagePreviewsResponse) *MockClientCommandsServer_ChatUnsubscribeFromMessagePreviews_Call { + _c.Call.Return(run) + return _c +} + // DebugAccountSelectTrace provides a mock function with given fields: _a0, _a1 func (_m *MockClientCommandsServer) DebugAccountSelectTrace(_a0 context.Context, _a1 *pb.RpcDebugAccountSelectTraceRequest) *pb.RpcDebugAccountSelectTraceResponse { ret := _m.Called(_a0, _a1) From 77cebace59b82aef1f4589950c66d809aad5d930 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 25 Mar 2025 21:03:47 +0100 Subject: [PATCH 089/132] GO-4459: Rename type_key to key for type response consistency --- core/api/docs/docs.go | 2 +- core/api/docs/swagger.json | 2 +- core/api/docs/swagger.yaml | 13 ++++++------- core/api/internal/object/model.go | 2 +- core/api/internal/object/service.go | 6 +++--- core/api/internal/object/service_test.go | 19 +++++++++---------- core/api/internal/search/model.go | 2 +- 7 files changed, 22 insertions(+), 24 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index b55186eb7..003f06a7f 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -6,7 +6,7 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects associated with a specific list (query or collection) within a space. When a view ID is provided, the objects are filtered and sorted according to the view's configuration. If no view ID is specified, all list objects are returned without filtering and sorting. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. The member_id path parameter can be provided as either the member's ID (starting with ` + "`" + `_participant` + "`" + `) or the member's identity. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 23b399fca..a0d504929 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,5 +1,5 @@ { - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"},"type_key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by unique key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects associated with a specific list (query or collection) within a space. When a view ID is provided, the objects are filtered and sorted according to the view's configuration. If no view ID is specified, all list objects are returned without filtering and sorting. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. The member_id path parameter can be provided as either the member's ID (starting with `_participant`) or the member's identity. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 7204c1b35..f4bbab887 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -427,6 +427,11 @@ components: description: The id of the type (which is unique across spaces) example: bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu type: string + key: + description: The key of the type (can be the same across spaces for known + types) + example: ot-page + type: string name: description: The name of the type example: Page @@ -439,11 +444,6 @@ components: description: The recommended layout of the type example: todo type: string - type_key: - description: The key of the type (can be the same across spaces for known - types) - example: ot-page - type: string type: object object.TypeResponse: properties: @@ -547,8 +547,7 @@ components: sort: $ref: '#/components/schemas/search.SortOptions' types: - description: The types of objects to search for, specified by unique key - or ID + description: The types of objects to search for, specified by key or ID example: - ot-page - ot-678043f0cda9133be777049f diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index 40783fa74..cef220e5e 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -91,7 +91,7 @@ type TypeResponse struct { type Type struct { Object string `json:"object" example:"type"` // The data model of the object Id string `json:"id" example:"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu"` // The id of the type (which is unique across spaces) - TypeKey string `json:"type_key" example:"ot-page"` // The key of the type (can be the same across spaces for known types) + Key string `json:"key" example:"ot-page"` // The key of the type (can be the same across spaces for known types) Name string `json:"name" example:"Page"` // The name of the type Icon util.Icon `json:"icon"` // The icon of the type Archived bool `json:"archived" example:"false"` // Whether the type is archived diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 8bbc608ba..2505f1f6c 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -395,7 +395,7 @@ func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset in types = append(types, Type{ Object: "type", Id: record.Fields[bundle.RelationKeyId.String()].GetStringValue(), - TypeKey: record.Fields[bundle.RelationKeyUniqueKey.String()].GetStringValue(), + Key: record.Fields[bundle.RelationKeyUniqueKey.String()].GetStringValue(), Name: record.Fields[bundle.RelationKeyName.String()].GetStringValue(), Icon: util.GetIcon(s.AccountInfo, record.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), "", record.Fields[bundle.RelationKeyIconName.String()].GetStringValue(), record.Fields[bundle.RelationKeyIconOption.String()].GetNumberValue()), Archived: record.Fields[bundle.RelationKeyIsArchived.String()].GetBoolValue(), @@ -430,7 +430,7 @@ func (s *ObjectService) GetType(ctx context.Context, spaceId string, typeId stri return Type{ Object: "type", Id: typeId, - TypeKey: details[bundle.RelationKeyUniqueKey.String()].GetStringValue(), + Key: details[bundle.RelationKeyUniqueKey.String()].GetStringValue(), Name: details[bundle.RelationKeyName.String()].GetStringValue(), Icon: util.GetIcon(s.AccountInfo, details[bundle.RelationKeyIconEmoji.String()].GetStringValue(), "", details[bundle.RelationKeyIconName.String()].GetStringValue(), details[bundle.RelationKeyIconOption.String()].GetNumberValue()), Archived: details[bundle.RelationKeyIsArchived.String()].GetBoolValue(), @@ -562,7 +562,7 @@ func (s *ObjectService) GetTypeFromDetails(typeId string, details []*model.Objec return Type{ Object: "type", Id: typeId, - TypeKey: objectTypeDetail.Fields[bundle.RelationKeyUniqueKey.String()].GetStringValue(), + Key: objectTypeDetail.Fields[bundle.RelationKeyUniqueKey.String()].GetStringValue(), Name: objectTypeDetail.Fields[bundle.RelationKeyName.String()].GetStringValue(), Icon: util.GetIcon(s.AccountInfo, objectTypeDetail.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), "", objectTypeDetail.Fields[bundle.RelationKeyIconName.String()].GetStringValue(), objectTypeDetail.Fields[bundle.RelationKeyIconOption.String()].GetNumberValue()), RecommendedLayout: model.ObjectTypeLayout_name[int32(objectTypeDetail.Fields[bundle.RelationKeyRecommendedLayout.String()].GetNumberValue())], diff --git a/core/api/internal/object/service_test.go b/core/api/internal/object/service_test.go index 5bb40f904..e056dfba9 100644 --- a/core/api/internal/object/service_test.go +++ b/core/api/internal/object/service_test.go @@ -32,7 +32,6 @@ const ( mockedTypeKey = "ot-page" mockedTypeId = "mocked-type-id" mockedTypeName = "mocked-type-name" - mockedTypeUniqueKey = "mocked-type-unique-key" mockedTypeIcon = "📝" mockedTemplateId = "mocked-template-id" mockedTemplateName = "mocked-template-name" @@ -161,7 +160,7 @@ func TestObjectService_ListObjects(t *testing.T) { Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String(mockedTypeId), bundle.RelationKeyName.String(): pbtypes.String(mockedTypeName), - bundle.RelationKeyUniqueKey.String(): pbtypes.String(mockedTypeUniqueKey), + bundle.RelationKeyUniqueKey.String(): pbtypes.String(mockedTypeKey), bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedTypeIcon), }, }, @@ -205,7 +204,7 @@ func TestObjectService_ListObjects(t *testing.T) { require.Len(t, objects, 1) require.Equal(t, mockedTypeId, objects[0].Type.Id) require.Equal(t, mockedTypeName, objects[0].Type.Name) - require.Equal(t, mockedTypeUniqueKey, objects[0].Type.TypeKey) + require.Equal(t, mockedTypeKey, objects[0].Type.Key) require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr(mockedTypeIcon)}, objects[0].Type.Icon) require.Equal(t, mockedObjectId, objects[0].Id) require.Equal(t, mockedObjectName, objects[0].Name) @@ -332,7 +331,7 @@ func TestObjectService_GetObject(t *testing.T) { Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String(mockedTypeId), bundle.RelationKeyName.String(): pbtypes.String(mockedTypeName), - bundle.RelationKeyUniqueKey.String(): pbtypes.String(mockedTypeUniqueKey), + bundle.RelationKeyUniqueKey.String(): pbtypes.String(mockedTypeKey), bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedTypeIcon), }, }, @@ -375,7 +374,7 @@ func TestObjectService_GetObject(t *testing.T) { require.Equal(t, "object", object.Object) require.Equal(t, mockedTypeId, object.Type.Id) require.Equal(t, mockedTypeName, object.Type.Name) - require.Equal(t, mockedTypeUniqueKey, object.Type.TypeKey) + require.Equal(t, mockedTypeKey, object.Type.Key) require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr(mockedTypeIcon)}, object.Type.Icon) require.Equal(t, mockedObjectId, object.Id) require.Equal(t, mockedObjectName, object.Name) @@ -481,7 +480,7 @@ func TestObjectService_CreateObject(t *testing.T) { Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String(mockedTypeId), bundle.RelationKeyName.String(): pbtypes.String(mockedTypeName), - bundle.RelationKeyUniqueKey.String(): pbtypes.String(mockedTypeUniqueKey), + bundle.RelationKeyUniqueKey.String(): pbtypes.String(mockedTypeKey), bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedTypeIcon), }, }, @@ -504,7 +503,7 @@ func TestObjectService_CreateObject(t *testing.T) { require.Equal(t, "object", object.Object) require.Equal(t, mockedTypeId, object.Type.Id) require.Equal(t, mockedTypeName, object.Type.Name) - require.Equal(t, mockedTypeUniqueKey, object.Type.TypeKey) + require.Equal(t, mockedTypeKey, object.Type.Key) require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr(mockedTypeIcon)}, object.Type.Icon) require.Equal(t, mockedNewObjectId, object.Id) require.Equal(t, mockedObjectName, object.Name) @@ -563,7 +562,7 @@ func TestObjectService_ListTypes(t *testing.T) { require.Len(t, types, 1) require.Equal(t, "type-1", types[0].Id) require.Equal(t, "Type One", types[0].Name) - require.Equal(t, "type-one-key", types[0].TypeKey) + require.Equal(t, "type-one-key", types[0].Key) require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr("🗂️")}, types[0].Icon) require.Equal(t, 1, total) require.False(t, hasMore) @@ -609,7 +608,7 @@ func TestObjectService_GetType(t *testing.T) { Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String(mockedTypeId), bundle.RelationKeyName.String(): pbtypes.String(mockedTypeName), - bundle.RelationKeyUniqueKey.String(): pbtypes.String(mockedTypeUniqueKey), + bundle.RelationKeyUniqueKey.String(): pbtypes.String(mockedTypeKey), bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedTypeIcon), bundle.RelationKeyRecommendedLayout.String(): pbtypes.Float64(float64(model.ObjectType_basic)), }, @@ -626,7 +625,7 @@ func TestObjectService_GetType(t *testing.T) { require.NoError(t, err) require.Equal(t, mockedTypeId, objType.Id) require.Equal(t, mockedTypeName, objType.Name) - require.Equal(t, mockedTypeUniqueKey, objType.TypeKey) + require.Equal(t, mockedTypeKey, objType.Key) require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr(mockedTypeIcon)}, objType.Icon) require.Equal(t, model.ObjectTypeLayout_name[int32(model.ObjectType_basic)], objType.RecommendedLayout) }) diff --git a/core/api/internal/search/model.go b/core/api/internal/search/model.go index eab85f5ba..8f15f6790 100644 --- a/core/api/internal/search/model.go +++ b/core/api/internal/search/model.go @@ -18,7 +18,7 @@ const ( type SearchRequest struct { Query string `json:"query" example:"test"` // The search term to look for in object names and snippets - Types []string `json:"types" example:"ot-page,ot-678043f0cda9133be777049f,bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"` // The types of objects to search for, specified by unique key or ID + Types []string `json:"types" example:"ot-page,ot-678043f0cda9133be777049f,bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"` // The types of objects to search for, specified by key or ID Sort SortOptions `json:"sort"` // The sorting criteria and direction for the search results } From ea579b05052260d1f3096708851a0cafd0b91fd1 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Tue, 25 Mar 2025 21:44:51 +0100 Subject: [PATCH 090/132] GO-5365: rename param Signed-off-by: AnastasiaShemyakinskaya --- core/publish.go | 2 +- core/publish/service.go | 20 +- core/publish/service_test.go | 77 +- docs/proto.md | 2 +- pb/commands.pb.go | 2479 +++++++++++++++++----------------- pb/protos/commands.proto | 2 +- 6 files changed, 1298 insertions(+), 1284 deletions(-) diff --git a/core/publish.go b/core/publish.go index e5863df81..97184d531 100644 --- a/core/publish.go +++ b/core/publish.go @@ -9,7 +9,7 @@ import ( func (mw *Middleware) PublishingCreate(ctx context.Context, req *pb.RpcPublishingCreateRequest) *pb.RpcPublishingCreateResponse { publishService := mustService[publish.Service](mw) - res, err := publishService.Publish(ctx, req.SpaceId, req.ObjectId, req.Uri, req.JoinSpace) + res, err := publishService.Publish(ctx, req.SpaceId, req.ObjectId, req.Uri, req.IncludeSpaceInfo) code := mapErrorCode(err, errToCode(nil, pb.RpcPublishingCreateResponseError_NULL), errToCode(publish.ErrLimitExceeded, pb.RpcPublishingCreateResponseError_LIMIT_EXCEEDED), diff --git a/core/publish/service.go b/core/publish/service.go index 352ef9546..25f03bfff 100644 --- a/core/publish/service.go +++ b/core/publish/service.go @@ -124,7 +124,7 @@ func uniqName() string { return time.Now().Format("Anytype.WebPublish.20060102.150405.99") } -func (s *service) exportToDir(ctx context.Context, spaceId, pageId string) (dirEntries []fs.DirEntry, exportPath string, err error) { +func (s *service) exportToDir(ctx context.Context, spaceId, pageId string, includeSpaceInfo bool) (dirEntries []fs.DirEntry, exportPath string, err error) { tempDir := os.TempDir() exportPath, _, err = s.exportService.Export(ctx, pb.RpcObjectListExportRequest{ SpaceId: spaceId, @@ -137,7 +137,7 @@ func (s *service) exportToDir(ctx context.Context, spaceId, pageId string) (dirE NoProgress: true, IncludeNested: true, IncludeBacklinks: true, - IncludeSpace: true, + IncludeSpace: includeSpaceInfo, LinksStateFilters: &pb.RpcObjectListExportStateFilters{ RelationsWhiteList: relationsWhiteListToPbModel(), RemoveBlocks: true, @@ -154,8 +154,8 @@ func (s *service) exportToDir(ctx context.Context, spaceId, pageId string) (dirE return } -func (s *service) publishToPublishServer(ctx context.Context, spaceId, pageId, uri, globalName string, joinSpace bool) (err error) { - dirEntries, exportPath, err := s.exportToDir(ctx, spaceId, pageId) +func (s *service) publishToPublishServer(ctx context.Context, spaceId, pageId, uri, globalName string, includeSpaceInfo bool) (err error) { + dirEntries, exportPath, err := s.exportToDir(ctx, spaceId, pageId, includeSpaceInfo) if err != nil { return err } @@ -182,7 +182,7 @@ func (s *service) publishToPublishServer(ctx context.Context, spaceId, pageId, u return err } - err = s.applyInviteLink(ctx, spc, &uberSnapshot, joinSpace) + err = s.applyInviteLink(ctx, spc, &uberSnapshot, includeSpaceInfo) if err != nil { return err } @@ -190,7 +190,7 @@ func (s *service) publishToPublishServer(ctx context.Context, spaceId, pageId, u return err } - version, err := s.evaluateDocumentVersion(ctx, spc, pageId, joinSpace) + version, err := s.evaluateDocumentVersion(ctx, spc, pageId, includeSpaceInfo) if err != nil { return err } @@ -210,8 +210,8 @@ func (s *service) publishToPublishServer(ctx context.Context, spaceId, pageId, u return nil } -func (s *service) applyInviteLink(ctx context.Context, spc clientspace.Space, snapshot *PublishingUberSnapshot, joinSpace bool) error { - inviteLink, err := s.extractInviteLink(ctx, spc.Id(), joinSpace, spc.IsPersonal()) +func (s *service) applyInviteLink(ctx context.Context, spc clientspace.Space, snapshot *PublishingUberSnapshot, includeSpaceInfo bool) error { + inviteLink, err := s.extractInviteLink(ctx, spc.Id(), includeSpaceInfo, spc.IsPersonal()) if err != nil { return err } @@ -406,11 +406,11 @@ func (s *service) getPublishLimit(globalName string) (int64, error) { return defaultLimit, nil } -func (s *service) Publish(ctx context.Context, spaceId, pageId, uri string, joinSpace bool) (res PublishResult, err error) { +func (s *service) Publish(ctx context.Context, spaceId, pageId, uri string, includeSpaceInfo bool) (res PublishResult, err error) { identity, _, details := s.identityService.GetMyProfileDetails(ctx) globalName := details.GetString(bundle.RelationKeyGlobalName) - err = s.publishToPublishServer(ctx, spaceId, pageId, uri, globalName, joinSpace) + err = s.publishToPublishServer(ctx, spaceId, pageId, uri, globalName, includeSpaceInfo) if err != nil { log.Error("Failed to publish", zap.Error(err)) diff --git a/core/publish/service_test.go b/core/publish/service_test.go index c671dcf48..2b063eee9 100644 --- a/core/publish/service_test.go +++ b/core/publish/service_test.go @@ -139,7 +139,9 @@ func TestPublish(t *testing.T) { t.Run("success", func(t *testing.T) { // given isPersonal := true - spaceService, err := prepareSpaceService(t, isPersonal) + includeSpaceInfo := false + + spaceService, err := prepareSpaceService(t, isPersonal, includeSpaceInfo) objectTypeId := "customObjectType" expectedUri := "test" @@ -159,7 +161,7 @@ func TestPublish(t *testing.T) { identityService := mock_identity.NewMockService(t) identityService.EXPECT().GetMyProfileDetails(context.Background()).Return("identity", nil, domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{})) - exp := prepareExporter(t, objectTypeId, spaceService) + exp := prepareExporter(t, objectTypeId, spaceService, includeSpaceInfo) svc := &service{ spaceService: spaceService, @@ -169,7 +171,7 @@ func TestPublish(t *testing.T) { } // when - publish, err := svc.Publish(context.Background(), spaceId, objectId, expectedUri, false) + publish, err := svc.Publish(context.Background(), spaceId, objectId, expectedUri, includeSpaceInfo) // then assert.NoError(t, err) @@ -182,7 +184,9 @@ func TestPublish(t *testing.T) { t.Run("success with space sharing", func(t *testing.T) { // given isPersonal := false - spaceService, err := prepareSpaceService(t, isPersonal) + includeSpaceInfo := true + + spaceService, err := prepareSpaceService(t, isPersonal, includeSpaceInfo) objectTypeId := "customObjectType" expectedUri := "test" @@ -206,7 +210,7 @@ func TestPublish(t *testing.T) { identityService := mock_identity.NewMockService(t) identityService.EXPECT().GetMyProfileDetails(context.Background()).Return("identity", nil, domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{})) - exp := prepareExporter(t, objectTypeId, spaceService) + exp := prepareExporter(t, objectTypeId, spaceService, includeSpaceInfo) inviteService := mock_inviteservice.NewMockInviteService(t) inviteService.EXPECT().GetCurrent(context.Background(), "spaceId").Return(domain.InviteInfo{ @@ -223,7 +227,7 @@ func TestPublish(t *testing.T) { } // when - publish, err := svc.Publish(context.Background(), spaceId, objectId, expectedUri, true) + publish, err := svc.Publish(context.Background(), spaceId, objectId, expectedUri, includeSpaceInfo) // then assert.NoError(t, err) @@ -235,7 +239,9 @@ func TestPublish(t *testing.T) { }) t.Run("success with space sharing - invite not exists", func(t *testing.T) { isPersonal := false - spaceService, err := prepareSpaceService(t, isPersonal) + includeSpaceInfo := true + + spaceService, err := prepareSpaceService(t, isPersonal, includeSpaceInfo) objectTypeId := "customObjectType" expectedUri := "test" @@ -256,7 +262,7 @@ func TestPublish(t *testing.T) { identityService := mock_identity.NewMockService(t) identityService.EXPECT().GetMyProfileDetails(context.Background()).Return("identity", nil, domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{})) - exp := prepareExporter(t, objectTypeId, spaceService) + exp := prepareExporter(t, objectTypeId, spaceService, includeSpaceInfo) inviteService := mock_inviteservice.NewMockInviteService(t) inviteService.EXPECT().GetCurrent(context.Background(), "spaceId").Return(domain.InviteInfo{}, inviteservice.ErrInviteNotExists) @@ -270,7 +276,7 @@ func TestPublish(t *testing.T) { } // when - publish, err := svc.Publish(context.Background(), spaceId, objectId, expectedUri, true) + publish, err := svc.Publish(context.Background(), spaceId, objectId, expectedUri, includeSpaceInfo) // then assert.NoError(t, err) @@ -283,7 +289,8 @@ func TestPublish(t *testing.T) { t.Run("success for member", func(t *testing.T) { // given isPersonal := false - spaceService, err := prepareSpaceService(t, isPersonal) + includeSpaceInfo := true + spaceService, err := prepareSpaceService(t, isPersonal, includeSpaceInfo) objectTypeId := "customObjectType" expectedUri := "test" @@ -311,7 +318,7 @@ func TestPublish(t *testing.T) { }, } - exp := prepareExporter(t, objectTypeId, spaceService) + exp := prepareExporter(t, objectTypeId, spaceService, includeSpaceInfo) inviteService := mock_inviteservice.NewMockInviteService(t) inviteService.EXPECT().GetCurrent(context.Background(), "spaceId").Return(domain.InviteInfo{ @@ -328,7 +335,7 @@ func TestPublish(t *testing.T) { } // when - publish, err := svc.Publish(context.Background(), spaceId, objectId, expectedUri, true) + publish, err := svc.Publish(context.Background(), spaceId, objectId, expectedUri, includeSpaceInfo) // then assert.NoError(t, err) @@ -341,7 +348,9 @@ func TestPublish(t *testing.T) { t.Run("internal error", func(t *testing.T) { // given isPersonal := true - spaceService, err := prepareSpaceService(t, isPersonal) + includeSpaceInfo := true + + spaceService, err := prepareSpaceService(t, isPersonal, includeSpaceInfo) objectTypeId := "customObjectType" expectedUri := "test" @@ -363,7 +372,7 @@ func TestPublish(t *testing.T) { expectedErr: fmt.Errorf("internal error"), } - exp := prepareExporter(t, objectTypeId, spaceService) + exp := prepareExporter(t, objectTypeId, spaceService, includeSpaceInfo) svc := &service{ spaceService: spaceService, @@ -373,7 +382,7 @@ func TestPublish(t *testing.T) { } // when - publish, err := svc.Publish(context.Background(), spaceId, objectId, expectedUri, true) + publish, err := svc.Publish(context.Background(), spaceId, objectId, expectedUri, includeSpaceInfo) // then assert.Error(t, err) @@ -666,7 +675,7 @@ func TestService_PublishingList(t *testing.T) { var ctx = context.Background() -func prepareSpaceService(t *testing.T, isPersonal bool) (*mock_space.MockService, error) { +func prepareSpaceService(t *testing.T, isPersonal bool, includeSpaceInfo bool) (*mock_space.MockService, error) { spaceService := mock_space.NewMockService(t) space := mock_clientspace.NewMockSpace(t) ctrl := gomock.NewController(t) @@ -678,12 +687,14 @@ func prepareSpaceService(t *testing.T, isPersonal bool) (*mock_space.MockService st.EXPECT().TreeStorage(mock.Anything, mock.Anything).Return(mockSt, nil) mockSt.EXPECT().Heads(gomock.Any()).Return([]string{"heads"}, nil) space.EXPECT().Storage().Return(st) - space.EXPECT().DerivedIDs().Return(threads.DerivedSmartblockIds{Workspace: workspaceId}) + if includeSpaceInfo { + space.EXPECT().DerivedIDs().Return(threads.DerivedSmartblockIds{Workspace: workspaceId}) + } spaceService.EXPECT().Get(context.Background(), spaceId).Return(space, nil) return spaceService, nil } -func prepareExporter(t *testing.T, objectTypeId string, spaceService *mock_space.MockService) export.Export { +func prepareExporter(t *testing.T, objectTypeId string, spaceService *mock_space.MockService, includeSpaceInfo bool) export.Export { storeFixture := objectstore.NewStoreFixture(t) objectTypeUniqueKey, err := domain.NewUniqueKey(smartblock.SmartBlockTypeObjectType, objectTypeId) assert.Nil(t, err) @@ -740,23 +751,25 @@ func prepareExporter(t *testing.T, objectTypeId string, spaceService *mock_space objectType.Doc = objectTypeDoc objectType.SetType(smartblock.SmartBlockTypeObjectType) - workspaceTest := smarttest.New(workspaceId) - workspaceDoc := workspaceTest.NewState().SetDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ - bundle.RelationKeyId: domain.String(workspaceId), - bundle.RelationKeyType: domain.String(objectTypeId), - })) - workspaceDoc.AddRelationLinks(&model.RelationLink{ - Key: bundle.RelationKeyId.String(), - Format: model.RelationFormat_longtext, - }, &model.RelationLink{ - Key: bundle.RelationKeyType.String(), - Format: model.RelationFormat_longtext, - }) - workspaceTest.Doc = workspaceDoc + if includeSpaceInfo { + workspaceTest := smarttest.New(workspaceId) + workspaceDoc := workspaceTest.NewState().SetDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ + bundle.RelationKeyId: domain.String(workspaceId), + bundle.RelationKeyType: domain.String(objectTypeId), + })) + workspaceDoc.AddRelationLinks(&model.RelationLink{ + Key: bundle.RelationKeyId.String(), + Format: model.RelationFormat_longtext, + }, &model.RelationLink{ + Key: bundle.RelationKeyType.String(), + Format: model.RelationFormat_longtext, + }) + workspaceTest.Doc = workspaceDoc + objectGetter.EXPECT().GetObject(context.Background(), workspaceId).Return(workspaceTest, nil) + } objectGetter.EXPECT().GetObject(context.Background(), objectId).Return(smartBlockTest, nil) objectGetter.EXPECT().GetObject(context.Background(), objectTypeId).Return(objectType, nil) - objectGetter.EXPECT().GetObject(context.Background(), workspaceId).Return(workspaceTest, nil) a := &app.App{} mockSender := mock_event.NewMockSender(t) diff --git a/docs/proto.md b/docs/proto.md index 76b9227fa..e33da4ba0 100644 --- a/docs/proto.md +++ b/docs/proto.md @@ -18984,7 +18984,7 @@ Available undo/redo operations | spaceId | [string](#string) | | | | objectId | [string](#string) | | | | uri | [string](#string) | | | -| joinSpace | [bool](#bool) | | | +| includeSpaceInfo | [bool](#bool) | | | diff --git a/pb/commands.pb.go b/pb/commands.pb.go index 1d09460b0..f7a94a818 100644 --- a/pb/commands.pb.go +++ b/pb/commands.pb.go @@ -20382,10 +20382,10 @@ func (m *RpcPublishingCreate) XXX_DiscardUnknown() { var xxx_messageInfo_RpcPublishingCreate proto.InternalMessageInfo type RpcPublishingCreateRequest struct { - SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` - ObjectId string `protobuf:"bytes,2,opt,name=objectId,proto3" json:"objectId,omitempty"` - Uri string `protobuf:"bytes,3,opt,name=uri,proto3" json:"uri,omitempty"` - JoinSpace bool `protobuf:"varint,4,opt,name=joinSpace,proto3" json:"joinSpace,omitempty"` + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + ObjectId string `protobuf:"bytes,2,opt,name=objectId,proto3" json:"objectId,omitempty"` + Uri string `protobuf:"bytes,3,opt,name=uri,proto3" json:"uri,omitempty"` + IncludeSpaceInfo bool `protobuf:"varint,4,opt,name=includeSpaceInfo,proto3" json:"includeSpaceInfo,omitempty"` } func (m *RpcPublishingCreateRequest) Reset() { *m = RpcPublishingCreateRequest{} } @@ -20442,9 +20442,9 @@ func (m *RpcPublishingCreateRequest) GetUri() string { return "" } -func (m *RpcPublishingCreateRequest) GetJoinSpace() bool { +func (m *RpcPublishingCreateRequest) GetIncludeSpaceInfo() bool { if m != nil { - return m.JoinSpace + return m.IncludeSpaceInfo } return false } @@ -76073,79 +76073,79 @@ func init() { func init() { proto.RegisterFile("pb/protos/commands.proto", fileDescriptor_8261c968b2e6f45c) } var fileDescriptor_8261c968b2e6f45c = []byte{ - // 21482 bytes of a gzipped FileDescriptorProto + // 21491 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7b, 0x98, 0x24, 0x49, 0x59, 0x37, 0x3a, 0x95, 0x59, 0x55, 0xdd, 0x1d, 0x7d, 0x99, 0x9c, 0xdc, 0xd9, 0x61, 0x36, 0x59, 0x66, 0xd7, 0xd9, 0x65, 0x59, 0x97, 0xa5, 0x17, 0x16, 0x44, 0x76, 0xd9, 0x65, 0xa9, 0xae, 0xca, - 0xee, 0xae, 0xdd, 0xea, 0xaa, 0x26, 0xab, 0x7a, 0x66, 0xc7, 0xef, 0x78, 0xda, 0x9c, 0xaa, 0xe8, - 0xee, 0xdc, 0xa9, 0xce, 0x2c, 0x32, 0xb3, 0x67, 0xb6, 0x39, 0xcf, 0x77, 0x3e, 0x11, 0x57, 0x40, - 0x44, 0x44, 0x45, 0x45, 0xe4, 0xb6, 0x08, 0x08, 0xc8, 0xfd, 0xf6, 0x81, 0x72, 0x91, 0x8b, 0x20, - 0xa2, 0xa2, 0x78, 0x01, 0x94, 0x23, 0x5e, 0x50, 0xfc, 0x8e, 0x1e, 0x3f, 0x3c, 0x0a, 0xe2, 0x27, - 0x7a, 0x9e, 0xb8, 0x64, 0x66, 0x44, 0x75, 0x65, 0x56, 0x64, 0x75, 0x65, 0xf5, 0xa2, 0xe7, 0xaf, - 0xaa, 0x8c, 0x8c, 0x7c, 0xe3, 0x8d, 0xf7, 0xf7, 0x46, 0xc4, 0x1b, 0x11, 0x6f, 0xbc, 0x01, 0x4e, - 0xf7, 0x2e, 0xde, 0xd6, 0x73, 0x1d, 0xdf, 0xf1, 0x6e, 0x6b, 0x3b, 0xbb, 0xbb, 0xa6, 0xdd, 0xf1, - 0x16, 0xf1, 0xb3, 0x3a, 0x65, 0xda, 0xfb, 0xfe, 0x7e, 0x0f, 0x6a, 0x37, 0xf6, 0x2e, 0x6d, 0xdf, - 0xd6, 0xb5, 0x2e, 0xde, 0xd6, 0xbb, 0x78, 0xdb, 0xae, 0xd3, 0x81, 0xdd, 0xe0, 0x03, 0xfc, 0x40, - 0xb3, 0x6b, 0x37, 0xc7, 0xe5, 0xea, 0x3a, 0x6d, 0xb3, 0xeb, 0xf9, 0x8e, 0x0b, 0x69, 0xce, 0x53, - 0x51, 0x91, 0xf0, 0x32, 0xb4, 0xfd, 0x80, 0xc2, 0xb5, 0xdb, 0x8e, 0xb3, 0xdd, 0x85, 0xe4, 0xdd, - 0xc5, 0xbd, 0xad, 0xdb, 0x3c, 0xdf, 0xdd, 0x6b, 0xfb, 0xf4, 0xed, 0xf5, 0xfd, 0x6f, 0x3b, 0xd0, - 0x6b, 0xbb, 0x56, 0xcf, 0x77, 0x5c, 0x92, 0xe3, 0xec, 0x07, 0x7f, 0x77, 0x1a, 0xc8, 0x46, 0xaf, - 0xad, 0x7d, 0x63, 0x0a, 0xc8, 0xa5, 0x5e, 0x4f, 0xfb, 0xa4, 0x04, 0xc0, 0x0a, 0xf4, 0xcf, 0x41, - 0xd7, 0xb3, 0x1c, 0x5b, 0x3b, 0x0e, 0xa6, 0x0c, 0xf8, 0xec, 0x3d, 0xe8, 0xf9, 0x77, 0xe6, 0x5f, - 0xf0, 0x57, 0x72, 0x4e, 0x7b, 0xbd, 0x04, 0xa6, 0x0d, 0xe8, 0xf5, 0x1c, 0xdb, 0x83, 0xea, 0x33, - 0x41, 0x01, 0xba, 0xae, 0xe3, 0x9e, 0xce, 0x5d, 0x9f, 0xbb, 0x79, 0xf6, 0xf6, 0x5b, 0x16, 0x69, - 0xf5, 0x17, 0x8d, 0x5e, 0x7b, 0xb1, 0xd4, 0xeb, 0x2d, 0x46, 0x94, 0x16, 0x83, 0x8f, 0x16, 0x75, - 0xf4, 0x85, 0x41, 0x3e, 0x54, 0x4f, 0x83, 0xa9, 0xcb, 0x24, 0xc3, 0x69, 0xe9, 0xfa, 0xdc, 0xcd, - 0x33, 0x46, 0xf0, 0x88, 0xde, 0x74, 0xa0, 0x6f, 0x5a, 0x5d, 0xef, 0xb4, 0x4c, 0xde, 0xd0, 0x47, - 0xed, 0xe1, 0x1c, 0x28, 0x60, 0x22, 0x6a, 0x19, 0xe4, 0xdb, 0x4e, 0x07, 0xe2, 0xe2, 0x17, 0x6e, - 0xbf, 0x4d, 0xbc, 0xf8, 0xc5, 0xb2, 0xd3, 0x81, 0x06, 0xfe, 0x58, 0xbd, 0x1e, 0xcc, 0x06, 0x62, - 0x89, 0xd8, 0x60, 0x93, 0xce, 0xde, 0x0e, 0xf2, 0x28, 0xbf, 0x3a, 0x0d, 0xf2, 0xf5, 0x8d, 0x5a, - 0x4d, 0x39, 0xa6, 0x9e, 0x00, 0xf3, 0x1b, 0xf5, 0xfb, 0xea, 0x8d, 0xf3, 0xf5, 0x4d, 0xdd, 0x30, - 0x1a, 0x86, 0x92, 0x53, 0xe7, 0xc1, 0xcc, 0x52, 0xa9, 0xb2, 0x59, 0xad, 0xaf, 0x6f, 0xb4, 0x14, - 0x49, 0x7b, 0x95, 0x0c, 0x16, 0x9a, 0xd0, 0xaf, 0xc0, 0xcb, 0x56, 0x1b, 0x36, 0x7d, 0xd3, 0x87, - 0xda, 0x4b, 0x72, 0xa1, 0x30, 0xd5, 0x0d, 0x54, 0x68, 0xf8, 0x8a, 0x56, 0xe0, 0xc9, 0x07, 0x2a, - 0xc0, 0x53, 0x58, 0xa4, 0x5f, 0x2f, 0x32, 0x69, 0x06, 0x4b, 0xe7, 0xec, 0x13, 0xc0, 0x2c, 0xf3, - 0x4e, 0x5d, 0x00, 0x60, 0xa9, 0x54, 0xbe, 0x6f, 0xc5, 0x68, 0x6c, 0xd4, 0x2b, 0xca, 0x31, 0xf4, - 0xbc, 0xdc, 0x30, 0x74, 0xfa, 0x9c, 0xd3, 0xbe, 0x95, 0x63, 0xc0, 0xac, 0xf0, 0x60, 0x2e, 0x0e, - 0x67, 0x66, 0x00, 0xa0, 0xda, 0x1b, 0x42, 0x70, 0x56, 0x38, 0x70, 0x9e, 0x9c, 0x8e, 0x5c, 0xf6, - 0x00, 0x3d, 0x24, 0x81, 0xe9, 0xe6, 0xce, 0x9e, 0xdf, 0x71, 0xae, 0xd8, 0xda, 0x4c, 0x88, 0x8c, - 0xf6, 0x77, 0xac, 0x4c, 0x9e, 0xc1, 0xcb, 0xe4, 0xe6, 0x83, 0x95, 0xa0, 0x14, 0x62, 0xa4, 0xf1, - 0x9a, 0x50, 0x1a, 0x25, 0x4e, 0x1a, 0x4f, 0x10, 0x25, 0x94, 0xbd, 0x1c, 0xbe, 0x70, 0x17, 0x28, - 0x34, 0x7b, 0x66, 0x1b, 0x6a, 0x9f, 0x95, 0xc1, 0x5c, 0x0d, 0x9a, 0x97, 0x61, 0xa9, 0xd7, 0x73, - 0x9d, 0xcb, 0x50, 0x2b, 0x47, 0xfa, 0x7a, 0x1a, 0x4c, 0x79, 0x28, 0x53, 0xb5, 0x83, 0x6b, 0x30, - 0x63, 0x04, 0x8f, 0xea, 0x19, 0x00, 0xac, 0x0e, 0xb4, 0x7d, 0xcb, 0xb7, 0xa0, 0x77, 0x5a, 0xba, - 0x5e, 0xbe, 0x79, 0xc6, 0x60, 0x52, 0xb4, 0x6f, 0x48, 0xa2, 0x3a, 0x86, 0xb9, 0x58, 0x64, 0x39, - 0x88, 0x91, 0xea, 0xeb, 0x24, 0x11, 0x1d, 0x1b, 0x4a, 0x2e, 0x9d, 0x6c, 0xdf, 0x96, 0x4b, 0x2f, - 0x5c, 0x94, 0xa3, 0xde, 0xd8, 0x6c, 0x6e, 0x94, 0x57, 0x37, 0x9b, 0xeb, 0xa5, 0xb2, 0xae, 0x40, - 0xf5, 0x24, 0x50, 0xf0, 0xdf, 0xcd, 0x6a, 0x73, 0xb3, 0xa2, 0xd7, 0xf4, 0x96, 0x5e, 0x51, 0xb6, - 0x54, 0x15, 0x2c, 0x18, 0xfa, 0xb3, 0x36, 0xf4, 0x66, 0x6b, 0x73, 0xb9, 0x54, 0xad, 0xe9, 0x15, - 0x65, 0x1b, 0x7d, 0x5c, 0xab, 0xae, 0x55, 0x5b, 0x9b, 0x86, 0x5e, 0x2a, 0xaf, 0xea, 0x15, 0x65, - 0x47, 0x7d, 0x14, 0xb8, 0xaa, 0xde, 0xd8, 0x2c, 0xad, 0xaf, 0x1b, 0x8d, 0x73, 0xfa, 0x26, 0xfd, - 0xa2, 0xa9, 0x58, 0xa4, 0xa0, 0xd6, 0x66, 0x73, 0xb5, 0x64, 0xe8, 0xa5, 0xa5, 0x9a, 0xae, 0x3c, - 0xa0, 0x3d, 0x4f, 0x06, 0xf3, 0x6b, 0xe6, 0x25, 0xd8, 0xdc, 0x31, 0x5d, 0x68, 0x5e, 0xec, 0x42, - 0xed, 0x06, 0x01, 0x3c, 0xb5, 0xcf, 0xb2, 0x78, 0xe9, 0x3c, 0x5e, 0xb7, 0x0d, 0x10, 0x30, 0x57, - 0x44, 0x0c, 0x60, 0xff, 0x1c, 0x36, 0x83, 0x55, 0x0e, 0xb0, 0xa7, 0xa4, 0xa4, 0x97, 0x0e, 0xb1, - 0x1f, 0x7a, 0x04, 0x20, 0xa6, 0x7d, 0x31, 0x0f, 0x16, 0xaa, 0xf6, 0x65, 0xcb, 0x87, 0x2b, 0xd0, - 0x86, 0x2e, 0x1a, 0x07, 0x5e, 0x95, 0x13, 0x69, 0x57, 0x2d, 0x00, 0x2c, 0xfc, 0x5d, 0x6b, 0xbf, - 0x07, 0x71, 0xf5, 0x06, 0xcb, 0x8b, 0x27, 0x1e, 0x0e, 0x11, 0xd5, 0xf0, 0x5b, 0x83, 0xa1, 0x73, - 0xf6, 0x06, 0x00, 0xa2, 0x37, 0x2a, 0x00, 0xc5, 0x35, 0xb8, 0x7b, 0x11, 0xba, 0xca, 0x31, 0x75, - 0x06, 0x14, 0x56, 0xd0, 0x97, 0x4a, 0x4e, 0x7b, 0xbd, 0xcc, 0xa8, 0xc0, 0x32, 0xaf, 0x02, 0x4f, - 0x14, 0x61, 0x61, 0xd0, 0x48, 0x7f, 0x2d, 0x98, 0x21, 0x7c, 0x94, 0xad, 0x0e, 0x45, 0x2b, 0x4a, - 0x50, 0x6f, 0x04, 0xf3, 0xe4, 0x61, 0xd9, 0xea, 0xc2, 0xfb, 0xe0, 0x3e, 0x1d, 0xf3, 0xf9, 0x44, - 0xed, 0xc7, 0xc2, 0x86, 0x5f, 0xe5, 0xf4, 0xe8, 0x7b, 0xd2, 0x32, 0x95, 0x4e, 0x91, 0x5e, 0xf6, - 0x48, 0x68, 0xfa, 0x07, 0x5a, 0xb8, 0xa5, 0x7d, 0x5b, 0x02, 0xb3, 0x4d, 0xdf, 0xe9, 0xa1, 0xe6, - 0x62, 0xd9, 0xdb, 0x62, 0xed, 0xfb, 0xd3, 0x6c, 0xfb, 0x2e, 0xf3, 0xe0, 0x3e, 0x61, 0x80, 0x1c, - 0x99, 0x02, 0x62, 0x5a, 0xf7, 0x37, 0xc2, 0xd6, 0xbd, 0xcc, 0xa1, 0x72, 0x7b, 0x2a, 0x6a, 0xdf, - 0x81, 0x6d, 0xfb, 0x65, 0x32, 0x50, 0x02, 0x35, 0xf3, 0xcb, 0x7b, 0xae, 0x0b, 0x6d, 0x5f, 0x0c, - 0x84, 0x3f, 0x66, 0x41, 0x58, 0xe5, 0x41, 0xb8, 0x3d, 0x41, 0x99, 0x83, 0x52, 0x32, 0x6c, 0x63, - 0x1f, 0x0d, 0xd1, 0xbc, 0x8f, 0x43, 0xf3, 0x7b, 0xd3, 0xb3, 0x95, 0x0e, 0xd2, 0xd5, 0x11, 0x10, + 0xee, 0xae, 0xdd, 0xea, 0xaa, 0x26, 0xab, 0x7a, 0x66, 0xc7, 0xef, 0x78, 0xfa, 0xcb, 0xa9, 0x8a, + 0xee, 0xce, 0x9d, 0xea, 0xcc, 0x22, 0x33, 0x7b, 0x66, 0x9b, 0xf3, 0x7c, 0xe7, 0x13, 0x71, 0x05, + 0x44, 0x44, 0x54, 0x54, 0x44, 0x6e, 0x8b, 0x80, 0x80, 0xdc, 0x6f, 0x1f, 0x28, 0xa0, 0x5c, 0x04, + 0x11, 0x11, 0xc5, 0x0b, 0xa0, 0x1c, 0xf1, 0x82, 0xe2, 0x77, 0xf4, 0xf8, 0xe1, 0x51, 0x10, 0x15, + 0x3d, 0x4f, 0x5c, 0x32, 0x33, 0xa2, 0xba, 0x32, 0x2b, 0xb2, 0xba, 0xb2, 0x7a, 0xd1, 0xf3, 0x57, + 0x55, 0x46, 0x46, 0xbe, 0xf1, 0xc6, 0xfb, 0x7b, 0x23, 0xe2, 0x8d, 0x88, 0x37, 0xde, 0x00, 0xa7, + 0x7b, 0x17, 0x6f, 0xeb, 0xb9, 0x8e, 0xef, 0x78, 0xb7, 0xb5, 0x9d, 0xdd, 0x5d, 0xd3, 0xee, 0x78, + 0x8b, 0xf8, 0x59, 0x9d, 0x32, 0xed, 0x7d, 0x7f, 0xbf, 0x07, 0xb5, 0x1b, 0x7b, 0x97, 0xb6, 0x6f, + 0xeb, 0x5a, 0x17, 0x6f, 0xeb, 0x5d, 0xbc, 0x6d, 0xd7, 0xe9, 0xc0, 0x6e, 0xf0, 0x01, 0x7e, 0xa0, + 0xd9, 0xb5, 0x9b, 0xe3, 0x72, 0x75, 0x9d, 0xb6, 0xd9, 0xf5, 0x7c, 0xc7, 0x85, 0x34, 0xe7, 0xa9, + 0xa8, 0x48, 0x78, 0x19, 0xda, 0x7e, 0x40, 0xe1, 0xda, 0x6d, 0xc7, 0xd9, 0xee, 0x42, 0xf2, 0xee, + 0xe2, 0xde, 0xd6, 0x6d, 0x9e, 0xef, 0xee, 0xb5, 0x7d, 0xfa, 0xf6, 0xfa, 0xfe, 0xb7, 0x1d, 0xe8, + 0xb5, 0x5d, 0xab, 0xe7, 0x3b, 0x2e, 0xc9, 0x71, 0xf6, 0x53, 0xbf, 0x33, 0x0d, 0x64, 0xa3, 0xd7, + 0xd6, 0xbe, 0x31, 0x05, 0xe4, 0x52, 0xaf, 0xa7, 0x7d, 0x42, 0x02, 0x60, 0x05, 0xfa, 0xe7, 0xa0, + 0xeb, 0x59, 0x8e, 0xad, 0x1d, 0x07, 0x53, 0x06, 0x7c, 0xf6, 0x1e, 0xf4, 0xfc, 0x3b, 0xf3, 0x2f, + 0xf8, 0x4b, 0x39, 0xa7, 0xbd, 0x5e, 0x02, 0xd3, 0x06, 0xf4, 0x7a, 0x8e, 0xed, 0x41, 0xf5, 0x99, + 0xa0, 0x00, 0x5d, 0xd7, 0x71, 0x4f, 0xe7, 0xae, 0xcf, 0xdd, 0x3c, 0x7b, 0xfb, 0x2d, 0x8b, 0xb4, + 0xfa, 0x8b, 0x46, 0xaf, 0xbd, 0x58, 0xea, 0xf5, 0x16, 0x23, 0x4a, 0x8b, 0xc1, 0x47, 0x8b, 0x3a, + 0xfa, 0xc2, 0x20, 0x1f, 0xaa, 0xa7, 0xc1, 0xd4, 0x65, 0x92, 0xe1, 0xb4, 0x74, 0x7d, 0xee, 0xe6, + 0x19, 0x23, 0x78, 0x44, 0x6f, 0x3a, 0xd0, 0x37, 0xad, 0xae, 0x77, 0x5a, 0x26, 0x6f, 0xe8, 0xa3, + 0xf6, 0x70, 0x0e, 0x14, 0x30, 0x11, 0xb5, 0x0c, 0xf2, 0x6d, 0xa7, 0x03, 0x71, 0xf1, 0x0b, 0xb7, + 0xdf, 0x26, 0x5e, 0xfc, 0x62, 0xd9, 0xe9, 0x40, 0x03, 0x7f, 0xac, 0x5e, 0x0f, 0x66, 0x03, 0xb1, + 0x44, 0x6c, 0xb0, 0x49, 0x67, 0x6f, 0x07, 0x79, 0x94, 0x5f, 0x9d, 0x06, 0xf9, 0xfa, 0x46, 0xad, + 0xa6, 0x1c, 0x53, 0x4f, 0x80, 0xf9, 0x8d, 0xfa, 0x7d, 0xf5, 0xc6, 0xf9, 0xfa, 0xa6, 0x6e, 0x18, + 0x0d, 0x43, 0xc9, 0xa9, 0xf3, 0x60, 0x66, 0xa9, 0x54, 0xd9, 0xac, 0xd6, 0xd7, 0x37, 0x5a, 0x8a, + 0xa4, 0xbd, 0x4a, 0x06, 0x0b, 0x4d, 0xe8, 0x57, 0xe0, 0x65, 0xab, 0x0d, 0x9b, 0xbe, 0xe9, 0x43, + 0xed, 0x25, 0xb9, 0x50, 0x98, 0xea, 0x06, 0x2a, 0x34, 0x7c, 0x45, 0x2b, 0xf0, 0xe4, 0x03, 0x15, + 0xe0, 0x29, 0x2c, 0xd2, 0xaf, 0x17, 0x99, 0x34, 0x83, 0xa5, 0x73, 0xf6, 0x09, 0x60, 0x96, 0x79, + 0xa7, 0x2e, 0x00, 0xb0, 0x54, 0x2a, 0xdf, 0xb7, 0x62, 0x34, 0x36, 0xea, 0x15, 0xe5, 0x18, 0x7a, + 0x5e, 0x6e, 0x18, 0x3a, 0x7d, 0xce, 0x69, 0xdf, 0xca, 0x31, 0x60, 0x56, 0x78, 0x30, 0x17, 0x87, + 0x33, 0x33, 0x00, 0x50, 0xed, 0x0d, 0x21, 0x38, 0x2b, 0x1c, 0x38, 0x4f, 0x4e, 0x47, 0x2e, 0x7b, + 0x80, 0x1e, 0x92, 0xc0, 0x74, 0x73, 0x67, 0xcf, 0xef, 0x38, 0x57, 0x6c, 0x6d, 0x26, 0x44, 0x46, + 0xfb, 0x5b, 0x56, 0x26, 0xcf, 0xe0, 0x65, 0x72, 0xf3, 0xc1, 0x4a, 0x50, 0x0a, 0x31, 0xd2, 0x78, + 0x4d, 0x28, 0x8d, 0x12, 0x27, 0x8d, 0x27, 0x88, 0x12, 0xca, 0x5e, 0x0e, 0x5f, 0xb8, 0x0b, 0x14, + 0x9a, 0x3d, 0xb3, 0x0d, 0xb5, 0xcf, 0xc8, 0x60, 0xae, 0x06, 0xcd, 0xcb, 0xb0, 0xd4, 0xeb, 0xb9, + 0xce, 0x65, 0xa8, 0x95, 0x23, 0x7d, 0x3d, 0x0d, 0xa6, 0x3c, 0x94, 0xa9, 0xda, 0xc1, 0x35, 0x98, + 0x31, 0x82, 0x47, 0xf5, 0x0c, 0x00, 0x56, 0x07, 0xda, 0xbe, 0xe5, 0x5b, 0xd0, 0x3b, 0x2d, 0x5d, + 0x2f, 0xdf, 0x3c, 0x63, 0x30, 0x29, 0xda, 0x37, 0x24, 0x51, 0x1d, 0xc3, 0x5c, 0x2c, 0xb2, 0x1c, + 0xc4, 0x48, 0xf5, 0x75, 0x92, 0x88, 0x8e, 0x0d, 0x25, 0x97, 0x4e, 0xb6, 0x6f, 0xcb, 0xa5, 0x17, + 0x2e, 0xca, 0x51, 0x6f, 0x6c, 0x36, 0x37, 0xca, 0xab, 0x9b, 0xcd, 0xf5, 0x52, 0x59, 0x57, 0xa0, + 0x7a, 0x12, 0x28, 0xf8, 0xef, 0x66, 0xb5, 0xb9, 0x59, 0xd1, 0x6b, 0x7a, 0x4b, 0xaf, 0x28, 0x5b, + 0xaa, 0x0a, 0x16, 0x0c, 0xfd, 0x59, 0x1b, 0x7a, 0xb3, 0xb5, 0xb9, 0x5c, 0xaa, 0xd6, 0xf4, 0x8a, + 0xb2, 0x8d, 0x3e, 0xae, 0x55, 0xd7, 0xaa, 0xad, 0x4d, 0x43, 0x2f, 0x95, 0x57, 0xf5, 0x8a, 0xb2, + 0xa3, 0x3e, 0x0a, 0x5c, 0x55, 0x6f, 0x6c, 0x96, 0xd6, 0xd7, 0x8d, 0xc6, 0x39, 0x7d, 0x93, 0x7e, + 0xd1, 0x54, 0x2c, 0x52, 0x50, 0x6b, 0xb3, 0xb9, 0x5a, 0x32, 0xf4, 0xd2, 0x52, 0x4d, 0x57, 0x1e, + 0xd0, 0x9e, 0x27, 0x83, 0xf9, 0x35, 0xf3, 0x12, 0x6c, 0xee, 0x98, 0x2e, 0x34, 0x2f, 0x76, 0xa1, + 0x76, 0x83, 0x00, 0x9e, 0xda, 0x67, 0x58, 0xbc, 0x74, 0x1e, 0xaf, 0xdb, 0x06, 0x08, 0x98, 0x2b, + 0x22, 0x06, 0xb0, 0x7f, 0x0a, 0x9b, 0xc1, 0x2a, 0x07, 0xd8, 0x53, 0x52, 0xd2, 0x4b, 0x87, 0xd8, + 0x0f, 0x3e, 0x02, 0x10, 0xd3, 0xbe, 0x98, 0x07, 0x0b, 0x55, 0xfb, 0xb2, 0xe5, 0xc3, 0x15, 0x68, + 0x43, 0x17, 0x8d, 0x03, 0xaf, 0xca, 0x89, 0xb4, 0xab, 0x16, 0x00, 0x16, 0xfe, 0xae, 0xb5, 0xdf, + 0x83, 0xb8, 0x7a, 0x83, 0xe5, 0xc5, 0x13, 0x0f, 0x87, 0x88, 0x6a, 0xf8, 0xad, 0xc1, 0xd0, 0x39, + 0x7b, 0x03, 0x00, 0xd1, 0x1b, 0x15, 0x80, 0xe2, 0x1a, 0xdc, 0xbd, 0x08, 0x5d, 0xe5, 0x98, 0x3a, + 0x03, 0x0a, 0x2b, 0xe8, 0x4b, 0x25, 0xa7, 0xbd, 0x5e, 0x66, 0x54, 0x60, 0x99, 0x57, 0x81, 0x27, + 0x8a, 0xb0, 0x30, 0x68, 0xa4, 0xbf, 0x16, 0xcc, 0x10, 0x3e, 0xca, 0x56, 0x87, 0xa2, 0x15, 0x25, + 0xa8, 0x37, 0x82, 0x79, 0xf2, 0xb0, 0x6c, 0x75, 0xe1, 0x7d, 0x70, 0x9f, 0x8e, 0xf9, 0x7c, 0xa2, + 0xf6, 0xa3, 0x61, 0xc3, 0xaf, 0x72, 0x7a, 0xf4, 0x3d, 0x69, 0x99, 0x4a, 0xa7, 0x48, 0x2f, 0x7b, + 0x24, 0x34, 0xfd, 0x03, 0x2d, 0xdc, 0xd2, 0xbe, 0x2d, 0x81, 0xd9, 0xa6, 0xef, 0xf4, 0x50, 0x73, + 0xb1, 0xec, 0x6d, 0xb1, 0xf6, 0xfd, 0x29, 0xb6, 0x7d, 0x97, 0x79, 0x70, 0x9f, 0x30, 0x40, 0x8e, + 0x4c, 0x01, 0x31, 0xad, 0xfb, 0x1b, 0x61, 0xeb, 0x5e, 0xe6, 0x50, 0xb9, 0x3d, 0x15, 0xb5, 0xef, + 0xc0, 0xb6, 0xfd, 0x32, 0x19, 0x28, 0x81, 0x9a, 0xf9, 0xe5, 0x3d, 0xd7, 0x85, 0xb6, 0x2f, 0x06, + 0xc2, 0x1f, 0xb1, 0x20, 0xac, 0xf2, 0x20, 0xdc, 0x9e, 0xa0, 0xcc, 0x41, 0x29, 0x19, 0xb6, 0xb1, + 0x5f, 0x0d, 0xd1, 0xbc, 0x8f, 0x43, 0xf3, 0x7b, 0xd3, 0xb3, 0x95, 0x0e, 0xd2, 0xd5, 0x11, 0x10, 0x3d, 0x09, 0x14, 0x34, 0x1e, 0x96, 0x5b, 0xd5, 0x73, 0xfa, 0x66, 0xb5, 0x7e, 0xae, 0xda, 0xd2, 0x15, 0xa8, 0xbd, 0x54, 0x8e, 0xfa, 0x5c, 0x1f, 0x77, 0x6a, 0x62, 0xa8, 0x7c, 0x51, 0x1a, 0xad, 0xdf, 0x23, 0x65, 0x4c, 0x04, 0x13, 0xf1, 0x7e, 0x6f, 0x20, 0x53, 0xe9, 0x10, 0xb9, 0x77, 0x04, 0x44, 0x4e, 0x01, 0xb5, 0x5a, 0x3f, 0x57, 0xaa, 0x55, 0x2b, 0xa4, 0x8d, 0x6d, 0xb6, 0x2e, 0xac, - 0x23, 0x4c, 0x7e, 0x4a, 0x06, 0x73, 0x84, 0x35, 0x03, 0x5e, 0x76, 0x2e, 0x09, 0x1a, 0x23, 0x5f, - 0x4e, 0x69, 0x3c, 0xb2, 0x25, 0xc4, 0xf4, 0x56, 0x3f, 0x9a, 0xc2, 0x78, 0x4c, 0x20, 0xf7, 0x48, - 0x1a, 0x41, 0x0e, 0x74, 0x4d, 0xdb, 0x03, 0x7a, 0xb0, 0x81, 0x23, 0xc8, 0xc7, 0xf3, 0x81, 0x3d, + 0x23, 0x4c, 0x7e, 0x52, 0x06, 0x73, 0x84, 0x35, 0x03, 0x5e, 0x76, 0x2e, 0x09, 0x1a, 0x23, 0x5f, + 0x4e, 0x69, 0x3c, 0xb2, 0x25, 0xc4, 0xf4, 0x56, 0x3f, 0x92, 0xc2, 0x78, 0x4c, 0x20, 0xf7, 0x48, + 0x1a, 0x41, 0x0e, 0x74, 0x4d, 0xdb, 0x03, 0x7a, 0xb0, 0x81, 0x23, 0xc8, 0xc7, 0xf2, 0x81, 0x3d, 0x70, 0xce, 0x82, 0x57, 0xb4, 0xb5, 0x08, 0x13, 0x4e, 0x6d, 0x73, 0x43, 0xd5, 0x56, 0x1a, 0xa4, 0xb6, 0x5f, 0x65, 0xed, 0x88, 0x25, 0x1e, 0xbd, 0x5b, 0x63, 0xc5, 0x8d, 0x38, 0x89, 0x5f, 0x2d, 0x08, 0x14, 0x45, 0xe2, 0xad, 0xa5, 0x6b, 0xc1, 0x0c, 0xfe, 0x5b, 0x37, 0x77, 0x21, 0x6d, 0x43, @@ -76157,8 +76157,8 @@ var fileDescriptor_8261c968b2e6f45c = []byte{ 0x8a, 0x51, 0x2a, 0xca, 0x5b, 0x6e, 0xd4, 0x5b, 0x7a, 0xbd, 0xa5, 0x6c, 0x0d, 0xd4, 0xbf, 0x6d, 0xed, 0x75, 0x79, 0x90, 0xbf, 0xd7, 0xb1, 0x6c, 0xed, 0xa1, 0x1c, 0xa7, 0x40, 0x36, 0xf4, 0xaf, 0x38, 0xee, 0xa5, 0xb0, 0x59, 0x47, 0x09, 0xc9, 0x48, 0x46, 0x8a, 0x27, 0x0f, 0x55, 0xbc, 0xfc, - 0x20, 0xc5, 0xfb, 0x49, 0x56, 0xf1, 0xee, 0xe2, 0x15, 0xef, 0xa6, 0x01, 0xf2, 0x47, 0xcc, 0xc7, - 0x74, 0x17, 0x9f, 0x0a, 0xbb, 0x8b, 0x7b, 0x38, 0x18, 0x1f, 0x2f, 0x46, 0x26, 0x1d, 0x80, 0x5f, + 0x20, 0xc5, 0xfb, 0x09, 0x56, 0xf1, 0xee, 0xe2, 0x15, 0xef, 0xa6, 0x01, 0xf2, 0x47, 0xcc, 0xc7, + 0x74, 0x17, 0x9f, 0x0c, 0xbb, 0x8b, 0x7b, 0x38, 0x18, 0x1f, 0x2f, 0x46, 0x26, 0x1d, 0x80, 0x5f, 0xca, 0xb4, 0x9b, 0x18, 0x04, 0xf5, 0x76, 0x0c, 0xd4, 0x3b, 0x03, 0x7a, 0x10, 0xeb, 0x60, 0x47, 0xf3, 0xc0, 0xc1, 0x4e, 0xe5, 0x92, 0x7a, 0x35, 0x38, 0x51, 0xa9, 0x2e, 0x2f, 0xeb, 0x86, 0x5e, 0x6f, 0x6d, 0xd6, 0xf5, 0xd6, 0xf9, 0x86, 0x71, 0x9f, 0xd2, 0xd5, 0x1e, 0x96, 0x01, 0x40, 0x12, @@ -76169,12 +76169,12 @@ var fileDescriptor_8261c968b2e6f45c = []byte{ 0xae, 0x80, 0xd9, 0x1e, 0x74, 0x77, 0x2d, 0xcf, 0xb3, 0x1c, 0x9b, 0x2c, 0xe7, 0x2e, 0xdc, 0xfe, 0xd8, 0x50, 0xe2, 0x78, 0xe5, 0x7b, 0x71, 0xdd, 0x74, 0x7d, 0xab, 0x6d, 0xf5, 0x4c, 0xdb, 0x5f, 0x8f, 0x32, 0x1b, 0xec, 0x97, 0xc8, 0xb0, 0x4b, 0x65, 0xa0, 0xf1, 0x35, 0x89, 0x51, 0x89, 0x5f, - 0x4d, 0x31, 0xa9, 0x4c, 0x24, 0x98, 0x4e, 0x2d, 0x3e, 0x99, 0xa9, 0x5a, 0x0c, 0xc0, 0x7b, 0x5b, + 0x49, 0x31, 0xa9, 0x4c, 0x24, 0x98, 0x4e, 0x2d, 0x3e, 0x91, 0xa9, 0x5a, 0x0c, 0xc0, 0x7b, 0x5b, 0xbd, 0x06, 0x5c, 0x5d, 0xad, 0x97, 0x1b, 0x86, 0xa1, 0x97, 0x5b, 0x9b, 0xeb, 0xba, 0xb1, 0x56, - 0x6d, 0x36, 0xab, 0x8d, 0x7a, 0xf3, 0x30, 0xad, 0x5d, 0xfb, 0x8c, 0x1c, 0x6a, 0x4c, 0x05, 0xb6, + 0x6d, 0x36, 0xab, 0x8d, 0x7a, 0xf3, 0x30, 0xad, 0x5d, 0xfb, 0xb4, 0x1c, 0x6a, 0x4c, 0x05, 0xb6, 0xbb, 0x96, 0x0d, 0xb5, 0x7b, 0x0e, 0xa9, 0x30, 0xfc, 0x9a, 0xa1, 0x38, 0xce, 0xb4, 0xfc, 0x18, 0x9c, 0x5f, 0x9b, 0x1e, 0xe7, 0xc1, 0x04, 0xff, 0x03, 0x37, 0xff, 0x2f, 0xcb, 0xe0, 0x04, 0xd3, - 0x10, 0x0d, 0xb8, 0x3b, 0xb6, 0x75, 0xe0, 0x1f, 0x62, 0xdb, 0x6e, 0x95, 0xc7, 0x74, 0x90, 0xed, + 0x10, 0x0d, 0xb8, 0x3b, 0xb6, 0x75, 0xe0, 0x1f, 0x64, 0xdb, 0x6e, 0x95, 0xc7, 0x74, 0x90, 0xed, 0x7d, 0x80, 0x8d, 0x18, 0x58, 0xdf, 0x1c, 0xc2, 0x5a, 0xe3, 0x60, 0x7d, 0xda, 0x08, 0x34, 0xd3, 0x21, 0xfb, 0x8e, 0x4c, 0x91, 0xbd, 0x06, 0x5c, 0xbd, 0x5e, 0x32, 0x5a, 0xd5, 0x72, 0x75, 0xbd, 0x84, 0xc6, 0x51, 0x66, 0xc8, 0x8e, 0x31, 0xee, 0x79, 0xd0, 0x07, 0xe2, 0xfb, 0x91, 0x3c, 0xb8, @@ -76183,26 +76183,26 @@ var fileDescriptor_8261c968b2e6f45c = []byte{ 0x2a, 0x44, 0x8b, 0x57, 0x88, 0x67, 0x24, 0x83, 0x77, 0x80, 0xef, 0x18, 0xdd, 0xf8, 0x5c, 0xa8, 0x1b, 0xe7, 0x39, 0xdd, 0x28, 0x1f, 0x8e, 0x7c, 0x3a, 0x35, 0xf9, 0xcd, 0x47, 0x42, 0x07, 0x10, 0xab, 0x4d, 0x56, 0xfc, 0xa8, 0x30, 0xb0, 0xbb, 0x7f, 0xb5, 0x0c, 0x8a, 0x15, 0xd8, 0x85, 0xbe, - 0xe0, 0x0c, 0xfe, 0xef, 0x25, 0xd1, 0xed, 0x34, 0x02, 0x03, 0xa1, 0x1d, 0xbf, 0x96, 0xe2, 0x5b, - 0xbb, 0xd0, 0xf3, 0xcd, 0xdd, 0x1e, 0x16, 0xb5, 0x6c, 0x44, 0x09, 0xda, 0x0f, 0x4b, 0x22, 0x9b, + 0xe0, 0x0c, 0xfe, 0xef, 0x24, 0xd1, 0xed, 0x34, 0x02, 0x03, 0xa1, 0x1d, 0xbf, 0x96, 0xe2, 0x5b, + 0xbb, 0xd0, 0xf3, 0xcd, 0xdd, 0x1e, 0x16, 0xb5, 0x6c, 0x44, 0x09, 0xda, 0x0f, 0x49, 0x22, 0x9b, 0x6d, 0x09, 0xc5, 0xfc, 0xc7, 0x58, 0x15, 0xfe, 0xbc, 0x04, 0xa6, 0x9b, 0xd0, 0x6f, 0xb8, 0x1d, 0xe8, 0x6a, 0xcd, 0x08, 0xa3, 0xeb, 0xc1, 0x2c, 0x06, 0x05, 0x4d, 0x33, 0x43, 0x9c, 0xd8, 0x24, 0xf5, 0x26, 0xb0, 0x10, 0x3e, 0xe2, 0xcf, 0x69, 0x37, 0xde, 0x97, 0xaa, 0x7d, 0x3d, 0x27, 0xea, 0x03, 0x40, 0x17, 0x7d, 0x29, 0x37, 0x31, 0xad, 0x54, 0x6c, 0x3f, 0x3f, 0x91, 0x54, 0xf6, 0xdb, - 0xa4, 0xef, 0x94, 0x00, 0xd8, 0xb0, 0xbd, 0x40, 0xae, 0x8f, 0x4f, 0x21, 0x57, 0xed, 0x9f, 0x72, - 0xe9, 0x66, 0x31, 0x51, 0x39, 0x31, 0x12, 0xfb, 0xc5, 0x14, 0x6b, 0x0b, 0xb1, 0xc4, 0x26, 0xb0, + 0xa4, 0xef, 0x94, 0x00, 0xd8, 0xb0, 0xbd, 0x40, 0xae, 0x8f, 0x4f, 0x21, 0x57, 0xed, 0x1f, 0x73, + 0xe9, 0x66, 0x31, 0x51, 0x39, 0x31, 0x12, 0xfb, 0x85, 0x14, 0x6b, 0x0b, 0xb1, 0xc4, 0x26, 0xb0, 0xb5, 0x7c, 0x1c, 0x14, 0xcf, 0x9b, 0xdd, 0x2e, 0xf4, 0xb5, 0x57, 0xc9, 0xa0, 0x58, 0x76, 0xa1, 0xe9, 0x43, 0x0d, 0x46, 0xa2, 0xd3, 0xc0, 0xb4, 0xeb, 0x38, 0xfe, 0xba, 0xe9, 0xef, 0x50, 0xb9, 0x85, 0xcf, 0xea, 0xd3, 0xc0, 0xa3, 0xb6, 0xf6, 0xba, 0x5d, 0x1f, 0x3e, 0xe8, 0xaf, 0xbb, 0xd6, 0xae, 0xe9, 0xee, 0xd7, 0x4c, 0x7b, 0x7b, 0xcf, 0xdc, 0x86, 0x94, 0xbd, 0xb8, 0xd7, 0xd4, 0x51, - 0xe5, 0x97, 0xd9, 0x8e, 0xe7, 0x1e, 0x5e, 0xe8, 0xdf, 0xcd, 0xc9, 0x89, 0xb0, 0xb8, 0x48, 0xd8, + 0xe5, 0x97, 0xd8, 0x8e, 0xe7, 0x1e, 0x5e, 0xe8, 0xdf, 0xcd, 0xc9, 0x89, 0xb0, 0xb8, 0x48, 0xd8, 0x8b, 0xe9, 0x79, 0x34, 0x30, 0xbd, 0x6b, 0xc3, 0x5d, 0xc7, 0xb6, 0xda, 0x81, 0xb5, 0x1a, 0x3c, - 0x6b, 0x1f, 0x0b, 0xd1, 0x58, 0xe2, 0xd0, 0x58, 0x14, 0x2e, 0x25, 0x1d, 0x14, 0xcd, 0x11, 0xfa, + 0x6b, 0x1f, 0x0d, 0xd1, 0x58, 0xe2, 0xd0, 0x58, 0x14, 0x2e, 0x25, 0x1d, 0x14, 0xcd, 0x11, 0xfa, 0x9d, 0xeb, 0xc0, 0xa3, 0x49, 0x37, 0xb2, 0xd9, 0x6a, 0x6c, 0x96, 0x0d, 0xbd, 0xd4, 0xd2, 0x37, 0x6b, 0x8d, 0x72, 0xa9, 0xb6, 0x69, 0xe8, 0xeb, 0x0d, 0x05, 0xa2, 0xd9, 0xf9, 0x94, 0x01, 0xdb, 0xce, 0x65, 0xe8, 0x6a, 0xcf, 0xcd, 0x89, 0x41, 0x94, 0x20, 0x94, 0x24, 0xf8, 0x64, 0x11, 0xf8, - 0x7e, 0x52, 0xd8, 0xcf, 0x88, 0x0a, 0x96, 0x32, 0x1f, 0xd3, 0x62, 0x3e, 0x2e, 0xd4, 0xc7, 0x24, - 0x92, 0x7a, 0x04, 0x80, 0xf4, 0x8f, 0x12, 0x98, 0x2a, 0x3b, 0xf6, 0x65, 0xe8, 0xfa, 0xec, 0x24, + 0x7e, 0x42, 0xd8, 0xcf, 0x88, 0x0a, 0x96, 0x32, 0x1f, 0xd3, 0x62, 0x3e, 0x26, 0xd4, 0xc7, 0x24, + 0x92, 0x7a, 0x04, 0x80, 0xf4, 0x0f, 0x12, 0x98, 0x2a, 0x3b, 0xf6, 0x65, 0xe8, 0xfa, 0xec, 0x24, 0x8b, 0xc5, 0x21, 0xd7, 0x87, 0xc3, 0x69, 0x30, 0x05, 0x6d, 0xdf, 0x75, 0x7a, 0xc1, 0x2c, 0x2b, 0x78, 0xd4, 0xde, 0x98, 0x56, 0xc2, 0xb4, 0xe4, 0xf8, 0xb5, 0xd9, 0xc1, 0x05, 0x71, 0xec, 0xc9, 0x7d, 0x6d, 0xe7, 0xe1, 0x34, 0xb8, 0x0c, 0x66, 0x20, 0xfb, 0x7e, 0xec, 0x2b, 0x32, 0x98, 0x27, @@ -76215,53 +76215,53 @@ var fileDescriptor_8261c968b2e6f45c = []byte{ 0x82, 0x5b, 0x4a, 0xeb, 0xeb, 0x9b, 0xad, 0xc6, 0x7d, 0x7a, 0x3d, 0xb2, 0x76, 0x37, 0xab, 0xf5, 0xcd, 0xd6, 0xaa, 0xbe, 0x59, 0xde, 0x30, 0xf0, 0xe2, 0x64, 0xa9, 0x5c, 0x6e, 0x6c, 0xd4, 0x5b, 0x0a, 0xd4, 0xde, 0x2a, 0x81, 0xb9, 0x72, 0xd7, 0xf1, 0x42, 0x84, 0xaf, 0x8b, 0x10, 0x0e, 0xc5, - 0x98, 0x63, 0xc4, 0xa8, 0xfd, 0xaf, 0x9c, 0xa8, 0x9f, 0x4c, 0x20, 0x10, 0x86, 0x7c, 0x4c, 0x2f, - 0xf5, 0x46, 0x21, 0x3f, 0x99, 0xe1, 0xf4, 0xb2, 0x6f, 0x12, 0x9f, 0x5d, 0x06, 0x53, 0x25, 0xa2, - 0x18, 0xda, 0x9f, 0xe6, 0x40, 0xb1, 0xec, 0xd8, 0x5b, 0xd6, 0x36, 0xb2, 0x20, 0xa1, 0x6d, 0x5e, - 0xec, 0xc2, 0x8a, 0xe9, 0x9b, 0x97, 0x2d, 0x78, 0x05, 0x57, 0x60, 0xda, 0xe8, 0x4b, 0x45, 0x4c, - 0xd1, 0x14, 0x78, 0x71, 0x6f, 0x1b, 0x33, 0x35, 0x6d, 0xb0, 0x49, 0x68, 0xfc, 0x20, 0x8f, 0xeb, - 0x2e, 0x74, 0x61, 0x17, 0x9a, 0x1e, 0x44, 0x73, 0x31, 0x1b, 0x76, 0xb1, 0xd2, 0x4e, 0x1b, 0x71, - 0xaf, 0xd5, 0xb3, 0x60, 0x8e, 0xbc, 0xc2, 0xf6, 0x8f, 0x87, 0xd5, 0x78, 0xda, 0xe0, 0xd2, 0xd4, - 0x27, 0x80, 0x02, 0x7c, 0xd0, 0x77, 0xcd, 0xd3, 0x1d, 0x8c, 0xd7, 0xa3, 0x16, 0x89, 0xa3, 0xec, - 0x62, 0xe0, 0x28, 0xbb, 0xd8, 0xc4, 0x6e, 0xb4, 0x06, 0xc9, 0xa5, 0xfd, 0xcf, 0xe9, 0xd0, 0x7a, - 0xf9, 0xbc, 0x1c, 0x29, 0x86, 0x0a, 0xf2, 0xb6, 0xb9, 0x0b, 0xa9, 0x5e, 0xe0, 0xff, 0xea, 0x2d, - 0xe0, 0xb8, 0x79, 0xd9, 0xf4, 0x4d, 0xb7, 0xe6, 0xb4, 0xcd, 0x2e, 0x1e, 0x36, 0x83, 0x96, 0xdf, - 0xff, 0x02, 0x6f, 0x5a, 0xf9, 0x8e, 0x0b, 0x71, 0xae, 0x60, 0xd3, 0x2a, 0x48, 0x40, 0xd4, 0xad, - 0xb6, 0x63, 0x63, 0xfe, 0x65, 0x03, 0xff, 0x47, 0x52, 0xe9, 0x58, 0x1e, 0xaa, 0x08, 0xa6, 0x52, - 0x27, 0xfb, 0x29, 0xcd, 0x7d, 0xbb, 0x8d, 0x37, 0xac, 0xa6, 0x8d, 0xb8, 0xd7, 0xea, 0x12, 0x98, - 0xa5, 0xbb, 0x2f, 0x6b, 0x48, 0xaf, 0x8a, 0x58, 0xaf, 0xae, 0xe7, 0xdd, 0x10, 0x09, 0x9e, 0x8b, - 0xf5, 0x28, 0x9f, 0xc1, 0x7e, 0xa4, 0x3e, 0x13, 0x3c, 0x9a, 0x3e, 0x96, 0xf7, 0x3c, 0xdf, 0xd9, - 0x25, 0xa0, 0x2f, 0x5b, 0x5d, 0x52, 0x83, 0x29, 0x5c, 0x83, 0xa4, 0x2c, 0xea, 0xed, 0xe0, 0x64, - 0xcf, 0x85, 0x5b, 0xd0, 0xbd, 0x60, 0xee, 0xee, 0x3d, 0xd8, 0x72, 0x4d, 0xdb, 0xeb, 0x39, 0xae, - 0x7f, 0x7a, 0x1a, 0x33, 0x3f, 0xf0, 0x9d, 0x7a, 0x2b, 0x38, 0xf1, 0x80, 0xe7, 0xd8, 0xa5, 0x9e, - 0x55, 0xb3, 0x3c, 0x1f, 0xda, 0xa5, 0x4e, 0xc7, 0x3d, 0x3d, 0x83, 0xcb, 0x3a, 0xf8, 0x42, 0xbd, - 0x11, 0xcc, 0x3f, 0xe0, 0x58, 0x76, 0xd3, 0x77, 0xa1, 0xb9, 0xbb, 0xe1, 0x76, 0x4f, 0x03, 0xb2, - 0x41, 0xc4, 0x25, 0xd2, 0xce, 0x77, 0x1a, 0x14, 0x09, 0x24, 0xda, 0x4b, 0x0a, 0xc2, 0x5e, 0xcd, - 0x54, 0x48, 0x89, 0xd6, 0xe2, 0x13, 0xc1, 0x14, 0xed, 0x35, 0x31, 0xf8, 0xb3, 0xb7, 0x9f, 0xea, - 0x5b, 0x20, 0xa1, 0x54, 0x8c, 0x20, 0x9b, 0xfa, 0x64, 0x50, 0x6c, 0x63, 0x51, 0x61, 0x3d, 0x98, - 0xbd, 0xfd, 0xd1, 0x83, 0x0b, 0xc5, 0x59, 0x0c, 0x9a, 0x55, 0xfb, 0xa2, 0x2c, 0xe4, 0x08, 0x9d, - 0xc4, 0x71, 0xba, 0x9e, 0xe2, 0x6b, 0xd2, 0x08, 0x5d, 0xf1, 0xad, 0xe0, 0x66, 0xda, 0xcf, 0x52, - 0x9b, 0xa6, 0xb2, 0xb9, 0xb4, 0x11, 0xcc, 0x6a, 0x91, 0xa5, 0xd3, 0x6c, 0x95, 0x8c, 0xd6, 0x66, - 0xbd, 0x51, 0x41, 0xb3, 0xe1, 0x5b, 0xc0, 0x4d, 0x43, 0x72, 0xeb, 0xad, 0xcd, 0x7a, 0x69, 0x4d, - 0x57, 0xb6, 0x78, 0x7b, 0xa9, 0xd9, 0x6a, 0xac, 0x6f, 0x1a, 0x1b, 0xf5, 0x7a, 0xb5, 0xbe, 0x42, - 0x88, 0x21, 0x03, 0xf5, 0x54, 0x94, 0xe1, 0xbc, 0x51, 0x6d, 0xe9, 0x9b, 0xe5, 0x46, 0x7d, 0xb9, - 0xba, 0xa2, 0x58, 0xc3, 0x8c, 0xad, 0x07, 0xd4, 0xeb, 0xc1, 0xb5, 0x1c, 0x27, 0xd5, 0x46, 0x1d, - 0x4d, 0xd1, 0xcb, 0xa5, 0x7a, 0x59, 0x47, 0xf3, 0xf1, 0x4b, 0xaa, 0x06, 0xae, 0x26, 0xe4, 0x36, - 0x97, 0xab, 0x35, 0x76, 0x57, 0xed, 0xd3, 0x39, 0xf5, 0x34, 0xb8, 0x8a, 0x7d, 0x47, 0x7d, 0x22, - 0x94, 0xdf, 0xc8, 0xa9, 0x37, 0x82, 0xeb, 0xb8, 0xaf, 0xc8, 0x06, 0xd9, 0x66, 0xb5, 0xb2, 0xb9, - 0x56, 0x6d, 0xae, 0x95, 0x5a, 0xe5, 0x55, 0xe5, 0x33, 0x78, 0xfa, 0x12, 0xda, 0xe3, 0x8c, 0x77, - 0xf2, 0xcb, 0x58, 0x3b, 0xa1, 0xc4, 0x2b, 0xea, 0xe3, 0x07, 0xc2, 0x9e, 0x6c, 0x17, 0x7f, 0x32, - 0x1c, 0x71, 0x2a, 0x9c, 0x0a, 0x3d, 0x31, 0x05, 0xad, 0x74, 0x3a, 0xd4, 0x1a, 0x41, 0x85, 0xae, - 0x07, 0xd7, 0xd6, 0x75, 0x82, 0x94, 0xa1, 0x97, 0x1b, 0xe7, 0x74, 0x63, 0xf3, 0x7c, 0xa9, 0x56, - 0xd3, 0x5b, 0x9b, 0xcb, 0x55, 0xa3, 0xd9, 0x52, 0xb6, 0xb4, 0x7f, 0x92, 0xc2, 0x65, 0x29, 0x46, - 0x5a, 0x7f, 0x2a, 0xa5, 0x6d, 0xd6, 0x89, 0xcb, 0x4f, 0xdf, 0x03, 0x8a, 0x9e, 0x6f, 0xfa, 0x7b, - 0x1e, 0x6d, 0xd5, 0x8f, 0x19, 0xdc, 0xaa, 0x17, 0x9b, 0x38, 0x93, 0x41, 0x33, 0x6b, 0x5f, 0xcc, - 0xa5, 0x69, 0xa6, 0x63, 0x58, 0x99, 0xb2, 0x46, 0x10, 0xf1, 0x19, 0xa0, 0x05, 0xda, 0x5e, 0x6d, - 0x6e, 0x96, 0x6a, 0x86, 0x5e, 0xaa, 0x5c, 0x08, 0xd7, 0xa3, 0xa0, 0x7a, 0x35, 0x38, 0xb1, 0x51, - 0x2f, 0x2d, 0xd5, 0x74, 0xdc, 0x5c, 0x1a, 0xf5, 0xba, 0x5e, 0x46, 0x72, 0xff, 0x61, 0xbc, 0xfb, - 0x83, 0xac, 0x72, 0xcc, 0x37, 0xb2, 0x9c, 0x18, 0xf9, 0xff, 0x95, 0xb0, 0x9b, 0x5b, 0xa4, 0x61, - 0x2c, 0xad, 0xf1, 0xe2, 0xf0, 0x05, 0x21, 0xcf, 0x36, 0x21, 0x4e, 0xd2, 0xe1, 0xf1, 0x03, 0x23, - 0xe0, 0x71, 0x35, 0x38, 0xc1, 0xe2, 0x81, 0x3d, 0xdc, 0xe2, 0x61, 0xf8, 0x13, 0x19, 0x4c, 0xad, + 0x98, 0x63, 0xc4, 0xa8, 0xfd, 0x4b, 0x4e, 0xd4, 0x4f, 0x26, 0x10, 0x08, 0x43, 0x3e, 0xa6, 0x97, + 0x7a, 0xa3, 0x90, 0x9f, 0xcc, 0x70, 0x7a, 0xd9, 0x37, 0x89, 0xcf, 0x2c, 0x83, 0xa9, 0x12, 0x51, + 0x0c, 0xed, 0x4f, 0x72, 0xa0, 0x58, 0x76, 0xec, 0x2d, 0x6b, 0x1b, 0x59, 0x90, 0xd0, 0x36, 0x2f, + 0x76, 0x61, 0xc5, 0xf4, 0xcd, 0xcb, 0x16, 0xbc, 0x82, 0x2b, 0x30, 0x6d, 0xf4, 0xa5, 0x22, 0xa6, + 0x68, 0x0a, 0xbc, 0xb8, 0xb7, 0x8d, 0x99, 0x9a, 0x36, 0xd8, 0x24, 0x34, 0x7e, 0x90, 0xc7, 0x75, + 0x17, 0xba, 0xb0, 0x0b, 0x4d, 0x0f, 0xa2, 0xb9, 0x98, 0x0d, 0xbb, 0x58, 0x69, 0xa7, 0x8d, 0xb8, + 0xd7, 0xea, 0x59, 0x30, 0x47, 0x5e, 0x61, 0xfb, 0xc7, 0xc3, 0x6a, 0x3c, 0x6d, 0x70, 0x69, 0xea, + 0x13, 0x40, 0x01, 0x3e, 0xe8, 0xbb, 0xe6, 0xe9, 0x0e, 0xc6, 0xeb, 0x51, 0x8b, 0xc4, 0x51, 0x76, + 0x31, 0x70, 0x94, 0x5d, 0x6c, 0x62, 0x37, 0x5a, 0x83, 0xe4, 0xd2, 0xfe, 0xd7, 0x74, 0x68, 0xbd, + 0x7c, 0x5e, 0x8e, 0x14, 0x43, 0x05, 0x79, 0xdb, 0xdc, 0x85, 0x54, 0x2f, 0xf0, 0x7f, 0xf5, 0x16, + 0x70, 0xdc, 0xbc, 0x6c, 0xfa, 0xa6, 0x5b, 0x73, 0xda, 0x66, 0x17, 0x0f, 0x9b, 0x41, 0xcb, 0xef, + 0x7f, 0x81, 0x37, 0xad, 0x7c, 0xc7, 0x85, 0x38, 0x57, 0xb0, 0x69, 0x15, 0x24, 0x20, 0xea, 0x56, + 0xdb, 0xb1, 0x31, 0xff, 0xb2, 0x81, 0xff, 0x23, 0xa9, 0x74, 0x2c, 0x0f, 0x55, 0x04, 0x53, 0xa9, + 0x93, 0xfd, 0x94, 0xe6, 0xbe, 0xdd, 0xc6, 0x1b, 0x56, 0xd3, 0x46, 0xdc, 0x6b, 0x75, 0x09, 0xcc, + 0xd2, 0xdd, 0x97, 0x35, 0xa4, 0x57, 0x45, 0xac, 0x57, 0xd7, 0xf3, 0x6e, 0x88, 0x04, 0xcf, 0xc5, + 0x7a, 0x94, 0xcf, 0x60, 0x3f, 0x52, 0x9f, 0x09, 0x1e, 0x4d, 0x1f, 0xcb, 0x7b, 0x9e, 0xef, 0xec, + 0x12, 0xd0, 0x97, 0xad, 0x2e, 0xa9, 0xc1, 0x14, 0xae, 0x41, 0x52, 0x16, 0xf5, 0x76, 0x70, 0xb2, + 0xe7, 0xc2, 0x2d, 0xe8, 0x5e, 0x30, 0x77, 0xf7, 0x1e, 0x6c, 0xb9, 0xa6, 0xed, 0xf5, 0x1c, 0xd7, + 0x3f, 0x3d, 0x8d, 0x99, 0x1f, 0xf8, 0x4e, 0xbd, 0x15, 0x9c, 0x78, 0xc0, 0x73, 0xec, 0x52, 0xcf, + 0xaa, 0x59, 0x9e, 0x0f, 0xed, 0x52, 0xa7, 0xe3, 0x9e, 0x9e, 0xc1, 0x65, 0x1d, 0x7c, 0xa1, 0xde, + 0x08, 0xe6, 0x1f, 0x70, 0x2c, 0xbb, 0xe9, 0xbb, 0xd0, 0xdc, 0xdd, 0x70, 0xbb, 0xa7, 0x01, 0xd9, + 0x20, 0xe2, 0x12, 0x69, 0xe7, 0x3b, 0x0d, 0x8a, 0x04, 0x12, 0xed, 0x25, 0x05, 0x61, 0xaf, 0x66, + 0x2a, 0xa4, 0x44, 0x6b, 0xf1, 0x89, 0x60, 0x8a, 0xf6, 0x9a, 0x18, 0xfc, 0xd9, 0xdb, 0x4f, 0xf5, + 0x2d, 0x90, 0x50, 0x2a, 0x46, 0x90, 0x4d, 0x7d, 0x32, 0x28, 0xb6, 0xb1, 0xa8, 0xb0, 0x1e, 0xcc, + 0xde, 0xfe, 0xe8, 0xc1, 0x85, 0xe2, 0x2c, 0x06, 0xcd, 0xaa, 0x7d, 0x51, 0x16, 0x72, 0x84, 0x4e, + 0xe2, 0x38, 0x5d, 0x4f, 0xf1, 0x35, 0x69, 0x84, 0xae, 0xf8, 0x56, 0x70, 0x33, 0xed, 0x67, 0xa9, + 0x4d, 0x53, 0xd9, 0x5c, 0xda, 0x08, 0x66, 0xb5, 0xc8, 0xd2, 0x69, 0xb6, 0x4a, 0x46, 0x6b, 0xb3, + 0xde, 0xa8, 0xa0, 0xd9, 0xf0, 0x2d, 0xe0, 0xa6, 0x21, 0xb9, 0xf5, 0xd6, 0x66, 0xbd, 0xb4, 0xa6, + 0x2b, 0x5b, 0xbc, 0xbd, 0xd4, 0x6c, 0x35, 0xd6, 0x37, 0x8d, 0x8d, 0x7a, 0xbd, 0x5a, 0x5f, 0x21, + 0xc4, 0x90, 0x81, 0x7a, 0x2a, 0xca, 0x70, 0xde, 0xa8, 0xb6, 0xf4, 0xcd, 0x72, 0xa3, 0xbe, 0x5c, + 0x5d, 0x51, 0xac, 0x61, 0xc6, 0xd6, 0x03, 0xea, 0xf5, 0xe0, 0x5a, 0x8e, 0x93, 0x6a, 0xa3, 0x8e, + 0xa6, 0xe8, 0xe5, 0x52, 0xbd, 0xac, 0xa3, 0xf9, 0xf8, 0x25, 0x55, 0x03, 0x57, 0x13, 0x72, 0x9b, + 0xcb, 0xd5, 0x1a, 0xbb, 0xab, 0xf6, 0xa9, 0x9c, 0x7a, 0x1a, 0x5c, 0xc5, 0xbe, 0xa3, 0x3e, 0x11, + 0xca, 0x6f, 0xe4, 0xd4, 0x1b, 0xc1, 0x75, 0xdc, 0x57, 0x64, 0x83, 0x6c, 0xb3, 0x5a, 0xd9, 0x5c, + 0xab, 0x36, 0xd7, 0x4a, 0xad, 0xf2, 0xaa, 0xf2, 0x69, 0x3c, 0x7d, 0x09, 0xed, 0x71, 0xc6, 0x3b, + 0xf9, 0x65, 0xac, 0x9d, 0x50, 0xe2, 0x15, 0xf5, 0xf1, 0x03, 0x61, 0x4f, 0xb6, 0x8b, 0x3f, 0x11, + 0x8e, 0x38, 0x15, 0x4e, 0x85, 0x9e, 0x98, 0x82, 0x56, 0x3a, 0x1d, 0x6a, 0x8d, 0xa0, 0x42, 0xd7, + 0x83, 0x6b, 0xeb, 0x3a, 0x41, 0xca, 0xd0, 0xcb, 0x8d, 0x73, 0xba, 0xb1, 0x79, 0xbe, 0x54, 0xab, + 0xe9, 0xad, 0xcd, 0xe5, 0xaa, 0xd1, 0x6c, 0x29, 0x5b, 0xda, 0x3f, 0x4a, 0xe1, 0xb2, 0x14, 0x23, + 0xad, 0x3f, 0x91, 0xd2, 0x36, 0xeb, 0xc4, 0xe5, 0xa7, 0xef, 0x01, 0x45, 0xcf, 0x37, 0xfd, 0x3d, + 0x8f, 0xb6, 0xea, 0xc7, 0x0c, 0x6e, 0xd5, 0x8b, 0x4d, 0x9c, 0xc9, 0xa0, 0x99, 0xb5, 0x2f, 0xe6, + 0xd2, 0x34, 0xd3, 0x31, 0xac, 0x4c, 0x59, 0x23, 0x88, 0xf8, 0x0c, 0xd0, 0x02, 0x6d, 0xaf, 0x36, + 0x37, 0x4b, 0x35, 0x43, 0x2f, 0x55, 0x2e, 0x84, 0xeb, 0x51, 0x50, 0xbd, 0x1a, 0x9c, 0xd8, 0xa8, + 0x97, 0x96, 0x6a, 0x3a, 0x6e, 0x2e, 0x8d, 0x7a, 0x5d, 0x2f, 0x23, 0xb9, 0xff, 0x10, 0xde, 0xfd, + 0x41, 0x56, 0x39, 0xe6, 0x1b, 0x59, 0x4e, 0x8c, 0xfc, 0xff, 0x52, 0xd8, 0xcd, 0x2d, 0xd2, 0x30, + 0x96, 0xd6, 0x78, 0x71, 0xf8, 0x82, 0x90, 0x67, 0x9b, 0x10, 0x27, 0xe9, 0xf0, 0xf8, 0xaf, 0x23, + 0xe0, 0x71, 0x35, 0x38, 0xc1, 0xe2, 0x81, 0x3d, 0xdc, 0xe2, 0x61, 0xf8, 0x63, 0x19, 0x4c, 0xad, 0x59, 0xdb, 0xd8, 0xbd, 0x78, 0x2f, 0x32, 0x50, 0x16, 0x80, 0x14, 0x7a, 0xef, 0x48, 0x56, 0x87, 0x9b, 0xcc, 0x4b, 0xe2, 0xeb, 0x2d, 0x42, 0x13, 0xf6, 0x2f, 0xa6, 0xee, 0x99, 0x28, 0xc3, 0x31, 0x3d, 0xd3, 0x0b, 0xa5, 0x34, 0x3d, 0xd3, 0x60, 0x5a, 0xa9, 0x60, 0x42, 0xa6, 0x83, 0x0b, 0x9f, @@ -76273,8 +76273,8 @@ var fileDescriptor_8261c968b2e6f45c = []byte{ 0x29, 0x66, 0x3f, 0x45, 0x79, 0x09, 0x00, 0xc5, 0x26, 0xec, 0xc2, 0xb6, 0xaf, 0x7d, 0x48, 0x1e, 0xb9, 0x4d, 0xc4, 0x99, 0xdb, 0x72, 0x2a, 0x73, 0x3b, 0x9f, 0x81, 0xb9, 0x5d, 0x18, 0xdd, 0xdc, 0x2e, 0xa6, 0x35, 0xb7, 0xa7, 0xe2, 0xcc, 0xed, 0x84, 0x5e, 0x63, 0x3a, 0xb1, 0xd7, 0xe8, 0x33, - 0xd4, 0x8d, 0x1a, 0x35, 0xe9, 0xf9, 0x44, 0xaa, 0xcc, 0x9f, 0x28, 0xa6, 0x1d, 0xc7, 0x09, 0xf0, - 0x47, 0x6b, 0x9e, 0xff, 0x78, 0x21, 0xcd, 0xb8, 0x3f, 0x90, 0xe3, 0x74, 0xad, 0xe4, 0x95, 0xf9, + 0xd4, 0x8d, 0x1a, 0x35, 0xe9, 0xf9, 0x44, 0xaa, 0xcc, 0x1f, 0x2f, 0xa6, 0x1d, 0xc7, 0x09, 0xf0, + 0x47, 0x6b, 0x9e, 0xff, 0x58, 0x21, 0xcd, 0xb8, 0x3f, 0x90, 0xe3, 0x74, 0xad, 0xe4, 0x95, 0xf9, 0x0c, 0x16, 0x1d, 0xd5, 0x1b, 0xc0, 0x75, 0xd1, 0xf3, 0xa6, 0x7e, 0x7f, 0xb5, 0xd9, 0x6a, 0x62, 0x9b, 0xbc, 0xdc, 0x30, 0x8c, 0x8d, 0x75, 0xb2, 0x5d, 0x75, 0x0a, 0xa8, 0x11, 0x15, 0x63, 0xa3, 0x4e, 0x2c, 0xf0, 0x6d, 0x9e, 0xfa, 0x72, 0xb5, 0x5e, 0xd9, 0x0c, 0x47, 0xb5, 0xfa, 0x72, 0x43, @@ -76287,15 +76287,15 @@ var fileDescriptor_8261c968b2e6f45c = []byte{ 0x6b, 0xeb, 0xa5, 0x56, 0x15, 0x0d, 0xb8, 0xeb, 0x46, 0xa3, 0xd5, 0xd8, 0x3c, 0xa7, 0x1b, 0xcd, 0x6a, 0xa3, 0xae, 0xd8, 0xa8, 0xca, 0xcc, 0x08, 0x1d, 0x58, 0x4a, 0x8e, 0x7a, 0x2d, 0x38, 0x1d, 0xa4, 0xd7, 0x1a, 0x48, 0xd0, 0xcc, 0x9c, 0xa1, 0xc7, 0xda, 0x59, 0xcd, 0x56, 0xc3, 0x20, 0xb3, - 0x86, 0xb5, 0xea, 0x8a, 0x81, 0xa6, 0x3a, 0xca, 0xb3, 0x33, 0x9d, 0x53, 0xfc, 0x8b, 0x04, 0xf2, + 0x86, 0xb5, 0xea, 0x8a, 0x81, 0xa6, 0x3a, 0xca, 0xb3, 0x33, 0x9d, 0x53, 0xfc, 0xb3, 0x04, 0xf2, 0x4d, 0xdf, 0xe9, 0x69, 0xdf, 0x1d, 0x75, 0x87, 0x67, 0x00, 0x70, 0xb1, 0x2b, 0x44, 0xc5, 0xf4, 0x4d, 0xba, 0x5a, 0xc3, 0xa4, 0x68, 0xbf, 0x2e, 0xbc, 0x7f, 0x1b, 0x59, 0x5d, 0x4e, 0x2f, 0x66, - 0xf8, 0xf8, 0x96, 0xd8, 0x71, 0xc8, 0x78, 0x42, 0xe9, 0xda, 0xc3, 0x8f, 0x8e, 0xb2, 0x43, 0xab, + 0xf8, 0xf8, 0x96, 0xd8, 0x71, 0xc8, 0x78, 0x42, 0xe9, 0xda, 0xc3, 0x8f, 0x8c, 0xb2, 0x43, 0xab, 0x81, 0x53, 0x0c, 0xac, 0x48, 0xfe, 0x81, 0xca, 0x40, 0xf5, 0x51, 0xe0, 0xaa, 0x3e, 0xe5, 0xc3, 0x3a, 0xb7, 0xa5, 0x7e, 0x17, 0x78, 0x0c, 0xa3, 0xfe, 0xfa, 0x5a, 0xe3, 0x9c, 0x1e, 0x2a, 0x7a, 0xa5, 0xd4, 0x2a, 0x29, 0xdb, 0xda, 0xe7, 0x65, 0x90, 0x5f, 0x73, 0x2e, 0xf7, 0x6f, 0x9b, 0xdb, 0xf0, 0x0a, 0xb3, 0xb7, 0x12, 0x3c, 0xf2, 0x47, 0xb0, 0x84, 0xc4, 0xbe, 0x16, 0xef, 0x22, 0xf3, - 0x05, 0x29, 0x8d, 0xd8, 0xd7, 0x0e, 0xeb, 0x17, 0xf3, 0x37, 0xa3, 0x88, 0x3d, 0x46, 0xb4, 0x50, + 0x05, 0x29, 0x8d, 0xd8, 0xd7, 0x0e, 0xeb, 0x17, 0xf3, 0xd7, 0xa3, 0x88, 0x3d, 0x46, 0xb4, 0x50, 0x3d, 0x0b, 0xce, 0x44, 0x2f, 0xaa, 0x15, 0xbd, 0xde, 0xaa, 0x2e, 0x5f, 0x88, 0x84, 0x5b, 0x35, 0x84, 0xc4, 0x3f, 0xac, 0x9b, 0x4b, 0x5e, 0x2b, 0x38, 0x0d, 0x4e, 0x46, 0xef, 0x56, 0xf4, 0x56, 0xf0, 0xe6, 0x01, 0xed, 0xa1, 0x02, 0x98, 0x23, 0xdd, 0xfe, 0x46, 0xaf, 0x83, 0xac, 0xef, 0x27, @@ -76316,1107 +76316,1108 @@ var fileDescriptor_8261c968b2e6f45c = []byte{ 0x66, 0x05, 0xfa, 0x04, 0x44, 0x4d, 0x01, 0xf2, 0x0a, 0xf4, 0xd9, 0x89, 0xf8, 0xab, 0xf2, 0xe0, 0x51, 0x74, 0xf1, 0x66, 0xd9, 0x75, 0x76, 0x6b, 0x70, 0xdb, 0x6c, 0xef, 0xeb, 0x0f, 0x22, 0x83, 0x4f, 0x7b, 0x71, 0x8e, 0x5b, 0xd1, 0xee, 0x45, 0xbd, 0x11, 0xfe, 0x9f, 0x68, 0x20, 0x07, 0x6b, - 0xd4, 0x32, 0xbf, 0x46, 0x1d, 0x67, 0x12, 0xe6, 0x45, 0x26, 0x92, 0xff, 0xc0, 0x36, 0x06, 0x6e, + 0xd4, 0x32, 0xbf, 0x46, 0x1d, 0x67, 0x12, 0xe6, 0x45, 0x26, 0x92, 0x7f, 0xcf, 0x36, 0x06, 0x6e, 0x43, 0x2a, 0xd7, 0xb7, 0x21, 0x85, 0x5a, 0x58, 0x0f, 0xba, 0x9e, 0x63, 0x9b, 0xdd, 0x26, 0x75, 0x3f, 0x22, 0x73, 0xd5, 0xfe, 0x64, 0xf5, 0x59, 0x41, 0xa3, 0x22, 0x06, 0xdf, 0xd3, 0x93, 0x96, - 0xb7, 0xfa, 0x25, 0x14, 0xd3, 0xbe, 0x3e, 0x13, 0xb6, 0xaf, 0x16, 0xd7, 0xbe, 0x9e, 0x79, 0x08, + 0xb7, 0xfa, 0x25, 0x14, 0xd3, 0xbe, 0x3e, 0x1d, 0xb6, 0xaf, 0x16, 0xd7, 0xbe, 0x9e, 0x79, 0x08, 0xda, 0xe9, 0x9a, 0x5a, 0x75, 0xb4, 0xa9, 0x68, 0xe4, 0x9c, 0x1f, 0xec, 0x7f, 0xc9, 0xda, 0xe7, 0x25, 0x70, 0x4a, 0xb7, 0x07, 0x4d, 0x65, 0x58, 0x35, 0x7a, 0x2b, 0x0b, 0xcd, 0x3a, 0x2f, 0xd2, - 0x3b, 0x07, 0x56, 0x7b, 0x30, 0xcd, 0x18, 0x89, 0xfe, 0x76, 0x28, 0xd1, 0x26, 0x27, 0xd1, 0x7b, - 0x46, 0x27, 0x9d, 0x4e, 0xa0, 0xf5, 0xb1, 0xf6, 0x5d, 0x79, 0xed, 0x2f, 0x25, 0x70, 0x82, 0x78, - 0x10, 0xde, 0x4b, 0x66, 0x4e, 0xb8, 0xb7, 0xe7, 0xad, 0xaf, 0x6e, 0x34, 0xcb, 0x22, 0xfa, 0xcd, - 0xa4, 0x68, 0xaf, 0x63, 0x05, 0x7e, 0x1f, 0x2f, 0xf0, 0x98, 0x7e, 0xbc, 0xbf, 0xb8, 0x18, 0x59, - 0xff, 0x46, 0x28, 0xeb, 0x3a, 0x27, 0xeb, 0x3b, 0x47, 0xa2, 0x7a, 0xb4, 0x62, 0xfe, 0x5a, 0x1e, - 0x3c, 0x86, 0x70, 0x48, 0x15, 0x81, 0xf4, 0x83, 0x25, 0xbb, 0x63, 0x40, 0xcf, 0x37, 0x5d, 0x9f, - 0x0b, 0xbd, 0xd2, 0x37, 0x35, 0xcf, 0x65, 0x30, 0x35, 0x97, 0x86, 0x4e, 0xcd, 0xb5, 0xf7, 0xb0, - 0x06, 0xde, 0x79, 0x1e, 0xd9, 0x52, 0x02, 0x06, 0x31, 0x35, 0x8c, 0x6b, 0x51, 0xa1, 0xe5, 0xf7, - 0x7d, 0x1c, 0xca, 0xcb, 0x87, 0x2e, 0x21, 0x1d, 0xe2, 0xbf, 0x3e, 0x5e, 0x4b, 0x3c, 0xcf, 0xbe, - 0xe3, 0xcd, 0x46, 0xa5, 0x93, 0xe9, 0x14, 0xea, 0xa5, 0xd3, 0x60, 0x06, 0x77, 0x39, 0x35, 0xcb, - 0xbe, 0xa4, 0xfd, 0x85, 0x0c, 0xe6, 0xea, 0xf0, 0x4a, 0x79, 0xc7, 0xec, 0x76, 0xa1, 0xbd, 0x0d, - 0xb5, 0x07, 0x38, 0xdb, 0xde, 0xec, 0xf5, 0xea, 0xd1, 0xfe, 0x70, 0xf0, 0xa8, 0xde, 0x03, 0x0a, - 0x5e, 0xdb, 0x09, 0x83, 0x3a, 0x7c, 0x77, 0xcc, 0xea, 0x75, 0x69, 0xcf, 0xdf, 0x59, 0xc4, 0x65, - 0x95, 0x7a, 0x56, 0x13, 0x7d, 0x60, 0x90, 0xef, 0xe8, 0x38, 0xf9, 0x57, 0x03, 0x3b, 0xe3, 0x5c, - 0x42, 0x67, 0x1c, 0x32, 0xbe, 0xc8, 0x32, 0x1d, 0xb3, 0x48, 0x72, 0x3d, 0x98, 0x6d, 0x07, 0x59, - 0xc2, 0x53, 0x7a, 0x6c, 0x92, 0xf6, 0xd5, 0x54, 0xdd, 0xb5, 0x50, 0xe1, 0xe9, 0xb4, 0x0a, 0x8e, - 0xd9, 0xd4, 0xbc, 0x1a, 0x9c, 0x68, 0x35, 0x1a, 0x9b, 0x6b, 0xa5, 0xfa, 0x85, 0x28, 0xb6, 0xca, - 0x96, 0xf6, 0xca, 0x3c, 0x58, 0x68, 0x3a, 0xdd, 0xcb, 0x30, 0xc2, 0xb9, 0xca, 0xb9, 0x7f, 0xb2, - 0x72, 0xca, 0x1d, 0x90, 0x93, 0x7a, 0x0a, 0x14, 0x4d, 0xdb, 0xbb, 0x02, 0x03, 0xf3, 0x9f, 0x3e, - 0x51, 0x18, 0x3f, 0xc2, 0x76, 0x04, 0x06, 0x0f, 0xe3, 0x5d, 0x43, 0x24, 0xc9, 0x73, 0x15, 0x03, - 0xe4, 0x59, 0x30, 0xe7, 0x11, 0x2f, 0x91, 0x16, 0xe3, 0x0c, 0xc4, 0xa5, 0x61, 0x16, 0x89, 0x9b, - 0x92, 0x4c, 0x59, 0xc4, 0x4f, 0xda, 0xc3, 0x61, 0xff, 0xb1, 0xc1, 0x41, 0x5c, 0x3a, 0x0c, 0x63, - 0xe9, 0x40, 0x7e, 0xf5, 0xb8, 0x27, 0xf1, 0xa7, 0xc1, 0xc9, 0xe0, 0x84, 0x7a, 0x79, 0xb5, 0x54, - 0xab, 0xe9, 0xf5, 0x15, 0x7d, 0xb3, 0x5a, 0x21, 0xfb, 0xc9, 0x51, 0x4a, 0xa9, 0xd5, 0xd2, 0xd7, - 0xd6, 0x5b, 0xcd, 0x4d, 0xfd, 0xfe, 0xb2, 0xae, 0x57, 0xb0, 0x03, 0x36, 0x3e, 0x41, 0x19, 0xb8, - 0xca, 0x97, 0xea, 0xcd, 0xf3, 0xba, 0xa1, 0xec, 0x9c, 0x2d, 0x81, 0x59, 0x66, 0xa0, 0x40, 0xdc, - 0x55, 0xe0, 0x96, 0xb9, 0xd7, 0xa5, 0xe6, 0xb8, 0x72, 0x0c, 0x71, 0x87, 0x65, 0xd3, 0xb0, 0xbb, - 0xfb, 0x4a, 0x4e, 0x55, 0xc0, 0x1c, 0x3b, 0x26, 0x28, 0x92, 0xf6, 0xce, 0x6b, 0xc1, 0xcc, 0x79, - 0xc7, 0xbd, 0x84, 0xbd, 0x86, 0xb5, 0x0f, 0x90, 0x18, 0x6c, 0x41, 0x44, 0x09, 0xc6, 0x00, 0x7b, - 0xb5, 0xb8, 0x9b, 0x58, 0x40, 0x6d, 0x71, 0x68, 0xd4, 0x88, 0xeb, 0xc1, 0xec, 0x95, 0x20, 0x77, - 0xd4, 0xd2, 0x99, 0x24, 0xed, 0x97, 0xc4, 0x1c, 0xbf, 0x86, 0x17, 0x99, 0xfd, 0xaa, 0xff, 0xdb, - 0x25, 0x50, 0x5c, 0x81, 0x7e, 0xa9, 0xdb, 0x65, 0xe5, 0xf6, 0x72, 0xe1, 0x73, 0xa4, 0x5c, 0x25, - 0x4a, 0xdd, 0x6e, 0x7c, 0xa3, 0x62, 0x04, 0x14, 0x9c, 0x77, 0xe2, 0xd2, 0x04, 0xbd, 0xb4, 0x87, - 0x14, 0x98, 0xbd, 0xc4, 0x3e, 0x16, 0xb9, 0x66, 0xbf, 0x9e, 0x31, 0x93, 0x9e, 0x14, 0xc5, 0xdf, - 0xcb, 0x25, 0x3b, 0x49, 0x05, 0xf9, 0xd4, 0xfb, 0xc0, 0xd4, 0x9e, 0x07, 0xcb, 0xa6, 0x17, 0x0c, - 0x6d, 0x7c, 0x4d, 0x1b, 0x17, 0x1f, 0x80, 0x6d, 0x7f, 0xb1, 0xba, 0x8b, 0x26, 0x3e, 0x1b, 0x24, - 0x63, 0x18, 0xaf, 0x88, 0x3e, 0x1b, 0x01, 0x05, 0x34, 0xed, 0xbc, 0x62, 0xf9, 0x3b, 0xe5, 0x1d, - 0xd3, 0xa7, 0x9b, 0x2d, 0xe1, 0xb3, 0xf6, 0x92, 0x11, 0xe0, 0x4c, 0x74, 0xd8, 0x89, 0x3d, 0x8e, - 0x9e, 0x1a, 0xc4, 0x31, 0x78, 0xd9, 0x8c, 0x02, 0xe2, 0xdf, 0x4a, 0x20, 0xdf, 0xe8, 0x41, 0x5b, - 0xf8, 0xec, 0x65, 0x28, 0x5b, 0xa9, 0x4f, 0xb6, 0x0f, 0x8b, 0xbb, 0x05, 0x87, 0x95, 0x46, 0x25, - 0xc7, 0x48, 0xf6, 0x36, 0x90, 0xb7, 0xec, 0x2d, 0x87, 0x5a, 0xb6, 0x8f, 0x8e, 0xb1, 0x75, 0xaa, - 0xf6, 0x96, 0x63, 0xe0, 0x8c, 0xa2, 0x1e, 0xc1, 0x49, 0x65, 0x67, 0x2f, 0xee, 0xbf, 0x9b, 0x06, - 0x45, 0xa2, 0xce, 0xda, 0xcb, 0x64, 0x20, 0x97, 0x3a, 0x9d, 0x18, 0xc1, 0x4b, 0x07, 0x04, 0xef, - 0xe0, 0xcf, 0x42, 0x4c, 0xc2, 0x67, 0x3e, 0xf0, 0x9a, 0x60, 0xdf, 0x4e, 0x9b, 0x54, 0xa9, 0xd3, - 0x89, 0x3f, 0xb7, 0x10, 0x16, 0x28, 0xf1, 0x05, 0xb2, 0x2d, 0x5c, 0x16, 0x6b, 0xe1, 0xa9, 0x07, - 0x82, 0x58, 0xfe, 0xb2, 0x87, 0xe8, 0x1f, 0x24, 0x30, 0x55, 0xb3, 0x3c, 0x1f, 0x61, 0x53, 0x12, - 0xc1, 0xe6, 0x5a, 0x30, 0x13, 0x88, 0x06, 0x75, 0x79, 0xa8, 0x3f, 0x8f, 0x12, 0xf8, 0x99, 0xf8, - 0xbd, 0x3c, 0x3a, 0x4f, 0x49, 0xae, 0x3d, 0xe5, 0x22, 0xfe, 0x4c, 0x5b, 0x54, 0xac, 0xd4, 0x5f, - 0xec, 0x2f, 0x87, 0x02, 0x5f, 0xe3, 0x04, 0x7e, 0xc7, 0x28, 0x45, 0x66, 0x2f, 0xf4, 0x3f, 0x90, - 0x00, 0x40, 0x65, 0xd3, 0x83, 0xc3, 0x8f, 0xe3, 0xc2, 0x81, 0x24, 0x48, 0xf7, 0x95, 0xac, 0x74, - 0xd7, 0x78, 0xe9, 0x7e, 0xef, 0xf0, 0xaa, 0x26, 0x1d, 0x10, 0x56, 0x15, 0x20, 0x5b, 0xa1, 0x68, - 0xd1, 0x5f, 0xed, 0xed, 0xa1, 0x50, 0xd7, 0x39, 0xa1, 0xde, 0x35, 0x62, 0x49, 0xd9, 0xcb, 0xf5, - 0x8f, 0x25, 0x30, 0xd5, 0x84, 0x3e, 0xea, 0x26, 0xb5, 0x73, 0x22, 0x3d, 0x3c, 0xd3, 0xb6, 0x25, - 0xc1, 0xb6, 0xfd, 0xcd, 0x9c, 0x68, 0x60, 0xb8, 0x48, 0x32, 0x94, 0xa7, 0x98, 0xd5, 0x87, 0xd7, - 0x0b, 0x05, 0x86, 0x1b, 0x46, 0x2d, 0x7b, 0xe9, 0xbe, 0x55, 0x0a, 0x3d, 0x45, 0xf8, 0x73, 0x7d, - 0xac, 0x59, 0x9c, 0x3b, 0x68, 0x16, 0x8b, 0x9f, 0xeb, 0x63, 0xeb, 0x18, 0xef, 0x98, 0x90, 0xda, - 0xd8, 0x18, 0x83, 0xcf, 0xc0, 0x28, 0xf2, 0x7a, 0x9e, 0x0c, 0x8a, 0x74, 0xf3, 0xe0, 0x9e, 0xe4, - 0xbd, 0x83, 0xe1, 0x53, 0x8b, 0xf7, 0x8f, 0x60, 0xca, 0x25, 0x2d, 0xcb, 0x87, 0x6c, 0x48, 0x0c, - 0x1b, 0xb7, 0x82, 0x02, 0x8e, 0x9a, 0x4d, 0xc7, 0xb9, 0xc8, 0xdd, 0x23, 0x20, 0xa1, 0xa3, 0xb7, - 0x06, 0xc9, 0x94, 0x1a, 0x85, 0x31, 0xac, 0xe4, 0x8f, 0x82, 0xc2, 0xd7, 0x54, 0x00, 0xd6, 0xf7, - 0x2e, 0x76, 0x2d, 0x6f, 0xc7, 0xb2, 0xb1, 0x8f, 0xd8, 0x1c, 0x7d, 0x24, 0xc1, 0x9f, 0x13, 0xcd, - 0xbf, 0x58, 0xa3, 0x40, 0x01, 0xf2, 0x9e, 0x6b, 0xd1, 0x65, 0x00, 0xf4, 0x57, 0xbd, 0x3b, 0xf4, - 0xb6, 0xcc, 0xf7, 0x05, 0x6e, 0x41, 0x62, 0x88, 0x38, 0x58, 0x64, 0x4a, 0x8f, 0xbc, 0x2e, 0xd9, - 0x08, 0xdf, 0x05, 0x3e, 0xc2, 0x37, 0x77, 0x9a, 0xbb, 0xd8, 0x77, 0x9a, 0x1b, 0xe1, 0xe8, 0x59, - 0xcf, 0x81, 0xd8, 0xf5, 0x48, 0x36, 0xf0, 0x7f, 0xf4, 0x05, 0x76, 0x0f, 0xc2, 0xde, 0x79, 0xe4, - 0xcc, 0x40, 0x94, 0xc0, 0xf6, 0x79, 0x33, 0x82, 0x7d, 0xde, 0x47, 0xa3, 0xb9, 0x8f, 0x23, 0x68, - 0x38, 0xa7, 0x90, 0x1c, 0xc7, 0x6e, 0xbe, 0x8f, 0x5d, 0xed, 0x13, 0xc2, 0x81, 0x38, 0x19, 0x19, - 0x27, 0xce, 0x62, 0x28, 0x07, 0x52, 0xc8, 0x01, 0xb3, 0x07, 0x9c, 0xd4, 0x03, 0x0f, 0xa3, 0x9f, - 0x4e, 0x97, 0x77, 0x47, 0x58, 0xaf, 0x51, 0xc1, 0x42, 0x70, 0x2c, 0xbe, 0xb1, 0x74, 0xaf, 0x5e, - 0x6e, 0x29, 0xf0, 0xe0, 0x51, 0x79, 0x7c, 0x28, 0x9e, 0x1c, 0x80, 0x8f, 0xd6, 0x64, 0xb4, 0xff, - 0x21, 0x81, 0x22, 0x35, 0x37, 0xee, 0x39, 0x24, 0x84, 0xda, 0xab, 0x46, 0x81, 0x24, 0x31, 0x3a, - 0xc9, 0x67, 0xd3, 0x02, 0x30, 0x06, 0x03, 0xe3, 0x42, 0x66, 0x00, 0x68, 0xff, 0x2c, 0x81, 0x3c, - 0x32, 0x83, 0xc4, 0x62, 0x3f, 0x7c, 0x46, 0xd8, 0x25, 0x98, 0x11, 0x00, 0x22, 0x1f, 0xa3, 0xdf, - 0x4b, 0x60, 0xa6, 0x47, 0x32, 0x86, 0x91, 0x47, 0x6e, 0x14, 0xe8, 0x8c, 0xa0, 0x11, 0x7d, 0xa6, - 0xbd, 0x4f, 0xe8, 0xc0, 0x43, 0x32, 0x3f, 0xe9, 0xe0, 0xd0, 0xc7, 0x11, 0x26, 0x62, 0x4b, 0xfb, - 0x57, 0x09, 0x00, 0x03, 0x7a, 0x4e, 0xf7, 0x32, 0xdc, 0x70, 0x2d, 0xed, 0xd1, 0x11, 0x00, 0xb4, - 0xd9, 0xe7, 0xa2, 0x66, 0xff, 0x39, 0x49, 0xd4, 0xf9, 0x97, 0xd3, 0xbc, 0x80, 0x78, 0x8c, 0xf8, - 0x9f, 0x01, 0xa6, 0xa8, 0x1c, 0xa9, 0x4d, 0x29, 0x26, 0xfc, 0xe0, 0x23, 0xed, 0x83, 0x42, 0xce, - 0xc3, 0x22, 0x1c, 0xa5, 0x03, 0xa0, 0x3c, 0x02, 0x00, 0xc7, 0xc1, 0x6c, 0x00, 0xc0, 0x86, 0x51, - 0x55, 0xa0, 0xf6, 0x6e, 0x19, 0x7b, 0x58, 0x90, 0xc1, 0xed, 0xf0, 0x3d, 0xcd, 0x5f, 0x0a, 0x4f, - 0xf6, 0x19, 0x79, 0x84, 0xe5, 0x67, 0x04, 0xd0, 0xef, 0x08, 0xcd, 0xee, 0x05, 0x18, 0x7a, 0xa4, - 0xf4, 0x57, 0x67, 0x75, 0x30, 0xcf, 0x59, 0x25, 0xea, 0x69, 0x70, 0x92, 0x4b, 0x20, 0xe3, 0x5d, - 0x47, 0x39, 0xa6, 0x6a, 0xe0, 0x14, 0xf7, 0x86, 0x3e, 0xc0, 0x8e, 0x92, 0xd3, 0x1e, 0xfe, 0x42, - 0x2e, 0x5c, 0xef, 0x79, 0x7f, 0x9e, 0xae, 0xb4, 0x7d, 0x8a, 0x0f, 0x76, 0xd9, 0x76, 0x6c, 0x1f, - 0x3e, 0xc8, 0xb8, 0xa9, 0x84, 0x09, 0x89, 0x56, 0xc3, 0x69, 0x30, 0xe5, 0xbb, 0xac, 0xeb, 0x4a, - 0xf0, 0xc8, 0x2a, 0x56, 0x81, 0x57, 0xac, 0x3a, 0x38, 0x6b, 0xd9, 0xed, 0xee, 0x5e, 0x07, 0x1a, - 0xb0, 0x6b, 0x22, 0x19, 0x7a, 0x25, 0xaf, 0x02, 0x7b, 0xd0, 0xee, 0x40, 0xdb, 0x27, 0x7c, 0x06, - 0xe7, 0x5e, 0x05, 0x72, 0xf2, 0xca, 0x78, 0x37, 0xaf, 0x8c, 0x8f, 0x1b, 0xb4, 0x84, 0x9b, 0xb0, - 0xde, 0x77, 0x07, 0x00, 0xa4, 0x6e, 0xe7, 0x2c, 0x78, 0x85, 0xaa, 0xe1, 0x35, 0x7d, 0xab, 0x7e, - 0x8d, 0x30, 0x83, 0xc1, 0x64, 0xd6, 0xbe, 0x1c, 0xaa, 0xdf, 0x33, 0x39, 0xf5, 0xbb, 0x55, 0x90, - 0x85, 0x74, 0x5a, 0xd7, 0x1b, 0x41, 0xeb, 0xe6, 0xc1, 0x4c, 0xb4, 0x9b, 0x2c, 0xab, 0xd7, 0x80, - 0xab, 0x03, 0x0f, 0xe3, 0xba, 0xae, 0x57, 0x9a, 0x9b, 0x1b, 0xeb, 0x2b, 0x46, 0xa9, 0xa2, 0x2b, - 0x00, 0xe9, 0x27, 0xd1, 0xcb, 0xd0, 0x31, 0x38, 0xaf, 0xfd, 0xa1, 0x04, 0x0a, 0xf8, 0xd0, 0xb6, - 0xf6, 0xfd, 0x63, 0xd2, 0x1c, 0x8f, 0x73, 0x7a, 0x0a, 0xc7, 0x5d, 0xf1, 0x2b, 0x4c, 0xa8, 0x30, - 0x31, 0x57, 0x87, 0xba, 0xc2, 0x24, 0x81, 0x50, 0xf6, 0x33, 0x21, 0xd4, 0x24, 0x9b, 0x3b, 0xce, - 0x95, 0xff, 0xcc, 0x4d, 0x12, 0xd5, 0xff, 0x88, 0x9b, 0xe4, 0x00, 0x16, 0x26, 0xde, 0x24, 0x07, - 0xb4, 0xbb, 0x84, 0x66, 0xaa, 0x7d, 0xa4, 0x10, 0xce, 0xff, 0x3e, 0x29, 0x1d, 0x6a, 0xef, 0xab, - 0x04, 0xe6, 0x2d, 0xdb, 0x87, 0xae, 0x6d, 0x76, 0x97, 0xbb, 0xe6, 0x76, 0x60, 0x9f, 0xf6, 0x6f, - 0x78, 0x54, 0x99, 0x3c, 0x06, 0xff, 0x85, 0x7a, 0x06, 0x00, 0x1f, 0xee, 0xf6, 0xba, 0xa6, 0x1f, - 0xa9, 0x1e, 0x93, 0xc2, 0x6a, 0x5f, 0x9e, 0xd7, 0xbe, 0x27, 0x82, 0xab, 0x08, 0x68, 0xad, 0xfd, - 0x1e, 0xdc, 0xb0, 0xad, 0x67, 0xef, 0xe1, 0xd8, 0xc8, 0x44, 0x47, 0x07, 0xbd, 0xe2, 0x76, 0x80, - 0x8a, 0xfc, 0x0e, 0x90, 0x7a, 0x17, 0xb8, 0x06, 0x87, 0xbd, 0xc6, 0x77, 0x84, 0x9c, 0xb7, 0x3a, - 0xdb, 0xd0, 0xaf, 0x6e, 0xad, 0x59, 0x9e, 0x67, 0xd9, 0xdb, 0x78, 0x3a, 0x3e, 0x6d, 0xc4, 0x67, - 0xd0, 0xfe, 0x56, 0x38, 0xee, 0x52, 0xd0, 0x67, 0x0c, 0x89, 0xbb, 0x14, 0xb6, 0x53, 0xb9, 0xaf, - 0x9d, 0x86, 0xab, 0x3a, 0x79, 0x81, 0x55, 0x1d, 0x16, 0xd3, 0x82, 0xe0, 0xea, 0xc0, 0x6b, 0x85, - 0x02, 0x3b, 0x25, 0x55, 0x23, 0xfb, 0xbe, 0xef, 0x1b, 0x32, 0x58, 0x20, 0x45, 0x2f, 0x39, 0xce, - 0xa5, 0x5d, 0xd3, 0xbd, 0xa4, 0xfd, 0xe4, 0xe1, 0x76, 0x71, 0x13, 0x77, 0xaf, 0xe2, 0xb6, 0x64, - 0xfb, 0x94, 0x37, 0xdf, 0xaf, 0xbc, 0xda, 0x6f, 0x0b, 0x4f, 0x49, 0x38, 0x79, 0x06, 0x95, 0x9a, - 0xcc, 0xf6, 0x96, 0xd8, 0xf1, 0x46, 0x11, 0x06, 0xb3, 0x07, 0xfe, 0x37, 0x43, 0xe0, 0x83, 0x71, - 0x84, 0xdd, 0x19, 0x18, 0x27, 0xee, 0xda, 0x57, 0x46, 0xc3, 0x2e, 0xe0, 0x6b, 0x04, 0xec, 0x14, - 0x20, 0x5f, 0x0a, 0x9d, 0x91, 0xd0, 0x5f, 0xb6, 0x42, 0xf9, 0xec, 0xd0, 0x8c, 0x61, 0x79, 0x22, - 0x68, 0x9e, 0xe4, 0x59, 0x68, 0xf4, 0x32, 0xc5, 0xf4, 0x4b, 0xc2, 0x3b, 0x6e, 0x03, 0x05, 0x44, - 0xb8, 0x9b, 0x4c, 0xab, 0x14, 0xdb, 0xae, 0x13, 0x67, 0x33, 0x7b, 0x34, 0x5f, 0x5c, 0x00, 0x33, - 0x41, 0xfc, 0x2b, 0x7c, 0xa3, 0x60, 0x88, 0xe1, 0x29, 0x50, 0xf4, 0x9c, 0x3d, 0xb7, 0x0d, 0xe9, - 0x1e, 0x28, 0x7d, 0x1a, 0x61, 0xbf, 0x6e, 0xa8, 0xb9, 0x70, 0xc0, 0x22, 0xc9, 0xa7, 0xb6, 0x48, - 0xe2, 0xed, 0xdd, 0x04, 0xfb, 0x41, 0x7b, 0x89, 0xf0, 0xb5, 0x1f, 0x1c, 0x66, 0x4d, 0xe8, 0x3f, - 0x12, 0x8d, 0x80, 0x5f, 0x13, 0xda, 0x0d, 0x1a, 0x52, 0x93, 0x74, 0x2a, 0xd7, 0x18, 0xc1, 0x0e, - 0x7e, 0x34, 0x78, 0x54, 0x90, 0x83, 0x1a, 0xc0, 0xd8, 0xe0, 0xdd, 0x30, 0x6a, 0x8a, 0xac, 0x3d, - 0x2f, 0x0f, 0x14, 0xc2, 0x5a, 0x23, 0xb4, 0x05, 0xb5, 0x97, 0xe7, 0x8e, 0xda, 0xe0, 0x8d, 0x9f, - 0xc1, 0xfe, 0x9e, 0x24, 0x1a, 0x2c, 0x9c, 0x13, 0x7c, 0x54, 0xbb, 0x18, 0x4d, 0x1a, 0xa1, 0x99, - 0x25, 0x28, 0x9f, 0xf6, 0x96, 0x9c, 0x48, 0xec, 0x71, 0x31, 0x16, 0xb3, 0xef, 0x95, 0xbe, 0x99, - 0x0f, 0xc2, 0x18, 0x2e, 0xbb, 0xce, 0xee, 0x86, 0xdb, 0xd5, 0xfe, 0x4d, 0xe8, 0x6a, 0x87, 0x98, - 0xd9, 0x85, 0x14, 0x3f, 0xbb, 0xc0, 0x2b, 0xd2, 0xdd, 0x68, 0x2b, 0xac, 0x3b, 0xc2, 0xf0, 0xad, - 0xde, 0x04, 0x16, 0xcc, 0x4e, 0x67, 0xdd, 0xdc, 0x86, 0x65, 0x34, 0x6d, 0xb7, 0x7d, 0x1a, 0xe2, - 0xac, 0x2f, 0x35, 0x71, 0x2a, 0xc3, 0xf7, 0x91, 0x53, 0x07, 0xac, 0x52, 0xf1, 0x65, 0x58, 0x0e, - 0x44, 0x2a, 0xbf, 0x89, 0x0c, 0x7f, 0x68, 0xc8, 0x68, 0xef, 0x98, 0x51, 0x40, 0x46, 0xfa, 0x24, - 0xe8, 0x8b, 0x25, 0xc0, 0x77, 0xf6, 0x9a, 0xf7, 0xab, 0x12, 0x98, 0x42, 0x78, 0x94, 0x3a, 0x1d, - 0xed, 0xb1, 0x5c, 0xdc, 0xd2, 0x58, 0x6f, 0xb8, 0x17, 0x0a, 0xbb, 0x21, 0x06, 0x35, 0x24, 0xf4, - 0x63, 0x30, 0x89, 0x84, 0x28, 0x71, 0x42, 0x14, 0xf3, 0x36, 0x4c, 0x2c, 0x22, 0x7b, 0xf1, 0x7d, - 0x46, 0x02, 0xf3, 0xc1, 0x3c, 0x63, 0x19, 0xfa, 0xed, 0x1d, 0xed, 0x0e, 0xd1, 0x75, 0x2e, 0xda, - 0x12, 0xc3, 0x2d, 0xe1, 0xae, 0xf6, 0xed, 0x5c, 0x4a, 0x95, 0xe7, 0x4a, 0x8e, 0x59, 0x24, 0x4c, - 0xa5, 0x8b, 0x49, 0x04, 0xb3, 0x17, 0xe6, 0x97, 0x25, 0x00, 0x5a, 0x4e, 0x38, 0x59, 0x3e, 0x84, - 0x24, 0x7f, 0x4a, 0x78, 0xb7, 0x98, 0x56, 0x3c, 0x2a, 0x36, 0x7d, 0xcf, 0x21, 0xe8, 0x4c, 0x35, - 0xac, 0xa4, 0x89, 0xb4, 0xf5, 0x99, 0xca, 0x5e, 0xaf, 0x6b, 0xb5, 0x4d, 0xbf, 0xdf, 0x03, 0x30, - 0x5e, 0xbc, 0xf8, 0x3a, 0xee, 0x54, 0x46, 0x63, 0x58, 0x46, 0x8c, 0x2c, 0x49, 0x9c, 0x1f, 0x29, - 0x88, 0xf3, 0x23, 0xe8, 0xd5, 0x33, 0x84, 0xf8, 0x04, 0xd4, 0x53, 0x06, 0xc7, 0x1b, 0x3d, 0x68, - 0x2f, 0xb9, 0xd0, 0xec, 0xb4, 0xdd, 0xbd, 0xdd, 0x8b, 0x1e, 0xeb, 0xbe, 0x9a, 0xac, 0xa3, 0xcc, - 0xca, 0xb5, 0xc4, 0xad, 0x5c, 0x6b, 0x3f, 0x22, 0x8b, 0x46, 0x62, 0x63, 0xf6, 0x57, 0x18, 0x1e, - 0x46, 0x18, 0xea, 0x52, 0x39, 0x5d, 0xf5, 0x2d, 0x52, 0xe7, 0xd3, 0x2c, 0x52, 0xbf, 0x59, 0x28, - 0xae, 0x9b, 0x50, 0xbd, 0x26, 0xe2, 0x3b, 0xb7, 0xd0, 0x84, 0x7e, 0x0c, 0xbc, 0x37, 0x82, 0xf9, - 0x8b, 0xd1, 0x9b, 0x10, 0x62, 0x3e, 0x71, 0x80, 0x47, 0xeb, 0x5b, 0xd3, 0xae, 0xd0, 0xf0, 0x2c, - 0xc4, 0xa0, 0x1b, 0x22, 0x28, 0x89, 0xb8, 0xcd, 0xa5, 0x5a, 0x6e, 0x49, 0x2c, 0x3f, 0x7b, 0x14, - 0x3e, 0x21, 0x81, 0x59, 0x7c, 0xc9, 0xf8, 0xd2, 0x3e, 0x3e, 0xc8, 0x29, 0x68, 0x94, 0xbc, 0x98, - 0x15, 0xb3, 0x0a, 0xf2, 0x5d, 0xcb, 0xbe, 0x14, 0xf8, 0x3b, 0xa2, 0xff, 0xd1, 0x15, 0xa5, 0xd2, - 0x80, 0x2b, 0x4a, 0xc3, 0x6d, 0x92, 0xb0, 0xdc, 0x98, 0xd1, 0xf4, 0x0d, 0x39, 0x91, 0x2b, 0x4a, - 0x87, 0x92, 0xcb, 0x5e, 0x8c, 0x7f, 0x9d, 0x07, 0xc5, 0x26, 0x34, 0xdd, 0xf6, 0x8e, 0xf6, 0x7e, - 0x69, 0xe0, 0x54, 0x62, 0x9a, 0x9f, 0x4a, 0x2c, 0x83, 0xa9, 0x2d, 0xab, 0xeb, 0x43, 0x97, 0xf8, - 0x80, 0xb3, 0x5d, 0x3b, 0x69, 0xe2, 0x4b, 0x5d, 0xa7, 0x7d, 0x69, 0x91, 0x9a, 0xf6, 0x8b, 0x41, - 0xbc, 0xe8, 0xc5, 0x65, 0xfc, 0x91, 0x11, 0x7c, 0x8c, 0x0c, 0x42, 0xcf, 0x71, 0xfd, 0xb8, 0xfb, - 0x87, 0x62, 0xa8, 0x34, 0x1d, 0xd7, 0x37, 0xc8, 0x87, 0x08, 0xe6, 0xad, 0xbd, 0x6e, 0xb7, 0x05, - 0x1f, 0xf4, 0x83, 0x69, 0x5d, 0xf0, 0x8c, 0x8c, 0x45, 0x67, 0x6b, 0xcb, 0x83, 0x64, 0x51, 0xa1, - 0x60, 0xd0, 0x27, 0xf5, 0x24, 0x28, 0x74, 0xad, 0x5d, 0x8b, 0x4c, 0x44, 0x0a, 0x06, 0x79, 0x50, - 0x6f, 0x01, 0x4a, 0x34, 0x07, 0x22, 0x8c, 0x9e, 0x2e, 0xe2, 0xa6, 0x79, 0x20, 0x1d, 0xe9, 0xcc, - 0x25, 0xb8, 0xef, 0x9d, 0x9e, 0xc2, 0xef, 0xf1, 0x7f, 0xfe, 0xc0, 0x8d, 0xc8, 0x86, 0x09, 0x91, - 0x78, 0xfc, 0x0c, 0xd7, 0x85, 0x6d, 0xc7, 0xed, 0x04, 0xb2, 0x89, 0x9f, 0x60, 0xd0, 0x7c, 0xe9, - 0xb6, 0x39, 0x06, 0x16, 0x9e, 0xbd, 0xa6, 0xbd, 0xa7, 0x88, 0xba, 0x4d, 0x54, 0xf4, 0x79, 0xcb, - 0xdf, 0x59, 0x83, 0xbe, 0xa9, 0xfd, 0xb5, 0x3c, 0x50, 0xe3, 0x66, 0xff, 0x7f, 0x8d, 0x1b, 0xa2, - 0x71, 0x24, 0xe6, 0x97, 0xbf, 0xe7, 0xda, 0x48, 0x8e, 0xd4, 0x8f, 0x96, 0x49, 0x51, 0xef, 0x02, - 0xd7, 0x44, 0x4f, 0xc1, 0x52, 0x6a, 0x85, 0x71, 0xad, 0x9d, 0x36, 0xe2, 0x33, 0xa8, 0xeb, 0xe0, - 0x06, 0xf2, 0x72, 0xb5, 0xb5, 0x56, 0x5b, 0xb5, 0xb6, 0x77, 0xba, 0xd6, 0xf6, 0x8e, 0xef, 0x55, - 0x6d, 0xcf, 0x87, 0x66, 0xa7, 0xb1, 0x65, 0x90, 0x9b, 0xc3, 0x00, 0xa6, 0x23, 0x92, 0x95, 0xf7, - 0x11, 0x17, 0x1b, 0xdd, 0x58, 0x4d, 0x89, 0x69, 0x29, 0x4f, 0x45, 0x2d, 0xc5, 0xdb, 0xeb, 0x86, - 0x98, 0x5e, 0xdb, 0x87, 0x69, 0xa4, 0xea, 0x7b, 0x5d, 0xdc, 0x5c, 0x70, 0xe6, 0xb4, 0xe3, 0x5c, - 0x02, 0x27, 0xd9, 0x37, 0x9b, 0x7f, 0x2b, 0x82, 0xc2, 0x8a, 0x6b, 0xf6, 0x76, 0xb4, 0xe7, 0x31, - 0xfd, 0xf3, 0xb8, 0xda, 0x44, 0xa8, 0x9d, 0xd2, 0x30, 0xed, 0x94, 0x87, 0x68, 0x67, 0x9e, 0xd1, - 0xce, 0xf8, 0x45, 0xe7, 0xb3, 0x60, 0xae, 0xed, 0x74, 0xbb, 0xb0, 0x8d, 0xe4, 0x51, 0xed, 0xe0, - 0xd5, 0x9e, 0x19, 0x83, 0x4b, 0xc3, 0x31, 0xf5, 0xa1, 0xdf, 0x24, 0x6b, 0xec, 0x44, 0xe9, 0xa3, - 0x04, 0xed, 0xe5, 0x12, 0xc8, 0xeb, 0x9d, 0x6d, 0xc8, 0xad, 0xc3, 0xe7, 0x98, 0x75, 0xf8, 0x53, - 0xa0, 0xe8, 0x9b, 0xee, 0x36, 0xf4, 0x83, 0x75, 0x02, 0xf2, 0x14, 0x86, 0xfa, 0x97, 0x99, 0x50, - 0xff, 0xdf, 0x0b, 0xf2, 0x48, 0x66, 0xd4, 0x2d, 0xfe, 0x86, 0x41, 0xf0, 0x63, 0xd9, 0x2f, 0xa2, - 0x12, 0x17, 0x51, 0xad, 0x0d, 0xfc, 0x41, 0x3f, 0xd6, 0x85, 0x83, 0xa1, 0x68, 0xaf, 0x05, 0x33, - 0x56, 0xdb, 0xb1, 0xab, 0xbb, 0xe6, 0x36, 0xa4, 0xd5, 0x8c, 0x12, 0x82, 0xb7, 0xfa, 0xae, 0xf3, - 0x80, 0x45, 0x17, 0xb5, 0xa2, 0x04, 0x54, 0x85, 0x1d, 0xab, 0xd3, 0x81, 0x36, 0x6d, 0xd9, 0xf4, - 0xe9, 0xec, 0x19, 0x90, 0x47, 0x3c, 0x20, 0xfd, 0x41, 0xc6, 0x82, 0x72, 0x4c, 0x9d, 0x43, 0xcd, - 0x8a, 0x34, 0x5e, 0x25, 0xc7, 0xaf, 0xb9, 0x8a, 0x78, 0x0d, 0x91, 0xca, 0x0d, 0x6e, 0x5c, 0x4f, - 0x00, 0x05, 0xdb, 0xe9, 0xc0, 0xa1, 0x83, 0x10, 0xc9, 0xa5, 0x3e, 0x05, 0x14, 0x60, 0x07, 0xf5, - 0x0a, 0x32, 0xce, 0x7e, 0x26, 0x59, 0x96, 0x06, 0xc9, 0x9c, 0xce, 0x35, 0x69, 0x10, 0xb7, 0xd9, - 0x37, 0xc0, 0x1f, 0x9b, 0x02, 0xc7, 0x49, 0x1f, 0xd0, 0xdc, 0xbb, 0x88, 0x48, 0x5d, 0x84, 0xda, - 0xeb, 0x07, 0x0f, 0x5c, 0xc7, 0x79, 0x65, 0x3f, 0x09, 0x0a, 0xde, 0xde, 0xc5, 0xd0, 0x08, 0x25, - 0x0f, 0x6c, 0xd3, 0x95, 0xc6, 0x32, 0x9c, 0xc9, 0xa3, 0x0e, 0x67, 0xdc, 0xd0, 0x24, 0x07, 0x8d, - 0x3f, 0x1a, 0xc8, 0xc8, 0x81, 0x8e, 0x60, 0x20, 0x1b, 0x34, 0x0c, 0x9d, 0x06, 0x53, 0xe6, 0x96, - 0x0f, 0xdd, 0xc8, 0x4c, 0xa4, 0x8f, 0x68, 0xa8, 0xbc, 0x08, 0xb7, 0x1c, 0x17, 0x89, 0x85, 0x84, - 0x85, 0x0d, 0x9f, 0x99, 0x96, 0x0b, 0xb8, 0x1d, 0xb4, 0x5b, 0xc1, 0x09, 0xdb, 0xa9, 0xc0, 0x1e, - 0x95, 0x33, 0x41, 0x71, 0x9e, 0xdc, 0xce, 0x7e, 0xe0, 0xc5, 0x81, 0xae, 0x64, 0xe1, 0x60, 0x57, - 0xa2, 0x7d, 0x2e, 0xed, 0x9c, 0xb9, 0x0f, 0xe8, 0xb1, 0x59, 0x68, 0xea, 0xd3, 0xc1, 0x5c, 0x87, - 0x7a, 0x88, 0xb5, 0xad, 0xb0, 0x95, 0xc4, 0x7e, 0xc7, 0x65, 0x8e, 0x14, 0x29, 0xcf, 0x2a, 0xd2, - 0x0a, 0x98, 0xc6, 0x47, 0xaf, 0x91, 0x26, 0x15, 0xfa, 0x3c, 0xf2, 0xf1, 0xb4, 0x2e, 0xac, 0x14, - 0x23, 0xb6, 0xc5, 0x32, 0xfd, 0xc4, 0x08, 0x3f, 0x4e, 0x37, 0xfb, 0x4e, 0x96, 0x50, 0xf6, 0xcd, - 0xf1, 0x97, 0x8b, 0xe0, 0x9a, 0xb2, 0xeb, 0x78, 0x1e, 0x3e, 0x82, 0xd3, 0xdf, 0x30, 0xdf, 0x28, - 0x71, 0x97, 0xfe, 0x3c, 0xa2, 0x9b, 0xdf, 0xa0, 0x06, 0x35, 0xb9, 0xa6, 0xf1, 0x97, 0xc2, 0x41, - 0x6b, 0xc2, 0xfd, 0x87, 0x18, 0xa1, 0xff, 0xe7, 0x68, 0x24, 0xef, 0xc9, 0x89, 0xc4, 0xd1, 0x49, - 0x29, 0xab, 0xec, 0x9b, 0xcb, 0x97, 0x24, 0xf0, 0xe8, 0x7e, 0x6e, 0x36, 0x6c, 0x2f, 0x6c, 0x30, - 0xd7, 0x0d, 0x69, 0x2f, 0x7c, 0xdc, 0x95, 0xc4, 0x3b, 0x7e, 0x63, 0xea, 0xce, 0x94, 0x16, 0xb3, - 0x58, 0x12, 0x1d, 0xe8, 0x49, 0xba, 0xe3, 0x37, 0x35, 0xf9, 0xec, 0x85, 0xfb, 0x7b, 0x79, 0x70, - 0x7c, 0xc5, 0x75, 0xf6, 0x7a, 0x5e, 0xd4, 0x03, 0xfd, 0xe9, 0xe0, 0x0d, 0xd9, 0xa2, 0x88, 0x69, - 0x70, 0x3d, 0x98, 0x75, 0xa9, 0x35, 0x17, 0x6d, 0xcf, 0xb2, 0x49, 0x6c, 0xef, 0x25, 0x1f, 0xa6, - 0xf7, 0x8a, 0xfa, 0x99, 0x3c, 0xd7, 0xcf, 0xf4, 0xf7, 0x1c, 0x85, 0x01, 0x3d, 0xc7, 0x9f, 0x48, - 0x29, 0x07, 0xd5, 0x3e, 0x11, 0xc5, 0xf4, 0x17, 0x65, 0x50, 0xdc, 0xc6, 0x19, 0x69, 0x77, 0xf1, - 0x78, 0xb1, 0x9a, 0x61, 0xe2, 0x06, 0xfd, 0x34, 0x92, 0xab, 0xcc, 0xea, 0x70, 0xaa, 0x01, 0x2e, - 0x99, 0xdb, 0xec, 0x95, 0xea, 0xe1, 0x3c, 0x98, 0x0b, 0x4b, 0xaf, 0x76, 0x3c, 0x2e, 0xba, 0x2b, - 0xa3, 0x51, 0xf3, 0x22, 0x1a, 0x75, 0x60, 0x9d, 0x39, 0x1c, 0x75, 0x64, 0x66, 0xd4, 0x19, 0x38, - 0xba, 0xcc, 0xc5, 0x8c, 0x2e, 0xda, 0x73, 0x65, 0xd1, 0x6b, 0xf3, 0xf8, 0xae, 0x15, 0xd7, 0xe6, - 0x91, 0x3c, 0x58, 0x08, 0x5e, 0xde, 0x37, 0xbc, 0x56, 0xd9, 0x2b, 0xc9, 0x87, 0x25, 0x70, 0xe2, - 0x60, 0x67, 0xfe, 0x5d, 0xbc, 0x97, 0x1a, 0xaa, 0x93, 0x17, 0x7a, 0xa9, 0xe1, 0x27, 0x7e, 0x93, - 0x2e, 0x31, 0x08, 0x0a, 0x67, 0xef, 0x0d, 0xef, 0xc4, 0xc5, 0xc2, 0x9c, 0x08, 0x12, 0xcd, 0x5e, - 0x80, 0x3f, 0x2d, 0x83, 0x99, 0x26, 0xf4, 0x6b, 0xe6, 0xbe, 0xb3, 0xe7, 0x6b, 0xa6, 0xe8, 0xf6, - 0xdc, 0xd3, 0x40, 0xb1, 0x8b, 0x3f, 0xc1, 0x1d, 0x0c, 0x1b, 0x74, 0x94, 0xdd, 0xdf, 0xc2, 0xbe, - 0x41, 0x84, 0xb4, 0x41, 0xf3, 0xf3, 0xd1, 0x67, 0x44, 0x76, 0x47, 0x43, 0xee, 0xc6, 0xb2, 0xb5, - 0x93, 0x6a, 0xef, 0x34, 0xae, 0xe8, 0xec, 0x61, 0xf9, 0x11, 0x19, 0xcc, 0x37, 0xa1, 0x5f, 0xf5, - 0x96, 0xcd, 0xcb, 0x8e, 0x6b, 0xf9, 0x50, 0x5b, 0x11, 0x85, 0xe6, 0x0c, 0x00, 0x56, 0xf8, 0x19, - 0x8d, 0x89, 0xc5, 0xa4, 0x68, 0x6f, 0x49, 0xeb, 0x28, 0xc4, 0xf1, 0x31, 0x16, 0x10, 0x52, 0xf9, - 0x58, 0x24, 0x15, 0x3f, 0x81, 0x8b, 0xbf, 0x25, 0x0a, 0x44, 0xc9, 0x6d, 0xef, 0x58, 0x97, 0x61, - 0x27, 0x25, 0x10, 0xc1, 0x67, 0x11, 0x10, 0x21, 0xa1, 0xd4, 0xee, 0x2b, 0x1c, 0x1f, 0xe3, 0x70, - 0x5f, 0x49, 0x22, 0x38, 0x91, 0xb0, 0x56, 0xa8, 0xeb, 0xa1, 0xeb, 0x99, 0xf7, 0x88, 0x8a, 0x35, - 0x32, 0xd9, 0x24, 0xd6, 0x64, 0x1b, 0xa9, 0x63, 0x21, 0x65, 0x0f, 0xd3, 0xe9, 0x7c, 0x16, 0x1d, - 0xcb, 0xc0, 0xa2, 0xb3, 0x17, 0xfa, 0xfb, 0x64, 0x70, 0x75, 0x18, 0xef, 0xa5, 0x09, 0xfd, 0x8a, - 0xe9, 0xed, 0x5c, 0x74, 0x4c, 0xb7, 0xa3, 0x95, 0xc7, 0x70, 0xe0, 0x50, 0xfb, 0x23, 0x16, 0x84, - 0x3a, 0x0f, 0xc2, 0x40, 0x57, 0xd2, 0x81, 0xbc, 0x8c, 0xa3, 0x93, 0x49, 0xf4, 0x76, 0x7d, 0x47, - 0x08, 0xd6, 0xb3, 0x38, 0xb0, 0xee, 0x1e, 0x95, 0xc5, 0xec, 0x81, 0xfb, 0x39, 0x32, 0x22, 0x30, - 0x5e, 0xcf, 0x17, 0x44, 0x01, 0x8b, 0xf1, 0x7a, 0x95, 0x63, 0xbd, 0x5e, 0x47, 0x1a, 0x23, 0x86, - 0x7a, 0x2c, 0x67, 0x3b, 0x46, 0x1c, 0xa1, 0x37, 0xf2, 0xbb, 0x64, 0xa0, 0xe0, 0x80, 0x5f, 0x8c, - 0x47, 0x38, 0x1b, 0x3f, 0x3b, 0x19, 0x9d, 0x03, 0xde, 0xe7, 0x53, 0x69, 0xbd, 0xcf, 0xb5, 0x77, - 0xa6, 0xf5, 0x31, 0xef, 0xe7, 0x76, 0x2c, 0x88, 0xa5, 0x72, 0x21, 0x1f, 0xc2, 0x41, 0xf6, 0xa0, - 0xfd, 0xb8, 0x0c, 0x00, 0x6a, 0xd0, 0xf4, 0x6c, 0xc4, 0xfd, 0xa2, 0x70, 0xdd, 0xc6, 0xfa, 0xdd, - 0x23, 0xa0, 0xae, 0xee, 0x03, 0x8a, 0x50, 0x8c, 0x4e, 0x5d, 0xbc, 0x3e, 0xad, 0x6f, 0x65, 0xc4, - 0xd5, 0x58, 0x60, 0x49, 0xe5, 0x6d, 0x19, 0x5b, 0x76, 0xf6, 0x80, 0xfc, 0x77, 0x09, 0x14, 0x5a, - 0x4e, 0x13, 0xfa, 0x87, 0x37, 0x05, 0x52, 0x47, 0x0d, 0xc0, 0xe5, 0x8e, 0x23, 0x6a, 0xc0, 0x20, - 0x42, 0xd9, 0x8b, 0xee, 0xbd, 0x12, 0x98, 0x6b, 0x39, 0xe5, 0x70, 0x71, 0x4a, 0xdc, 0x57, 0x55, - 0xfc, 0xea, 0xff, 0xb0, 0x82, 0x51, 0x31, 0x87, 0xba, 0xfa, 0x7f, 0x38, 0xbd, 0xec, 0xe5, 0x76, - 0x07, 0x38, 0xbe, 0x61, 0x77, 0x1c, 0x03, 0x76, 0x1c, 0xba, 0xd2, 0xad, 0xaa, 0x20, 0xbf, 0x67, - 0x77, 0x1c, 0xcc, 0x72, 0xc1, 0xc0, 0xff, 0x51, 0x9a, 0x0b, 0x3b, 0x0e, 0xf5, 0x0d, 0xc0, 0xff, - 0xb5, 0xbf, 0x94, 0x41, 0x1e, 0x7d, 0x2b, 0x2e, 0xea, 0x77, 0xc9, 0x29, 0xe3, 0x20, 0x20, 0xf2, - 0x63, 0xb1, 0x84, 0xee, 0x61, 0xd6, 0xfe, 0x89, 0x07, 0xeb, 0x0d, 0x71, 0xe5, 0x31, 0xa2, 0x88, - 0xd6, 0xfc, 0xd5, 0xd3, 0x60, 0xea, 0x62, 0xd7, 0x69, 0x5f, 0x8a, 0x8e, 0xeb, 0xd3, 0x47, 0xf5, - 0x16, 0x50, 0x70, 0x4d, 0x7b, 0x1b, 0xd2, 0x3d, 0x85, 0x93, 0x7d, 0x7d, 0x21, 0xf6, 0x7a, 0x31, - 0x48, 0x16, 0xed, 0x9d, 0x69, 0x22, 0x30, 0x0c, 0xa8, 0x7c, 0x3a, 0x7d, 0xa8, 0x8c, 0x70, 0xf2, - 0x4c, 0x01, 0x73, 0xe5, 0x52, 0x9d, 0xdc, 0x63, 0xd8, 0x38, 0xa7, 0x2b, 0x32, 0x86, 0x19, 0xc9, - 0x24, 0x43, 0x98, 0x11, 0xf9, 0xff, 0xb4, 0x30, 0x0f, 0xa8, 0xfc, 0x51, 0xc0, 0xfc, 0x19, 0x09, - 0xcc, 0xd7, 0x2c, 0xcf, 0x8f, 0xf3, 0xf6, 0x4f, 0x88, 0xf7, 0xfb, 0x92, 0xb4, 0xa6, 0x32, 0x57, - 0x8e, 0x70, 0xa0, 0xdf, 0x54, 0xe6, 0x70, 0x52, 0x11, 0x93, 0x39, 0x96, 0x82, 0x39, 0x20, 0x97, - 0xd8, 0x0b, 0x4b, 0x32, 0xb5, 0xa1, 0x14, 0x15, 0x32, 0x79, 0x43, 0x29, 0xb6, 0xec, 0xec, 0xe5, - 0xfb, 0x97, 0x12, 0x38, 0x81, 0x8a, 0x4f, 0x5a, 0x96, 0x8a, 0x17, 0xf3, 0xd0, 0x65, 0xa9, 0xd4, - 0x2b, 0xe3, 0x07, 0x78, 0x19, 0xc7, 0xca, 0xf8, 0x30, 0xa2, 0x13, 0x16, 0x73, 0xcc, 0x32, 0xec, - 0x30, 0x31, 0x27, 0x2c, 0xc3, 0x8e, 0x2e, 0xe6, 0xe4, 0xa5, 0xd8, 0x11, 0xc5, 0x7c, 0x64, 0x0b, - 0xac, 0xbf, 0x28, 0x87, 0x62, 0x8e, 0x5d, 0xdb, 0x48, 0x10, 0x73, 0xea, 0x13, 0xbd, 0xda, 0xbb, - 0x47, 0x14, 0xfc, 0x98, 0xd7, 0x37, 0x46, 0x81, 0xe9, 0x08, 0xd7, 0x38, 0x7e, 0x5e, 0x06, 0x0b, - 0x94, 0x8b, 0xc1, 0x53, 0xe6, 0x04, 0x8c, 0x52, 0x4f, 0x99, 0x53, 0x9f, 0x01, 0xe2, 0x39, 0x9b, - 0xfc, 0x19, 0xa0, 0xc4, 0xf2, 0xb3, 0x07, 0xe7, 0xaf, 0xf2, 0xe0, 0x14, 0x62, 0x61, 0xcd, 0xe9, - 0x58, 0x5b, 0xfb, 0x84, 0x8b, 0x73, 0x66, 0x77, 0x0f, 0x7a, 0xda, 0x07, 0x24, 0x51, 0x94, 0xfe, - 0x37, 0x00, 0x9c, 0x1e, 0x74, 0x49, 0x1c, 0x37, 0x0a, 0xd4, 0x5d, 0x71, 0x95, 0x3d, 0x58, 0x52, - 0x78, 0xfd, 0x4d, 0x23, 0x20, 0x62, 0x30, 0xf4, 0x90, 0x55, 0x38, 0x13, 0xbe, 0xe9, 0x77, 0xf0, - 0xc8, 0x1d, 0x74, 0xf0, 0xb8, 0x19, 0xc8, 0x66, 0xa7, 0x13, 0x42, 0xd5, 0xbf, 0x99, 0x8d, 0xcb, - 0x34, 0x50, 0x16, 0x94, 0xd3, 0x83, 0xd1, 0xd1, 0xbc, 0x98, 0x9c, 0x1e, 0xf4, 0xd5, 0x45, 0x50, - 0x24, 0xd7, 0x81, 0x87, 0x2b, 0xfa, 0x83, 0x33, 0xd3, 0x5c, 0xbc, 0x69, 0xd7, 0xe0, 0xd5, 0xf0, - 0x8e, 0x54, 0x92, 0x19, 0xd4, 0x4f, 0x47, 0x76, 0xb2, 0xc1, 0x29, 0xd8, 0x33, 0x46, 0xa6, 0x3c, - 0x99, 0xdd, 0xb0, 0x52, 0xaf, 0xd7, 0xdd, 0x6f, 0xd1, 0xc0, 0x03, 0xa9, 0x76, 0xc3, 0x98, 0xf8, - 0x05, 0xd2, 0x81, 0xf8, 0x05, 0xa9, 0x77, 0xc3, 0x38, 0x3e, 0xc6, 0xb1, 0x1b, 0x96, 0x44, 0x70, - 0x22, 0xf7, 0xf0, 0x60, 0xab, 0x99, 0xde, 0x46, 0xf0, 0x8f, 0x83, 0x3d, 0xab, 0x01, 0xef, 0xec, - 0x32, 0xe8, 0xa2, 0x82, 0xc4, 0x5b, 0x58, 0xd4, 0xa7, 0x80, 0xe2, 0x96, 0xe3, 0xee, 0x9a, 0xc1, - 0xc6, 0x7d, 0xff, 0x49, 0x11, 0x7a, 0x03, 0xc0, 0x32, 0xce, 0x63, 0xd0, 0xbc, 0x68, 0x3e, 0xf2, - 0x1c, 0xab, 0x47, 0x83, 0x3e, 0xa2, 0xbf, 0xea, 0x8d, 0x60, 0x9e, 0xc6, 0x7e, 0xac, 0x43, 0xcf, - 0x87, 0x1d, 0x1a, 0xd1, 0x82, 0x4f, 0x54, 0xcf, 0x82, 0x39, 0x9a, 0xb0, 0x6c, 0x75, 0xa1, 0x47, - 0x83, 0x5a, 0x70, 0x69, 0xea, 0x29, 0x50, 0xb4, 0xbc, 0x7b, 0x3d, 0xc7, 0xa6, 0x01, 0xf9, 0xe8, - 0x93, 0x7a, 0x33, 0x38, 0x4e, 0xf3, 0x85, 0xc6, 0x2a, 0x39, 0xb0, 0xd3, 0x9f, 0x8c, 0x54, 0xcb, - 0x76, 0xd6, 0x5d, 0x67, 0xdb, 0x85, 0x9e, 0x87, 0x4f, 0x4d, 0x4d, 0x1b, 0x4c, 0x8a, 0x7a, 0x01, - 0x9c, 0xe8, 0x5a, 0xf6, 0x25, 0x0f, 0xc7, 0x08, 0x5e, 0xa6, 0x6e, 0x63, 0x73, 0x03, 0x62, 0x77, - 0x33, 0x8d, 0x8d, 0xca, 0x81, 0xfd, 0xc4, 0x38, 0x48, 0x45, 0xbd, 0x05, 0x28, 0x94, 0x9b, 0x25, - 0xb3, 0x7d, 0x09, 0xbf, 0xa7, 0xee, 0xa8, 0x07, 0xd2, 0x19, 0x61, 0x90, 0x30, 0xfa, 0x0b, 0x9c, - 0x30, 0x48, 0x24, 0xfd, 0x97, 0xe5, 0xc0, 0x1c, 0x57, 0x80, 0x09, 0xd4, 0xa0, 0x5b, 0xf4, 0xce, - 0xef, 0x58, 0x3e, 0x44, 0xcc, 0xd1, 0xb3, 0x2e, 0x4f, 0x1a, 0xc2, 0xbc, 0x71, 0xe0, 0x43, 0x63, - 0x00, 0x31, 0xc4, 0x17, 0xe9, 0xf0, 0xb0, 0x67, 0x99, 0x47, 0x6d, 0x55, 0x2e, 0x4d, 0x7b, 0x0e, - 0x50, 0x0f, 0x52, 0x63, 0xbc, 0x40, 0x72, 0xe9, 0xbc, 0x40, 0x90, 0xdc, 0xcc, 0x6e, 0xd7, 0xb9, - 0x02, 0x3b, 0x21, 0x59, 0xaa, 0xab, 0x07, 0xd2, 0xb5, 0xcf, 0x8f, 0x32, 0x2f, 0x4c, 0x7d, 0xb1, - 0x06, 0x6a, 0x64, 0x7b, 0xed, 0x36, 0x84, 0x1d, 0x7a, 0x70, 0x2d, 0x78, 0x4c, 0x79, 0xe5, 0x46, - 0xea, 0x59, 0xe4, 0x11, 0xdd, 0xb9, 0xf1, 0xb1, 0xab, 0x41, 0x91, 0xdc, 0x5f, 0xa7, 0xbd, 0x6c, - 0x61, 0x60, 0x5f, 0xb3, 0xc0, 0xf7, 0x35, 0x1b, 0x60, 0xce, 0x76, 0x50, 0x71, 0xeb, 0xa6, 0x6b, - 0xee, 0x7a, 0x49, 0x8b, 0xc4, 0x84, 0x6e, 0x68, 0x11, 0xd4, 0x99, 0xcf, 0x56, 0x8f, 0x19, 0x1c, - 0x19, 0xf5, 0x7f, 0x07, 0xc7, 0x2f, 0xd2, 0x00, 0x0f, 0x1e, 0xa5, 0x2c, 0xc5, 0xbb, 0x50, 0xf6, - 0x51, 0x5e, 0xe2, 0xbf, 0x5c, 0x3d, 0x66, 0xf4, 0x13, 0x53, 0xff, 0x0b, 0x58, 0x40, 0x8f, 0x1d, - 0xe7, 0x4a, 0xc0, 0xb8, 0x1c, 0x6f, 0x47, 0xf6, 0x91, 0x5f, 0xe3, 0x3e, 0x5c, 0x3d, 0x66, 0xf4, - 0x91, 0x52, 0x1b, 0x00, 0xec, 0xf8, 0xbb, 0x5d, 0x4a, 0x38, 0x1f, 0xaf, 0x92, 0x7d, 0x84, 0x57, - 0xc3, 0x8f, 0x56, 0x8f, 0x19, 0x0c, 0x09, 0xb5, 0x06, 0x66, 0xfc, 0x07, 0x7d, 0x4a, 0xaf, 0x10, - 0xef, 0xbb, 0xd0, 0x47, 0xaf, 0x15, 0x7c, 0xb3, 0x7a, 0xcc, 0x88, 0x08, 0xa8, 0x55, 0x30, 0xdd, - 0xbb, 0x48, 0x89, 0x15, 0xe3, 0xfb, 0xbb, 0x3e, 0x62, 0xeb, 0x17, 0x43, 0x5a, 0xe1, 0xe7, 0x88, - 0xb1, 0xb6, 0x77, 0x99, 0xd2, 0x9a, 0x12, 0x66, 0xac, 0x1c, 0x7c, 0x83, 0x18, 0x0b, 0x09, 0xa8, - 0x55, 0x30, 0xe3, 0xd9, 0x66, 0xcf, 0xdb, 0x71, 0x7c, 0xef, 0xf4, 0x74, 0x9f, 0x9b, 0x6b, 0x3c, - 0xb5, 0x26, 0xfd, 0xc6, 0x88, 0xbe, 0x56, 0x9f, 0x02, 0xae, 0xde, 0xeb, 0x75, 0x4c, 0x1f, 0xea, - 0x0f, 0x5a, 0x9e, 0x6f, 0xd9, 0xdb, 0x41, 0x84, 0x62, 0x32, 0x58, 0x0c, 0x7e, 0xa9, 0x2e, 0xd2, - 0x03, 0x6f, 0x00, 0xb7, 0x4d, 0xad, 0x7f, 0xaf, 0x95, 0x14, 0xcb, 0x9c, 0x73, 0x7b, 0x3a, 0xc8, - 0xa3, 0x57, 0x78, 0x70, 0x59, 0x18, 0xbc, 0x8e, 0xdb, 0xaf, 0x3b, 0xb8, 0x01, 0xa3, 0x8f, 0xfa, - 0xc6, 0xa7, 0xb9, 0x03, 0xe3, 0xd3, 0xf5, 0x60, 0xd6, 0xf2, 0xd6, 0xac, 0x6d, 0x62, 0x1c, 0xd3, - 0xf1, 0x83, 0x4d, 0x22, 0x8b, 0x09, 0x75, 0x78, 0x85, 0x0c, 0x1c, 0xc7, 0x83, 0xc5, 0x84, 0x20, - 0x45, 0xbb, 0x09, 0xcc, 0xb1, 0x8d, 0x8c, 0x5c, 0x82, 0x6b, 0x45, 0xa6, 0x35, 0x7d, 0xd2, 0x6e, - 0x04, 0x0b, 0xbc, 0x4e, 0x33, 0x16, 0x84, 0x1c, 0x74, 0x85, 0xda, 0x0d, 0xe0, 0x78, 0x5f, 0xc3, - 0x0a, 0x42, 0xc6, 0xe4, 0xa2, 0x90, 0x31, 0xd7, 0x03, 0x10, 0x69, 0xf1, 0x40, 0x32, 0xd7, 0x81, - 0x99, 0x50, 0x2f, 0x07, 0x66, 0xf8, 0xb3, 0x1c, 0x98, 0x0e, 0x94, 0x6d, 0x50, 0x06, 0x34, 0x32, - 0xd9, 0xcc, 0xfe, 0x50, 0x30, 0x32, 0xb1, 0x69, 0xc8, 0x4c, 0x88, 0xbc, 0xb2, 0x5b, 0x96, 0xdf, - 0x0d, 0x4e, 0x36, 0xf6, 0x27, 0xab, 0xeb, 0x00, 0x58, 0x18, 0xa3, 0x56, 0x74, 0xd4, 0xf1, 0x89, - 0x29, 0xda, 0x03, 0xd1, 0x07, 0x86, 0xc6, 0xd9, 0xef, 0xa2, 0xe7, 0x10, 0x67, 0x40, 0x81, 0x84, - 0xe9, 0x3f, 0xa6, 0x2e, 0x00, 0xa0, 0xdf, 0xbf, 0xae, 0x1b, 0x55, 0xbd, 0x5e, 0xd6, 0x95, 0x9c, - 0xf6, 0x0a, 0x09, 0xcc, 0x84, 0x8d, 0x60, 0x60, 0x25, 0x75, 0xaa, 0x5a, 0x43, 0xef, 0x19, 0x3d, - 0xd8, 0xa8, 0x58, 0x25, 0x7b, 0x1a, 0x78, 0xd4, 0x9e, 0x07, 0x97, 0x2d, 0xd7, 0xf3, 0x0d, 0xe7, - 0xca, 0xb2, 0xe3, 0x46, 0x03, 0x2b, 0x09, 0x70, 0x1b, 0xf7, 0x1a, 0x19, 0x8c, 0x1d, 0x88, 0xcf, - 0xbc, 0x41, 0x97, 0x2e, 0xfc, 0x47, 0x09, 0x88, 0xae, 0xef, 0x9a, 0xb6, 0xd7, 0x73, 0x3c, 0x68, - 0x38, 0x57, 0xbc, 0x92, 0xdd, 0x29, 0x3b, 0xdd, 0xbd, 0x5d, 0xdb, 0xa3, 0x26, 0x5f, 0xdc, 0x6b, - 0x24, 0x1d, 0x7c, 0x8b, 0xf0, 0x02, 0x00, 0xe5, 0x46, 0xad, 0xa6, 0x97, 0x5b, 0xd5, 0x46, 0x5d, - 0x39, 0x86, 0xa4, 0xd5, 0x2a, 0x2d, 0xd5, 0x90, 0x74, 0xbe, 0x1f, 0x4c, 0x07, 0x6d, 0x9a, 0x46, - 0xb9, 0xc9, 0x05, 0x51, 0x6e, 0xd4, 0x12, 0x98, 0x0e, 0x5a, 0x39, 0x1d, 0x11, 0x1e, 0xdb, 0x7f, - 0xaa, 0x79, 0xd7, 0x74, 0x7d, 0x6c, 0xa0, 0x04, 0x44, 0x96, 0x4c, 0x0f, 0x1a, 0xe1, 0x67, 0x67, - 0x9f, 0x40, 0x39, 0x50, 0xc1, 0x42, 0xa9, 0x56, 0xdb, 0x6c, 0x18, 0x9b, 0xf5, 0x46, 0x6b, 0xb5, - 0x5a, 0x5f, 0x21, 0x23, 0x64, 0x75, 0xa5, 0xde, 0x30, 0x74, 0x32, 0x40, 0x36, 0x95, 0x1c, 0xb9, - 0xc5, 0x7a, 0x69, 0x1a, 0x14, 0x7b, 0x58, 0xba, 0xda, 0x97, 0xe4, 0x94, 0xe1, 0x0c, 0x42, 0x9c, - 0x62, 0xee, 0xd9, 0xe5, 0x8e, 0x14, 0x48, 0x03, 0x8e, 0xfc, 0x9e, 0x05, 0x73, 0xc4, 0x54, 0xf7, - 0xf0, 0xee, 0x0c, 0x46, 0x4e, 0x36, 0xb8, 0x34, 0xed, 0x13, 0x52, 0x8a, 0x18, 0x07, 0x03, 0x39, - 0x4a, 0x67, 0x5c, 0xfc, 0x7e, 0x6e, 0xb4, 0x4b, 0x2d, 0xaa, 0xf5, 0x96, 0x6e, 0xd4, 0x4b, 0x35, - 0x9a, 0x45, 0x56, 0x4f, 0x83, 0x93, 0xf5, 0x06, 0x0d, 0xe9, 0xd8, 0xdc, 0x6c, 0x35, 0x36, 0xab, - 0x6b, 0xeb, 0x0d, 0xa3, 0xa5, 0x14, 0xd4, 0x53, 0x40, 0x25, 0xff, 0x37, 0xab, 0xcd, 0xcd, 0x72, - 0xa9, 0x5e, 0xd6, 0x6b, 0x7a, 0x45, 0x29, 0xaa, 0x8f, 0x03, 0x37, 0x90, 0x4b, 0x92, 0x1a, 0xcb, - 0x9b, 0x46, 0xe3, 0x7c, 0x13, 0x21, 0x68, 0xe8, 0xb5, 0x12, 0x52, 0x24, 0xe6, 0x36, 0xeb, 0x29, - 0xf5, 0x2a, 0x70, 0x1c, 0x5f, 0x75, 0x5f, 0x6b, 0x94, 0x2a, 0xb4, 0xbc, 0x69, 0xf5, 0x5a, 0x70, - 0xba, 0x5a, 0x6f, 0x6e, 0x2c, 0x2f, 0x57, 0xcb, 0x55, 0xbd, 0xde, 0xda, 0x5c, 0xd7, 0x8d, 0xb5, - 0x6a, 0xb3, 0x89, 0xbe, 0x55, 0x66, 0xf0, 0x5d, 0xc1, 0xa4, 0xcf, 0xd4, 0xde, 0x2f, 0x83, 0xf9, - 0x73, 0x66, 0xd7, 0x42, 0x03, 0x05, 0xbe, 0x44, 0xbc, 0xef, 0x34, 0x90, 0x8f, 0x2f, 0x1b, 0xa7, - 0xe7, 0x09, 0xf0, 0x83, 0xf6, 0xc3, 0x72, 0xca, 0xd3, 0x40, 0x14, 0x08, 0x52, 0xe2, 0x22, 0x57, - 0x5a, 0xcc, 0xdc, 0xf5, 0xb5, 0x52, 0x8a, 0xd3, 0x40, 0xe2, 0xe4, 0xd3, 0x81, 0xff, 0x0b, 0xe3, - 0x02, 0x5f, 0x01, 0x73, 0x1b, 0xf5, 0xd2, 0x46, 0x6b, 0xb5, 0x61, 0x54, 0xbf, 0x0f, 0xc7, 0xb2, - 0x9f, 0x07, 0x33, 0xcb, 0x0d, 0x63, 0xa9, 0x5a, 0xa9, 0xe8, 0x75, 0xa5, 0xa0, 0x3e, 0x0a, 0x5c, - 0xd5, 0xd4, 0x8d, 0x73, 0xd5, 0xb2, 0xbe, 0xb9, 0x51, 0x2f, 0x9d, 0x2b, 0x55, 0x6b, 0xb8, 0x8f, - 0x28, 0x26, 0x5c, 0x80, 0x3e, 0xa5, 0xfd, 0x60, 0x1e, 0x00, 0x52, 0x75, 0x7c, 0x95, 0x13, 0x73, - 0x4d, 0xf6, 0x1f, 0xa6, 0x9d, 0x34, 0x44, 0x64, 0x62, 0xda, 0x6f, 0x15, 0x4c, 0xbb, 0xf4, 0x05, - 0x5d, 0x1d, 0x1b, 0x46, 0x87, 0xfc, 0x0d, 0xa8, 0x19, 0xe1, 0xe7, 0xda, 0x07, 0xd2, 0xcc, 0x11, - 0x62, 0x19, 0x4b, 0x87, 0xe4, 0xf2, 0x78, 0x80, 0xd4, 0x5e, 0x9c, 0x03, 0x0b, 0x7c, 0xc5, 0x50, - 0x25, 0xb0, 0x31, 0x25, 0x56, 0x09, 0xfe, 0x63, 0xc6, 0xc8, 0x3a, 0xfb, 0x64, 0x3a, 0x9c, 0x82, - 0xa0, 0x65, 0x92, 0x83, 0xfd, 0x81, 0xc5, 0xa2, 0xe4, 0x10, 0xf3, 0xc8, 0xe8, 0x50, 0x24, 0x75, - 0x0a, 0xc8, 0xad, 0x07, 0x7d, 0x45, 0xd6, 0xbe, 0x2e, 0x83, 0x79, 0xee, 0x1e, 0x6e, 0xed, 0x9d, - 0x39, 0x91, 0x3b, 0x72, 0x99, 0x1b, 0xbe, 0x73, 0x87, 0xbd, 0xe1, 0xfb, 0xec, 0x3d, 0x60, 0x8a, - 0xa6, 0x61, 0xf9, 0x36, 0xea, 0xc8, 0x14, 0x38, 0x0e, 0x66, 0x57, 0xf4, 0xd6, 0x66, 0xb3, 0x55, - 0x32, 0x5a, 0x7a, 0x45, 0xc9, 0xa1, 0x81, 0x4f, 0x5f, 0x5b, 0x6f, 0x5d, 0x50, 0x24, 0x34, 0x26, - 0xae, 0x6c, 0x54, 0x2b, 0xfa, 0x66, 0xa3, 0x5e, 0xbb, 0xa0, 0xc8, 0xe9, 0x1d, 0x2e, 0xfb, 0x19, - 0x9b, 0xb0, 0xc3, 0x65, 0x52, 0xf1, 0xd9, 0xcf, 0x5d, 0x3f, 0x27, 0x03, 0x85, 0x70, 0xa0, 0x3f, - 0xd8, 0x83, 0xae, 0x05, 0xed, 0x36, 0xd4, 0x2e, 0x89, 0x04, 0x80, 0x3d, 0x10, 0xfa, 0x10, 0xf7, - 0xef, 0x8c, 0xd5, 0x48, 0x1e, 0xfa, 0x0c, 0xee, 0xfc, 0x01, 0x83, 0xfb, 0xb7, 0xd3, 0x7a, 0x5c, - 0xf6, 0xb3, 0x3b, 0x16, 0xc8, 0x3e, 0x9d, 0xc6, 0xe3, 0x72, 0x08, 0x07, 0x13, 0x89, 0xeb, 0x1c, - 0x33, 0x1e, 0x2b, 0xb2, 0xf6, 0x22, 0x19, 0x1c, 0xaf, 0x98, 0x3e, 0x5c, 0xda, 0x6f, 0x05, 0xf7, - 0x66, 0xc6, 0xdc, 0x75, 0x9d, 0x3b, 0x70, 0xd7, 0x75, 0x74, 0xf5, 0xa6, 0xd4, 0x77, 0xf5, 0xa6, - 0xf6, 0x9e, 0xb4, 0x67, 0x34, 0xfb, 0x78, 0x18, 0x5b, 0xf0, 0xe5, 0x74, 0x67, 0x2f, 0x93, 0xb9, - 0xc8, 0xbe, 0x81, 0xbd, 0x7d, 0x06, 0x28, 0x84, 0x15, 0xc6, 0xa9, 0xf0, 0xa7, 0xe9, 0xf5, 0xf0, - 0x9b, 0x29, 0x62, 0x38, 0x06, 0x51, 0x31, 0x24, 0x3e, 0x2a, 0x06, 0xb7, 0x46, 0x2d, 0xf7, 0x3b, - 0x82, 0xa4, 0xed, 0x0c, 0x19, 0x0f, 0xc2, 0xf8, 0xb0, 0xb9, 0xd9, 0x75, 0x86, 0x89, 0xc5, 0x4f, - 0xe6, 0x0a, 0x63, 0x7a, 0x6b, 0xa8, 0x2e, 0x8a, 0x4c, 0xf2, 0x4d, 0xed, 0x69, 0xdd, 0xc9, 0x39, - 0x0f, 0xce, 0x84, 0xeb, 0xcb, 0xb3, 0x73, 0x27, 0x1f, 0xc6, 0x41, 0xf6, 0x28, 0x7c, 0x5b, 0x02, - 0xf9, 0xa6, 0xe3, 0xfa, 0xe3, 0xc2, 0x20, 0xed, 0x16, 0x38, 0x23, 0x81, 0x66, 0xfc, 0x1c, 0x34, - 0xbb, 0x2d, 0xf0, 0xe4, 0xf2, 0x27, 0x10, 0x06, 0xf3, 0x38, 0x58, 0x20, 0x9c, 0x84, 0x77, 0xc8, - 0xfc, 0xab, 0x44, 0xfa, 0xab, 0xfb, 0x44, 0x11, 0xc1, 0x1b, 0x21, 0xe1, 0x16, 0x74, 0x00, 0x0a, - 0x97, 0xa6, 0xbd, 0x91, 0xc5, 0xa5, 0xc2, 0xe3, 0x32, 0x68, 0x06, 0x1e, 0x5e, 0xc3, 0x32, 0xae, - 0x9e, 0x29, 0x4d, 0x44, 0xcd, 0x84, 0xc2, 0xb3, 0x47, 0xe4, 0x21, 0x19, 0x14, 0xa9, 0x0b, 0xe0, - 0x58, 0x11, 0x48, 0xdb, 0x32, 0x42, 0x21, 0x88, 0xb9, 0x0a, 0xca, 0xe3, 0x6e, 0x19, 0xc9, 0xe5, - 0x67, 0x8f, 0xc3, 0xbf, 0x53, 0xdf, 0xd6, 0xd2, 0x65, 0xd3, 0xea, 0x9a, 0x17, 0xbb, 0x29, 0x22, - 0x59, 0x7f, 0x22, 0xe5, 0x69, 0xbe, 0xb0, 0xaa, 0x5c, 0x79, 0x31, 0x12, 0xff, 0x1e, 0x30, 0xe3, - 0x72, 0x7b, 0x7f, 0xc8, 0x8a, 0xea, 0xf3, 0x2b, 0xa6, 0xef, 0x8d, 0x28, 0x67, 0xaa, 0xa3, 0x7b, - 0x42, 0xfc, 0x4c, 0xe4, 0xa8, 0xd1, 0x6c, 0xa9, 0xd3, 0x59, 0x86, 0xa6, 0xbf, 0xe7, 0xc2, 0x4e, - 0xaa, 0x21, 0xc2, 0xed, 0xdb, 0x1e, 0x65, 0x24, 0xc1, 0xc5, 0x92, 0xac, 0xf1, 0xe8, 0x3c, 0x75, - 0x48, 0x6f, 0x10, 0xf0, 0x32, 0x96, 0x2e, 0xe9, 0x6d, 0x21, 0x24, 0x0d, 0x0e, 0x92, 0xa7, 0x8f, - 0xc6, 0x44, 0xf6, 0x80, 0xfc, 0xac, 0x0c, 0x16, 0x88, 0x9d, 0x30, 0x6e, 0x4c, 0x3e, 0x94, 0xd2, - 0x65, 0x88, 0xb9, 0xa5, 0x8b, 0x65, 0x67, 0x2c, 0xb0, 0xa4, 0x71, 0x30, 0x12, 0xe3, 0x23, 0x7b, - 0x64, 0x9e, 0x7f, 0x02, 0x00, 0xc6, 0x0d, 0xf4, 0x13, 0xc5, 0x28, 0xae, 0xa3, 0xf6, 0x4e, 0x3a, - 0xff, 0x68, 0x72, 0x41, 0xc6, 0x19, 0x17, 0xcf, 0x70, 0x83, 0x8a, 0x4f, 0x14, 0x1a, 0x55, 0x7e, - 0x3f, 0xa5, 0xcd, 0x4b, 0x9d, 0x30, 0x87, 0x0e, 0xee, 0x23, 0xf6, 0x72, 0x9f, 0x4c, 0x61, 0xfc, - 0x0e, 0x63, 0x25, 0x1d, 0x6a, 0xb5, 0x11, 0x66, 0xf6, 0xa7, 0xc1, 0x49, 0x43, 0x2f, 0x55, 0x1a, - 0xf5, 0xda, 0x05, 0xf6, 0xca, 0x26, 0x45, 0x66, 0x27, 0x27, 0x99, 0xc0, 0xf6, 0xba, 0x94, 0x7d, - 0x20, 0x2f, 0xab, 0xa4, 0xd9, 0x0a, 0xb3, 0xb8, 0x32, 0xbc, 0x57, 0x13, 0x20, 0x7b, 0x94, 0x28, - 0x7c, 0xbd, 0x08, 0x66, 0x0d, 0xd8, 0x76, 0x76, 0x77, 0xa1, 0xdd, 0x81, 0x1d, 0xed, 0x75, 0x32, - 0x98, 0x0b, 0xf7, 0xff, 0x9a, 0xd0, 0xd7, 0xfe, 0x4b, 0x84, 0xcd, 0x59, 0x30, 0x87, 0x2a, 0xd7, - 0xe0, 0x03, 0xc7, 0x73, 0x69, 0xea, 0xad, 0xe0, 0x44, 0x80, 0x42, 0xa3, 0x6f, 0x0a, 0x73, 0xf0, - 0x85, 0xf6, 0x5e, 0x16, 0xa3, 0x0d, 0x1e, 0xa3, 0x7b, 0xe2, 0x85, 0x19, 0xb2, 0xbb, 0xc8, 0xb2, - 0x1a, 0x03, 0xd6, 0xef, 0x86, 0x60, 0xdd, 0xcf, 0x81, 0x55, 0x39, 0x24, 0xfd, 0xa3, 0x44, 0xed, - 0x57, 0x64, 0x70, 0x32, 0xe8, 0x88, 0x27, 0x87, 0xd6, 0x27, 0x59, 0xb4, 0xbe, 0x9f, 0x47, 0x6b, - 0x45, 0x44, 0x9a, 0x83, 0x58, 0x8e, 0x41, 0xed, 0x8b, 0x21, 0x6a, 0x3f, 0xc0, 0xa1, 0x56, 0x1b, - 0x53, 0x39, 0x47, 0x89, 0xde, 0x87, 0x64, 0x70, 0x1a, 0x99, 0x9d, 0x65, 0xc7, 0xde, 0xea, 0x5a, - 0x6d, 0xdf, 0xb2, 0xb7, 0x23, 0x97, 0xb6, 0x15, 0x91, 0x95, 0xcd, 0x7e, 0x6c, 0xa5, 0x83, 0xd8, - 0xf2, 0xf1, 0x36, 0x44, 0xdb, 0x56, 0x1c, 0x5b, 0x31, 0x43, 0x18, 0xe3, 0xac, 0x1d, 0x69, 0x0e, - 0x9b, 0x94, 0xbe, 0xf5, 0x09, 0x72, 0x70, 0x94, 0xf8, 0x3d, 0x04, 0x18, 0xd3, 0xe3, 0x85, 0x32, - 0x50, 0xb0, 0xff, 0x24, 0xee, 0xd9, 0xe9, 0x7d, 0xa6, 0x0d, 0xde, 0xb3, 0xbe, 0x17, 0x08, 0x28, - 0xf0, 0xac, 0x0f, 0x12, 0xd4, 0x9b, 0xc0, 0x42, 0x7b, 0x07, 0xb6, 0x2f, 0x55, 0xed, 0xc0, 0x37, - 0x89, 0x38, 0xb2, 0xf4, 0xa5, 0xf2, 0x83, 0xd9, 0x7d, 0x3c, 0x98, 0xfc, 0xc2, 0x23, 0x37, 0xb1, - 0x61, 0x99, 0x8a, 0x69, 0x68, 0xbf, 0x11, 0x02, 0x54, 0xe7, 0x00, 0xba, 0x73, 0x24, 0xaa, 0xe9, - 0x60, 0xa9, 0x8f, 0x00, 0x8b, 0x06, 0x4e, 0x35, 0xd6, 0x5b, 0xd5, 0x46, 0x7d, 0x73, 0xa3, 0xa9, - 0x57, 0x36, 0x97, 0x02, 0x70, 0x9a, 0x8a, 0xac, 0x7d, 0x4d, 0x02, 0x53, 0x84, 0x2d, 0x4f, 0x7b, - 0x7c, 0x04, 0xc1, 0xd0, 0x23, 0x05, 0xda, 0xdb, 0x85, 0x03, 0x04, 0x85, 0x82, 0xa0, 0xe5, 0xc4, - 0x34, 0x8c, 0xa7, 0x81, 0x29, 0x02, 0x72, 0xb0, 0x0b, 0x70, 0x26, 0xc6, 0xb2, 0xa3, 0x64, 0x8c, - 0x20, 0xbb, 0x60, 0xb0, 0xa0, 0x21, 0x6c, 0x64, 0x6f, 0x8d, 0x3f, 0x37, 0x4f, 0x96, 0x0e, 0xce, - 0x5b, 0xfe, 0x0e, 0x3e, 0x71, 0xa0, 0x3d, 0x4b, 0xa4, 0xe3, 0xba, 0x15, 0x14, 0x2e, 0xa3, 0xdc, - 0x43, 0x4e, 0x6f, 0x90, 0x4c, 0xda, 0x2f, 0x08, 0xc7, 0xa6, 0xe6, 0xf4, 0x33, 0xe4, 0x29, 0x06, - 0x9c, 0x35, 0x90, 0xef, 0x5a, 0x9e, 0x4f, 0x6d, 0xee, 0x3b, 0x52, 0x11, 0x0a, 0xfe, 0x54, 0x7d, - 0xb8, 0x6b, 0x60, 0x32, 0xda, 0xbd, 0xc8, 0x62, 0x8a, 0x52, 0x05, 0x4e, 0xb0, 0x9c, 0x06, 0x53, - 0xf4, 0x64, 0x35, 0xdd, 0x96, 0x0a, 0x1e, 0x05, 0xb7, 0x82, 0x84, 0x6a, 0x9b, 0xbd, 0x0e, 0xfc, - 0xbf, 0xc7, 0xc1, 0xd4, 0xaa, 0xe5, 0xf9, 0x8e, 0xbb, 0xaf, 0xbd, 0x3e, 0x07, 0xa6, 0xce, 0x41, - 0xd7, 0xb3, 0x1c, 0xfb, 0x80, 0xbb, 0xd6, 0xf5, 0x60, 0xb6, 0xe7, 0xc2, 0xcb, 0x96, 0xb3, 0xe7, - 0x31, 0xa3, 0x04, 0x93, 0xa4, 0x6a, 0x60, 0xda, 0xdc, 0xf3, 0x77, 0x1c, 0x37, 0x0a, 0xc8, 0x14, - 0x3c, 0xab, 0x67, 0x00, 0x20, 0xff, 0xeb, 0xe6, 0x2e, 0x0c, 0xee, 0x5c, 0x8f, 0x52, 0x54, 0x15, - 0xe4, 0x7d, 0x6b, 0x17, 0xd2, 0x08, 0xed, 0xf8, 0x3f, 0x12, 0x30, 0x8e, 0x76, 0x4a, 0xa3, 0xca, - 0xca, 0x46, 0xf0, 0xa8, 0xfd, 0x91, 0x0c, 0x66, 0x57, 0xa0, 0x4f, 0x59, 0xf5, 0xb4, 0x97, 0xe4, - 0x84, 0x2e, 0x45, 0x42, 0xf3, 0x92, 0xae, 0xe9, 0x05, 0xdf, 0x85, 0x43, 0x2e, 0x9f, 0x18, 0x85, - 0x8b, 0x97, 0xd9, 0xbb, 0x22, 0x70, 0xec, 0x50, 0xbf, 0x4a, 0x9c, 0xf9, 0x69, 0x66, 0xba, 0x71, - 0x7c, 0xf0, 0x05, 0x6f, 0x13, 0x27, 0xc6, 0xdd, 0xa0, 0xb2, 0x5f, 0x64, 0xea, 0x13, 0xdb, 0x1d, - 0x4d, 0x5f, 0xa6, 0x39, 0x0e, 0x5c, 0x03, 0xc2, 0x52, 0xa2, 0x64, 0x8c, 0x30, 0xb7, 0x60, 0xc4, - 0x8e, 0xe1, 0x9c, 0x4c, 0xe0, 0xe2, 0x57, 0x19, 0xcc, 0x36, 0x77, 0x9c, 0x2b, 0x81, 0x1c, 0xbf, - 0x5f, 0x0c, 0xd8, 0x6b, 0xc1, 0xcc, 0xe5, 0x3e, 0x50, 0xa3, 0x04, 0xf6, 0xae, 0x39, 0x99, 0xbf, - 0x6b, 0xee, 0x05, 0x72, 0x5a, 0x98, 0x18, 0xe6, 0x62, 0x60, 0xe2, 0xaf, 0x87, 0x93, 0x52, 0x5c, - 0x0f, 0xa7, 0x3e, 0x15, 0x4c, 0x51, 0xae, 0xe9, 0x32, 0x75, 0x32, 0xc0, 0x41, 0x66, 0xb6, 0x82, - 0x79, 0xbe, 0x82, 0xe9, 0x90, 0x8f, 0xaf, 0x5c, 0xf6, 0xc8, 0xff, 0x96, 0x84, 0xe3, 0x35, 0x05, - 0xc0, 0x97, 0xc7, 0x00, 0xbc, 0xf6, 0xad, 0x9c, 0xe8, 0x66, 0x4e, 0x28, 0x81, 0x90, 0x83, 0x43, - 0x5d, 0x78, 0x36, 0x94, 0x5c, 0xf6, 0xf2, 0x7c, 0x45, 0x1e, 0xcc, 0x55, 0xac, 0xad, 0xad, 0xb0, - 0x93, 0x7c, 0xa9, 0x60, 0x27, 0x19, 0xef, 0x52, 0x85, 0xec, 0xdc, 0x3d, 0xd7, 0x85, 0x76, 0x50, - 0x29, 0xda, 0x9c, 0xfa, 0x52, 0xd5, 0x9b, 0xc1, 0xf1, 0x60, 0x5c, 0x60, 0x3b, 0xca, 0x19, 0xa3, - 0x3f, 0x59, 0xfb, 0x86, 0xb0, 0x27, 0x40, 0x20, 0x51, 0xb6, 0x4a, 0x31, 0x0d, 0xf0, 0x2e, 0x30, - 0xbf, 0x43, 0x72, 0xe3, 0xe5, 0xd2, 0xa0, 0xb3, 0x3c, 0xd5, 0x17, 0x0f, 0x7f, 0x0d, 0x7a, 0x9e, - 0xb9, 0x0d, 0x0d, 0x3e, 0x73, 0x5f, 0xf3, 0x95, 0xd3, 0xdc, 0xee, 0x28, 0xe6, 0x54, 0x20, 0x50, - 0x93, 0xec, 0xb5, 0xe3, 0x8b, 0x67, 0x41, 0x7e, 0xd9, 0xea, 0x42, 0xed, 0x47, 0x25, 0x30, 0x83, - 0x66, 0xdd, 0x76, 0x1b, 0x3d, 0x31, 0x0e, 0x96, 0x5f, 0xcf, 0x89, 0xde, 0x6a, 0x8c, 0xe8, 0x2c, - 0x86, 0x34, 0x62, 0xda, 0x8d, 0xd8, 0xed, 0xc5, 0x89, 0xa4, 0x26, 0x70, 0x07, 0x15, 0x9a, 0x7a, - 0x6c, 0x6d, 0x75, 0x1d, 0x93, 0xdb, 0x30, 0xe8, 0x37, 0x85, 0xa2, 0x43, 0x81, 0x75, 0xc7, 0x5f, - 0xb7, 0x6c, 0x3b, 0x8c, 0xb3, 0x71, 0x20, 0x9d, 0xf7, 0x75, 0x49, 0x0c, 0x55, 0x86, 0xeb, 0x4e, - 0x4b, 0x8f, 0xd1, 0xec, 0x9b, 0xc0, 0xc2, 0xc5, 0x7d, 0x1f, 0x7a, 0x34, 0x17, 0x2d, 0x36, 0x6f, - 0xf4, 0xa5, 0x32, 0x17, 0x0d, 0x24, 0x85, 0x34, 0x4b, 0x28, 0x30, 0x9d, 0xa8, 0x57, 0x47, 0x98, - 0x01, 0x9e, 0x04, 0x4a, 0xbd, 0x51, 0xd1, 0xb1, 0xbf, 0x6f, 0xe0, 0x41, 0xb9, 0xad, 0xfd, 0x94, - 0x0c, 0xe6, 0xb0, 0x03, 0x5e, 0x80, 0xc2, 0x0d, 0x02, 0xf3, 0x11, 0xed, 0xcb, 0xc2, 0xbe, 0xc0, - 0xb8, 0xca, 0x6c, 0x01, 0xf1, 0x82, 0xde, 0xb2, 0xba, 0xfd, 0x82, 0x2e, 0x18, 0x7d, 0xa9, 0x03, - 0x00, 0x91, 0x07, 0x02, 0xf2, 0x2b, 0x42, 0x0e, 0xc1, 0xc3, 0xb8, 0x3b, 0x2a, 0x54, 0x7e, 0x55, - 0x06, 0xb3, 0x68, 0x92, 0x12, 0x80, 0xd2, 0xe0, 0x40, 0x71, 0xec, 0xee, 0x7e, 0xb4, 0x2c, 0x12, - 0x3c, 0xa6, 0x6a, 0x24, 0x7f, 0x2c, 0x3c, 0x73, 0xc7, 0x22, 0x62, 0x78, 0x99, 0x10, 0x7e, 0x1f, - 0x14, 0x9a, 0xcf, 0x0f, 0x61, 0xee, 0xa8, 0xe0, 0x7b, 0xb8, 0x08, 0x8a, 0x1b, 0x3d, 0x8c, 0xdc, - 0x97, 0x64, 0x91, 0x4b, 0x3b, 0x0e, 0x1c, 0x06, 0x43, 0x66, 0x56, 0xd7, 0x69, 0x9b, 0xdd, 0xf5, - 0xe8, 0x54, 0x6d, 0x94, 0xa0, 0xde, 0x49, 0xfd, 0xc3, 0xc9, 0x89, 0xf3, 0x9b, 0x12, 0xef, 0xb3, - 0xc0, 0x32, 0x62, 0x0e, 0xde, 0xdd, 0x0a, 0x4e, 0x74, 0x2c, 0xcf, 0xbc, 0xd8, 0x85, 0xba, 0xdd, - 0x76, 0xf7, 0x89, 0x38, 0xe8, 0xb4, 0xea, 0xc0, 0x0b, 0xf5, 0x6e, 0x50, 0xf0, 0xfc, 0xfd, 0x2e, - 0x99, 0x27, 0xb2, 0xe7, 0xf4, 0x62, 0x8b, 0x6a, 0xa2, 0xec, 0x06, 0xf9, 0x8a, 0x75, 0xeb, 0x9c, - 0x12, 0x73, 0xeb, 0x54, 0x9f, 0x0c, 0x8a, 0x8e, 0x6b, 0x6d, 0x5b, 0xe4, 0x8a, 0xba, 0x85, 0x03, - 0x61, 0x5b, 0x89, 0x29, 0xd0, 0xc0, 0x59, 0x0c, 0x9a, 0x55, 0x7d, 0x2a, 0x98, 0xb1, 0x76, 0xcd, - 0x6d, 0x78, 0x9f, 0x65, 0x93, 0x43, 0xed, 0x0b, 0xb7, 0x9f, 0x3e, 0x70, 0x04, 0x91, 0xbe, 0x37, - 0xa2, 0xac, 0xea, 0x5d, 0xe0, 0x9a, 0xb6, 0x0b, 0x4d, 0x1f, 0x22, 0x01, 0x9d, 0xb7, 0x3a, 0xdb, - 0xd0, 0xaf, 0x6e, 0xad, 0x59, 0x9e, 0x67, 0xd9, 0xdb, 0xf4, 0x16, 0xca, 0xf8, 0x0c, 0xda, 0x07, - 0x25, 0xd1, 0xc8, 0x74, 0x58, 0x32, 0x44, 0x25, 0x46, 0xb8, 0x2d, 0x9b, 0x91, 0xa2, 0x2c, 0xe8, - 0x1c, 0xfb, 0x6a, 0xa1, 0x98, 0x71, 0xf1, 0x6c, 0x65, 0x3f, 0xf4, 0xff, 0x81, 0x04, 0xa6, 0x2b, - 0xce, 0x15, 0x1b, 0x37, 0x93, 0x3b, 0xc4, 0x2c, 0xe5, 0x01, 0xc7, 0xcc, 0xf9, 0x7b, 0x97, 0x13, - 0xcf, 0x94, 0xe1, 0xda, 0x06, 0x45, 0xc6, 0xc0, 0x90, 0xd8, 0xee, 0x04, 0x6f, 0xc3, 0x4d, 0x2a, - 0x27, 0x7b, 0xb9, 0xfe, 0x8e, 0x0c, 0xf2, 0x15, 0xd7, 0xe9, 0x69, 0x6f, 0xcb, 0xa5, 0x70, 0x12, - 0xeb, 0xb8, 0x4e, 0xaf, 0x85, 0xaf, 0xb3, 0x8c, 0xf6, 0x45, 0xd8, 0x34, 0xf5, 0x0e, 0x30, 0xdd, - 0x73, 0x3c, 0xcb, 0x0f, 0x26, 0x21, 0x0b, 0xb7, 0x3f, 0x66, 0x60, 0x5f, 0xb0, 0x4e, 0x33, 0x19, - 0x61, 0x76, 0xd4, 0xe7, 0x63, 0x11, 0x22, 0xb9, 0x20, 0x31, 0x06, 0x57, 0x7a, 0xf6, 0xa5, 0x6a, - 0x2f, 0x63, 0x91, 0x7c, 0x3a, 0x8f, 0xe4, 0x63, 0x07, 0x48, 0xd8, 0x75, 0x7a, 0x63, 0x71, 0xeb, - 0x78, 0x65, 0x88, 0xea, 0x33, 0x38, 0x54, 0x6f, 0x11, 0x2a, 0x33, 0x7b, 0x44, 0x3f, 0x98, 0x07, - 0x00, 0x1b, 0x29, 0x1b, 0x68, 0xfa, 0x24, 0x66, 0xa1, 0xfd, 0x48, 0x9e, 0x91, 0x65, 0x89, 0x97, - 0xe5, 0xe3, 0x63, 0x6c, 0x20, 0x4c, 0x3e, 0x46, 0xa2, 0x25, 0x50, 0xd8, 0x43, 0xaf, 0xa9, 0x44, - 0x05, 0x49, 0xe0, 0x47, 0x83, 0x7c, 0xa9, 0xfd, 0x56, 0x0e, 0x14, 0x70, 0x82, 0x7a, 0x06, 0x00, - 0x6c, 0x16, 0x90, 0x23, 0x99, 0x39, 0x6c, 0x00, 0x30, 0x29, 0x58, 0x5b, 0xad, 0x0e, 0x7d, 0x4d, - 0x0c, 0xee, 0x28, 0x01, 0x7d, 0x8d, 0x8d, 0x05, 0x4c, 0x8b, 0x9a, 0x0f, 0x4c, 0x0a, 0xfa, 0x1a, - 0x3f, 0xd5, 0xe0, 0x16, 0xb9, 0x69, 0x20, 0x6f, 0x44, 0x09, 0xe1, 0xd7, 0xb5, 0xf0, 0x7e, 0xca, - 0xe0, 0x6b, 0x9c, 0x82, 0xa6, 0xd2, 0x58, 0x2d, 0x97, 0xa2, 0x22, 0x8a, 0x38, 0x53, 0x7f, 0xb2, - 0xf6, 0xba, 0x50, 0x6d, 0x2a, 0x9c, 0xda, 0x3c, 0x31, 0x85, 0x78, 0xb3, 0x57, 0x9e, 0x3f, 0x2b, - 0x80, 0x99, 0xba, 0xd3, 0xa1, 0xba, 0xc3, 0x4c, 0x37, 0x3f, 0x5d, 0x48, 0x35, 0xdd, 0x0c, 0x69, - 0xc4, 0x28, 0xc8, 0x33, 0x79, 0x05, 0x11, 0xa3, 0xc0, 0xea, 0x87, 0xba, 0x04, 0x8a, 0x58, 0x7b, - 0x0f, 0x5e, 0x7c, 0x98, 0x44, 0x02, 0x8b, 0xd6, 0xa0, 0x5f, 0xfe, 0x87, 0xd3, 0xb1, 0xff, 0x06, - 0x0a, 0xb8, 0x82, 0x09, 0x7b, 0x43, 0x7c, 0x45, 0xa5, 0xe4, 0x8a, 0xca, 0xc9, 0x15, 0xcd, 0xf7, - 0x57, 0x34, 0xcd, 0x2a, 0x42, 0x9c, 0x86, 0x64, 0xaf, 0xe3, 0x7f, 0x3b, 0x05, 0x40, 0xdd, 0xbc, - 0x6c, 0x6d, 0x93, 0xbd, 0xe5, 0x3f, 0x0a, 0x66, 0x4f, 0x74, 0x17, 0xf8, 0xc7, 0x99, 0x81, 0xf0, - 0x0e, 0x30, 0x45, 0xc7, 0x3d, 0x5a, 0x91, 0xeb, 0xb8, 0x8a, 0x44, 0x54, 0x88, 0x51, 0xfb, 0xa0, - 0x6f, 0x04, 0xf9, 0xb9, 0x3b, 0xda, 0xa5, 0xbe, 0x3b, 0xda, 0x07, 0xef, 0x60, 0xc4, 0xdc, 0xdc, - 0xae, 0xbd, 0x4f, 0xf8, 0x0c, 0x15, 0xc3, 0x0f, 0x53, 0xa3, 0x98, 0x26, 0xf8, 0x64, 0x30, 0xe5, - 0x84, 0xdb, 0xe1, 0x72, 0xec, 0x2a, 0x5a, 0xd5, 0xde, 0x72, 0x8c, 0x20, 0xa7, 0xe0, 0xd6, 0x99, - 0x10, 0x1f, 0x13, 0x39, 0xa6, 0x78, 0x6a, 0x25, 0x88, 0xda, 0x88, 0xea, 0x71, 0xde, 0xf2, 0x77, - 0x6a, 0x96, 0x7d, 0xc9, 0xd3, 0x7e, 0x40, 0xcc, 0x82, 0x64, 0xf0, 0x97, 0xd2, 0xe1, 0xcf, 0x47, - 0x4d, 0x6a, 0xf2, 0xa8, 0xdd, 0x1d, 0x47, 0x65, 0x30, 0xb7, 0x31, 0x00, 0xde, 0x09, 0x8a, 0x84, - 0x51, 0xda, 0x89, 0x9e, 0x8d, 0xc5, 0x2f, 0xa4, 0x64, 0xd0, 0x2f, 0xb4, 0xf7, 0x86, 0x38, 0x9e, - 0xe3, 0x70, 0x5c, 0x3a, 0x14, 0x67, 0x99, 0x43, 0x7a, 0xf6, 0x49, 0x60, 0x8a, 0x4a, 0x5a, 0x5d, - 0x60, 0x5b, 0xb1, 0x72, 0x4c, 0x05, 0xa0, 0xb8, 0xe6, 0x5c, 0x86, 0x2d, 0x47, 0xc9, 0xa1, 0xff, - 0x88, 0xbf, 0x96, 0xa3, 0x48, 0xda, 0xab, 0xa6, 0xc1, 0x74, 0x18, 0x2e, 0xef, 0x0f, 0x24, 0xa0, - 0x94, 0xf1, 0x0c, 0x6d, 0xd9, 0x75, 0x76, 0x49, 0x8d, 0xc4, 0xfd, 0xf1, 0x7f, 0x56, 0xd8, 0x41, - 0x24, 0x0c, 0x63, 0xd7, 0x5f, 0x58, 0x0c, 0x96, 0x64, 0x09, 0x53, 0x0a, 0x96, 0x30, 0xb5, 0xb7, - 0x0a, 0x39, 0x8c, 0x88, 0x96, 0x92, 0x7d, 0x53, 0xfb, 0x6d, 0x09, 0x14, 0xca, 0x5d, 0xc7, 0x86, - 0xec, 0xa1, 0xd1, 0xa1, 0xa7, 0x13, 0x07, 0xef, 0x63, 0x68, 0xcf, 0x95, 0x44, 0x6d, 0x8d, 0x48, - 0x00, 0xa8, 0x6c, 0x41, 0xd9, 0x8a, 0x0d, 0x52, 0x89, 0xa4, 0xb3, 0x17, 0xe8, 0xd7, 0x24, 0x30, - 0x43, 0x22, 0x93, 0x95, 0xba, 0x5d, 0xed, 0x31, 0x91, 0x50, 0x07, 0x84, 0x1c, 0xd4, 0x7e, 0x45, - 0xf8, 0x50, 0x54, 0x58, 0xab, 0x90, 0x76, 0x8a, 0x10, 0x6d, 0xe9, 0xce, 0xe8, 0x88, 0xed, 0xc4, - 0x0d, 0x65, 0x28, 0x7b, 0x51, 0xff, 0xa1, 0x84, 0x0c, 0x00, 0xfb, 0xd2, 0xba, 0x0b, 0x2f, 0x5b, - 0xf0, 0x8a, 0xf6, 0xe8, 0x48, 0xd8, 0x07, 0xc3, 0x2e, 0xbd, 0x49, 0x78, 0x11, 0x87, 0x21, 0x19, - 0xbb, 0x11, 0x36, 0xdb, 0x8d, 0x32, 0xd1, 0x5e, 0xbc, 0x3f, 0x16, 0x16, 0x43, 0xc6, 0x60, 0xb3, - 0x0b, 0xae, 0xd9, 0xc4, 0x73, 0x91, 0xbd, 0x60, 0x3f, 0x3a, 0x05, 0xa6, 0x37, 0x6c, 0xaf, 0xd7, - 0x35, 0xbd, 0x1d, 0xed, 0x5f, 0x65, 0x50, 0x24, 0xd7, 0x6d, 0x6a, 0xdf, 0xc3, 0x45, 0x77, 0x79, - 0xf6, 0x1e, 0x74, 0x03, 0x07, 0x1e, 0xf2, 0x10, 0xd9, 0x47, 0x12, 0x63, 0x1f, 0x69, 0x1f, 0x94, - 0x45, 0x27, 0xa9, 0x41, 0xa1, 0xf4, 0x7e, 0xcf, 0xf8, 0x80, 0x22, 0x3d, 0xab, 0xed, 0xef, 0xb9, - 0xd0, 0x1b, 0x18, 0x50, 0x24, 0x96, 0xca, 0x3a, 0xf9, 0xca, 0x08, 0x3f, 0xd7, 0x4c, 0x30, 0x45, - 0x13, 0x0f, 0x6c, 0x46, 0x1d, 0x8c, 0x78, 0x70, 0x0a, 0x14, 0x4d, 0xd7, 0xb7, 0x3c, 0x9f, 0x6e, - 0xcf, 0xd2, 0x27, 0xd4, 0x5d, 0x92, 0x7f, 0x1b, 0x6e, 0x37, 0x88, 0x03, 0x15, 0x26, 0x68, 0xbf, - 0x2a, 0x34, 0x7f, 0x4c, 0xae, 0x79, 0x3a, 0xc8, 0xef, 0x1b, 0x61, 0x85, 0xfb, 0x51, 0xe0, 0x2a, - 0xa3, 0xd4, 0xd2, 0x37, 0x49, 0xd8, 0xa0, 0x30, 0x42, 0x50, 0x47, 0x7b, 0x8f, 0xcc, 0xac, 0xdf, - 0xed, 0x73, 0x63, 0x04, 0x95, 0x62, 0x34, 0x46, 0x84, 0x09, 0x09, 0x7b, 0xdd, 0xdc, 0x12, 0xae, - 0x2c, 0xbc, 0x84, 0xab, 0xfd, 0xb2, 0xf0, 0x5e, 0x54, 0x28, 0xca, 0x21, 0x6b, 0x80, 0x49, 0xd7, - 0xf1, 0x7d, 0x58, 0x68, 0x5f, 0x69, 0x58, 0x49, 0x47, 0x08, 0xdb, 0xb7, 0x4e, 0x01, 0xa9, 0x54, - 0xd5, 0x7e, 0x6c, 0x0a, 0xcc, 0x9d, 0x77, 0x2d, 0xdf, 0xb2, 0xb7, 0x5b, 0x8e, 0xd3, 0xf5, 0xb4, - 0x6f, 0x32, 0x1b, 0x15, 0x4f, 0x05, 0xc5, 0xb6, 0x63, 0x6f, 0x59, 0xdb, 0x54, 0x8c, 0x67, 0xb8, - 0xca, 0x95, 0xaa, 0x8b, 0xeb, 0xae, 0x73, 0xd9, 0xea, 0x40, 0xb7, 0x8c, 0x73, 0x19, 0x34, 0x37, - 0xd2, 0x63, 0x26, 0xf0, 0xda, 0x13, 0xfb, 0xbf, 0x62, 0xcb, 0x0b, 0x23, 0xbf, 0xd0, 0x44, 0x26, - 0xee, 0x5a, 0x15, 0x4c, 0x77, 0x4d, 0x7b, 0x7b, 0x2f, 0x98, 0x79, 0xf7, 0xef, 0xa2, 0xc6, 0x51, - 0xaa, 0xd1, 0x8f, 0x8c, 0xf0, 0x73, 0xec, 0xe4, 0x86, 0x4c, 0x7d, 0xd2, 0xf6, 0xf0, 0xff, 0xb3, - 0x1f, 0xcb, 0x81, 0x59, 0xa6, 0x50, 0x75, 0x16, 0x4c, 0x55, 0xf4, 0xe5, 0xd2, 0x46, 0xad, 0xa5, - 0x1c, 0x43, 0x52, 0x6c, 0x6e, 0xac, 0xad, 0x95, 0x8c, 0xea, 0xf7, 0xe9, 0x4a, 0x0e, 0xbd, 0x5b, - 0x31, 0x4a, 0xe8, 0x59, 0x91, 0xd0, 0x43, 0x73, 0xb5, 0x61, 0xb4, 0xf4, 0xba, 0x22, 0x23, 0x7b, - 0x54, 0xbf, 0x7f, 0xbd, 0x54, 0xaf, 0x28, 0x79, 0xf4, 0x7f, 0x69, 0xa3, 0x56, 0xd3, 0x5b, 0x4a, - 0x21, 0x0a, 0xc5, 0x56, 0x44, 0xc9, 0xe5, 0x52, 0x73, 0xa3, 0x54, 0x53, 0xa6, 0x50, 0xf2, 0xf2, - 0x46, 0xbd, 0x7e, 0x41, 0x99, 0x46, 0x45, 0x94, 0x1b, 0xf5, 0xe5, 0x6a, 0x45, 0xaf, 0xb7, 0x94, - 0x19, 0xf5, 0x2a, 0x70, 0xbc, 0xd9, 0x32, 0x4a, 0xd5, 0x95, 0xd5, 0xd6, 0x72, 0xc3, 0x38, 0x5f, - 0x32, 0x2a, 0x0a, 0x50, 0x15, 0x30, 0xb7, 0x6e, 0x34, 0x96, 0x75, 0x1c, 0xcb, 0xa3, 0x54, 0x53, - 0x66, 0xd1, 0x57, 0x2d, 0xa3, 0x54, 0x6f, 0xd6, 0x4a, 0x2d, 0x5d, 0x99, 0x3b, 0x7b, 0x2f, 0x98, - 0x0e, 0xaa, 0xab, 0x16, 0x81, 0xa4, 0xd7, 0x95, 0x63, 0xf8, 0xb7, 0xa9, 0xe4, 0xd0, 0xef, 0x32, - 0xe2, 0xb7, 0x08, 0xa4, 0x8a, 0xae, 0xc8, 0xe8, 0xb7, 0xda, 0x52, 0xf2, 0xe8, 0x77, 0x1d, 0xb1, - 0x58, 0x04, 0xd2, 0x6a, 0x55, 0x29, 0xa2, 0xdf, 0xd6, 0xaa, 0x32, 0xc5, 0xdf, 0xba, 0x9d, 0xd8, - 0x0b, 0x1f, 0x94, 0x7c, 0x8c, 0xa1, 0xe1, 0x47, 0x73, 0x64, 0xfc, 0x5f, 0x7b, 0xa5, 0x24, 0xd2, - 0xd7, 0x25, 0xd3, 0x4f, 0xd7, 0x68, 0xde, 0x92, 0x1b, 0x63, 0xab, 0x51, 0x35, 0x70, 0x4a, 0xaf, - 0x57, 0xd6, 0x1b, 0xd5, 0x7a, 0x8b, 0x04, 0xcc, 0xd2, 0x4b, 0xe5, 0x55, 0x8c, 0x33, 0x44, 0x08, - 0xae, 0x35, 0x2a, 0x7a, 0x0d, 0xbf, 0x58, 0x6e, 0x6c, 0xd4, 0x2b, 0xca, 0x16, 0x2a, 0xab, 0xb4, - 0xd1, 0x5a, 0xdd, 0x34, 0xf4, 0x67, 0x6d, 0x54, 0x0d, 0xbd, 0xa2, 0x6c, 0x23, 0x1a, 0xb5, 0x52, - 0x7d, 0x65, 0xa3, 0xb4, 0x42, 0xf7, 0x0b, 0x37, 0xd6, 0xd7, 0x1b, 0x78, 0xc7, 0x70, 0x47, 0xfb, - 0x87, 0x3c, 0x98, 0x2e, 0xed, 0xf9, 0xce, 0x96, 0xd5, 0xed, 0x6a, 0x0f, 0x49, 0x87, 0x6f, 0x8a, - 0x25, 0xae, 0x29, 0x1e, 0x68, 0x40, 0x41, 0x59, 0x61, 0xe3, 0x09, 0x12, 0x98, 0x76, 0x78, 0x3a, - 0x72, 0xc6, 0x96, 0xe9, 0x4e, 0x33, 0x79, 0x24, 0x8e, 0xb8, 0x36, 0x6d, 0x59, 0xf8, 0x0d, 0x7d, - 0x3c, 0x7b, 0x1f, 0x98, 0x63, 0x29, 0xe1, 0xa0, 0x52, 0xa5, 0x15, 0x12, 0x75, 0x2a, 0x88, 0x33, - 0x47, 0xa2, 0x4e, 0xe1, 0x43, 0x01, 0x12, 0x6e, 0x2f, 0xd5, 0x56, 0x0d, 0xe9, 0xe9, 0x71, 0x30, - 0x5b, 0xd1, 0x9b, 0x65, 0xa3, 0x8a, 0xfd, 0xd4, 0x95, 0x3c, 0xef, 0x65, 0x90, 0x68, 0x99, 0xf1, - 0x35, 0x12, 0x55, 0xca, 0x6f, 0x0b, 0xd9, 0x5b, 0xf1, 0xb4, 0xd3, 0x29, 0xe4, 0x4b, 0x1e, 0x69, - 0x0a, 0xa9, 0xbd, 0x24, 0x4f, 0xd6, 0xc9, 0x9a, 0x7b, 0xbb, 0xbb, 0xa6, 0xbb, 0xcf, 0xf9, 0xab, - 0x8d, 0xaa, 0x77, 0xf1, 0xe3, 0x7b, 0x62, 0x84, 0x1a, 0x64, 0x42, 0xf5, 0x5c, 0x67, 0xb7, 0x17, - 0xf4, 0xd5, 0xf4, 0x49, 0xfb, 0xbf, 0x85, 0x67, 0x8e, 0xa5, 0xea, 0x22, 0x53, 0x99, 0x11, 0x86, - 0xf6, 0x1f, 0x94, 0x44, 0x66, 0x91, 0x89, 0xc5, 0x7c, 0xa7, 0x6b, 0xc4, 0xdf, 0xe4, 0xc1, 0x55, - 0x34, 0xfa, 0x48, 0xb8, 0xfe, 0x80, 0x4c, 0xd5, 0xd7, 0x64, 0xaa, 0x19, 0xd4, 0xa0, 0x96, 0x23, - 0x83, 0x9a, 0xd9, 0xf0, 0xce, 0x0b, 0x6e, 0x78, 0xbf, 0x4d, 0xf8, 0xd0, 0x43, 0xa9, 0xba, 0x38, - 0xa0, 0x8e, 0x93, 0xd9, 0x96, 0x7f, 0x81, 0x24, 0xb2, 0xda, 0x2a, 0xc4, 0xe1, 0x77, 0xba, 0xae, - 0xbd, 0x23, 0x07, 0x16, 0x78, 0x55, 0x51, 0x9f, 0x02, 0xa6, 0x7b, 0x34, 0x85, 0xca, 0xe5, 0x74, - 0x9c, 0x72, 0x19, 0x61, 0x4e, 0x04, 0x11, 0xb4, 0x3b, 0x3d, 0xc7, 0xb2, 0xc3, 0x75, 0xf9, 0xe0, - 0x19, 0xcd, 0x3b, 0xf1, 0xd4, 0x21, 0x88, 0x45, 0x87, 0x1f, 0xa2, 0x08, 0xa4, 0x79, 0x26, 0x02, - 0x29, 0x12, 0xa2, 0x0f, 0x77, 0xf1, 0x8d, 0x2a, 0x7b, 0x2e, 0x71, 0x78, 0x91, 0x0c, 0x36, 0xe9, - 0xec, 0x33, 0xc0, 0x74, 0x50, 0x3e, 0xb2, 0xee, 0x1a, 0xb5, 0x5a, 0x69, 0xad, 0x44, 0x16, 0x2a, - 0x1b, 0xeb, 0x7a, 0xbd, 0x54, 0x55, 0x72, 0x68, 0xa0, 0xab, 0xad, 0x35, 0x5b, 0x1b, 0x95, 0x6a, - 0x43, 0x91, 0xf0, 0x13, 0xca, 0x54, 0x5e, 0x5f, 0x57, 0x64, 0xed, 0x8d, 0x53, 0x60, 0x6a, 0xc5, - 0xec, 0x76, 0xa1, 0xbb, 0xaf, 0x7d, 0x4d, 0x02, 0x4a, 0x30, 0x3b, 0x58, 0x33, 0x6d, 0x6b, 0x0b, - 0x7a, 0x7e, 0xf2, 0x42, 0xc5, 0xfb, 0x84, 0xaf, 0x59, 0xa2, 0x65, 0x2c, 0xf6, 0xd3, 0x8f, 0xd1, - 0xf1, 0xdb, 0x40, 0xde, 0xb2, 0xb7, 0x1c, 0xba, 0x5c, 0xd1, 0xef, 0x6f, 0x13, 0x7c, 0x8c, 0xb7, - 0x0d, 0x70, 0x46, 0xc1, 0x9b, 0x96, 0x04, 0xb9, 0xc8, 0x7e, 0xd5, 0xe2, 0x1d, 0x79, 0x30, 0x1f, - 0x30, 0x51, 0xb5, 0x3b, 0xf0, 0x41, 0x76, 0x1b, 0xf4, 0xa7, 0xf2, 0xa2, 0xc1, 0x6f, 0xfa, 0xeb, - 0x83, 0x49, 0xc5, 0x88, 0xb4, 0x05, 0x40, 0xdb, 0xf4, 0xe1, 0xb6, 0xe3, 0x5a, 0xe1, 0x5a, 0xc4, - 0x53, 0xd2, 0x50, 0x2b, 0x93, 0xaf, 0xf7, 0x0d, 0x86, 0x8e, 0x7a, 0x37, 0x98, 0x85, 0x61, 0xb4, - 0xc1, 0x60, 0x9b, 0x34, 0x11, 0x2f, 0x36, 0xbf, 0xf6, 0x87, 0x42, 0x31, 0x76, 0x44, 0xaa, 0x99, - 0x0e, 0xb3, 0xcd, 0xd1, 0xba, 0x9e, 0x8d, 0xfa, 0x5a, 0xc9, 0x68, 0xae, 0x96, 0x6a, 0xb5, 0x6a, - 0x7d, 0x25, 0x0c, 0x7b, 0xab, 0x82, 0x85, 0x4a, 0xe3, 0x7c, 0x9d, 0x89, 0x4b, 0x9c, 0xd7, 0xd6, - 0xc1, 0x74, 0x20, 0xaf, 0x41, 0xa7, 0xa8, 0x58, 0x99, 0xd1, 0x53, 0x54, 0x4c, 0x12, 0x32, 0x0d, - 0xad, 0x76, 0xe8, 0x5a, 0x8f, 0xff, 0x6b, 0xbf, 0x69, 0x82, 0x02, 0xf6, 0x67, 0xd1, 0xde, 0x85, - 0xe7, 0xc5, 0xbd, 0xae, 0xd9, 0x86, 0xda, 0x6e, 0x8a, 0x95, 0xf0, 0xe0, 0xde, 0x4f, 0xe9, 0xc0, - 0xbd, 0x9f, 0xf8, 0x2f, 0x1d, 0x31, 0x4e, 0x0e, 0xf2, 0xa1, 0x31, 0x48, 0x16, 0x3e, 0x1c, 0x4d, - 0xa2, 0x67, 0x13, 0x71, 0xbd, 0xa1, 0x6c, 0xc6, 0xa8, 0x64, 0x3c, 0x4f, 0xe9, 0x56, 0x81, 0xc5, - 0x7c, 0xa0, 0x92, 0x38, 0xca, 0xbe, 0xc5, 0x7f, 0x29, 0x0f, 0x0a, 0xcd, 0x5e, 0xd7, 0xf2, 0xb5, - 0x9f, 0x97, 0xc6, 0x82, 0x19, 0xb9, 0xab, 0x55, 0x1e, 0x7a, 0x57, 0x6b, 0xe4, 0x2f, 0x99, 0x17, - 0xf0, 0x97, 0x6c, 0xc1, 0x07, 0x7d, 0xde, 0x5f, 0xf2, 0x0e, 0x3a, 0x6d, 0x23, 0xde, 0x96, 0x8f, - 0x1d, 0x20, 0x52, 0x5c, 0xad, 0x01, 0x77, 0x22, 0x9c, 0x7d, 0x12, 0x0d, 0xcd, 0x0e, 0x40, 0x71, - 0xa9, 0xd1, 0x6a, 0x35, 0xd6, 0x94, 0x63, 0x78, 0xfa, 0xd5, 0x58, 0x27, 0x81, 0x72, 0xab, 0xf5, - 0xba, 0x6e, 0x70, 0x33, 0x2e, 0xfe, 0xe2, 0xbe, 0xc4, 0x09, 0x16, 0x5f, 0x76, 0x96, 0xea, 0x25, - 0xb6, 0x08, 0x1e, 0xcf, 0x4f, 0xf6, 0xca, 0xf5, 0x33, 0x32, 0x28, 0xac, 0x41, 0x77, 0x1b, 0x6a, - 0xcf, 0x4e, 0xe1, 0x60, 0xb7, 0x65, 0xb9, 0x1e, 0x09, 0xad, 0x1f, 0x39, 0xd8, 0xb1, 0x69, 0xea, - 0x8d, 0x60, 0xde, 0x83, 0x6d, 0xc7, 0xee, 0x04, 0x99, 0x48, 0x7f, 0xc4, 0x27, 0x6a, 0x2f, 0x4f, - 0x09, 0x19, 0x66, 0x74, 0x2c, 0x5e, 0x72, 0x69, 0x80, 0x19, 0x54, 0x6a, 0xf6, 0xc0, 0x7c, 0x43, - 0x46, 0x1f, 0xf5, 0xf6, 0xb5, 0x97, 0x0b, 0x7b, 0x3e, 0xde, 0x0a, 0x8a, 0x17, 0x83, 0x3b, 0x9a, - 0xe4, 0xd8, 0xfe, 0x98, 0xe6, 0x51, 0x97, 0xc0, 0x09, 0x0f, 0x76, 0x61, 0xdb, 0x87, 0x1d, 0xd4, - 0x74, 0x8d, 0xa1, 0x9d, 0xc2, 0xc1, 0xec, 0xda, 0xef, 0xb2, 0x00, 0xde, 0xc5, 0x03, 0x78, 0xd3, - 0x00, 0x51, 0xa2, 0x0a, 0xc5, 0xcf, 0x4d, 0x50, 0x35, 0x9a, 0x5d, 0x27, 0x34, 0x7c, 0x83, 0x67, - 0xf4, 0x6e, 0xc7, 0xdf, 0xed, 0xe2, 0x77, 0xf4, 0x68, 0x70, 0xf0, 0xac, 0x2e, 0x82, 0x29, 0xd3, - 0xde, 0xc7, 0xaf, 0xf2, 0x09, 0xb5, 0x0e, 0x32, 0x69, 0xaf, 0x0a, 0x91, 0xbf, 0x87, 0x43, 0xfe, - 0xf1, 0x62, 0xec, 0x66, 0x0f, 0xfc, 0x0f, 0x4f, 0x81, 0xc2, 0xba, 0xe9, 0xf9, 0x50, 0xfb, 0x9f, - 0xb2, 0x28, 0xf2, 0x37, 0x81, 0x85, 0x2d, 0xa7, 0xbd, 0xe7, 0xc1, 0x0e, 0xdf, 0x28, 0xfb, 0x52, - 0xc7, 0x81, 0xb9, 0x7a, 0x0b, 0x50, 0x82, 0x44, 0x4a, 0x36, 0x70, 0x81, 0x3d, 0x90, 0x8e, 0xaf, - 0x81, 0xf3, 0xd6, 0x4d, 0xd7, 0x6f, 0x6c, 0xe1, 0xb4, 0xf0, 0x1a, 0x38, 0x36, 0x91, 0x83, 0xbe, - 0x98, 0x00, 0xfd, 0x54, 0x3c, 0xf4, 0xd3, 0x02, 0xd0, 0xab, 0x25, 0x30, 0xbd, 0x65, 0x75, 0x21, - 0xfe, 0x60, 0x06, 0x7f, 0x30, 0x68, 0x4c, 0xc2, 0xb2, 0x0f, 0xc7, 0xa4, 0x65, 0xab, 0x0b, 0x8d, - 0xf0, 0xb3, 0x60, 0x22, 0x03, 0xa2, 0x89, 0x4c, 0x8d, 0x9c, 0x84, 0x43, 0x86, 0x97, 0x6d, 0xee, - 0xc2, 0x60, 0xe3, 0xdb, 0xa6, 0xc7, 0xd2, 0x3b, 0xa6, 0x6f, 0x62, 0x30, 0xe6, 0x0c, 0xfc, 0x9f, - 0xf7, 0xc9, 0x96, 0xfb, 0x7d, 0xb2, 0x9f, 0x2f, 0xa7, 0xeb, 0x11, 0x03, 0x66, 0x63, 0x5a, 0xd4, - 0xc5, 0x00, 0x20, 0x62, 0x29, 0x86, 0xcf, 0x08, 0x98, 0xb6, 0xe9, 0x42, 0x7f, 0x9d, 0xf5, 0x82, - 0x2e, 0x18, 0x7c, 0x22, 0x3e, 0x84, 0xe3, 0x35, 0xcd, 0x5d, 0x72, 0xcd, 0x5b, 0x19, 0xbd, 0xa3, - 0x87, 0x2b, 0x0e, 0xa4, 0x47, 0xfd, 0x6f, 0x61, 0xdc, 0xfd, 0xef, 0xa0, 0x3a, 0x66, 0xdf, 0x0c, - 0x5f, 0x9b, 0x07, 0x72, 0x79, 0xcf, 0x7f, 0x44, 0x77, 0xbf, 0xdf, 0x16, 0xf6, 0x31, 0xa7, 0xfd, - 0xd9, 0x9e, 0x7f, 0xb4, 0xbd, 0x6f, 0x4a, 0x2d, 0x11, 0xf3, 0x65, 0x8f, 0xab, 0x5b, 0xf6, 0x3a, - 0xf2, 0x36, 0x39, 0x3c, 0x1a, 0xf5, 0x50, 0xee, 0xf0, 0xa6, 0xb9, 0x46, 0xfa, 0x27, 0xa6, 0x67, - 0x08, 0x9f, 0x83, 0x8e, 0x27, 0xcf, 0xdd, 0x4c, 0x80, 0x5d, 0x5b, 0xb1, 0x28, 0xe7, 0x0c, 0xf2, - 0xa0, 0xbd, 0x42, 0xf8, 0xc0, 0x28, 0x11, 0x5b, 0xe2, 0x31, 0x9e, 0x74, 0x36, 0xd5, 0x6b, 0x84, - 0x8e, 0x8d, 0x26, 0x14, 0x9b, 0x3d, 0x60, 0x7f, 0xcf, 0x1e, 0xd3, 0x29, 0x1d, 0x1a, 0x31, 0xed, - 0xd5, 0xc2, 0x0b, 0xfa, 0xa4, 0xda, 0x43, 0xf6, 0xea, 0xd3, 0xc9, 0x5b, 0xcc, 0x51, 0x2c, 0xb1, - 0xe0, 0x09, 0xdc, 0x5b, 0x2b, 0x83, 0x22, 0x59, 0xf8, 0xd5, 0xde, 0x2c, 0xdc, 0x44, 0x50, 0x6f, - 0xc4, 0x1f, 0xdf, 0x09, 0x9f, 0xd3, 0xac, 0x39, 0x70, 0xc7, 0x7c, 0xf2, 0xa9, 0x8e, 0xf9, 0xf0, - 0x11, 0x58, 0x04, 0xda, 0x11, 0xa9, 0x63, 0xc6, 0xd3, 0xc9, 0x34, 0x2d, 0x6c, 0x20, 0x43, 0xd9, - 0xe3, 0xfd, 0xc2, 0x02, 0x98, 0x23, 0x45, 0x93, 0xf3, 0x85, 0xda, 0x7b, 0xa4, 0xef, 0x1c, 0xd4, - 0xd5, 0x3a, 0x98, 0xbb, 0x82, 0xd9, 0x26, 0xf7, 0xd1, 0xd2, 0x95, 0x8b, 0x5b, 0x12, 0xd7, 0x3d, - 0x48, 0x3d, 0x83, 0x1b, 0x6c, 0xb9, 0xef, 0x91, 0x8c, 0xc9, 0x06, 0x0b, 0x39, 0x3c, 0x51, 0xc4, - 0x46, 0x16, 0x9b, 0xa4, 0x9e, 0x02, 0xc5, 0xcb, 0x16, 0xbc, 0x52, 0xed, 0x50, 0xeb, 0x96, 0x3e, - 0x69, 0xbf, 0x26, 0xec, 0x33, 0xc9, 0xc2, 0x4d, 0x79, 0xc9, 0x56, 0x0b, 0xc5, 0x3c, 0x27, 0x87, - 0xb2, 0x35, 0x81, 0x68, 0x40, 0x12, 0xb9, 0x33, 0x9b, 0x86, 0x99, 0x2f, 0xa7, 0x50, 0xc4, 0x38, - 0xc3, 0x99, 0x0f, 0xc2, 0x97, 0x78, 0xd6, 0x9c, 0x08, 0x20, 0x2a, 0x7f, 0x2c, 0x7d, 0xbe, 0x58, - 0x64, 0xb8, 0x21, 0x45, 0x67, 0x2f, 0xf9, 0xd7, 0xc9, 0x60, 0xa6, 0x09, 0xfd, 0x65, 0x0b, 0x76, - 0x3b, 0x9e, 0xe6, 0x1e, 0xde, 0x34, 0xba, 0x0d, 0x14, 0xb7, 0x30, 0xb1, 0x61, 0x9b, 0x93, 0x34, - 0x9b, 0xf6, 0x5a, 0x49, 0xd4, 0x0f, 0x88, 0xae, 0xbe, 0x05, 0xdc, 0x8e, 0x05, 0x26, 0xb1, 0xd3, - 0x74, 0xc9, 0x25, 0x4f, 0xe0, 0x1a, 0x1f, 0x19, 0xcc, 0xe1, 0xed, 0x7f, 0xe8, 0x97, 0xba, 0xd6, - 0xb6, 0xad, 0xed, 0x8d, 0xa1, 0x85, 0xa8, 0x4f, 0x04, 0x05, 0x13, 0x51, 0xa3, 0xee, 0x6e, 0xda, - 0xc0, 0xce, 0x13, 0x97, 0x67, 0x90, 0x8c, 0x29, 0x2e, 0xcd, 0x88, 0x14, 0x3b, 0xe0, 0x79, 0x82, - 0x97, 0x66, 0x0c, 0x2d, 0x3c, 0x7b, 0xc4, 0xbe, 0x22, 0x83, 0x93, 0x94, 0x81, 0x73, 0xd0, 0xf5, - 0xad, 0xb6, 0xd9, 0x25, 0xc8, 0xbd, 0x38, 0x37, 0x0e, 0xe8, 0x56, 0xc1, 0xfc, 0x65, 0x96, 0x2c, - 0x85, 0xf0, 0xec, 0x40, 0x08, 0x39, 0x06, 0x0c, 0xfe, 0xc3, 0x14, 0x97, 0x0f, 0x70, 0x52, 0xe5, - 0x68, 0x4e, 0xf0, 0xf2, 0x01, 0x61, 0x26, 0xb2, 0x87, 0xf8, 0x65, 0x34, 0xa8, 0x66, 0xd4, 0x7d, - 0xfe, 0x91, 0x30, 0xb6, 0x1b, 0x60, 0x16, 0x63, 0x49, 0x3e, 0xa4, 0xcb, 0x10, 0x09, 0x4a, 0x1c, - 0xf6, 0x3b, 0xf4, 0xba, 0xf4, 0xf0, 0x5b, 0x83, 0xa5, 0xa3, 0x9d, 0x07, 0x20, 0x7a, 0xc5, 0x76, - 0xd2, 0xb9, 0xb8, 0x4e, 0x5a, 0x12, 0xeb, 0xa4, 0xdf, 0x24, 0x1c, 0xe6, 0x70, 0x30, 0xdb, 0x87, - 0x57, 0x0f, 0xb1, 0x00, 0x77, 0xc3, 0x4b, 0xcf, 0x5e, 0x2f, 0x5e, 0x45, 0xf5, 0xa2, 0xb2, 0xd7, - 0xeb, 0x5a, 0x6d, 0x34, 0x9f, 0xfa, 0xc4, 0x58, 0xe6, 0x53, 0x6c, 0x7f, 0x20, 0xf7, 0xf5, 0x07, - 0x87, 0xb0, 0xa4, 0x6f, 0x06, 0xc7, 0x49, 0x11, 0xe5, 0x90, 0xad, 0x02, 0x09, 0xe2, 0xd6, 0x97, - 0xcc, 0x47, 0x14, 0x17, 0x54, 0x82, 0x50, 0x08, 0x23, 0x2c, 0x7d, 0xa6, 0x33, 0x76, 0xd3, 0x2a, - 0x48, 0x1c, 0x67, 0x13, 0x38, 0x92, 0x95, 0x27, 0xd6, 0xee, 0x06, 0xbe, 0xd1, 0x5e, 0xfb, 0x62, - 0x7e, 0x1c, 0x23, 0xc2, 0x33, 0xa9, 0xa7, 0xa9, 0x1c, 0xbb, 0xa4, 0x11, 0x15, 0x19, 0xf6, 0x23, - 0x2d, 0xf8, 0xa0, 0xbf, 0x7a, 0x8c, 0xf8, 0xa5, 0xaa, 0xb7, 0x80, 0xe3, 0x17, 0xcd, 0xf6, 0xa5, - 0x6d, 0xd7, 0xd9, 0xc3, 0x77, 0x7f, 0x3b, 0xf4, 0x12, 0xf1, 0xd5, 0x63, 0x46, 0xff, 0x0b, 0xf5, - 0xf6, 0xc0, 0x74, 0x28, 0x0c, 0x33, 0x1d, 0x56, 0x8f, 0x51, 0xe3, 0x41, 0x7d, 0x52, 0xd8, 0xe9, - 0x14, 0x13, 0x3b, 0x9d, 0xd5, 0x63, 0x41, 0xb7, 0xa3, 0x56, 0xc0, 0x74, 0xc7, 0xba, 0x8c, 0xb7, - 0xaa, 0xf1, 0xac, 0x6b, 0x58, 0xd0, 0xa1, 0x8a, 0x75, 0x99, 0x6c, 0x6c, 0xaf, 0x1e, 0x33, 0xc2, - 0x2f, 0xd5, 0x15, 0x30, 0x83, 0xb7, 0x05, 0x30, 0x99, 0xe9, 0x54, 0x01, 0x85, 0x56, 0x8f, 0x19, - 0xd1, 0xb7, 0xc8, 0xfa, 0xc8, 0xe3, 0x73, 0xd7, 0xf7, 0x04, 0xdb, 0xed, 0xb9, 0x54, 0xdb, 0xed, - 0x48, 0x16, 0x64, 0xc3, 0xfd, 0x14, 0x28, 0xb4, 0xb1, 0x84, 0x25, 0x2a, 0x61, 0xf2, 0xa8, 0xde, - 0x05, 0xf2, 0xbb, 0xa6, 0x1b, 0x4c, 0x9e, 0x6f, 0x1a, 0x4e, 0x77, 0xcd, 0x74, 0x2f, 0x21, 0x04, - 0xd1, 0x57, 0x4b, 0x53, 0xa0, 0x80, 0x05, 0x17, 0xfe, 0xd1, 0xde, 0x96, 0x27, 0x66, 0x48, 0xd9, - 0xb1, 0xd1, 0xb0, 0xdf, 0x72, 0x82, 0xc3, 0xe9, 0xbf, 0x96, 0x1b, 0x8f, 0x05, 0x79, 0x15, 0x73, - 0xd5, 0x87, 0x6d, 0x3d, 0x7b, 0x0f, 0xde, 0x07, 0xf7, 0xe9, 0x92, 0xe8, 0xa0, 0x57, 0xea, 0x19, - 0x00, 0x7c, 0x7a, 0x52, 0x2f, 0x0c, 0x62, 0xca, 0xa4, 0x44, 0xcb, 0x07, 0x85, 0xe1, 0x8e, 0x2a, - 0xbf, 0x3b, 0x82, 0xe9, 0xd2, 0x2f, 0x88, 0xf8, 0x19, 0x78, 0xd7, 0xb2, 0x99, 0x3a, 0x07, 0x8f, - 0x29, 0x3b, 0xa5, 0xb4, 0x46, 0xcd, 0x10, 0xf6, 0xb2, 0xef, 0x9b, 0xde, 0x92, 0x27, 0xb7, 0x1d, - 0x90, 0x13, 0xd0, 0xfa, 0x83, 0x96, 0xe7, 0x5b, 0xf6, 0x36, 0x3d, 0xdf, 0xfc, 0xd9, 0xb1, 0x28, - 0xcd, 0x80, 0x01, 0x47, 0x1e, 0x38, 0xe0, 0x1c, 0x08, 0x10, 0x94, 0x1f, 0x12, 0x20, 0xa8, 0x90, - 0x6e, 0xe5, 0xf0, 0x23, 0xac, 0xfe, 0xac, 0xf3, 0xfa, 0x73, 0x67, 0x0c, 0x40, 0x83, 0xe4, 0x32, - 0x16, 0xfb, 0xe6, 0x5d, 0xa1, 0xa6, 0x34, 0x39, 0x4d, 0xb9, 0x67, 0x74, 0x46, 0xb2, 0xd7, 0x96, - 0x0f, 0xe5, 0xc1, 0x55, 0x11, 0x33, 0x75, 0x78, 0x85, 0x2a, 0xca, 0x1f, 0x8c, 0x45, 0x51, 0xd2, - 0x3b, 0x3a, 0x67, 0xad, 0x31, 0xbf, 0x25, 0x7c, 0x6e, 0xbf, 0x1f, 0xa8, 0x50, 0x36, 0x31, 0xca, - 0x72, 0x0a, 0x14, 0x49, 0x0f, 0x43, 0xa1, 0xa1, 0x4f, 0x29, 0xbb, 0x1b, 0xb1, 0xd3, 0xfe, 0xa2, - 0xbc, 0x4d, 0x40, 0x7f, 0xe8, 0xba, 0x46, 0x6b, 0xcf, 0xb5, 0xab, 0xb6, 0xef, 0x68, 0x3f, 0x34, - 0x16, 0xc5, 0x09, 0xbd, 0xe1, 0xe4, 0x51, 0xbc, 0xe1, 0x46, 0x5a, 0xe5, 0x08, 0x6a, 0x70, 0x24, - 0xab, 0x1c, 0x31, 0x85, 0x67, 0x8f, 0xdf, 0x3b, 0x65, 0x70, 0x8a, 0x4e, 0xb6, 0x96, 0x78, 0x0b, - 0x51, 0xbb, 0x30, 0x0e, 0x20, 0x4f, 0x06, 0x66, 0x12, 0xf5, 0xa3, 0xc7, 0x0f, 0x7c, 0x94, 0x82, - 0xc4, 0xdb, 0x2c, 0xb9, 0xe9, 0x60, 0x1f, 0x87, 0x63, 0x41, 0x4a, 0xec, 0x12, 0xcb, 0x14, 0x6c, - 0x64, 0x8f, 0xd9, 0x4b, 0x65, 0x50, 0x24, 0x31, 0x12, 0xb4, 0x8d, 0x4c, 0x1c, 0x26, 0xf8, 0xfb, - 0x59, 0x04, 0x76, 0xe4, 0x08, 0x37, 0x99, 0xc5, 0x8f, 0x48, 0xb3, 0x17, 0x37, 0x90, 0x95, 0x09, - 0xb8, 0x10, 0x4a, 0x60, 0xb6, 0x09, 0xfd, 0xb2, 0xe9, 0xba, 0x96, 0xb9, 0x3d, 0x2e, 0x8f, 0x6f, - 0x51, 0xef, 0x61, 0xed, 0x9b, 0x39, 0xd1, 0xb3, 0xec, 0xe1, 0x42, 0x78, 0xc0, 0x6a, 0x4c, 0x14, - 0xf0, 0xd7, 0x0b, 0x9d, 0x57, 0x1f, 0x46, 0x6d, 0x02, 0x1e, 0xdb, 0x12, 0x98, 0x0a, 0xe2, 0x60, - 0xdc, 0xc6, 0xc5, 0x46, 0xd9, 0xf1, 0x77, 0x83, 0x63, 0x30, 0xf8, 0xff, 0xc1, 0xf8, 0x0b, 0xda, - 0x2b, 0x53, 0x3a, 0xca, 0x27, 0x07, 0xf1, 0x48, 0xd7, 0xc6, 0xd2, 0xb8, 0xc3, 0x1f, 0x55, 0xd8, - 0x8e, 0x5f, 0x99, 0xa2, 0xcb, 0x91, 0x35, 0xd3, 0x87, 0x0f, 0x6a, 0x7f, 0x24, 0x83, 0xa9, 0x26, - 0xf4, 0xd1, 0x78, 0x8b, 0xd8, 0x3f, 0xb4, 0x86, 0xab, 0xcc, 0x8a, 0x07, 0x3d, 0x5b, 0xab, 0xde, - 0x0b, 0x66, 0x7a, 0xae, 0xd3, 0x86, 0x9e, 0x47, 0x57, 0x2f, 0x58, 0x47, 0xb5, 0x41, 0xa3, 0x3f, - 0x66, 0x6d, 0x71, 0x3d, 0xf8, 0xc6, 0x88, 0x3e, 0x4f, 0x6b, 0x06, 0x10, 0x4a, 0xb4, 0x82, 0x93, - 0x36, 0x03, 0x92, 0x0a, 0xcf, 0x1e, 0xe8, 0xdf, 0x93, 0xc1, 0x5c, 0x13, 0xfa, 0xa1, 0x14, 0x53, - 0x6c, 0x72, 0xc4, 0xc3, 0xcb, 0x41, 0x29, 0x1f, 0x0e, 0xca, 0x77, 0x0a, 0x5f, 0x0a, 0xcb, 0x4b, - 0x33, 0x24, 0x36, 0x16, 0x3c, 0xdf, 0x22, 0x74, 0x17, 0xac, 0x18, 0x07, 0x13, 0x38, 0xbe, 0xf6, - 0x58, 0x30, 0x83, 0x79, 0xc1, 0x0d, 0xf6, 0xc7, 0xf2, 0x51, 0xe3, 0xfd, 0x42, 0x46, 0x8d, 0xf7, - 0x6e, 0x50, 0xd8, 0x35, 0xdd, 0x4b, 0xc1, 0xe1, 0xdb, 0xc7, 0x89, 0xad, 0x7e, 0x79, 0x06, 0xf9, - 0x6a, 0xb0, 0x9f, 0x66, 0x21, 0x9d, 0x9f, 0xe6, 0xeb, 0xa5, 0x54, 0x23, 0x21, 0x99, 0x3b, 0x8c, - 0xb1, 0xc9, 0xa7, 0x18, 0x37, 0x13, 0xca, 0xce, 0x5e, 0x39, 0x5e, 0x2c, 0x83, 0x69, 0x34, 0x6e, - 0x63, 0x7b, 0xfc, 0xfc, 0xe1, 0xd5, 0x61, 0xb0, 0xa1, 0x9f, 0xb2, 0x07, 0x0e, 0x24, 0x32, 0x3e, - 0xf3, 0x3e, 0x45, 0x0f, 0x9c, 0x54, 0x78, 0xf6, 0x78, 0xbc, 0x9b, 0xe0, 0x81, 0xdb, 0x83, 0xf6, - 0x06, 0x19, 0xc8, 0x2b, 0xd0, 0x9f, 0xb4, 0x15, 0xf9, 0x76, 0xe1, 0xf0, 0xa2, 0x9c, 0xc0, 0x30, - 0xcf, 0x8b, 0x2b, 0x70, 0x3c, 0x0d, 0x48, 0x2c, 0xae, 0xa8, 0x10, 0x03, 0xd9, 0xa3, 0xf6, 0x7e, - 0x82, 0x1a, 0xd9, 0x5c, 0xf8, 0xc1, 0x31, 0xf4, 0xaa, 0x93, 0x5d, 0xf8, 0x08, 0x04, 0x88, 0x69, - 0x1c, 0x55, 0x7b, 0x1b, 0x54, 0x78, 0xf6, 0xc8, 0xfd, 0xac, 0x8c, 0x2f, 0x31, 0x2b, 0xef, 0xc0, - 0xf6, 0x25, 0xd8, 0x61, 0x2f, 0x72, 0x1e, 0x15, 0xba, 0xd3, 0x60, 0xaa, 0x4d, 0xa8, 0x61, 0xf0, - 0xa6, 0x8d, 0xe0, 0x91, 0xbf, 0x59, 0x28, 0xf1, 0xee, 0x2c, 0xbe, 0x23, 0x22, 0x9f, 0x8f, 0x05, - 0x17, 0xb1, 0x0b, 0xaf, 0x04, 0x8a, 0x9f, 0x80, 0xd9, 0x42, 0x66, 0x19, 0xd5, 0xb6, 0x63, 0x6b, - 0xff, 0xf5, 0xf0, 0xb0, 0x5c, 0x0b, 0x66, 0xac, 0xb6, 0x63, 0xe3, 0x10, 0x70, 0xc1, 0x21, 0xa0, - 0x30, 0x21, 0x78, 0xab, 0xef, 0x3a, 0x0f, 0x58, 0x74, 0xd7, 0x3c, 0x4a, 0x18, 0xd5, 0x98, 0x40, - 0xac, 0x1f, 0x95, 0x31, 0x31, 0xa0, 0xec, 0xec, 0x21, 0xfb, 0x64, 0xe4, 0xdd, 0x46, 0xba, 0xc2, - 0x47, 0xc4, 0x2a, 0xf0, 0x28, 0xc3, 0x19, 0x5b, 0x8b, 0x23, 0x19, 0xce, 0x12, 0x18, 0x98, 0xc0, - 0x4d, 0x84, 0x11, 0x8e, 0x99, 0xaf, 0x01, 0x1f, 0x02, 0x9d, 0xf1, 0x99, 0x87, 0x23, 0xa2, 0x73, - 0x34, 0x26, 0xe2, 0x87, 0x69, 0x78, 0x7a, 0x6a, 0xf1, 0x68, 0xff, 0x6d, 0x1c, 0xe0, 0xdc, 0x39, - 0x8a, 0xbf, 0x02, 0xf1, 0x56, 0xd0, 0xde, 0x2a, 0x89, 0x86, 0x40, 0x39, 0x20, 0x41, 0x44, 0x65, - 0x2c, 0x08, 0xbe, 0x49, 0x28, 0x36, 0x89, 0x48, 0xf9, 0xd9, 0x03, 0xf8, 0x22, 0x19, 0x2c, 0x60, - 0x1f, 0x81, 0x2e, 0x34, 0x5d, 0xd2, 0x51, 0x8e, 0xc5, 0x51, 0xfe, 0xdd, 0xc2, 0x01, 0x7e, 0x78, - 0x39, 0x44, 0x7c, 0x8c, 0x05, 0x0a, 0xb1, 0xe8, 0x3e, 0x82, 0x2c, 0x4c, 0x64, 0x1b, 0x45, 0x09, - 0x59, 0xa0, 0x2a, 0x3e, 0x1e, 0x3c, 0x52, 0x7a, 0xe4, 0xf2, 0xc2, 0x08, 0x1a, 0xdb, 0x84, 0x3d, - 0x72, 0x45, 0x98, 0xc8, 0x1e, 0x93, 0x37, 0x3c, 0x91, 0x2e, 0x38, 0xb7, 0xcc, 0x8b, 0x5d, 0xa8, - 0xbd, 0x3a, 0x1f, 0x9e, 0x68, 0xfb, 0xbd, 0xb1, 0x78, 0x60, 0x1e, 0xe2, 0x32, 0x2a, 0x15, 0xe4, - 0x5d, 0xe7, 0x0a, 0x59, 0xda, 0x9a, 0x37, 0xf0, 0x7f, 0x12, 0xcf, 0xb2, 0xbb, 0xb7, 0x6b, 0x93, - 0x93, 0xa1, 0xf3, 0x46, 0xf0, 0xa8, 0xde, 0x08, 0xe6, 0xaf, 0x58, 0xfe, 0xce, 0x2a, 0x34, 0x3b, - 0xd0, 0x35, 0x9c, 0x2b, 0xd8, 0x63, 0x6e, 0xda, 0xe0, 0x13, 0x79, 0xff, 0x15, 0x01, 0xfb, 0x12, - 0x09, 0x65, 0x32, 0xc7, 0xdf, 0xd2, 0x58, 0x9e, 0xf1, 0x5c, 0x65, 0xaf, 0x30, 0x1f, 0x90, 0xc1, - 0x8c, 0xe1, 0x5c, 0xa1, 0x4a, 0xf2, 0x7f, 0x1e, 0xad, 0x8e, 0xa4, 0x9e, 0xe8, 0x61, 0xc9, 0x85, - 0xec, 0x4f, 0x7c, 0xa2, 0x97, 0x58, 0xfc, 0x44, 0x4e, 0x2e, 0xcd, 0x19, 0xce, 0x95, 0x26, 0xf4, - 0x49, 0x8b, 0xd0, 0x36, 0xc7, 0xe4, 0x64, 0x6d, 0x79, 0x84, 0x20, 0x9d, 0x87, 0x87, 0xcf, 0x69, - 0x77, 0x11, 0x42, 0x01, 0x85, 0x2c, 0x4e, 0x7a, 0x17, 0x61, 0x28, 0x07, 0x13, 0x88, 0x91, 0x22, - 0x83, 0x59, 0xc3, 0xb9, 0x82, 0x86, 0x86, 0x65, 0xab, 0xdb, 0x1d, 0xcf, 0x08, 0x99, 0xd6, 0xf8, - 0x0f, 0xc4, 0x10, 0x70, 0x31, 0x71, 0xe3, 0x7f, 0x08, 0x03, 0xd9, 0xc3, 0xf0, 0x7c, 0xd2, 0x58, - 0x82, 0x11, 0xda, 0x1e, 0x0f, 0x0e, 0xa3, 0x36, 0x88, 0x90, 0x8d, 0x23, 0x6b, 0x10, 0x71, 0x1c, - 0x4c, 0x64, 0xe7, 0x64, 0xa1, 0x8c, 0x87, 0xf9, 0xf1, 0xb6, 0x89, 0xf7, 0xa6, 0x73, 0x4d, 0xa4, - 0xc3, 0x2e, 0xc7, 0xc8, 0x58, 0xd0, 0x48, 0xe1, 0x82, 0x28, 0xc0, 0x43, 0xf6, 0x78, 0x7c, 0x4c, - 0x06, 0x73, 0x84, 0x85, 0x47, 0x88, 0x15, 0x30, 0x52, 0xa3, 0x62, 0x6b, 0x70, 0x34, 0x8d, 0x2a, - 0x81, 0x83, 0x89, 0xdc, 0xe7, 0x8f, 0xec, 0xb8, 0x11, 0x8e, 0x8f, 0xc7, 0x21, 0x38, 0xb2, 0x31, - 0x36, 0xc6, 0x23, 0xe4, 0xa3, 0x18, 0x63, 0x47, 0x74, 0x8c, 0xfc, 0xf9, 0x61, 0x2b, 0x1a, 0x27, - 0x06, 0x87, 0x68, 0x0a, 0x63, 0x84, 0x61, 0xc4, 0xa6, 0x70, 0x44, 0x48, 0xfc, 0x99, 0x0c, 0x00, - 0x61, 0x60, 0xcd, 0xb9, 0x8c, 0x2f, 0xd2, 0x1c, 0x43, 0x77, 0xd6, 0xef, 0x56, 0x2f, 0x0f, 0x71, - 0xab, 0x4f, 0x19, 0xc2, 0x25, 0xed, 0x4a, 0x20, 0x23, 0x65, 0x54, 0xc9, 0x89, 0xaf, 0x04, 0x26, - 0x97, 0x9f, 0x3d, 0xc6, 0x5f, 0x26, 0xd6, 0x5c, 0x74, 0xc0, 0xf4, 0xe7, 0xc6, 0x82, 0x32, 0x33, - 0xfb, 0x97, 0xf9, 0xd9, 0xff, 0x21, 0xb0, 0x1d, 0xd5, 0x46, 0x1c, 0x76, 0x70, 0x34, 0x7b, 0x1b, - 0xf1, 0xe8, 0x0e, 0x88, 0xfe, 0x60, 0x1e, 0x1c, 0xa7, 0x9d, 0xc8, 0x77, 0x02, 0xc4, 0x29, 0xcf, - 0xe1, 0x71, 0x9d, 0xe4, 0x10, 0x94, 0xc7, 0xb5, 0x20, 0x95, 0x66, 0x29, 0x53, 0x80, 0xbd, 0x89, - 0xac, 0x6e, 0x14, 0xf5, 0x07, 0x7b, 0xa6, 0xdd, 0x11, 0x0f, 0xf7, 0x3b, 0x04, 0xf8, 0x60, 0xad, - 0x51, 0xe6, 0xd7, 0x1a, 0x07, 0xac, 0x4c, 0xa6, 0xde, 0xb9, 0xc6, 0x22, 0x23, 0xec, 0x4e, 0x7c, - 0xe7, 0x3a, 0xbe, 0xec, 0xec, 0x51, 0x7a, 0xaf, 0x0c, 0xf2, 0x4d, 0xc7, 0xf5, 0xb5, 0x17, 0xa4, - 0x69, 0x9d, 0x44, 0xf2, 0x11, 0x48, 0xc1, 0xb3, 0x5a, 0x06, 0x79, 0x54, 0x39, 0x3a, 0x63, 0xb8, - 0x2d, 0xf9, 0xa8, 0xb3, 0xe9, 0x9b, 0xd8, 0xab, 0x1b, 0x95, 0xbf, 0xd8, 0xda, 0xef, 0x41, 0x03, - 0x7f, 0x9c, 0x36, 0x9e, 0x0e, 0x91, 0x5f, 0x33, 0xfe, 0x00, 0x46, 0x66, 0xf1, 0x74, 0x62, 0x4b, - 0xce, 0x1e, 0xb7, 0x87, 0x8f, 0x53, 0xdf, 0xd6, 0x65, 0xab, 0x0b, 0xb5, 0x17, 0x10, 0x97, 0x91, - 0xba, 0xb9, 0x0b, 0xc5, 0x8f, 0xc4, 0x24, 0xba, 0xb6, 0xe2, 0xf8, 0xb2, 0x72, 0x14, 0x5f, 0x36, - 0x6d, 0x83, 0x22, 0x07, 0xd0, 0x09, 0x4b, 0x93, 0x6e, 0x50, 0x09, 0x65, 0x4f, 0x24, 0x4e, 0xe7, - 0x89, 0x26, 0xf4, 0x89, 0x51, 0xd9, 0x08, 0xae, 0x48, 0xfa, 0xfe, 0xb1, 0x44, 0xec, 0x0c, 0x2f, - 0xd4, 0x91, 0xfb, 0x6e, 0x60, 0xfa, 0x00, 0x0b, 0xce, 0x1a, 0x0f, 0xce, 0xf7, 0xc6, 0x0b, 0x88, - 0x67, 0x72, 0x2c, 0x30, 0xbd, 0x3d, 0x84, 0x69, 0x9d, 0x83, 0xe9, 0xae, 0x11, 0xb9, 0xc8, 0x1e, - 0xb0, 0x9f, 0x28, 0x80, 0xe3, 0x64, 0xd2, 0x5f, 0xb2, 0x3b, 0x34, 0xc2, 0xea, 0x9b, 0xa5, 0x23, - 0xde, 0x6c, 0x3b, 0x18, 0x82, 0x95, 0x8b, 0xe5, 0x5c, 0xe8, 0x8b, 0xe5, 0xac, 0x2e, 0x91, 0x70, - 0xae, 0xa8, 0x13, 0xc5, 0x3b, 0x6d, 0xc3, 0xc2, 0x4c, 0x60, 0xd9, 0xe3, 0x2e, 0x37, 0xfc, 0x8e, - 0xbf, 0x47, 0x74, 0x4a, 0xfc, 0x1e, 0xd1, 0xdf, 0x49, 0xb7, 0x6e, 0x87, 0x8b, 0xee, 0x13, 0x78, - 0xc6, 0xb6, 0x53, 0x8a, 0x15, 0x3d, 0x01, 0xee, 0xfe, 0x73, 0xb8, 0x93, 0x45, 0x11, 0x44, 0x46, - 0x74, 0x27, 0xc3, 0x04, 0x8e, 0xd2, 0x9d, 0x6c, 0x18, 0x03, 0xd9, 0xe3, 0xf8, 0x3b, 0x05, 0xba, - 0x9b, 0x8f, 0xdb, 0x8d, 0xf6, 0x27, 0x52, 0xe6, 0xa3, 0xf4, 0xb7, 0x72, 0xa9, 0xfc, 0x9f, 0x31, - 0x5f, 0xc9, 0xc3, 0x74, 0x1a, 0x8f, 0xe6, 0x24, 0x72, 0x13, 0x58, 0x37, 0x92, 0xb0, 0x2f, 0xfa, - 0x79, 0xab, 0xe3, 0xef, 0x8c, 0xe9, 0x44, 0xc7, 0x15, 0x44, 0x8b, 0xc6, 0xab, 0x27, 0x0f, 0xda, - 0xff, 0xca, 0xa5, 0x0a, 0x21, 0x15, 0x8a, 0x04, 0xb3, 0x15, 0x23, 0xe2, 0x14, 0x81, 0x9f, 0x12, - 0xe9, 0x4d, 0x50, 0xa3, 0xcf, 0x59, 0x1d, 0xe8, 0x3c, 0x02, 0x35, 0x1a, 0xf3, 0x35, 0x3e, 0x8d, - 0x4e, 0x22, 0xf7, 0x9f, 0x54, 0xa3, 0x43, 0x91, 0x8c, 0x49, 0xa3, 0x13, 0xe9, 0x65, 0x2f, 0xe3, - 0x57, 0xce, 0xd1, 0x89, 0x54, 0xcd, 0xb2, 0x2f, 0x69, 0xff, 0x54, 0x04, 0x4a, 0x10, 0x47, 0xd8, - 0xdf, 0xa1, 0xb1, 0x60, 0x3e, 0x24, 0x7c, 0x37, 0xca, 0x08, 0xf1, 0x5e, 0xf8, 0x70, 0x52, 0x85, - 0x03, 0xe1, 0xa4, 0x4a, 0x60, 0xde, 0xb2, 0x7d, 0xe8, 0xda, 0x66, 0x77, 0xb9, 0x6b, 0x6e, 0x7b, - 0xa7, 0xa7, 0x06, 0x5e, 0x5e, 0x57, 0x65, 0xf2, 0x18, 0xfc, 0x17, 0xec, 0x05, 0xa2, 0xd3, 0xfc, - 0x05, 0xa2, 0x31, 0xd1, 0xaf, 0x66, 0xe2, 0xa3, 0x5f, 0x85, 0xd1, 0xad, 0xc0, 0xf0, 0xe0, 0xd8, - 0xa2, 0xb6, 0x71, 0xca, 0x70, 0x7f, 0xb7, 0x09, 0x46, 0x61, 0x0b, 0x43, 0x3f, 0xbe, 0x46, 0x4e, - 0xb5, 0xba, 0x87, 0x14, 0x61, 0xb1, 0x5f, 0x09, 0x52, 0x5b, 0xa8, 0x6c, 0xe5, 0xe5, 0xbe, 0xca, - 0x87, 0x26, 0x4f, 0x5e, 0xc0, 0xe4, 0x61, 0x95, 0xaa, 0x20, 0x7a, 0xa7, 0xab, 0xf8, 0x62, 0xa1, - 0x48, 0x6d, 0x27, 0x70, 0x1a, 0xa9, 0x00, 0x4e, 0x04, 0xd1, 0x6e, 0x7b, 0x3d, 0x68, 0xba, 0xa6, - 0xdd, 0x86, 0xda, 0x27, 0xa5, 0x71, 0x98, 0xbd, 0xcb, 0x60, 0xda, 0x6a, 0x3b, 0x76, 0xd3, 0x7a, - 0x4e, 0x70, 0xb9, 0x5c, 0x72, 0x90, 0x75, 0x2c, 0x91, 0x2a, 0xfd, 0xc2, 0x08, 0xbf, 0x55, 0xab, - 0x60, 0xa6, 0x6d, 0xba, 0x1d, 0x12, 0x84, 0xaf, 0xd0, 0x77, 0x91, 0x53, 0x2c, 0xa1, 0x72, 0xf0, - 0x89, 0x11, 0x7d, 0xad, 0x36, 0x78, 0x21, 0x16, 0xfb, 0xa2, 0x79, 0xc4, 0x12, 0xab, 0x44, 0x1f, - 0x71, 0x32, 0x47, 0xd2, 0x71, 0x61, 0xd7, 0x24, 0x97, 0x8e, 0x4f, 0x91, 0x3b, 0xa2, 0xc3, 0x84, - 0xb4, 0xcb, 0x03, 0xb8, 0xa8, 0x03, 0x68, 0x4c, 0x7a, 0x79, 0x40, 0x88, 0x8b, 0xec, 0x35, 0xf3, - 0x5d, 0x45, 0x30, 0x4f, 0x7a, 0x35, 0x2a, 0x4e, 0xed, 0x45, 0x32, 0x28, 0x36, 0xa1, 0x7f, 0x1f, - 0xdc, 0xd7, 0x9a, 0x87, 0x1f, 0x93, 0x15, 0x20, 0x5f, 0x0a, 0x03, 0x0e, 0xa2, 0xbf, 0x69, 0xf7, - 0xed, 0x03, 0xbe, 0x16, 0x09, 0x4f, 0x93, 0xde, 0xb7, 0x4f, 0x2e, 0x3e, 0x7b, 0x7c, 0x7e, 0x52, - 0x06, 0x72, 0xa9, 0xd3, 0xd1, 0xda, 0x87, 0x87, 0xe2, 0x7a, 0x30, 0x1b, 0xb4, 0x99, 0x28, 0x06, - 0x24, 0x9b, 0x94, 0x76, 0x11, 0x34, 0x94, 0x4d, 0xa9, 0x33, 0xf1, 0x5d, 0x85, 0x84, 0xb2, 0xb3, - 0x07, 0xe5, 0x0b, 0x53, 0xb4, 0xd1, 0x2c, 0x39, 0xce, 0x25, 0x7c, 0x54, 0xe6, 0x97, 0x64, 0x50, - 0x58, 0x86, 0x7e, 0x7b, 0x47, 0xf3, 0xc6, 0xd2, 0x66, 0xfa, 0xee, 0x3d, 0x1f, 0x12, 0x94, 0x33, - 0x6d, 0xf4, 0xe7, 0x80, 0xed, 0x45, 0xcc, 0xf2, 0xa4, 0xa3, 0x3f, 0x27, 0x96, 0x3e, 0x81, 0x43, - 0x70, 0x79, 0xb0, 0x10, 0xae, 0x80, 0x11, 0xcc, 0xde, 0x91, 0x7b, 0xc4, 0xad, 0x87, 0x0e, 0xb1, - 0x9b, 0xb5, 0x3f, 0x48, 0x17, 0x62, 0x2d, 0x94, 0x39, 0x5f, 0xf3, 0x8c, 0x17, 0x26, 0x53, 0x04, - 0x5f, 0x13, 0x63, 0x70, 0x02, 0x2b, 0x00, 0x32, 0x98, 0xc6, 0x0c, 0x55, 0xac, 0xcb, 0xd8, 0xf5, - 0x90, 0x5b, 0xa8, 0x7c, 0xee, 0x58, 0x16, 0x2a, 0xef, 0xe2, 0x17, 0x2a, 0x05, 0x23, 0x26, 0x07, - 0xeb, 0x94, 0x29, 0x7d, 0x71, 0xd0, 0xf7, 0x63, 0x5f, 0xa6, 0x4c, 0xe1, 0x8b, 0x33, 0xa4, 0xfc, - 0x09, 0xb8, 0x1e, 0xde, 0x4f, 0x3b, 0xeb, 0x60, 0x43, 0x56, 0xfb, 0x1f, 0x27, 0x40, 0xfe, 0x1c, - 0xfa, 0xf3, 0x8f, 0xd1, 0x8d, 0x5a, 0x2f, 0x1f, 0x43, 0x70, 0x87, 0x67, 0x80, 0x3c, 0xa2, 0x4f, - 0xa7, 0x3d, 0xb7, 0x88, 0xed, 0x0e, 0x23, 0x46, 0x0c, 0xfc, 0x9d, 0x7a, 0x0a, 0x14, 0x3d, 0x67, - 0xcf, 0x6d, 0x23, 0xf3, 0x1b, 0x69, 0x0c, 0x7d, 0x4a, 0x1b, 0xd4, 0x94, 0x23, 0xbd, 0x38, 0x3e, - 0x97, 0x53, 0xe6, 0x82, 0x25, 0x99, 0xbb, 0x60, 0x29, 0xc5, 0xfe, 0x83, 0x00, 0x6f, 0xd9, 0x6b, - 0xc4, 0x9f, 0xe0, 0xbb, 0x06, 0x3b, 0xe3, 0x82, 0x3d, 0x46, 0x2c, 0x87, 0x55, 0x87, 0xb4, 0x0e, - 0xe3, 0xbc, 0x68, 0xc3, 0x38, 0xf2, 0x13, 0x75, 0x18, 0x17, 0xe0, 0x61, 0x22, 0xa7, 0xdc, 0x8b, - 0xd4, 0xc9, 0xf5, 0xc2, 0x38, 0xd1, 0xcd, 0x73, 0x4a, 0x7f, 0x28, 0x74, 0xc6, 0xe8, 0xfc, 0x3a, - 0x32, 0x3a, 0x47, 0xe4, 0xfe, 0xfa, 0xeb, 0x32, 0x8e, 0xa4, 0x19, 0x18, 0x41, 0xe2, 0x17, 0x25, - 0xa5, 0x86, 0x08, 0x8d, 0xc1, 0x5c, 0x1c, 0xe9, 0xf9, 0xd1, 0x43, 0x8b, 0xf3, 0xa2, 0x63, 0xf8, - 0x9f, 0x74, 0x68, 0x71, 0x51, 0x46, 0xb2, 0x07, 0xf2, 0x17, 0xc9, 0xc5, 0x64, 0xa5, 0xb6, 0x6f, - 0x5d, 0x1e, 0x73, 0x4b, 0xe3, 0x87, 0x97, 0x94, 0xd1, 0x84, 0x0f, 0x48, 0x88, 0x70, 0x38, 0xe9, - 0x68, 0xc2, 0x62, 0x6c, 0x64, 0x0f, 0xd3, 0x57, 0x8b, 0x48, 0x7a, 0x74, 0x6d, 0xe7, 0x0d, 0x74, - 0x35, 0x01, 0x1e, 0x1e, 0xad, 0xb3, 0x60, 0x8e, 0x59, 0x3a, 0x08, 0x2e, 0xbc, 0xe1, 0xd2, 0xd2, - 0x1e, 0x94, 0x0f, 0x45, 0x36, 0xf6, 0x85, 0x85, 0x14, 0x0b, 0xc6, 0x22, 0x4c, 0x4c, 0xe4, 0x3e, - 0xb9, 0x60, 0x0c, 0x9b, 0x10, 0x56, 0x1f, 0x62, 0xb1, 0x6a, 0xf0, 0x58, 0xdd, 0x21, 0x22, 0x26, - 0xb1, 0x31, 0x4d, 0x68, 0xde, 0xf8, 0xce, 0x10, 0x2e, 0x83, 0x83, 0xeb, 0x19, 0x23, 0xf3, 0x91, - 0x3d, 0x62, 0x3f, 0x4f, 0xba, 0xc3, 0x26, 0x31, 0xd9, 0xc7, 0xd3, 0x1d, 0xd2, 0xd9, 0x80, 0xcc, - 0xcd, 0x06, 0x52, 0xfa, 0xeb, 0x47, 0x6e, 0xa8, 0x01, 0x73, 0xc3, 0x20, 0xca, 0x8f, 0xd9, 0x5f, - 0x7f, 0x28, 0x07, 0xd9, 0x83, 0xf3, 0x75, 0x19, 0x80, 0x15, 0xd7, 0xd9, 0xeb, 0x35, 0xdc, 0x0e, - 0x74, 0xb5, 0x3f, 0x8f, 0x26, 0x00, 0x3f, 0x35, 0x86, 0x09, 0xc0, 0x3a, 0x00, 0xdb, 0x21, 0x71, - 0xaa, 0xe1, 0x4f, 0x14, 0x33, 0xf7, 0x23, 0xa6, 0x0c, 0x86, 0x06, 0x7f, 0x65, 0xed, 0xb3, 0x78, - 0x8c, 0x93, 0xfa, 0xac, 0x88, 0xdc, 0x38, 0x27, 0x00, 0xef, 0x0e, 0xb1, 0x6e, 0x71, 0x58, 0x3f, - 0xf3, 0x10, 0x9c, 0x64, 0x8f, 0xf9, 0x3f, 0x4c, 0x81, 0x59, 0xb2, 0xdd, 0x47, 0x64, 0xfa, 0x37, - 0x11, 0xe8, 0x3f, 0x37, 0x06, 0xd0, 0x37, 0xc0, 0x9c, 0x13, 0x51, 0x27, 0x7d, 0x2a, 0xbb, 0x00, - 0x93, 0x08, 0x3b, 0xc3, 0x97, 0xc1, 0x91, 0xd1, 0x3e, 0xce, 0x22, 0x6f, 0xf0, 0xc8, 0xdf, 0x95, - 0x20, 0x6f, 0x86, 0xe2, 0x38, 0xa1, 0x7f, 0x4f, 0x08, 0xfd, 0x06, 0x07, 0x7d, 0xe9, 0x30, 0xac, - 0x4c, 0x20, 0x5c, 0xbf, 0x0c, 0xf2, 0xf8, 0x74, 0xdd, 0x5b, 0x32, 0x9c, 0xdf, 0x9f, 0x06, 0x53, - 0xb8, 0xc9, 0x86, 0xf3, 0x8e, 0xe0, 0x11, 0xbd, 0x31, 0xb7, 0x7c, 0xe8, 0x86, 0x2b, 0xb7, 0xc1, - 0x23, 0xe2, 0x21, 0xf0, 0x6a, 0xf6, 0x4e, 0x17, 0xc9, 0x46, 0x66, 0x98, 0x30, 0xf2, 0xa4, 0x84, - 0x95, 0xf8, 0xd8, 0xce, 0xdb, 0x8d, 0x32, 0x29, 0x19, 0xc2, 0x48, 0xf6, 0xc0, 0x7f, 0x31, 0x0f, - 0x4e, 0x93, 0x55, 0xa5, 0x65, 0xd7, 0xd9, 0xed, 0xbb, 0x1d, 0xcb, 0x3a, 0xbc, 0x2e, 0xdc, 0x04, - 0x16, 0x7c, 0xce, 0x9f, 0x9b, 0xea, 0x44, 0x5f, 0xaa, 0xf6, 0xbb, 0xac, 0x4f, 0xc6, 0xfd, 0x3c, - 0x92, 0x4b, 0x09, 0x02, 0x8c, 0xe3, 0x3d, 0xf5, 0x42, 0xbd, 0x20, 0xa3, 0xcc, 0x22, 0x95, 0x3c, - 0xd2, 0x9a, 0x65, 0xa8, 0x53, 0x05, 0x11, 0x9d, 0xfa, 0x60, 0xa8, 0x53, 0xff, 0x85, 0xd3, 0xa9, - 0x95, 0xc3, 0x8b, 0x64, 0x02, 0x2b, 0x17, 0x0b, 0xa0, 0xb8, 0x6c, 0x75, 0x7d, 0xe8, 0x6a, 0x5f, - 0xa6, 0xf3, 0xa8, 0x57, 0x67, 0xd8, 0xbd, 0x54, 0x40, 0x71, 0x0b, 0x97, 0x46, 0x0d, 0xb2, 0x5b, - 0xc5, 0xb0, 0x21, 0x1c, 0x1a, 0xf4, 0xdb, 0xb4, 0xb1, 0xe3, 0xfa, 0xc8, 0x8c, 0x6d, 0x02, 0x96, - 0x22, 0x76, 0xdc, 0x70, 0x16, 0x26, 0x72, 0x6d, 0x52, 0xd1, 0x80, 0xbb, 0x68, 0x04, 0xb9, 0x94, - 0x1d, 0xc2, 0x0a, 0x90, 0xad, 0x8e, 0x87, 0x9b, 0xde, 0x8c, 0x81, 0xfe, 0xa6, 0xf5, 0x64, 0xe9, - 0x17, 0x15, 0x61, 0x79, 0xd2, 0x9e, 0x2c, 0x42, 0x5c, 0x64, 0x8f, 0xd9, 0xb7, 0xb0, 0x1b, 0x63, - 0xaf, 0x6b, 0xb6, 0x21, 0xe2, 0x3e, 0x33, 0xd4, 0x16, 0x80, 0x64, 0x05, 0x23, 0xbe, 0x64, 0xb1, - 0xed, 0xb4, 0x70, 0x88, 0x76, 0x3a, 0xea, 0x22, 0x57, 0x28, 0x73, 0x5c, 0xf1, 0x23, 0x5b, 0xe4, - 0x4a, 0x64, 0x63, 0x02, 0x97, 0x62, 0x06, 0xc7, 0x3c, 0x27, 0xda, 0x5a, 0x47, 0xdd, 0x02, 0xa0, - 0xc2, 0x1a, 0xdb, 0x91, 0xce, 0x51, 0xb6, 0x00, 0xe2, 0x79, 0x98, 0x00, 0x5a, 0x0b, 0x14, 0xad, - 0xcf, 0xd3, 0x61, 0x34, 0xe3, 0x5d, 0x38, 0xcf, 0x71, 0xfd, 0x74, 0xbb, 0x70, 0x88, 0x3b, 0x03, - 0x7f, 0x97, 0xf6, 0x58, 0x10, 0x7f, 0xea, 0x77, 0x5c, 0xc3, 0x67, 0x8a, 0x63, 0x41, 0xc3, 0x18, - 0xc8, 0x1e, 0xde, 0xb7, 0x1e, 0xd1, 0xe0, 0x39, 0x6a, 0x73, 0xa4, 0x6d, 0x60, 0x6c, 0x43, 0xe7, - 0x28, 0xcd, 0x31, 0x9e, 0x87, 0xec, 0xf1, 0xfa, 0x7b, 0x66, 0xe0, 0x7c, 0xd3, 0x04, 0x07, 0xce, - 0xa0, 0x65, 0x16, 0x46, 0x6c, 0x99, 0xa3, 0xee, 0x2e, 0x50, 0x59, 0x8f, 0x6f, 0xc0, 0x1c, 0x65, - 0x77, 0x21, 0x81, 0x89, 0xec, 0x11, 0x7f, 0xb3, 0x0c, 0x0a, 0xcd, 0xc9, 0x8f, 0x97, 0xa3, 0xce, - 0x45, 0xb0, 0xac, 0x9a, 0x63, 0x1b, 0x2e, 0x47, 0x99, 0x8b, 0xc4, 0xb2, 0x30, 0x81, 0xb0, 0xf0, - 0xc7, 0xc1, 0x1c, 0x9e, 0x70, 0x07, 0x9b, 0x78, 0x7f, 0x4f, 0x47, 0xcd, 0xd7, 0x67, 0xd8, 0x56, - 0xef, 0x05, 0xd3, 0xc1, 0xee, 0x10, 0x1d, 0x39, 0x17, 0xc5, 0xda, 0x67, 0xc0, 0xa5, 0x11, 0x7e, - 0x7f, 0xa8, 0xad, 0xf6, 0xb1, 0xef, 0x04, 0x8e, 0xba, 0xd5, 0x7e, 0xa4, 0xbb, 0x81, 0xbf, 0x13, - 0x8d, 0xa8, 0xff, 0x35, 0x3b, 0xcc, 0xfb, 0x77, 0x09, 0xf3, 0x03, 0x76, 0x09, 0x3f, 0xc9, 0x62, - 0xd9, 0xe4, 0xb1, 0xbc, 0x5b, 0x54, 0x84, 0x63, 0x1c, 0x6b, 0xdf, 0x1b, 0xc2, 0x79, 0x8e, 0x83, - 0x73, 0xe9, 0x50, 0xbc, 0x4c, 0xe0, 0x58, 0x5e, 0x3e, 0x1a, 0x73, 0x3f, 0x95, 0x61, 0x3b, 0xee, - 0xf3, 0xf9, 0xcf, 0x1f, 0xf0, 0xf9, 0xe7, 0x5a, 0x7a, 0xe1, 0x90, 0x2d, 0xfd, 0x53, 0xac, 0x76, - 0xb4, 0x78, 0xed, 0x78, 0x86, 0x38, 0x22, 0xe3, 0x1b, 0x99, 0xdf, 0x17, 0xaa, 0xc7, 0x79, 0x4e, - 0x3d, 0xca, 0x87, 0x63, 0x26, 0x7b, 0xfd, 0xf8, 0x8d, 0x60, 0x42, 0x7b, 0xc4, 0xed, 0x7d, 0xd4, - 0x8d, 0x48, 0x4e, 0x88, 0x63, 0x1b, 0xb9, 0x47, 0xd9, 0x88, 0x1c, 0xc6, 0xc9, 0x04, 0x22, 0x85, - 0xcd, 0x83, 0x59, 0xcc, 0xd3, 0x79, 0xab, 0xb3, 0x0d, 0x7d, 0xed, 0x35, 0xc4, 0x03, 0x2e, 0x88, - 0xcb, 0x38, 0xa6, 0xe0, 0x39, 0x71, 0xa7, 0x31, 0xd3, 0xfa, 0x0b, 0x10, 0x26, 0x17, 0x19, 0x06, - 0x27, 0x1d, 0xdf, 0x6f, 0x28, 0x07, 0xd9, 0x43, 0xf6, 0x71, 0xe2, 0xcc, 0x51, 0x33, 0xf7, 0x9d, - 0x3d, 0x5f, 0x7b, 0x68, 0x0c, 0x1d, 0xf4, 0x12, 0x28, 0x76, 0x31, 0x35, 0xea, 0xf4, 0x9f, 0x3c, - 0xdd, 0xa1, 0x22, 0x20, 0xe5, 0x1b, 0xf4, 0xcb, 0xb4, 0x9e, 0xff, 0x91, 0x1c, 0x09, 0x9d, 0x49, - 0x7b, 0xfe, 0x0f, 0x29, 0x7f, 0x22, 0x37, 0xc0, 0x4c, 0xa3, 0xd2, 0xad, 0x5d, 0xcb, 0x1f, 0x53, - 0x7c, 0x81, 0x2e, 0xa2, 0x15, 0xc4, 0x17, 0xc0, 0x0f, 0x69, 0xcf, 0x33, 0x32, 0x52, 0x41, 0x9f, - 0x4f, 0xfa, 0x3c, 0x63, 0x72, 0xf1, 0xd9, 0x63, 0xf2, 0x33, 0xa4, 0x65, 0x9d, 0x23, 0xae, 0x9d, - 0x19, 0x7a, 0x8d, 0x8e, 0xdc, 0x58, 0x08, 0x6b, 0x47, 0xd7, 0x58, 0x06, 0x96, 0x9f, 0x3d, 0x30, - 0xbf, 0xf4, 0xdd, 0xa0, 0x50, 0x81, 0x17, 0xf7, 0xb6, 0xb5, 0xbb, 0xc0, 0x74, 0xcb, 0x85, 0xb0, - 0x6a, 0x6f, 0x39, 0x48, 0xba, 0x3e, 0xfa, 0x1f, 0x40, 0x42, 0x9f, 0x10, 0x1e, 0x3b, 0xd0, 0xec, - 0x44, 0xa7, 0x9b, 0x82, 0x47, 0xed, 0xe5, 0x12, 0xc8, 0x37, 0x7d, 0xd3, 0xd7, 0x66, 0x42, 0x6c, - 0xb5, 0x87, 0x58, 0x2c, 0xee, 0xe2, 0xb1, 0xb8, 0x89, 0x93, 0x05, 0xe6, 0x60, 0x11, 0x7d, 0x1f, - 0x03, 0x80, 0x06, 0xa6, 0x1f, 0xf0, 0x1c, 0x1b, 0xe5, 0x08, 0x0e, 0xe0, 0x05, 0xcf, 0xda, 0xab, - 0x42, 0x71, 0xdf, 0xc3, 0x89, 0xfb, 0xf1, 0x62, 0x45, 0x4c, 0x60, 0xa5, 0x4d, 0x02, 0x33, 0x48, - 0xb4, 0xab, 0xd0, 0xec, 0x78, 0xda, 0x77, 0x45, 0xca, 0x1f, 0x23, 0x66, 0xed, 0xc3, 0xc2, 0xa1, - 0x22, 0x49, 0xad, 0x42, 0xe2, 0xf1, 0xfe, 0x02, 0x41, 0xa8, 0x0c, 0x89, 0x0f, 0x95, 0x71, 0x1b, - 0xc8, 0x5b, 0xf6, 0x96, 0x43, 0xbd, 0xd7, 0x1e, 0x1d, 0x43, 0x1b, 0xe9, 0x84, 0x81, 0x33, 0x0a, - 0xc6, 0x91, 0x4c, 0x66, 0x6b, 0x22, 0x57, 0xb2, 0xe5, 0x51, 0xe9, 0xda, 0xff, 0x31, 0x54, 0xd8, - 0xaa, 0x0a, 0xf2, 0x3d, 0xd3, 0xdf, 0xa1, 0x45, 0xe3, 0xff, 0xc8, 0x46, 0xde, 0xb3, 0x4d, 0xdb, - 0xb1, 0xf7, 0x77, 0xad, 0xe7, 0x84, 0x37, 0xbf, 0x72, 0x69, 0x88, 0xf3, 0x6d, 0x68, 0x43, 0xd7, - 0xf4, 0x61, 0xf3, 0xf2, 0x36, 0x9e, 0x63, 0x4d, 0x1b, 0x6c, 0x52, 0x6a, 0xfd, 0x47, 0x1c, 0xc7, - 0xeb, 0xff, 0x96, 0xd5, 0x85, 0x38, 0x8e, 0x10, 0xd5, 0xff, 0xe0, 0x39, 0x95, 0xfe, 0x0f, 0x28, - 0x22, 0x7b, 0x34, 0xfe, 0x55, 0x02, 0x73, 0x4d, 0xa4, 0x70, 0xcd, 0xbd, 0xdd, 0x5d, 0xd3, 0xdd, - 0xd7, 0x6e, 0x88, 0x50, 0x61, 0x54, 0x33, 0xc7, 0xa9, 0xa6, 0xf6, 0xeb, 0xc2, 0x97, 0x1e, 0xd3, - 0xa6, 0xcd, 0x94, 0x90, 0xba, 0x1d, 0x3c, 0x09, 0x14, 0x90, 0x7a, 0x07, 0xfe, 0x7c, 0x89, 0x0d, - 0x81, 0xe4, 0x14, 0x8c, 0xb7, 0x34, 0x94, 0xb7, 0x09, 0xc4, 0x7a, 0x90, 0xc0, 0xf1, 0xa6, 0x6f, - 0xb6, 0x2f, 0xad, 0x38, 0xae, 0xb3, 0xe7, 0x5b, 0x36, 0xf4, 0xb4, 0xc7, 0x44, 0x08, 0x04, 0xfa, - 0x9f, 0x8b, 0xf4, 0x5f, 0xfb, 0xf7, 0x9c, 0xe8, 0x28, 0x1a, 0x76, 0xab, 0x2c, 0xf9, 0x98, 0xf0, - 0x49, 0x62, 0xe3, 0xa2, 0x08, 0xc5, 0xec, 0x85, 0xf6, 0x26, 0x19, 0x28, 0xfa, 0x83, 0x3d, 0xc7, - 0xf5, 0x6b, 0x4e, 0xdb, 0xec, 0x7a, 0xbe, 0xe3, 0x42, 0xad, 0x91, 0x28, 0x35, 0xd4, 0xc3, 0x74, - 0x9c, 0x76, 0x34, 0x38, 0xd2, 0x27, 0x56, 0xed, 0x64, 0x5e, 0xc7, 0x3f, 0x2e, 0xbc, 0xcb, 0x48, - 0xa4, 0xd2, 0xcf, 0x51, 0x8c, 0x9e, 0x0f, 0xea, 0xd2, 0xd2, 0xb9, 0xe2, 0x8b, 0xed, 0x3c, 0x0a, - 0x31, 0x35, 0x81, 0xa5, 0x72, 0x09, 0xcc, 0x37, 0xf7, 0x2e, 0x86, 0x44, 0x3c, 0xd6, 0x08, 0x79, - 0xad, 0x70, 0x8c, 0x04, 0xaa, 0x78, 0x2c, 0xa1, 0x18, 0xf9, 0xde, 0x08, 0xe6, 0x3d, 0x36, 0x1b, - 0xc5, 0x9b, 0x4f, 0x14, 0x8c, 0x8d, 0x30, 0xbc, 0xd4, 0xec, 0x05, 0xf8, 0x3e, 0x09, 0xcc, 0x37, - 0x7a, 0xd0, 0x86, 0x1d, 0xe2, 0x63, 0xc7, 0x09, 0xf0, 0xe5, 0x29, 0x05, 0xc8, 0x11, 0x8a, 0x11, - 0x60, 0xe4, 0x0f, 0x5b, 0x09, 0x84, 0x17, 0x25, 0xa4, 0x12, 0x5c, 0x52, 0x69, 0xd9, 0x0b, 0xee, - 0x4b, 0x12, 0x98, 0x35, 0xf6, 0xec, 0x75, 0xd7, 0x41, 0xa3, 0xb1, 0xab, 0xdd, 0x1d, 0x75, 0x10, - 0xb7, 0x82, 0x13, 0x9d, 0x3d, 0x17, 0xaf, 0x3f, 0x55, 0xed, 0x26, 0x6c, 0x3b, 0x76, 0xc7, 0xc3, - 0xf5, 0x28, 0x18, 0x07, 0x5f, 0xdc, 0x99, 0x7f, 0xc1, 0x5f, 0xc9, 0x39, 0xed, 0x45, 0xc2, 0x81, - 0x58, 0x48, 0xe5, 0x99, 0xa2, 0xc5, 0x7b, 0x02, 0xc1, 0x70, 0x2b, 0xc3, 0x4a, 0xc8, 0x5e, 0xb8, - 0x9f, 0x97, 0x80, 0x5a, 0x6a, 0xb7, 0x9d, 0x3d, 0xdb, 0x6f, 0xc2, 0x2e, 0x6c, 0xfb, 0x2d, 0xd7, - 0x6c, 0x43, 0xd6, 0x7e, 0x56, 0x80, 0xdc, 0xb1, 0x5c, 0xda, 0x07, 0xa3, 0xbf, 0x54, 0x8e, 0x2f, - 0x17, 0xde, 0x71, 0x24, 0xb5, 0x3c, 0x58, 0x4a, 0x0a, 0x71, 0x8a, 0xed, 0x2b, 0x0a, 0x16, 0x94, - 0xbd, 0x54, 0x3f, 0x25, 0x81, 0x99, 0xa0, 0xc7, 0xde, 0x16, 0x11, 0xe6, 0xcf, 0xa4, 0x9c, 0x8c, - 0x84, 0xc4, 0x53, 0xc8, 0xf0, 0x5d, 0x29, 0x66, 0x15, 0x71, 0xf4, 0xd3, 0x89, 0xae, 0x94, 0x5e, - 0x74, 0xe8, 0xb1, 0xde, 0xd8, 0x5c, 0x6e, 0xd4, 0x2a, 0xba, 0xa1, 0xc8, 0xda, 0x97, 0x25, 0x90, - 0x5f, 0xb7, 0xec, 0x6d, 0x36, 0x5e, 0xd6, 0x49, 0x64, 0x47, 0x76, 0xe0, 0x83, 0xb4, 0xa5, 0x93, - 0x07, 0xf5, 0x76, 0x70, 0xd2, 0xde, 0xdb, 0xbd, 0x08, 0xdd, 0xc6, 0x16, 0x1e, 0x65, 0xbd, 0x96, - 0xd3, 0x84, 0x36, 0x31, 0x42, 0x0b, 0xc6, 0xc0, 0x77, 0xbc, 0x09, 0x26, 0x30, 0x79, 0x40, 0x9c, - 0xc4, 0x48, 0x3c, 0x64, 0x4a, 0x62, 0x98, 0x4a, 0x35, 0x6d, 0x18, 0x40, 0x3c, 0x7b, 0x4d, 0xfd, - 0xcd, 0x02, 0xb8, 0xba, 0x64, 0xef, 0x63, 0x9b, 0x82, 0x74, 0xf0, 0xe5, 0x1d, 0xd3, 0xde, 0x86, - 0x78, 0x80, 0x08, 0x25, 0xce, 0x06, 0x90, 0xcf, 0xf1, 0x01, 0xe4, 0x55, 0x03, 0x4c, 0x39, 0x6e, - 0x07, 0xba, 0x4b, 0xfb, 0x98, 0xa7, 0xfe, 0x65, 0x67, 0xda, 0x26, 0x07, 0x15, 0xb1, 0x48, 0xc9, - 0x2f, 0x36, 0xc8, 0xf7, 0x46, 0x40, 0xe8, 0xec, 0xad, 0x60, 0x8a, 0xa6, 0xa9, 0x73, 0x60, 0xba, - 0x61, 0x54, 0x74, 0x63, 0xb3, 0x5a, 0x51, 0x8e, 0xa9, 0x57, 0x81, 0xe3, 0xd5, 0x96, 0x6e, 0x94, - 0x5a, 0xd5, 0x46, 0x7d, 0x13, 0xa7, 0x2b, 0x39, 0xed, 0xf9, 0x79, 0x51, 0xcf, 0xde, 0x64, 0x66, - 0x06, 0xc1, 0x6a, 0x80, 0xa9, 0x36, 0xc9, 0x80, 0x87, 0xd0, 0xd9, 0x54, 0xb5, 0xa3, 0x04, 0x49, - 0x82, 0x11, 0x10, 0x52, 0xcf, 0x00, 0x70, 0xc5, 0x75, 0xec, 0xed, 0xe8, 0x4c, 0xdb, 0xb4, 0xc1, - 0xa4, 0x68, 0x0f, 0xe5, 0x40, 0x91, 0x7c, 0x83, 0x2f, 0xcc, 0xc0, 0xff, 0x22, 0xc1, 0x07, 0xcf, - 0xc8, 0xe2, 0xc5, 0xf2, 0x8a, 0x26, 0x5a, 0xf4, 0x11, 0xe9, 0x22, 0x91, 0x01, 0xb1, 0x84, 0x69, - 0x55, 0x6e, 0x03, 0x45, 0xf2, 0x2d, 0xf5, 0x3a, 0x88, 0x0f, 0x7e, 0x49, 0xb2, 0x09, 0xfa, 0x29, - 0x8b, 0xcb, 0x34, 0x7b, 0x6d, 0xfe, 0x88, 0x04, 0xa6, 0xeb, 0xd0, 0x2f, 0xef, 0xc0, 0xf6, 0x25, - 0xed, 0x71, 0xfc, 0x02, 0x68, 0xd7, 0x82, 0xb6, 0x7f, 0x61, 0xb7, 0x1b, 0x2e, 0x80, 0x06, 0x09, - 0xda, 0x0b, 0xd9, 0xce, 0xf7, 0x99, 0xbc, 0xfe, 0xdc, 0x32, 0xa0, 0xae, 0x41, 0x09, 0x31, 0x2a, - 0x73, 0x0a, 0x14, 0x5d, 0xe8, 0xed, 0x75, 0x83, 0x45, 0x34, 0xfa, 0xa4, 0x3d, 0x1c, 0x8a, 0xb3, - 0xcc, 0x89, 0xf3, 0x36, 0xf1, 0x22, 0x26, 0x10, 0x4d, 0x33, 0x0f, 0xa6, 0xaa, 0xb6, 0xe5, 0x5b, - 0x66, 0x57, 0x7b, 0x51, 0x1e, 0xcc, 0x37, 0xa1, 0xbf, 0x6e, 0xba, 0xe6, 0x2e, 0xf4, 0xa1, 0xeb, - 0x69, 0xdf, 0xe4, 0xfb, 0x84, 0x5e, 0xd7, 0xf4, 0xb7, 0x1c, 0x77, 0x37, 0x50, 0xcd, 0xe0, 0x19, - 0xa9, 0xe6, 0x65, 0xe8, 0x7a, 0x11, 0x5f, 0xc1, 0x23, 0x7a, 0x73, 0xc5, 0x71, 0x2f, 0xa1, 0x41, - 0x90, 0x4e, 0xd3, 0xe8, 0x23, 0xa2, 0xd7, 0x75, 0xb6, 0x6b, 0xf0, 0x32, 0x0c, 0x82, 0x75, 0x85, - 0xcf, 0x68, 0x2e, 0xd0, 0x71, 0xea, 0x8e, 0x8f, 0x3a, 0xed, 0x9a, 0xb3, 0x4d, 0xa2, 0x99, 0x4e, - 0x1b, 0x7c, 0x62, 0x94, 0xcb, 0xbc, 0x0c, 0x71, 0xae, 0x22, 0x9b, 0x8b, 0x26, 0xaa, 0x8b, 0x40, - 0x0d, 0x3f, 0x6b, 0xc1, 0x2e, 0xdc, 0x85, 0xbe, 0xbb, 0x8f, 0x2f, 0x2d, 0x98, 0x36, 0x06, 0xbc, - 0xa1, 0x03, 0xb4, 0xf8, 0x64, 0x9d, 0x4a, 0x6f, 0x91, 0x93, 0xdc, 0xa1, 0x26, 0xeb, 0x22, 0x14, - 0x27, 0x72, 0x29, 0x93, 0x8c, 0xac, 0x99, 0x57, 0xc8, 0x20, 0x8f, 0x07, 0xcf, 0x37, 0xe7, 0xb8, - 0x15, 0xa6, 0x5d, 0xe8, 0x79, 0xe6, 0x36, 0x0c, 0x56, 0x98, 0xe8, 0xa3, 0x7a, 0x07, 0x28, 0x74, - 0x31, 0xa6, 0x64, 0x70, 0xb8, 0x81, 0xab, 0x19, 0x32, 0x30, 0x10, 0xad, 0x70, 0x24, 0xc0, 0x70, - 0x1b, 0xe4, 0x8b, 0xb3, 0xf7, 0x82, 0x02, 0x81, 0x7f, 0x06, 0x14, 0x2a, 0xfa, 0xd2, 0xc6, 0x8a, - 0x72, 0x0c, 0xfd, 0x0d, 0xf8, 0x9b, 0x01, 0x85, 0xe5, 0x52, 0xab, 0x54, 0x53, 0x24, 0x54, 0x8f, - 0x6a, 0x7d, 0xb9, 0xa1, 0xc8, 0x28, 0x71, 0xbd, 0x54, 0xaf, 0x96, 0x95, 0xbc, 0x3a, 0x0b, 0xa6, - 0xce, 0x97, 0x8c, 0x7a, 0xb5, 0xbe, 0xa2, 0x14, 0xb4, 0xaf, 0xb2, 0xf8, 0xdd, 0xc9, 0xe3, 0x77, - 0x63, 0x1c, 0x4f, 0x83, 0x20, 0xfb, 0x85, 0x10, 0xb2, 0xbb, 0x39, 0xc8, 0xbe, 0x5b, 0x84, 0xc8, - 0x04, 0xdc, 0x99, 0x8a, 0x60, 0x6a, 0xdd, 0x75, 0xda, 0xd0, 0xf3, 0xb4, 0x9f, 0x95, 0x40, 0xb1, - 0x6c, 0xda, 0x6d, 0xd8, 0xd5, 0xae, 0x89, 0xa0, 0x22, 0xae, 0xa2, 0xb9, 0xc0, 0x55, 0x54, 0xfb, - 0x7a, 0x4e, 0xb4, 0xf7, 0xa3, 0x74, 0x17, 0x09, 0xcd, 0x18, 0xf9, 0x88, 0xf5, 0x72, 0x89, 0xa4, - 0x26, 0x70, 0x71, 0x8b, 0x04, 0x66, 0xe8, 0x6a, 0xc0, 0x45, 0xc8, 0xce, 0xc3, 0xbf, 0x99, 0x13, - 0x9d, 0x1c, 0x06, 0x35, 0x08, 0xc9, 0xc4, 0xc8, 0x43, 0x6c, 0x22, 0x38, 0x8c, 0xda, 0x04, 0x36, - 0x0f, 0x25, 0x30, 0xbb, 0x61, 0x7b, 0x83, 0x84, 0x22, 0x1e, 0xe5, 0x3d, 0xa8, 0x06, 0x43, 0xe8, - 0x50, 0x51, 0xde, 0x87, 0xd3, 0xcb, 0x5e, 0x30, 0xdf, 0xcc, 0x81, 0x93, 0x2b, 0xd0, 0x86, 0xae, - 0xd5, 0x26, 0x35, 0x08, 0x24, 0x71, 0x37, 0x2f, 0x89, 0xc7, 0x71, 0x9c, 0x0f, 0xfa, 0x82, 0x97, - 0xc0, 0xab, 0x43, 0x09, 0x3c, 0x93, 0x93, 0xc0, 0xad, 0x82, 0x74, 0x26, 0x70, 0x5b, 0xf7, 0x0c, - 0x98, 0xab, 0x3b, 0xbe, 0xb5, 0x65, 0xb5, 0x89, 0x0f, 0xda, 0xcf, 0xcb, 0x20, 0x5f, 0xb3, 0x3c, - 0x5f, 0x2b, 0x45, 0xdd, 0xc9, 0xf5, 0x60, 0xd6, 0xb2, 0xdb, 0xdd, 0xbd, 0x0e, 0x34, 0xa0, 0x49, - 0xfa, 0x95, 0x69, 0x83, 0x4d, 0x8a, 0xb6, 0xf6, 0x11, 0x5b, 0x72, 0xb0, 0xb5, 0xff, 0xdb, 0xc2, - 0xcb, 0x30, 0x2c, 0x0b, 0x38, 0xdc, 0x61, 0x8c, 0xdd, 0x55, 0x02, 0xf3, 0x36, 0x93, 0x35, 0x30, - 0xd8, 0xfb, 0xc3, 0xdd, 0xb3, 0xe4, 0x0c, 0xfe, 0x0b, 0xed, 0x03, 0x42, 0x8d, 0x75, 0x18, 0x43, - 0xe9, 0x90, 0x59, 0x1e, 0x61, 0x92, 0xac, 0x82, 0x85, 0x6a, 0xbd, 0xa5, 0x1b, 0xf5, 0x52, 0x8d, - 0x66, 0x91, 0xb5, 0x7f, 0x95, 0x40, 0xc1, 0x80, 0xbd, 0xee, 0x3e, 0x1b, 0xcf, 0x98, 0x3a, 0x8a, - 0xe7, 0x42, 0x47, 0x71, 0x75, 0x19, 0x00, 0xb3, 0x8d, 0x0a, 0xc6, 0x17, 0x3e, 0x49, 0x03, 0xa3, - 0x64, 0x72, 0x15, 0x2c, 0x85, 0xb9, 0x0d, 0xe6, 0x4b, 0xed, 0xc5, 0xc2, 0x3b, 0x47, 0x1c, 0x35, - 0xcc, 0x61, 0x4c, 0x9f, 0xf0, 0x41, 0xa1, 0xcd, 0x9e, 0xa1, 0xe4, 0x8e, 0x46, 0xfc, 0x5f, 0x91, - 0x40, 0xbe, 0x85, 0x7a, 0x4b, 0xa6, 0xe3, 0xfc, 0xec, 0x68, 0x3a, 0x8e, 0xc8, 0xc4, 0xe8, 0xf8, - 0x3d, 0x60, 0x8e, 0xd5, 0x58, 0xea, 0x2a, 0x91, 0xa8, 0xe2, 0xdc, 0x07, 0xa3, 0x68, 0xf8, 0x00, - 0x76, 0x8e, 0x46, 0xc4, 0x9f, 0x7e, 0x3c, 0x00, 0x6b, 0x70, 0xf7, 0x22, 0x74, 0xbd, 0x1d, 0xab, - 0xa7, 0xfd, 0xb5, 0x0c, 0x66, 0x56, 0xa0, 0xdf, 0xf4, 0x4d, 0x7f, 0xcf, 0xeb, 0xdb, 0xee, 0xb4, - 0x9d, 0xb2, 0xd9, 0xde, 0x81, 0xb4, 0x3b, 0x0a, 0x1e, 0xb5, 0xf7, 0xc8, 0xa2, 0xfe, 0x44, 0x51, - 0x39, 0x8b, 0x61, 0x19, 0x31, 0x98, 0x3c, 0x01, 0xe4, 0x3b, 0xa6, 0x6f, 0x52, 0x2c, 0xae, 0xe9, - 0xc3, 0x22, 0x22, 0x64, 0xe0, 0x6c, 0xda, 0x3b, 0x24, 0x11, 0x87, 0x22, 0x81, 0xf2, 0xd3, 0x81, - 0xf0, 0x81, 0xdc, 0x08, 0x28, 0x9c, 0x00, 0xf3, 0xf5, 0x46, 0x6b, 0xb3, 0xd6, 0x58, 0x59, 0xd1, - 0x51, 0xaa, 0x22, 0xab, 0xa7, 0x80, 0xba, 0x5e, 0xba, 0xb0, 0xa6, 0xd7, 0x5b, 0x9b, 0xf5, 0x46, - 0x45, 0xa7, 0x5f, 0xe6, 0xd5, 0xe3, 0x60, 0xb6, 0x5c, 0x2a, 0xaf, 0x06, 0x09, 0x05, 0xf5, 0x34, - 0x38, 0xb9, 0xa6, 0xaf, 0x2d, 0xe9, 0x46, 0x73, 0xb5, 0xba, 0xbe, 0x89, 0xc8, 0x2c, 0x37, 0x36, - 0xea, 0x15, 0xa5, 0xa8, 0x6a, 0xe0, 0x14, 0xf3, 0xe6, 0xbc, 0xd1, 0xa8, 0xaf, 0x6c, 0x36, 0x5b, - 0xa5, 0x96, 0xae, 0x4c, 0xa9, 0x57, 0x81, 0xe3, 0xe5, 0x52, 0x1d, 0x67, 0x2f, 0x37, 0xea, 0x75, - 0xbd, 0xdc, 0x52, 0xa6, 0xb5, 0x7f, 0xcf, 0x83, 0xd9, 0xaa, 0x57, 0x37, 0x77, 0xe1, 0x39, 0xb3, - 0x6b, 0x75, 0xb4, 0x17, 0x31, 0x33, 0x8f, 0x1b, 0xc1, 0xbc, 0x4b, 0xfe, 0xc2, 0x4e, 0xcb, 0x82, - 0x04, 0xcd, 0x79, 0x83, 0x4f, 0x44, 0x73, 0x72, 0x1b, 0x13, 0x08, 0xe6, 0xe4, 0xe4, 0x49, 0x5d, - 0x02, 0x80, 0xfc, 0x6b, 0x45, 0x57, 0x8f, 0x9e, 0xed, 0x6f, 0x4d, 0xe6, 0x2e, 0xf4, 0xa0, 0x7b, - 0xd9, 0x6a, 0xc3, 0x20, 0xa7, 0xc1, 0x7c, 0xa5, 0xfd, 0x99, 0x2c, 0xba, 0xbf, 0xc8, 0x80, 0xca, - 0x54, 0x27, 0xa6, 0x37, 0xfc, 0x51, 0x59, 0x64, 0x77, 0x50, 0x88, 0x64, 0x3a, 0x4d, 0x79, 0xa9, - 0x34, 0xda, 0xb2, 0x6d, 0xab, 0xd1, 0xd8, 0x6c, 0xae, 0x36, 0x8c, 0x96, 0x22, 0xab, 0x73, 0x60, - 0x1a, 0x3d, 0xd6, 0x1a, 0xf5, 0x15, 0x25, 0xaf, 0x5e, 0x0d, 0x4e, 0xac, 0x96, 0x9a, 0x9b, 0xd5, - 0xfa, 0xb9, 0x52, 0xad, 0x5a, 0xd9, 0x2c, 0xaf, 0x96, 0x8c, 0xa6, 0x52, 0x50, 0xaf, 0x01, 0x57, - 0xb7, 0xaa, 0xba, 0xb1, 0xb9, 0xac, 0x97, 0x5a, 0x1b, 0x86, 0xde, 0xdc, 0xac, 0x37, 0x36, 0xeb, - 0xa5, 0x35, 0x5d, 0x29, 0xa2, 0xe6, 0x8f, 0x5f, 0x45, 0x6a, 0x33, 0x75, 0x50, 0x19, 0xa7, 0x63, - 0x94, 0x71, 0xa6, 0x5f, 0x19, 0x01, 0xab, 0x56, 0x86, 0xde, 0xd4, 0x8d, 0x73, 0xba, 0x32, 0x3b, - 0x48, 0xd7, 0xe6, 0xd4, 0x93, 0x40, 0x41, 0x3c, 0x6c, 0x56, 0x9b, 0x41, 0xce, 0x8a, 0x32, 0xaf, - 0x7d, 0xaa, 0x08, 0x4e, 0x19, 0x70, 0xdb, 0xf2, 0x7c, 0xe8, 0xae, 0x9b, 0xfb, 0xbb, 0xd0, 0xf6, - 0x83, 0x4e, 0xfe, 0x9f, 0x53, 0x2b, 0xe3, 0x1a, 0x98, 0xef, 0x11, 0x1a, 0x6b, 0xd0, 0xdf, 0x71, - 0x3a, 0x74, 0x14, 0x7e, 0x5c, 0x6c, 0xcf, 0xb1, 0xb8, 0xce, 0x66, 0x37, 0xf8, 0xaf, 0x19, 0xdd, - 0x96, 0x13, 0x74, 0x3b, 0x3f, 0x8a, 0x6e, 0xab, 0xd7, 0x82, 0x99, 0x3d, 0x0f, 0xba, 0xfa, 0xae, - 0x69, 0x75, 0x83, 0xab, 0x23, 0xc3, 0x04, 0xed, 0x9d, 0x79, 0xd1, 0x13, 0x2b, 0x4c, 0x5d, 0x06, - 0x8b, 0x31, 0xa6, 0x6f, 0x3d, 0x03, 0x00, 0xad, 0xec, 0x86, 0xdb, 0xa5, 0xca, 0xca, 0xa4, 0x20, - 0xfe, 0x2e, 0x5a, 0xdd, 0xae, 0x65, 0x6f, 0x87, 0xfb, 0xfe, 0x51, 0x82, 0xf6, 0x52, 0x59, 0xe4, - 0x04, 0x4b, 0x5a, 0xde, 0xd2, 0xb5, 0xa6, 0x17, 0x4b, 0x13, 0xee, 0x77, 0x0f, 0x36, 0x9d, 0xa2, - 0xaa, 0x80, 0x39, 0x9c, 0x46, 0x5b, 0xa0, 0x32, 0x85, 0xfa, 0xe0, 0x80, 0xdc, 0x9a, 0xde, 0x5a, - 0x6d, 0x54, 0xc2, 0x77, 0xd3, 0x88, 0x24, 0x62, 0xa6, 0x54, 0xbf, 0x80, 0x5b, 0xe3, 0x8c, 0xfa, - 0x18, 0x70, 0x0d, 0xd3, 0x61, 0x97, 0x6a, 0x86, 0x5e, 0xaa, 0x5c, 0xd8, 0xd4, 0xef, 0xaf, 0x36, - 0x5b, 0x4d, 0xbe, 0x71, 0x05, 0xed, 0x68, 0x16, 0xf1, 0xab, 0xaf, 0x95, 0xaa, 0x35, 0xda, 0xbf, - 0x2f, 0x37, 0x8c, 0xb5, 0x52, 0x4b, 0x99, 0xd3, 0x5e, 0x21, 0x03, 0x65, 0x05, 0xfa, 0xeb, 0x8e, - 0xeb, 0x9b, 0xdd, 0x9a, 0x65, 0x5f, 0xda, 0x70, 0xbb, 0xdc, 0x64, 0x53, 0x38, 0x4c, 0x07, 0x3f, - 0x44, 0x72, 0x04, 0xe3, 0x77, 0xc4, 0x7b, 0x38, 0x5b, 0xa4, 0x4c, 0x51, 0x82, 0xf6, 0x5c, 0x49, - 0x64, 0xb9, 0x5b, 0xbc, 0xd4, 0x74, 0x7a, 0xf2, 0xbc, 0x49, 0x8f, 0xcf, 0x03, 0x50, 0x2b, 0x6a, - 0x2f, 0xc8, 0x83, 0xe9, 0x65, 0xcb, 0x36, 0xbb, 0xd6, 0x73, 0xb8, 0xe8, 0x98, 0x51, 0x1f, 0x93, - 0x4b, 0xe8, 0x63, 0xa4, 0x91, 0xc6, 0xcf, 0x9f, 0x96, 0x45, 0x97, 0x17, 0x18, 0xd9, 0x07, 0x4c, - 0xc6, 0x0c, 0x9e, 0x1f, 0x95, 0x44, 0x96, 0x17, 0x86, 0xd3, 0x4b, 0x87, 0xe1, 0x67, 0xbe, 0x33, - 0x6c, 0xac, 0xbe, 0xf6, 0x3d, 0x3d, 0x48, 0x15, 0x66, 0xb4, 0xdf, 0x97, 0x81, 0xb6, 0x02, 0xfd, - 0x73, 0xd0, 0x0d, 0xa7, 0x02, 0xb8, 0xd7, 0xa7, 0xf6, 0x36, 0xd3, 0x64, 0xdf, 0xcc, 0x02, 0x78, - 0x9e, 0x07, 0xb0, 0x94, 0xd0, 0x78, 0x62, 0x48, 0xc7, 0x34, 0xde, 0x2a, 0x28, 0x7a, 0xf8, 0x3d, - 0x55, 0xb3, 0x27, 0xc5, 0x0f, 0x97, 0x98, 0x18, 0x4b, 0x9d, 0x10, 0x36, 0x28, 0x01, 0xed, 0x5b, - 0xe1, 0x24, 0xe8, 0xfb, 0x38, 0xed, 0x58, 0x3e, 0x34, 0xb3, 0xe9, 0xf4, 0xc5, 0xcd, 0x56, 0x5d, - 0x06, 0xd9, 0x37, 0xda, 0x47, 0x0b, 0xe0, 0xe4, 0xa0, 0xea, 0x68, 0xbf, 0x92, 0xe3, 0x76, 0xd8, - 0x21, 0x1e, 0xf2, 0x73, 0x74, 0x03, 0x11, 0x3d, 0xa8, 0x4f, 0x01, 0x57, 0x87, 0xcb, 0x70, 0x2d, - 0xa7, 0x0e, 0xaf, 0x78, 0x5d, 0xe8, 0xfb, 0xd0, 0xc5, 0x55, 0x9b, 0x36, 0x06, 0xbf, 0x54, 0x9f, - 0x06, 0x1e, 0x65, 0xd9, 0x9e, 0xd5, 0x81, 0x6e, 0xcb, 0xea, 0x79, 0x25, 0xbb, 0xd3, 0xda, 0xf3, - 0x1d, 0xd7, 0x32, 0xe9, 0x45, 0x87, 0xd3, 0x46, 0xdc, 0x6b, 0xf5, 0x16, 0xa0, 0x58, 0x5e, 0xc3, - 0xbe, 0xe8, 0x98, 0x6e, 0xc7, 0xb2, 0xb7, 0x6b, 0x96, 0xe7, 0x53, 0x0f, 0xe0, 0x03, 0xe9, 0xda, - 0xdf, 0xc8, 0xa2, 0x87, 0xe9, 0x86, 0xc0, 0x1a, 0xd3, 0xa1, 0xbc, 0x50, 0x16, 0x39, 0x1e, 0x97, - 0x8e, 0x76, 0x3a, 0x65, 0x79, 0xfe, 0xa4, 0x0d, 0x89, 0xc1, 0x23, 0x38, 0xee, 0x5a, 0x48, 0x7a, - 0x60, 0x08, 0x9c, 0xd3, 0x8d, 0xea, 0x72, 0x55, 0x47, 0x66, 0xc5, 0xd5, 0xe0, 0x44, 0xf4, 0xae, - 0x72, 0x61, 0xb3, 0xa9, 0xd7, 0x5b, 0xca, 0x34, 0xea, 0xa7, 0x48, 0xf2, 0x72, 0xa9, 0x5a, 0xd3, - 0x2b, 0x9b, 0xad, 0x06, 0x7a, 0x53, 0x19, 0xcd, 0xb4, 0xd0, 0x1e, 0xca, 0x83, 0xe3, 0x58, 0xb6, - 0xfb, 0x58, 0xaa, 0x48, 0x28, 0x7d, 0xbe, 0xb6, 0x21, 0x40, 0x33, 0x44, 0xbc, 0xda, 0xef, 0x09, - 0xdf, 0xe3, 0xc8, 0x40, 0xd8, 0x57, 0x46, 0x8c, 0x66, 0x7c, 0x53, 0x12, 0x89, 0x50, 0x21, 0x4c, - 0x36, 0x9d, 0x52, 0xfc, 0xcb, 0xa4, 0x47, 0x9c, 0x78, 0xf0, 0xb1, 0x95, 0x59, 0xc6, 0x1f, 0xdf, - 0xbf, 0x5e, 0x35, 0xb0, 0x3a, 0x2c, 0x00, 0x80, 0x53, 0xb0, 0x06, 0x11, 0x3d, 0x18, 0x38, 0x5e, - 0xc5, 0xe9, 0x41, 0xa9, 0xdc, 0xaa, 0x9e, 0xd3, 0xe3, 0xf4, 0xe0, 0x73, 0x32, 0x98, 0x5e, 0x81, - 0x3e, 0x9a, 0x53, 0x79, 0xda, 0xd3, 0x05, 0xd6, 0x7f, 0x90, 0x19, 0x83, 0x2f, 0xbe, 0x0f, 0x97, - 0x01, 0xc8, 0x93, 0xf6, 0x23, 0xa3, 0x98, 0x20, 0x41, 0xd1, 0x31, 0xe3, 0xd5, 0xf7, 0x82, 0x82, - 0x8f, 0x5e, 0xd3, 0x65, 0xe8, 0xef, 0x8a, 0x1d, 0xae, 0x10, 0x91, 0x8a, 0xe9, 0x9b, 0x06, 0xc9, - 0xcf, 0x8c, 0x4e, 0x82, 0xb6, 0x4b, 0x0c, 0x23, 0xdf, 0x89, 0xf6, 0xe7, 0x57, 0x65, 0x70, 0x35, - 0x69, 0x1f, 0xa5, 0x5e, 0xaf, 0xe9, 0x3b, 0x2e, 0x34, 0x60, 0x1b, 0x5a, 0x3d, 0xbf, 0x6f, 0x7d, - 0xcf, 0x25, 0xa9, 0xc1, 0x66, 0x33, 0x7d, 0xd4, 0xde, 0x20, 0x8b, 0x46, 0xf8, 0x3d, 0xd0, 0x1e, - 0xfb, 0xca, 0x8b, 0x69, 0xec, 0x9f, 0x94, 0x44, 0x62, 0xf6, 0xa6, 0x24, 0x9e, 0x0e, 0xa8, 0x8f, - 0x1d, 0x01, 0x50, 0xc1, 0xca, 0x8d, 0xa1, 0x97, 0xf5, 0xea, 0x3a, 0x1a, 0x04, 0xae, 0x03, 0x8f, - 0x5e, 0xdf, 0x30, 0xca, 0xab, 0xa5, 0xa6, 0xbe, 0x69, 0xe8, 0x2b, 0xd5, 0x66, 0x8b, 0x3a, 0x65, - 0x91, 0xaf, 0xa6, 0xd4, 0x6b, 0xc1, 0xe9, 0xe6, 0xc6, 0x52, 0xb3, 0x6c, 0x54, 0xd7, 0x71, 0xba, - 0xa1, 0xd7, 0xf5, 0xf3, 0xf4, 0xed, 0xb4, 0xf6, 0x61, 0x05, 0xcc, 0xa2, 0x09, 0x40, 0x93, 0xcc, - 0x0b, 0xb4, 0xbf, 0xcb, 0x83, 0x59, 0x03, 0x7a, 0x4e, 0xf7, 0x32, 0x9e, 0x23, 0x4c, 0x6a, 0xea, - 0xf1, 0x0d, 0x59, 0xf4, 0xfc, 0x36, 0xc3, 0xec, 0x22, 0xc3, 0x68, 0xfc, 0x44, 0xd3, 0xbc, 0x6c, - 0x5a, 0x5d, 0xf3, 0x22, 0xed, 0x6a, 0xa6, 0x8d, 0x28, 0x41, 0x5d, 0x04, 0xaa, 0x73, 0xc5, 0x86, - 0x6e, 0xb3, 0x7d, 0x45, 0xf7, 0x77, 0x4a, 0x9d, 0x8e, 0x0b, 0x3d, 0x8f, 0xae, 0x5e, 0x0c, 0x78, - 0xa3, 0xde, 0x0c, 0x8e, 0xe3, 0x54, 0x26, 0x33, 0x71, 0x90, 0xe9, 0x4f, 0x0e, 0x73, 0x96, 0xec, - 0xfd, 0x20, 0x67, 0x81, 0xc9, 0x19, 0x25, 0xb3, 0xc7, 0x25, 0x8a, 0xfc, 0x29, 0x9d, 0xeb, 0xc1, - 0xac, 0x6d, 0xee, 0x42, 0xfd, 0xc1, 0x9e, 0xe5, 0x42, 0x0f, 0x3b, 0xc6, 0xc8, 0x06, 0x9b, 0xa4, - 0x7d, 0x54, 0xe8, 0xbc, 0xb9, 0x98, 0xc4, 0xd2, 0xe9, 0xfe, 0xca, 0x08, 0xaa, 0x3f, 0xa0, 0x9f, - 0x91, 0xb5, 0x0f, 0xcb, 0x60, 0x8e, 0x32, 0x55, 0xb2, 0xf7, 0xab, 0x1d, 0xed, 0x3a, 0xce, 0xf8, - 0x35, 0x51, 0x5a, 0x60, 0xfc, 0xe2, 0x07, 0xed, 0xc7, 0x64, 0x51, 0x77, 0xe7, 0x01, 0x15, 0xc7, - 0x65, 0xc4, 0x3b, 0x8e, 0x6e, 0x39, 0x7b, 0xd4, 0x51, 0x75, 0xda, 0x20, 0x0f, 0x59, 0x2e, 0xea, - 0x69, 0xbf, 0x26, 0xe4, 0x4c, 0x2d, 0x58, 0x8d, 0x23, 0x02, 0xf0, 0xd3, 0x32, 0x58, 0xa0, 0x5c, - 0x35, 0xe9, 0x39, 0x1f, 0xa1, 0x03, 0x6f, 0x3f, 0x21, 0x6c, 0x08, 0x0e, 0xa8, 0x3f, 0x2d, 0xe9, - 0x11, 0x03, 0xe4, 0xc7, 0x85, 0x82, 0xa3, 0x09, 0x57, 0xe4, 0x88, 0xa0, 0x7c, 0x57, 0x1e, 0xcc, - 0x6e, 0x78, 0xd0, 0xa5, 0x7e, 0xfb, 0xda, 0xc3, 0x79, 0x20, 0xaf, 0x40, 0x6e, 0x23, 0xf5, 0x25, - 0xc2, 0x1e, 0xbe, 0x6c, 0x65, 0x19, 0xa2, 0xc8, 0x46, 0x8a, 0x81, 0xed, 0x26, 0xb0, 0x40, 0x44, - 0x5a, 0xf2, 0x7d, 0x64, 0x24, 0x06, 0xde, 0xb4, 0x7d, 0xa9, 0xe3, 0xd8, 0x2a, 0xc2, 0x65, 0xa1, - 0x2c, 0x65, 0xc4, 0x53, 0x0d, 0x6e, 0x91, 0xf9, 0x6c, 0xde, 0xe8, 0x4b, 0xc5, 0x97, 0xeb, 0xf7, - 0x20, 0x39, 0xbf, 0xc2, 0x64, 0x2e, 0xe0, 0xcc, 0x83, 0x5e, 0x69, 0x7f, 0x27, 0xe4, 0xab, 0x2b, - 0x2e, 0x9d, 0x74, 0xba, 0xd0, 0x1b, 0x8f, 0x49, 0x72, 0x12, 0x28, 0x28, 0x07, 0xde, 0x7f, 0x31, - 0xf4, 0x66, 0xa3, 0x76, 0x4e, 0x1f, 0xbc, 0x8c, 0x51, 0xd0, 0x9e, 0x2f, 0x83, 0x99, 0x25, 0xd7, - 0x31, 0x3b, 0x6d, 0xd3, 0xf3, 0xb5, 0x6f, 0x49, 0x60, 0x6e, 0xdd, 0xdc, 0xef, 0x3a, 0x66, 0x07, - 0xfb, 0xf7, 0xf7, 0xf5, 0x05, 0x3d, 0xf2, 0x2a, 0xe8, 0x0b, 0xe8, 0x23, 0x7f, 0x30, 0x30, 0x3c, - 0xba, 0x97, 0x13, 0xb9, 0xae, 0x31, 0xdc, 0xe6, 0x93, 0x06, 0x05, 0x2b, 0x0d, 0xf8, 0x5a, 0x64, - 0x79, 0x8a, 0xb1, 0x28, 0x3f, 0x2c, 0x16, 0x7e, 0x54, 0x84, 0xe4, 0xd1, 0xec, 0xca, 0xbf, 0x60, - 0x1a, 0x14, 0x2b, 0x10, 0x5b, 0x71, 0xff, 0x5d, 0x02, 0x53, 0x4d, 0xe8, 0x63, 0x0b, 0xee, 0x0e, - 0xce, 0x53, 0xb8, 0x83, 0x33, 0x44, 0x4e, 0xec, 0xc1, 0x33, 0x9a, 0xac, 0x33, 0xe7, 0xad, 0xf1, - 0xff, 0x14, 0x1e, 0x89, 0xa4, 0xdc, 0x45, 0x5a, 0xe6, 0xa1, 0x3c, 0x12, 0x13, 0x49, 0x65, 0xef, - 0x6b, 0xf5, 0x1e, 0x89, 0xba, 0x56, 0x31, 0xbd, 0xde, 0x6b, 0x58, 0xfd, 0x4c, 0xf4, 0x36, 0xa3, - 0xcc, 0x27, 0x38, 0x47, 0x3d, 0x19, 0x4c, 0x11, 0x99, 0x07, 0xf3, 0xd1, 0x7e, 0x3f, 0x05, 0x42, - 0x02, 0x9f, 0xbd, 0x0e, 0x72, 0x0a, 0xba, 0xa8, 0xc5, 0x17, 0x3e, 0x91, 0x18, 0x04, 0x73, 0x75, - 0xe8, 0x5f, 0x71, 0xdc, 0x4b, 0x4d, 0xdf, 0xf4, 0xa1, 0xf6, 0x2f, 0x12, 0x90, 0x9b, 0xd0, 0x67, - 0xa3, 0x9f, 0xd4, 0xc1, 0x09, 0x52, 0x21, 0x9a, 0x11, 0xf7, 0xdf, 0xa4, 0x22, 0xd7, 0x0f, 0x14, - 0x02, 0x93, 0xcf, 0x38, 0xf8, 0xa9, 0xf6, 0xb3, 0x03, 0x83, 0x3e, 0x49, 0x03, 0x26, 0x0d, 0x54, - 0x32, 0x2c, 0x83, 0x48, 0xc1, 0x62, 0xf4, 0xf4, 0x23, 0x42, 0x66, 0xb5, 0x18, 0xcd, 0xa3, 0xe9, - 0x0a, 0xfe, 0xed, 0x71, 0x20, 0x5f, 0xde, 0x31, 0x7d, 0xed, 0xdd, 0x32, 0x00, 0xa5, 0x4e, 0x67, - 0x8d, 0xf8, 0x80, 0xb3, 0x0e, 0x69, 0x67, 0xc1, 0x5c, 0x7b, 0xc7, 0x8c, 0x6e, 0xce, 0x20, 0xfd, - 0x01, 0x97, 0xa6, 0x3e, 0x25, 0x72, 0x26, 0x27, 0x52, 0xd5, 0xfa, 0x60, 0x42, 0x65, 0x50, 0xda, - 0xa1, 0xa3, 0x39, 0x1f, 0x0a, 0x33, 0xf1, 0x08, 0x1d, 0xfa, 0x7c, 0x31, 0x62, 0x2f, 0x7e, 0x0e, - 0x47, 0x49, 0x87, 0x07, 0x6c, 0xa2, 0x84, 0x94, 0x27, 0xbd, 0xc5, 0x02, 0x7a, 0x24, 0xf3, 0x35, - 0x91, 0xd0, 0xb5, 0xaa, 0xde, 0xb1, 0x02, 0xd1, 0xd2, 0x80, 0x59, 0xda, 0x8b, 0x73, 0xe9, 0xe0, - 0x4b, 0x16, 0xdc, 0x33, 0xc1, 0x3c, 0xec, 0x58, 0x3e, 0x0c, 0x6a, 0x49, 0x05, 0x98, 0x04, 0x31, - 0xff, 0x81, 0xf6, 0x3c, 0xe1, 0xa0, 0x6b, 0x58, 0xa0, 0x07, 0x6b, 0x14, 0xd3, 0xfe, 0xc4, 0xc2, - 0xa8, 0x89, 0xd1, 0xcc, 0x1e, 0xac, 0x1f, 0x91, 0xc1, 0xd5, 0x2d, 0x67, 0x7b, 0xbb, 0x0b, 0x03, - 0x31, 0x41, 0xe2, 0x9d, 0xa9, 0x99, 0xe3, 0x84, 0x0b, 0xef, 0x04, 0x39, 0x0f, 0x58, 0xe1, 0x51, - 0x32, 0xf4, 0xc0, 0x9f, 0x98, 0x4a, 0x9c, 0x45, 0x61, 0x71, 0x0d, 0xe4, 0x33, 0x06, 0x05, 0xb1, - 0x80, 0xcf, 0xc2, 0x64, 0xb3, 0x07, 0xe2, 0x0b, 0x12, 0x98, 0x27, 0xf7, 0x22, 0x06, 0x0a, 0x7a, - 0xdf, 0x18, 0x01, 0xd0, 0xbe, 0x95, 0x13, 0xf5, 0xb3, 0xc5, 0x32, 0xe1, 0x38, 0x89, 0x11, 0xb1, - 0x58, 0x50, 0x95, 0xa1, 0xe4, 0x26, 0x70, 0x53, 0x67, 0x1e, 0xcc, 0xae, 0xc0, 0xa0, 0xa5, 0x79, - 0xda, 0xfb, 0x53, 0xf6, 0x44, 0x67, 0xc1, 0x1c, 0xbe, 0x1c, 0xac, 0x41, 0x8f, 0x49, 0x92, 0x55, - 0x33, 0x2e, 0x4d, 0xbd, 0x11, 0xcc, 0x5f, 0x84, 0x5b, 0x8e, 0x0b, 0x1b, 0xdc, 0x59, 0x4a, 0x3e, - 0x71, 0x70, 0x78, 0x3a, 0xf5, 0x66, 0x70, 0x9c, 0x3a, 0xba, 0x2f, 0xa1, 0xb9, 0xbe, 0xe9, 0xee, - 0xd3, 0x83, 0x69, 0xfd, 0xc9, 0xda, 0x57, 0xd9, 0x06, 0xb3, 0xc4, 0xa3, 0x78, 0xeb, 0x41, 0xb1, - 0x33, 0x95, 0x8e, 0x19, 0x9d, 0x9e, 0x0a, 0xa6, 0xa9, 0x8e, 0x04, 0x06, 0x5d, 0x52, 0x0f, 0x1a, - 0xe6, 0x55, 0x9f, 0x0a, 0x66, 0x90, 0x88, 0xb0, 0xdd, 0x40, 0xbb, 0xde, 0xd3, 0x03, 0x3e, 0xc4, - 0xef, 0x8d, 0x28, 0xab, 0xf6, 0x8b, 0xa1, 0xce, 0xe8, 0x9c, 0xce, 0x3c, 0x29, 0x0d, 0xf3, 0x13, - 0xb9, 0x9f, 0x5c, 0x61, 0xca, 0x5f, 0xda, 0xaf, 0x76, 0x3c, 0x6d, 0x2d, 0x9d, 0xd6, 0x9c, 0x01, - 0x20, 0x6c, 0x7e, 0x41, 0xe0, 0x0c, 0x26, 0x85, 0x8f, 0x8d, 0x9f, 0x78, 0x14, 0xb0, 0x5f, 0x1c, - 0x98, 0x9d, 0xf1, 0x02, 0x2a, 0x78, 0x84, 0x50, 0x84, 0x93, 0xec, 0xd1, 0xf9, 0x85, 0x3c, 0xb8, - 0x3a, 0x3c, 0xe1, 0x54, 0x33, 0xbd, 0xa8, 0x65, 0x5f, 0x48, 0x07, 0x11, 0x77, 0xa4, 0x24, 0x6c, - 0x8e, 0x27, 0x41, 0xc1, 0xdb, 0xbb, 0x18, 0x3a, 0x02, 0x92, 0x07, 0xed, 0x8d, 0x72, 0xaa, 0xb1, - 0x6a, 0x20, 0x7f, 0x63, 0x6e, 0x84, 0xb7, 0x82, 0x13, 0xf6, 0xde, 0x6e, 0x88, 0x05, 0xee, 0x69, - 0x68, 0xcf, 0x72, 0xf0, 0x05, 0xdf, 0x64, 0xf3, 0xe2, 0x4d, 0x36, 0xc5, 0x48, 0x2a, 0x52, 0xe9, - 0xec, 0xd5, 0xe3, 0x33, 0x7d, 0x47, 0xd0, 0xca, 0xa9, 0x95, 0x82, 0xc0, 0x2f, 0xb1, 0xf0, 0xff, - 0x53, 0x2e, 0x55, 0xcf, 0x3b, 0xfc, 0xe4, 0x5a, 0x8a, 0x9e, 0xf0, 0x28, 0x8f, 0xad, 0x7d, 0x5e, - 0x02, 0x5a, 0x33, 0x72, 0xc8, 0xa1, 0xa0, 0xae, 0xbb, 0xf0, 0xb2, 0x05, 0xaf, 0x70, 0xee, 0x5b, - 0x6f, 0x12, 0x8e, 0x43, 0xcd, 0xeb, 0xca, 0x01, 0xa2, 0xf1, 0xeb, 0xe2, 0x03, 0x70, 0x11, 0x8b, - 0x37, 0x9d, 0xae, 0xc4, 0x09, 0xc4, 0x0e, 0x97, 0xc0, 0x19, 0x06, 0xd5, 0x65, 0xd7, 0xd9, 0x4d, - 0x90, 0xec, 0x2b, 0x58, 0xc9, 0x6e, 0xf0, 0x92, 0xbd, 0x27, 0x51, 0x5d, 0x06, 0x10, 0x8e, 0x51, - 0xc7, 0xf7, 0x87, 0x72, 0xbc, 0x9f, 0x93, 0x63, 0xe5, 0x90, 0xf4, 0xb3, 0x97, 0xe5, 0x1f, 0xe6, - 0xc1, 0x9c, 0x01, 0xcd, 0x4e, 0x38, 0x08, 0xfc, 0x5f, 0x8c, 0x79, 0xf7, 0x74, 0x90, 0xf7, 0xa3, - 0x75, 0x9a, 0xc7, 0x1d, 0xac, 0x0c, 0xfb, 0x25, 0x7e, 0xc0, 0xcb, 0x35, 0xf8, 0xa3, 0x03, 0xbd, - 0x85, 0x24, 0x60, 0x1b, 0xca, 0x22, 0xb6, 0x61, 0x7e, 0x90, 0x6d, 0x78, 0x33, 0x38, 0xde, 0x35, - 0x3d, 0xbf, 0x72, 0xb1, 0x65, 0xed, 0x42, 0xcf, 0x37, 0x77, 0x7b, 0xd8, 0x0a, 0x94, 0x8d, 0xfe, - 0x64, 0xfe, 0x1e, 0xf8, 0xc4, 0xf3, 0x60, 0x83, 0xaa, 0x78, 0xf8, 0x98, 0xb9, 0x1f, 0x12, 0x3a, - 0xfc, 0x35, 0xac, 0xec, 0x74, 0x9a, 0x71, 0xef, 0x08, 0x6b, 0x4b, 0xa7, 0x80, 0xba, 0xa6, 0x37, - 0x9b, 0xa5, 0x15, 0x7c, 0x26, 0x24, 0x70, 0x12, 0xea, 0x9c, 0x7d, 0x2c, 0x12, 0x1f, 0x41, 0x5a, - 0x9d, 0x8b, 0xc6, 0x5e, 0xe5, 0x98, 0x3a, 0x0b, 0xa6, 0x5c, 0xd8, 0xeb, 0x5a, 0xd0, 0x53, 0x72, - 0xda, 0x37, 0x25, 0x50, 0xdc, 0xb0, 0x5d, 0x68, 0x76, 0xb4, 0x67, 0xc5, 0x0f, 0x21, 0x23, 0x2a, - 0x05, 0x1f, 0xf7, 0x2a, 0x71, 0x55, 0x96, 0x36, 0x3a, 0xc4, 0xc8, 0x58, 0xe0, 0x13, 0x5b, 0x8e, - 0x8d, 0x2f, 0x35, 0xf3, 0x26, 0x7d, 0x76, 0x0a, 0x14, 0xf4, 0xdd, 0x9e, 0xbf, 0x7f, 0xf6, 0xb1, - 0x60, 0xbe, 0xe9, 0xbb, 0xd0, 0xdc, 0x65, 0x36, 0xd5, 0x7d, 0xe7, 0x12, 0xb4, 0x83, 0x4d, 0x75, - 0xfc, 0x70, 0xe7, 0x1d, 0x60, 0xca, 0x76, 0x36, 0xcd, 0x3d, 0x7f, 0x47, 0xbd, 0xee, 0x40, 0x34, - 0x1a, 0xaa, 0x7e, 0x0d, 0x1a, 0xfe, 0xef, 0xcf, 0xee, 0xc2, 0x53, 0xab, 0xa2, 0xed, 0x94, 0xf6, - 0xfc, 0x9d, 0xa5, 0x6b, 0x3f, 0xfd, 0xe7, 0x67, 0x72, 0x9f, 0xfb, 0xf3, 0x33, 0xb9, 0xaf, 0xfc, - 0xf9, 0x99, 0xdc, 0x4f, 0xfc, 0xc5, 0x99, 0x63, 0x9f, 0xfb, 0x8b, 0x33, 0xc7, 0xbe, 0xf0, 0x17, - 0x67, 0x8e, 0x7d, 0x9f, 0xd4, 0xbb, 0x78, 0xb1, 0x88, 0xa9, 0x3c, 0xf9, 0xff, 0x0b, 0x00, 0x00, - 0xff, 0xff, 0xdd, 0xfb, 0x60, 0x82, 0x1a, 0x2a, 0x02, 0x00, + 0x3b, 0x07, 0x56, 0x7b, 0x30, 0xcd, 0x18, 0x89, 0x7e, 0x36, 0x94, 0x68, 0x93, 0x93, 0xe8, 0x3d, + 0xa3, 0x93, 0x4e, 0x27, 0xd0, 0xfa, 0x58, 0xfb, 0xae, 0xbc, 0xf6, 0x17, 0x12, 0x38, 0x41, 0x3c, + 0x08, 0xef, 0x25, 0x33, 0x27, 0xdc, 0xdb, 0xf3, 0xd6, 0x57, 0x37, 0x9a, 0x65, 0x11, 0xfd, 0x66, + 0x52, 0xb4, 0xd7, 0xb1, 0x02, 0xbf, 0x8f, 0x17, 0x78, 0x4c, 0x3f, 0xde, 0x5f, 0x5c, 0x8c, 0xac, + 0x7f, 0x23, 0x94, 0x75, 0x9d, 0x93, 0xf5, 0x9d, 0x23, 0x51, 0x3d, 0x5a, 0x31, 0x7f, 0x2d, 0x0f, + 0x1e, 0x43, 0x38, 0xa4, 0x8a, 0x40, 0xfa, 0xc1, 0x92, 0xdd, 0x31, 0xa0, 0xe7, 0x9b, 0xae, 0xcf, + 0x85, 0x5e, 0xe9, 0x9b, 0x9a, 0xe7, 0x32, 0x98, 0x9a, 0x4b, 0x43, 0xa7, 0xe6, 0xda, 0x7b, 0x58, + 0x03, 0xef, 0x3c, 0x8f, 0x6c, 0x29, 0x01, 0x83, 0x98, 0x1a, 0xc6, 0xb5, 0xa8, 0xd0, 0xf2, 0xfb, + 0x3e, 0x0e, 0xe5, 0xe5, 0x43, 0x97, 0x90, 0x0e, 0xf1, 0x5f, 0x1f, 0xaf, 0x25, 0x9e, 0x67, 0xdf, + 0xf1, 0x66, 0xa3, 0xd2, 0xc9, 0x74, 0x0a, 0xf5, 0xd2, 0x69, 0x30, 0x83, 0xbb, 0x9c, 0x9a, 0x65, + 0x5f, 0xd2, 0xfe, 0x5c, 0x06, 0x73, 0x75, 0x78, 0xa5, 0xbc, 0x63, 0x76, 0xbb, 0xd0, 0xde, 0x86, + 0xda, 0x03, 0x9c, 0x6d, 0x6f, 0xf6, 0x7a, 0xf5, 0x68, 0x7f, 0x38, 0x78, 0x54, 0xef, 0x01, 0x05, + 0xaf, 0xed, 0x84, 0x41, 0x1d, 0xbe, 0x3b, 0x66, 0xf5, 0xba, 0xb4, 0xe7, 0xef, 0x2c, 0xe2, 0xb2, + 0x4a, 0x3d, 0xab, 0x89, 0x3e, 0x30, 0xc8, 0x77, 0x74, 0x9c, 0xfc, 0xcb, 0x81, 0x9d, 0x71, 0x2e, + 0xa1, 0x33, 0x0e, 0x19, 0x5f, 0x64, 0x99, 0x8e, 0x59, 0x24, 0xb9, 0x1e, 0xcc, 0xb6, 0x83, 0x2c, + 0xe1, 0x29, 0x3d, 0x36, 0x49, 0xfb, 0x6a, 0xaa, 0xee, 0x5a, 0xa8, 0xf0, 0x74, 0x5a, 0x05, 0xc7, + 0x6c, 0x6a, 0x5e, 0x0d, 0x4e, 0xb4, 0x1a, 0x8d, 0xcd, 0xb5, 0x52, 0xfd, 0x42, 0x14, 0x5b, 0x65, + 0x4b, 0x7b, 0x65, 0x1e, 0x2c, 0x34, 0x9d, 0xee, 0x65, 0x18, 0xe1, 0x5c, 0xe5, 0xdc, 0x3f, 0x59, + 0x39, 0xe5, 0x0e, 0xc8, 0x49, 0x3d, 0x05, 0x8a, 0xa6, 0xed, 0x5d, 0x81, 0x81, 0xf9, 0x4f, 0x9f, + 0x28, 0x8c, 0x1f, 0x61, 0x3b, 0x02, 0x83, 0x87, 0xf1, 0xae, 0x21, 0x92, 0xe4, 0xb9, 0x8a, 0x01, + 0xf2, 0x2c, 0x98, 0xf3, 0x88, 0x97, 0x48, 0x8b, 0x71, 0x06, 0xe2, 0xd2, 0x30, 0x8b, 0xc4, 0x4d, + 0x49, 0xa6, 0x2c, 0xe2, 0x27, 0xed, 0xe1, 0xb0, 0xff, 0xd8, 0xe0, 0x20, 0x2e, 0x1d, 0x86, 0xb1, + 0x74, 0x20, 0xbf, 0x7a, 0xdc, 0x93, 0xf8, 0xd3, 0xe0, 0x64, 0x70, 0x42, 0xbd, 0xbc, 0x5a, 0xaa, + 0xd5, 0xf4, 0xfa, 0x8a, 0xbe, 0x59, 0xad, 0x90, 0xfd, 0xe4, 0x28, 0xa5, 0xd4, 0x6a, 0xe9, 0x6b, + 0xeb, 0xad, 0xe6, 0xa6, 0x7e, 0x7f, 0x59, 0xd7, 0x2b, 0xd8, 0x01, 0x1b, 0x9f, 0xa0, 0x0c, 0x5c, + 0xe5, 0x4b, 0xf5, 0xe6, 0x79, 0xdd, 0x50, 0x76, 0xce, 0x96, 0xc0, 0x2c, 0x33, 0x50, 0x20, 0xee, + 0x2a, 0x70, 0xcb, 0xdc, 0xeb, 0x52, 0x73, 0x5c, 0x39, 0x86, 0xb8, 0xc3, 0xb2, 0x69, 0xd8, 0xdd, + 0x7d, 0x25, 0xa7, 0x2a, 0x60, 0x8e, 0x1d, 0x13, 0x14, 0x49, 0x7b, 0xe7, 0xb5, 0x60, 0xe6, 0xbc, + 0xe3, 0x5e, 0xc2, 0x5e, 0xc3, 0xda, 0x07, 0x48, 0x0c, 0xb6, 0x20, 0xa2, 0x04, 0x63, 0x80, 0xbd, + 0x5a, 0xdc, 0x4d, 0x2c, 0xa0, 0xb6, 0x38, 0x34, 0x6a, 0xc4, 0xf5, 0x60, 0xf6, 0x4a, 0x90, 0x3b, + 0x6a, 0xe9, 0x4c, 0x92, 0xf6, 0x8b, 0x62, 0x8e, 0x5f, 0xc3, 0x8b, 0xcc, 0x7e, 0xd5, 0xff, 0xed, + 0x12, 0x28, 0xae, 0x40, 0xbf, 0xd4, 0xed, 0xb2, 0x72, 0x7b, 0xb9, 0xf0, 0x39, 0x52, 0xae, 0x12, + 0xa5, 0x6e, 0x37, 0xbe, 0x51, 0x31, 0x02, 0x0a, 0xce, 0x3b, 0x71, 0x69, 0x82, 0x5e, 0xda, 0x43, + 0x0a, 0xcc, 0x5e, 0x62, 0x1f, 0x8d, 0x5c, 0xb3, 0x5f, 0xcf, 0x98, 0x49, 0x4f, 0x8a, 0xe2, 0xef, + 0xe5, 0x92, 0x9d, 0xa4, 0x82, 0x7c, 0xea, 0x7d, 0x60, 0x6a, 0xcf, 0x83, 0x65, 0xd3, 0x0b, 0x86, + 0x36, 0xbe, 0xa6, 0x8d, 0x8b, 0x0f, 0xc0, 0xb6, 0xbf, 0x58, 0xdd, 0x45, 0x13, 0x9f, 0x0d, 0x92, + 0x31, 0x8c, 0x57, 0x44, 0x9f, 0x8d, 0x80, 0x02, 0x9a, 0x76, 0x5e, 0xb1, 0xfc, 0x9d, 0xf2, 0x8e, + 0xe9, 0xd3, 0xcd, 0x96, 0xf0, 0x59, 0x7b, 0xc9, 0x08, 0x70, 0x26, 0x3a, 0xec, 0xc4, 0x1e, 0x47, + 0x4f, 0x0d, 0xe2, 0x18, 0xbc, 0x6c, 0x46, 0x01, 0xf1, 0x6f, 0x24, 0x90, 0x6f, 0xf4, 0xa0, 0x2d, + 0x7c, 0xf6, 0x32, 0x94, 0xad, 0xd4, 0x27, 0xdb, 0x87, 0xc5, 0xdd, 0x82, 0xc3, 0x4a, 0xa3, 0x92, + 0x63, 0x24, 0x7b, 0x1b, 0xc8, 0x5b, 0xf6, 0x96, 0x43, 0x2d, 0xdb, 0x47, 0xc7, 0xd8, 0x3a, 0x55, + 0x7b, 0xcb, 0x31, 0x70, 0x46, 0x51, 0x8f, 0xe0, 0xa4, 0xb2, 0xb3, 0x17, 0xf7, 0xdf, 0x4e, 0x83, + 0x22, 0x51, 0x67, 0xed, 0x65, 0x32, 0x90, 0x4b, 0x9d, 0x4e, 0x8c, 0xe0, 0xa5, 0x03, 0x82, 0x77, + 0xf0, 0x67, 0x21, 0x26, 0xe1, 0x33, 0x1f, 0x78, 0x4d, 0xb0, 0x6f, 0xa7, 0x4d, 0xaa, 0xd4, 0xe9, + 0xc4, 0x9f, 0x5b, 0x08, 0x0b, 0x94, 0xf8, 0x02, 0xd9, 0x16, 0x2e, 0x8b, 0xb5, 0xf0, 0xd4, 0x03, + 0x41, 0x2c, 0x7f, 0xd9, 0x43, 0xf4, 0xf7, 0x12, 0x98, 0xaa, 0x59, 0x9e, 0x8f, 0xb0, 0x29, 0x89, + 0x60, 0x73, 0x2d, 0x98, 0x09, 0x44, 0x83, 0xba, 0x3c, 0xd4, 0x9f, 0x47, 0x09, 0xfc, 0x4c, 0xfc, + 0x5e, 0x1e, 0x9d, 0xa7, 0x24, 0xd7, 0x9e, 0x72, 0x11, 0x7f, 0xa6, 0x2d, 0x2a, 0x56, 0xea, 0x2f, + 0xf6, 0x97, 0x42, 0x81, 0xaf, 0x71, 0x02, 0xbf, 0x63, 0x94, 0x22, 0xb3, 0x17, 0xfa, 0xef, 0x4b, + 0x00, 0xa0, 0xb2, 0xe9, 0xc1, 0xe1, 0xc7, 0x71, 0xe1, 0x40, 0x12, 0xa4, 0xfb, 0x4a, 0x56, 0xba, + 0x6b, 0xbc, 0x74, 0xbf, 0x77, 0x78, 0x55, 0x93, 0x0e, 0x08, 0xab, 0x0a, 0x90, 0xad, 0x50, 0xb4, + 0xe8, 0xaf, 0xf6, 0xf6, 0x50, 0xa8, 0xeb, 0x9c, 0x50, 0xef, 0x1a, 0xb1, 0xa4, 0xec, 0xe5, 0xfa, + 0x47, 0x12, 0x98, 0x6a, 0x42, 0x1f, 0x75, 0x93, 0xda, 0x39, 0x91, 0x1e, 0x9e, 0x69, 0xdb, 0x92, + 0x60, 0xdb, 0xfe, 0x66, 0x4e, 0x34, 0x30, 0x5c, 0x24, 0x19, 0xca, 0x53, 0xcc, 0xea, 0xc3, 0xeb, + 0x85, 0x02, 0xc3, 0x0d, 0xa3, 0x96, 0xbd, 0x74, 0xdf, 0x2a, 0x85, 0x9e, 0x22, 0xfc, 0xb9, 0x3e, + 0xd6, 0x2c, 0xce, 0x1d, 0x34, 0x8b, 0xc5, 0xcf, 0xf5, 0xb1, 0x75, 0x8c, 0x77, 0x4c, 0x48, 0x6d, + 0x6c, 0x8c, 0xc1, 0x67, 0x60, 0x14, 0x79, 0x3d, 0x4f, 0x06, 0x45, 0xba, 0x79, 0x70, 0x4f, 0xf2, + 0xde, 0xc1, 0xf0, 0xa9, 0xc5, 0xfb, 0x47, 0x30, 0xe5, 0x92, 0x96, 0xe5, 0x43, 0x36, 0x24, 0x86, + 0x8d, 0x5b, 0x41, 0x01, 0x47, 0xcd, 0xa6, 0xe3, 0x5c, 0xe4, 0xee, 0x11, 0x90, 0xd0, 0xd1, 0x5b, + 0x83, 0x64, 0x4a, 0x8d, 0xc2, 0x18, 0x56, 0xf2, 0x47, 0x41, 0xe1, 0x1b, 0x2a, 0x00, 0xeb, 0x7b, + 0x17, 0xbb, 0x96, 0xb7, 0x63, 0xd9, 0xd8, 0x47, 0x6c, 0x8e, 0x3e, 0x92, 0xe0, 0xcf, 0x89, 0xe6, + 0x5f, 0xac, 0x51, 0xa0, 0x00, 0x79, 0xcf, 0xb5, 0xe8, 0x32, 0x00, 0xfa, 0xab, 0xde, 0x1d, 0x7a, + 0x5b, 0xe6, 0xfb, 0x02, 0xb7, 0x20, 0x31, 0x44, 0x1c, 0x2c, 0x32, 0xa5, 0x47, 0x5e, 0x97, 0x6c, + 0x84, 0xef, 0x02, 0x1f, 0xe1, 0x9b, 0x3b, 0xcd, 0x5d, 0xec, 0x3b, 0xcd, 0x8d, 0x70, 0xf4, 0xac, + 0xe7, 0x40, 0xec, 0x7a, 0x24, 0x1b, 0xf8, 0x3f, 0xfa, 0x02, 0xbb, 0x07, 0x61, 0xef, 0x3c, 0x72, + 0x66, 0x20, 0x4a, 0x60, 0xfb, 0xbc, 0x19, 0xc1, 0x3e, 0xef, 0xb3, 0xd1, 0xdc, 0xe7, 0xbf, 0x09, + 0x1a, 0xce, 0x29, 0x24, 0x77, 0x0b, 0x50, 0x2c, 0xbb, 0xdd, 0xdd, 0xeb, 0x90, 0x63, 0x27, 0xa8, + 0x6f, 0xa3, 0xa7, 0x51, 0x0e, 0xa4, 0x6b, 0x1f, 0x17, 0x0e, 0xcb, 0xc9, 0x48, 0x3c, 0x71, 0x4e, + 0x43, 0xf9, 0x91, 0x42, 0x7e, 0x98, 0x1d, 0xe1, 0xa4, 0xfe, 0x78, 0x18, 0xfd, 0x74, 0x9a, 0xbd, + 0x3b, 0xc2, 0xea, 0x8d, 0x0a, 0x16, 0x82, 0x43, 0xf2, 0x8d, 0xa5, 0x7b, 0xf5, 0x72, 0x4b, 0x81, + 0x07, 0x0f, 0xce, 0xe3, 0x23, 0xf2, 0xe4, 0x38, 0x7c, 0xb4, 0x42, 0xa3, 0xfd, 0x4f, 0x09, 0x14, + 0xa9, 0xf1, 0x71, 0xcf, 0x21, 0x01, 0xd5, 0x5e, 0x35, 0x0a, 0x24, 0x89, 0xb1, 0x4a, 0x3e, 0x93, + 0x16, 0x80, 0x31, 0x98, 0x1b, 0x17, 0x32, 0x03, 0x40, 0xfb, 0x27, 0x09, 0xe4, 0x91, 0x51, 0x24, + 0x16, 0x09, 0xe2, 0xd3, 0xc2, 0x0e, 0xc2, 0x8c, 0x00, 0x10, 0xf9, 0x18, 0xfd, 0x5e, 0x02, 0x33, + 0x3d, 0x92, 0x31, 0x8c, 0x43, 0x72, 0xa3, 0x40, 0xd7, 0x04, 0x8d, 0xe8, 0x33, 0xed, 0x7d, 0x42, + 0xc7, 0x1f, 0x92, 0xf9, 0x49, 0x07, 0x87, 0x3e, 0x8e, 0xa0, 0x11, 0x5b, 0xda, 0xbf, 0x4a, 0x00, + 0x18, 0xd0, 0x73, 0xba, 0x97, 0xe1, 0x86, 0x6b, 0x69, 0x8f, 0x8e, 0x00, 0xa0, 0xcd, 0x3e, 0x17, + 0x35, 0xfb, 0xcf, 0x49, 0xa2, 0xae, 0xc0, 0x9c, 0xe6, 0x05, 0xc4, 0x63, 0xc4, 0xff, 0x0c, 0x30, + 0x45, 0xe5, 0x48, 0x2d, 0x4c, 0x31, 0xe1, 0x07, 0x1f, 0x69, 0x1f, 0x14, 0x72, 0x25, 0x16, 0xe1, + 0x28, 0x1d, 0x00, 0xe5, 0x11, 0x00, 0x38, 0x0e, 0x66, 0x03, 0x00, 0x36, 0x8c, 0xaa, 0x02, 0xb5, + 0x77, 0xcb, 0xd8, 0xdf, 0x82, 0x0c, 0x75, 0x87, 0xef, 0x69, 0xfe, 0x42, 0x78, 0xea, 0xcf, 0xc8, + 0x23, 0x2c, 0x3f, 0x23, 0x80, 0x7e, 0x5b, 0x68, 0xae, 0x2f, 0xc0, 0xd0, 0x23, 0xa5, 0xbf, 0x3a, + 0xab, 0x83, 0x79, 0xce, 0x46, 0x51, 0x4f, 0x83, 0x93, 0x5c, 0x02, 0x19, 0xef, 0x3a, 0xca, 0x31, + 0x55, 0x03, 0xa7, 0xb8, 0x37, 0xf4, 0x01, 0x76, 0x94, 0x9c, 0xf6, 0xf0, 0x17, 0x72, 0xe1, 0xea, + 0xcf, 0xfb, 0xf3, 0x74, 0xdd, 0xed, 0x93, 0x7c, 0xe8, 0xcb, 0xb6, 0x63, 0xfb, 0xf0, 0x41, 0xc6, + 0x69, 0x25, 0x4c, 0x48, 0xb4, 0x21, 0x4e, 0x83, 0x29, 0xdf, 0x65, 0x1d, 0x59, 0x82, 0x47, 0x56, + 0xb1, 0x0a, 0xbc, 0x62, 0xd5, 0xc1, 0x59, 0x6a, 0x4d, 0x18, 0xb0, 0x6b, 0x22, 0x19, 0x7a, 0x25, + 0xaf, 0x02, 0x7b, 0xd0, 0xee, 0x40, 0xdb, 0x27, 0x7c, 0x06, 0xa7, 0x60, 0x05, 0x72, 0xf2, 0xca, + 0x78, 0x37, 0xaf, 0x8c, 0x8f, 0x1b, 0xb4, 0xa0, 0x9b, 0xb0, 0xfa, 0x77, 0x07, 0x00, 0xa4, 0x6e, + 0xe7, 0x2c, 0x78, 0x85, 0xaa, 0xe1, 0x35, 0x7d, 0x6b, 0x80, 0x8d, 0x30, 0x83, 0xc1, 0x64, 0xd6, + 0xbe, 0x1c, 0xaa, 0xdf, 0x33, 0x39, 0xf5, 0xbb, 0x55, 0x90, 0x85, 0x74, 0x5a, 0xd7, 0x1b, 0x41, + 0xeb, 0xe6, 0xc1, 0x4c, 0xb4, 0xb7, 0x2c, 0xab, 0xd7, 0x80, 0xab, 0x03, 0x7f, 0xe3, 0xba, 0xae, + 0x57, 0x9a, 0x9b, 0x1b, 0xeb, 0x2b, 0x46, 0xa9, 0xa2, 0x2b, 0x00, 0xe9, 0x27, 0xd1, 0xcb, 0xd0, + 0x4d, 0x38, 0xaf, 0xfd, 0x81, 0x04, 0x0a, 0xf8, 0x08, 0xb7, 0xf6, 0xfd, 0x63, 0xd2, 0x1c, 0x8f, + 0x73, 0x81, 0x0a, 0xc7, 0x5d, 0xf1, 0x0b, 0x4d, 0xa8, 0x30, 0x31, 0x57, 0x87, 0xba, 0xd0, 0x24, + 0x81, 0x50, 0xf6, 0xf3, 0x22, 0xd4, 0x24, 0x9b, 0x3b, 0xce, 0x95, 0xff, 0xcc, 0x4d, 0x12, 0xd5, + 0xff, 0x88, 0x9b, 0xe4, 0x00, 0x16, 0x26, 0xde, 0x24, 0x07, 0xb4, 0xbb, 0x84, 0x66, 0xaa, 0x7d, + 0xa4, 0x10, 0xce, 0x06, 0x3f, 0x21, 0x1d, 0x6a, 0x27, 0xac, 0x04, 0xe6, 0x2d, 0xdb, 0x87, 0xae, + 0x6d, 0x76, 0x97, 0xbb, 0xe6, 0x76, 0x60, 0x9f, 0xf6, 0x6f, 0x7f, 0x54, 0x99, 0x3c, 0x06, 0xff, + 0x85, 0x7a, 0x06, 0x00, 0x1f, 0xee, 0xf6, 0xba, 0xa6, 0x1f, 0xa9, 0x1e, 0x93, 0xc2, 0x6a, 0x5f, + 0x9e, 0xd7, 0xbe, 0x27, 0x82, 0xab, 0x08, 0x68, 0xad, 0xfd, 0x1e, 0xdc, 0xb0, 0xad, 0x67, 0xef, + 0xe1, 0x48, 0xc9, 0x44, 0x47, 0x07, 0xbd, 0xe2, 0xf6, 0x83, 0x8a, 0xfc, 0x7e, 0x90, 0x7a, 0x17, + 0xb8, 0x06, 0x07, 0xc1, 0xc6, 0x37, 0x86, 0x9c, 0xb7, 0x3a, 0xdb, 0xd0, 0xaf, 0x6e, 0xad, 0x59, + 0x9e, 0x67, 0xd9, 0xdb, 0x78, 0x72, 0x3e, 0x6d, 0xc4, 0x67, 0xd0, 0xfe, 0x46, 0x38, 0x0a, 0x53, + 0xd0, 0x67, 0x0c, 0x89, 0xc2, 0x14, 0xb6, 0x53, 0xb9, 0xaf, 0x9d, 0x86, 0x6b, 0x3c, 0x79, 0x81, + 0x35, 0x1e, 0x16, 0xd3, 0x82, 0xe0, 0x5a, 0xc1, 0x6b, 0x85, 0xc2, 0x3c, 0x25, 0x55, 0x63, 0x02, + 0x6b, 0x42, 0x32, 0x58, 0x20, 0x45, 0x2f, 0x39, 0xce, 0xa5, 0x5d, 0xd3, 0xbd, 0xa4, 0xfd, 0xc4, + 0xe1, 0xf6, 0x74, 0x13, 0xf7, 0xb2, 0xe2, 0x36, 0x68, 0xfb, 0x94, 0x37, 0xdf, 0xaf, 0xbc, 0xda, + 0x67, 0x85, 0xa7, 0x24, 0x9c, 0x3c, 0x83, 0x4a, 0x4d, 0x66, 0xb3, 0x4b, 0xec, 0xb0, 0xa3, 0x08, + 0x83, 0xd9, 0x03, 0xff, 0x9b, 0x21, 0xf0, 0xc1, 0x38, 0xc2, 0xee, 0x13, 0x8c, 0x13, 0x77, 0xed, + 0x2b, 0xa3, 0x61, 0x17, 0xf0, 0x35, 0x02, 0x76, 0x0a, 0x90, 0x2f, 0x85, 0xae, 0x49, 0xe8, 0x2f, + 0x5b, 0xa1, 0x7c, 0x76, 0x68, 0xc6, 0xb0, 0x3c, 0x11, 0x34, 0x4f, 0xf2, 0x2c, 0x34, 0x7a, 0x99, + 0x62, 0xfa, 0x25, 0xe1, 0xfd, 0xb7, 0x81, 0x02, 0x22, 0xdc, 0x4d, 0xa6, 0x55, 0x8a, 0x6d, 0xde, + 0x89, 0xb3, 0x99, 0x3d, 0x9a, 0x2f, 0x2e, 0x80, 0x99, 0x20, 0x1a, 0x16, 0xbe, 0x5f, 0x30, 0xc4, + 0xf0, 0x14, 0x28, 0x7a, 0xce, 0x9e, 0xdb, 0x86, 0x74, 0x47, 0x94, 0x3e, 0x8d, 0xb0, 0x7b, 0x37, + 0xd4, 0x5c, 0x38, 0x60, 0x91, 0xe4, 0x53, 0x5b, 0x24, 0xf1, 0xf6, 0x6e, 0x82, 0xfd, 0xa0, 0xbd, + 0x44, 0xf8, 0x12, 0x10, 0x0e, 0xb3, 0x26, 0xf4, 0x1f, 0x89, 0x46, 0xc0, 0xaf, 0x09, 0xed, 0x0d, + 0x0d, 0xa9, 0x49, 0x3a, 0x95, 0x6b, 0x8c, 0x60, 0x07, 0x3f, 0x1a, 0x3c, 0x2a, 0xc8, 0x41, 0x0d, + 0x60, 0x6c, 0xf0, 0x6e, 0x18, 0x35, 0x45, 0xd6, 0x9e, 0x97, 0x07, 0x0a, 0x61, 0xad, 0x11, 0xda, + 0x82, 0xda, 0xcb, 0x73, 0x47, 0x6d, 0xf0, 0xc6, 0xcf, 0x60, 0x7f, 0x57, 0x12, 0x0d, 0x1d, 0xce, + 0x09, 0x3e, 0xaa, 0x5d, 0x8c, 0x26, 0x8d, 0xd0, 0xcc, 0x12, 0x94, 0x4f, 0x7b, 0x4b, 0x4e, 0x24, + 0x12, 0xb9, 0x18, 0x8b, 0xd9, 0xf7, 0x4a, 0xdf, 0xcc, 0x07, 0x41, 0x0d, 0x97, 0x5d, 0x67, 0x77, + 0xc3, 0xed, 0x6a, 0xff, 0x26, 0x74, 0xd1, 0x43, 0xcc, 0xec, 0x42, 0x8a, 0x9f, 0x5d, 0xe0, 0x15, + 0xe9, 0x6e, 0xb4, 0x31, 0xd6, 0x1d, 0x61, 0xf8, 0x56, 0x6f, 0x02, 0x0b, 0x66, 0xa7, 0xb3, 0x6e, + 0x6e, 0xc3, 0x32, 0x9a, 0xb6, 0xdb, 0x3e, 0x0d, 0x78, 0xd6, 0x97, 0x9a, 0x38, 0x95, 0xe1, 0xfb, + 0xc8, 0xa9, 0x03, 0x56, 0xa9, 0xf8, 0x32, 0x2c, 0x07, 0x22, 0x95, 0xdf, 0x44, 0x86, 0x3f, 0x34, + 0x64, 0xb4, 0x77, 0xcc, 0x28, 0x3c, 0x23, 0x7d, 0x12, 0xf4, 0xcc, 0x12, 0xe0, 0x3b, 0x7b, 0xcd, + 0xfb, 0x15, 0x09, 0x4c, 0x21, 0x3c, 0x4a, 0x9d, 0x8e, 0xf6, 0x58, 0x2e, 0x8a, 0x69, 0xac, 0x6f, + 0xdc, 0x0b, 0x85, 0x9d, 0x12, 0x83, 0x1a, 0x12, 0xfa, 0x31, 0x98, 0x44, 0x42, 0x94, 0x38, 0x21, + 0x8a, 0xf9, 0x1e, 0x26, 0x16, 0x91, 0xbd, 0xf8, 0x3e, 0x2d, 0x81, 0xf9, 0x60, 0x9e, 0xb1, 0x0c, + 0xfd, 0xf6, 0x8e, 0x76, 0x87, 0xe8, 0x3a, 0x17, 0x6d, 0x89, 0xe1, 0x96, 0x70, 0x57, 0xfb, 0x76, + 0x2e, 0xa5, 0xca, 0x73, 0x25, 0xc7, 0x2c, 0x12, 0xa6, 0xd2, 0xc5, 0x24, 0x82, 0xd9, 0x0b, 0xf3, + 0xcb, 0x12, 0x00, 0x2d, 0x27, 0x9c, 0x2c, 0x1f, 0x42, 0x92, 0x3f, 0x29, 0xbc, 0x5b, 0x4c, 0x2b, + 0x1e, 0x15, 0x9b, 0xbe, 0xe7, 0x10, 0x74, 0xad, 0x1a, 0x56, 0xd2, 0x44, 0xda, 0xfa, 0x4c, 0x65, + 0xaf, 0xd7, 0xb5, 0xda, 0xa6, 0xdf, 0xef, 0x0f, 0x18, 0x2f, 0x5e, 0x7c, 0x39, 0x77, 0x2a, 0xa3, + 0x31, 0x2c, 0x23, 0x46, 0x96, 0x24, 0xea, 0x8f, 0x14, 0x44, 0xfd, 0x11, 0xf4, 0xf1, 0x19, 0x42, + 0x7c, 0x02, 0xea, 0x29, 0x83, 0xe3, 0x8d, 0x1e, 0xb4, 0x97, 0x5c, 0x68, 0x76, 0xda, 0xee, 0xde, + 0xee, 0x45, 0x8f, 0x75, 0x66, 0x4d, 0xd6, 0x51, 0x66, 0xe5, 0x5a, 0xe2, 0x56, 0xae, 0xb5, 0x1f, + 0x96, 0x45, 0xe3, 0xb2, 0x31, 0xfb, 0x2b, 0x0c, 0x0f, 0x23, 0x0c, 0x75, 0xa9, 0x5c, 0xb0, 0xfa, + 0x16, 0xa9, 0xf3, 0x69, 0x16, 0xa9, 0xdf, 0x2c, 0x14, 0xe5, 0x4d, 0xa8, 0x5e, 0x13, 0xf1, 0xa4, + 0x5b, 0x68, 0x42, 0x3f, 0x06, 0xde, 0x1b, 0xc1, 0xfc, 0xc5, 0xe8, 0x4d, 0x08, 0x31, 0x9f, 0x38, + 0xc0, 0xbf, 0xf5, 0xad, 0x69, 0x57, 0x68, 0x78, 0x16, 0x62, 0xd0, 0x0d, 0x11, 0x94, 0x44, 0x9c, + 0xe8, 0x52, 0x2d, 0xb7, 0x24, 0x96, 0x9f, 0x3d, 0x0a, 0x1f, 0x97, 0xc0, 0x2c, 0xbe, 0x72, 0x7c, + 0x69, 0x1f, 0x1f, 0xeb, 0x14, 0x34, 0x4a, 0x5e, 0xcc, 0x8a, 0x59, 0x05, 0xf9, 0xae, 0x65, 0x5f, + 0x0a, 0xbc, 0x1f, 0xd1, 0xff, 0xe8, 0xc2, 0x52, 0x69, 0xc0, 0x85, 0xa5, 0xe1, 0x36, 0x49, 0x58, + 0x6e, 0xcc, 0x68, 0xfa, 0x86, 0x9c, 0xc8, 0x85, 0xa5, 0x43, 0xc9, 0x65, 0x2f, 0xc6, 0xbf, 0xca, + 0x83, 0x62, 0x13, 0x9a, 0x6e, 0x7b, 0x47, 0x7b, 0xbf, 0x34, 0x70, 0x2a, 0x31, 0xcd, 0x4f, 0x25, + 0x96, 0xc1, 0xd4, 0x96, 0xd5, 0xf5, 0xa1, 0x4b, 0x3c, 0xc2, 0xd9, 0xae, 0x9d, 0x34, 0xf1, 0xa5, + 0xae, 0xd3, 0xbe, 0xb4, 0x48, 0x4d, 0xfb, 0xc5, 0x20, 0x7a, 0xf4, 0xe2, 0x32, 0xfe, 0xc8, 0x08, + 0x3e, 0x46, 0x06, 0xa1, 0xe7, 0xb8, 0x7e, 0xdc, 0x6d, 0x44, 0x31, 0x54, 0x9a, 0x8e, 0xeb, 0x1b, + 0xe4, 0x43, 0x04, 0xf3, 0xd6, 0x5e, 0xb7, 0xdb, 0x82, 0x0f, 0xfa, 0xc1, 0xb4, 0x2e, 0x78, 0x46, + 0xc6, 0xa2, 0xb3, 0xb5, 0xe5, 0x41, 0xb2, 0xa8, 0x50, 0x30, 0xe8, 0x93, 0x7a, 0x12, 0x14, 0xba, + 0xd6, 0xae, 0x45, 0x26, 0x22, 0x05, 0x83, 0x3c, 0xa8, 0xb7, 0x00, 0x25, 0x9a, 0x03, 0x11, 0x46, + 0x4f, 0x17, 0x71, 0xd3, 0x3c, 0x90, 0x8e, 0x74, 0xe6, 0x12, 0xdc, 0xf7, 0x4e, 0x4f, 0xe1, 0xf7, + 0xf8, 0x3f, 0x7f, 0xfc, 0x46, 0x64, 0xc3, 0x84, 0x48, 0x3c, 0x7e, 0x86, 0xeb, 0xc2, 0xb6, 0xe3, + 0x76, 0x02, 0xd9, 0xc4, 0x4f, 0x30, 0x68, 0xbe, 0x74, 0xdb, 0x1c, 0x03, 0x0b, 0xcf, 0x5e, 0xd3, + 0xde, 0x53, 0x44, 0xdd, 0x26, 0x2a, 0xfa, 0xbc, 0xe5, 0xef, 0xac, 0x41, 0xdf, 0xd4, 0xfe, 0x4a, + 0x1e, 0xa8, 0x71, 0xb3, 0xff, 0xbf, 0xc6, 0x0d, 0xd1, 0x38, 0x12, 0x01, 0xcc, 0xdf, 0x73, 0x6d, + 0x24, 0x47, 0xea, 0x55, 0xcb, 0xa4, 0xa8, 0x77, 0x81, 0x6b, 0xa2, 0xa7, 0x60, 0x29, 0xb5, 0xc2, + 0x38, 0xda, 0x4e, 0x1b, 0xf1, 0x19, 0xd4, 0x75, 0x70, 0x03, 0x79, 0xb9, 0xda, 0x5a, 0xab, 0xad, + 0x5a, 0xdb, 0x3b, 0x5d, 0x6b, 0x7b, 0xc7, 0xf7, 0xaa, 0xb6, 0xe7, 0x43, 0xb3, 0xd3, 0xd8, 0x32, + 0xc8, 0x3d, 0x62, 0x00, 0xd3, 0x11, 0xc9, 0xca, 0x7b, 0x8c, 0x8b, 0x8d, 0x6e, 0xac, 0xa6, 0xc4, + 0xb4, 0x94, 0xa7, 0xa2, 0x96, 0xe2, 0xed, 0x75, 0x43, 0x4c, 0xaf, 0xed, 0xc3, 0x34, 0x52, 0xf5, + 0xbd, 0x2e, 0x6e, 0x2e, 0x38, 0x73, 0xda, 0x71, 0x2e, 0x81, 0x93, 0xec, 0x9b, 0xcd, 0xbf, 0x15, + 0x41, 0x61, 0xc5, 0x35, 0x7b, 0x3b, 0xda, 0xf3, 0x98, 0xfe, 0x79, 0x5c, 0x6d, 0x22, 0xd4, 0x4e, + 0x69, 0x98, 0x76, 0xca, 0x43, 0xb4, 0x33, 0xcf, 0x68, 0x67, 0xfc, 0xa2, 0xf3, 0x59, 0x30, 0xd7, + 0x76, 0xba, 0x5d, 0xd8, 0x46, 0xf2, 0xa8, 0x76, 0xf0, 0x6a, 0xcf, 0x8c, 0xc1, 0xa5, 0xe1, 0x08, + 0xfb, 0xd0, 0x6f, 0x92, 0x35, 0x76, 0xa2, 0xf4, 0x51, 0x82, 0xf6, 0x72, 0x09, 0xe4, 0xf5, 0xce, + 0x36, 0xe4, 0xd6, 0xe1, 0x73, 0xcc, 0x3a, 0xfc, 0x29, 0x50, 0xf4, 0x4d, 0x77, 0x1b, 0xfa, 0xc1, + 0x3a, 0x01, 0x79, 0x0a, 0x03, 0xff, 0xcb, 0x4c, 0xe0, 0xff, 0xef, 0x05, 0x79, 0x24, 0x33, 0xea, + 0x24, 0x7f, 0xc3, 0x20, 0xf8, 0xb1, 0xec, 0x17, 0x51, 0x89, 0x8b, 0xa8, 0xd6, 0x06, 0xfe, 0xa0, + 0x1f, 0xeb, 0xc2, 0xc1, 0xc0, 0xb4, 0xd7, 0x82, 0x19, 0xab, 0xed, 0xd8, 0xd5, 0x5d, 0x73, 0x1b, + 0xd2, 0x6a, 0x46, 0x09, 0xc1, 0x5b, 0x7d, 0xd7, 0x79, 0xc0, 0xa2, 0x8b, 0x5a, 0x51, 0x02, 0xaa, + 0xc2, 0x8e, 0xd5, 0xe9, 0x40, 0x9b, 0xb6, 0x6c, 0xfa, 0x74, 0xf6, 0x0c, 0xc8, 0x23, 0x1e, 0x90, + 0xfe, 0x20, 0x63, 0x41, 0x39, 0xa6, 0xce, 0xa1, 0x66, 0x45, 0x1a, 0xaf, 0x92, 0xe3, 0xd7, 0x5c, + 0x45, 0xbc, 0x86, 0x48, 0xe5, 0x06, 0x37, 0xae, 0x27, 0x80, 0x82, 0xed, 0x74, 0xe0, 0xd0, 0x41, + 0x88, 0xe4, 0x52, 0x9f, 0x02, 0x0a, 0xb0, 0x83, 0x7a, 0x05, 0x19, 0x67, 0x3f, 0x93, 0x2c, 0x4b, + 0x83, 0x64, 0x4e, 0xe7, 0x9a, 0x34, 0x88, 0xdb, 0xec, 0x1b, 0xe0, 0x8f, 0x4e, 0x81, 0xe3, 0xa4, + 0x0f, 0x68, 0xee, 0x5d, 0x44, 0xa4, 0x2e, 0x42, 0xed, 0xf5, 0x83, 0x07, 0xae, 0xe3, 0xbc, 0xb2, + 0x9f, 0x04, 0x05, 0x6f, 0xef, 0x62, 0x68, 0x84, 0x92, 0x07, 0xb6, 0xe9, 0x4a, 0x63, 0x19, 0xce, + 0xe4, 0x51, 0x87, 0x33, 0x6e, 0x68, 0x92, 0x83, 0xc6, 0x1f, 0x0d, 0x64, 0xe4, 0x78, 0x47, 0x30, + 0x90, 0x0d, 0x1a, 0x86, 0x4e, 0x83, 0x29, 0x73, 0xcb, 0x87, 0x6e, 0x64, 0x26, 0xd2, 0x47, 0x34, + 0x54, 0x5e, 0x84, 0x5b, 0x8e, 0x8b, 0xc4, 0x42, 0x82, 0xc4, 0x86, 0xcf, 0x4c, 0xcb, 0x05, 0xdc, + 0x0e, 0xda, 0xad, 0xe0, 0x84, 0xed, 0x54, 0x60, 0x8f, 0xca, 0x99, 0xa0, 0x38, 0x4f, 0xee, 0x6a, + 0x3f, 0xf0, 0xe2, 0x40, 0x57, 0xb2, 0x70, 0xb0, 0x2b, 0xd1, 0x3e, 0x97, 0x76, 0xce, 0xdc, 0x07, + 0xf4, 0xd8, 0x2c, 0x34, 0xf5, 0xe9, 0x60, 0xae, 0x43, 0x3d, 0xc4, 0xda, 0x56, 0xd8, 0x4a, 0x62, + 0xbf, 0xe3, 0x32, 0x47, 0x8a, 0x94, 0x67, 0x15, 0x69, 0x05, 0x4c, 0xe3, 0x83, 0xd8, 0x48, 0x93, + 0x0a, 0x7d, 0x1e, 0xf9, 0x78, 0x5a, 0x17, 0x56, 0x8a, 0x11, 0xdb, 0x62, 0x99, 0x7e, 0x62, 0x84, + 0x1f, 0xa7, 0x9b, 0x7d, 0x27, 0x4b, 0x28, 0xfb, 0xe6, 0xf8, 0x4b, 0x45, 0x70, 0x4d, 0xd9, 0x75, + 0x3c, 0x0f, 0x1f, 0xc3, 0xe9, 0x6f, 0x98, 0x6f, 0x94, 0xb8, 0x2b, 0x80, 0x1e, 0xd1, 0xcd, 0x6f, + 0x50, 0x83, 0x9a, 0x5c, 0xd3, 0xf8, 0x0b, 0xe1, 0x10, 0x36, 0xe1, 0xfe, 0x43, 0x8c, 0xd0, 0xff, + 0x73, 0x34, 0x92, 0xf7, 0xe4, 0x44, 0xa2, 0xea, 0xa4, 0x94, 0x55, 0xf6, 0xcd, 0xe5, 0x4b, 0x12, + 0x78, 0x74, 0x3f, 0x37, 0x1b, 0xb6, 0x17, 0x36, 0x98, 0xeb, 0x86, 0xb4, 0x17, 0x3e, 0x0a, 0x4b, + 0xe2, 0x8d, 0xbf, 0x31, 0x75, 0x67, 0x4a, 0x8b, 0x59, 0x2c, 0x89, 0x0e, 0xf4, 0x24, 0xdd, 0xf8, + 0x9b, 0x9a, 0x7c, 0xf6, 0xc2, 0xfd, 0xdd, 0x3c, 0x38, 0xbe, 0xe2, 0x3a, 0x7b, 0x3d, 0x2f, 0xea, + 0x81, 0xfe, 0x64, 0xf0, 0x86, 0x6c, 0x51, 0xc4, 0x34, 0xb8, 0x1e, 0xcc, 0xba, 0xd4, 0x9a, 0x8b, + 0xb6, 0x67, 0xd9, 0x24, 0xb6, 0xf7, 0x92, 0x0f, 0xd3, 0x7b, 0x45, 0xfd, 0x4c, 0x9e, 0xeb, 0x67, + 0xfa, 0x7b, 0x8e, 0xc2, 0x80, 0x9e, 0xe3, 0x8f, 0xa5, 0x94, 0x83, 0x6a, 0x9f, 0x88, 0x62, 0xfa, + 0x8b, 0x32, 0x28, 0x6e, 0xe3, 0x8c, 0xb4, 0xbb, 0x78, 0xbc, 0x58, 0xcd, 0x30, 0x71, 0x83, 0x7e, + 0x1a, 0xc9, 0x55, 0x66, 0x75, 0x38, 0xd5, 0x00, 0x97, 0xcc, 0x6d, 0xf6, 0x4a, 0xf5, 0x70, 0x1e, + 0xcc, 0x85, 0xa5, 0x57, 0x3b, 0x1e, 0x17, 0xeb, 0x95, 0xd1, 0xa8, 0x79, 0x11, 0x8d, 0x3a, 0xb0, + 0xce, 0x1c, 0x8e, 0x3a, 0x32, 0x33, 0xea, 0x0c, 0x1c, 0x5d, 0xe6, 0x62, 0x46, 0x17, 0xed, 0xb9, + 0xb2, 0xe8, 0x25, 0x7a, 0x7c, 0xd7, 0x8a, 0x6b, 0xf3, 0x48, 0x1e, 0x2c, 0x04, 0xaf, 0xf2, 0x1b, + 0x5e, 0xab, 0xec, 0x95, 0xe4, 0xc3, 0x12, 0x38, 0x71, 0xb0, 0x33, 0xff, 0x2e, 0xde, 0x4b, 0x0d, + 0xd5, 0xc9, 0x0b, 0xbd, 0xd4, 0xf0, 0x13, 0xbf, 0x49, 0x97, 0x18, 0x12, 0x85, 0xb3, 0xf7, 0x86, + 0x77, 0xe2, 0x62, 0x41, 0x4f, 0x04, 0x89, 0x66, 0x2f, 0xc0, 0x9f, 0x92, 0xc1, 0x4c, 0x13, 0xfa, + 0x35, 0x73, 0xdf, 0xd9, 0xf3, 0x35, 0x53, 0x74, 0x7b, 0xee, 0x69, 0xa0, 0xd8, 0xc5, 0x9f, 0xe0, + 0x0e, 0x86, 0x0d, 0x41, 0xca, 0xee, 0x6f, 0x61, 0xdf, 0x20, 0x42, 0xda, 0xa0, 0xf9, 0xf9, 0x58, + 0x34, 0x22, 0xbb, 0xa3, 0x21, 0x77, 0x63, 0xd9, 0xda, 0x49, 0xb5, 0x77, 0x1a, 0x57, 0x74, 0xf6, + 0xb0, 0xfc, 0xb0, 0x0c, 0xe6, 0x9b, 0xd0, 0xaf, 0x7a, 0xcb, 0xe6, 0x65, 0xc7, 0xb5, 0x7c, 0xa8, + 0xad, 0x88, 0x42, 0x73, 0x06, 0x00, 0x2b, 0xfc, 0x8c, 0x46, 0xc8, 0x62, 0x52, 0xb4, 0xb7, 0xa4, + 0x75, 0x14, 0xe2, 0xf8, 0x18, 0x0b, 0x08, 0xa9, 0x7c, 0x2c, 0x92, 0x8a, 0x9f, 0xc0, 0x35, 0xe0, + 0x12, 0x05, 0xa2, 0xe4, 0xb6, 0x77, 0xac, 0xcb, 0xb0, 0x93, 0x12, 0x88, 0xe0, 0xb3, 0x08, 0x88, + 0x90, 0x50, 0x6a, 0xf7, 0x15, 0x8e, 0x8f, 0x71, 0xb8, 0xaf, 0x24, 0x11, 0x9c, 0x48, 0x90, 0x2b, + 0xd4, 0xf5, 0xd0, 0xf5, 0xcc, 0x7b, 0x44, 0xc5, 0x1a, 0x99, 0x6c, 0x12, 0x6b, 0xb2, 0x8d, 0xd4, + 0xb1, 0x90, 0xb2, 0x87, 0xe9, 0x74, 0x3e, 0x8b, 0x8e, 0x65, 0x60, 0xd1, 0xd9, 0x0b, 0xfd, 0x7d, + 0x32, 0xb8, 0x3a, 0x8c, 0xfe, 0xd2, 0x84, 0x7e, 0xc5, 0xf4, 0x76, 0x2e, 0x3a, 0xa6, 0xdb, 0xd1, + 0xca, 0x63, 0x38, 0x70, 0xa8, 0xfd, 0x21, 0x0b, 0x42, 0x9d, 0x07, 0x61, 0xa0, 0x2b, 0xe9, 0x40, + 0x5e, 0xc6, 0xd1, 0xc9, 0x24, 0x7a, 0xbb, 0xbe, 0x23, 0x04, 0xeb, 0x59, 0x1c, 0x58, 0x77, 0x8f, + 0xca, 0x62, 0xf6, 0xc0, 0xfd, 0x2c, 0x19, 0x11, 0x18, 0xaf, 0xe7, 0x0b, 0xa2, 0x80, 0xc5, 0x78, + 0xbd, 0xca, 0xb1, 0x5e, 0xaf, 0x23, 0x8d, 0x11, 0x43, 0x3d, 0x96, 0xb3, 0x1d, 0x23, 0x8e, 0xd0, + 0x1b, 0xf9, 0x5d, 0x32, 0x50, 0x70, 0xf8, 0x2f, 0xc6, 0x23, 0x9c, 0x8d, 0xa6, 0x9d, 0x8c, 0xce, + 0x01, 0xef, 0xf3, 0xa9, 0xb4, 0xde, 0xe7, 0xda, 0x3b, 0xd3, 0xfa, 0x98, 0xf7, 0x73, 0x3b, 0x16, + 0xc4, 0x52, 0xb9, 0x90, 0x0f, 0xe1, 0x20, 0x7b, 0xd0, 0x7e, 0x4c, 0x06, 0x00, 0x35, 0x68, 0x7a, + 0x36, 0xe2, 0x7e, 0x51, 0xb8, 0x6e, 0x63, 0xfd, 0xee, 0x11, 0x50, 0x57, 0xf7, 0x01, 0x45, 0x28, + 0x46, 0xa7, 0x2e, 0x5e, 0x9f, 0xd6, 0xb7, 0x32, 0xe2, 0x6a, 0x2c, 0xb0, 0xa4, 0xf2, 0xb6, 0x8c, + 0x2d, 0x3b, 0x7b, 0x40, 0xfe, 0x87, 0x04, 0x0a, 0x2d, 0xa7, 0x09, 0xfd, 0xc3, 0x9b, 0x02, 0xa9, + 0xa3, 0x06, 0xe0, 0x72, 0xc7, 0x11, 0x35, 0x60, 0x10, 0xa1, 0xec, 0x45, 0xf7, 0x5e, 0x09, 0xcc, + 0xb5, 0x9c, 0x72, 0xb8, 0x38, 0x25, 0xee, 0xab, 0xfa, 0x2f, 0xb9, 0x94, 0x6b, 0x18, 0x6c, 0x31, + 0x31, 0x02, 0x4b, 0xb5, 0x7a, 0x90, 0x40, 0x2f, 0x7b, 0xb9, 0xdd, 0x01, 0x8e, 0x6f, 0xd8, 0x1d, + 0xc7, 0x80, 0x1d, 0x87, 0xae, 0x74, 0xab, 0x2a, 0xc8, 0xef, 0xd9, 0x1d, 0x07, 0xb3, 0x5c, 0x30, + 0xf0, 0x7f, 0x94, 0xe6, 0xc2, 0x8e, 0x43, 0x7d, 0x03, 0xf0, 0x7f, 0xed, 0x2f, 0x64, 0x90, 0x47, + 0xdf, 0x8a, 0x8b, 0xfa, 0x5d, 0x72, 0xca, 0x38, 0x08, 0x88, 0xfc, 0x58, 0x2c, 0xa1, 0x7b, 0x98, + 0xb5, 0x7f, 0xe2, 0xc1, 0x7a, 0x43, 0x5c, 0x79, 0x8c, 0x28, 0xa2, 0x35, 0x7f, 0xf5, 0x34, 0x98, + 0xba, 0xd8, 0x75, 0xda, 0x97, 0xa2, 0xe3, 0xfa, 0xf4, 0x51, 0xbd, 0x05, 0x14, 0x5c, 0xd3, 0xde, + 0x86, 0x74, 0x4f, 0xe1, 0x64, 0x5f, 0x5f, 0x88, 0xbd, 0x5e, 0x0c, 0x92, 0x45, 0x7b, 0x67, 0x9a, + 0x08, 0x0c, 0x03, 0x2a, 0x9f, 0x4e, 0x1f, 0x2a, 0x23, 0x9c, 0x3c, 0x53, 0xc0, 0x5c, 0xb9, 0x54, + 0x27, 0xb7, 0x1a, 0x36, 0xce, 0xe9, 0x8a, 0x8c, 0x61, 0x46, 0x32, 0xc9, 0x10, 0x66, 0x44, 0xfe, + 0x3f, 0x2d, 0xcc, 0x03, 0x2a, 0x7f, 0x14, 0x30, 0x7f, 0x5a, 0x02, 0xf3, 0x35, 0xcb, 0xf3, 0xe3, + 0xbc, 0xfd, 0x13, 0xa2, 0xff, 0xbe, 0x24, 0xad, 0xa9, 0xcc, 0x95, 0x23, 0x1c, 0xf6, 0x37, 0x95, + 0x39, 0x9c, 0x54, 0xc4, 0x64, 0x8e, 0xa5, 0x60, 0x0e, 0xc8, 0x95, 0xf6, 0xc2, 0x92, 0x4c, 0x6d, + 0x28, 0x45, 0x85, 0x4c, 0xde, 0x50, 0x8a, 0x2d, 0x3b, 0x7b, 0xf9, 0xfe, 0x85, 0x04, 0x4e, 0xa0, + 0xe2, 0x93, 0x96, 0xa5, 0xe2, 0xc5, 0x3c, 0x74, 0x59, 0x2a, 0xf5, 0xca, 0xf8, 0x01, 0x5e, 0xc6, + 0xb1, 0x32, 0x3e, 0x8c, 0xe8, 0x84, 0xc5, 0x1c, 0xb3, 0x0c, 0x3b, 0x4c, 0xcc, 0x09, 0xcb, 0xb0, + 0xa3, 0x8b, 0x39, 0x79, 0x29, 0x76, 0x44, 0x31, 0x1f, 0xd9, 0x02, 0xeb, 0x2f, 0xc8, 0xa1, 0x98, + 0x63, 0xd7, 0x36, 0x12, 0xc4, 0x9c, 0xfa, 0x44, 0xaf, 0xf6, 0xee, 0x11, 0x05, 0x3f, 0xe6, 0xf5, + 0x8d, 0x51, 0x60, 0x3a, 0xc2, 0x35, 0x8e, 0x9f, 0x93, 0xc1, 0x02, 0xe5, 0x62, 0xf0, 0x94, 0x39, + 0x01, 0xa3, 0xd4, 0x53, 0xe6, 0xd4, 0x67, 0x80, 0x78, 0xce, 0x26, 0x7f, 0x06, 0x28, 0xb1, 0xfc, + 0xec, 0xc1, 0xf9, 0xcb, 0x3c, 0x38, 0x85, 0x58, 0x58, 0x73, 0x3a, 0xd6, 0xd6, 0x3e, 0xe1, 0xe2, + 0x9c, 0xd9, 0xdd, 0x83, 0x9e, 0xf6, 0x01, 0x49, 0x14, 0xa5, 0xff, 0x0d, 0x00, 0xa7, 0x07, 0x5d, + 0x12, 0xc7, 0x8d, 0x02, 0x75, 0x57, 0x5c, 0x65, 0x0f, 0x96, 0x14, 0x5e, 0x86, 0xd3, 0x08, 0x88, + 0x18, 0x0c, 0x3d, 0x64, 0x15, 0xce, 0x84, 0x6f, 0xfa, 0x1d, 0x3c, 0x72, 0x07, 0x1d, 0x3c, 0x6e, + 0x06, 0xb2, 0xd9, 0xe9, 0x84, 0x50, 0xf5, 0x6f, 0x66, 0xe3, 0x32, 0x0d, 0x94, 0x05, 0xe5, 0xf4, + 0x60, 0x74, 0x34, 0x2f, 0x26, 0xa7, 0x07, 0x7d, 0x75, 0x11, 0x14, 0xc9, 0xe5, 0xe0, 0xe1, 0x8a, + 0xfe, 0xe0, 0xcc, 0x34, 0x17, 0x6f, 0xda, 0x35, 0x78, 0x35, 0xbc, 0x23, 0x95, 0x64, 0x06, 0xf5, + 0xd3, 0x91, 0x9d, 0x6c, 0x70, 0x0a, 0xf6, 0x8c, 0x91, 0x29, 0x4f, 0x66, 0x37, 0xac, 0xd4, 0xeb, + 0x75, 0xf7, 0x5b, 0x34, 0xf0, 0x40, 0xaa, 0xdd, 0x30, 0x26, 0x7e, 0x81, 0x74, 0x20, 0x7e, 0x41, + 0xea, 0xdd, 0x30, 0x8e, 0x8f, 0x71, 0xec, 0x86, 0x25, 0x11, 0x9c, 0xc8, 0xad, 0x3c, 0xd8, 0x6a, + 0xa6, 0x77, 0x13, 0xfc, 0xc3, 0x60, 0xcf, 0x6a, 0xc0, 0x3b, 0xbb, 0x0c, 0xba, 0xb6, 0x20, 0xf1, + 0x4e, 0x16, 0xf5, 0x29, 0xa0, 0xb8, 0xe5, 0xb8, 0xbb, 0x66, 0xb0, 0x71, 0xdf, 0x7f, 0x52, 0x84, + 0xde, 0x07, 0xb0, 0x8c, 0xf3, 0x18, 0x34, 0x2f, 0x9a, 0x8f, 0x3c, 0xc7, 0xea, 0xd1, 0xa0, 0x8f, + 0xe8, 0xaf, 0x7a, 0x23, 0x98, 0xa7, 0xb1, 0x1f, 0xeb, 0xd0, 0xf3, 0x61, 0x87, 0x46, 0xb4, 0xe0, + 0x13, 0xd5, 0xb3, 0x60, 0x8e, 0x26, 0x2c, 0x5b, 0x5d, 0xe8, 0xd1, 0xa0, 0x16, 0x5c, 0x9a, 0x7a, + 0x0a, 0x14, 0x2d, 0xef, 0x5e, 0xcf, 0xb1, 0x69, 0x40, 0x3e, 0xfa, 0xa4, 0xde, 0x0c, 0x8e, 0xd3, + 0x7c, 0xa1, 0xb1, 0x4a, 0x0e, 0xec, 0xf4, 0x27, 0x23, 0xd5, 0xb2, 0x9d, 0x75, 0xd7, 0xd9, 0x76, + 0xa1, 0xe7, 0xe1, 0x53, 0x53, 0xd3, 0x06, 0x93, 0xa2, 0x5e, 0x00, 0x27, 0xba, 0x96, 0x7d, 0xc9, + 0xc3, 0x31, 0x82, 0x97, 0xa9, 0xdb, 0xd8, 0xdc, 0x80, 0xd8, 0xdd, 0x4c, 0x63, 0xa3, 0x72, 0x60, + 0x3f, 0x31, 0x0e, 0x52, 0x61, 0xa2, 0xe4, 0x2f, 0x99, 0xed, 0x4b, 0xf8, 0x3d, 0x75, 0x47, 0x3d, + 0x90, 0xce, 0x08, 0x83, 0xdc, 0x01, 0xb0, 0xc0, 0x09, 0x03, 0xa7, 0x69, 0x2f, 0xcb, 0x81, 0x39, + 0xae, 0x00, 0x13, 0xa8, 0x41, 0xb7, 0xe8, 0x9d, 0xdf, 0xb1, 0x7c, 0x88, 0x98, 0xa3, 0x67, 0x5d, + 0x9e, 0x34, 0x84, 0x79, 0xe3, 0xc0, 0x87, 0xc6, 0x00, 0x62, 0x88, 0x2f, 0xd2, 0xe1, 0x61, 0xcf, + 0x32, 0x8f, 0xda, 0xaa, 0x5c, 0x9a, 0xf6, 0x1c, 0xa0, 0x1e, 0xa4, 0xc6, 0x78, 0x81, 0xe4, 0xd2, + 0x79, 0x81, 0x20, 0xb9, 0x99, 0xdd, 0xae, 0x73, 0x05, 0x76, 0x42, 0xb2, 0x54, 0x57, 0x0f, 0xa4, + 0x6b, 0x9f, 0x1f, 0x65, 0x5e, 0x98, 0xfa, 0x9a, 0x0d, 0xd4, 0xc8, 0xf6, 0xda, 0x6d, 0x08, 0x3b, + 0xf4, 0xe0, 0x5a, 0xf0, 0x98, 0xf2, 0x02, 0x8e, 0xd4, 0xb3, 0xc8, 0x23, 0xba, 0x81, 0xe3, 0xa3, + 0x57, 0x83, 0x22, 0xb9, 0xcd, 0x4e, 0x7b, 0xd9, 0xc2, 0xc0, 0xbe, 0x66, 0x81, 0xef, 0x6b, 0x36, + 0xc0, 0x9c, 0xed, 0xa0, 0xe2, 0xd6, 0x4d, 0xd7, 0xdc, 0xf5, 0x92, 0x16, 0x89, 0x09, 0xdd, 0xd0, + 0x22, 0xa8, 0x33, 0x9f, 0xad, 0x1e, 0x33, 0x38, 0x32, 0xea, 0xff, 0x0e, 0x8e, 0x5f, 0xa4, 0x01, + 0x1e, 0x3c, 0x4a, 0x59, 0x8a, 0x77, 0xa1, 0xec, 0xa3, 0xbc, 0xc4, 0x7f, 0xb9, 0x7a, 0xcc, 0xe8, + 0x27, 0xa6, 0xfe, 0x17, 0xb0, 0x80, 0x1e, 0x3b, 0xce, 0x95, 0x80, 0x71, 0x39, 0xde, 0x8e, 0xec, + 0x23, 0xbf, 0xc6, 0x7d, 0xb8, 0x7a, 0xcc, 0xe8, 0x23, 0xa5, 0x36, 0x00, 0xd8, 0xf1, 0x77, 0xbb, + 0x94, 0x70, 0x3e, 0x5e, 0x25, 0xfb, 0x08, 0xaf, 0x86, 0x1f, 0xad, 0x1e, 0x33, 0x18, 0x12, 0x6a, + 0x0d, 0xcc, 0xf8, 0x0f, 0xfa, 0x94, 0x5e, 0x21, 0xde, 0x77, 0xa1, 0x8f, 0x5e, 0x2b, 0xf8, 0x66, + 0xf5, 0x98, 0x11, 0x11, 0x50, 0xab, 0x60, 0xba, 0x77, 0x91, 0x12, 0x2b, 0xc6, 0xf7, 0x77, 0x7d, + 0xc4, 0xd6, 0x2f, 0x86, 0xb4, 0xc2, 0xcf, 0x11, 0x63, 0x6d, 0xef, 0x32, 0xa5, 0x35, 0x25, 0xcc, + 0x58, 0x39, 0xf8, 0x06, 0x31, 0x16, 0x12, 0x50, 0xab, 0x60, 0xc6, 0xb3, 0xcd, 0x9e, 0xb7, 0xe3, + 0xf8, 0xde, 0xe9, 0xe9, 0x3e, 0x37, 0xd7, 0x78, 0x6a, 0x4d, 0xfa, 0x8d, 0x11, 0x7d, 0xad, 0x3e, + 0x05, 0x5c, 0xbd, 0xd7, 0xeb, 0x98, 0x3e, 0xd4, 0x1f, 0xb4, 0x3c, 0xdf, 0xb2, 0xb7, 0x83, 0x08, + 0xc5, 0x64, 0xb0, 0x18, 0xfc, 0x52, 0x5d, 0xa4, 0x07, 0xde, 0x00, 0x6e, 0x9b, 0x5a, 0xff, 0x5e, + 0x2b, 0x29, 0x96, 0x39, 0xe7, 0xf6, 0x74, 0x90, 0x47, 0xaf, 0xf0, 0xe0, 0xb2, 0x30, 0x78, 0x1d, + 0xb7, 0x5f, 0x77, 0x70, 0x03, 0x46, 0x1f, 0xf5, 0x8d, 0x4f, 0x73, 0x07, 0xc6, 0xa7, 0xeb, 0xc1, + 0xac, 0xe5, 0xad, 0x59, 0xdb, 0xc4, 0x38, 0xa6, 0xe3, 0x07, 0x9b, 0x44, 0x16, 0x13, 0xea, 0xf0, + 0x0a, 0x19, 0x38, 0x8e, 0x07, 0x8b, 0x09, 0x41, 0x8a, 0x76, 0x13, 0x98, 0x63, 0x1b, 0x19, 0xb9, + 0x12, 0xd7, 0x8a, 0x4c, 0x6b, 0xfa, 0xa4, 0xdd, 0x08, 0x16, 0x78, 0x9d, 0x66, 0x2c, 0x08, 0x39, + 0xe8, 0x0a, 0xb5, 0x1b, 0xc0, 0xf1, 0xbe, 0x86, 0x15, 0x84, 0x8c, 0xc9, 0x45, 0x21, 0x63, 0xae, + 0x07, 0x20, 0xd2, 0xe2, 0x81, 0x64, 0xae, 0x03, 0x33, 0xa1, 0x5e, 0x0e, 0xcc, 0xf0, 0xa7, 0x39, + 0x30, 0x1d, 0x28, 0xdb, 0xa0, 0x0c, 0x68, 0x64, 0xb2, 0x99, 0xfd, 0xa1, 0x60, 0x64, 0x62, 0xd3, + 0x90, 0x99, 0x10, 0x79, 0x65, 0xb7, 0x2c, 0xbf, 0x1b, 0x9c, 0x6c, 0xec, 0x4f, 0x56, 0xd7, 0x01, + 0xb0, 0x30, 0x46, 0xad, 0xe8, 0xa8, 0xe3, 0x13, 0x53, 0xb4, 0x07, 0xa2, 0x0f, 0x0c, 0x8d, 0xb3, + 0xdf, 0x45, 0xcf, 0x21, 0xce, 0x80, 0x02, 0x09, 0xd3, 0x7f, 0x4c, 0x5d, 0x00, 0x40, 0xbf, 0x7f, + 0x5d, 0x37, 0xaa, 0x7a, 0xbd, 0xac, 0x2b, 0x39, 0xed, 0x15, 0x12, 0x98, 0x09, 0x1b, 0xc1, 0xc0, + 0x4a, 0xea, 0x54, 0xb5, 0x86, 0xde, 0x3a, 0x7a, 0xb0, 0x51, 0xb1, 0x4a, 0xf6, 0x34, 0xf0, 0xa8, + 0x3d, 0x0f, 0x2e, 0x5b, 0xae, 0xe7, 0x1b, 0xce, 0x95, 0x65, 0xc7, 0x8d, 0x06, 0x56, 0x12, 0xe0, + 0x36, 0xee, 0x35, 0x32, 0x18, 0x3b, 0x10, 0x9f, 0x79, 0x83, 0x2e, 0x5d, 0xf8, 0x8f, 0x12, 0x10, + 0x5d, 0xdf, 0x35, 0x6d, 0xaf, 0xe7, 0x78, 0xd0, 0x70, 0xae, 0x78, 0x25, 0xbb, 0x53, 0x76, 0xba, + 0x7b, 0xbb, 0xb6, 0x47, 0x4d, 0xbe, 0xb8, 0xd7, 0x48, 0x3a, 0xf8, 0x4e, 0xe1, 0x05, 0x00, 0xca, + 0x8d, 0x5a, 0x4d, 0x2f, 0xb7, 0xaa, 0x8d, 0xba, 0x72, 0x0c, 0x49, 0xab, 0x55, 0x5a, 0xaa, 0x21, + 0xe9, 0x7c, 0x3f, 0x98, 0x0e, 0xda, 0x34, 0x8d, 0x72, 0x93, 0x0b, 0xa2, 0xdc, 0xa8, 0x25, 0x30, + 0x1d, 0xb4, 0x72, 0x3a, 0x22, 0x3c, 0xb6, 0xff, 0x54, 0xf3, 0xae, 0xe9, 0xfa, 0xd8, 0x40, 0x09, + 0x88, 0x2c, 0x99, 0x1e, 0x34, 0xc2, 0xcf, 0xce, 0x3e, 0x81, 0x72, 0xa0, 0x82, 0x85, 0x52, 0xad, + 0xb6, 0xd9, 0x30, 0x36, 0xeb, 0x8d, 0xd6, 0x6a, 0xb5, 0xbe, 0x42, 0x46, 0xc8, 0xea, 0x4a, 0xbd, + 0x61, 0xe8, 0x64, 0x80, 0x6c, 0x2a, 0x39, 0x72, 0xa7, 0xf5, 0xd2, 0x34, 0x28, 0xf6, 0xb0, 0x74, + 0xb5, 0x2f, 0xc9, 0x29, 0xc3, 0x19, 0x84, 0x38, 0xc5, 0xdc, 0xba, 0xcb, 0x1d, 0x29, 0x90, 0x06, + 0x1c, 0xf9, 0x3d, 0x0b, 0xe6, 0x88, 0xa9, 0xee, 0xe1, 0xdd, 0x19, 0x8c, 0x9c, 0x6c, 0x70, 0x69, + 0xda, 0xc7, 0xa5, 0x14, 0x31, 0x0e, 0x06, 0x72, 0x94, 0xce, 0xb8, 0xf8, 0xbd, 0xdc, 0x68, 0x97, + 0x5a, 0x54, 0xeb, 0x2d, 0xdd, 0xa8, 0x97, 0x6a, 0x34, 0x8b, 0xac, 0x9e, 0x06, 0x27, 0xeb, 0x0d, + 0x1a, 0xd2, 0xb1, 0xb9, 0xd9, 0x6a, 0x6c, 0x56, 0xd7, 0xd6, 0x1b, 0x46, 0x4b, 0x29, 0xa8, 0xa7, + 0x80, 0x4a, 0xfe, 0x6f, 0x56, 0x9b, 0x9b, 0xe5, 0x52, 0xbd, 0xac, 0xd7, 0xf4, 0x8a, 0x52, 0x54, + 0x1f, 0x07, 0x6e, 0x20, 0x97, 0x24, 0x35, 0x96, 0x37, 0x8d, 0xc6, 0xf9, 0x26, 0x42, 0xd0, 0xd0, + 0x6b, 0x25, 0xa4, 0x48, 0xcc, 0xdd, 0xd6, 0x53, 0xea, 0x55, 0xe0, 0x38, 0xbe, 0xf8, 0xbe, 0xd6, + 0x28, 0x55, 0x68, 0x79, 0xd3, 0xea, 0xb5, 0xe0, 0x74, 0xb5, 0xde, 0xdc, 0x58, 0x5e, 0xae, 0x96, + 0xab, 0x7a, 0xbd, 0xb5, 0xb9, 0xae, 0x1b, 0x6b, 0xd5, 0x66, 0x13, 0x7d, 0xab, 0xcc, 0xe0, 0x9b, + 0x83, 0x49, 0x9f, 0xa9, 0xbd, 0x5f, 0x06, 0xf3, 0xe7, 0xcc, 0xae, 0x85, 0x06, 0x0a, 0x7c, 0xa5, + 0x78, 0xdf, 0x69, 0x20, 0x1f, 0x5f, 0x3d, 0x4e, 0xcf, 0x13, 0xe0, 0x07, 0xed, 0x87, 0xe4, 0x94, + 0xa7, 0x81, 0x28, 0x10, 0xa4, 0xc4, 0x45, 0xae, 0xb4, 0x98, 0xb9, 0xeb, 0x6b, 0xa5, 0x14, 0xa7, + 0x81, 0xc4, 0xc9, 0xa7, 0x03, 0xff, 0xe7, 0xc7, 0x05, 0xbe, 0x02, 0xe6, 0x36, 0xea, 0xa5, 0x8d, + 0xd6, 0x6a, 0xc3, 0xa8, 0x7e, 0x1f, 0x8e, 0x65, 0x3f, 0x0f, 0x66, 0x96, 0x1b, 0xc6, 0x52, 0xb5, + 0x52, 0xd1, 0xeb, 0x4a, 0x41, 0x7d, 0x14, 0xb8, 0xaa, 0xa9, 0x1b, 0xe7, 0xaa, 0x65, 0x7d, 0x73, + 0xa3, 0x5e, 0x3a, 0x57, 0xaa, 0xd6, 0x70, 0x1f, 0x51, 0x4c, 0xb8, 0x0e, 0x7d, 0x4a, 0xfb, 0x81, + 0x3c, 0x00, 0xa4, 0xea, 0xf8, 0x2a, 0x27, 0xe6, 0xd2, 0xec, 0x3f, 0x48, 0x3b, 0x69, 0x88, 0xc8, + 0xc4, 0xb4, 0xdf, 0x2a, 0x98, 0x76, 0xe9, 0x0b, 0xba, 0x3a, 0x36, 0x8c, 0x0e, 0xf9, 0x1b, 0x50, + 0x33, 0xc2, 0xcf, 0xb5, 0x0f, 0xa4, 0x99, 0x23, 0xc4, 0x32, 0x96, 0x0e, 0xc9, 0xe5, 0xf1, 0x00, + 0xa9, 0xbd, 0x38, 0x07, 0x16, 0xf8, 0x8a, 0xa1, 0x4a, 0x60, 0x63, 0x4a, 0xac, 0x12, 0xfc, 0xc7, + 0x8c, 0x91, 0x75, 0xf6, 0xc9, 0x74, 0x38, 0x05, 0x41, 0xcb, 0x24, 0x07, 0xfb, 0x03, 0x8b, 0x45, + 0xc9, 0x21, 0xe6, 0x91, 0xd1, 0xa1, 0x48, 0xea, 0x14, 0x90, 0x5b, 0x0f, 0xfa, 0x8a, 0xac, 0x7d, + 0x5d, 0x06, 0xf3, 0xdc, 0xad, 0xdc, 0xda, 0x3b, 0x73, 0x22, 0x37, 0xe6, 0x32, 0xf7, 0x7d, 0xe7, + 0x0e, 0x7b, 0xdf, 0xf7, 0xd9, 0x7b, 0xc0, 0x14, 0x4d, 0xc3, 0xf2, 0x6d, 0xd4, 0x91, 0x29, 0x70, + 0x1c, 0xcc, 0xae, 0xe8, 0xad, 0xcd, 0x66, 0xab, 0x64, 0xb4, 0xf4, 0x8a, 0x92, 0x43, 0x03, 0x9f, + 0xbe, 0xb6, 0xde, 0xba, 0xa0, 0x48, 0x68, 0x4c, 0x5c, 0xd9, 0xa8, 0x56, 0xf4, 0xcd, 0x46, 0xbd, + 0x76, 0x41, 0x91, 0xd3, 0x3b, 0x5c, 0xf6, 0x33, 0x36, 0x61, 0x87, 0xcb, 0xa4, 0xe2, 0xb3, 0x9f, + 0xbb, 0x7e, 0x4e, 0x06, 0x0a, 0xe1, 0x40, 0x7f, 0xb0, 0x07, 0x5d, 0x0b, 0xda, 0x6d, 0xa8, 0x5d, + 0x12, 0x09, 0x00, 0x7b, 0x20, 0xf4, 0x21, 0xee, 0xdf, 0x19, 0xab, 0x91, 0x3c, 0xf4, 0x19, 0xdc, + 0xf9, 0x03, 0x06, 0xf7, 0x67, 0xd3, 0x7a, 0x5c, 0xf6, 0xb3, 0x3b, 0x16, 0xc8, 0x3e, 0x95, 0xc6, + 0xe3, 0x72, 0x08, 0x07, 0x13, 0x89, 0xeb, 0x1c, 0x33, 0x1e, 0x2b, 0xb2, 0xf6, 0x22, 0x19, 0x1c, + 0xaf, 0x98, 0x3e, 0x5c, 0xda, 0x6f, 0x05, 0xb7, 0x68, 0xc6, 0xdc, 0x7c, 0x9d, 0x3b, 0x70, 0xf3, + 0x75, 0x74, 0x11, 0xa7, 0xd4, 0x77, 0x11, 0xa7, 0xf6, 0x9e, 0xb4, 0x67, 0x34, 0xfb, 0x78, 0x18, + 0x5b, 0xf0, 0xe5, 0x74, 0x67, 0x2f, 0x93, 0xb9, 0xc8, 0xbe, 0x81, 0xbd, 0x7d, 0x06, 0x28, 0x84, + 0x15, 0xc6, 0xa9, 0xf0, 0xa7, 0xe8, 0x65, 0xf1, 0x9b, 0x29, 0x62, 0x38, 0x06, 0x51, 0x31, 0x24, + 0x3e, 0x2a, 0x06, 0xb7, 0x46, 0x2d, 0xf7, 0x3b, 0x82, 0xa4, 0xed, 0x0c, 0x19, 0x0f, 0xc2, 0xf8, + 0xb0, 0xb9, 0xd9, 0x75, 0x86, 0x89, 0xc5, 0x4f, 0xe6, 0x42, 0x63, 0x7a, 0x6b, 0xa8, 0x2e, 0x8a, + 0x4c, 0xf2, 0xbd, 0xed, 0x69, 0xdd, 0xc9, 0x39, 0x0f, 0xce, 0x84, 0xcb, 0xcc, 0xb3, 0x73, 0x27, + 0x1f, 0xc6, 0x41, 0xf6, 0x28, 0x7c, 0x5b, 0x02, 0xf9, 0xa6, 0xe3, 0xfa, 0xe3, 0xc2, 0x20, 0xed, + 0x16, 0x38, 0x23, 0x81, 0x66, 0xfc, 0x1c, 0x34, 0xbb, 0x2d, 0xf0, 0xe4, 0xf2, 0x27, 0x10, 0x06, + 0xf3, 0x38, 0x58, 0x20, 0x9c, 0x84, 0x77, 0xc8, 0xfc, 0xab, 0x44, 0xfa, 0xab, 0xfb, 0x44, 0x11, + 0xc1, 0x1b, 0x21, 0xe1, 0x16, 0x74, 0x00, 0x0a, 0x97, 0xa6, 0xbd, 0x91, 0xc5, 0xa5, 0xc2, 0xe3, + 0x32, 0x68, 0x06, 0x1e, 0x5e, 0xc3, 0x32, 0xae, 0x9e, 0x29, 0x4d, 0x44, 0xcd, 0x84, 0xc2, 0xb3, + 0x47, 0xe4, 0x21, 0x19, 0x14, 0xa9, 0x0b, 0xe0, 0x58, 0x11, 0x48, 0xdb, 0x32, 0x42, 0x21, 0x88, + 0xb9, 0x0a, 0xca, 0xe3, 0x6e, 0x19, 0xc9, 0xe5, 0x67, 0x8f, 0xc3, 0xbf, 0x53, 0xdf, 0xd6, 0xd2, + 0x65, 0xd3, 0xea, 0x9a, 0x17, 0xbb, 0x29, 0x22, 0x59, 0x7f, 0x3c, 0xe5, 0x69, 0xbe, 0xb0, 0xaa, + 0x5c, 0x79, 0x31, 0x12, 0xff, 0x1e, 0x30, 0xe3, 0x72, 0x7b, 0x7f, 0xc8, 0x8a, 0xea, 0xf3, 0x2b, + 0xa6, 0xef, 0x8d, 0x28, 0x67, 0xaa, 0xa3, 0x7b, 0x42, 0xfc, 0x4c, 0xe4, 0xa8, 0xd1, 0x6c, 0xa9, + 0xd3, 0x59, 0x86, 0xa6, 0xbf, 0xe7, 0xc2, 0x4e, 0xaa, 0x21, 0xc2, 0xed, 0xdb, 0x1e, 0x65, 0x24, + 0xc1, 0xc5, 0x92, 0xac, 0xf1, 0xe8, 0x3c, 0x75, 0x48, 0x6f, 0x10, 0xf0, 0x32, 0x96, 0x2e, 0xe9, + 0x6d, 0x21, 0x24, 0x0d, 0x0e, 0x92, 0xa7, 0x8f, 0xc6, 0x44, 0xf6, 0x80, 0xfc, 0x8c, 0x0c, 0x16, + 0x88, 0x9d, 0x30, 0x6e, 0x4c, 0x3e, 0x94, 0xd2, 0x65, 0x88, 0xb9, 0xa5, 0x8b, 0x65, 0x67, 0x2c, + 0xb0, 0xa4, 0x71, 0x30, 0x12, 0xe3, 0x23, 0x7b, 0x64, 0x9e, 0x7f, 0x02, 0x00, 0xc6, 0x0d, 0xf4, + 0xe3, 0xc5, 0x28, 0xae, 0xa3, 0xf6, 0x4e, 0x3a, 0xff, 0x68, 0x72, 0x41, 0xc6, 0x19, 0x17, 0xcf, + 0x70, 0x83, 0x8a, 0x4f, 0x14, 0x1a, 0x55, 0x7e, 0x2f, 0xa5, 0xcd, 0x4b, 0x9d, 0x30, 0x87, 0x0e, + 0xee, 0x23, 0xf6, 0x72, 0x9f, 0x48, 0x61, 0xfc, 0x0e, 0x63, 0x25, 0x1d, 0x6a, 0xb5, 0x11, 0x66, + 0xf6, 0xa7, 0xc1, 0x49, 0x43, 0x2f, 0x55, 0x1a, 0xf5, 0xda, 0x05, 0xf6, 0xca, 0x26, 0x45, 0x66, + 0x27, 0x27, 0x99, 0xc0, 0xf6, 0xba, 0x94, 0x7d, 0x20, 0x2f, 0xab, 0xa4, 0xd9, 0x0a, 0xb3, 0xb8, + 0x32, 0xbc, 0x57, 0x13, 0x20, 0x7b, 0x94, 0x28, 0x7c, 0xbd, 0x08, 0x66, 0x0d, 0xd8, 0x76, 0x76, + 0x77, 0xa1, 0xdd, 0x81, 0x1d, 0xed, 0x75, 0x32, 0x98, 0x0b, 0xf7, 0xff, 0x9a, 0xd0, 0xd7, 0xfe, + 0x4b, 0x84, 0xcd, 0x59, 0x30, 0x87, 0x2a, 0xd7, 0xe0, 0x03, 0xc7, 0x73, 0x69, 0xea, 0xad, 0xe0, + 0x44, 0x80, 0x42, 0xa3, 0x6f, 0x0a, 0x73, 0xf0, 0x85, 0xf6, 0x5e, 0x16, 0xa3, 0x0d, 0x1e, 0xa3, + 0x7b, 0xe2, 0x85, 0x19, 0xb2, 0xbb, 0xc8, 0xb2, 0x1a, 0x03, 0xd6, 0xef, 0x84, 0x60, 0xdd, 0xcf, + 0x81, 0x55, 0x39, 0x24, 0xfd, 0xa3, 0x44, 0xed, 0x97, 0x65, 0x70, 0x32, 0xe8, 0x88, 0x27, 0x87, + 0xd6, 0x27, 0x58, 0xb4, 0xbe, 0x9f, 0x47, 0x6b, 0x45, 0x44, 0x9a, 0x83, 0x58, 0x8e, 0x41, 0xed, + 0x8b, 0x21, 0x6a, 0xff, 0x95, 0x43, 0xad, 0x36, 0xa6, 0x72, 0x8e, 0x12, 0xbd, 0x0f, 0xc9, 0xe0, + 0x34, 0x32, 0x3b, 0xcb, 0x8e, 0xbd, 0xd5, 0xb5, 0xda, 0xbe, 0x65, 0x6f, 0x47, 0x2e, 0x6d, 0x2b, + 0x22, 0x2b, 0x9b, 0xfd, 0xd8, 0x4a, 0x07, 0xb1, 0xe5, 0xe3, 0x6d, 0x88, 0xb6, 0xad, 0x38, 0xb6, + 0x62, 0x86, 0x30, 0xc6, 0x59, 0x3b, 0xd2, 0x1c, 0x36, 0x29, 0x7d, 0xeb, 0x13, 0xe4, 0xe0, 0x28, + 0xf1, 0x7b, 0x08, 0x30, 0xa6, 0xc7, 0x0b, 0x65, 0xa0, 0x60, 0xff, 0x49, 0xdc, 0xb3, 0xd3, 0xfb, + 0x4c, 0x1b, 0xbc, 0x67, 0x7d, 0x2f, 0x10, 0x50, 0xe0, 0x59, 0x1f, 0x24, 0xa8, 0x37, 0x81, 0x85, + 0xf6, 0x0e, 0x6c, 0x5f, 0xaa, 0xda, 0x81, 0x6f, 0x12, 0x71, 0x64, 0xe9, 0x4b, 0xe5, 0x07, 0xb3, + 0xfb, 0x78, 0x30, 0xf9, 0x85, 0x47, 0x6e, 0x62, 0xc3, 0x32, 0x15, 0xd3, 0xd0, 0x7e, 0x23, 0x04, + 0xa8, 0xce, 0x01, 0x74, 0xe7, 0x48, 0x54, 0xd3, 0xc1, 0x52, 0x1f, 0x01, 0x16, 0x0d, 0x9c, 0x6a, + 0xac, 0xb7, 0xaa, 0x8d, 0xfa, 0xe6, 0x46, 0x53, 0xaf, 0x6c, 0x2e, 0x05, 0xe0, 0x34, 0x15, 0x59, + 0xfb, 0x9a, 0x04, 0xa6, 0x08, 0x5b, 0x9e, 0xf6, 0xf8, 0x08, 0x82, 0xa1, 0x47, 0x0a, 0xb4, 0xb7, + 0x0b, 0x07, 0x08, 0x0a, 0x05, 0x41, 0xcb, 0x89, 0x69, 0x18, 0x4f, 0x03, 0x53, 0x04, 0xe4, 0x60, + 0x17, 0xe0, 0x4c, 0x8c, 0x65, 0x47, 0xc9, 0x18, 0x41, 0x76, 0xc1, 0x60, 0x41, 0x43, 0xd8, 0xc8, + 0xde, 0x1a, 0x7f, 0x6e, 0x9e, 0x2c, 0x1d, 0x9c, 0xb7, 0xfc, 0x1d, 0x7c, 0xe2, 0x40, 0x7b, 0x96, + 0x48, 0xc7, 0x75, 0x2b, 0x28, 0x5c, 0x46, 0xb9, 0x87, 0x9c, 0xde, 0x20, 0x99, 0xb4, 0x9f, 0x17, + 0x8e, 0x4d, 0xcd, 0xe9, 0x67, 0xc8, 0x53, 0x0c, 0x38, 0x6b, 0x20, 0xdf, 0xb5, 0x3c, 0x9f, 0xda, + 0xdc, 0x77, 0xa4, 0x22, 0x14, 0xfc, 0xa9, 0xfa, 0x70, 0xd7, 0xc0, 0x64, 0xb4, 0x7b, 0x91, 0xc5, + 0x14, 0xa5, 0x0a, 0x9c, 0x60, 0x39, 0x0d, 0xa6, 0xe8, 0xc9, 0x6a, 0xba, 0x2d, 0x15, 0x3c, 0x0a, + 0x6e, 0x05, 0x09, 0xd5, 0x36, 0x7b, 0x1d, 0xf8, 0x7f, 0x8f, 0x83, 0xa9, 0x55, 0xcb, 0xf3, 0x1d, + 0x77, 0x5f, 0x7b, 0x7d, 0x0e, 0x4c, 0x9d, 0x83, 0xae, 0x67, 0x39, 0xf6, 0x01, 0x77, 0xad, 0xeb, + 0xc1, 0x6c, 0xcf, 0x85, 0x97, 0x2d, 0x67, 0xcf, 0x63, 0x46, 0x09, 0x26, 0x49, 0xd5, 0xc0, 0xb4, + 0xb9, 0xe7, 0xef, 0x38, 0x6e, 0x14, 0x90, 0x29, 0x78, 0x56, 0xcf, 0x00, 0x40, 0xfe, 0xd7, 0xcd, + 0x5d, 0x18, 0xdc, 0xb9, 0x1e, 0xa5, 0xa8, 0x2a, 0xc8, 0xfb, 0xd6, 0x2e, 0xa4, 0x11, 0xda, 0xf1, + 0x7f, 0x24, 0x60, 0x1c, 0xed, 0x94, 0x46, 0x95, 0x95, 0x8d, 0xe0, 0x51, 0xfb, 0x43, 0x19, 0xcc, + 0xae, 0x40, 0x9f, 0xb2, 0xea, 0x69, 0x2f, 0xc9, 0x09, 0x5d, 0x8a, 0x84, 0xe6, 0x25, 0x5d, 0xd3, + 0x0b, 0xbe, 0x0b, 0x87, 0x5c, 0x3e, 0x31, 0x0a, 0x17, 0x2f, 0xb3, 0x77, 0x45, 0xe0, 0xd8, 0xa1, + 0x7e, 0x95, 0x38, 0xf3, 0xd3, 0xcc, 0x74, 0xe3, 0xf8, 0xe0, 0x0b, 0xde, 0x26, 0x4e, 0x8c, 0xbb, + 0x41, 0x65, 0xbf, 0xc8, 0xd4, 0x27, 0xb6, 0x3b, 0x9a, 0xbe, 0x4c, 0x73, 0x1c, 0xb8, 0x06, 0x84, + 0xa5, 0x44, 0xc9, 0x18, 0x61, 0x6e, 0xc1, 0x88, 0x1d, 0xc3, 0x39, 0x99, 0xc0, 0xc5, 0xaf, 0x32, + 0x98, 0x6d, 0xee, 0x38, 0x57, 0x02, 0x39, 0x7e, 0xbf, 0x18, 0xb0, 0xd7, 0x82, 0x99, 0xcb, 0x7d, + 0xa0, 0x46, 0x09, 0xec, 0x5d, 0x73, 0x32, 0x7f, 0xd7, 0xdc, 0x0b, 0xe4, 0xb4, 0x30, 0x31, 0xcc, + 0xc5, 0xc0, 0xc4, 0x5f, 0x0f, 0x27, 0xa5, 0xb8, 0x1e, 0x4e, 0x7d, 0x2a, 0x98, 0xa2, 0x5c, 0xd3, + 0x65, 0xea, 0x64, 0x80, 0x83, 0xcc, 0x6c, 0x05, 0xf3, 0x7c, 0x05, 0xd3, 0x21, 0x1f, 0x5f, 0xb9, + 0xec, 0x91, 0xff, 0x2d, 0x09, 0xc7, 0x6b, 0x0a, 0x80, 0x2f, 0x8f, 0x01, 0x78, 0xed, 0x5b, 0x39, + 0xd1, 0xcd, 0x9c, 0x50, 0x02, 0x21, 0x07, 0x87, 0xba, 0xf0, 0x6c, 0x28, 0xb9, 0xec, 0xe5, 0xf9, + 0x8a, 0x3c, 0x98, 0xab, 0x58, 0x5b, 0x5b, 0x61, 0x27, 0xf9, 0x52, 0xc1, 0x4e, 0x32, 0xde, 0xa5, + 0x0a, 0xd9, 0xb9, 0x7b, 0xae, 0x0b, 0xed, 0xa0, 0x52, 0xb4, 0x39, 0xf5, 0xa5, 0xaa, 0x37, 0x83, + 0xe3, 0xc1, 0xb8, 0xc0, 0x76, 0x94, 0x33, 0x46, 0x7f, 0xb2, 0xf6, 0x0d, 0x61, 0x4f, 0x80, 0x40, + 0xa2, 0x6c, 0x95, 0x62, 0x1a, 0xe0, 0x5d, 0x60, 0x7e, 0x87, 0xe4, 0xc6, 0xcb, 0xa5, 0x41, 0x67, + 0x79, 0xaa, 0x2f, 0x1e, 0xfe, 0x1a, 0xf4, 0x3c, 0x73, 0x1b, 0x1a, 0x7c, 0xe6, 0xbe, 0xe6, 0x2b, + 0xa7, 0xb9, 0xdd, 0x51, 0xcc, 0xa9, 0x40, 0xa0, 0x26, 0xd9, 0x6b, 0xc7, 0x17, 0xcf, 0x82, 0xfc, + 0xb2, 0xd5, 0x85, 0xda, 0x8f, 0x48, 0x60, 0x06, 0xcd, 0xba, 0xed, 0x36, 0x7a, 0x62, 0x1c, 0x2c, + 0xbf, 0x9e, 0x13, 0xbd, 0xd5, 0x18, 0xd1, 0x59, 0x0c, 0x69, 0xc4, 0xb4, 0x1b, 0xb1, 0xdb, 0x8b, + 0x13, 0x49, 0x4d, 0xe0, 0x0e, 0x2a, 0x34, 0xf5, 0xd8, 0xda, 0xea, 0x3a, 0x26, 0xb7, 0x61, 0xd0, + 0x6f, 0x0a, 0x45, 0x87, 0x02, 0xeb, 0x8e, 0xbf, 0x6e, 0xd9, 0x76, 0x18, 0x67, 0xe3, 0x40, 0x3a, + 0xef, 0xeb, 0x92, 0x18, 0xaa, 0x0c, 0xd7, 0x9d, 0x96, 0x1e, 0xa3, 0xd9, 0x37, 0x81, 0x85, 0x8b, + 0xfb, 0x3e, 0xf4, 0x68, 0x2e, 0x5a, 0x6c, 0xde, 0xe8, 0x4b, 0x65, 0x2e, 0x1a, 0x48, 0x0a, 0x69, + 0x96, 0x50, 0x60, 0x3a, 0x51, 0xaf, 0x8e, 0x30, 0x03, 0x3c, 0x09, 0x94, 0x7a, 0xa3, 0xa2, 0x63, + 0x7f, 0xdf, 0xc0, 0x83, 0x72, 0x5b, 0xfb, 0x49, 0x19, 0xcc, 0x61, 0x07, 0xbc, 0x00, 0x85, 0x1b, + 0x04, 0xe6, 0x23, 0xda, 0x97, 0x85, 0x7d, 0x81, 0x71, 0x95, 0xd9, 0x02, 0xe2, 0x05, 0xbd, 0x65, + 0x75, 0xfb, 0x05, 0x5d, 0x30, 0xfa, 0x52, 0x07, 0x00, 0x22, 0x0f, 0x04, 0xe4, 0x97, 0x85, 0x1c, + 0x82, 0x87, 0x71, 0x77, 0x54, 0xa8, 0xfc, 0x8a, 0x0c, 0x66, 0xd1, 0x24, 0x25, 0x00, 0xa5, 0xc1, + 0x81, 0xe2, 0xd8, 0xdd, 0xfd, 0x68, 0x59, 0x24, 0x78, 0x4c, 0xd5, 0x48, 0xfe, 0x48, 0x78, 0xe6, + 0x8e, 0x45, 0xc4, 0xf0, 0x32, 0x21, 0xfc, 0x3e, 0x28, 0x34, 0x9f, 0x1f, 0xc2, 0xdc, 0x51, 0xc1, + 0xf7, 0x70, 0x11, 0x14, 0x37, 0x7a, 0x18, 0xb9, 0x2f, 0xc9, 0x22, 0x97, 0x76, 0x1c, 0x38, 0x0c, + 0x86, 0xcc, 0xac, 0xae, 0xd3, 0x36, 0xbb, 0xeb, 0xd1, 0xa9, 0xda, 0x28, 0x41, 0xbd, 0x93, 0xfa, + 0x87, 0x93, 0x13, 0xe7, 0x37, 0x25, 0xde, 0x67, 0x81, 0x65, 0xc4, 0x1c, 0xbc, 0xbb, 0x15, 0x9c, + 0xe8, 0x58, 0x9e, 0x79, 0xb1, 0x0b, 0x75, 0xbb, 0xed, 0xee, 0x13, 0x71, 0xd0, 0x69, 0xd5, 0x81, + 0x17, 0xea, 0xdd, 0xa0, 0xe0, 0xf9, 0xfb, 0x5d, 0x32, 0x4f, 0x64, 0xcf, 0xe9, 0xc5, 0x16, 0xd5, + 0x44, 0xd9, 0x0d, 0xf2, 0x15, 0xeb, 0xd6, 0x39, 0x25, 0xe6, 0xd6, 0xa9, 0x3e, 0x19, 0x14, 0x1d, + 0xd7, 0xda, 0xb6, 0xc8, 0x15, 0x75, 0x0b, 0x07, 0xc2, 0xb6, 0x12, 0x53, 0xa0, 0x81, 0xb3, 0x18, + 0x34, 0xab, 0xfa, 0x54, 0x30, 0x63, 0xed, 0x9a, 0xdb, 0xf0, 0x3e, 0xcb, 0x26, 0x87, 0xda, 0x17, + 0x6e, 0x3f, 0x7d, 0xe0, 0x08, 0x22, 0x7d, 0x6f, 0x44, 0x59, 0xd5, 0xbb, 0xc0, 0x35, 0x6d, 0x17, + 0x9a, 0x3e, 0x44, 0x02, 0x3a, 0x6f, 0x75, 0xb6, 0xa1, 0x5f, 0xdd, 0x5a, 0xb3, 0x3c, 0xcf, 0xb2, + 0xb7, 0xe9, 0x2d, 0x94, 0xf1, 0x19, 0xb4, 0x0f, 0x4a, 0xa2, 0x91, 0xe9, 0xb0, 0x64, 0x88, 0x4a, + 0x8c, 0x70, 0x5b, 0x36, 0x23, 0x45, 0x59, 0xd0, 0x39, 0xf6, 0xd5, 0x42, 0x31, 0xe3, 0xe2, 0xd9, + 0xca, 0x7e, 0xe8, 0xff, 0x7d, 0x09, 0x4c, 0x57, 0x9c, 0x2b, 0x36, 0x6e, 0x26, 0x77, 0x88, 0x59, + 0xca, 0x03, 0x8e, 0x99, 0xf3, 0xf7, 0x2e, 0x27, 0x9e, 0x29, 0xc3, 0xb5, 0x0d, 0x8a, 0x8c, 0x81, + 0x21, 0xb1, 0xdd, 0x09, 0xde, 0x86, 0x9b, 0x54, 0x4e, 0xf6, 0x72, 0xfd, 0x6d, 0x19, 0xe4, 0x2b, + 0xae, 0xd3, 0xd3, 0xde, 0x96, 0x4b, 0xe1, 0x24, 0xd6, 0x71, 0x9d, 0x5e, 0x0b, 0x5f, 0x67, 0x19, + 0xed, 0x8b, 0xb0, 0x69, 0xea, 0x1d, 0x60, 0xba, 0xe7, 0x78, 0x96, 0x1f, 0x4c, 0x42, 0x16, 0x6e, + 0x7f, 0xcc, 0xc0, 0xbe, 0x60, 0x9d, 0x66, 0x32, 0xc2, 0xec, 0xa8, 0xcf, 0xc7, 0x22, 0x44, 0x72, + 0x41, 0x62, 0x0c, 0xae, 0xf4, 0xec, 0x4b, 0xd5, 0x5e, 0xc6, 0x22, 0xf9, 0x74, 0x1e, 0xc9, 0xc7, + 0x0e, 0x90, 0xb0, 0xeb, 0xf4, 0xc6, 0xe2, 0xd6, 0xf1, 0xca, 0x10, 0xd5, 0x67, 0x70, 0xa8, 0xde, + 0x22, 0x54, 0x66, 0xf6, 0x88, 0x7e, 0x30, 0x0f, 0x00, 0x36, 0x52, 0x36, 0xd0, 0xf4, 0x49, 0xcc, + 0x42, 0xfb, 0xe1, 0x3c, 0x23, 0xcb, 0x12, 0x2f, 0xcb, 0xc7, 0xc7, 0xd8, 0x40, 0x98, 0x7c, 0x8c, + 0x44, 0x4b, 0xa0, 0xb0, 0x87, 0x5e, 0x53, 0x89, 0x0a, 0x92, 0xc0, 0x8f, 0x06, 0xf9, 0x52, 0xfb, + 0xad, 0x1c, 0x28, 0xe0, 0x04, 0xf5, 0x0c, 0x00, 0xd8, 0x2c, 0x20, 0x47, 0x32, 0x73, 0xd8, 0x00, + 0x60, 0x52, 0xb0, 0xb6, 0x5a, 0x1d, 0xfa, 0x9a, 0x18, 0xdc, 0x51, 0x02, 0xfa, 0x1a, 0x1b, 0x0b, + 0x98, 0x16, 0x35, 0x1f, 0x98, 0x14, 0xf4, 0x35, 0x7e, 0xaa, 0xc1, 0x2d, 0x72, 0xd3, 0x40, 0xde, + 0x88, 0x12, 0xc2, 0xaf, 0x6b, 0xe1, 0xfd, 0x94, 0xc1, 0xd7, 0x38, 0x05, 0x4d, 0xa5, 0xb1, 0x5a, + 0x2e, 0x45, 0x45, 0x14, 0x71, 0xa6, 0xfe, 0x64, 0xed, 0x75, 0xa1, 0xda, 0x54, 0x38, 0xb5, 0x79, + 0x62, 0x0a, 0xf1, 0x66, 0xaf, 0x3c, 0x7f, 0x5a, 0x00, 0x33, 0x75, 0xa7, 0x43, 0x75, 0x87, 0x99, + 0x6e, 0x7e, 0xaa, 0x90, 0x6a, 0xba, 0x19, 0xd2, 0x88, 0x51, 0x90, 0x67, 0xf2, 0x0a, 0x22, 0x46, + 0x81, 0xd5, 0x0f, 0x75, 0x09, 0x14, 0xb1, 0xf6, 0x1e, 0xbc, 0xf8, 0x30, 0x89, 0x04, 0x16, 0xad, + 0x41, 0xbf, 0xfc, 0x0f, 0xa7, 0x63, 0xff, 0x1d, 0x14, 0x70, 0x05, 0x13, 0xf6, 0x86, 0xf8, 0x8a, + 0x4a, 0xc9, 0x15, 0x95, 0x93, 0x2b, 0x9a, 0xef, 0xaf, 0x68, 0x9a, 0x55, 0x84, 0x38, 0x0d, 0xc9, + 0x5e, 0xc7, 0xff, 0x66, 0x0a, 0x80, 0xba, 0x79, 0xd9, 0xda, 0x26, 0x7b, 0xcb, 0x7f, 0x18, 0xcc, + 0x9e, 0xe8, 0x2e, 0xf0, 0x8f, 0x31, 0x03, 0xe1, 0x1d, 0x60, 0x8a, 0x8e, 0x7b, 0xb4, 0x22, 0xd7, + 0x71, 0x15, 0x89, 0xa8, 0x10, 0xa3, 0xf6, 0x41, 0xdf, 0x08, 0xf2, 0x73, 0x77, 0xb4, 0x4b, 0x7d, + 0x77, 0xb4, 0x0f, 0xde, 0xc1, 0x88, 0xb9, 0xb9, 0x5d, 0x7b, 0x9f, 0xf0, 0x19, 0x2a, 0x86, 0x1f, + 0xa6, 0x46, 0x31, 0x4d, 0xf0, 0xc9, 0x60, 0xca, 0x09, 0xb7, 0xc3, 0xe5, 0xd8, 0x55, 0xb4, 0xaa, + 0xbd, 0xe5, 0x18, 0x41, 0x4e, 0xc1, 0xad, 0x33, 0x21, 0x3e, 0x26, 0x72, 0x4c, 0xf1, 0xd4, 0x4a, + 0x10, 0xb5, 0x11, 0xd5, 0xe3, 0xbc, 0xe5, 0xef, 0xd4, 0x2c, 0xfb, 0x92, 0xa7, 0xfd, 0x57, 0x31, + 0x0b, 0x92, 0xc1, 0x5f, 0x4a, 0x87, 0x3f, 0x1f, 0x35, 0xa9, 0xc9, 0xa3, 0x76, 0x77, 0x1c, 0x95, + 0xc1, 0xdc, 0xc6, 0x00, 0x78, 0x27, 0x28, 0x12, 0x46, 0x69, 0x27, 0x7a, 0x36, 0x16, 0xbf, 0x90, + 0x92, 0x41, 0xbf, 0xd0, 0xde, 0x1b, 0xe2, 0x78, 0x8e, 0xc3, 0x71, 0xe9, 0x50, 0x9c, 0x65, 0x0e, + 0xe9, 0xd9, 0x27, 0x81, 0x29, 0x2a, 0x69, 0x75, 0x81, 0x6d, 0xc5, 0xca, 0x31, 0x15, 0x80, 0xe2, + 0x9a, 0x73, 0x19, 0xb6, 0x1c, 0x25, 0x87, 0xfe, 0x23, 0xfe, 0x5a, 0x8e, 0x22, 0x69, 0xaf, 0x9a, + 0x06, 0xd3, 0x61, 0xb8, 0xbc, 0xdf, 0x97, 0x80, 0x52, 0xc6, 0x33, 0xb4, 0x65, 0xd7, 0xd9, 0x25, + 0x35, 0x12, 0xf7, 0xc7, 0xff, 0x19, 0x61, 0x07, 0x91, 0x30, 0x8c, 0x5d, 0x7f, 0x61, 0x31, 0x58, + 0x92, 0x25, 0x4c, 0x29, 0x58, 0xc2, 0xd4, 0xde, 0x2a, 0xe4, 0x30, 0x22, 0x5a, 0x4a, 0xf6, 0x4d, + 0xed, 0xb3, 0x12, 0x28, 0x94, 0xbb, 0x8e, 0x0d, 0xd9, 0x43, 0xa3, 0x43, 0x4f, 0x27, 0x0e, 0xde, + 0xc7, 0xd0, 0x9e, 0x2b, 0x89, 0xda, 0x1a, 0x91, 0x00, 0x50, 0xd9, 0x82, 0xb2, 0x15, 0x1b, 0xa4, + 0x12, 0x49, 0x67, 0x2f, 0xd0, 0xaf, 0x49, 0x60, 0x86, 0x44, 0x26, 0x2b, 0x75, 0xbb, 0xda, 0x63, + 0x22, 0xa1, 0x0e, 0x08, 0x39, 0xa8, 0xfd, 0xb2, 0xf0, 0xa1, 0xa8, 0xb0, 0x56, 0x21, 0xed, 0x14, + 0x21, 0xda, 0xd2, 0x9d, 0xd1, 0x11, 0xdb, 0x89, 0x1b, 0xca, 0x50, 0xf6, 0xa2, 0xfe, 0x03, 0x09, + 0x19, 0x00, 0xf6, 0xa5, 0x75, 0x17, 0x5e, 0xb6, 0xe0, 0x15, 0xed, 0xd1, 0x91, 0xb0, 0x0f, 0x86, + 0x5d, 0x7a, 0x93, 0xf0, 0x22, 0x0e, 0x43, 0x32, 0x76, 0x23, 0x6c, 0xb6, 0x1b, 0x65, 0xa2, 0xbd, + 0x78, 0x7f, 0x2c, 0x2c, 0x86, 0x8c, 0xc1, 0x66, 0x17, 0x5c, 0xb3, 0x89, 0xe7, 0x22, 0x7b, 0xc1, + 0xfe, 0xea, 0x14, 0x98, 0xde, 0xb0, 0xbd, 0x5e, 0xd7, 0xf4, 0x76, 0xb4, 0x7f, 0x95, 0x41, 0x91, + 0x5c, 0xb7, 0xa9, 0x7d, 0x0f, 0x17, 0xdd, 0xe5, 0xd9, 0x7b, 0xd0, 0x0d, 0x1c, 0x78, 0xc8, 0x43, + 0x64, 0x1f, 0x49, 0x8c, 0x7d, 0xa4, 0x7d, 0x50, 0x16, 0x9d, 0xa4, 0x06, 0x85, 0xd2, 0xfb, 0x3d, + 0xe3, 0x03, 0x8a, 0xf4, 0xac, 0xb6, 0xbf, 0xe7, 0x42, 0x6f, 0x60, 0x40, 0x91, 0x58, 0x2a, 0xeb, + 0xe4, 0x2b, 0x23, 0xfc, 0x5c, 0x33, 0xc1, 0x14, 0x4d, 0x3c, 0xb0, 0x19, 0x75, 0x30, 0xe2, 0xc1, + 0x29, 0x50, 0x34, 0x5d, 0xdf, 0xf2, 0x7c, 0xba, 0x3d, 0x4b, 0x9f, 0x50, 0x77, 0x49, 0xfe, 0x6d, + 0xb8, 0xdd, 0x20, 0x0e, 0x54, 0x98, 0xa0, 0xfd, 0x8a, 0xd0, 0xfc, 0x31, 0xb9, 0xe6, 0xe9, 0x20, + 0xbf, 0x6f, 0x84, 0x15, 0xee, 0x47, 0x81, 0xab, 0x8c, 0x52, 0x4b, 0xdf, 0x24, 0x61, 0x83, 0xc2, + 0x08, 0x41, 0x1d, 0xed, 0x3d, 0x32, 0xb3, 0x7e, 0xb7, 0xcf, 0x8d, 0x11, 0x54, 0x8a, 0xd1, 0x18, + 0x11, 0x26, 0x24, 0xec, 0x75, 0x73, 0x4b, 0xb8, 0xb2, 0xf0, 0x12, 0xae, 0xf6, 0x4b, 0xc2, 0x7b, + 0x51, 0xa1, 0x28, 0x87, 0xac, 0x01, 0x26, 0x5d, 0xc7, 0xf7, 0x61, 0xa1, 0x7d, 0xa5, 0x61, 0x25, + 0x1d, 0x21, 0x6c, 0xdf, 0x3a, 0x05, 0xa4, 0x52, 0x55, 0xfb, 0xd1, 0x29, 0x30, 0x77, 0xde, 0xb5, + 0x7c, 0xcb, 0xde, 0x6e, 0x39, 0x4e, 0xd7, 0xd3, 0xbe, 0xc9, 0x6c, 0x54, 0x3c, 0x15, 0x14, 0xdb, + 0x8e, 0xbd, 0x65, 0x6d, 0x53, 0x31, 0x9e, 0xe1, 0x2a, 0x57, 0xaa, 0x2e, 0xae, 0xbb, 0xce, 0x65, + 0xab, 0x03, 0xdd, 0x32, 0xce, 0x65, 0xd0, 0xdc, 0x48, 0x8f, 0x99, 0xc0, 0x6b, 0x4f, 0xec, 0xff, + 0x8a, 0x2d, 0x2f, 0x8c, 0xfc, 0x42, 0x13, 0x99, 0xb8, 0x6b, 0x55, 0x30, 0xdd, 0x35, 0xed, 0xed, + 0xbd, 0x60, 0xe6, 0xdd, 0xbf, 0x8b, 0x1a, 0x47, 0xa9, 0x46, 0x3f, 0x32, 0xc2, 0xcf, 0xb1, 0x93, + 0x1b, 0x32, 0xf5, 0x49, 0xdb, 0xc3, 0xff, 0xcf, 0x7e, 0x34, 0x07, 0x66, 0x99, 0x42, 0xd5, 0x59, + 0x30, 0x55, 0xd1, 0x97, 0x4b, 0x1b, 0xb5, 0x96, 0x72, 0x0c, 0x49, 0xb1, 0xb9, 0xb1, 0xb6, 0x56, + 0x32, 0xaa, 0xdf, 0xa7, 0x2b, 0x39, 0xf4, 0x6e, 0xc5, 0x28, 0xa1, 0x67, 0x45, 0x42, 0x0f, 0xcd, + 0xd5, 0x86, 0xd1, 0xd2, 0xeb, 0x8a, 0x8c, 0xec, 0x51, 0xfd, 0xfe, 0xf5, 0x52, 0xbd, 0xa2, 0xe4, + 0xd1, 0xff, 0xa5, 0x8d, 0x5a, 0x4d, 0x6f, 0x29, 0x85, 0x28, 0x14, 0x5b, 0x11, 0x25, 0x97, 0x4b, + 0xcd, 0x8d, 0x52, 0x4d, 0x99, 0x42, 0xc9, 0xcb, 0x1b, 0xf5, 0xfa, 0x05, 0x65, 0x1a, 0x15, 0x51, + 0x6e, 0xd4, 0x97, 0xab, 0x15, 0xbd, 0xde, 0x52, 0x66, 0xd4, 0xab, 0xc0, 0xf1, 0x66, 0xcb, 0x28, + 0x55, 0x57, 0x56, 0x5b, 0xcb, 0x0d, 0xe3, 0x7c, 0xc9, 0xa8, 0x28, 0x40, 0x55, 0xc0, 0xdc, 0xba, + 0xd1, 0x58, 0xd6, 0x71, 0x2c, 0x8f, 0x52, 0x4d, 0x99, 0x45, 0x5f, 0xb5, 0x8c, 0x52, 0xbd, 0x59, + 0x2b, 0xb5, 0x74, 0x65, 0xee, 0xec, 0xbd, 0x60, 0x3a, 0xa8, 0xae, 0x5a, 0x04, 0x92, 0x5e, 0x57, + 0x8e, 0xe1, 0xdf, 0xa6, 0x92, 0x43, 0xbf, 0xcb, 0x88, 0xdf, 0x22, 0x90, 0x2a, 0xba, 0x22, 0xa3, + 0xdf, 0x6a, 0x4b, 0xc9, 0xa3, 0xdf, 0x75, 0xc4, 0x62, 0x11, 0x48, 0xab, 0x55, 0xa5, 0x88, 0x7e, + 0x5b, 0xab, 0xca, 0x14, 0x7f, 0xeb, 0x76, 0x62, 0x2f, 0x7c, 0x50, 0xf2, 0x31, 0x86, 0x86, 0x1f, + 0xcd, 0x91, 0xf1, 0x7f, 0xed, 0x95, 0x92, 0x48, 0x5f, 0x97, 0x4c, 0x3f, 0x5d, 0xa3, 0x79, 0x4b, + 0x6e, 0x8c, 0xad, 0x46, 0xd5, 0xc0, 0x29, 0xbd, 0x5e, 0x59, 0x6f, 0x54, 0xeb, 0x2d, 0x12, 0x30, + 0x4b, 0x2f, 0x95, 0x57, 0x31, 0xce, 0x10, 0x21, 0xb8, 0xd6, 0xa8, 0xe8, 0x35, 0xfc, 0x62, 0xb9, + 0xb1, 0x51, 0xaf, 0x28, 0x5b, 0xa8, 0xac, 0xd2, 0x46, 0x6b, 0x75, 0xd3, 0xd0, 0x9f, 0xb5, 0x51, + 0x35, 0xf4, 0x8a, 0xb2, 0x8d, 0x68, 0xd4, 0x4a, 0xf5, 0x95, 0x8d, 0xd2, 0x0a, 0xdd, 0x2f, 0xdc, + 0x58, 0x5f, 0x6f, 0xe0, 0x1d, 0xc3, 0x1d, 0xed, 0xef, 0xf3, 0x60, 0xba, 0xb4, 0xe7, 0x3b, 0x5b, + 0x56, 0xb7, 0xab, 0x3d, 0x24, 0x1d, 0xbe, 0x29, 0x96, 0xb8, 0xa6, 0x78, 0xa0, 0x01, 0x05, 0x65, + 0x85, 0x8d, 0x27, 0x48, 0x60, 0xda, 0xe1, 0xe9, 0xc8, 0x19, 0x5b, 0xa6, 0x3b, 0xcd, 0xe4, 0x91, + 0x38, 0xe2, 0xda, 0xb4, 0x65, 0xe1, 0x37, 0xf4, 0xf1, 0xec, 0x7d, 0x60, 0x8e, 0xa5, 0x84, 0x83, + 0x4a, 0x95, 0x56, 0x48, 0xd4, 0xa9, 0x20, 0xce, 0x1c, 0x89, 0x3a, 0x85, 0x0f, 0x05, 0x48, 0xb8, + 0xbd, 0x54, 0x5b, 0x35, 0xa4, 0xa7, 0xc7, 0xc1, 0x6c, 0x45, 0x6f, 0x96, 0x8d, 0x2a, 0xf6, 0x53, + 0x57, 0xf2, 0xbc, 0x97, 0x41, 0xa2, 0x65, 0xc6, 0xd7, 0x48, 0x54, 0x29, 0xbf, 0x2d, 0x64, 0x6f, + 0xc5, 0xd3, 0x4e, 0xa7, 0x90, 0x2f, 0x79, 0xa4, 0x29, 0xa4, 0xf6, 0x92, 0x3c, 0x59, 0x27, 0x6b, + 0xee, 0xed, 0xee, 0x9a, 0xee, 0x3e, 0xe7, 0xaf, 0x36, 0xaa, 0xde, 0xc5, 0x8f, 0xef, 0x89, 0x11, + 0x6a, 0x90, 0x09, 0xd5, 0x73, 0x9d, 0xdd, 0x5e, 0xd0, 0x57, 0xd3, 0x27, 0xed, 0xff, 0x16, 0x9e, + 0x39, 0x96, 0xaa, 0x8b, 0x4c, 0x65, 0x46, 0x18, 0xda, 0x7f, 0x40, 0x12, 0x99, 0x45, 0x26, 0x16, + 0xf3, 0x9d, 0xae, 0x11, 0x7f, 0x9d, 0x07, 0x57, 0xd1, 0xe8, 0x23, 0xe1, 0xfa, 0x03, 0x32, 0x55, + 0x5f, 0x93, 0xa9, 0x66, 0x50, 0x83, 0x5a, 0x8e, 0x0c, 0x6a, 0x66, 0xc3, 0x3b, 0x2f, 0xb8, 0xe1, + 0xfd, 0x36, 0xe1, 0x43, 0x0f, 0xa5, 0xea, 0xe2, 0x80, 0x3a, 0x4e, 0x66, 0x5b, 0xfe, 0x05, 0x92, + 0xc8, 0x6a, 0xab, 0x10, 0x87, 0xdf, 0xe9, 0xba, 0xf6, 0x8e, 0x1c, 0x58, 0xe0, 0x55, 0x45, 0x7d, + 0x0a, 0x98, 0xee, 0xd1, 0x14, 0x2a, 0x97, 0xd3, 0x71, 0xca, 0x65, 0x84, 0x39, 0x11, 0x44, 0xd0, + 0xee, 0xf4, 0x1c, 0xcb, 0x0e, 0xd7, 0xe5, 0x83, 0x67, 0x34, 0xef, 0xc4, 0x53, 0x87, 0x20, 0x16, + 0x1d, 0x7e, 0x88, 0x22, 0x90, 0xe6, 0x99, 0x08, 0xa4, 0x48, 0x88, 0x3e, 0xdc, 0xc5, 0x37, 0xaa, + 0xec, 0xb9, 0xc4, 0xe1, 0x45, 0x32, 0xd8, 0xa4, 0xb3, 0xcf, 0x00, 0xd3, 0x41, 0xf9, 0xc8, 0xba, + 0x6b, 0xd4, 0x6a, 0xa5, 0xb5, 0x12, 0x59, 0xa8, 0x6c, 0xac, 0xeb, 0xf5, 0x52, 0x55, 0xc9, 0xa1, + 0x81, 0xae, 0xb6, 0xd6, 0x6c, 0x6d, 0x54, 0xaa, 0x0d, 0x45, 0xc2, 0x4f, 0x28, 0x53, 0x79, 0x7d, + 0x5d, 0x91, 0xb5, 0x37, 0x4e, 0x81, 0xa9, 0x15, 0xb3, 0xdb, 0x85, 0xee, 0xbe, 0xf6, 0x35, 0x09, + 0x28, 0xc1, 0xec, 0x60, 0xcd, 0xb4, 0xad, 0x2d, 0xe8, 0xf9, 0xc9, 0x0b, 0x15, 0xef, 0x13, 0xbe, + 0x66, 0x89, 0x96, 0xb1, 0xd8, 0x4f, 0x3f, 0x46, 0xc7, 0x6f, 0x03, 0x79, 0xcb, 0xde, 0x72, 0xe8, + 0x72, 0x45, 0xbf, 0xbf, 0x4d, 0xf0, 0x31, 0xde, 0x36, 0xc0, 0x19, 0x05, 0x6f, 0x5a, 0x12, 0xe4, + 0x22, 0xfb, 0x55, 0x8b, 0x77, 0xe4, 0xc1, 0x7c, 0xc0, 0x44, 0xd5, 0xee, 0xc0, 0x07, 0xd9, 0x6d, + 0xd0, 0x9f, 0xcc, 0x8b, 0x06, 0xbf, 0xe9, 0xaf, 0x0f, 0x26, 0x15, 0x23, 0xd2, 0x16, 0x00, 0x6d, + 0xd3, 0x87, 0xdb, 0x8e, 0x6b, 0x85, 0x6b, 0x11, 0x4f, 0x49, 0x43, 0xad, 0x4c, 0xbe, 0xde, 0x37, + 0x18, 0x3a, 0xea, 0xdd, 0x60, 0x16, 0x86, 0xd1, 0x06, 0x83, 0x6d, 0xd2, 0x44, 0xbc, 0xd8, 0xfc, + 0xda, 0x1f, 0x08, 0xc5, 0xd8, 0x11, 0xa9, 0x66, 0x3a, 0xcc, 0x36, 0x47, 0xeb, 0x7a, 0x36, 0xea, + 0x6b, 0x25, 0xa3, 0xb9, 0x5a, 0xaa, 0xd5, 0xaa, 0xf5, 0x95, 0x30, 0xec, 0xad, 0x0a, 0x16, 0x2a, + 0x8d, 0xf3, 0x75, 0x26, 0x2e, 0x71, 0x5e, 0x5b, 0x07, 0xd3, 0x81, 0xbc, 0x06, 0x9d, 0xa2, 0x62, + 0x65, 0x46, 0x4f, 0x51, 0x31, 0x49, 0xc8, 0x34, 0xb4, 0xda, 0xa1, 0x6b, 0x3d, 0xfe, 0xaf, 0xfd, + 0xa6, 0x09, 0x0a, 0xd8, 0x9f, 0x45, 0x7b, 0x17, 0x9e, 0x17, 0xf7, 0xba, 0x66, 0x1b, 0x6a, 0xbb, + 0x29, 0x56, 0xc2, 0x83, 0x7b, 0x3f, 0xa5, 0x03, 0xf7, 0x7e, 0xe2, 0xbf, 0x74, 0xc4, 0x38, 0x39, + 0xc8, 0x87, 0xc6, 0x20, 0x59, 0xf8, 0x70, 0x34, 0x89, 0x9e, 0x4d, 0xc4, 0xf5, 0x86, 0xb2, 0x19, + 0xa3, 0x92, 0xf1, 0x3c, 0xa5, 0x5b, 0x05, 0x16, 0xf3, 0x81, 0x4a, 0xe2, 0x28, 0xfb, 0x16, 0xff, + 0xa5, 0x3c, 0x28, 0x34, 0x7b, 0x5d, 0xcb, 0xd7, 0x7e, 0x4e, 0x1a, 0x0b, 0x66, 0xe4, 0xae, 0x56, + 0x79, 0xe8, 0x5d, 0xad, 0x91, 0xbf, 0x64, 0x5e, 0xc0, 0x5f, 0xb2, 0x05, 0x1f, 0xf4, 0x79, 0x7f, + 0xc9, 0x3b, 0xe8, 0xb4, 0x8d, 0x78, 0x5b, 0x3e, 0x76, 0x80, 0x48, 0x71, 0xb5, 0x06, 0xdc, 0x89, + 0x70, 0xf6, 0x49, 0x34, 0x34, 0x3b, 0x00, 0xc5, 0xa5, 0x46, 0xab, 0xd5, 0x58, 0x53, 0x8e, 0xe1, + 0xe9, 0x57, 0x63, 0x9d, 0x04, 0xca, 0xad, 0xd6, 0xeb, 0xba, 0xc1, 0xcd, 0xb8, 0xf8, 0x8b, 0xfb, + 0x12, 0x27, 0x58, 0x7c, 0xd9, 0x59, 0xaa, 0x97, 0xd8, 0x22, 0x78, 0x3c, 0x3f, 0xd9, 0x2b, 0xd7, + 0x4f, 0xcb, 0xa0, 0xb0, 0x06, 0xdd, 0x6d, 0xa8, 0x3d, 0x3b, 0x85, 0x83, 0xdd, 0x96, 0xe5, 0x7a, + 0x24, 0xb4, 0x7e, 0xe4, 0x60, 0xc7, 0xa6, 0xa9, 0x37, 0x82, 0x79, 0x0f, 0xb6, 0x1d, 0xbb, 0x13, + 0x64, 0x22, 0xfd, 0x11, 0x9f, 0xa8, 0xbd, 0x3c, 0x25, 0x64, 0x98, 0xd1, 0xb1, 0x78, 0xc9, 0xa5, + 0x01, 0x66, 0x50, 0xa9, 0xd9, 0x03, 0xf3, 0x0d, 0x19, 0x7d, 0xd4, 0xdb, 0xd7, 0x5e, 0x2e, 0xec, + 0xf9, 0x78, 0x2b, 0x28, 0x5e, 0x0c, 0xee, 0x68, 0x92, 0x63, 0xfb, 0x63, 0x9a, 0x47, 0x5d, 0x02, + 0x27, 0x3c, 0xd8, 0x85, 0x6d, 0x1f, 0x76, 0x50, 0xd3, 0x35, 0x86, 0x76, 0x0a, 0x07, 0xb3, 0x6b, + 0xbf, 0xc3, 0x02, 0x78, 0x17, 0x0f, 0xe0, 0x4d, 0x03, 0x44, 0x89, 0x2a, 0x14, 0x3f, 0x37, 0x41, + 0xd5, 0x68, 0x76, 0x9d, 0xd0, 0xf0, 0x0d, 0x9e, 0xd1, 0xbb, 0x1d, 0x7f, 0xb7, 0x8b, 0xdf, 0xd1, + 0xa3, 0xc1, 0xc1, 0xb3, 0xba, 0x08, 0xa6, 0x4c, 0x7b, 0x1f, 0xbf, 0xca, 0x27, 0xd4, 0x3a, 0xc8, + 0xa4, 0xbd, 0x2a, 0x44, 0xfe, 0x1e, 0x0e, 0xf9, 0xc7, 0x8b, 0xb1, 0x9b, 0x3d, 0xf0, 0x3f, 0x34, + 0x05, 0x0a, 0xeb, 0xa6, 0xe7, 0x43, 0xed, 0x7f, 0xc9, 0xa2, 0xc8, 0xdf, 0x04, 0x16, 0xb6, 0x9c, + 0xf6, 0x9e, 0x07, 0x3b, 0x7c, 0xa3, 0xec, 0x4b, 0x1d, 0x07, 0xe6, 0xea, 0x2d, 0x40, 0x09, 0x12, + 0x29, 0xd9, 0xc0, 0x05, 0xf6, 0x40, 0x3a, 0xbe, 0x06, 0xce, 0x5b, 0x37, 0x5d, 0xbf, 0xb1, 0x85, + 0xd3, 0xc2, 0x6b, 0xe0, 0xd8, 0x44, 0x0e, 0xfa, 0x62, 0x02, 0xf4, 0x53, 0xf1, 0xd0, 0x4f, 0x0b, + 0x40, 0xaf, 0x96, 0xc0, 0xf4, 0x96, 0xd5, 0x85, 0xf8, 0x83, 0x19, 0xfc, 0xc1, 0xa0, 0x31, 0x09, + 0xcb, 0x3e, 0x1c, 0x93, 0x96, 0xad, 0x2e, 0x34, 0xc2, 0xcf, 0x82, 0x89, 0x0c, 0x88, 0x26, 0x32, + 0x35, 0x72, 0x12, 0x0e, 0x19, 0x5e, 0xb6, 0xb9, 0x0b, 0x83, 0x8d, 0x6f, 0x9b, 0x1e, 0x4b, 0xef, + 0x98, 0xbe, 0x89, 0xc1, 0x98, 0x33, 0xf0, 0x7f, 0xde, 0x27, 0x5b, 0xee, 0xf7, 0xc9, 0x7e, 0xbe, + 0x9c, 0xae, 0x47, 0x0c, 0x98, 0x8d, 0x69, 0x51, 0x17, 0x03, 0x80, 0x88, 0xa5, 0x18, 0x3e, 0x23, + 0x60, 0xda, 0xa6, 0x0b, 0xfd, 0x75, 0xd6, 0x0b, 0xba, 0x60, 0xf0, 0x89, 0xf8, 0x10, 0x8e, 0xd7, + 0x34, 0x77, 0xc9, 0x35, 0x6f, 0x65, 0xf4, 0x8e, 0x1e, 0xae, 0x38, 0x90, 0x1e, 0xf5, 0xbf, 0x85, + 0x71, 0xf7, 0xbf, 0x83, 0xea, 0x98, 0x7d, 0x33, 0x7c, 0x6d, 0x1e, 0xc8, 0xe5, 0x3d, 0xff, 0x11, + 0xdd, 0xfd, 0x7e, 0x5b, 0xd8, 0xc7, 0x9c, 0xf6, 0x67, 0x7b, 0xfe, 0xd1, 0xf6, 0xbe, 0x29, 0xb5, + 0x44, 0xcc, 0x97, 0x3d, 0xae, 0x6e, 0xd9, 0xeb, 0xc8, 0xdb, 0xe4, 0xf0, 0x68, 0xd4, 0x43, 0xb9, + 0xc3, 0x9b, 0xe6, 0x1a, 0xe9, 0x9f, 0x98, 0x9e, 0x21, 0x7c, 0x0e, 0x3a, 0x9e, 0x3c, 0x77, 0x33, + 0x01, 0x76, 0x6d, 0xc5, 0xa2, 0x9c, 0x33, 0xc8, 0x83, 0xf6, 0x0a, 0xe1, 0x03, 0xa3, 0x44, 0x6c, + 0x89, 0xc7, 0x78, 0xd2, 0xd9, 0x54, 0xaf, 0x11, 0x3a, 0x36, 0x9a, 0x50, 0x6c, 0xf6, 0x80, 0xfd, + 0x1d, 0x7b, 0x4c, 0xa7, 0x74, 0x68, 0xc4, 0xb4, 0x57, 0x0b, 0x2f, 0xe8, 0x93, 0x6a, 0x0f, 0xd9, + 0xab, 0x4f, 0x27, 0x6f, 0x31, 0x47, 0xb1, 0xc4, 0x82, 0x27, 0x70, 0x6f, 0xad, 0x0c, 0x8a, 0x64, + 0xe1, 0x57, 0x7b, 0xb3, 0x70, 0x13, 0x41, 0xbd, 0x11, 0x7f, 0x7c, 0x27, 0x7c, 0x4e, 0xb3, 0xe6, + 0xc0, 0x1d, 0xf3, 0xc9, 0xa7, 0x3a, 0xe6, 0xc3, 0x47, 0x60, 0x11, 0x68, 0x47, 0xa4, 0x8e, 0x19, + 0x4f, 0x27, 0xd3, 0xb4, 0xb0, 0x81, 0x0c, 0x65, 0x8f, 0xf7, 0x0b, 0x0b, 0x60, 0x8e, 0x14, 0x4d, + 0xce, 0x17, 0x6a, 0xef, 0x91, 0xbe, 0x73, 0x50, 0x57, 0xeb, 0x60, 0xee, 0x0a, 0x66, 0x9b, 0xdc, + 0x47, 0x4b, 0x57, 0x2e, 0x6e, 0x49, 0x5c, 0xf7, 0x20, 0xf5, 0x0c, 0x6e, 0xb0, 0xe5, 0xbe, 0x47, + 0x32, 0x26, 0x1b, 0x2c, 0xe4, 0xf0, 0x44, 0x11, 0x1b, 0x59, 0x6c, 0x92, 0x7a, 0x0a, 0x14, 0x2f, + 0x5b, 0xf0, 0x4a, 0xb5, 0x43, 0xad, 0x5b, 0xfa, 0xa4, 0xfd, 0x9a, 0xb0, 0xcf, 0x24, 0x0b, 0x37, + 0xe5, 0x25, 0x5b, 0x2d, 0x14, 0xf3, 0x9c, 0x1c, 0xca, 0xd6, 0x04, 0xa2, 0x01, 0x49, 0xe4, 0xce, + 0x6c, 0x1a, 0x66, 0xbe, 0x9c, 0x42, 0x11, 0xe3, 0x0c, 0x67, 0x3e, 0x08, 0x5f, 0xe2, 0x59, 0x73, + 0x22, 0x80, 0xa8, 0xfc, 0xb1, 0xf4, 0xf9, 0x62, 0x91, 0xe1, 0x86, 0x14, 0x9d, 0xbd, 0xe4, 0x5f, + 0x27, 0x83, 0x99, 0x26, 0xf4, 0x97, 0x2d, 0xd8, 0xed, 0x78, 0x9a, 0x7b, 0x78, 0xd3, 0xe8, 0x36, + 0x50, 0xdc, 0xc2, 0xc4, 0x86, 0x6d, 0x4e, 0xd2, 0x6c, 0xda, 0x6b, 0x25, 0x51, 0x3f, 0x20, 0xba, + 0xfa, 0x16, 0x70, 0x3b, 0x16, 0x98, 0xc4, 0x4e, 0xd3, 0x25, 0x97, 0x3c, 0x81, 0x6b, 0x7c, 0x64, + 0x30, 0x87, 0xb7, 0xff, 0xa1, 0x5f, 0xea, 0x5a, 0xdb, 0xb6, 0xb6, 0x37, 0x86, 0x16, 0xa2, 0x3e, + 0x11, 0x14, 0x4c, 0x44, 0x8d, 0xba, 0xbb, 0x69, 0x03, 0x3b, 0x4f, 0x5c, 0x9e, 0x41, 0x32, 0xa6, + 0xb8, 0x34, 0x23, 0x52, 0xec, 0x80, 0xe7, 0x09, 0x5e, 0x9a, 0x31, 0xb4, 0xf0, 0xec, 0x11, 0xfb, + 0x8a, 0x0c, 0x4e, 0x52, 0x06, 0xce, 0x41, 0xd7, 0xb7, 0xda, 0x66, 0x97, 0x20, 0xf7, 0xe2, 0xdc, + 0x38, 0xa0, 0x5b, 0x05, 0xf3, 0x97, 0x59, 0xb2, 0x14, 0xc2, 0xb3, 0x03, 0x21, 0xe4, 0x18, 0x30, + 0xf8, 0x0f, 0x53, 0x5c, 0x3e, 0xc0, 0x49, 0x95, 0xa3, 0x39, 0xc1, 0xcb, 0x07, 0x84, 0x99, 0xc8, + 0x1e, 0xe2, 0x97, 0xd1, 0xa0, 0x9a, 0x51, 0xf7, 0xf9, 0x87, 0xc2, 0xd8, 0x6e, 0x80, 0x59, 0x8c, + 0x25, 0xf9, 0x90, 0x2e, 0x43, 0x24, 0x28, 0x71, 0xd8, 0xef, 0xd0, 0xeb, 0xd2, 0xc3, 0x6f, 0x0d, + 0x96, 0x8e, 0x76, 0x1e, 0x80, 0xe8, 0x15, 0xdb, 0x49, 0xe7, 0xe2, 0x3a, 0x69, 0x49, 0xac, 0x93, + 0x7e, 0x93, 0x70, 0x98, 0xc3, 0xc1, 0x6c, 0x1f, 0x5e, 0x3d, 0xc4, 0x02, 0xdc, 0x0d, 0x2f, 0x3d, + 0x7b, 0xbd, 0x78, 0x15, 0xd5, 0x8b, 0xca, 0x5e, 0xaf, 0x6b, 0xb5, 0xd1, 0x7c, 0xea, 0xe3, 0x63, + 0x99, 0x4f, 0xb1, 0xfd, 0x81, 0xdc, 0xd7, 0x1f, 0x1c, 0xc2, 0x92, 0xbe, 0x19, 0x1c, 0x27, 0x45, + 0x94, 0x43, 0xb6, 0x0a, 0x24, 0x88, 0x5b, 0x5f, 0x32, 0x1f, 0x51, 0x5c, 0x50, 0x09, 0x42, 0x21, + 0x8c, 0xb0, 0xf4, 0x99, 0xce, 0xd8, 0x4d, 0xab, 0x20, 0x71, 0x9c, 0x4d, 0xe0, 0x48, 0x56, 0x9e, + 0x58, 0xbb, 0x1b, 0xf8, 0x46, 0x7b, 0xed, 0x8b, 0xf9, 0x71, 0x8c, 0x08, 0xcf, 0xa4, 0x9e, 0xa6, + 0x72, 0xec, 0x92, 0x46, 0x54, 0x64, 0xd8, 0x8f, 0xb4, 0xe0, 0x83, 0xfe, 0xea, 0x31, 0xe2, 0x97, + 0xaa, 0xde, 0x02, 0x8e, 0x5f, 0x34, 0xdb, 0x97, 0xb6, 0x5d, 0x67, 0x0f, 0xdf, 0xfd, 0xed, 0xd0, + 0x4b, 0xc4, 0x57, 0x8f, 0x19, 0xfd, 0x2f, 0xd4, 0xdb, 0x03, 0xd3, 0xa1, 0x30, 0xcc, 0x74, 0x58, + 0x3d, 0x46, 0x8d, 0x07, 0xf5, 0x49, 0x61, 0xa7, 0x53, 0x4c, 0xec, 0x74, 0x56, 0x8f, 0x05, 0xdd, + 0x8e, 0x5a, 0x01, 0xd3, 0x1d, 0xeb, 0x32, 0xde, 0xaa, 0xc6, 0xb3, 0xae, 0x61, 0x41, 0x87, 0x2a, + 0xd6, 0x65, 0xb2, 0xb1, 0xbd, 0x7a, 0xcc, 0x08, 0xbf, 0x54, 0x57, 0xc0, 0x0c, 0xde, 0x16, 0xc0, + 0x64, 0xa6, 0x53, 0x05, 0x14, 0x5a, 0x3d, 0x66, 0x44, 0xdf, 0x22, 0xeb, 0x23, 0x8f, 0xcf, 0x5d, + 0xdf, 0x13, 0x6c, 0xb7, 0xe7, 0x52, 0x6d, 0xb7, 0x23, 0x59, 0x90, 0x0d, 0xf7, 0x53, 0xa0, 0xd0, + 0xc6, 0x12, 0x96, 0xa8, 0x84, 0xc9, 0xa3, 0x7a, 0x17, 0xc8, 0xef, 0x9a, 0x6e, 0x30, 0x79, 0xbe, + 0x69, 0x38, 0xdd, 0x35, 0xd3, 0xbd, 0x84, 0x10, 0x44, 0x5f, 0x2d, 0x4d, 0x81, 0x02, 0x16, 0x5c, + 0xf8, 0x47, 0x7b, 0x5b, 0x9e, 0x98, 0x21, 0x65, 0xc7, 0x46, 0xc3, 0x7e, 0xcb, 0x09, 0x0e, 0xa7, + 0xff, 0x5a, 0x6e, 0x3c, 0x16, 0xe4, 0x55, 0xcc, 0x55, 0x1f, 0xb6, 0xf5, 0xec, 0x3d, 0x78, 0x1f, + 0xdc, 0xa7, 0x4b, 0xa2, 0x83, 0x5e, 0xa9, 0x67, 0x00, 0xf0, 0xe9, 0x49, 0xbd, 0x30, 0x88, 0x29, + 0x93, 0x12, 0x2d, 0x1f, 0x14, 0x86, 0x3b, 0xaa, 0xfc, 0xce, 0x08, 0xa6, 0x4b, 0xbf, 0x20, 0xe2, + 0x67, 0xe0, 0x5d, 0xcb, 0x66, 0xea, 0x1c, 0x3c, 0xa6, 0xec, 0x94, 0xd2, 0x1a, 0x35, 0x43, 0xd8, + 0xcb, 0xbe, 0x6f, 0x7a, 0x4b, 0x9e, 0xdc, 0x76, 0x40, 0x4e, 0x40, 0xeb, 0x0f, 0x5a, 0x9e, 0x6f, + 0xd9, 0xdb, 0xf4, 0x7c, 0xf3, 0x67, 0xc6, 0xa2, 0x34, 0x03, 0x06, 0x1c, 0x79, 0xe0, 0x80, 0x73, + 0x20, 0x40, 0x50, 0x7e, 0x48, 0x80, 0xa0, 0x42, 0xba, 0x95, 0xc3, 0x8f, 0xb0, 0xfa, 0xb3, 0xce, + 0xeb, 0xcf, 0x9d, 0x31, 0x00, 0x0d, 0x92, 0xcb, 0x58, 0xec, 0x9b, 0x77, 0x85, 0x9a, 0xd2, 0xe4, + 0x34, 0xe5, 0x9e, 0xd1, 0x19, 0xc9, 0x5e, 0x5b, 0x3e, 0x94, 0x07, 0x57, 0x45, 0xcc, 0xd4, 0xe1, + 0x15, 0xaa, 0x28, 0xbf, 0x3f, 0x16, 0x45, 0x49, 0xef, 0xe8, 0x9c, 0xb5, 0xc6, 0xfc, 0x96, 0xf0, + 0xb9, 0xfd, 0x7e, 0xa0, 0x42, 0xd9, 0xc4, 0x28, 0xcb, 0x29, 0x50, 0x24, 0x3d, 0x0c, 0x85, 0x86, + 0x3e, 0xa5, 0xec, 0x6e, 0xc4, 0x4e, 0xfb, 0x8b, 0xf2, 0x36, 0x01, 0xfd, 0xa1, 0xeb, 0x1a, 0xad, + 0x3d, 0xd7, 0xae, 0xda, 0xbe, 0xa3, 0xfd, 0xe0, 0x58, 0x14, 0x27, 0xf4, 0x86, 0x93, 0x47, 0xf1, + 0x86, 0x1b, 0x69, 0x95, 0x23, 0xa8, 0xc1, 0x91, 0xac, 0x72, 0xc4, 0x14, 0x9e, 0x3d, 0x7e, 0xef, + 0x94, 0xc1, 0x29, 0x3a, 0xd9, 0x5a, 0xe2, 0x2d, 0x44, 0xed, 0xc2, 0x38, 0x80, 0x3c, 0x19, 0x98, + 0x49, 0xd4, 0x8f, 0x1e, 0x3f, 0xf0, 0x51, 0x0a, 0x12, 0x6f, 0xb3, 0xe4, 0xa6, 0x83, 0x7d, 0x1c, + 0x8e, 0x05, 0x29, 0xb1, 0x4b, 0x2c, 0x53, 0xb0, 0x91, 0x3d, 0x66, 0x2f, 0x95, 0x41, 0x91, 0xc4, + 0x48, 0xd0, 0x36, 0x32, 0x71, 0x98, 0xe0, 0xef, 0x67, 0x11, 0xd8, 0x91, 0x23, 0xdc, 0x64, 0x16, + 0x3f, 0x22, 0xcd, 0x5e, 0xdc, 0x40, 0x56, 0x26, 0xe0, 0x42, 0x28, 0x81, 0xd9, 0x26, 0xf4, 0xcb, + 0xa6, 0xeb, 0x5a, 0xe6, 0xf6, 0xb8, 0x3c, 0xbe, 0x45, 0xbd, 0x87, 0xb5, 0x6f, 0xe6, 0x44, 0xcf, + 0xb2, 0x87, 0x0b, 0xe1, 0x01, 0xab, 0x31, 0x51, 0xc0, 0x5f, 0x2f, 0x74, 0x5e, 0x7d, 0x18, 0xb5, + 0x09, 0x78, 0x6c, 0x4b, 0x60, 0x2a, 0x88, 0x83, 0x71, 0x1b, 0x17, 0x1b, 0x65, 0xc7, 0xdf, 0x0d, + 0x8e, 0xc1, 0xe0, 0xff, 0x07, 0xe3, 0x2f, 0x68, 0xaf, 0x4c, 0xe9, 0x28, 0x9f, 0x1c, 0xc4, 0x23, + 0x5d, 0x1b, 0x4b, 0xe3, 0x0e, 0x7f, 0x54, 0x61, 0x3b, 0x7e, 0x79, 0x8a, 0x2e, 0x47, 0xd6, 0x4c, + 0x1f, 0x3e, 0xa8, 0xfd, 0xa1, 0x0c, 0xa6, 0x9a, 0xd0, 0x47, 0xe3, 0x2d, 0x62, 0xff, 0xd0, 0x1a, + 0xae, 0x32, 0x2b, 0x1e, 0xf4, 0x6c, 0xad, 0x7a, 0x2f, 0x98, 0xe9, 0xb9, 0x4e, 0x1b, 0x7a, 0x1e, + 0x5d, 0xbd, 0x60, 0x1d, 0xd5, 0x06, 0x8d, 0xfe, 0x98, 0xb5, 0xc5, 0xf5, 0xe0, 0x1b, 0x23, 0xfa, + 0x3c, 0xad, 0x19, 0x40, 0x28, 0xd1, 0x0a, 0x4e, 0xda, 0x0c, 0x48, 0x2a, 0x3c, 0x7b, 0xa0, 0x7f, + 0x57, 0x06, 0x73, 0x4d, 0xe8, 0x87, 0x52, 0x4c, 0xb1, 0xc9, 0x11, 0x0f, 0x2f, 0x07, 0xa5, 0x7c, + 0x38, 0x28, 0xdf, 0x29, 0x7c, 0x29, 0x2c, 0x2f, 0xcd, 0x90, 0xd8, 0x58, 0xf0, 0x7c, 0x8b, 0xd0, + 0x5d, 0xb0, 0x62, 0x1c, 0x4c, 0xe0, 0xf8, 0xda, 0x63, 0xc1, 0x0c, 0xe6, 0x05, 0x37, 0xd8, 0x1f, + 0xcd, 0x47, 0x8d, 0xf7, 0x0b, 0x19, 0x35, 0xde, 0xbb, 0x41, 0x61, 0xd7, 0x74, 0x2f, 0x05, 0x87, + 0x6f, 0x1f, 0x27, 0xb6, 0xfa, 0xe5, 0x19, 0xe4, 0xab, 0xc1, 0x7e, 0x9a, 0x85, 0x74, 0x7e, 0x9a, + 0xaf, 0x97, 0x52, 0x8d, 0x84, 0x64, 0xee, 0x30, 0xc6, 0x26, 0x9f, 0x62, 0xdc, 0x4c, 0x28, 0x3b, + 0x7b, 0xe5, 0x78, 0xb1, 0x0c, 0xa6, 0xd1, 0xb8, 0x8d, 0xed, 0xf1, 0xf3, 0x87, 0x57, 0x87, 0xc1, + 0x86, 0x7e, 0xca, 0x1e, 0x38, 0x90, 0xc8, 0xf8, 0xcc, 0xfb, 0x14, 0x3d, 0x70, 0x52, 0xe1, 0xd9, + 0xe3, 0xf1, 0x6e, 0x82, 0x07, 0x6e, 0x0f, 0xda, 0x1b, 0x64, 0x20, 0xaf, 0x40, 0x7f, 0xd2, 0x56, + 0xe4, 0xdb, 0x85, 0xc3, 0x8b, 0x72, 0x02, 0xc3, 0x3c, 0x2f, 0xae, 0xc0, 0xf1, 0x34, 0x20, 0xb1, + 0xb8, 0xa2, 0x42, 0x0c, 0x64, 0x8f, 0xda, 0xfb, 0x09, 0x6a, 0x64, 0x73, 0xe1, 0x07, 0xc6, 0xd0, + 0xab, 0x4e, 0x76, 0xe1, 0x23, 0x10, 0x20, 0xa6, 0x71, 0x54, 0xed, 0x6d, 0x50, 0xe1, 0xd9, 0x23, + 0xf7, 0x33, 0x32, 0xbe, 0xc4, 0xac, 0xbc, 0x03, 0xdb, 0x97, 0x60, 0x87, 0xbd, 0xc8, 0x79, 0x54, + 0xe8, 0x4e, 0x83, 0xa9, 0x36, 0xa1, 0x86, 0xc1, 0x9b, 0x36, 0x82, 0x47, 0xfe, 0x66, 0xa1, 0xc4, + 0xbb, 0xb3, 0xf8, 0x8e, 0x88, 0x7c, 0x3e, 0x16, 0x5c, 0xc4, 0x2e, 0xbc, 0x12, 0x28, 0x7e, 0x02, + 0x66, 0x0b, 0x99, 0x65, 0x54, 0xdb, 0x8e, 0xad, 0xfd, 0xb7, 0xc3, 0xc3, 0x72, 0x2d, 0x98, 0xb1, + 0xda, 0x8e, 0x8d, 0x43, 0xc0, 0x05, 0x87, 0x80, 0xc2, 0x84, 0xe0, 0xad, 0xbe, 0xeb, 0x3c, 0x60, + 0xd1, 0x5d, 0xf3, 0x28, 0x61, 0x54, 0x63, 0x02, 0xb1, 0x7e, 0x54, 0xc6, 0xc4, 0x80, 0xb2, 0xb3, + 0x87, 0xec, 0x13, 0x91, 0x77, 0x1b, 0xe9, 0x0a, 0x1f, 0x11, 0xab, 0xc0, 0xa3, 0x0c, 0x67, 0x6c, + 0x2d, 0x8e, 0x64, 0x38, 0x4b, 0x60, 0x60, 0x02, 0x37, 0x11, 0x46, 0x38, 0x66, 0xbe, 0x06, 0x7c, + 0x08, 0x74, 0xc6, 0x67, 0x1e, 0x8e, 0x88, 0xce, 0xd1, 0x98, 0x88, 0x1f, 0xa6, 0xe1, 0xe9, 0xa9, + 0xc5, 0xa3, 0xfd, 0xf7, 0x71, 0x80, 0x73, 0xe7, 0x28, 0xfe, 0x0a, 0xc4, 0x5b, 0x41, 0x7b, 0xab, + 0x24, 0x1a, 0x02, 0xe5, 0x80, 0x04, 0x11, 0x95, 0xb1, 0x20, 0xf8, 0x26, 0xa1, 0xd8, 0x24, 0x22, + 0xe5, 0x67, 0x0f, 0xe0, 0x8b, 0x64, 0xb0, 0x80, 0x7d, 0x04, 0xba, 0xd0, 0x74, 0x49, 0x47, 0x39, + 0x16, 0x47, 0xf9, 0x77, 0x0b, 0x07, 0xf8, 0xe1, 0xe5, 0x10, 0xf1, 0x31, 0x16, 0x28, 0xc4, 0xa2, + 0xfb, 0x08, 0xb2, 0x30, 0x91, 0x6d, 0x14, 0x25, 0x64, 0x81, 0xaa, 0xf8, 0x78, 0xf0, 0x48, 0xe9, + 0x91, 0xcb, 0x0b, 0x23, 0x68, 0x6c, 0x13, 0xf6, 0xc8, 0x15, 0x61, 0x22, 0x7b, 0x4c, 0xde, 0xf0, + 0x44, 0xba, 0xe0, 0xdc, 0x32, 0x2f, 0x76, 0xa1, 0xf6, 0xea, 0x7c, 0x78, 0xa2, 0xed, 0x77, 0xc7, + 0xe2, 0x81, 0x79, 0x88, 0xcb, 0xa8, 0x54, 0x90, 0x77, 0x9d, 0x2b, 0x64, 0x69, 0x6b, 0xde, 0xc0, + 0xff, 0x49, 0x3c, 0xcb, 0xee, 0xde, 0xae, 0x4d, 0x4e, 0x86, 0xce, 0x1b, 0xc1, 0xa3, 0x7a, 0x23, + 0x98, 0xbf, 0x62, 0xf9, 0x3b, 0xab, 0xd0, 0xec, 0x40, 0xd7, 0x70, 0xae, 0x60, 0x8f, 0xb9, 0x69, + 0x83, 0x4f, 0xe4, 0xfd, 0x57, 0x04, 0xec, 0x4b, 0x24, 0x94, 0xc9, 0x1c, 0x7f, 0x4b, 0x63, 0x79, + 0xc6, 0x73, 0x95, 0xbd, 0xc2, 0x7c, 0x40, 0x06, 0x33, 0x86, 0x73, 0x85, 0x2a, 0xc9, 0xff, 0x79, + 0xb4, 0x3a, 0x92, 0x7a, 0xa2, 0x87, 0x25, 0x17, 0xb2, 0x3f, 0xf1, 0x89, 0x5e, 0x62, 0xf1, 0x13, + 0x39, 0xb9, 0x34, 0x67, 0x38, 0x57, 0x9a, 0xd0, 0x27, 0x2d, 0x42, 0xdb, 0x1c, 0x93, 0x93, 0xb5, + 0xe5, 0x11, 0x82, 0x74, 0x1e, 0x1e, 0x3e, 0xa7, 0xdd, 0x45, 0x08, 0x05, 0x14, 0xb2, 0x38, 0xe9, + 0x5d, 0x84, 0xa1, 0x1c, 0x4c, 0x20, 0x46, 0x8a, 0x0c, 0x66, 0x0d, 0xe7, 0x0a, 0x1a, 0x1a, 0x96, + 0xad, 0x6e, 0x77, 0x3c, 0x23, 0x64, 0x5a, 0xe3, 0x3f, 0x10, 0x43, 0xc0, 0xc5, 0xc4, 0x8d, 0xff, + 0x21, 0x0c, 0x64, 0x0f, 0xc3, 0xf3, 0x49, 0x63, 0x09, 0x46, 0x68, 0x7b, 0x3c, 0x38, 0x8c, 0xda, + 0x20, 0x42, 0x36, 0x8e, 0xac, 0x41, 0xc4, 0x71, 0x30, 0x91, 0x9d, 0x93, 0x85, 0x32, 0x1e, 0xe6, + 0xc7, 0xdb, 0x26, 0xde, 0x9b, 0xce, 0x35, 0x91, 0x0e, 0xbb, 0x1c, 0x23, 0x63, 0x41, 0x23, 0x85, + 0x0b, 0xa2, 0x00, 0x0f, 0xd9, 0xe3, 0xf1, 0x51, 0x19, 0xcc, 0x11, 0x16, 0x1e, 0x21, 0x56, 0xc0, + 0x48, 0x8d, 0x8a, 0xad, 0xc1, 0xd1, 0x34, 0xaa, 0x04, 0x0e, 0x26, 0x72, 0x9f, 0x3f, 0xb2, 0xe3, + 0x46, 0x38, 0x3e, 0x1e, 0x87, 0xe0, 0xc8, 0xc6, 0xd8, 0x18, 0x8f, 0x90, 0x8f, 0x62, 0x8c, 0x1d, + 0xd1, 0x31, 0xf2, 0xe7, 0x87, 0xad, 0x68, 0x9c, 0x18, 0x1c, 0xa2, 0x29, 0x8c, 0x11, 0x86, 0x11, + 0x9b, 0xc2, 0x11, 0x21, 0xf1, 0xa7, 0x32, 0x00, 0x84, 0x81, 0x35, 0xe7, 0x32, 0xbe, 0x48, 0x73, + 0x0c, 0xdd, 0x59, 0xbf, 0x5b, 0xbd, 0x3c, 0xc4, 0xad, 0x3e, 0x65, 0x08, 0x97, 0xb4, 0x2b, 0x81, + 0x8c, 0x94, 0x51, 0x25, 0x27, 0xbe, 0x12, 0x98, 0x5c, 0x7e, 0xf6, 0x18, 0x7f, 0x99, 0x58, 0x73, + 0xd1, 0x01, 0xd3, 0x9f, 0x1d, 0x0b, 0xca, 0xcc, 0xec, 0x5f, 0xe6, 0x67, 0xff, 0x87, 0xc0, 0x76, + 0x54, 0x1b, 0x71, 0xd8, 0xc1, 0xd1, 0xec, 0x6d, 0xc4, 0xa3, 0x3b, 0x20, 0xfa, 0x03, 0x79, 0x70, + 0x9c, 0x76, 0x22, 0xdf, 0x09, 0x10, 0xa7, 0x3c, 0x87, 0xc7, 0x75, 0x92, 0x43, 0x50, 0x1e, 0xd7, + 0x82, 0x54, 0x9a, 0xa5, 0x4c, 0x01, 0xf6, 0x26, 0xb2, 0xba, 0x51, 0xd4, 0x1f, 0xec, 0x99, 0x76, + 0x47, 0x3c, 0xdc, 0xef, 0x10, 0xe0, 0x83, 0xb5, 0x46, 0x99, 0x5f, 0x6b, 0x1c, 0xb0, 0x32, 0x99, + 0x7a, 0xe7, 0x1a, 0x8b, 0x8c, 0xb0, 0x3b, 0xf1, 0x9d, 0xeb, 0xf8, 0xb2, 0xb3, 0x47, 0xe9, 0xbd, + 0x32, 0xc8, 0x37, 0x1d, 0xd7, 0xd7, 0x5e, 0x90, 0xa6, 0x75, 0x12, 0xc9, 0x47, 0x20, 0x05, 0xcf, + 0x6a, 0x19, 0xe4, 0x51, 0xe5, 0xe8, 0x8c, 0xe1, 0xb6, 0xe4, 0xa3, 0xce, 0xa6, 0x6f, 0x62, 0xaf, + 0x6e, 0x54, 0xfe, 0x62, 0x6b, 0xbf, 0x07, 0x0d, 0xfc, 0x71, 0xda, 0x78, 0x3a, 0x44, 0x7e, 0xcd, + 0xf8, 0x03, 0x18, 0x99, 0xc5, 0xd3, 0x89, 0x2d, 0x39, 0x7b, 0xdc, 0x1e, 0x3e, 0x4e, 0x7d, 0x5b, + 0x97, 0xad, 0x2e, 0xd4, 0x5e, 0x40, 0x5c, 0x46, 0xea, 0xe6, 0x2e, 0x14, 0x3f, 0x12, 0x93, 0xe8, + 0xda, 0x8a, 0xe3, 0xcb, 0xca, 0x51, 0x7c, 0xd9, 0xb4, 0x0d, 0x8a, 0x1c, 0x40, 0x27, 0x2c, 0x4d, + 0xba, 0x41, 0x25, 0x94, 0x3d, 0x91, 0x38, 0x9d, 0x27, 0x9a, 0xd0, 0x27, 0x46, 0x65, 0x23, 0xb8, + 0x22, 0xe9, 0xfb, 0xc7, 0x12, 0xb1, 0x33, 0xbc, 0x50, 0x47, 0xee, 0xbb, 0x81, 0xe9, 0x03, 0x2c, + 0x38, 0x6b, 0x3c, 0x38, 0xdf, 0x1b, 0x2f, 0x20, 0x9e, 0xc9, 0xb1, 0xc0, 0xf4, 0xf6, 0x10, 0xa6, + 0x75, 0x0e, 0xa6, 0xbb, 0x46, 0xe4, 0x22, 0x7b, 0xc0, 0x7e, 0xbc, 0x00, 0x8e, 0x93, 0x49, 0x7f, + 0xc9, 0xee, 0xd0, 0x08, 0xab, 0x6f, 0x96, 0x8e, 0x78, 0xb3, 0xed, 0x60, 0x08, 0x56, 0x2e, 0x96, + 0x73, 0xa1, 0x2f, 0x96, 0xb3, 0xba, 0x44, 0xc2, 0xb9, 0xa2, 0x4e, 0x14, 0xef, 0xb4, 0x0d, 0x0b, + 0x33, 0x81, 0x65, 0x8f, 0xbb, 0xdc, 0xf0, 0x3b, 0xfe, 0x1e, 0xd1, 0x29, 0xf1, 0x7b, 0x44, 0x7f, + 0x3b, 0xdd, 0xba, 0x1d, 0x2e, 0xba, 0x4f, 0xe0, 0x19, 0xdb, 0x4e, 0x29, 0x56, 0xf4, 0x04, 0xb8, + 0xfb, 0xcf, 0xe1, 0x4e, 0x16, 0x45, 0x10, 0x19, 0xd1, 0x9d, 0x0c, 0x13, 0x38, 0x4a, 0x77, 0xb2, + 0x61, 0x0c, 0x64, 0x8f, 0xe3, 0x6f, 0x17, 0xe8, 0x6e, 0x3e, 0x6e, 0x37, 0xda, 0x1f, 0x4b, 0x99, + 0x8f, 0xd2, 0xdf, 0xca, 0xa5, 0xf2, 0x7f, 0xc6, 0x7c, 0x25, 0x0f, 0xd3, 0x69, 0x3c, 0x9a, 0x93, + 0xc8, 0x4d, 0x60, 0xdd, 0x48, 0xc2, 0xbe, 0xe8, 0xe7, 0xad, 0x8e, 0xbf, 0x33, 0xa6, 0x13, 0x1d, + 0x57, 0x10, 0x2d, 0x1a, 0xaf, 0x9e, 0x3c, 0x68, 0xff, 0x92, 0x4b, 0x15, 0x42, 0x2a, 0x14, 0x09, + 0x66, 0x2b, 0x46, 0xc4, 0x29, 0x02, 0x3f, 0x25, 0xd2, 0x9b, 0xa0, 0x46, 0x9f, 0xb3, 0x3a, 0xd0, + 0x79, 0x04, 0x6a, 0x34, 0xe6, 0x6b, 0x7c, 0x1a, 0x9d, 0x44, 0xee, 0x3f, 0xa9, 0x46, 0x87, 0x22, + 0x19, 0x93, 0x46, 0x27, 0xd2, 0xcb, 0x5e, 0xc6, 0xaf, 0x9c, 0xa3, 0x13, 0xa9, 0x9a, 0x65, 0x5f, + 0xd2, 0xfe, 0xb1, 0x08, 0x94, 0x20, 0x8e, 0xb0, 0xbf, 0x43, 0x63, 0xc1, 0x7c, 0x48, 0xf8, 0x6e, + 0x94, 0x11, 0xe2, 0xbd, 0xf0, 0xe1, 0xa4, 0x0a, 0x07, 0xc2, 0x49, 0x95, 0xc0, 0xbc, 0x65, 0xfb, + 0xd0, 0xb5, 0xcd, 0xee, 0x72, 0xd7, 0xdc, 0xf6, 0x4e, 0x4f, 0x0d, 0xbc, 0xbc, 0xae, 0xca, 0xe4, + 0x31, 0xf8, 0x2f, 0xd8, 0x0b, 0x44, 0xa7, 0xf9, 0x0b, 0x44, 0x63, 0xa2, 0x5f, 0xcd, 0xc4, 0x47, + 0xbf, 0x0a, 0xa3, 0x5b, 0x81, 0xe1, 0xc1, 0xb1, 0x45, 0x6d, 0xe3, 0x94, 0xe1, 0xfe, 0x6e, 0x13, + 0x8c, 0xc2, 0x16, 0x86, 0x7e, 0x7c, 0x8d, 0x9c, 0x6a, 0x75, 0x0f, 0x29, 0xc2, 0x62, 0xbf, 0x12, + 0xa4, 0xb6, 0x50, 0xd9, 0xca, 0xcb, 0x7d, 0x95, 0x0f, 0x4d, 0x9e, 0xbc, 0x80, 0xc9, 0xc3, 0x2a, + 0x55, 0x41, 0xf4, 0x4e, 0x57, 0xf1, 0xc5, 0x42, 0x91, 0xda, 0x4e, 0xe0, 0x34, 0x52, 0x01, 0x9c, + 0x08, 0xa2, 0xdd, 0xf6, 0x7a, 0xd0, 0x74, 0x4d, 0xbb, 0x0d, 0xb5, 0x4f, 0x48, 0xe3, 0x30, 0x7b, + 0x97, 0xc1, 0xb4, 0xd5, 0x76, 0xec, 0xa6, 0xf5, 0x9c, 0xe0, 0x72, 0xb9, 0xe4, 0x20, 0xeb, 0x58, + 0x22, 0x55, 0xfa, 0x85, 0x11, 0x7e, 0xab, 0x56, 0xc1, 0x4c, 0xdb, 0x74, 0x3b, 0x24, 0x08, 0x5f, + 0xa1, 0xef, 0x22, 0xa7, 0x58, 0x42, 0xe5, 0xe0, 0x13, 0x23, 0xfa, 0x5a, 0x6d, 0xf0, 0x42, 0x2c, + 0xf6, 0x45, 0xf3, 0x88, 0x25, 0x56, 0x89, 0x3e, 0xe2, 0x64, 0x8e, 0xa4, 0xe3, 0xc2, 0xae, 0x49, + 0x2e, 0x1d, 0x9f, 0x22, 0x77, 0x44, 0x87, 0x09, 0x69, 0x97, 0x07, 0x70, 0x51, 0x07, 0xd0, 0x98, + 0xf4, 0xf2, 0x80, 0x10, 0x17, 0xd9, 0x6b, 0xe6, 0xbb, 0x8a, 0x60, 0x9e, 0xf4, 0x6a, 0x54, 0x9c, + 0xda, 0x8b, 0x64, 0x50, 0x6c, 0x42, 0xff, 0x3e, 0xb8, 0xaf, 0x35, 0x0f, 0x3f, 0x26, 0x2b, 0x40, + 0xbe, 0x14, 0x06, 0x1c, 0x44, 0x7f, 0xd3, 0xee, 0xdb, 0x07, 0x7c, 0x2d, 0x12, 0x9e, 0x26, 0xbd, + 0x6f, 0x9f, 0x5c, 0x7c, 0xf6, 0xf8, 0xfc, 0x84, 0x0c, 0xe4, 0x52, 0xa7, 0xa3, 0xb5, 0x0f, 0x0f, + 0xc5, 0xf5, 0x60, 0x36, 0x68, 0x33, 0x51, 0x0c, 0x48, 0x36, 0x29, 0xed, 0x22, 0x68, 0x28, 0x9b, + 0x52, 0x67, 0xe2, 0xbb, 0x0a, 0x09, 0x65, 0x67, 0x0f, 0xca, 0x17, 0xa6, 0x68, 0xa3, 0x59, 0x72, + 0x9c, 0x4b, 0xf8, 0xa8, 0xcc, 0x2f, 0xca, 0xa0, 0xb0, 0x0c, 0xfd, 0xf6, 0x8e, 0xe6, 0x8d, 0xa5, + 0xcd, 0xf4, 0xdd, 0x7b, 0x3e, 0x24, 0x28, 0x67, 0xda, 0xe8, 0xcf, 0x01, 0xdb, 0x8b, 0x98, 0xe5, + 0x49, 0x47, 0x7f, 0x4e, 0x2c, 0x7d, 0x02, 0x87, 0xe0, 0xf2, 0x60, 0x21, 0x5c, 0x01, 0x23, 0x98, + 0xbd, 0x23, 0xf7, 0x88, 0x5b, 0x0f, 0x1d, 0x62, 0x37, 0x6b, 0xbf, 0x9f, 0x2e, 0xc4, 0x5a, 0x28, + 0x73, 0xbe, 0xe6, 0x19, 0x2f, 0x4c, 0xa6, 0x08, 0xbe, 0x26, 0xc6, 0xe0, 0x04, 0x56, 0x00, 0x64, + 0x30, 0x8d, 0x19, 0xaa, 0x58, 0x97, 0xb1, 0xeb, 0x21, 0xb7, 0x50, 0xf9, 0xdc, 0xb1, 0x2c, 0x54, + 0xde, 0xc5, 0x2f, 0x54, 0x0a, 0x46, 0x4c, 0x0e, 0xd6, 0x29, 0x53, 0xfa, 0xe2, 0xa0, 0xef, 0xc7, + 0xbe, 0x4c, 0x99, 0xc2, 0x17, 0x67, 0x48, 0xf9, 0x13, 0x70, 0x3d, 0xbc, 0x9f, 0x76, 0xd6, 0xc1, + 0x86, 0xac, 0xf6, 0x3f, 0x4f, 0x80, 0xfc, 0x39, 0xf4, 0xe7, 0x1f, 0xa2, 0x1b, 0xb5, 0x5e, 0x3e, + 0x86, 0xe0, 0x0e, 0xcf, 0x00, 0x79, 0x44, 0x9f, 0x4e, 0x7b, 0x6e, 0x11, 0xdb, 0x1d, 0x46, 0x8c, + 0x18, 0xf8, 0x3b, 0xf5, 0x14, 0x28, 0x7a, 0xce, 0x9e, 0xdb, 0x46, 0xe6, 0x37, 0xd2, 0x18, 0xfa, + 0x94, 0x36, 0xa8, 0x29, 0x47, 0x7a, 0x71, 0x7c, 0x2e, 0xa7, 0xcc, 0x05, 0x4b, 0x32, 0x77, 0xc1, + 0x52, 0x8a, 0xfd, 0x07, 0x01, 0xde, 0xb2, 0xd7, 0x88, 0x3f, 0xc6, 0x77, 0x0d, 0x76, 0xc6, 0x05, + 0x7b, 0x8c, 0x58, 0x0e, 0xab, 0x0e, 0x69, 0x1d, 0xc6, 0x79, 0xd1, 0x86, 0x71, 0xe4, 0x27, 0xea, + 0x30, 0x2e, 0xc0, 0xc3, 0x44, 0x4e, 0xb9, 0x17, 0xa9, 0x93, 0xeb, 0x85, 0x71, 0xa2, 0x9b, 0xe7, + 0x94, 0xfe, 0x50, 0xe8, 0x8c, 0xd1, 0xf9, 0x75, 0x64, 0x74, 0x8e, 0xc8, 0xfd, 0xf5, 0xd7, 0x65, + 0x1c, 0x49, 0x33, 0x30, 0x82, 0xc4, 0x2f, 0x4a, 0x4a, 0x0d, 0x11, 0x1a, 0x83, 0xb9, 0x38, 0xd2, + 0xf3, 0xa3, 0x87, 0x16, 0xe7, 0x45, 0xc7, 0xf0, 0x3f, 0xe9, 0xd0, 0xe2, 0xa2, 0x8c, 0x64, 0x0f, + 0xe4, 0x2f, 0x90, 0x8b, 0xc9, 0x4a, 0x6d, 0xdf, 0xba, 0x3c, 0xe6, 0x96, 0xc6, 0x0f, 0x2f, 0x29, + 0xa3, 0x09, 0x1f, 0x90, 0x10, 0xe1, 0x70, 0xd2, 0xd1, 0x84, 0xc5, 0xd8, 0xc8, 0x1e, 0xa6, 0xaf, + 0x16, 0x91, 0xf4, 0xe8, 0xda, 0xce, 0x1b, 0xe8, 0x6a, 0x02, 0x3c, 0x3c, 0x5a, 0x67, 0xc1, 0x1c, + 0xb3, 0x74, 0x10, 0x5c, 0x78, 0xc3, 0xa5, 0xa5, 0x3d, 0x28, 0x1f, 0x8a, 0x6c, 0xec, 0x0b, 0x0b, + 0x29, 0x16, 0x8c, 0x45, 0x98, 0x98, 0xc8, 0x7d, 0x72, 0xc1, 0x18, 0x36, 0x21, 0xac, 0x3e, 0xc4, + 0x62, 0xd5, 0xe0, 0xb1, 0xba, 0x43, 0x44, 0x4c, 0x62, 0x63, 0x9a, 0xd0, 0xbc, 0xf1, 0x9d, 0x21, + 0x5c, 0x06, 0x07, 0xd7, 0x33, 0x46, 0xe6, 0x23, 0x7b, 0xc4, 0x7e, 0x8e, 0x74, 0x87, 0x4d, 0x62, + 0xb2, 0x8f, 0xa7, 0x3b, 0xa4, 0xb3, 0x01, 0x99, 0x9b, 0x0d, 0xa4, 0xf4, 0xd7, 0x8f, 0xdc, 0x50, + 0x03, 0xe6, 0x86, 0x41, 0x94, 0x1f, 0xb3, 0xbf, 0xfe, 0x50, 0x0e, 0xb2, 0x07, 0xe7, 0xeb, 0x32, + 0x00, 0x2b, 0xae, 0xb3, 0xd7, 0x6b, 0xb8, 0x1d, 0xe8, 0x6a, 0x7f, 0x16, 0x4d, 0x00, 0x7e, 0x72, + 0x0c, 0x13, 0x80, 0x75, 0x00, 0xb6, 0x43, 0xe2, 0x54, 0xc3, 0x9f, 0x28, 0x66, 0xee, 0x47, 0x4c, + 0x19, 0x0c, 0x0d, 0xfe, 0xca, 0xda, 0x67, 0xf1, 0x18, 0x27, 0xf5, 0x59, 0x11, 0xb9, 0x71, 0x4e, + 0x00, 0xde, 0x1d, 0x62, 0xdd, 0xe2, 0xb0, 0x7e, 0xe6, 0x21, 0x38, 0xc9, 0x1e, 0xf3, 0xbf, 0x9f, + 0x02, 0xb3, 0x64, 0xbb, 0x8f, 0xc8, 0xf4, 0xaf, 0x23, 0xd0, 0x7f, 0x76, 0x0c, 0xa0, 0x6f, 0x80, + 0x39, 0x27, 0xa2, 0x4e, 0xfa, 0x54, 0x76, 0x01, 0x26, 0x11, 0x76, 0x86, 0x2f, 0x83, 0x23, 0xa3, + 0x7d, 0x8c, 0x45, 0xde, 0xe0, 0x91, 0xbf, 0x2b, 0x41, 0xde, 0x0c, 0xc5, 0x71, 0x42, 0xff, 0x9e, + 0x10, 0xfa, 0x0d, 0x0e, 0xfa, 0xd2, 0x61, 0x58, 0x99, 0x40, 0xb8, 0x7e, 0x19, 0xe4, 0xf1, 0xe9, + 0xba, 0xb7, 0x64, 0x38, 0xbf, 0x3f, 0x0d, 0xa6, 0x70, 0x93, 0x0d, 0xe7, 0x1d, 0xc1, 0x23, 0x7a, + 0x63, 0x6e, 0xf9, 0xd0, 0x0d, 0x57, 0x6e, 0x83, 0x47, 0xc4, 0x43, 0xe0, 0xd5, 0xec, 0x9d, 0x2e, + 0x92, 0x8d, 0xcc, 0x30, 0x61, 0xe4, 0x49, 0x09, 0x2b, 0xf1, 0xb1, 0x9d, 0xb7, 0x1b, 0x65, 0x52, + 0x32, 0x84, 0x91, 0xec, 0x81, 0xff, 0x62, 0x1e, 0x9c, 0x26, 0xab, 0x4a, 0xcb, 0xae, 0xb3, 0xdb, + 0x77, 0x3b, 0x96, 0x75, 0x78, 0x5d, 0xb8, 0x09, 0x2c, 0xf8, 0x9c, 0x3f, 0x37, 0xd5, 0x89, 0xbe, + 0x54, 0xed, 0x77, 0x58, 0x9f, 0x8c, 0xfb, 0x79, 0x24, 0x97, 0x12, 0x04, 0x18, 0xc7, 0x7b, 0xea, + 0x85, 0x7a, 0x41, 0x46, 0x99, 0x45, 0x2a, 0x79, 0xa4, 0x35, 0xcb, 0x50, 0xa7, 0x0a, 0x22, 0x3a, + 0xf5, 0xc1, 0x50, 0xa7, 0xfe, 0x0b, 0xa7, 0x53, 0x2b, 0x87, 0x17, 0xc9, 0x04, 0x56, 0x2e, 0x16, + 0x40, 0x71, 0xd9, 0xea, 0xfa, 0xd0, 0xd5, 0xbe, 0x4c, 0xe7, 0x51, 0xaf, 0xce, 0xb0, 0x7b, 0xa9, + 0x80, 0xe2, 0x16, 0x2e, 0x8d, 0x1a, 0x64, 0xb7, 0x8a, 0x61, 0x43, 0x38, 0x34, 0xe8, 0xb7, 0x69, + 0x63, 0xc7, 0xf5, 0x91, 0x19, 0xdb, 0x04, 0x2c, 0x45, 0xec, 0xb8, 0xe1, 0x2c, 0x4c, 0xe4, 0xda, + 0xa4, 0xa2, 0x01, 0x77, 0xd1, 0x08, 0x72, 0x29, 0x3b, 0x84, 0x15, 0x20, 0x5b, 0x1d, 0x0f, 0x37, + 0xbd, 0x19, 0x03, 0xfd, 0x4d, 0xeb, 0xc9, 0xd2, 0x2f, 0x2a, 0xc2, 0xf2, 0xa4, 0x3d, 0x59, 0x84, + 0xb8, 0xc8, 0x1e, 0xb3, 0x6f, 0x61, 0x37, 0xc6, 0x5e, 0xd7, 0x6c, 0x43, 0xc4, 0x7d, 0x66, 0xa8, + 0x2d, 0x00, 0xc9, 0x0a, 0x46, 0x7c, 0xc9, 0x62, 0xdb, 0x69, 0xe1, 0x10, 0xed, 0x74, 0xd4, 0x45, + 0xae, 0x50, 0xe6, 0xb8, 0xe2, 0x47, 0xb6, 0xc8, 0x95, 0xc8, 0xc6, 0x04, 0x2e, 0xc5, 0x0c, 0x8e, + 0x79, 0x4e, 0xb4, 0xb5, 0x8e, 0xba, 0x05, 0x40, 0x85, 0x35, 0xb6, 0x23, 0x9d, 0xa3, 0x6c, 0x01, + 0xc4, 0xf3, 0x30, 0x01, 0xb4, 0x16, 0x28, 0x5a, 0x9f, 0xa7, 0xc3, 0x68, 0xc6, 0xbb, 0x70, 0x9e, + 0xe3, 0xfa, 0xe9, 0x76, 0xe1, 0x10, 0x77, 0x06, 0xfe, 0x2e, 0xed, 0xb1, 0x20, 0xfe, 0xd4, 0xef, + 0xb8, 0x86, 0xcf, 0x14, 0xc7, 0x82, 0x86, 0x31, 0x90, 0x3d, 0xbc, 0x6f, 0x3d, 0xa2, 0xc1, 0x73, + 0xd4, 0xe6, 0x48, 0xdb, 0xc0, 0xd8, 0x86, 0xce, 0x51, 0x9a, 0x63, 0x3c, 0x0f, 0xd9, 0xe3, 0xf5, + 0x77, 0xcc, 0xc0, 0xf9, 0xa6, 0x09, 0x0e, 0x9c, 0x41, 0xcb, 0x2c, 0x8c, 0xd8, 0x32, 0x47, 0xdd, + 0x5d, 0xa0, 0xb2, 0x1e, 0xdf, 0x80, 0x39, 0xca, 0xee, 0x42, 0x02, 0x13, 0xd9, 0x23, 0xfe, 0x66, + 0x19, 0x14, 0x9a, 0x93, 0x1f, 0x2f, 0x47, 0x9d, 0x8b, 0x60, 0x59, 0x35, 0xc7, 0x36, 0x5c, 0x8e, + 0x32, 0x17, 0x89, 0x65, 0x61, 0x02, 0x61, 0xe1, 0x8f, 0x83, 0x39, 0x3c, 0xe1, 0x0e, 0x36, 0xf1, + 0xfe, 0x8e, 0x8e, 0x9a, 0xaf, 0xcf, 0xb0, 0xad, 0xde, 0x0b, 0xa6, 0x83, 0xdd, 0x21, 0x3a, 0x72, + 0x2e, 0x8a, 0xb5, 0xcf, 0x80, 0x4b, 0x23, 0xfc, 0xfe, 0x50, 0x5b, 0xed, 0x63, 0xdf, 0x09, 0x1c, + 0x75, 0xab, 0xfd, 0x48, 0x77, 0x03, 0x7f, 0x3b, 0x1a, 0x51, 0xff, 0x5b, 0x76, 0x98, 0xf7, 0xef, + 0x12, 0xe6, 0x07, 0xec, 0x12, 0x7e, 0x82, 0xc5, 0xb2, 0xc9, 0x63, 0x79, 0xb7, 0xa8, 0x08, 0xc7, + 0x38, 0xd6, 0xbe, 0x37, 0x84, 0xf3, 0x1c, 0x07, 0xe7, 0xd2, 0xa1, 0x78, 0x99, 0xc0, 0xb1, 0xbc, + 0x7c, 0x34, 0xe6, 0x7e, 0x32, 0xc3, 0x76, 0xdc, 0xe7, 0xf3, 0x9f, 0x3f, 0xe0, 0xf3, 0xcf, 0xb5, + 0xf4, 0xc2, 0x21, 0x5b, 0xfa, 0x27, 0x59, 0xed, 0x68, 0xf1, 0xda, 0xf1, 0x0c, 0x71, 0x44, 0xc6, + 0x37, 0x32, 0xbf, 0x2f, 0x54, 0x8f, 0xf3, 0x9c, 0x7a, 0x94, 0x0f, 0xc7, 0x4c, 0xf6, 0xfa, 0xf1, + 0x1b, 0xc1, 0x84, 0xf6, 0x88, 0xdb, 0xfb, 0xa8, 0x1b, 0x91, 0x9c, 0x10, 0xc7, 0x36, 0x72, 0x8f, + 0xb2, 0x11, 0x39, 0x8c, 0x93, 0x09, 0x44, 0x0a, 0x9b, 0x07, 0xb3, 0x98, 0xa7, 0xf3, 0x56, 0x67, + 0x1b, 0xfa, 0xda, 0x6b, 0x88, 0x07, 0x5c, 0x10, 0x97, 0x71, 0x4c, 0xc1, 0x73, 0xe2, 0x4e, 0x63, + 0xa6, 0xf5, 0x17, 0x20, 0x4c, 0x2e, 0x32, 0x0c, 0x4e, 0x3a, 0xbe, 0xdf, 0x50, 0x0e, 0xb2, 0x87, + 0xec, 0x63, 0xc4, 0x99, 0xa3, 0x66, 0xee, 0x3b, 0x7b, 0xbe, 0xf6, 0xd0, 0x18, 0x3a, 0xe8, 0x25, + 0x50, 0xec, 0x62, 0x6a, 0xd4, 0xe9, 0x3f, 0x79, 0xba, 0x43, 0x45, 0x40, 0xca, 0x37, 0xe8, 0x97, + 0x69, 0x3d, 0xff, 0x23, 0x39, 0x12, 0x3a, 0x93, 0xf6, 0xfc, 0x1f, 0x52, 0xfe, 0x44, 0x6e, 0x80, + 0x99, 0x46, 0xa5, 0x5b, 0xbb, 0x96, 0x3f, 0xa6, 0xf8, 0x02, 0x5d, 0x44, 0x2b, 0x88, 0x2f, 0x80, + 0x1f, 0xd2, 0x9e, 0x67, 0x64, 0xa4, 0x82, 0x3e, 0x9f, 0xf4, 0x79, 0xc6, 0xe4, 0xe2, 0xb3, 0xc7, + 0xe4, 0xa7, 0x49, 0xcb, 0x3a, 0x47, 0x5c, 0x3b, 0x33, 0xf4, 0x1a, 0x1d, 0xb9, 0xb1, 0x10, 0xd6, + 0x8e, 0xae, 0xb1, 0x0c, 0x2c, 0x3f, 0x7b, 0x60, 0x7e, 0xf1, 0xbb, 0x41, 0xa1, 0x02, 0x2f, 0xee, + 0x6d, 0x6b, 0x77, 0x81, 0xe9, 0x96, 0x0b, 0x61, 0xd5, 0xde, 0x72, 0x90, 0x74, 0x7d, 0xf4, 0x3f, + 0x80, 0x84, 0x3e, 0x21, 0x3c, 0x76, 0xa0, 0xd9, 0x89, 0x4e, 0x37, 0x05, 0x8f, 0xda, 0xcb, 0x25, + 0x90, 0x6f, 0xfa, 0xa6, 0xaf, 0xcd, 0x84, 0xd8, 0x6a, 0x0f, 0xb1, 0x58, 0xdc, 0xc5, 0x63, 0x71, + 0x13, 0x27, 0x0b, 0xcc, 0xc1, 0x22, 0xfa, 0x3e, 0x06, 0x00, 0x0d, 0x4c, 0x3f, 0xe0, 0x39, 0x36, + 0xca, 0x11, 0x1c, 0xc0, 0x0b, 0x9e, 0xb5, 0x57, 0x85, 0xe2, 0xbe, 0x87, 0x13, 0xf7, 0xe3, 0xc5, + 0x8a, 0x98, 0xc0, 0x4a, 0x9b, 0x04, 0x66, 0x90, 0x68, 0x57, 0xa1, 0xd9, 0xf1, 0xb4, 0xef, 0x8a, + 0x94, 0x3f, 0x46, 0xcc, 0xda, 0x87, 0x85, 0x43, 0x45, 0x92, 0x5a, 0x85, 0xc4, 0xe3, 0xfd, 0x05, + 0x82, 0x50, 0x19, 0x12, 0x1f, 0x2a, 0xe3, 0x36, 0x90, 0xb7, 0xec, 0x2d, 0x87, 0x7a, 0xaf, 0x3d, + 0x3a, 0x86, 0x36, 0xd2, 0x09, 0x03, 0x67, 0x14, 0x8c, 0x23, 0x99, 0xcc, 0xd6, 0x44, 0xae, 0x64, + 0xcb, 0xa3, 0xd2, 0xb5, 0xff, 0x63, 0xa8, 0xb0, 0x55, 0x15, 0xe4, 0x7b, 0xa6, 0xbf, 0x43, 0x8b, + 0xc6, 0xff, 0x91, 0x8d, 0xbc, 0x67, 0x9b, 0xb6, 0x63, 0xef, 0xef, 0x5a, 0xcf, 0x09, 0x6f, 0x7e, + 0xe5, 0xd2, 0x10, 0xe7, 0xdb, 0xd0, 0x86, 0xae, 0xe9, 0xc3, 0xe6, 0xe5, 0x6d, 0x3c, 0xc7, 0x9a, + 0x36, 0xd8, 0xa4, 0xd4, 0xfa, 0x8f, 0x38, 0x8e, 0xd7, 0xff, 0x2d, 0xab, 0x0b, 0x71, 0x1c, 0x21, + 0xaa, 0xff, 0xc1, 0x73, 0x2a, 0xfd, 0x1f, 0x50, 0x44, 0xf6, 0x68, 0xfc, 0xab, 0x04, 0xe6, 0x9a, + 0x48, 0xe1, 0x9a, 0x7b, 0xbb, 0xbb, 0xa6, 0xbb, 0xaf, 0xdd, 0x10, 0xa1, 0xc2, 0xa8, 0x66, 0x8e, + 0x53, 0x4d, 0xed, 0xd7, 0x85, 0x2f, 0x3d, 0xa6, 0x4d, 0x9b, 0x29, 0x21, 0x75, 0x3b, 0x78, 0x12, + 0x28, 0x20, 0xf5, 0x0e, 0xfc, 0xf9, 0x12, 0x1b, 0x02, 0xc9, 0x29, 0x18, 0x6f, 0x69, 0x28, 0x6f, + 0x13, 0x88, 0xf5, 0x20, 0x81, 0xe3, 0x4d, 0xdf, 0x6c, 0x5f, 0x5a, 0x71, 0x5c, 0x67, 0xcf, 0xb7, + 0x6c, 0xe8, 0x69, 0x8f, 0x89, 0x10, 0x08, 0xf4, 0x3f, 0x17, 0xe9, 0xbf, 0xf6, 0xef, 0x39, 0xd1, + 0x51, 0x34, 0xec, 0x56, 0x59, 0xf2, 0x31, 0xe1, 0x93, 0xc4, 0xc6, 0x45, 0x11, 0x8a, 0xd9, 0x0b, + 0xed, 0x4d, 0x32, 0x50, 0xf4, 0x07, 0x7b, 0x8e, 0xeb, 0xd7, 0x9c, 0xb6, 0xd9, 0xf5, 0x7c, 0xc7, + 0x85, 0x5a, 0x23, 0x51, 0x6a, 0xa8, 0x87, 0xe9, 0x38, 0xed, 0x68, 0x70, 0xa4, 0x4f, 0xac, 0xda, + 0xc9, 0xbc, 0x8e, 0x7f, 0x4c, 0x78, 0x97, 0x91, 0x48, 0xa5, 0x9f, 0xa3, 0x18, 0x3d, 0x1f, 0xd4, + 0xa5, 0xa5, 0x73, 0xc5, 0x17, 0xdb, 0x79, 0x14, 0x62, 0x6a, 0x02, 0x4b, 0xe5, 0x12, 0x98, 0x6f, + 0xee, 0x5d, 0x0c, 0x89, 0x78, 0xac, 0x11, 0xf2, 0x5a, 0xe1, 0x18, 0x09, 0x54, 0xf1, 0x58, 0x42, + 0x31, 0xf2, 0xbd, 0x11, 0xcc, 0x7b, 0x6c, 0x36, 0x8a, 0x37, 0x9f, 0x28, 0x18, 0x1b, 0x61, 0x78, + 0xa9, 0xd9, 0x0b, 0xf0, 0x7d, 0x12, 0x98, 0x6f, 0xf4, 0xa0, 0x0d, 0x3b, 0xc4, 0xc7, 0x8e, 0x13, + 0xe0, 0xcb, 0x53, 0x0a, 0x90, 0x23, 0x14, 0x23, 0xc0, 0xc8, 0x1f, 0xb6, 0x12, 0x08, 0x2f, 0x4a, + 0x48, 0x25, 0xb8, 0xa4, 0xd2, 0xb2, 0x17, 0xdc, 0x97, 0x24, 0x30, 0x6b, 0xec, 0xd9, 0xeb, 0xae, + 0x83, 0x46, 0x63, 0x57, 0xbb, 0x3b, 0xea, 0x20, 0x6e, 0x05, 0x27, 0x3a, 0x7b, 0x2e, 0x5e, 0x7f, + 0xaa, 0xda, 0x4d, 0xd8, 0x76, 0xec, 0x8e, 0x87, 0xeb, 0x51, 0x30, 0x0e, 0xbe, 0xb8, 0x33, 0xff, + 0x82, 0xbf, 0x94, 0x73, 0xda, 0x8b, 0x84, 0x03, 0xb1, 0x90, 0xca, 0x33, 0x45, 0x8b, 0xf7, 0x04, + 0x82, 0xe1, 0x56, 0x86, 0x95, 0x90, 0xbd, 0x70, 0x3f, 0x2f, 0x01, 0xb5, 0xd4, 0x6e, 0x3b, 0x7b, + 0xb6, 0xdf, 0x84, 0x5d, 0xd8, 0xf6, 0x5b, 0xae, 0xd9, 0x86, 0xac, 0xfd, 0xac, 0x00, 0xb9, 0x63, + 0xb9, 0xb4, 0x0f, 0x46, 0x7f, 0xa9, 0x1c, 0x5f, 0x2e, 0xbc, 0xe3, 0x48, 0x6a, 0x79, 0xb0, 0x94, + 0x14, 0xe2, 0x14, 0xdb, 0x57, 0x14, 0x2c, 0x28, 0x7b, 0xa9, 0x7e, 0x52, 0x02, 0x33, 0x41, 0x8f, + 0xbd, 0x2d, 0x22, 0xcc, 0x9f, 0x4e, 0x39, 0x19, 0x09, 0x89, 0xa7, 0x90, 0xe1, 0xbb, 0x52, 0xcc, + 0x2a, 0xe2, 0xe8, 0xa7, 0x13, 0x5d, 0x29, 0xbd, 0xe8, 0xd0, 0x63, 0xbd, 0xb1, 0xb9, 0xdc, 0xa8, + 0x55, 0x74, 0x43, 0x91, 0xb5, 0x2f, 0x4b, 0x20, 0xbf, 0x6e, 0xd9, 0xdb, 0x6c, 0xbc, 0xac, 0x93, + 0xc8, 0x8e, 0xec, 0xc0, 0x07, 0x69, 0x4b, 0x27, 0x0f, 0xea, 0xed, 0xe0, 0xa4, 0xbd, 0xb7, 0x7b, + 0x11, 0xba, 0x8d, 0x2d, 0x3c, 0xca, 0x7a, 0x2d, 0xa7, 0x09, 0x6d, 0x62, 0x84, 0x16, 0x8c, 0x81, + 0xef, 0x78, 0x13, 0x4c, 0x60, 0xf2, 0x80, 0x38, 0x89, 0x91, 0x78, 0xc8, 0x94, 0xc4, 0x30, 0x95, + 0x6a, 0xda, 0x30, 0x80, 0x78, 0xf6, 0x9a, 0xfa, 0x9b, 0x05, 0x70, 0x75, 0xc9, 0xde, 0xc7, 0x36, + 0x05, 0xe9, 0xe0, 0xcb, 0x3b, 0xa6, 0xbd, 0x0d, 0xf1, 0x00, 0x11, 0x4a, 0x9c, 0x0d, 0x20, 0x9f, + 0xe3, 0x03, 0xc8, 0xab, 0x06, 0x98, 0x72, 0xdc, 0x0e, 0x74, 0x97, 0xf6, 0x31, 0x4f, 0xfd, 0xcb, + 0xce, 0xb4, 0x4d, 0x0e, 0x2a, 0x62, 0x91, 0x92, 0x5f, 0x6c, 0x90, 0xef, 0x8d, 0x80, 0xd0, 0xd9, + 0x5b, 0xc1, 0x14, 0x4d, 0x53, 0xe7, 0xc0, 0x74, 0xc3, 0xa8, 0xe8, 0xc6, 0x66, 0xb5, 0xa2, 0x1c, + 0x53, 0xaf, 0x02, 0xc7, 0xab, 0x2d, 0xdd, 0x28, 0xb5, 0xaa, 0x8d, 0xfa, 0x26, 0x4e, 0x57, 0x72, + 0xda, 0xf3, 0xf3, 0xa2, 0x9e, 0xbd, 0xc9, 0xcc, 0x0c, 0x82, 0xd5, 0x00, 0x53, 0x6d, 0x92, 0x01, + 0x0f, 0xa1, 0xb3, 0xa9, 0x6a, 0x47, 0x09, 0x92, 0x04, 0x23, 0x20, 0xa4, 0x9e, 0x01, 0xe0, 0x8a, + 0xeb, 0xd8, 0xdb, 0xd1, 0x99, 0xb6, 0x69, 0x83, 0x49, 0xd1, 0x1e, 0xca, 0x81, 0x22, 0xf9, 0x06, + 0x5f, 0x98, 0x81, 0xff, 0x45, 0x82, 0x0f, 0x9e, 0x91, 0xc5, 0x8b, 0xe5, 0x15, 0x4d, 0xb4, 0xe8, + 0x23, 0xd2, 0x45, 0x22, 0x03, 0x62, 0x09, 0xd3, 0xaa, 0xdc, 0x06, 0x8a, 0xe4, 0x5b, 0xea, 0x75, + 0x10, 0x1f, 0xfc, 0x92, 0x64, 0x13, 0xf4, 0x53, 0x16, 0x97, 0x69, 0xf6, 0xda, 0xfc, 0x11, 0x09, + 0x4c, 0xd7, 0xa1, 0x5f, 0xde, 0x81, 0xed, 0x4b, 0xda, 0xe3, 0xf8, 0x05, 0xd0, 0xae, 0x05, 0x6d, + 0xff, 0xc2, 0x6e, 0x37, 0x5c, 0x00, 0x0d, 0x12, 0xb4, 0x17, 0xb2, 0x9d, 0xef, 0x33, 0x79, 0xfd, + 0xb9, 0x65, 0x40, 0x5d, 0x83, 0x12, 0x62, 0x54, 0xe6, 0x14, 0x28, 0xba, 0xd0, 0xdb, 0xeb, 0x06, + 0x8b, 0x68, 0xf4, 0x49, 0x7b, 0x38, 0x14, 0x67, 0x99, 0x13, 0xe7, 0x6d, 0xe2, 0x45, 0x4c, 0x20, + 0x9a, 0x66, 0x1e, 0x4c, 0x55, 0x6d, 0xcb, 0xb7, 0xcc, 0xae, 0xf6, 0xa2, 0x3c, 0x98, 0x6f, 0x42, + 0x7f, 0xdd, 0x74, 0xcd, 0x5d, 0xe8, 0x43, 0xd7, 0xd3, 0xbe, 0xc9, 0xf7, 0x09, 0xbd, 0xae, 0xe9, + 0x6f, 0x39, 0xee, 0x6e, 0xa0, 0x9a, 0xc1, 0x33, 0x52, 0xcd, 0xcb, 0xd0, 0xf5, 0x22, 0xbe, 0x82, + 0x47, 0xf4, 0xe6, 0x8a, 0xe3, 0x5e, 0x42, 0x83, 0x20, 0x9d, 0xa6, 0xd1, 0x47, 0x44, 0xaf, 0xeb, + 0x6c, 0xd7, 0xe0, 0x65, 0x18, 0x04, 0xeb, 0x0a, 0x9f, 0xd1, 0x5c, 0xa0, 0xe3, 0xd4, 0x1d, 0x1f, + 0x75, 0xda, 0x35, 0x67, 0x9b, 0x44, 0x33, 0x9d, 0x36, 0xf8, 0xc4, 0x28, 0x97, 0x79, 0x19, 0xe2, + 0x5c, 0x45, 0x36, 0x17, 0x4d, 0x54, 0x17, 0x81, 0x1a, 0x7e, 0xd6, 0x82, 0x5d, 0xb8, 0x0b, 0x7d, + 0x77, 0x1f, 0x5f, 0x5a, 0x30, 0x6d, 0x0c, 0x78, 0x43, 0x07, 0x68, 0xf1, 0xc9, 0x3a, 0x95, 0xde, + 0x22, 0x27, 0xb9, 0x43, 0x4d, 0xd6, 0x45, 0x28, 0x4e, 0xe4, 0x52, 0x26, 0x19, 0x59, 0x33, 0xaf, + 0x90, 0x41, 0x1e, 0x0f, 0x9e, 0x6f, 0xce, 0x71, 0x2b, 0x4c, 0xbb, 0xd0, 0xf3, 0xcc, 0x6d, 0x18, + 0xac, 0x30, 0xd1, 0x47, 0xf5, 0x0e, 0x50, 0xe8, 0x62, 0x4c, 0xc9, 0xe0, 0x70, 0x03, 0x57, 0x33, + 0x64, 0x60, 0x20, 0x5a, 0xe1, 0x48, 0x80, 0xe1, 0x36, 0xc8, 0x17, 0x67, 0xef, 0x05, 0x05, 0x02, + 0xff, 0x0c, 0x28, 0x54, 0xf4, 0xa5, 0x8d, 0x15, 0xe5, 0x18, 0xfa, 0x1b, 0xf0, 0x37, 0x03, 0x0a, + 0xcb, 0xa5, 0x56, 0xa9, 0xa6, 0x48, 0xa8, 0x1e, 0xd5, 0xfa, 0x72, 0x43, 0x91, 0x51, 0xe2, 0x7a, + 0xa9, 0x5e, 0x2d, 0x2b, 0x79, 0x75, 0x16, 0x4c, 0x9d, 0x2f, 0x19, 0xf5, 0x6a, 0x7d, 0x45, 0x29, + 0x68, 0x5f, 0x65, 0xf1, 0xbb, 0x93, 0xc7, 0xef, 0xc6, 0x38, 0x9e, 0x06, 0x41, 0xf6, 0xf3, 0x21, + 0x64, 0x77, 0x73, 0x90, 0x7d, 0xb7, 0x08, 0x91, 0x09, 0xb8, 0x33, 0x15, 0xc1, 0xd4, 0xba, 0xeb, + 0xb4, 0xa1, 0xe7, 0x69, 0x3f, 0x23, 0x81, 0x62, 0xd9, 0xb4, 0xdb, 0xb0, 0xab, 0x5d, 0x13, 0x41, + 0x45, 0x5c, 0x45, 0x73, 0x81, 0xab, 0xa8, 0xf6, 0xf5, 0x9c, 0x68, 0xef, 0x47, 0xe9, 0x2e, 0x12, + 0x9a, 0x31, 0xf2, 0x11, 0xeb, 0xe5, 0x12, 0x49, 0x4d, 0xe0, 0xe2, 0x16, 0x09, 0xcc, 0xd0, 0xd5, + 0x80, 0x8b, 0x90, 0x9d, 0x87, 0x7f, 0x33, 0x27, 0x3a, 0x39, 0x0c, 0x6a, 0x10, 0x92, 0x89, 0x91, + 0x87, 0xd8, 0x44, 0x70, 0x18, 0xb5, 0x09, 0x6c, 0x1e, 0x4a, 0x60, 0x76, 0xc3, 0xf6, 0x06, 0x09, + 0x45, 0x3c, 0xca, 0x7b, 0x50, 0x0d, 0x86, 0xd0, 0xa1, 0xa2, 0xbc, 0x0f, 0xa7, 0x97, 0xbd, 0x60, + 0xbe, 0x99, 0x03, 0x27, 0x57, 0xa0, 0x0d, 0x5d, 0xab, 0x4d, 0x6a, 0x10, 0x48, 0xe2, 0x6e, 0x5e, + 0x12, 0x8f, 0xe3, 0x38, 0x1f, 0xf4, 0x05, 0x2f, 0x81, 0x57, 0x87, 0x12, 0x78, 0x26, 0x27, 0x81, + 0x5b, 0x05, 0xe9, 0x4c, 0xe0, 0xb6, 0xee, 0x19, 0x30, 0x57, 0x77, 0x7c, 0x6b, 0xcb, 0x6a, 0x13, + 0x1f, 0xb4, 0x9f, 0x93, 0x41, 0xbe, 0x66, 0x79, 0xbe, 0x56, 0x8a, 0xba, 0x93, 0xeb, 0xc1, 0xac, + 0x65, 0xb7, 0xbb, 0x7b, 0x1d, 0x68, 0x40, 0x93, 0xf4, 0x2b, 0xd3, 0x06, 0x9b, 0x14, 0x6d, 0xed, + 0x23, 0xb6, 0xe4, 0x60, 0x6b, 0xff, 0xb3, 0xc2, 0xcb, 0x30, 0x2c, 0x0b, 0x38, 0xdc, 0x61, 0x8c, + 0xdd, 0x55, 0x02, 0xf3, 0x36, 0x93, 0x35, 0x30, 0xd8, 0xfb, 0xc3, 0xdd, 0xb3, 0xe4, 0x0c, 0xfe, + 0x0b, 0xed, 0x03, 0x42, 0x8d, 0x75, 0x18, 0x43, 0xe9, 0x90, 0x59, 0x1e, 0x61, 0x92, 0xac, 0x82, + 0x85, 0x6a, 0xbd, 0xa5, 0x1b, 0xf5, 0x52, 0x8d, 0x66, 0x91, 0xb5, 0x7f, 0x95, 0x40, 0xc1, 0x80, + 0xbd, 0xee, 0x3e, 0x1b, 0xcf, 0x98, 0x3a, 0x8a, 0xe7, 0x42, 0x47, 0x71, 0x75, 0x19, 0x00, 0xb3, + 0x8d, 0x0a, 0xc6, 0x17, 0x3e, 0x49, 0x03, 0xa3, 0x64, 0x72, 0x15, 0x2c, 0x85, 0xb9, 0x0d, 0xe6, + 0x4b, 0xed, 0xc5, 0xc2, 0x3b, 0x47, 0x1c, 0x35, 0xcc, 0x61, 0x4c, 0x9f, 0xf0, 0x41, 0xa1, 0xcd, + 0x9e, 0xa1, 0xe4, 0x8e, 0x46, 0xfc, 0x5f, 0x91, 0x40, 0xbe, 0x85, 0x7a, 0x4b, 0xa6, 0xe3, 0xfc, + 0xcc, 0x68, 0x3a, 0x8e, 0xc8, 0xc4, 0xe8, 0xf8, 0x3d, 0x60, 0x8e, 0xd5, 0x58, 0xea, 0x2a, 0x91, + 0xa8, 0xe2, 0xdc, 0x07, 0xa3, 0x68, 0xf8, 0x00, 0x76, 0x8e, 0x46, 0xc4, 0x9f, 0x7a, 0x3c, 0x00, + 0x6b, 0x70, 0xf7, 0x22, 0x74, 0xbd, 0x1d, 0xab, 0xa7, 0xfd, 0x95, 0x0c, 0x66, 0x56, 0xa0, 0xdf, + 0xf4, 0x4d, 0x7f, 0xcf, 0xeb, 0xdb, 0xee, 0xb4, 0x9d, 0xb2, 0xd9, 0xde, 0x81, 0xb4, 0x3b, 0x0a, + 0x1e, 0xb5, 0xf7, 0xc8, 0xa2, 0xfe, 0x44, 0x51, 0x39, 0x8b, 0x61, 0x19, 0x31, 0x98, 0x3c, 0x01, + 0xe4, 0x3b, 0xa6, 0x6f, 0x52, 0x2c, 0xae, 0xe9, 0xc3, 0x22, 0x22, 0x64, 0xe0, 0x6c, 0xda, 0x3b, + 0x24, 0x11, 0x87, 0x22, 0x81, 0xf2, 0xd3, 0x81, 0xf0, 0x81, 0xdc, 0x08, 0x28, 0x9c, 0x00, 0xf3, + 0xf5, 0x46, 0x6b, 0xb3, 0xd6, 0x58, 0x59, 0xd1, 0x51, 0xaa, 0x22, 0xab, 0xa7, 0x80, 0xba, 0x5e, + 0xba, 0xb0, 0xa6, 0xd7, 0x5b, 0x9b, 0xf5, 0x46, 0x45, 0xa7, 0x5f, 0xe6, 0xd5, 0xe3, 0x60, 0xb6, + 0x5c, 0x2a, 0xaf, 0x06, 0x09, 0x05, 0xf5, 0x34, 0x38, 0xb9, 0xa6, 0xaf, 0x2d, 0xe9, 0x46, 0x73, + 0xb5, 0xba, 0xbe, 0x89, 0xc8, 0x2c, 0x37, 0x36, 0xea, 0x15, 0xa5, 0xa8, 0x6a, 0xe0, 0x14, 0xf3, + 0xe6, 0xbc, 0xd1, 0xa8, 0xaf, 0x6c, 0x36, 0x5b, 0xa5, 0x96, 0xae, 0x4c, 0xa9, 0x57, 0x81, 0xe3, + 0xe5, 0x52, 0x1d, 0x67, 0x2f, 0x37, 0xea, 0x75, 0xbd, 0xdc, 0x52, 0xa6, 0xb5, 0x7f, 0xcf, 0x83, + 0xd9, 0xaa, 0x57, 0x37, 0x77, 0xe1, 0x39, 0xb3, 0x6b, 0x75, 0xb4, 0x17, 0x31, 0x33, 0x8f, 0x1b, + 0xc1, 0xbc, 0x4b, 0xfe, 0xc2, 0x4e, 0xcb, 0x82, 0x04, 0xcd, 0x79, 0x83, 0x4f, 0x44, 0x73, 0x72, + 0x1b, 0x13, 0x08, 0xe6, 0xe4, 0xe4, 0x49, 0x5d, 0x02, 0x80, 0xfc, 0x6b, 0x45, 0x57, 0x8f, 0x9e, + 0xed, 0x6f, 0x4d, 0xe6, 0x2e, 0xf4, 0xa0, 0x7b, 0xd9, 0x6a, 0xc3, 0x20, 0xa7, 0xc1, 0x7c, 0xa5, + 0xfd, 0xa9, 0x2c, 0xba, 0xbf, 0xc8, 0x80, 0xca, 0x54, 0x27, 0xa6, 0x37, 0xfc, 0x11, 0x59, 0x64, + 0x77, 0x50, 0x88, 0x64, 0x3a, 0x4d, 0x79, 0xa9, 0x34, 0xda, 0xb2, 0x6d, 0xab, 0xd1, 0xd8, 0x6c, + 0xae, 0x36, 0x8c, 0x96, 0x22, 0xab, 0x73, 0x60, 0x1a, 0x3d, 0xd6, 0x1a, 0xf5, 0x15, 0x25, 0xaf, + 0x5e, 0x0d, 0x4e, 0xac, 0x96, 0x9a, 0x9b, 0xd5, 0xfa, 0xb9, 0x52, 0xad, 0x5a, 0xd9, 0x2c, 0xaf, + 0x96, 0x8c, 0xa6, 0x52, 0x50, 0xaf, 0x01, 0x57, 0xb7, 0xaa, 0xba, 0xb1, 0xb9, 0xac, 0x97, 0x5a, + 0x1b, 0x86, 0xde, 0xdc, 0xac, 0x37, 0x36, 0xeb, 0xa5, 0x35, 0x5d, 0x29, 0xa2, 0xe6, 0x8f, 0x5f, + 0x45, 0x6a, 0x33, 0x75, 0x50, 0x19, 0xa7, 0x63, 0x94, 0x71, 0xa6, 0x5f, 0x19, 0x01, 0xab, 0x56, + 0x86, 0xde, 0xd4, 0x8d, 0x73, 0xba, 0x32, 0x3b, 0x48, 0xd7, 0xe6, 0xd4, 0x93, 0x40, 0x41, 0x3c, + 0x6c, 0x56, 0x9b, 0x41, 0xce, 0x8a, 0x32, 0xaf, 0x7d, 0xb2, 0x08, 0x4e, 0x19, 0x70, 0xdb, 0xf2, + 0x7c, 0xe8, 0xae, 0x9b, 0xfb, 0xbb, 0xd0, 0xf6, 0x83, 0x4e, 0xfe, 0x9f, 0x52, 0x2b, 0xe3, 0x1a, + 0x98, 0xef, 0x11, 0x1a, 0x6b, 0xd0, 0xdf, 0x71, 0x3a, 0x74, 0x14, 0x7e, 0x5c, 0x6c, 0xcf, 0xb1, + 0xb8, 0xce, 0x66, 0x37, 0xf8, 0xaf, 0x19, 0xdd, 0x96, 0x13, 0x74, 0x3b, 0x3f, 0x8a, 0x6e, 0xab, + 0xd7, 0x82, 0x99, 0x3d, 0x0f, 0xba, 0xfa, 0xae, 0x69, 0x75, 0x83, 0xab, 0x23, 0xc3, 0x04, 0xed, + 0x9d, 0x79, 0xd1, 0x13, 0x2b, 0x4c, 0x5d, 0x06, 0x8b, 0x31, 0xa6, 0x6f, 0x3d, 0x03, 0x00, 0xad, + 0xec, 0x86, 0xdb, 0xa5, 0xca, 0xca, 0xa4, 0x20, 0xfe, 0x2e, 0x5a, 0xdd, 0xae, 0x65, 0x6f, 0x87, + 0xfb, 0xfe, 0x51, 0x82, 0xf6, 0x52, 0x59, 0xe4, 0x04, 0x4b, 0x5a, 0xde, 0xd2, 0xb5, 0xa6, 0x17, + 0x4b, 0x13, 0xee, 0x77, 0x0f, 0x36, 0x9d, 0xa2, 0xaa, 0x80, 0x39, 0x9c, 0x46, 0x5b, 0xa0, 0x32, + 0x85, 0xfa, 0xe0, 0x80, 0xdc, 0x9a, 0xde, 0x5a, 0x6d, 0x54, 0xc2, 0x77, 0xd3, 0x88, 0x24, 0x62, + 0xa6, 0x54, 0xbf, 0x80, 0x5b, 0xe3, 0x8c, 0xfa, 0x18, 0x70, 0x0d, 0xd3, 0x61, 0x97, 0x6a, 0x86, + 0x5e, 0xaa, 0x5c, 0xd8, 0xd4, 0xef, 0xaf, 0x36, 0x5b, 0x4d, 0xbe, 0x71, 0x05, 0xed, 0x68, 0x16, + 0xf1, 0xab, 0xaf, 0x95, 0xaa, 0x35, 0xda, 0xbf, 0x2f, 0x37, 0x8c, 0xb5, 0x52, 0x4b, 0x99, 0xd3, + 0x5e, 0x21, 0x03, 0x65, 0x05, 0xfa, 0xeb, 0x8e, 0xeb, 0x9b, 0xdd, 0x9a, 0x65, 0x5f, 0xda, 0x70, + 0xbb, 0xdc, 0x64, 0x53, 0x38, 0x4c, 0x07, 0x3f, 0x44, 0x72, 0x04, 0xe3, 0x77, 0xc4, 0x7b, 0x38, + 0x5b, 0xa4, 0x4c, 0x51, 0x82, 0xf6, 0x5c, 0x49, 0x64, 0xb9, 0x5b, 0xbc, 0xd4, 0x74, 0x7a, 0xf2, + 0xbc, 0x49, 0x8f, 0xcf, 0x03, 0x50, 0x2b, 0x6a, 0x2f, 0xc8, 0x83, 0xe9, 0x65, 0xcb, 0x36, 0xbb, + 0xd6, 0x73, 0xb8, 0xe8, 0x98, 0x51, 0x1f, 0x93, 0x4b, 0xe8, 0x63, 0xa4, 0x91, 0xc6, 0xcf, 0x9f, + 0x92, 0x45, 0x97, 0x17, 0x18, 0xd9, 0x07, 0x4c, 0xc6, 0x0c, 0x9e, 0xbf, 0x2a, 0x89, 0x2c, 0x2f, + 0x0c, 0xa7, 0x97, 0x0e, 0xc3, 0x4f, 0x7f, 0x67, 0xd8, 0x58, 0x7d, 0xed, 0x7b, 0x7a, 0x90, 0x2a, + 0xcc, 0x68, 0xbf, 0x27, 0x03, 0x6d, 0x05, 0xfa, 0xe7, 0xa0, 0x1b, 0x4e, 0x05, 0x70, 0xaf, 0x4f, + 0xed, 0x6d, 0xa6, 0xc9, 0xbe, 0x99, 0x05, 0xf0, 0x3c, 0x0f, 0x60, 0x29, 0xa1, 0xf1, 0xc4, 0x90, + 0x8e, 0x69, 0xbc, 0x55, 0x50, 0xf4, 0xf0, 0x7b, 0xaa, 0x66, 0x4f, 0x8a, 0x1f, 0x2e, 0x31, 0x31, + 0x96, 0x3a, 0x21, 0x6c, 0x50, 0x02, 0xda, 0xb7, 0xc2, 0x49, 0xd0, 0xf7, 0x71, 0xda, 0xb1, 0x7c, + 0x68, 0x66, 0xd3, 0xe9, 0x8b, 0x9b, 0xad, 0xba, 0x0c, 0xb2, 0x6f, 0xb4, 0x5f, 0x2d, 0x80, 0x93, + 0x83, 0xaa, 0xa3, 0xfd, 0x72, 0x8e, 0xdb, 0x61, 0x87, 0x78, 0xc8, 0xcf, 0xd1, 0x0d, 0x44, 0xf4, + 0xa0, 0x3e, 0x05, 0x5c, 0x1d, 0x2e, 0xc3, 0xb5, 0x9c, 0x3a, 0xbc, 0xe2, 0x75, 0xa1, 0xef, 0x43, + 0x17, 0x57, 0x6d, 0xda, 0x18, 0xfc, 0x52, 0x7d, 0x1a, 0x78, 0x94, 0x65, 0x7b, 0x56, 0x07, 0xba, + 0x2d, 0xab, 0xe7, 0x95, 0xec, 0x4e, 0x6b, 0xcf, 0x77, 0x5c, 0xcb, 0xa4, 0x17, 0x1d, 0x4e, 0x1b, + 0x71, 0xaf, 0xd5, 0x5b, 0x80, 0x62, 0x79, 0x0d, 0xfb, 0xa2, 0x63, 0xba, 0x1d, 0xcb, 0xde, 0xae, + 0x59, 0x9e, 0x4f, 0x3d, 0x80, 0x0f, 0xa4, 0x6b, 0x7f, 0x2d, 0x8b, 0x1e, 0xa6, 0x1b, 0x02, 0x6b, + 0x4c, 0x87, 0xf2, 0x42, 0x59, 0xe4, 0x78, 0x5c, 0x3a, 0xda, 0xe9, 0x94, 0xe5, 0xf9, 0x93, 0x36, + 0x24, 0x06, 0x8f, 0xe0, 0xb8, 0x6b, 0x21, 0xe9, 0x81, 0x21, 0x70, 0x4e, 0x37, 0xaa, 0xcb, 0x55, + 0x1d, 0x99, 0x15, 0x57, 0x83, 0x13, 0xd1, 0xbb, 0xca, 0x85, 0xcd, 0xa6, 0x5e, 0x6f, 0x29, 0xd3, + 0xa8, 0x9f, 0x22, 0xc9, 0xcb, 0xa5, 0x6a, 0x4d, 0xaf, 0x6c, 0xb6, 0x1a, 0xe8, 0x4d, 0x65, 0x34, + 0xd3, 0x42, 0x7b, 0x28, 0x0f, 0x8e, 0x63, 0xd9, 0xee, 0x63, 0xa9, 0x22, 0xa1, 0xf4, 0xf9, 0xda, + 0x86, 0x00, 0xcd, 0x10, 0xf1, 0x6a, 0xbf, 0x2b, 0x7c, 0x8f, 0x23, 0x03, 0x61, 0x5f, 0x19, 0x31, + 0x9a, 0xf1, 0x4d, 0x49, 0x24, 0x42, 0x85, 0x30, 0xd9, 0x74, 0x4a, 0xf1, 0xcf, 0x93, 0x1e, 0x71, + 0xe2, 0xc1, 0xc7, 0x56, 0x66, 0x19, 0x7f, 0x7c, 0xff, 0x7a, 0xd5, 0xc0, 0xea, 0xb0, 0x00, 0x00, + 0x4e, 0xc1, 0x1a, 0x44, 0xf4, 0x60, 0xe0, 0x78, 0x15, 0xa7, 0x07, 0xa5, 0x72, 0xab, 0x7a, 0x4e, + 0x8f, 0xd3, 0x83, 0xcf, 0xc9, 0x60, 0x7a, 0x05, 0xfa, 0x68, 0x4e, 0xe5, 0x69, 0x4f, 0x17, 0x58, + 0xff, 0x41, 0x66, 0x0c, 0xbe, 0xf8, 0x3e, 0x5c, 0x06, 0x20, 0x4f, 0xda, 0x0f, 0x8f, 0x62, 0x82, + 0x04, 0x45, 0xc7, 0x8c, 0x57, 0xdf, 0x0b, 0x0a, 0x3e, 0x7a, 0x4d, 0x97, 0xa1, 0xbf, 0x2b, 0x76, + 0xb8, 0x42, 0x44, 0x2a, 0xa6, 0x6f, 0x1a, 0x24, 0x3f, 0x33, 0x3a, 0x09, 0xda, 0x2e, 0x31, 0x8c, + 0x7c, 0x27, 0xda, 0x9f, 0x5f, 0x95, 0xc1, 0xd5, 0xa4, 0x7d, 0x94, 0x7a, 0xbd, 0xa6, 0xef, 0xb8, + 0xd0, 0x80, 0x6d, 0x68, 0xf5, 0xfc, 0xbe, 0xf5, 0x3d, 0x97, 0xa4, 0x06, 0x9b, 0xcd, 0xf4, 0x51, + 0x7b, 0x83, 0x2c, 0x1a, 0xe1, 0xf7, 0x40, 0x7b, 0xec, 0x2b, 0x2f, 0xa6, 0xb1, 0x7f, 0x42, 0x12, + 0x89, 0xd9, 0x9b, 0x92, 0x78, 0x3a, 0xa0, 0x3e, 0x7a, 0x04, 0x40, 0x05, 0x2b, 0x37, 0x86, 0x5e, + 0xd6, 0xab, 0xeb, 0x68, 0x10, 0xb8, 0x0e, 0x3c, 0x7a, 0x7d, 0xc3, 0x28, 0xaf, 0x96, 0x9a, 0xfa, + 0xa6, 0xa1, 0xaf, 0x54, 0x9b, 0x2d, 0xea, 0x94, 0x45, 0xbe, 0x9a, 0x52, 0xaf, 0x05, 0xa7, 0x9b, + 0x1b, 0x4b, 0xcd, 0xb2, 0x51, 0x5d, 0xc7, 0xe9, 0x86, 0x5e, 0xd7, 0xcf, 0xd3, 0xb7, 0xd3, 0xda, + 0x87, 0x15, 0x30, 0x8b, 0x26, 0x00, 0x4d, 0x32, 0x2f, 0xd0, 0xfe, 0x36, 0x0f, 0x66, 0x0d, 0xe8, + 0x39, 0xdd, 0xcb, 0x78, 0x8e, 0x30, 0xa9, 0xa9, 0xc7, 0x37, 0x64, 0xd1, 0xf3, 0xdb, 0x0c, 0xb3, + 0x8b, 0x0c, 0xa3, 0xf1, 0x13, 0x4d, 0xf3, 0xb2, 0x69, 0x75, 0xcd, 0x8b, 0xb4, 0xab, 0x99, 0x36, + 0xa2, 0x04, 0x75, 0x11, 0xa8, 0xce, 0x15, 0x1b, 0xba, 0xcd, 0xf6, 0x15, 0xdd, 0xdf, 0x29, 0x75, + 0x3a, 0x2e, 0xf4, 0x3c, 0xba, 0x7a, 0x31, 0xe0, 0x8d, 0x7a, 0x33, 0x38, 0x8e, 0x53, 0x99, 0xcc, + 0xc4, 0x41, 0xa6, 0x3f, 0x39, 0xcc, 0x59, 0xb2, 0xf7, 0x83, 0x9c, 0x05, 0x26, 0x67, 0x94, 0xcc, + 0x1e, 0x97, 0x28, 0xf2, 0xa7, 0x74, 0xae, 0x07, 0xb3, 0xb6, 0xb9, 0x0b, 0xf5, 0x07, 0x7b, 0x96, + 0x0b, 0x3d, 0xec, 0x18, 0x23, 0x1b, 0x6c, 0x92, 0xf6, 0xab, 0x42, 0xe7, 0xcd, 0xc5, 0x24, 0x96, + 0x4e, 0xf7, 0x57, 0x46, 0x50, 0xfd, 0x01, 0xfd, 0x8c, 0xac, 0x7d, 0x58, 0x06, 0x73, 0x94, 0xa9, + 0x92, 0xbd, 0x5f, 0xed, 0x68, 0xd7, 0x71, 0xc6, 0xaf, 0x89, 0xd2, 0x02, 0xe3, 0x17, 0x3f, 0x68, + 0x3f, 0x2a, 0x8b, 0xba, 0x3b, 0x0f, 0xa8, 0x38, 0x2e, 0x23, 0xde, 0x71, 0x74, 0xcb, 0xd9, 0xa3, + 0x8e, 0xaa, 0xd3, 0x06, 0x79, 0xc8, 0x72, 0x51, 0x4f, 0xfb, 0x35, 0x21, 0x67, 0x6a, 0xc1, 0x6a, + 0x1c, 0x11, 0x80, 0x9f, 0x92, 0xc1, 0x02, 0xe5, 0xaa, 0x49, 0xcf, 0xf9, 0x08, 0x1d, 0x78, 0xfb, + 0x71, 0x61, 0x43, 0x70, 0x40, 0xfd, 0x69, 0x49, 0x8f, 0x18, 0x20, 0x3f, 0x26, 0x14, 0x1c, 0x4d, + 0xb8, 0x22, 0x47, 0x04, 0xe5, 0xbb, 0xf2, 0x60, 0x76, 0xc3, 0x83, 0x2e, 0xf5, 0xdb, 0xd7, 0x1e, + 0xce, 0x03, 0x79, 0x05, 0x72, 0x1b, 0xa9, 0x2f, 0x11, 0xf6, 0xf0, 0x65, 0x2b, 0xcb, 0x10, 0x45, + 0x36, 0x52, 0x0c, 0x6c, 0x37, 0x81, 0x05, 0x22, 0xd2, 0x92, 0xef, 0x23, 0x23, 0x31, 0xf0, 0xa6, + 0xed, 0x4b, 0x1d, 0xc7, 0x56, 0x11, 0x2e, 0x0b, 0x65, 0x29, 0x23, 0x9e, 0x6a, 0x70, 0x8b, 0xcc, + 0x67, 0xf3, 0x46, 0x5f, 0x2a, 0xbe, 0x5c, 0xbf, 0x07, 0xc9, 0xf9, 0x15, 0x26, 0x73, 0x01, 0x67, + 0x1e, 0xf4, 0x4a, 0xfb, 0x5b, 0x21, 0x5f, 0x5d, 0x71, 0xe9, 0xa4, 0xd3, 0x85, 0xde, 0x78, 0x4c, + 0x92, 0x93, 0x40, 0x41, 0x39, 0xf0, 0xfe, 0x8b, 0xa1, 0x37, 0x1b, 0xb5, 0x73, 0xfa, 0xe0, 0x65, + 0x8c, 0x82, 0xf6, 0x7c, 0x19, 0xcc, 0x2c, 0xb9, 0x8e, 0xd9, 0x69, 0x9b, 0x9e, 0xaf, 0x7d, 0x4b, + 0x02, 0x73, 0xeb, 0xe6, 0x7e, 0xd7, 0x31, 0x3b, 0xd8, 0xbf, 0xbf, 0xaf, 0x2f, 0xe8, 0x91, 0x57, + 0x41, 0x5f, 0x40, 0x1f, 0xf9, 0x83, 0x81, 0xe1, 0xd1, 0xbd, 0x9c, 0xc8, 0x75, 0x8d, 0xe1, 0x36, + 0x9f, 0x34, 0x28, 0x58, 0x69, 0xc0, 0xd7, 0x22, 0xcb, 0x53, 0x8c, 0x45, 0xf9, 0x61, 0xb1, 0xf0, + 0xa3, 0x22, 0x24, 0x8f, 0x66, 0x57, 0xfe, 0x05, 0xd3, 0xa0, 0x58, 0x81, 0xd8, 0x8a, 0xfb, 0x1f, + 0x12, 0x98, 0x6a, 0x42, 0x1f, 0x5b, 0x70, 0x77, 0x70, 0x9e, 0xc2, 0x1d, 0x9c, 0x21, 0x72, 0x62, + 0x0f, 0x9e, 0xd1, 0x64, 0x9d, 0x39, 0x6f, 0x8d, 0xff, 0xa7, 0xf0, 0x48, 0x24, 0xe5, 0x2e, 0xd2, + 0x32, 0x0f, 0xe5, 0x91, 0x98, 0x48, 0x2a, 0x7b, 0x5f, 0xab, 0xf7, 0x48, 0xd4, 0xb5, 0x8a, 0xe9, + 0xf5, 0x5e, 0xc3, 0xea, 0x67, 0xa2, 0xb7, 0x19, 0x65, 0x3e, 0xc1, 0x39, 0xea, 0xc9, 0x60, 0x8a, + 0xc8, 0x3c, 0x98, 0x8f, 0xf6, 0xfb, 0x29, 0x10, 0x12, 0xf8, 0xec, 0x75, 0x90, 0x53, 0xd0, 0x45, + 0x2d, 0xbe, 0xf0, 0x89, 0xc4, 0x20, 0x98, 0xab, 0x43, 0xff, 0x8a, 0xe3, 0x5e, 0x6a, 0xfa, 0xa6, + 0x0f, 0xb5, 0x7f, 0x96, 0x80, 0xdc, 0x84, 0x3e, 0x1b, 0xfd, 0xa4, 0x0e, 0x4e, 0x90, 0x0a, 0xd1, + 0x8c, 0xb8, 0xff, 0x26, 0x15, 0xb9, 0x7e, 0xa0, 0x10, 0x98, 0x7c, 0xc6, 0xc1, 0x4f, 0xb5, 0x9f, + 0x19, 0x18, 0xf4, 0x49, 0x1a, 0x30, 0x69, 0xa0, 0x92, 0x61, 0x19, 0x44, 0x0a, 0x16, 0xa3, 0xa7, + 0x1f, 0x11, 0x32, 0xab, 0xc5, 0x68, 0x1e, 0x4d, 0x57, 0xf0, 0x6f, 0x8f, 0x03, 0xf9, 0xf2, 0x8e, + 0xe9, 0x6b, 0xef, 0x96, 0x01, 0x28, 0x75, 0x3a, 0x6b, 0xc4, 0x07, 0x9c, 0x75, 0x48, 0x3b, 0x0b, + 0xe6, 0xda, 0x3b, 0x66, 0x74, 0x73, 0x06, 0xe9, 0x0f, 0xb8, 0x34, 0xf5, 0x29, 0x91, 0x33, 0x39, + 0x91, 0xaa, 0xd6, 0x07, 0x13, 0x2a, 0x83, 0xd2, 0x0e, 0x1d, 0xcd, 0xf9, 0x50, 0x98, 0x89, 0x47, + 0xe8, 0xd0, 0xe7, 0x8b, 0x11, 0x7b, 0xf1, 0x73, 0x38, 0x4a, 0x3a, 0x3c, 0x60, 0x13, 0x25, 0xa4, + 0x3c, 0xe9, 0x2d, 0x16, 0xd0, 0x23, 0x99, 0xaf, 0x89, 0x84, 0xae, 0x55, 0xf5, 0x8e, 0x15, 0x88, + 0x96, 0x06, 0xcc, 0xd2, 0x5e, 0x9c, 0x4b, 0x07, 0x5f, 0xb2, 0xe0, 0x9e, 0x09, 0xe6, 0x61, 0xc7, + 0xf2, 0x61, 0x50, 0x4b, 0x2a, 0xc0, 0x24, 0x88, 0xf9, 0x0f, 0xb4, 0xe7, 0x09, 0x07, 0x5d, 0xc3, + 0x02, 0x3d, 0x58, 0xa3, 0x98, 0xf6, 0x27, 0x16, 0x46, 0x4d, 0x8c, 0x66, 0xf6, 0x60, 0xfd, 0xb0, + 0x0c, 0xae, 0x6e, 0x39, 0xdb, 0xdb, 0x5d, 0x18, 0x88, 0x09, 0x12, 0xef, 0x4c, 0xcd, 0x1c, 0x27, + 0x5c, 0x78, 0x27, 0xc8, 0x79, 0xc0, 0x0a, 0x8f, 0x92, 0xa1, 0x07, 0xfe, 0xc4, 0x54, 0xe2, 0x2c, + 0x0a, 0x8b, 0x6b, 0x20, 0x9f, 0x31, 0x28, 0x88, 0x05, 0x7c, 0x16, 0x26, 0x9b, 0x3d, 0x10, 0x5f, + 0x90, 0xc0, 0x3c, 0xb9, 0x17, 0x31, 0x50, 0xd0, 0xfb, 0xc6, 0x08, 0x80, 0xf6, 0xad, 0x9c, 0xa8, + 0x9f, 0x2d, 0x96, 0x09, 0xc7, 0x49, 0x8c, 0x88, 0xc5, 0x82, 0xaa, 0x0c, 0x25, 0x37, 0x81, 0x9b, + 0x3a, 0xf3, 0x60, 0x76, 0x05, 0x06, 0x2d, 0xcd, 0xd3, 0xde, 0x9f, 0xb2, 0x27, 0x3a, 0x0b, 0xe6, + 0xf0, 0xe5, 0x60, 0x0d, 0x7a, 0x4c, 0x92, 0xac, 0x9a, 0x71, 0x69, 0xea, 0x8d, 0x60, 0xfe, 0x22, + 0xdc, 0x72, 0x5c, 0xd8, 0xe0, 0xce, 0x52, 0xf2, 0x89, 0x83, 0xc3, 0xd3, 0xa9, 0x37, 0x83, 0xe3, + 0xd4, 0xd1, 0x7d, 0x09, 0xcd, 0xf5, 0x4d, 0x77, 0x9f, 0x1e, 0x4c, 0xeb, 0x4f, 0xd6, 0xbe, 0xca, + 0x36, 0x98, 0x25, 0x1e, 0xc5, 0x5b, 0x0f, 0x8a, 0x9d, 0xa9, 0x74, 0xcc, 0xe8, 0xf4, 0x54, 0x30, + 0x4d, 0x75, 0x24, 0x30, 0xe8, 0x92, 0x7a, 0xd0, 0x30, 0xaf, 0xfa, 0x54, 0x30, 0x83, 0x44, 0x84, + 0xed, 0x06, 0xda, 0xf5, 0x9e, 0x1e, 0xf0, 0x21, 0x7e, 0x6f, 0x44, 0x59, 0xb5, 0x5f, 0x08, 0x75, + 0x46, 0xe7, 0x74, 0xe6, 0x49, 0x69, 0x98, 0x9f, 0xc8, 0xfd, 0xe4, 0x0a, 0x53, 0xfe, 0xd2, 0x7e, + 0xb5, 0xe3, 0x69, 0x6b, 0xe9, 0xb4, 0xe6, 0x0c, 0x00, 0x61, 0xf3, 0x0b, 0x02, 0x67, 0x30, 0x29, + 0x7c, 0x6c, 0xfc, 0xc4, 0xa3, 0x80, 0xfd, 0xe2, 0xc0, 0xec, 0x8c, 0x17, 0x50, 0xc1, 0x23, 0x84, + 0x22, 0x9c, 0x64, 0x8f, 0xce, 0xcf, 0xe7, 0xc1, 0xd5, 0xe1, 0x09, 0xa7, 0x9a, 0xe9, 0x45, 0x2d, + 0xfb, 0x42, 0x3a, 0x88, 0xb8, 0x23, 0x25, 0x61, 0x73, 0x3c, 0x09, 0x0a, 0xde, 0xde, 0xc5, 0xd0, + 0x11, 0x90, 0x3c, 0x68, 0x6f, 0x94, 0x53, 0x8d, 0x55, 0x03, 0xf9, 0x1b, 0x73, 0x23, 0xbc, 0x15, + 0x9c, 0xb0, 0xf7, 0x76, 0x43, 0x2c, 0x70, 0x4f, 0x43, 0x7b, 0x96, 0x83, 0x2f, 0xf8, 0x26, 0x9b, + 0x17, 0x6f, 0xb2, 0x29, 0x46, 0x52, 0x91, 0x4a, 0x67, 0xaf, 0x1e, 0x9f, 0xee, 0x3b, 0x82, 0x56, + 0x4e, 0xad, 0x14, 0x04, 0x7e, 0x89, 0x85, 0xff, 0x1f, 0x73, 0xa9, 0x7a, 0xde, 0xe1, 0x27, 0xd7, + 0x52, 0xf4, 0x84, 0x47, 0x79, 0x6c, 0xed, 0xf3, 0x12, 0xd0, 0x9a, 0x91, 0x43, 0x0e, 0x05, 0x75, + 0xdd, 0x85, 0x97, 0x2d, 0x78, 0x85, 0x73, 0xdf, 0x7a, 0x93, 0x70, 0x1c, 0x6a, 0x5e, 0x57, 0x0e, + 0x10, 0x8d, 0x5f, 0x17, 0x1f, 0x80, 0x8b, 0x58, 0xbc, 0xe9, 0x74, 0x25, 0x4e, 0x20, 0x76, 0xb8, + 0x04, 0xce, 0x30, 0xa8, 0x2e, 0xbb, 0xce, 0x6e, 0x82, 0x64, 0x5f, 0xc1, 0x4a, 0x76, 0x83, 0x97, + 0xec, 0x3d, 0x89, 0xea, 0x32, 0x80, 0x70, 0x8c, 0x3a, 0xbe, 0x3f, 0x94, 0xe3, 0xfd, 0x9c, 0x1c, + 0x2b, 0x87, 0xa4, 0x9f, 0xbd, 0x2c, 0xff, 0x20, 0x0f, 0xe6, 0x0c, 0x68, 0x76, 0xc2, 0x41, 0xe0, + 0xff, 0x62, 0xcc, 0xbb, 0xa7, 0x83, 0xbc, 0x1f, 0xad, 0xd3, 0x3c, 0xee, 0x60, 0x65, 0xd8, 0x2f, + 0xf1, 0x03, 0x5e, 0xae, 0xc1, 0x1f, 0x1d, 0xe8, 0x2d, 0x24, 0x01, 0xdb, 0x50, 0x16, 0xb1, 0x0d, + 0xf3, 0x83, 0x6c, 0xc3, 0x9b, 0xc1, 0xf1, 0xae, 0xe9, 0xf9, 0x95, 0x8b, 0x2d, 0x6b, 0x17, 0x7a, + 0xbe, 0xb9, 0xdb, 0xc3, 0x56, 0xa0, 0x6c, 0xf4, 0x27, 0xf3, 0xf7, 0xc0, 0x27, 0x9e, 0x07, 0x1b, + 0x54, 0xc5, 0xc3, 0xc7, 0xcc, 0xfd, 0x90, 0xd0, 0xe1, 0xaf, 0x61, 0x65, 0xa7, 0xd3, 0x8c, 0x7b, + 0x47, 0x58, 0x5b, 0x3a, 0x05, 0xd4, 0x35, 0xbd, 0xd9, 0x2c, 0xad, 0xe0, 0x33, 0x21, 0x81, 0x93, + 0x50, 0xe7, 0xec, 0x63, 0x91, 0xf8, 0x08, 0xd2, 0xea, 0x5c, 0x34, 0xf6, 0x2a, 0xc7, 0xd4, 0x59, + 0x30, 0xe5, 0xc2, 0x5e, 0xd7, 0x82, 0x9e, 0x92, 0xd3, 0xbe, 0x29, 0x81, 0xe2, 0x86, 0xed, 0x42, + 0xb3, 0xa3, 0x3d, 0x2b, 0x7e, 0x08, 0x19, 0x51, 0x29, 0xf8, 0xb8, 0x57, 0x89, 0xab, 0xb2, 0xb4, + 0xd1, 0x21, 0x46, 0xc6, 0x02, 0x9f, 0xd8, 0x72, 0x6c, 0x7c, 0xa9, 0x99, 0x37, 0xe9, 0xb3, 0x53, + 0xa0, 0xa0, 0xef, 0xf6, 0xfc, 0xfd, 0xb3, 0x8f, 0x05, 0xf3, 0x4d, 0xdf, 0x85, 0xe6, 0x2e, 0xb3, + 0xa9, 0xee, 0x3b, 0x97, 0xa0, 0x1d, 0x6c, 0xaa, 0xe3, 0x87, 0x3b, 0xef, 0x00, 0x53, 0xb6, 0xb3, + 0x69, 0xee, 0xf9, 0x3b, 0xea, 0x75, 0x07, 0xa2, 0xd1, 0x50, 0xf5, 0x6b, 0xd0, 0xf0, 0x7f, 0x7f, + 0x7a, 0x17, 0x9e, 0x5a, 0x15, 0x6d, 0xa7, 0xb4, 0xe7, 0xef, 0x2c, 0x5d, 0xfb, 0xa9, 0x3f, 0x3b, + 0x93, 0xfb, 0xdc, 0x9f, 0x9d, 0xc9, 0x7d, 0xe5, 0xcf, 0xce, 0xe4, 0x7e, 0xfc, 0xcf, 0xcf, 0x1c, + 0xfb, 0xdc, 0x9f, 0x9f, 0x39, 0xf6, 0x85, 0x3f, 0x3f, 0x73, 0xec, 0xfb, 0xa4, 0xde, 0xc5, 0x8b, + 0x45, 0x4c, 0xe5, 0xc9, 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0xd7, 0x5b, 0x7a, 0x28, + 0x2a, 0x02, 0x00, } func (m *Rpc) Marshal() (dAtA []byte, err error) { @@ -84874,9 +84875,9 @@ func (m *RpcPublishingCreateRequest) MarshalToSizedBuffer(dAtA []byte) (int, err _ = i var l int _ = l - if m.JoinSpace { + if m.IncludeSpaceInfo { i-- - if m.JoinSpace { + if m.IncludeSpaceInfo { dAtA[i] = 1 } else { dAtA[i] = 0 @@ -128121,7 +128122,7 @@ func (m *RpcPublishingCreateRequest) Size() (n int) { if l > 0 { n += 1 + l + sovCommands(uint64(l)) } - if m.JoinSpace { + if m.IncludeSpaceInfo { n += 2 } return n @@ -165100,7 +165101,7 @@ func (m *RpcPublishingCreateRequest) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 4: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field JoinSpace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field IncludeSpaceInfo", wireType) } var v int for shift := uint(0); ; shift += 7 { @@ -165117,7 +165118,7 @@ func (m *RpcPublishingCreateRequest) Unmarshal(dAtA []byte) error { break } } - m.JoinSpace = bool(v != 0) + m.IncludeSpaceInfo = bool(v != 0) default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) diff --git a/pb/protos/commands.proto b/pb/protos/commands.proto index a2fc1d53a..5f669de98 100644 --- a/pb/protos/commands.proto +++ b/pb/protos/commands.proto @@ -1497,7 +1497,7 @@ message Rpc { string spaceId = 1; string objectId = 2; string uri = 3; - bool joinSpace = 4; + bool includeSpaceInfo = 4; } message Response { Error error = 1; From 5ab13471beb0f41a8cee14f6f08746396a543a46 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 26 Mar 2025 10:14:36 +0100 Subject: [PATCH 091/132] GO-4459: Extend global search tests --- core/api/internal/search/service_test.go | 38 ++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/core/api/internal/search/service_test.go b/core/api/internal/search/service_test.go index 2cedc370a..fe85d2ff5 100644 --- a/core/api/internal/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -398,6 +398,44 @@ func TestSearchService_GlobalSearch(t *testing.T) { require.Equal(t, 1, total) require.False(t, hasMore) }) + + t.Run("no objects found globally", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{}, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // when + objects, total, hasMore, err := fx.GlobalSearch(ctx, SearchRequest{Query: mockedSearchTerm, Types: []string{}, Sort: SortOptions{Property: LastModifiedDate, Direction: Desc}}, offset, limit) + + // then + require.NoError(t, err) + require.Len(t, objects, 0) + require.Equal(t, 0, total) + require.False(t, hasMore) + }) + + t.Run("error during global search", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_UNKNOWN_ERROR}, + }).Once() + + // when + objects, total, hasMore, err := fx.GlobalSearch(ctx, SearchRequest{Query: mockedSearchTerm, Types: []string{}, Sort: SortOptions{Property: LastModifiedDate, Direction: Desc}}, offset, limit) + + // then + require.Error(t, err) + require.Empty(t, objects) + require.Equal(t, 0, total) + require.False(t, hasMore) + }) } func TestSearchService_Search(t *testing.T) { From 0b7f88ea3426a12bdf0741fa4163369da3b62abd Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 26 Mar 2025 12:18:02 +0100 Subject: [PATCH 092/132] GO-4459: Add middleware_test.go --- core/api/server/middleware.go | 13 +- core/api/server/middleware_test.go | 238 +++++++++++++++++++++++++++++ 2 files changed, 248 insertions(+), 3 deletions(-) create mode 100644 core/api/server/middleware_test.go diff --git a/core/api/server/middleware.go b/core/api/server/middleware.go index f83e26e04..569f0a3ee 100644 --- a/core/api/server/middleware.go +++ b/core/api/server/middleware.go @@ -2,6 +2,7 @@ package server import ( "context" + "errors" "fmt" "net/http" "strings" @@ -16,6 +17,12 @@ import ( "github.com/anyproto/anytype-heart/pb/service" ) +var ( + ErrMissingAuthorizationHeader = errors.New("missing authorization header") + ErrInvalidAuthorizationHeader = errors.New("invalid authorization header format") + ErrInvalidToken = errors.New("invalid token") +) + // rateLimit is a middleware that limits the number of requests per second. func (s *Server) rateLimit(max float64) gin.HandlerFunc { lmt := tollbooth.NewLimiter(max, nil) @@ -40,13 +47,13 @@ func (s *Server) ensureAuthenticated(mw service.ClientCommandsServer) gin.Handle return func(c *gin.Context) { authHeader := c.GetHeader("Authorization") if authHeader == "" { - apiErr := util.CodeToAPIError(http.StatusUnauthorized, "Missing Authorization header") + apiErr := util.CodeToAPIError(http.StatusUnauthorized, ErrMissingAuthorizationHeader.Error()) c.AbortWithStatusJSON(http.StatusUnauthorized, apiErr) return } if !strings.HasPrefix(authHeader, "Bearer ") { - apiErr := util.CodeToAPIError(http.StatusUnauthorized, "Invalid Authorization header format") + apiErr := util.CodeToAPIError(http.StatusUnauthorized, ErrInvalidAuthorizationHeader.Error()) c.AbortWithStatusJSON(http.StatusUnauthorized, apiErr) return } @@ -61,7 +68,7 @@ func (s *Server) ensureAuthenticated(mw service.ClientCommandsServer) gin.Handle if !exists { response := mw.WalletCreateSession(context.Background(), &pb.RpcWalletCreateSessionRequest{Auth: &pb.RpcWalletCreateSessionRequestAuthOfAppKey{AppKey: key}}) if response.Error.Code != pb.RpcWalletCreateSessionResponseError_NULL { - apiErr := util.CodeToAPIError(http.StatusUnauthorized, "Invalid token") + apiErr := util.CodeToAPIError(http.StatusUnauthorized, ErrInvalidToken.Error()) c.AbortWithStatusJSON(http.StatusUnauthorized, apiErr) return } diff --git a/core/api/server/middleware_test.go b/core/api/server/middleware_test.go new file mode 100644 index 000000000..f4e43a5c5 --- /dev/null +++ b/core/api/server/middleware_test.go @@ -0,0 +1,238 @@ +package server + +import ( + "encoding/json" + "errors" + "net/http" + "net/http/httptest" + "testing" + + "github.com/gin-gonic/gin" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/anyproto/anytype-heart/core/anytype/account" + "github.com/anyproto/anytype-heart/core/anytype/account/mock_account" + "github.com/anyproto/anytype-heart/core/api/util" + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pb/service/mock_service" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" +) + +type fixture struct { + *Server + accountService account.Service + mwMock *mock_service.MockClientCommandsServer +} + +func newFixture(t *testing.T) *fixture { + mw := mock_service.NewMockClientCommandsServer(t) + accountService := mock_account.NewMockService(t) + server := NewServer(accountService, mw) + return &fixture{ + Server: server, + accountService: accountService, + mwMock: mw, + } +} + +func TestEnsureMetadataHeader(t *testing.T) { + t.Run("sets correct header", func(t *testing.T) { + // given + fx := newFixture(t) + middleware := fx.ensureMetadataHeader() + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + + // when + middleware(c) + + // then + require.Equal(t, "2025-03-17", w.Header().Get("Anytype-Version")) + }) +} + +func TestEnsureAuthenticated(t *testing.T) { + t.Run("missing auth header", func(t *testing.T) { + // given + fx := newFixture(t) + fx.KeyToToken = make(map[string]string) + middleware := fx.ensureAuthenticated(fx.mwMock) + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + req := httptest.NewRequest("GET", "/", nil) + c.Request = req + + // when + middleware(c) + + // then + require.Equal(t, http.StatusUnauthorized, w.Code) + expectedJSON, err := json.Marshal(util.CodeToAPIError(http.StatusUnauthorized, ErrMissingAuthorizationHeader.Error())) + require.NoError(t, err) + require.JSONEq(t, string(expectedJSON), w.Body.String()) + }) + + t.Run("invalid auth header format", func(t *testing.T) { + // given + fx := newFixture(t) + fx.KeyToToken = make(map[string]string) + middleware := fx.ensureAuthenticated(fx.mwMock) + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + req := httptest.NewRequest("GET", "/", nil) + req.Header.Set("Authorization", "InvalidToken") + c.Request = req + + // when + middleware(c) + + // then + require.Equal(t, http.StatusUnauthorized, w.Code) + expectedJSON, err := json.Marshal(util.CodeToAPIError(http.StatusUnauthorized, ErrInvalidAuthorizationHeader.Error())) + require.NoError(t, err) + require.JSONEq(t, string(expectedJSON), w.Body.String()) + }) + + t.Run("valid token creation", func(t *testing.T) { + // given + fx := newFixture(t) + fx.KeyToToken = make(map[string]string) + tokenExpected := "valid-token" + + fx.mwMock. + On("WalletCreateSession", mock.Anything, &pb.RpcWalletCreateSessionRequest{ + Auth: &pb.RpcWalletCreateSessionRequestAuthOfAppKey{AppKey: "someAppKey"}, + }). + Return(&pb.RpcWalletCreateSessionResponse{ + Token: tokenExpected, + Error: &pb.RpcWalletCreateSessionResponseError{ + Code: pb.RpcWalletCreateSessionResponseError_NULL, + }, + }, nil).Once() + + middleware := fx.ensureAuthenticated(fx.mwMock) + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + req := httptest.NewRequest("GET", "/", nil) + req.Header.Set("Authorization", "Bearer someAppKey") + c.Request = req + + // when + middleware(c) + + // then + token, exists := c.Get("token") + require.True(t, exists) + require.Equal(t, tokenExpected, token) + }) + + t.Run("invalid token", func(t *testing.T) { + // given + fx := newFixture(t) + fx.KeyToToken = make(map[string]string) + middleware := fx.ensureAuthenticated(fx.mwMock) + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + req := httptest.NewRequest("GET", "/", nil) + req.Header.Set("Authorization", "Bearer invalidKey") + c.Request = req + + fx.mwMock. + On("WalletCreateSession", mock.Anything, &pb.RpcWalletCreateSessionRequest{ + Auth: &pb.RpcWalletCreateSessionRequestAuthOfAppKey{AppKey: "invalidKey"}, + }). + Return(&pb.RpcWalletCreateSessionResponse{ + Token: "", + Error: &pb.RpcWalletCreateSessionResponseError{ + Code: pb.RpcWalletCreateSessionResponseError_UNKNOWN_ERROR, + }, + }, nil).Once() + + // when + middleware(c) + + // then + require.Equal(t, http.StatusUnauthorized, w.Code) + expectedJSON, err := json.Marshal(util.CodeToAPIError(http.StatusUnauthorized, ErrInvalidToken.Error())) + require.NoError(t, err) + require.JSONEq(t, string(expectedJSON), w.Body.String()) + }) +} + +func TestEnsureAccountInfo(t *testing.T) { + t.Run("successful account info", func(t *testing.T) { + // given + fx := newFixture(t) + expectedInfo := &model.AccountInfo{ + GatewayUrl: "http://localhost:31006", + } + fx.accountService.(*mock_account.MockService). + On("GetInfo", mock.Anything). + Return(expectedInfo, nil).Once() + + // when + middleware := fx.ensureAccountInfo(fx.accountService) + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + + // when + middleware(c) + + // then + require.Equal(t, expectedInfo, fx.objectService.AccountInfo) + require.Equal(t, expectedInfo, fx.spaceService.AccountInfo) + require.Equal(t, expectedInfo, fx.searchService.AccountInfo) + }) + + t.Run("error retrieving account info", func(t *testing.T) { + // given + fx := newFixture(t) + expectedErr := errors.New("failed to get info") + fx.accountService.(*mock_account.MockService). + On("GetInfo", mock.Anything). + Return(nil, expectedErr).Once() + + middleware := fx.ensureAccountInfo(fx.accountService) + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + middleware(c) + + // then + require.Equal(t, http.StatusInternalServerError, w.Code) + }) +} + +func TestRateLimit(t *testing.T) { + fx := newFixture(t) + router := gin.New() + router.GET("/", fx.rateLimit(1), func(c *gin.Context) { + c.String(http.StatusOK, "OK") + }) + + t.Run("first request allowed", func(t *testing.T) { + // given + w := httptest.NewRecorder() + req := httptest.NewRequest("GET", "/", nil) + req.RemoteAddr = "1.2.3.4:5678" + + // when + router.ServeHTTP(w, req) + + // then + require.Equal(t, http.StatusOK, w.Code) + }) + + t.Run("second request rate-limited", func(t *testing.T) { + // given + w := httptest.NewRecorder() + req := httptest.NewRequest("GET", "/", nil) + req.RemoteAddr = "1.2.3.4:5678" + + // when + router.ServeHTTP(w, req) + + // then + require.Equal(t, http.StatusTooManyRequests, w.Code) + }) +} From 2951d69ff991599a7b3b68a29094440e2dc7b9c6 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 26 Mar 2025 12:29:17 +0100 Subject: [PATCH 093/132] GO-4459: Add server_test.go --- core/api/server/server_test.go | 62 ++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 core/api/server/server_test.go diff --git a/core/api/server/server_test.go b/core/api/server/server_test.go new file mode 100644 index 000000000..b3cef992c --- /dev/null +++ b/core/api/server/server_test.go @@ -0,0 +1,62 @@ +package server + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/anyproto/anytype-heart/core/anytype/account" + "github.com/anyproto/anytype-heart/core/anytype/account/mock_account" + "github.com/anyproto/anytype-heart/pb/service/mock_service" +) + +type srvFixture struct { + *Server + accountService account.Service + mwMock *mock_service.MockClientCommandsServer +} + +func newServerFixture(t *testing.T) *srvFixture { + mwMock := mock_service.NewMockClientCommandsServer(t) + accountService := mock_account.NewMockService(t) + server := NewServer(accountService, mwMock) + + return &srvFixture{ + Server: server, + accountService: accountService, + mwMock: mwMock, + } +} + +func TestNewServer(t *testing.T) { + t.Run("returns valid server", func(t *testing.T) { + // when + s := newServerFixture(t) + + // then + require.NotNil(t, s) + require.NotNil(t, s.engine) + require.NotNil(t, s.KeyToToken) + + require.NotNil(t, s.authService) + require.NotNil(t, s.exportService) + require.NotNil(t, s.spaceService) + require.NotNil(t, s.objectService) + require.NotNil(t, s.listService) + require.NotNil(t, s.searchService) + + }) +} + +func TestServer_Engine(t *testing.T) { + t.Run("Engine returns same engine instance", func(t *testing.T) { + // given + s := newServerFixture(t) + + // when + engine := s.Engine() + + // then + require.Equal(t, s.engine, engine) + }) +} From 286b18797c54ef684d9af20f24a79a6c1a072de4 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 26 Mar 2025 12:29:44 +0100 Subject: [PATCH 094/132] GO-4459: Refactor service tests --- core/api/internal/auth/service_test.go | 6 +++--- core/api/internal/export/service_test.go | 6 +++--- core/api/internal/list/service_test.go | 16 ++++++++-------- core/api/internal/object/service_test.go | 8 ++++---- core/api/internal/search/service_test.go | 10 +++++----- core/api/internal/space/service_test.go | 6 +++--- core/api/server/middleware_test.go | 7 ++++--- 7 files changed, 30 insertions(+), 29 deletions(-) diff --git a/core/api/internal/auth/service_test.go b/core/api/internal/auth/service_test.go index 85c6605d3..af067f7e4 100644 --- a/core/api/internal/auth/service_test.go +++ b/core/api/internal/auth/service_test.go @@ -26,12 +26,12 @@ type fixture struct { } func newFixture(t *testing.T) *fixture { - mw := mock_service.NewMockClientCommandsServer(t) - authService := NewService(mw) + mwMock := mock_service.NewMockClientCommandsServer(t) + authService := NewService(mwMock) return &fixture{ AuthService: authService, - mwMock: mw, + mwMock: mwMock, } } diff --git a/core/api/internal/export/service_test.go b/core/api/internal/export/service_test.go index a57406d6e..6dd705b8a 100644 --- a/core/api/internal/export/service_test.go +++ b/core/api/internal/export/service_test.go @@ -26,12 +26,12 @@ type fixture struct { } func newFixture(t *testing.T) *fixture { - mw := mock_service.NewMockClientCommandsServer(t) - exportService := NewService(mw) + mwMock := mock_service.NewMockClientCommandsServer(t) + exportService := NewService(mwMock) return &fixture{ ExportService: exportService, - mwMock: mw, + mwMock: mwMock, } } diff --git a/core/api/internal/list/service_test.go b/core/api/internal/list/service_test.go index cd4295092..f4e487126 100644 --- a/core/api/internal/list/service_test.go +++ b/core/api/internal/list/service_test.go @@ -35,18 +35,18 @@ type fixture struct { } func newFixture(t *testing.T) *fixture { - mw := mock_service.NewMockClientCommandsServer(t) - spaceService := space.NewService(mw) - objSvc := object.NewService(mw, spaceService) - objSvc.AccountInfo = &model.AccountInfo{ + mwMock := mock_service.NewMockClientCommandsServer(t) + spaceService := space.NewService(mwMock) + objectService := object.NewService(mwMock, spaceService) + objectService.AccountInfo = &model.AccountInfo{ TechSpaceId: "mocked-tech-space-id", GatewayUrl: "http://localhost:31006", } - listSvc := NewService(mw, objSvc) + listService := NewService(mwMock, objectService) return &fixture{ - ListService: listSvc, - mwMock: mw, - objectService: objSvc, + ListService: listService, + mwMock: mwMock, + objectService: objectService, } } diff --git a/core/api/internal/object/service_test.go b/core/api/internal/object/service_test.go index e056dfba9..9064bbf5e 100644 --- a/core/api/internal/object/service_test.go +++ b/core/api/internal/object/service_test.go @@ -44,10 +44,10 @@ type fixture struct { } func newFixture(t *testing.T) *fixture { - mw := mock_service.NewMockClientCommandsServer(t) + mwMock := mock_service.NewMockClientCommandsServer(t) - spaceService := space.NewService(mw) - objectService := NewService(mw, spaceService) + spaceService := space.NewService(mwMock) + objectService := NewService(mwMock, spaceService) objectService.AccountInfo = &model.AccountInfo{ TechSpaceId: mockedTechSpaceId, GatewayUrl: gatewayUrl, @@ -55,7 +55,7 @@ func newFixture(t *testing.T) *fixture { return &fixture{ ObjectService: objectService, - mwMock: mw, + mwMock: mwMock, } } diff --git a/core/api/internal/search/service_test.go b/core/api/internal/search/service_test.go index fe85d2ff5..7c6e44d60 100644 --- a/core/api/internal/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -44,13 +44,13 @@ type fixture struct { } func newFixture(t *testing.T) *fixture { - mw := mock_service.NewMockClientCommandsServer(t) + mwMock := mock_service.NewMockClientCommandsServer(t) - spaceService := space.NewService(mw) + spaceService := space.NewService(mwMock) spaceService.AccountInfo = &model.AccountInfo{TechSpaceId: techSpaceId, GatewayUrl: gatewayUrl} - objectService := object.NewService(mw, spaceService) + objectService := object.NewService(mwMock, spaceService) objectService.AccountInfo = &model.AccountInfo{TechSpaceId: techSpaceId} - searchService := NewService(mw, spaceService, objectService) + searchService := NewService(mwMock, spaceService, objectService) searchService.AccountInfo = &model.AccountInfo{ TechSpaceId: techSpaceId, GatewayUrl: gatewayUrl, @@ -58,7 +58,7 @@ func newFixture(t *testing.T) *fixture { return &fixture{ SearchService: searchService, - mwMock: mw, + mwMock: mwMock, } } diff --git a/core/api/internal/space/service_test.go b/core/api/internal/space/service_test.go index 35bea6a63..9dd38daf4 100644 --- a/core/api/internal/space/service_test.go +++ b/core/api/internal/space/service_test.go @@ -31,8 +31,8 @@ type fixture struct { } func newFixture(t *testing.T) *fixture { - mw := mock_service.NewMockClientCommandsServer(t) - spaceService := NewService(mw) + mwMock := mock_service.NewMockClientCommandsServer(t) + spaceService := NewService(mwMock) spaceService.AccountInfo = &model.AccountInfo{ TechSpaceId: techSpaceId, GatewayUrl: gatewayUrl, @@ -40,7 +40,7 @@ func newFixture(t *testing.T) *fixture { return &fixture{ SpaceService: spaceService, - mwMock: mw, + mwMock: mwMock, } } diff --git a/core/api/server/middleware_test.go b/core/api/server/middleware_test.go index f4e43a5c5..d6dab5dba 100644 --- a/core/api/server/middleware_test.go +++ b/core/api/server/middleware_test.go @@ -26,13 +26,14 @@ type fixture struct { } func newFixture(t *testing.T) *fixture { - mw := mock_service.NewMockClientCommandsServer(t) + mwMock := mock_service.NewMockClientCommandsServer(t) accountService := mock_account.NewMockService(t) - server := NewServer(accountService, mw) + server := NewServer(accountService, mwMock) + return &fixture{ Server: server, accountService: accountService, - mwMock: mw, + mwMock: mwMock, } } From 061ea5bc8f04a6bef91c698ae088cc9baf70d7de Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Wed, 26 Mar 2025 12:40:50 +0100 Subject: [PATCH 095/132] GO-5369: fix conflict Signed-off-by: AnastasiaShemyakinskaya --- pb/commands.pb.go | 2713 +++++++++++++++++++++++---------------------- 1 file changed, 1357 insertions(+), 1356 deletions(-) diff --git a/pb/commands.pb.go b/pb/commands.pb.go index 8a508f9c7..0cc49b22a 100644 --- a/pb/commands.pb.go +++ b/pb/commands.pb.go @@ -20410,10 +20410,10 @@ func (m *RpcPublishingCreate) XXX_DiscardUnknown() { var xxx_messageInfo_RpcPublishingCreate proto.InternalMessageInfo type RpcPublishingCreateRequest struct { - SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` - ObjectId string `protobuf:"bytes,2,opt,name=objectId,proto3" json:"objectId,omitempty"` - Uri string `protobuf:"bytes,3,opt,name=uri,proto3" json:"uri,omitempty"` - JoinSpace bool `protobuf:"varint,4,opt,name=joinSpace,proto3" json:"joinSpace,omitempty"` + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + ObjectId string `protobuf:"bytes,2,opt,name=objectId,proto3" json:"objectId,omitempty"` + Uri string `protobuf:"bytes,3,opt,name=uri,proto3" json:"uri,omitempty"` + IncludeSpaceInfo bool `protobuf:"varint,4,opt,name=includeSpaceInfo,proto3" json:"includeSpaceInfo,omitempty"` } func (m *RpcPublishingCreateRequest) Reset() { *m = RpcPublishingCreateRequest{} } @@ -20470,9 +20470,9 @@ func (m *RpcPublishingCreateRequest) GetUri() string { return "" } -func (m *RpcPublishingCreateRequest) GetJoinSpace() bool { +func (m *RpcPublishingCreateRequest) GetIncludeSpaceInfo() bool { if m != nil { - return m.JoinSpace + return m.IncludeSpaceInfo } return false } @@ -76308,1351 +76308,1352 @@ func init() { func init() { proto.RegisterFile("pb/protos/commands.proto", fileDescriptor_8261c968b2e6f45c) } var fileDescriptor_8261c968b2e6f45c = []byte{ - // 21504 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7b, 0x98, 0x24, 0x49, - 0x59, 0x37, 0x3a, 0x95, 0x59, 0x55, 0xdd, 0x1d, 0x7d, 0x99, 0x9c, 0xdc, 0xd9, 0x61, 0x36, 0x59, - 0x66, 0xd7, 0xd9, 0x65, 0x59, 0x97, 0xa5, 0x77, 0x59, 0x10, 0xd9, 0x65, 0x97, 0xa5, 0xba, 0x2a, - 0xbb, 0xbb, 0x76, 0xab, 0xab, 0x9a, 0xac, 0xea, 0x19, 0x46, 0x3f, 0x4f, 0x9b, 0x53, 0x15, 0xdd, - 0x9d, 0x3b, 0xd5, 0x99, 0x45, 0x66, 0xf6, 0xcc, 0x36, 0xe7, 0xf9, 0xce, 0x27, 0xe2, 0x0a, 0x88, - 0x88, 0xa8, 0xa8, 0x88, 0xdc, 0x16, 0x01, 0x01, 0xb9, 0xdf, 0x3e, 0x50, 0x2e, 0x72, 0x11, 0x44, - 0x54, 0x14, 0x2f, 0x80, 0x72, 0xc4, 0x3b, 0x7e, 0x47, 0x8f, 0x1f, 0x1e, 0x05, 0xf1, 0x13, 0x3d, - 0x4f, 0x5c, 0x32, 0x33, 0xa2, 0xba, 0x32, 0x2b, 0xb2, 0xba, 0xb2, 0x7a, 0xd1, 0xef, 0xaf, 0xaa, - 0x8c, 0x8c, 0x7c, 0xe3, 0x8d, 0xf7, 0xf7, 0x46, 0xc4, 0x1b, 0x11, 0x6f, 0xbc, 0x01, 0x4e, 0xf7, - 0x2e, 0xde, 0xd6, 0x73, 0x1d, 0xdf, 0xf1, 0x6e, 0x6b, 0x3b, 0xbb, 0xbb, 0xa6, 0xdd, 0xf1, 0x16, - 0xf1, 0xb3, 0x3a, 0x65, 0xda, 0xfb, 0xfe, 0x7e, 0x0f, 0x6a, 0x37, 0xf6, 0x2e, 0x6d, 0xdf, 0xd6, - 0xb5, 0x2e, 0xde, 0xd6, 0xbb, 0x78, 0xdb, 0xae, 0xd3, 0x81, 0xdd, 0xe0, 0x03, 0xfc, 0x40, 0xb3, - 0x6b, 0x37, 0xc7, 0xe5, 0xea, 0x3a, 0x6d, 0xb3, 0xeb, 0xf9, 0x8e, 0x0b, 0x69, 0xce, 0x53, 0x51, - 0x91, 0xf0, 0x32, 0xb4, 0xfd, 0x80, 0xc2, 0xb5, 0xdb, 0x8e, 0xb3, 0xdd, 0x85, 0xe4, 0xdd, 0xc5, - 0xbd, 0xad, 0xdb, 0x3c, 0xdf, 0xdd, 0x6b, 0xfb, 0xf4, 0xed, 0xf5, 0xfd, 0x6f, 0x3b, 0xd0, 0x6b, - 0xbb, 0x56, 0xcf, 0x77, 0x5c, 0x92, 0xe3, 0xec, 0x9f, 0xff, 0xde, 0x34, 0x90, 0x8d, 0x5e, 0x5b, - 0xfb, 0xfa, 0x14, 0x90, 0x4b, 0xbd, 0x9e, 0xf6, 0x49, 0x09, 0x80, 0x15, 0xe8, 0x9f, 0x83, 0xae, - 0x67, 0x39, 0xb6, 0x76, 0x1c, 0x4c, 0x19, 0xf0, 0xd9, 0x7b, 0xd0, 0xf3, 0xef, 0xca, 0xbf, 0xe0, - 0xaf, 0xe4, 0x9c, 0xf6, 0x7a, 0x09, 0x4c, 0x1b, 0xd0, 0xeb, 0x39, 0xb6, 0x07, 0xd5, 0x67, 0x80, - 0x02, 0x74, 0x5d, 0xc7, 0x3d, 0x9d, 0xbb, 0x3e, 0x77, 0xf3, 0xec, 0x1d, 0xb7, 0x2c, 0xd2, 0xea, - 0x2f, 0x1a, 0xbd, 0xf6, 0x62, 0xa9, 0xd7, 0x5b, 0x8c, 0x28, 0x2d, 0x06, 0x1f, 0x2d, 0xea, 0xe8, - 0x0b, 0x83, 0x7c, 0xa8, 0x9e, 0x06, 0x53, 0x97, 0x49, 0x86, 0xd3, 0xd2, 0xf5, 0xb9, 0x9b, 0x67, - 0x8c, 0xe0, 0x11, 0xbd, 0xe9, 0x40, 0xdf, 0xb4, 0xba, 0xde, 0x69, 0x99, 0xbc, 0xa1, 0x8f, 0xda, - 0xc3, 0x39, 0x50, 0xc0, 0x44, 0xd4, 0x32, 0xc8, 0xb7, 0x9d, 0x0e, 0xc4, 0xc5, 0x2f, 0xdc, 0x71, - 0x9b, 0x78, 0xf1, 0x8b, 0x65, 0xa7, 0x03, 0x0d, 0xfc, 0xb1, 0x7a, 0x3d, 0x98, 0x0d, 0xc4, 0x12, - 0xb1, 0xc1, 0x26, 0x9d, 0xbd, 0x03, 0xe4, 0x51, 0x7e, 0x75, 0x1a, 0xe4, 0xeb, 0x1b, 0xb5, 0x9a, - 0x72, 0x4c, 0x3d, 0x01, 0xe6, 0x37, 0xea, 0xf7, 0xd7, 0x1b, 0xe7, 0xeb, 0x9b, 0xba, 0x61, 0x34, - 0x0c, 0x25, 0xa7, 0xce, 0x83, 0x99, 0xa5, 0x52, 0x65, 0xb3, 0x5a, 0x5f, 0xdf, 0x68, 0x29, 0x92, - 0xf6, 0x2a, 0x19, 0x2c, 0x34, 0xa1, 0x5f, 0x81, 0x97, 0xad, 0x36, 0x6c, 0xfa, 0xa6, 0x0f, 0xb5, - 0x97, 0xe4, 0x42, 0x61, 0xaa, 0x1b, 0xa8, 0xd0, 0xf0, 0x15, 0xad, 0xc0, 0x93, 0x0e, 0x54, 0x80, - 0xa7, 0xb0, 0x48, 0xbf, 0x5e, 0x64, 0xd2, 0x0c, 0x96, 0xce, 0xd9, 0x27, 0x80, 0x59, 0xe6, 0x9d, - 0xba, 0x00, 0xc0, 0x52, 0xa9, 0x7c, 0xff, 0x8a, 0xd1, 0xd8, 0xa8, 0x57, 0x94, 0x63, 0xe8, 0x79, - 0xb9, 0x61, 0xe8, 0xf4, 0x39, 0xa7, 0x7d, 0x33, 0xc7, 0x80, 0x59, 0xe1, 0xc1, 0x5c, 0x1c, 0xce, - 0xcc, 0x00, 0x40, 0xb5, 0x37, 0x84, 0xe0, 0xac, 0x70, 0xe0, 0x3c, 0x29, 0x1d, 0xb9, 0xec, 0x01, - 0x7a, 0x48, 0x02, 0xd3, 0xcd, 0x9d, 0x3d, 0xbf, 0xe3, 0x5c, 0xb1, 0xb5, 0x99, 0x10, 0x19, 0xed, - 0xef, 0x58, 0x99, 0x3c, 0x9d, 0x97, 0xc9, 0xcd, 0x07, 0x2b, 0x41, 0x29, 0xc4, 0x48, 0xe3, 0x35, - 0xa1, 0x34, 0x4a, 0x9c, 0x34, 0x9e, 0x20, 0x4a, 0x28, 0x7b, 0x39, 0x7c, 0xe1, 0x6e, 0x50, 0x68, - 0xf6, 0xcc, 0x36, 0xd4, 0x3e, 0x2b, 0x83, 0xb9, 0x1a, 0x34, 0x2f, 0xc3, 0x52, 0xaf, 0xe7, 0x3a, - 0x97, 0xa1, 0x56, 0x8e, 0xf4, 0xf5, 0x34, 0x98, 0xf2, 0x50, 0xa6, 0x6a, 0x07, 0xd7, 0x60, 0xc6, - 0x08, 0x1e, 0xd5, 0x33, 0x00, 0x58, 0x1d, 0x68, 0xfb, 0x96, 0x6f, 0x41, 0xef, 0xb4, 0x74, 0xbd, - 0x7c, 0xf3, 0x8c, 0xc1, 0xa4, 0x68, 0x5f, 0x97, 0x44, 0x75, 0x0c, 0x73, 0xb1, 0xc8, 0x72, 0x10, - 0x23, 0xd5, 0xd7, 0x49, 0x22, 0x3a, 0x36, 0x94, 0x5c, 0x3a, 0xd9, 0xbe, 0x2d, 0x97, 0x5e, 0xb8, - 0x28, 0x47, 0xbd, 0xb1, 0xd9, 0xdc, 0x28, 0xaf, 0x6e, 0x36, 0xd7, 0x4b, 0x65, 0x5d, 0x81, 0xea, - 0x49, 0xa0, 0xe0, 0xbf, 0x9b, 0xd5, 0xe6, 0x66, 0x45, 0xaf, 0xe9, 0x2d, 0xbd, 0xa2, 0x6c, 0xa9, - 0x2a, 0x58, 0x30, 0xf4, 0x67, 0x6e, 0xe8, 0xcd, 0xd6, 0xe6, 0x72, 0xa9, 0x5a, 0xd3, 0x2b, 0xca, - 0x36, 0xfa, 0xb8, 0x56, 0x5d, 0xab, 0xb6, 0x36, 0x0d, 0xbd, 0x54, 0x5e, 0xd5, 0x2b, 0xca, 0x8e, - 0xfa, 0x28, 0x70, 0x55, 0xbd, 0xb1, 0x59, 0x5a, 0x5f, 0x37, 0x1a, 0xe7, 0xf4, 0x4d, 0xfa, 0x45, - 0x53, 0xb1, 0x48, 0x41, 0xad, 0xcd, 0xe6, 0x6a, 0xc9, 0xd0, 0x4b, 0x4b, 0x35, 0x5d, 0x79, 0x40, - 0x7b, 0x9e, 0x0c, 0xe6, 0xd7, 0xcc, 0x4b, 0xb0, 0xb9, 0x63, 0xba, 0xd0, 0xbc, 0xd8, 0x85, 0xda, - 0x0d, 0x02, 0x78, 0x6a, 0x9f, 0x65, 0xf1, 0xd2, 0x79, 0xbc, 0x6e, 0x1b, 0x20, 0x60, 0xae, 0x88, - 0x18, 0xc0, 0xfe, 0x39, 0x6c, 0x06, 0xab, 0x1c, 0x60, 0x4f, 0x4e, 0x49, 0x2f, 0x1d, 0x62, 0x3f, - 0xf8, 0x08, 0x40, 0x4c, 0xfb, 0x62, 0x1e, 0x2c, 0x54, 0xed, 0xcb, 0x96, 0x0f, 0x57, 0xa0, 0x0d, - 0x5d, 0x34, 0x0e, 0xbc, 0x2a, 0x27, 0xd2, 0xae, 0x5a, 0x00, 0x58, 0xf8, 0xbb, 0xd6, 0x7e, 0x0f, - 0xe2, 0xea, 0x0d, 0x96, 0x17, 0x4f, 0x3c, 0x1c, 0x22, 0xaa, 0xe1, 0xb7, 0x06, 0x43, 0xe7, 0xec, - 0x0d, 0x00, 0x44, 0x6f, 0x54, 0x00, 0x8a, 0x6b, 0x70, 0xf7, 0x22, 0x74, 0x95, 0x63, 0xea, 0x0c, - 0x28, 0xac, 0xa0, 0x2f, 0x95, 0x9c, 0xf6, 0x7a, 0x99, 0x51, 0x81, 0x65, 0x5e, 0x05, 0x6e, 0x17, - 0x61, 0x61, 0xd0, 0x48, 0x7f, 0x2d, 0x98, 0x21, 0x7c, 0x94, 0xad, 0x0e, 0x45, 0x2b, 0x4a, 0x50, - 0x6f, 0x04, 0xf3, 0xe4, 0x61, 0xd9, 0xea, 0xc2, 0xfb, 0xe1, 0x3e, 0x1d, 0xf3, 0xf9, 0x44, 0xed, - 0x47, 0xc3, 0x86, 0x5f, 0xe5, 0xf4, 0xe8, 0xbb, 0xd2, 0x32, 0x95, 0x4e, 0x91, 0x5e, 0xf6, 0x48, - 0x68, 0xfa, 0x07, 0x5a, 0xb8, 0xa5, 0x7d, 0x4b, 0x02, 0xb3, 0x4d, 0xdf, 0xe9, 0xa1, 0xe6, 0x62, - 0xd9, 0xdb, 0x62, 0xed, 0xfb, 0xd3, 0x6c, 0xfb, 0x2e, 0xf3, 0xe0, 0x3e, 0x61, 0x80, 0x1c, 0x99, - 0x02, 0x62, 0x5a, 0xf7, 0xd7, 0xc3, 0xd6, 0xbd, 0xcc, 0xa1, 0x72, 0x47, 0x2a, 0x6a, 0xdf, 0x86, - 0x6d, 0xfb, 0x65, 0x32, 0x50, 0x02, 0x35, 0xf3, 0xcb, 0x7b, 0xae, 0x0b, 0x6d, 0x5f, 0x0c, 0x84, - 0x3f, 0x62, 0x41, 0x58, 0xe5, 0x41, 0xb8, 0x23, 0x41, 0x99, 0x83, 0x52, 0x32, 0x6c, 0x63, 0x1f, - 0x0d, 0xd1, 0xbc, 0x9f, 0x43, 0xf3, 0xbb, 0xd3, 0xb3, 0x95, 0x0e, 0xd2, 0xd5, 0x11, 0x10, 0x3d, - 0x09, 0x14, 0x34, 0x1e, 0x96, 0x5b, 0xd5, 0x73, 0xfa, 0x66, 0xb5, 0x7e, 0xae, 0xda, 0xd2, 0x15, - 0xa8, 0xbd, 0x54, 0x8e, 0xfa, 0x5c, 0x1f, 0x77, 0x6a, 0x62, 0xa8, 0x7c, 0x51, 0x1a, 0xad, 0xdf, - 0x23, 0x65, 0x4c, 0x04, 0x13, 0xf1, 0x7e, 0x6f, 0x20, 0x53, 0xe9, 0x10, 0xb9, 0x6f, 0x04, 0x44, - 0x4e, 0x01, 0xb5, 0x5a, 0x3f, 0x57, 0xaa, 0x55, 0x2b, 0xa4, 0x8d, 0x6d, 0xb6, 0x2e, 0xac, 0x23, - 0x4c, 0x7e, 0x52, 0x06, 0x73, 0x84, 0x35, 0x03, 0x5e, 0x76, 0x2e, 0x09, 0x1a, 0x23, 0x5f, 0x4e, - 0x69, 0x3c, 0xb2, 0x25, 0xc4, 0xf4, 0x56, 0x3f, 0x92, 0xc2, 0x78, 0x4c, 0x20, 0xf7, 0x48, 0x1a, - 0x41, 0x0e, 0x74, 0x4d, 0xdb, 0x03, 0x7a, 0xb0, 0x81, 0x23, 0xc8, 0xc7, 0xf3, 0x81, 0x3d, 0x70, - 0xce, 0x82, 0x57, 0xb4, 0xb5, 0x08, 0x13, 0x4e, 0x6d, 0x73, 0x43, 0xd5, 0x56, 0x1a, 0xa4, 0xb6, - 0x7f, 0xc9, 0xda, 0x11, 0x4b, 0x3c, 0x7a, 0xb7, 0xc6, 0x8a, 0x1b, 0x71, 0x12, 0xbf, 0x5a, 0x10, - 0x28, 0x8a, 0xc4, 0x5b, 0x4b, 0xd7, 0x82, 0x19, 0xfc, 0xb7, 0x6e, 0xee, 0x42, 0xda, 0x86, 0xa2, - 0x04, 0xf5, 0x2c, 0x98, 0x23, 0x19, 0xdb, 0x8e, 0x8d, 0xea, 0x93, 0xc7, 0x19, 0xb8, 0x34, 0x04, - 0x62, 0xdb, 0x85, 0xa6, 0xef, 0xb8, 0x98, 0x46, 0x81, 0x80, 0xc8, 0x24, 0xa9, 0xb7, 0x82, 0x13, - 0x96, 0x87, 0x5b, 0xd5, 0x86, 0x07, 0x5d, 0xc2, 0xec, 0xe9, 0xe2, 0xf5, 0xb9, 0x9b, 0xa7, 0x8d, - 0x83, 0x2f, 0xb4, 0xaf, 0x86, 0x6d, 0x56, 0xe7, 0xf4, 0xec, 0x89, 0x69, 0x2a, 0x9e, 0x4e, 0xcb, - 0x2e, 0x8f, 0xd6, 0x83, 0x92, 0x7e, 0x73, 0x13, 0xe9, 0xc6, 0x32, 0x5e, 0x18, 0x80, 0xb4, 0x15, - 0xa3, 0x54, 0x94, 0xb7, 0xdc, 0xa8, 0xb7, 0xf4, 0x7a, 0x4b, 0xd9, 0x1a, 0xa8, 0x7f, 0xdb, 0xda, - 0xeb, 0xf2, 0x20, 0x7f, 0x9f, 0x63, 0xd9, 0xda, 0x43, 0x39, 0x4e, 0x81, 0x6c, 0xe8, 0x5f, 0x71, - 0xdc, 0x4b, 0x61, 0xb3, 0x8e, 0x12, 0x92, 0x91, 0x8c, 0x14, 0x4f, 0x1e, 0xaa, 0x78, 0xf9, 0x41, - 0x8a, 0xf7, 0x13, 0xac, 0xe2, 0xdd, 0xcd, 0x2b, 0xde, 0x4d, 0x03, 0xe4, 0x8f, 0x98, 0x8f, 0xe9, - 0x2e, 0x3e, 0x15, 0x76, 0x17, 0xf7, 0x72, 0x30, 0x3e, 0x5e, 0x8c, 0x4c, 0x3a, 0x00, 0xbf, 0x94, - 0x69, 0x37, 0x31, 0x08, 0xea, 0xed, 0x18, 0xa8, 0x77, 0x06, 0xf4, 0x20, 0xd6, 0xc1, 0x8e, 0xe6, - 0x81, 0x83, 0x9d, 0xca, 0x25, 0xf5, 0x6a, 0x70, 0xa2, 0x52, 0x5d, 0x5e, 0xd6, 0x0d, 0xbd, 0xde, - 0xda, 0xac, 0xeb, 0xad, 0xf3, 0x0d, 0xe3, 0x7e, 0xa5, 0xab, 0x3d, 0x2c, 0x03, 0x80, 0x24, 0x54, - 0x36, 0xed, 0x36, 0xec, 0x8a, 0xf5, 0xff, 0xff, 0xaf, 0x94, 0xae, 0x07, 0x89, 0xe8, 0xc7, 0xc0, - 0xf9, 0x4a, 0x49, 0xbc, 0x55, 0xc6, 0x12, 0x4b, 0x07, 0xea, 0x9b, 0x1f, 0x09, 0xb3, 0x87, 0xab, - 0xc0, 0xf1, 0x80, 0x1e, 0xcd, 0x3e, 0x78, 0xd1, 0xe0, 0xed, 0x79, 0xb0, 0x40, 0x61, 0x09, 0x56, - 0x81, 0x5e, 0x20, 0x34, 0x5d, 0xd5, 0xc0, 0x34, 0x5d, 0xf4, 0x09, 0x06, 0x83, 0xf0, 0x59, 0x5d, - 0x01, 0xb3, 0x3d, 0xe8, 0xee, 0x5a, 0x9e, 0x67, 0x39, 0x36, 0x59, 0xce, 0x5d, 0xb8, 0xe3, 0xb1, - 0xa1, 0xc4, 0xf1, 0xca, 0xf7, 0xe2, 0xba, 0xe9, 0xfa, 0x56, 0xdb, 0xea, 0x99, 0xb6, 0xbf, 0x1e, - 0x65, 0x36, 0xd8, 0x2f, 0x91, 0x61, 0x97, 0xca, 0x40, 0xe3, 0x6b, 0x12, 0xa3, 0x12, 0xbf, 0x92, - 0x62, 0x52, 0x99, 0x48, 0x30, 0x9d, 0x5a, 0x7c, 0x32, 0x53, 0xb5, 0x18, 0x80, 0xf7, 0xb6, 0x7a, - 0x0d, 0xb8, 0xba, 0x5a, 0x2f, 0x37, 0x0c, 0x43, 0x2f, 0xb7, 0x36, 0xd7, 0x75, 0x63, 0xad, 0xda, - 0x6c, 0x56, 0x1b, 0xf5, 0xe6, 0x61, 0x5a, 0xbb, 0xf6, 0x19, 0x39, 0xd4, 0x98, 0x0a, 0x6c, 0x77, - 0x2d, 0x1b, 0x6a, 0xf7, 0x1e, 0x52, 0x61, 0xf8, 0x35, 0x43, 0x71, 0x9c, 0x69, 0xf9, 0x31, 0x38, - 0xbf, 0x36, 0x3d, 0xce, 0x83, 0x09, 0xfe, 0x07, 0x6e, 0xfe, 0x5f, 0x96, 0xc1, 0x09, 0xa6, 0x21, - 0x1a, 0x70, 0x77, 0x6c, 0xeb, 0xc0, 0x3f, 0xc8, 0xb6, 0xdd, 0x2a, 0x8f, 0xe9, 0x20, 0xdb, 0xfb, - 0x00, 0x1b, 0x31, 0xb0, 0xbe, 0x39, 0x84, 0xb5, 0xc6, 0xc1, 0xfa, 0xd4, 0x11, 0x68, 0xa6, 0x43, - 0xf6, 0x1d, 0x99, 0x22, 0x7b, 0x0d, 0xb8, 0x7a, 0xbd, 0x64, 0xb4, 0xaa, 0xe5, 0xea, 0x7a, 0x09, - 0x8d, 0xa3, 0xcc, 0x90, 0x1d, 0x63, 0xdc, 0xf3, 0xa0, 0x0f, 0xc4, 0xf7, 0x23, 0x79, 0x70, 0xed, - 0xe0, 0x8e, 0xb6, 0xbc, 0x63, 0xda, 0xdb, 0x50, 0xb3, 0x44, 0xa0, 0xae, 0x80, 0xa9, 0x36, 0xce, - 0x4e, 0x70, 0x66, 0x37, 0xfe, 0x12, 0xfa, 0x72, 0x52, 0x82, 0x11, 0x7c, 0xaa, 0xbd, 0x9b, 0x55, - 0x88, 0x16, 0xaf, 0x10, 0x4f, 0x4f, 0x06, 0xef, 0x00, 0xdf, 0x31, 0xba, 0xf1, 0xb9, 0x50, 0x37, - 0xce, 0x73, 0xba, 0x51, 0x3e, 0x1c, 0xf9, 0x74, 0x6a, 0xf2, 0x1b, 0x8f, 0x84, 0x0e, 0x20, 0x56, - 0x9b, 0xac, 0xf8, 0x51, 0x61, 0x60, 0x77, 0xff, 0x6a, 0x19, 0x14, 0x2b, 0xb0, 0x0b, 0x7d, 0xc1, - 0x19, 0xfc, 0xdf, 0x4b, 0xa2, 0xdb, 0x69, 0x04, 0x06, 0x42, 0x3b, 0x7e, 0x2d, 0xc5, 0xb7, 0x76, - 0xa1, 0xe7, 0x9b, 0xbb, 0x3d, 0x2c, 0x6a, 0xd9, 0x88, 0x12, 0xb4, 0x1f, 0x92, 0x44, 0x36, 0xdb, - 0x12, 0x8a, 0xf9, 0x8f, 0xb1, 0x2a, 0xfc, 0x79, 0x09, 0x4c, 0x37, 0xa1, 0xdf, 0x70, 0x3b, 0xd0, - 0xd5, 0x9a, 0x11, 0x46, 0xd7, 0x83, 0x59, 0x0c, 0x0a, 0x9a, 0x66, 0x86, 0x38, 0xb1, 0x49, 0xea, - 0x4d, 0x60, 0x21, 0x7c, 0xc4, 0x9f, 0xd3, 0x6e, 0xbc, 0x2f, 0x55, 0xfb, 0x5a, 0x4e, 0xd4, 0x07, - 0x80, 0x2e, 0xfa, 0x52, 0x6e, 0x62, 0x5a, 0xa9, 0xd8, 0x7e, 0x7e, 0x22, 0xa9, 0xec, 0xb7, 0x49, - 0xdf, 0x29, 0x01, 0xb0, 0x61, 0x7b, 0x81, 0x5c, 0x1f, 0x9f, 0x42, 0xae, 0xda, 0x3f, 0xe5, 0xd2, - 0xcd, 0x62, 0xa2, 0x72, 0x62, 0x24, 0xf6, 0x0b, 0x29, 0xd6, 0x16, 0x62, 0x89, 0x4d, 0x60, 0x6b, - 0xf9, 0x38, 0x28, 0x9e, 0x37, 0xbb, 0x5d, 0xe8, 0x6b, 0xaf, 0x92, 0x41, 0xb1, 0xec, 0x42, 0xd3, - 0x87, 0x1a, 0x8c, 0x44, 0xa7, 0x81, 0x69, 0xd7, 0x71, 0xfc, 0x75, 0xd3, 0xdf, 0xa1, 0x72, 0x0b, - 0x9f, 0xd5, 0xa7, 0x82, 0x47, 0x6d, 0xed, 0x75, 0xbb, 0x3e, 0x7c, 0xd0, 0x5f, 0x77, 0xad, 0x5d, - 0xd3, 0xdd, 0xaf, 0x99, 0xf6, 0xf6, 0x9e, 0xb9, 0x0d, 0x29, 0x7b, 0x71, 0xaf, 0xa9, 0xa3, 0xca, - 0x2f, 0xb1, 0x1d, 0xcf, 0xbd, 0xbc, 0xd0, 0xbf, 0x93, 0x93, 0x13, 0x61, 0x71, 0x91, 0xb0, 0x17, - 0xd3, 0xf3, 0x68, 0x60, 0x7a, 0xd7, 0x86, 0xbb, 0x8e, 0x6d, 0xb5, 0x03, 0x6b, 0x35, 0x78, 0xd6, - 0x3e, 0x16, 0xa2, 0xb1, 0xc4, 0xa1, 0xb1, 0x28, 0x5c, 0x4a, 0x3a, 0x28, 0x9a, 0x23, 0xf4, 0x3b, - 0xd7, 0x81, 0x47, 0x93, 0x6e, 0x64, 0xb3, 0xd5, 0xd8, 0x2c, 0x1b, 0x7a, 0xa9, 0xa5, 0x6f, 0xd6, - 0x1a, 0xe5, 0x52, 0x6d, 0xd3, 0xd0, 0xd7, 0x1b, 0x0a, 0x44, 0xb3, 0xf3, 0x29, 0x03, 0xb6, 0x9d, - 0xcb, 0xd0, 0xd5, 0x9e, 0x9b, 0x13, 0x83, 0x28, 0x41, 0x28, 0x49, 0xf0, 0xc9, 0x22, 0xf0, 0xfd, - 0x84, 0xb0, 0x9f, 0x11, 0x15, 0x2c, 0x65, 0x3e, 0xa6, 0xc5, 0x7c, 0x5c, 0xa8, 0x8f, 0x49, 0x24, - 0xf5, 0x08, 0x00, 0xe9, 0x1f, 0x25, 0x30, 0x55, 0x76, 0xec, 0xcb, 0xd0, 0xf5, 0xd9, 0x49, 0x16, - 0x8b, 0x43, 0xae, 0x0f, 0x87, 0xd3, 0x60, 0x0a, 0xda, 0xbe, 0xeb, 0xf4, 0x82, 0x59, 0x56, 0xf0, - 0xa8, 0xbd, 0x31, 0xad, 0x84, 0x69, 0xc9, 0xf1, 0x6b, 0xb3, 0x83, 0x0b, 0xe2, 0xd8, 0x93, 0xfb, - 0xda, 0xce, 0xc3, 0x69, 0x70, 0x19, 0xcc, 0x40, 0xf6, 0xfd, 0xd8, 0x57, 0x64, 0x30, 0x4f, 0xda, - 0x6d, 0x13, 0x62, 0xb3, 0x50, 0x6b, 0xb0, 0xeb, 0x9c, 0x7d, 0xc2, 0x5f, 0x3d, 0xc6, 0x89, 0xbf, - 0x68, 0xf6, 0x7a, 0xe1, 0x0a, 0xf9, 0xea, 0x31, 0x83, 0x3e, 0x13, 0x35, 0x5f, 0x2a, 0x82, 0xbc, - 0xb9, 0xe7, 0xef, 0x68, 0xdf, 0x12, 0x9e, 0xf1, 0x72, 0xfd, 0x08, 0xe5, 0x27, 0x06, 0x92, 0x93, - 0xa0, 0xe0, 0x3b, 0x97, 0x60, 0x20, 0x07, 0xf2, 0x80, 0xe0, 0x30, 0x7b, 0xbd, 0x16, 0x7e, 0x41, - 0xe1, 0x08, 0x9e, 0x91, 0x81, 0x65, 0xb6, 0xdb, 0xce, 0x9e, 0xed, 0x57, 0x83, 0x55, 0xf2, 0x28, - 0x41, 0xfb, 0x82, 0xd0, 0x36, 0x94, 0x00, 0x83, 0xe9, 0x20, 0xbb, 0x38, 0x42, 0x53, 0x5a, 0x04, - 0xb7, 0x94, 0xd6, 0xd7, 0x37, 0x5b, 0x8d, 0xfb, 0xf5, 0x7a, 0x64, 0xed, 0x6e, 0x56, 0xeb, 0x9b, - 0xad, 0x55, 0x7d, 0xb3, 0xbc, 0x61, 0xe0, 0xc5, 0xc9, 0x52, 0xb9, 0xdc, 0xd8, 0xa8, 0xb7, 0x14, - 0xa8, 0xbd, 0x55, 0x02, 0x73, 0xe5, 0xae, 0xe3, 0x85, 0x08, 0x5f, 0x17, 0x21, 0x1c, 0x8a, 0x31, - 0xc7, 0x88, 0x51, 0xfb, 0x5f, 0x39, 0x51, 0x3f, 0x99, 0x40, 0x20, 0x0c, 0xf9, 0x98, 0x5e, 0xea, - 0x8d, 0x42, 0x7e, 0x32, 0xc3, 0xe9, 0x65, 0xdf, 0x24, 0x3e, 0xbb, 0x0c, 0xa6, 0x4a, 0x44, 0x31, - 0xb4, 0x3f, 0xc9, 0x81, 0x62, 0xd9, 0xb1, 0xb7, 0xac, 0x6d, 0x64, 0x41, 0x42, 0xdb, 0xbc, 0xd8, - 0x85, 0x15, 0xd3, 0x37, 0x2f, 0x5b, 0xf0, 0x0a, 0xae, 0xc0, 0xb4, 0xd1, 0x97, 0x8a, 0x98, 0xa2, - 0x29, 0xf0, 0xe2, 0xde, 0x36, 0x66, 0x6a, 0xda, 0x60, 0x93, 0xd0, 0xf8, 0x41, 0x1e, 0xd7, 0x5d, - 0xe8, 0xc2, 0x2e, 0x34, 0x3d, 0x88, 0xe6, 0x62, 0x36, 0xec, 0x62, 0xa5, 0x9d, 0x36, 0xe2, 0x5e, - 0xab, 0x67, 0xc1, 0x1c, 0x79, 0x85, 0xed, 0x1f, 0x0f, 0xab, 0xf1, 0xb4, 0xc1, 0xa5, 0xa9, 0x4f, - 0x00, 0x05, 0xf8, 0xa0, 0xef, 0x9a, 0xa7, 0x3b, 0x18, 0xaf, 0x47, 0x2d, 0x12, 0x47, 0xd9, 0xc5, - 0xc0, 0x51, 0x76, 0xb1, 0x89, 0xdd, 0x68, 0x0d, 0x92, 0x4b, 0xfb, 0x9f, 0xd3, 0xa1, 0xf5, 0xf2, - 0x79, 0x39, 0x52, 0x0c, 0x15, 0xe4, 0x6d, 0x73, 0x17, 0x52, 0xbd, 0xc0, 0xff, 0xd5, 0x5b, 0xc0, - 0x71, 0xf3, 0xb2, 0xe9, 0x9b, 0x6e, 0xcd, 0x69, 0x9b, 0x5d, 0x3c, 0x6c, 0x06, 0x2d, 0xbf, 0xff, - 0x05, 0xde, 0xb4, 0xf2, 0x1d, 0x17, 0xe2, 0x5c, 0xc1, 0xa6, 0x55, 0x90, 0x80, 0xa8, 0x5b, 0x6d, - 0xc7, 0xc6, 0xfc, 0xcb, 0x06, 0xfe, 0x8f, 0xa4, 0xd2, 0xb1, 0x3c, 0x54, 0x11, 0x4c, 0xa5, 0x4e, - 0xf6, 0x53, 0x9a, 0xfb, 0x76, 0x1b, 0x6f, 0x58, 0x4d, 0x1b, 0x71, 0xaf, 0xd5, 0x25, 0x30, 0x4b, - 0x77, 0x5f, 0xd6, 0x90, 0x5e, 0x15, 0xb1, 0x5e, 0x5d, 0xcf, 0xbb, 0x21, 0x12, 0x3c, 0x17, 0xeb, - 0x51, 0x3e, 0x83, 0xfd, 0x48, 0x7d, 0x06, 0x78, 0x34, 0x7d, 0x2c, 0xef, 0x79, 0xbe, 0xb3, 0x4b, - 0x40, 0x5f, 0xb6, 0xba, 0xa4, 0x06, 0x53, 0xb8, 0x06, 0x49, 0x59, 0xd4, 0x3b, 0xc0, 0xc9, 0x9e, - 0x0b, 0xb7, 0xa0, 0x7b, 0xc1, 0xdc, 0xdd, 0x7b, 0xb0, 0xe5, 0x9a, 0xb6, 0xd7, 0x73, 0x5c, 0xff, - 0xf4, 0x34, 0x66, 0x7e, 0xe0, 0x3b, 0xf5, 0x56, 0x70, 0xe2, 0x01, 0xcf, 0xb1, 0x4b, 0x3d, 0xab, - 0x66, 0x79, 0x3e, 0xb4, 0x4b, 0x9d, 0x8e, 0x7b, 0x7a, 0x06, 0x97, 0x75, 0xf0, 0x85, 0x7a, 0x23, - 0x98, 0x7f, 0xc0, 0xb1, 0xec, 0xa6, 0xef, 0x42, 0x73, 0x77, 0xc3, 0xed, 0x9e, 0x06, 0x64, 0x83, - 0x88, 0x4b, 0xa4, 0x9d, 0xef, 0x34, 0x28, 0x12, 0x48, 0xb4, 0x97, 0x14, 0x84, 0xbd, 0x9a, 0xa9, - 0x90, 0x12, 0xad, 0xc5, 0xdb, 0xc1, 0x14, 0xed, 0x35, 0x31, 0xf8, 0xb3, 0x77, 0x9c, 0xea, 0x5b, - 0x20, 0xa1, 0x54, 0x8c, 0x20, 0x9b, 0xfa, 0x24, 0x50, 0x6c, 0x63, 0x51, 0x61, 0x3d, 0x98, 0xbd, - 0xe3, 0xd1, 0x83, 0x0b, 0xc5, 0x59, 0x0c, 0x9a, 0x55, 0xfb, 0xa2, 0x2c, 0xe4, 0x08, 0x9d, 0xc4, - 0x71, 0xba, 0x9e, 0xe2, 0xab, 0xd2, 0x08, 0x5d, 0xf1, 0xad, 0xe0, 0x66, 0xda, 0xcf, 0x52, 0x9b, - 0xa6, 0xb2, 0xb9, 0xb4, 0x11, 0xcc, 0x6a, 0x91, 0xa5, 0xd3, 0x6c, 0x95, 0x8c, 0xd6, 0x66, 0xbd, - 0x51, 0x41, 0xb3, 0xe1, 0x5b, 0xc0, 0x4d, 0x43, 0x72, 0xeb, 0xad, 0xcd, 0x7a, 0x69, 0x4d, 0x57, - 0xb6, 0x78, 0x7b, 0xa9, 0xd9, 0x6a, 0xac, 0x6f, 0x1a, 0x1b, 0xf5, 0x7a, 0xb5, 0xbe, 0x42, 0x88, - 0x21, 0x03, 0xf5, 0x54, 0x94, 0xe1, 0xbc, 0x51, 0x6d, 0xe9, 0x9b, 0xe5, 0x46, 0x7d, 0xb9, 0xba, - 0xa2, 0x58, 0xc3, 0x8c, 0xad, 0x07, 0xd4, 0xeb, 0xc1, 0xb5, 0x1c, 0x27, 0xd5, 0x46, 0x1d, 0x4d, - 0xd1, 0xcb, 0xa5, 0x7a, 0x59, 0x47, 0xf3, 0xf1, 0x4b, 0xaa, 0x06, 0xae, 0x26, 0xe4, 0x36, 0x97, - 0xab, 0x35, 0x76, 0x57, 0xed, 0xd3, 0x39, 0xf5, 0x34, 0xb8, 0x8a, 0x7d, 0x47, 0x7d, 0x22, 0x94, - 0x5f, 0xcf, 0xa9, 0x37, 0x82, 0xeb, 0xb8, 0xaf, 0xc8, 0x06, 0xd9, 0x66, 0xb5, 0xb2, 0xb9, 0x56, - 0x6d, 0xae, 0x95, 0x5a, 0xe5, 0x55, 0xe5, 0x33, 0x78, 0xfa, 0x12, 0xda, 0xe3, 0x8c, 0x77, 0xf2, - 0xcb, 0x58, 0x3b, 0xa1, 0xc4, 0x2b, 0xea, 0xe3, 0x07, 0xc2, 0x9e, 0x6c, 0x17, 0x7f, 0x32, 0x1c, - 0x71, 0x2a, 0x9c, 0x0a, 0xdd, 0x9e, 0x82, 0x56, 0x3a, 0x1d, 0x6a, 0x8d, 0xa0, 0x42, 0xd7, 0x83, - 0x6b, 0xeb, 0x3a, 0x41, 0xca, 0xd0, 0xcb, 0x8d, 0x73, 0xba, 0xb1, 0x79, 0xbe, 0x54, 0xab, 0xe9, - 0xad, 0xcd, 0xe5, 0xaa, 0xd1, 0x6c, 0x29, 0x5b, 0xda, 0x3f, 0x49, 0xe1, 0xb2, 0x14, 0x23, 0xad, - 0x3f, 0x91, 0xd2, 0x36, 0xeb, 0xc4, 0xe5, 0xa7, 0xef, 0x02, 0x45, 0xcf, 0x37, 0xfd, 0x3d, 0x8f, - 0xb6, 0xea, 0xc7, 0x0c, 0x6e, 0xd5, 0x8b, 0x4d, 0x9c, 0xc9, 0xa0, 0x99, 0xb5, 0x2f, 0xe6, 0xd2, - 0x34, 0xd3, 0x31, 0xac, 0x4c, 0x59, 0x23, 0x88, 0xf8, 0x0c, 0xd0, 0x02, 0x6d, 0xaf, 0x36, 0x37, - 0x4b, 0x35, 0x43, 0x2f, 0x55, 0x2e, 0x84, 0xeb, 0x51, 0x50, 0xbd, 0x1a, 0x9c, 0xd8, 0xa8, 0x97, - 0x96, 0x6a, 0x3a, 0x6e, 0x2e, 0x8d, 0x7a, 0x5d, 0x2f, 0x23, 0xb9, 0xff, 0x10, 0xde, 0xfd, 0x41, - 0x56, 0x39, 0xe6, 0x1b, 0x59, 0x4e, 0x8c, 0xfc, 0xff, 0x4a, 0xd8, 0xcd, 0x2d, 0xd2, 0x30, 0x96, - 0xd6, 0x78, 0x71, 0xf8, 0x82, 0x90, 0x67, 0x9b, 0x10, 0x27, 0xe9, 0xf0, 0xf8, 0xfe, 0x11, 0xf0, - 0xb8, 0x1a, 0x9c, 0x60, 0xf1, 0xc0, 0x1e, 0x6e, 0xf1, 0x30, 0xfc, 0xb1, 0x0c, 0xa6, 0xd6, 0xac, - 0x6d, 0xec, 0x5e, 0xbc, 0x17, 0x19, 0x28, 0x0b, 0x40, 0x0a, 0xbd, 0x77, 0x24, 0xab, 0xc3, 0x4d, - 0xe6, 0x25, 0xf1, 0xf5, 0x16, 0xa1, 0x09, 0xfb, 0x17, 0x53, 0xf7, 0x4c, 0x94, 0xe1, 0x98, 0x9e, - 0xe9, 0x85, 0x52, 0x9a, 0x9e, 0x69, 0x30, 0xad, 0x54, 0x30, 0x21, 0xd3, 0xc1, 0x85, 0xcf, 0xde, - 0xb3, 0x5c, 0xd8, 0xc1, 0x66, 0x22, 0xae, 0xb7, 0x6c, 0xf0, 0x89, 0x67, 0xdd, 0xc3, 0x81, 0xc9, - 0x7a, 0xd9, 0xcc, 0x81, 0xe9, 0x70, 0x34, 0xc1, 0x1b, 0x3e, 0xe8, 0xa5, 0x5e, 0x6f, 0x6c, 0xac, - 0xac, 0x6e, 0x2e, 0x1b, 0xba, 0x4e, 0x97, 0x88, 0xb7, 0xb5, 0x77, 0x49, 0x60, 0x9e, 0xd6, 0x90, - 0x7a, 0x4f, 0x5c, 0x17, 0x0b, 0x32, 0x85, 0xe3, 0xdf, 0xd9, 0xe9, 0xc9, 0x0a, 0x0f, 0xc7, 0x13, - 0x93, 0x44, 0x98, 0xe8, 0x3e, 0xf1, 0xa6, 0xb0, 0x09, 0xdd, 0xc7, 0x81, 0xf2, 0x94, 0xd4, 0x14, - 0xb3, 0x9f, 0xa2, 0xbc, 0x04, 0x80, 0x62, 0x13, 0x76, 0x61, 0xdb, 0xd7, 0x3e, 0x24, 0x8f, 0xdc, - 0x26, 0xe2, 0xcc, 0x6d, 0x39, 0x95, 0xb9, 0x9d, 0xcf, 0xc0, 0xdc, 0x2e, 0x8c, 0x6e, 0x6e, 0x17, - 0xd3, 0x9a, 0xdb, 0x53, 0x71, 0xe6, 0x76, 0x42, 0xaf, 0x31, 0x9d, 0xd8, 0x6b, 0xf4, 0x19, 0xea, - 0x46, 0x8d, 0x9a, 0xf4, 0x7c, 0x22, 0x55, 0xe6, 0x4f, 0x14, 0xd3, 0x8e, 0xe3, 0x04, 0xf8, 0xa3, - 0x35, 0xcf, 0x7f, 0xac, 0x90, 0x66, 0xdc, 0x1f, 0xc8, 0x71, 0xba, 0x56, 0xf2, 0xca, 0x7c, 0x06, - 0x8b, 0x8e, 0xea, 0x0d, 0xe0, 0xba, 0xe8, 0x79, 0x53, 0x7f, 0x56, 0xb5, 0xd9, 0x6a, 0x62, 0x9b, - 0xbc, 0xdc, 0x30, 0x8c, 0x8d, 0x75, 0xb2, 0x5d, 0x75, 0x0a, 0xa8, 0x11, 0x15, 0x63, 0xa3, 0x4e, - 0x2c, 0xf0, 0x6d, 0x9e, 0xfa, 0x72, 0xb5, 0x5e, 0xd9, 0x0c, 0x47, 0xb5, 0xfa, 0x72, 0x43, 0xd9, - 0x51, 0x17, 0xc1, 0x2d, 0x0c, 0x75, 0xdc, 0x01, 0x92, 0x12, 0x4a, 0xf5, 0xca, 0xe6, 0x5a, 0x5d, - 0x5f, 0x6b, 0xd4, 0xab, 0x65, 0x9c, 0xde, 0xd4, 0x5b, 0x8a, 0x85, 0x4c, 0xc1, 0x3e, 0x9b, 0xbf, - 0xa9, 0x97, 0x8c, 0xf2, 0xaa, 0x6e, 0x90, 0x22, 0x1f, 0x50, 0x6f, 0x02, 0x67, 0x4b, 0xf5, 0x46, - 0x0b, 0xa5, 0x94, 0xea, 0x17, 0x5a, 0x17, 0xd6, 0xf5, 0xcd, 0x75, 0xa3, 0x51, 0xd6, 0x9b, 0x4d, - 0x34, 0x92, 0xd2, 0x19, 0x82, 0xd2, 0x55, 0x9f, 0x0e, 0xee, 0x62, 0x58, 0xd3, 0x5b, 0xd8, 0x37, - 0x62, 0xad, 0x81, 0xdd, 0xe3, 0x2a, 0xfa, 0xe6, 0x6a, 0xa9, 0xb9, 0x59, 0xad, 0x97, 0x1b, 0x6b, - 0xeb, 0xa5, 0x56, 0x15, 0x0d, 0xb8, 0xeb, 0x46, 0xa3, 0xd5, 0xd8, 0x3c, 0xa7, 0x1b, 0xcd, 0x6a, - 0xa3, 0xae, 0xd8, 0xa8, 0xca, 0xcc, 0x08, 0x1d, 0x58, 0x4a, 0x8e, 0x7a, 0x2d, 0x38, 0x1d, 0xa4, - 0xd7, 0x1a, 0x48, 0xd0, 0xcc, 0x9c, 0xa1, 0xc7, 0xda, 0x59, 0xcd, 0x56, 0xc3, 0x20, 0xb3, 0x86, - 0xb5, 0xea, 0x8a, 0x81, 0xa6, 0x3a, 0xca, 0xb3, 0x33, 0x9d, 0x53, 0xfc, 0x8b, 0x04, 0xf2, 0x4d, - 0xdf, 0xe9, 0x69, 0xdf, 0x19, 0x75, 0x87, 0x67, 0x00, 0x70, 0xb1, 0x2b, 0x44, 0xc5, 0xf4, 0x4d, - 0xba, 0x5a, 0xc3, 0xa4, 0x68, 0xbf, 0x26, 0xbc, 0x7f, 0x1b, 0x59, 0x5d, 0x4e, 0x2f, 0x66, 0xf8, - 0xf8, 0xa6, 0xd8, 0x71, 0xc8, 0x78, 0x42, 0xe9, 0xda, 0xc3, 0x8f, 0x8c, 0xb2, 0x43, 0xab, 0x81, - 0x53, 0x0c, 0xac, 0x48, 0xfe, 0x81, 0xca, 0x40, 0xf5, 0x51, 0xe0, 0xaa, 0x3e, 0xe5, 0xc3, 0x3a, - 0xb7, 0xa5, 0x7e, 0x07, 0x78, 0x0c, 0xa3, 0xfe, 0xfa, 0x5a, 0xe3, 0x9c, 0x1e, 0x2a, 0x7a, 0xa5, - 0xd4, 0x2a, 0x29, 0xdb, 0xda, 0xe7, 0x65, 0x90, 0x5f, 0x73, 0x2e, 0xf7, 0x6f, 0x9b, 0xdb, 0xf0, - 0x0a, 0xb3, 0xb7, 0x12, 0x3c, 0xf2, 0x47, 0xb0, 0x84, 0xc4, 0xbe, 0x16, 0xef, 0x22, 0xf3, 0x05, - 0x29, 0x8d, 0xd8, 0xd7, 0x0e, 0xeb, 0x17, 0xf3, 0x37, 0xa3, 0x88, 0x3d, 0x46, 0xb4, 0x50, 0x3d, - 0x0b, 0xce, 0x44, 0x2f, 0xaa, 0x15, 0xbd, 0xde, 0xaa, 0x2e, 0x5f, 0x88, 0x84, 0x5b, 0x35, 0x84, - 0xc4, 0x3f, 0xac, 0x9b, 0x4b, 0x5e, 0x2b, 0x38, 0x0d, 0x4e, 0x46, 0xef, 0x56, 0xf4, 0x56, 0xf0, - 0xe6, 0x01, 0xed, 0xa1, 0x02, 0x98, 0x23, 0xdd, 0xfe, 0x46, 0xaf, 0x83, 0xac, 0xef, 0x27, 0x45, - 0xe8, 0xde, 0x0c, 0x8e, 0x57, 0xd7, 0x97, 0x9b, 0x4d, 0xdf, 0x71, 0xcd, 0x6d, 0x88, 0xc7, 0x51, - 0x22, 0xad, 0xfe, 0x64, 0xed, 0xbd, 0xc2, 0xab, 0xff, 0xfc, 0x50, 0x43, 0xca, 0x8c, 0x41, 0xfd, - 0x2b, 0x42, 0xab, 0xf5, 0x02, 0x04, 0xd3, 0xa1, 0xff, 0xc0, 0x98, 0xdb, 0x5c, 0x3c, 0x2e, 0x5b, - 0x67, 0x9f, 0x2f, 0x81, 0x99, 0x96, 0xb5, 0x0b, 0x9f, 0xe3, 0xd8, 0xd0, 0x53, 0xa7, 0x80, 0xbc, - 0xb2, 0xd6, 0x52, 0x8e, 0xa1, 0x3f, 0x68, 0x5a, 0x94, 0xc3, 0x7f, 0x74, 0x54, 0x00, 0xfa, 0x53, - 0x6a, 0x29, 0x32, 0xfa, 0xb3, 0xa6, 0xb7, 0x94, 0x3c, 0xfa, 0x53, 0xd7, 0x5b, 0x4a, 0x01, 0xfd, - 0x59, 0xaf, 0xb5, 0x94, 0x22, 0xfa, 0x53, 0x6d, 0xb6, 0x94, 0x29, 0xf4, 0x67, 0xa9, 0xd9, 0x52, - 0xa6, 0xd1, 0x9f, 0x73, 0xcd, 0x96, 0x32, 0x83, 0xfe, 0x94, 0x5b, 0x2d, 0x05, 0xa0, 0x3f, 0xf7, - 0x35, 0x5b, 0xca, 0x2c, 0xfa, 0x53, 0x2a, 0xb7, 0x94, 0x39, 0xfc, 0x47, 0x6f, 0x29, 0xf3, 0xe8, - 0x4f, 0xb3, 0xd9, 0x52, 0x16, 0x30, 0xe5, 0x66, 0x4b, 0x39, 0x8e, 0xcb, 0xaa, 0xb6, 0x14, 0x05, - 0xfd, 0x59, 0x6d, 0xb6, 0x94, 0x13, 0x38, 0x73, 0xb3, 0xa5, 0xa8, 0xb8, 0xd0, 0x66, 0x4b, 0xb9, - 0x0a, 0xe7, 0x69, 0xb6, 0x94, 0x93, 0xb8, 0x88, 0x66, 0x4b, 0xb9, 0x1a, 0xb3, 0xa1, 0xb7, 0x94, - 0x53, 0x38, 0x8f, 0xd1, 0x52, 0x1e, 0x85, 0x5f, 0xd5, 0x5b, 0xca, 0x69, 0xcc, 0x98, 0xde, 0x52, - 0xae, 0xc1, 0x7f, 0x8c, 0x96, 0xa2, 0xe1, 0x57, 0xa5, 0x96, 0xf2, 0x68, 0xed, 0x31, 0x60, 0x66, - 0x05, 0xfa, 0x04, 0x44, 0x4d, 0x01, 0xf2, 0x0a, 0xf4, 0xd9, 0x89, 0xf8, 0xab, 0xf2, 0xe0, 0x51, - 0x74, 0xf1, 0x66, 0xd9, 0x75, 0x76, 0x6b, 0x70, 0xdb, 0x6c, 0xef, 0xeb, 0x0f, 0x22, 0x83, 0x4f, - 0x7b, 0x71, 0x8e, 0x5b, 0xd1, 0xee, 0x45, 0xbd, 0x11, 0xfe, 0x9f, 0x68, 0x20, 0x07, 0x6b, 0xd4, - 0x32, 0xbf, 0x46, 0x1d, 0x67, 0x12, 0xe6, 0x45, 0x26, 0x92, 0xff, 0xc0, 0x36, 0x06, 0x6e, 0x43, - 0x2a, 0xd7, 0xb7, 0x21, 0x85, 0x5a, 0x58, 0x0f, 0xba, 0x9e, 0x63, 0x9b, 0xdd, 0x26, 0x75, 0x3f, - 0x22, 0x73, 0xd5, 0xfe, 0x64, 0xf5, 0x99, 0x41, 0xa3, 0x22, 0x06, 0xdf, 0xd3, 0x92, 0x96, 0xb7, - 0xfa, 0x25, 0x14, 0xd3, 0xbe, 0x3e, 0x13, 0xb6, 0xaf, 0x16, 0xd7, 0xbe, 0x9e, 0x71, 0x08, 0xda, - 0xe9, 0x9a, 0x5a, 0x75, 0xb4, 0xa9, 0x68, 0xe4, 0x9c, 0x1f, 0xec, 0x7f, 0xc9, 0xda, 0xe7, 0x25, - 0x70, 0x4a, 0xb7, 0x07, 0x4d, 0x65, 0x58, 0x35, 0x7a, 0x2b, 0x0b, 0xcd, 0x3a, 0x2f, 0xd2, 0xbb, - 0x06, 0x56, 0x7b, 0x30, 0xcd, 0x18, 0x89, 0xfe, 0x56, 0x28, 0xd1, 0x26, 0x27, 0xd1, 0x7b, 0x47, - 0x27, 0x9d, 0x4e, 0xa0, 0xf5, 0xb1, 0xf6, 0x5d, 0x79, 0xed, 0x2f, 0x24, 0x70, 0x82, 0x78, 0x10, - 0xde, 0x47, 0x66, 0x4e, 0xb8, 0xb7, 0xe7, 0xad, 0xaf, 0x6e, 0x34, 0xcb, 0x22, 0xfa, 0xcd, 0xa4, - 0x68, 0xaf, 0x63, 0x05, 0x7e, 0x3f, 0x2f, 0xf0, 0x98, 0x7e, 0xbc, 0xbf, 0xb8, 0x18, 0x59, 0xff, - 0x7a, 0x28, 0xeb, 0x3a, 0x27, 0xeb, 0xbb, 0x46, 0xa2, 0x7a, 0xb4, 0x62, 0xfe, 0x6a, 0x1e, 0x3c, - 0x86, 0x70, 0x48, 0x15, 0x81, 0xf4, 0x83, 0x25, 0xbb, 0x63, 0x40, 0xcf, 0x37, 0x5d, 0x9f, 0x0b, - 0xbd, 0xd2, 0x37, 0x35, 0xcf, 0x65, 0x30, 0x35, 0x97, 0x86, 0x4e, 0xcd, 0xb5, 0xf7, 0xb0, 0x06, - 0xde, 0x79, 0x1e, 0xd9, 0x52, 0x02, 0x06, 0x31, 0x35, 0x8c, 0x6b, 0x51, 0xa1, 0xe5, 0xf7, 0x3d, - 0x1c, 0xca, 0xcb, 0x87, 0x2e, 0x21, 0x1d, 0xe2, 0xbf, 0x36, 0x5e, 0x4b, 0x3c, 0xcf, 0xbe, 0xe3, - 0xcd, 0x46, 0xa5, 0x93, 0xe9, 0x14, 0xea, 0xa5, 0xd3, 0x60, 0x06, 0x77, 0x39, 0x35, 0xcb, 0xbe, - 0xa4, 0xfd, 0xb9, 0x0c, 0xe6, 0xea, 0xf0, 0x4a, 0x79, 0xc7, 0xec, 0x76, 0xa1, 0xbd, 0x0d, 0xb5, - 0x07, 0x38, 0xdb, 0xde, 0xec, 0xf5, 0xea, 0xd1, 0xfe, 0x70, 0xf0, 0xa8, 0xde, 0x0b, 0x0a, 0x5e, - 0xdb, 0x09, 0x83, 0x3a, 0x7c, 0x67, 0xcc, 0xea, 0x75, 0x69, 0xcf, 0xdf, 0x59, 0xc4, 0x65, 0x95, - 0x7a, 0x56, 0x13, 0x7d, 0x60, 0x90, 0xef, 0xe8, 0x38, 0xf9, 0x57, 0x03, 0x3b, 0xe3, 0x5c, 0x42, - 0x67, 0x1c, 0x32, 0xbe, 0xc8, 0x32, 0x1d, 0xb3, 0x48, 0x72, 0x3d, 0x98, 0x6d, 0x07, 0x59, 0xc2, - 0x53, 0x7a, 0x6c, 0x92, 0xf6, 0x97, 0xa9, 0xba, 0x6b, 0xa1, 0xc2, 0xd3, 0x69, 0x15, 0x1c, 0xb3, - 0xa9, 0x79, 0x35, 0x38, 0xd1, 0x6a, 0x34, 0x36, 0xd7, 0x4a, 0xf5, 0x0b, 0x51, 0x6c, 0x95, 0x2d, - 0xed, 0x95, 0x79, 0xb0, 0xd0, 0x74, 0xba, 0x97, 0x61, 0x84, 0x73, 0x95, 0x73, 0xff, 0x64, 0xe5, - 0x94, 0x3b, 0x20, 0x27, 0xf5, 0x14, 0x28, 0x9a, 0xb6, 0x77, 0x05, 0x06, 0xe6, 0x3f, 0x7d, 0xa2, - 0x30, 0x7e, 0x84, 0xed, 0x08, 0x0c, 0x1e, 0xc6, 0xbb, 0x87, 0x48, 0x92, 0xe7, 0x2a, 0x06, 0xc8, - 0xb3, 0x60, 0xce, 0x23, 0x5e, 0x22, 0x2d, 0xc6, 0x19, 0x88, 0x4b, 0xc3, 0x2c, 0x12, 0x37, 0x25, - 0x99, 0xb2, 0x88, 0x9f, 0xb4, 0x87, 0xc3, 0xfe, 0x63, 0x83, 0x83, 0xb8, 0x74, 0x18, 0xc6, 0xd2, - 0x81, 0xfc, 0xea, 0x71, 0x4f, 0xe2, 0x4f, 0x83, 0x93, 0xc1, 0x09, 0xf5, 0xf2, 0x6a, 0xa9, 0x56, - 0xd3, 0xeb, 0x2b, 0xfa, 0x66, 0xb5, 0x42, 0xf6, 0x93, 0xa3, 0x94, 0x52, 0xab, 0xa5, 0xaf, 0xad, - 0xb7, 0x9a, 0x9b, 0xfa, 0xb3, 0xca, 0xba, 0x5e, 0xc1, 0x0e, 0xd8, 0xf8, 0x04, 0x65, 0xe0, 0x2a, - 0x5f, 0xaa, 0x37, 0xcf, 0xeb, 0x86, 0xb2, 0x73, 0xb6, 0x04, 0x66, 0x99, 0x81, 0x02, 0x71, 0x57, - 0x81, 0x5b, 0xe6, 0x5e, 0x97, 0x9a, 0xe3, 0xca, 0x31, 0xc4, 0x1d, 0x96, 0x4d, 0xc3, 0xee, 0xee, - 0x2b, 0x39, 0x55, 0x01, 0x73, 0xec, 0x98, 0xa0, 0x48, 0xda, 0x3b, 0xaf, 0x05, 0x33, 0xe7, 0x1d, - 0xf7, 0x12, 0xf6, 0x1a, 0xd6, 0x3e, 0x40, 0x62, 0xb0, 0x05, 0x11, 0x25, 0x18, 0x03, 0xec, 0xd5, - 0xe2, 0x6e, 0x62, 0x01, 0xb5, 0xc5, 0xa1, 0x51, 0x23, 0xae, 0x07, 0xb3, 0x57, 0x82, 0xdc, 0x51, - 0x4b, 0x67, 0x92, 0xb4, 0x5f, 0x14, 0x73, 0xfc, 0x1a, 0x5e, 0x64, 0xf6, 0xab, 0xfe, 0x6f, 0x97, - 0x40, 0x71, 0x05, 0xfa, 0xa5, 0x6e, 0x97, 0x95, 0xdb, 0xcb, 0x85, 0xcf, 0x91, 0x72, 0x95, 0x28, - 0x75, 0xbb, 0xf1, 0x8d, 0x8a, 0x11, 0x50, 0x70, 0xde, 0x89, 0x4b, 0x13, 0xf4, 0xd2, 0x1e, 0x52, - 0x60, 0xf6, 0x12, 0xfb, 0x58, 0xe4, 0x9a, 0xfd, 0x7a, 0xc6, 0x4c, 0x7a, 0x62, 0x14, 0x7f, 0x2f, - 0x97, 0xec, 0x24, 0x15, 0xe4, 0x53, 0xef, 0x07, 0x53, 0x7b, 0x1e, 0x2c, 0x9b, 0x5e, 0x30, 0xb4, - 0xf1, 0x35, 0x6d, 0x5c, 0x7c, 0x00, 0xb6, 0xfd, 0xc5, 0xea, 0x2e, 0x9a, 0xf8, 0x6c, 0x90, 0x8c, - 0x61, 0xbc, 0x22, 0xfa, 0x6c, 0x04, 0x14, 0xd0, 0xb4, 0xf3, 0x8a, 0xe5, 0xef, 0x94, 0x77, 0x4c, - 0x9f, 0x6e, 0xb6, 0x84, 0xcf, 0xda, 0x4b, 0x46, 0x80, 0x33, 0xd1, 0x61, 0x27, 0xf6, 0x38, 0x7a, - 0x6a, 0x10, 0xc7, 0xe0, 0x65, 0x33, 0x0a, 0x88, 0x7f, 0x2b, 0x81, 0x7c, 0xa3, 0x07, 0x6d, 0xe1, - 0xb3, 0x97, 0xa1, 0x6c, 0xa5, 0x3e, 0xd9, 0x3e, 0x2c, 0xee, 0x16, 0x1c, 0x56, 0x1a, 0x95, 0x1c, - 0x23, 0xd9, 0xdb, 0x40, 0xde, 0xb2, 0xb7, 0x1c, 0x6a, 0xd9, 0x3e, 0x3a, 0xc6, 0xd6, 0xa9, 0xda, - 0x5b, 0x8e, 0x81, 0x33, 0x8a, 0x7a, 0x04, 0x27, 0x95, 0x9d, 0xbd, 0xb8, 0xff, 0x6e, 0x1a, 0x14, - 0x89, 0x3a, 0x6b, 0x2f, 0x93, 0x81, 0x5c, 0xea, 0x74, 0x62, 0x04, 0x2f, 0x1d, 0x10, 0xbc, 0x83, - 0x3f, 0x0b, 0x31, 0x09, 0x9f, 0xf9, 0xc0, 0x6b, 0x82, 0x7d, 0x3b, 0x6d, 0x52, 0xa5, 0x4e, 0x27, - 0xfe, 0xdc, 0x42, 0x58, 0xa0, 0xc4, 0x17, 0xc8, 0xb6, 0x70, 0x59, 0xac, 0x85, 0xa7, 0x1e, 0x08, - 0x62, 0xf9, 0xcb, 0x1e, 0xa2, 0x7f, 0x90, 0xc0, 0x54, 0xcd, 0xf2, 0x7c, 0x84, 0x4d, 0x49, 0x04, - 0x9b, 0x6b, 0xc1, 0x4c, 0x20, 0x1a, 0xd4, 0xe5, 0xa1, 0xfe, 0x3c, 0x4a, 0xe0, 0x67, 0xe2, 0xf7, - 0xf1, 0xe8, 0x3c, 0x39, 0xb9, 0xf6, 0x94, 0x8b, 0xf8, 0x33, 0x6d, 0x51, 0xb1, 0x52, 0x7f, 0xb1, - 0xbf, 0x14, 0x0a, 0x7c, 0x8d, 0x13, 0xf8, 0x9d, 0xa3, 0x14, 0x99, 0xbd, 0xd0, 0x7f, 0x5f, 0x02, - 0x00, 0x95, 0x4d, 0x0f, 0x0e, 0x3f, 0x8e, 0x0b, 0x07, 0x92, 0x20, 0xdd, 0x57, 0xb2, 0xd2, 0x5d, - 0xe3, 0xa5, 0xfb, 0xdd, 0xc3, 0xab, 0x9a, 0x74, 0x40, 0x58, 0x55, 0x80, 0x6c, 0x85, 0xa2, 0x45, - 0x7f, 0xb5, 0xb7, 0x87, 0x42, 0x5d, 0xe7, 0x84, 0x7a, 0xf7, 0x88, 0x25, 0x65, 0x2f, 0xd7, 0x3f, - 0x92, 0xc0, 0x54, 0x13, 0xfa, 0xa8, 0x9b, 0xd4, 0xce, 0x89, 0xf4, 0xf0, 0x4c, 0xdb, 0x96, 0x04, - 0xdb, 0xf6, 0x37, 0x72, 0xa2, 0x81, 0xe1, 0x22, 0xc9, 0x50, 0x9e, 0x62, 0x56, 0x1f, 0x5e, 0x2f, - 0x14, 0x18, 0x6e, 0x18, 0xb5, 0xec, 0xa5, 0xfb, 0x56, 0x29, 0xf4, 0x14, 0xe1, 0xcf, 0xf5, 0xb1, - 0x66, 0x71, 0xee, 0xa0, 0x59, 0x2c, 0x7e, 0xae, 0x8f, 0xad, 0x63, 0xbc, 0x63, 0x42, 0x6a, 0x63, - 0x63, 0x0c, 0x3e, 0x03, 0xa3, 0xc8, 0xeb, 0x79, 0x32, 0x28, 0xd2, 0xcd, 0x83, 0x7b, 0x93, 0xf7, - 0x0e, 0x86, 0x4f, 0x2d, 0xde, 0x3f, 0x82, 0x29, 0x97, 0xb4, 0x2c, 0x1f, 0xb2, 0x21, 0x31, 0x6c, - 0xdc, 0x0a, 0x0a, 0x38, 0x6a, 0x36, 0x1d, 0xe7, 0x22, 0x77, 0x8f, 0x80, 0x84, 0x8e, 0xde, 0x1a, - 0x24, 0x53, 0x6a, 0x14, 0xc6, 0xb0, 0x92, 0x3f, 0x0a, 0x0a, 0x5f, 0x55, 0x01, 0x58, 0xdf, 0xbb, - 0xd8, 0xb5, 0xbc, 0x1d, 0xcb, 0xc6, 0x3e, 0x62, 0x73, 0xf4, 0x91, 0x04, 0x7f, 0x4e, 0x34, 0xff, - 0x62, 0x8d, 0x02, 0x05, 0xc8, 0x7b, 0xae, 0x45, 0x97, 0x01, 0xd0, 0x5f, 0xf5, 0x9e, 0xd0, 0xdb, - 0x32, 0xdf, 0x17, 0xb8, 0x05, 0x89, 0x21, 0xe2, 0x60, 0x91, 0x29, 0x3d, 0xf2, 0xba, 0x64, 0x23, - 0x7c, 0x17, 0xf8, 0x08, 0xdf, 0xdc, 0x69, 0xee, 0x62, 0xdf, 0x69, 0x6e, 0x84, 0xa3, 0x67, 0x3d, - 0x07, 0x62, 0xd7, 0x23, 0xd9, 0xc0, 0xff, 0xd1, 0x17, 0xd8, 0x3d, 0x08, 0x7b, 0xe7, 0x91, 0x33, - 0x03, 0x51, 0x02, 0xdb, 0xe7, 0xcd, 0x08, 0xf6, 0x79, 0x1f, 0x8d, 0xe6, 0x3e, 0x8e, 0xa0, 0xe1, - 0x9c, 0x42, 0x72, 0x1c, 0xbb, 0xf9, 0x3e, 0x76, 0xb5, 0x4f, 0x08, 0x07, 0xe2, 0x64, 0x64, 0x9c, - 0x38, 0x8b, 0xa1, 0x1c, 0x48, 0x21, 0x07, 0xcc, 0x1e, 0x70, 0x52, 0x0f, 0x3c, 0x8c, 0x7e, 0x3a, - 0x5d, 0xde, 0x1d, 0x61, 0xbd, 0x46, 0x05, 0x0b, 0xc1, 0xb1, 0xf8, 0xc6, 0xd2, 0x7d, 0x7a, 0xb9, - 0xa5, 0xc0, 0x83, 0x47, 0xe5, 0xf1, 0xa1, 0x78, 0x72, 0x00, 0x3e, 0x5a, 0x93, 0xd1, 0xfe, 0x87, - 0x04, 0x8a, 0xd4, 0xdc, 0xb8, 0xf7, 0x90, 0x10, 0x6a, 0xaf, 0x1a, 0x05, 0x92, 0xc4, 0xe8, 0x24, - 0x9f, 0x4d, 0x0b, 0xc0, 0x18, 0x0c, 0x8c, 0x0b, 0x99, 0x01, 0xa0, 0xfd, 0xb3, 0x04, 0xf2, 0xc8, - 0x0c, 0x12, 0x8b, 0xfd, 0xf0, 0x19, 0x61, 0x97, 0x60, 0x46, 0x00, 0x88, 0x7c, 0x8c, 0x7e, 0x2f, - 0x81, 0x99, 0x1e, 0xc9, 0x18, 0x46, 0x1e, 0xb9, 0x51, 0xa0, 0x33, 0x82, 0x46, 0xf4, 0x99, 0xf6, - 0x3e, 0xa1, 0x03, 0x0f, 0xc9, 0xfc, 0xa4, 0x83, 0x43, 0x1f, 0x47, 0x98, 0x88, 0x2d, 0xed, 0x5f, - 0x25, 0x00, 0x0c, 0xe8, 0x39, 0xdd, 0xcb, 0x70, 0xc3, 0xb5, 0xb4, 0x47, 0x47, 0x00, 0xd0, 0x66, - 0x9f, 0x8b, 0x9a, 0xfd, 0xe7, 0x24, 0x51, 0xe7, 0x5f, 0x4e, 0xf3, 0x02, 0xe2, 0x31, 0xe2, 0x7f, - 0x3a, 0x98, 0xa2, 0x72, 0xa4, 0x36, 0xa5, 0x98, 0xf0, 0x83, 0x8f, 0xb4, 0x0f, 0x0a, 0x39, 0x0f, - 0x8b, 0x70, 0x94, 0x0e, 0x80, 0xf2, 0x08, 0x00, 0x1c, 0x07, 0xb3, 0x01, 0x00, 0x1b, 0x46, 0x55, - 0x81, 0xda, 0xbb, 0x65, 0xec, 0x61, 0x41, 0x06, 0xb7, 0xc3, 0xf7, 0x34, 0x7f, 0x21, 0x3c, 0xd9, - 0x67, 0xe4, 0x11, 0x96, 0x9f, 0x11, 0x40, 0xbf, 0x2d, 0x34, 0xbb, 0x17, 0x60, 0xe8, 0x91, 0xd2, - 0x5f, 0x9d, 0xd5, 0xc1, 0x3c, 0x67, 0x95, 0xa8, 0xa7, 0xc1, 0x49, 0x2e, 0x81, 0x8c, 0x77, 0x1d, - 0xe5, 0x98, 0xaa, 0x81, 0x53, 0xdc, 0x1b, 0xfa, 0x00, 0x3b, 0x4a, 0x4e, 0x7b, 0xf8, 0x0b, 0xb9, - 0x70, 0xbd, 0xe7, 0xfd, 0x79, 0xba, 0xd2, 0xf6, 0x29, 0x3e, 0xd8, 0x65, 0xdb, 0xb1, 0x7d, 0xf8, - 0x20, 0xe3, 0xa6, 0x12, 0x26, 0x24, 0x5a, 0x0d, 0xa7, 0xc1, 0x94, 0xef, 0xb2, 0xae, 0x2b, 0xc1, - 0x23, 0xab, 0x58, 0x05, 0x5e, 0xb1, 0xea, 0xe0, 0xac, 0x65, 0xb7, 0xbb, 0x7b, 0x1d, 0x68, 0xc0, - 0xae, 0x89, 0x64, 0xe8, 0x95, 0xbc, 0x0a, 0xec, 0x41, 0xbb, 0x03, 0x6d, 0x9f, 0xf0, 0x19, 0x9c, - 0x7b, 0x15, 0xc8, 0xc9, 0x2b, 0xe3, 0x3d, 0xbc, 0x32, 0x3e, 0x6e, 0xd0, 0x12, 0x6e, 0xc2, 0x7a, - 0xdf, 0x9d, 0x00, 0x90, 0xba, 0x9d, 0xb3, 0xe0, 0x15, 0xaa, 0x86, 0xd7, 0xf4, 0xad, 0xfa, 0x35, - 0xc2, 0x0c, 0x06, 0x93, 0x59, 0xfb, 0x72, 0xa8, 0x7e, 0xcf, 0xe0, 0xd4, 0xef, 0x56, 0x41, 0x16, - 0xd2, 0x69, 0x5d, 0x6f, 0x04, 0xad, 0x9b, 0x07, 0x33, 0xd1, 0x6e, 0xb2, 0xac, 0x5e, 0x03, 0xae, - 0x0e, 0x3c, 0x8c, 0xeb, 0xba, 0x5e, 0x69, 0x6e, 0x6e, 0xac, 0xaf, 0x18, 0xa5, 0x8a, 0xae, 0x00, - 0xa4, 0x9f, 0x44, 0x2f, 0x43, 0xc7, 0xe0, 0xbc, 0xf6, 0x07, 0x12, 0x28, 0xe0, 0x43, 0xdb, 0xda, - 0xf7, 0x8d, 0x49, 0x73, 0x3c, 0xce, 0xe9, 0x29, 0x1c, 0x77, 0xc5, 0xaf, 0x30, 0xa1, 0xc2, 0xc4, - 0x5c, 0x1d, 0xea, 0x0a, 0x93, 0x04, 0x42, 0xd9, 0xcf, 0x84, 0x50, 0x93, 0x6c, 0xee, 0x38, 0x57, - 0xfe, 0x33, 0x37, 0x49, 0x54, 0xff, 0x23, 0x6e, 0x92, 0x03, 0x58, 0x98, 0x78, 0x93, 0x1c, 0xd0, - 0xee, 0x12, 0x9a, 0xa9, 0xf6, 0x91, 0x42, 0x38, 0xff, 0xfb, 0xa4, 0x74, 0xa8, 0xbd, 0xaf, 0x12, - 0x98, 0xb7, 0x6c, 0x1f, 0xba, 0xb6, 0xd9, 0x5d, 0xee, 0x9a, 0xdb, 0x81, 0x7d, 0xda, 0xbf, 0xe1, - 0x51, 0x65, 0xf2, 0x18, 0xfc, 0x17, 0xea, 0x19, 0x00, 0x7c, 0xb8, 0xdb, 0xeb, 0x9a, 0x7e, 0xa4, - 0x7a, 0x4c, 0x0a, 0xab, 0x7d, 0x79, 0x5e, 0xfb, 0x6e, 0x07, 0x57, 0x11, 0xd0, 0x5a, 0xfb, 0x3d, - 0xb8, 0x61, 0x5b, 0xcf, 0xde, 0xc3, 0xb1, 0x91, 0x89, 0x8e, 0x0e, 0x7a, 0xc5, 0xed, 0x00, 0x15, - 0xf9, 0x1d, 0x20, 0xf5, 0x6e, 0x70, 0x0d, 0x0e, 0x7b, 0x8d, 0xef, 0x08, 0x39, 0x6f, 0x75, 0xb6, - 0xa1, 0x5f, 0xdd, 0x5a, 0xb3, 0x3c, 0xcf, 0xb2, 0xb7, 0xf1, 0x74, 0x7c, 0xda, 0x88, 0xcf, 0xa0, - 0xfd, 0xad, 0x70, 0xdc, 0xa5, 0xa0, 0xcf, 0x18, 0x12, 0x77, 0x29, 0x6c, 0xa7, 0x72, 0x5f, 0x3b, - 0x0d, 0x57, 0x75, 0xf2, 0x02, 0xab, 0x3a, 0x2c, 0xa6, 0x05, 0xc1, 0xd5, 0x81, 0xd7, 0x0a, 0x05, - 0x76, 0x4a, 0xaa, 0x46, 0xf6, 0x7d, 0xdf, 0xd7, 0x65, 0xb0, 0x40, 0x8a, 0x5e, 0x72, 0x9c, 0x4b, - 0xbb, 0xa6, 0x7b, 0x49, 0xfb, 0x89, 0xc3, 0xed, 0xe2, 0x26, 0xee, 0x5e, 0xc5, 0x6d, 0xc9, 0xf6, - 0x29, 0x6f, 0xbe, 0x5f, 0x79, 0xb5, 0xdf, 0x12, 0x9e, 0x92, 0x70, 0xf2, 0x0c, 0x2a, 0x35, 0x99, - 0xed, 0x2d, 0xb1, 0xe3, 0x8d, 0x22, 0x0c, 0x66, 0x0f, 0xfc, 0x6f, 0x84, 0xc0, 0x07, 0xe3, 0x08, - 0xbb, 0x33, 0x30, 0x4e, 0xdc, 0xb5, 0xaf, 0x8c, 0x86, 0x5d, 0xc0, 0xd7, 0x08, 0xd8, 0x29, 0x40, - 0xbe, 0x14, 0x3a, 0x23, 0xa1, 0xbf, 0x6c, 0x85, 0xf2, 0xd9, 0xa1, 0x19, 0xc3, 0xf2, 0x44, 0xd0, - 0x3c, 0xc9, 0xb3, 0xd0, 0xe8, 0x65, 0x8a, 0xe9, 0x97, 0x84, 0x77, 0xdc, 0x06, 0x0a, 0x88, 0x70, - 0x37, 0x99, 0x56, 0x29, 0xb6, 0x5d, 0x27, 0xce, 0x66, 0xf6, 0x68, 0xbe, 0xb8, 0x00, 0x66, 0x82, - 0xf8, 0x57, 0xf8, 0x46, 0xc1, 0x10, 0xc3, 0x53, 0xa0, 0xe8, 0x39, 0x7b, 0x6e, 0x1b, 0xd2, 0x3d, - 0x50, 0xfa, 0x34, 0xc2, 0x7e, 0xdd, 0x50, 0x73, 0xe1, 0x80, 0x45, 0x92, 0x4f, 0x6d, 0x91, 0xc4, - 0xdb, 0xbb, 0x09, 0xf6, 0x83, 0xf6, 0x12, 0xe1, 0x6b, 0x3f, 0x38, 0xcc, 0x9a, 0xd0, 0x7f, 0x24, - 0x1a, 0x01, 0xbf, 0x2a, 0xb4, 0x1b, 0x34, 0xa4, 0x26, 0xe9, 0x54, 0xae, 0x31, 0x82, 0x1d, 0xfc, - 0x68, 0xf0, 0xa8, 0x20, 0x07, 0x35, 0x80, 0xb1, 0xc1, 0xbb, 0x61, 0xd4, 0x14, 0x59, 0x7b, 0x5e, - 0x1e, 0x28, 0x84, 0xb5, 0x46, 0x68, 0x0b, 0x6a, 0x2f, 0xcf, 0x1d, 0xb5, 0xc1, 0x1b, 0x3f, 0x83, - 0xfd, 0x5d, 0x49, 0x34, 0x58, 0x38, 0x27, 0xf8, 0xa8, 0x76, 0x31, 0x9a, 0x34, 0x42, 0x33, 0x4b, - 0x50, 0x3e, 0xed, 0x2d, 0x39, 0x91, 0xd8, 0xe3, 0x62, 0x2c, 0x66, 0xdf, 0x2b, 0x7d, 0x23, 0x1f, - 0x84, 0x31, 0x5c, 0x76, 0x9d, 0xdd, 0x0d, 0xb7, 0xab, 0xfd, 0x9b, 0xd0, 0xd5, 0x0e, 0x31, 0xb3, - 0x0b, 0x29, 0x7e, 0x76, 0x81, 0x57, 0xa4, 0xbb, 0xd1, 0x56, 0x58, 0x77, 0x84, 0xe1, 0x5b, 0xbd, - 0x09, 0x2c, 0x98, 0x9d, 0xce, 0xba, 0xb9, 0x0d, 0xcb, 0x68, 0xda, 0x6e, 0xfb, 0x34, 0xc4, 0x59, - 0x5f, 0x6a, 0xe2, 0x54, 0x86, 0xef, 0x23, 0xa7, 0x0e, 0x58, 0xa5, 0xe2, 0xcb, 0xb0, 0x1c, 0x88, - 0x54, 0x7e, 0x13, 0x19, 0xfe, 0xd0, 0x90, 0xd1, 0xde, 0x31, 0xa3, 0x80, 0x8c, 0xf4, 0x49, 0xd0, - 0x17, 0x4b, 0x80, 0xef, 0xec, 0x35, 0xef, 0x57, 0x24, 0x30, 0x85, 0xf0, 0x28, 0x75, 0x3a, 0xda, - 0x63, 0xb9, 0xb8, 0xa5, 0xb1, 0xde, 0x70, 0x2f, 0x14, 0x76, 0x43, 0x0c, 0x6a, 0x48, 0xe8, 0xc7, - 0x60, 0x12, 0x09, 0x51, 0xe2, 0x84, 0x28, 0xe6, 0x6d, 0x98, 0x58, 0x44, 0xf6, 0xe2, 0xfb, 0x8c, - 0x04, 0xe6, 0x83, 0x79, 0xc6, 0x32, 0xf4, 0xdb, 0x3b, 0xda, 0x9d, 0xa2, 0xeb, 0x5c, 0xb4, 0x25, - 0x86, 0x5b, 0xc2, 0x5d, 0xed, 0x5b, 0xb9, 0x94, 0x2a, 0xcf, 0x95, 0x1c, 0xb3, 0x48, 0x98, 0x4a, - 0x17, 0x93, 0x08, 0x66, 0x2f, 0xcc, 0x2f, 0x4b, 0x00, 0xb4, 0x9c, 0x70, 0xb2, 0x7c, 0x08, 0x49, - 0xfe, 0xa4, 0xf0, 0x6e, 0x31, 0xad, 0x78, 0x54, 0x6c, 0xfa, 0x9e, 0x43, 0xd0, 0x99, 0x6a, 0x58, - 0x49, 0x13, 0x69, 0xeb, 0x33, 0x95, 0xbd, 0x5e, 0xd7, 0x6a, 0x9b, 0x7e, 0xbf, 0x07, 0x60, 0xbc, - 0x78, 0xf1, 0x75, 0xdc, 0xa9, 0x8c, 0xc6, 0xb0, 0x8c, 0x18, 0x59, 0x92, 0x38, 0x3f, 0x52, 0x10, - 0xe7, 0x47, 0xd0, 0xab, 0x67, 0x08, 0xf1, 0x09, 0xa8, 0xa7, 0x0c, 0x8e, 0x37, 0x7a, 0xd0, 0x5e, - 0x72, 0xa1, 0xd9, 0x69, 0xbb, 0x7b, 0xbb, 0x17, 0x3d, 0xd6, 0x7d, 0x35, 0x59, 0x47, 0x99, 0x95, - 0x6b, 0x89, 0x5b, 0xb9, 0xd6, 0x7e, 0x58, 0x16, 0x8d, 0xc4, 0xc6, 0xec, 0xaf, 0x30, 0x3c, 0x8c, - 0x30, 0xd4, 0xa5, 0x72, 0xba, 0xea, 0x5b, 0xa4, 0xce, 0xa7, 0x59, 0xa4, 0x7e, 0xb3, 0x50, 0x5c, - 0x37, 0xa1, 0x7a, 0x4d, 0xc4, 0x77, 0x6e, 0xa1, 0x09, 0xfd, 0x18, 0x78, 0x6f, 0x04, 0xf3, 0x17, - 0xa3, 0x37, 0x21, 0xc4, 0x7c, 0xe2, 0x00, 0x8f, 0xd6, 0xb7, 0xa6, 0x5d, 0xa1, 0xe1, 0x59, 0x88, - 0x41, 0x37, 0x44, 0x50, 0x12, 0x71, 0x9b, 0x4b, 0xb5, 0xdc, 0x92, 0x58, 0x7e, 0xf6, 0x28, 0x7c, - 0x42, 0x02, 0xb3, 0xf8, 0x92, 0xf1, 0xa5, 0x7d, 0x7c, 0x90, 0x53, 0xd0, 0x28, 0x79, 0x31, 0x2b, - 0x66, 0x15, 0xe4, 0xbb, 0x96, 0x7d, 0x29, 0xf0, 0x77, 0x44, 0xff, 0xa3, 0x2b, 0x4a, 0xa5, 0x01, - 0x57, 0x94, 0x86, 0xdb, 0x24, 0x61, 0xb9, 0x31, 0xa3, 0xe9, 0x1b, 0x72, 0x22, 0x57, 0x94, 0x0e, - 0x25, 0x97, 0xbd, 0x18, 0xff, 0x3a, 0x0f, 0x8a, 0x4d, 0x68, 0xba, 0xed, 0x1d, 0xed, 0xfd, 0xd2, - 0xc0, 0xa9, 0xc4, 0x34, 0x3f, 0x95, 0x58, 0x06, 0x53, 0x5b, 0x56, 0xd7, 0x87, 0x2e, 0xf1, 0x01, - 0x67, 0xbb, 0x76, 0xd2, 0xc4, 0x97, 0xba, 0x4e, 0xfb, 0xd2, 0x22, 0x35, 0xed, 0x17, 0x83, 0x78, - 0xd1, 0x8b, 0xcb, 0xf8, 0x23, 0x23, 0xf8, 0x18, 0x19, 0x84, 0x9e, 0xe3, 0xfa, 0x71, 0xf7, 0x0f, - 0xc5, 0x50, 0x69, 0x3a, 0xae, 0x6f, 0x90, 0x0f, 0x11, 0xcc, 0x5b, 0x7b, 0xdd, 0x6e, 0x0b, 0x3e, - 0xe8, 0x07, 0xd3, 0xba, 0xe0, 0x19, 0x19, 0x8b, 0xce, 0xd6, 0x96, 0x07, 0xc9, 0xa2, 0x42, 0xc1, - 0xa0, 0x4f, 0xea, 0x49, 0x50, 0xe8, 0x5a, 0xbb, 0x16, 0x99, 0x88, 0x14, 0x0c, 0xf2, 0xa0, 0xde, - 0x02, 0x94, 0x68, 0x0e, 0x44, 0x18, 0x3d, 0x5d, 0xc4, 0x4d, 0xf3, 0x40, 0x3a, 0xd2, 0x99, 0x4b, - 0x70, 0xdf, 0x3b, 0x3d, 0x85, 0xdf, 0xe3, 0xff, 0xfc, 0x81, 0x1b, 0x91, 0x0d, 0x13, 0x22, 0xf1, - 0xf8, 0x19, 0xae, 0x0b, 0xdb, 0x8e, 0xdb, 0x09, 0x64, 0x13, 0x3f, 0xc1, 0xa0, 0xf9, 0xd2, 0x6d, - 0x73, 0x0c, 0x2c, 0x3c, 0x7b, 0x4d, 0x7b, 0x4f, 0x11, 0x75, 0x9b, 0xa8, 0xe8, 0xf3, 0x96, 0xbf, - 0xb3, 0x06, 0x7d, 0x53, 0xfb, 0x6b, 0x79, 0xa0, 0xc6, 0xcd, 0xfe, 0x6f, 0x8d, 0x1b, 0xa2, 0x71, - 0x24, 0xe6, 0x97, 0xbf, 0xe7, 0xda, 0x48, 0x8e, 0xd4, 0x8f, 0x96, 0x49, 0x51, 0xef, 0x06, 0xd7, - 0x44, 0x4f, 0xc1, 0x52, 0x6a, 0x85, 0x71, 0xad, 0x9d, 0x36, 0xe2, 0x33, 0xa8, 0xeb, 0xe0, 0x06, - 0xf2, 0x72, 0xb5, 0xb5, 0x56, 0x5b, 0xb5, 0xb6, 0x77, 0xba, 0xd6, 0xf6, 0x8e, 0xef, 0x55, 0x6d, - 0xcf, 0x87, 0x66, 0xa7, 0xb1, 0x65, 0x90, 0x9b, 0xc3, 0x00, 0xa6, 0x23, 0x92, 0x95, 0xf7, 0x11, - 0x17, 0x1b, 0xdd, 0x58, 0x4d, 0x89, 0x69, 0x29, 0x4f, 0x41, 0x2d, 0xc5, 0xdb, 0xeb, 0x86, 0x98, - 0x5e, 0xdb, 0x87, 0x69, 0xa4, 0xea, 0x7b, 0x5d, 0xdc, 0x5c, 0x70, 0xe6, 0xb4, 0xe3, 0x5c, 0x02, - 0x27, 0xd9, 0x37, 0x9b, 0x7f, 0x2b, 0x82, 0xc2, 0x8a, 0x6b, 0xf6, 0x76, 0xb4, 0xe7, 0x31, 0xfd, - 0xf3, 0xb8, 0xda, 0x44, 0xa8, 0x9d, 0xd2, 0x30, 0xed, 0x94, 0x87, 0x68, 0x67, 0x9e, 0xd1, 0xce, - 0xf8, 0x45, 0xe7, 0xb3, 0x60, 0xae, 0xed, 0x74, 0xbb, 0xb0, 0x8d, 0xe4, 0x51, 0xed, 0xe0, 0xd5, - 0x9e, 0x19, 0x83, 0x4b, 0xc3, 0x31, 0xf5, 0xa1, 0xdf, 0x24, 0x6b, 0xec, 0x44, 0xe9, 0xa3, 0x04, - 0xed, 0xe5, 0x12, 0xc8, 0xeb, 0x9d, 0x6d, 0xc8, 0xad, 0xc3, 0xe7, 0x98, 0x75, 0xf8, 0x53, 0xa0, - 0xe8, 0x9b, 0xee, 0x36, 0xf4, 0x83, 0x75, 0x02, 0xf2, 0x14, 0x86, 0xfa, 0x97, 0x99, 0x50, 0xff, - 0xdf, 0x0d, 0xf2, 0x48, 0x66, 0xd4, 0x2d, 0xfe, 0x86, 0x41, 0xf0, 0x63, 0xd9, 0x2f, 0xa2, 0x12, - 0x17, 0x51, 0xad, 0x0d, 0xfc, 0x41, 0x3f, 0xd6, 0x85, 0x83, 0xa1, 0x68, 0xaf, 0x05, 0x33, 0x56, - 0xdb, 0xb1, 0xab, 0xbb, 0xe6, 0x36, 0xa4, 0xd5, 0x8c, 0x12, 0x82, 0xb7, 0xfa, 0xae, 0xf3, 0x80, - 0x45, 0x17, 0xb5, 0xa2, 0x04, 0x54, 0x85, 0x1d, 0xab, 0xd3, 0x81, 0x36, 0x6d, 0xd9, 0xf4, 0xe9, - 0xec, 0x19, 0x90, 0x47, 0x3c, 0x20, 0xfd, 0x41, 0xc6, 0x82, 0x72, 0x4c, 0x9d, 0x43, 0xcd, 0x8a, - 0x34, 0x5e, 0x25, 0xc7, 0xaf, 0xb9, 0x8a, 0x78, 0x0d, 0x91, 0xca, 0x0d, 0x6e, 0x5c, 0x4f, 0x00, - 0x05, 0xdb, 0xe9, 0xc0, 0xa1, 0x83, 0x10, 0xc9, 0xa5, 0x3e, 0x19, 0x14, 0x60, 0x07, 0xf5, 0x0a, - 0x32, 0xce, 0x7e, 0x26, 0x59, 0x96, 0x06, 0xc9, 0x9c, 0xce, 0x35, 0x69, 0x10, 0xb7, 0xd9, 0x37, - 0xc0, 0x1f, 0x9d, 0x02, 0xc7, 0x49, 0x1f, 0xd0, 0xdc, 0xbb, 0x88, 0x48, 0x5d, 0x84, 0xda, 0xeb, - 0x07, 0x0f, 0x5c, 0xc7, 0x79, 0x65, 0x3f, 0x09, 0x0a, 0xde, 0xde, 0xc5, 0xd0, 0x08, 0x25, 0x0f, - 0x6c, 0xd3, 0x95, 0xc6, 0x32, 0x9c, 0xc9, 0xa3, 0x0e, 0x67, 0xdc, 0xd0, 0x24, 0x07, 0x8d, 0x3f, - 0x1a, 0xc8, 0xc8, 0x81, 0x8e, 0x60, 0x20, 0x1b, 0x34, 0x0c, 0x9d, 0x06, 0x53, 0xe6, 0x96, 0x0f, - 0xdd, 0xc8, 0x4c, 0xa4, 0x8f, 0x68, 0xa8, 0xbc, 0x08, 0xb7, 0x1c, 0x17, 0x89, 0x85, 0x84, 0x85, - 0x0d, 0x9f, 0x99, 0x96, 0x0b, 0xb8, 0x1d, 0xb4, 0x5b, 0xc1, 0x09, 0xdb, 0xa9, 0xc0, 0x1e, 0x95, - 0x33, 0x41, 0x71, 0x9e, 0xdc, 0xce, 0x7e, 0xe0, 0xc5, 0x81, 0xae, 0x64, 0xe1, 0x60, 0x57, 0xa2, - 0x7d, 0x2e, 0xed, 0x9c, 0xb9, 0x0f, 0xe8, 0xb1, 0x59, 0x68, 0xea, 0xd3, 0xc0, 0x5c, 0x87, 0x7a, - 0x88, 0xb5, 0xad, 0xb0, 0x95, 0xc4, 0x7e, 0xc7, 0x65, 0x8e, 0x14, 0x29, 0xcf, 0x2a, 0xd2, 0x0a, - 0x98, 0xc6, 0x47, 0xaf, 0x91, 0x26, 0x15, 0xfa, 0x3c, 0xf2, 0xf1, 0xb4, 0x2e, 0xac, 0x14, 0x23, - 0xb6, 0xc5, 0x32, 0xfd, 0xc4, 0x08, 0x3f, 0x4e, 0x37, 0xfb, 0x4e, 0x96, 0x50, 0xf6, 0xcd, 0xf1, - 0x97, 0x8a, 0xe0, 0x9a, 0xb2, 0xeb, 0x78, 0x1e, 0x3e, 0x82, 0xd3, 0xdf, 0x30, 0xdf, 0x28, 0x71, - 0x97, 0xfe, 0x3c, 0xa2, 0x9b, 0xdf, 0xa0, 0x06, 0x35, 0xb9, 0xa6, 0xf1, 0x17, 0xc2, 0x41, 0x6b, - 0xc2, 0xfd, 0x87, 0x18, 0xa1, 0xff, 0xe7, 0x68, 0x24, 0xef, 0xc9, 0x89, 0xc4, 0xd1, 0x49, 0x29, - 0xab, 0xec, 0x9b, 0xcb, 0x97, 0x24, 0xf0, 0xe8, 0x7e, 0x6e, 0x36, 0x6c, 0x2f, 0x6c, 0x30, 0xd7, - 0x0d, 0x69, 0x2f, 0x7c, 0xdc, 0x95, 0xc4, 0x3b, 0x7e, 0x63, 0xea, 0xce, 0x94, 0x16, 0xb3, 0x58, - 0x12, 0x1d, 0xe8, 0x49, 0xba, 0xe3, 0x37, 0x35, 0xf9, 0xec, 0x85, 0xfb, 0xbb, 0x79, 0x70, 0x7c, - 0xc5, 0x75, 0xf6, 0x7a, 0x5e, 0xd4, 0x03, 0xfd, 0xc9, 0xe0, 0x0d, 0xd9, 0xa2, 0x88, 0x69, 0x70, - 0x3d, 0x98, 0x75, 0xa9, 0x35, 0x17, 0x6d, 0xcf, 0xb2, 0x49, 0x6c, 0xef, 0x25, 0x1f, 0xa6, 0xf7, - 0x8a, 0xfa, 0x99, 0x3c, 0xd7, 0xcf, 0xf4, 0xf7, 0x1c, 0x85, 0x01, 0x3d, 0xc7, 0x1f, 0x4b, 0x29, - 0x07, 0xd5, 0x3e, 0x11, 0xc5, 0xf4, 0x17, 0x65, 0x50, 0xdc, 0xc6, 0x19, 0x69, 0x77, 0xf1, 0x78, - 0xb1, 0x9a, 0x61, 0xe2, 0x06, 0xfd, 0x34, 0x92, 0xab, 0xcc, 0xea, 0x70, 0xaa, 0x01, 0x2e, 0x99, - 0xdb, 0xec, 0x95, 0xea, 0xe1, 0x3c, 0x98, 0x0b, 0x4b, 0xaf, 0x76, 0x3c, 0x2e, 0xba, 0x2b, 0xa3, - 0x51, 0xf3, 0x22, 0x1a, 0x75, 0x60, 0x9d, 0x39, 0x1c, 0x75, 0x64, 0x66, 0xd4, 0x19, 0x38, 0xba, - 0xcc, 0xc5, 0x8c, 0x2e, 0xda, 0x73, 0x65, 0xd1, 0x6b, 0xf3, 0xf8, 0xae, 0x15, 0xd7, 0xe6, 0x91, - 0x3c, 0x58, 0x08, 0x5e, 0xde, 0x37, 0xbc, 0x56, 0xd9, 0x2b, 0xc9, 0x87, 0x25, 0x70, 0xe2, 0x60, - 0x67, 0xfe, 0x1d, 0xbc, 0x97, 0x1a, 0xaa, 0x93, 0x17, 0x7a, 0xa9, 0xe1, 0x27, 0x7e, 0x93, 0x2e, - 0x31, 0x08, 0x0a, 0x67, 0xef, 0x0d, 0xef, 0xc4, 0xc5, 0xc2, 0x9c, 0x08, 0x12, 0xcd, 0x5e, 0x80, - 0x3f, 0x25, 0x83, 0x99, 0x26, 0xf4, 0x6b, 0xe6, 0xbe, 0xb3, 0xe7, 0x6b, 0xa6, 0xe8, 0xf6, 0xdc, - 0x53, 0x41, 0xb1, 0x8b, 0x3f, 0xc1, 0x1d, 0x0c, 0x1b, 0x74, 0x94, 0xdd, 0xdf, 0xc2, 0xbe, 0x41, - 0x84, 0xb4, 0x41, 0xf3, 0xf3, 0xd1, 0x67, 0x44, 0x76, 0x47, 0x43, 0xee, 0xc6, 0xb2, 0xb5, 0x93, - 0x6a, 0xef, 0x34, 0xae, 0xe8, 0xec, 0x61, 0xf9, 0x61, 0x19, 0xcc, 0x37, 0xa1, 0x5f, 0xf5, 0x96, - 0xcd, 0xcb, 0x8e, 0x6b, 0xf9, 0x50, 0x5b, 0x11, 0x85, 0xe6, 0x0c, 0x00, 0x56, 0xf8, 0x19, 0x8d, - 0x89, 0xc5, 0xa4, 0x68, 0x6f, 0x49, 0xeb, 0x28, 0xc4, 0xf1, 0x31, 0x16, 0x10, 0x52, 0xf9, 0x58, - 0x24, 0x15, 0x3f, 0x81, 0x8b, 0xbf, 0x25, 0x0a, 0x44, 0xc9, 0x6d, 0xef, 0x58, 0x97, 0x61, 0x27, - 0x25, 0x10, 0xc1, 0x67, 0x11, 0x10, 0x21, 0xa1, 0xd4, 0xee, 0x2b, 0x1c, 0x1f, 0xe3, 0x70, 0x5f, - 0x49, 0x22, 0x38, 0x91, 0xb0, 0x56, 0xa8, 0xeb, 0xa1, 0xeb, 0x99, 0xf7, 0x8a, 0x8a, 0x35, 0x32, - 0xd9, 0x24, 0xd6, 0x64, 0x1b, 0xa9, 0x63, 0x21, 0x65, 0x0f, 0xd3, 0xe9, 0x7c, 0x16, 0x1d, 0xcb, - 0xc0, 0xa2, 0xb3, 0x17, 0xfa, 0xfb, 0x64, 0x70, 0x75, 0x18, 0xef, 0xa5, 0x09, 0xfd, 0x8a, 0xe9, - 0xed, 0x5c, 0x74, 0x4c, 0xb7, 0xa3, 0x95, 0xc7, 0x70, 0xe0, 0x50, 0xfb, 0x43, 0x16, 0x84, 0x3a, - 0x0f, 0xc2, 0x40, 0x57, 0xd2, 0x81, 0xbc, 0x8c, 0xa3, 0x93, 0x49, 0xf4, 0x76, 0x7d, 0x47, 0x08, - 0xd6, 0x33, 0x39, 0xb0, 0xee, 0x19, 0x95, 0xc5, 0xec, 0x81, 0xfb, 0x59, 0x32, 0x22, 0x30, 0x5e, - 0xcf, 0x17, 0x44, 0x01, 0x8b, 0xf1, 0x7a, 0x95, 0x63, 0xbd, 0x5e, 0x47, 0x1a, 0x23, 0x86, 0x7a, - 0x2c, 0x67, 0x3b, 0x46, 0x1c, 0xa1, 0x37, 0xf2, 0xbb, 0x64, 0xa0, 0xe0, 0x80, 0x5f, 0x8c, 0x47, - 0x38, 0x1b, 0x3f, 0x3b, 0x19, 0x9d, 0x03, 0xde, 0xe7, 0x53, 0x69, 0xbd, 0xcf, 0xb5, 0x77, 0xa6, - 0xf5, 0x31, 0xef, 0xe7, 0x76, 0x2c, 0x88, 0xa5, 0x72, 0x21, 0x1f, 0xc2, 0x41, 0xf6, 0xa0, 0xfd, - 0x98, 0x0c, 0x00, 0x6a, 0xd0, 0xf4, 0x6c, 0xc4, 0xb3, 0x44, 0xe1, 0xba, 0x8d, 0xf5, 0xbb, 0x47, - 0x40, 0x5d, 0xdd, 0x07, 0x14, 0xa1, 0x18, 0x9d, 0xba, 0x78, 0x7d, 0x5a, 0xdf, 0xca, 0x88, 0xab, - 0xb1, 0xc0, 0x92, 0xca, 0xdb, 0x32, 0xb6, 0xec, 0xec, 0x01, 0xf9, 0xef, 0x12, 0x28, 0xb4, 0x9c, - 0x26, 0xf4, 0x0f, 0x6f, 0x0a, 0xa4, 0x8e, 0x1a, 0x80, 0xcb, 0x1d, 0x47, 0xd4, 0x80, 0x41, 0x84, - 0xb2, 0x17, 0xdd, 0x7b, 0x25, 0x30, 0xd7, 0x72, 0xca, 0xe1, 0xe2, 0x94, 0xb8, 0xaf, 0xaa, 0xf8, - 0xd5, 0xff, 0x61, 0x05, 0xa3, 0x62, 0x0e, 0x75, 0xf5, 0xff, 0x70, 0x7a, 0xd9, 0xcb, 0xed, 0x4e, - 0x70, 0x7c, 0xc3, 0xee, 0x38, 0x06, 0xec, 0x38, 0x74, 0xa5, 0x5b, 0x55, 0x41, 0x7e, 0xcf, 0xee, - 0x38, 0x98, 0xe5, 0x82, 0x81, 0xff, 0xa3, 0x34, 0x17, 0x76, 0x1c, 0xea, 0x1b, 0x80, 0xff, 0x6b, - 0x7f, 0x21, 0x83, 0x3c, 0xfa, 0x56, 0x5c, 0xd4, 0xef, 0x92, 0x53, 0xc6, 0x41, 0x40, 0xe4, 0xc7, - 0x62, 0x09, 0xdd, 0xcb, 0xac, 0xfd, 0x13, 0x0f, 0xd6, 0x1b, 0xe2, 0xca, 0x63, 0x44, 0x11, 0xad, - 0xf9, 0xab, 0xa7, 0xc1, 0xd4, 0xc5, 0xae, 0xd3, 0xbe, 0x14, 0x1d, 0xd7, 0xa7, 0x8f, 0xea, 0x2d, - 0xa0, 0xe0, 0x9a, 0xf6, 0x36, 0xa4, 0x7b, 0x0a, 0x27, 0xfb, 0xfa, 0x42, 0xec, 0xf5, 0x62, 0x90, - 0x2c, 0xda, 0x3b, 0xd3, 0x44, 0x60, 0x18, 0x50, 0xf9, 0x74, 0xfa, 0x50, 0x19, 0xe1, 0xe4, 0x99, - 0x02, 0xe6, 0xca, 0xa5, 0x3a, 0xb9, 0xc7, 0xb0, 0x71, 0x4e, 0x57, 0x64, 0x0c, 0x33, 0x92, 0x49, - 0x86, 0x30, 0x23, 0xf2, 0xff, 0x69, 0x61, 0x1e, 0x50, 0xf9, 0xa3, 0x80, 0xf9, 0x33, 0x12, 0x98, - 0xaf, 0x59, 0x9e, 0x1f, 0xe7, 0xed, 0x9f, 0x10, 0xef, 0xf7, 0x25, 0x69, 0x4d, 0x65, 0xae, 0x1c, - 0xe1, 0x40, 0xbf, 0xa9, 0xcc, 0xe1, 0xa4, 0x22, 0x26, 0x73, 0x2c, 0x05, 0x73, 0x40, 0x2e, 0xb1, - 0x17, 0x96, 0x64, 0x6a, 0x43, 0x29, 0x2a, 0x64, 0xf2, 0x86, 0x52, 0x6c, 0xd9, 0xd9, 0xcb, 0xf7, - 0x2f, 0x24, 0x70, 0x02, 0x15, 0x9f, 0xb4, 0x2c, 0x15, 0x2f, 0xe6, 0xa1, 0xcb, 0x52, 0xa9, 0x57, - 0xc6, 0x0f, 0xf0, 0x32, 0x8e, 0x95, 0xf1, 0x61, 0x44, 0x27, 0x2c, 0xe6, 0x98, 0x65, 0xd8, 0x61, - 0x62, 0x4e, 0x58, 0x86, 0x1d, 0x5d, 0xcc, 0xc9, 0x4b, 0xb1, 0x23, 0x8a, 0xf9, 0xc8, 0x16, 0x58, - 0x7f, 0x41, 0x0e, 0xc5, 0x1c, 0xbb, 0xb6, 0x91, 0x20, 0xe6, 0xd4, 0x27, 0x7a, 0xb5, 0x77, 0x8f, - 0x28, 0xf8, 0x31, 0xaf, 0x6f, 0x8c, 0x02, 0xd3, 0x11, 0xae, 0x71, 0xfc, 0x9c, 0x0c, 0x16, 0x28, - 0x17, 0x83, 0xa7, 0xcc, 0x09, 0x18, 0xa5, 0x9e, 0x32, 0xa7, 0x3e, 0x03, 0xc4, 0x73, 0x36, 0xf9, - 0x33, 0x40, 0x89, 0xe5, 0x67, 0x0f, 0xce, 0x5f, 0xe5, 0xc1, 0x29, 0xc4, 0xc2, 0x9a, 0xd3, 0xb1, - 0xb6, 0xf6, 0x09, 0x17, 0xe7, 0xcc, 0xee, 0x1e, 0xf4, 0xb4, 0x0f, 0x48, 0xa2, 0x28, 0xfd, 0x17, - 0x00, 0x9c, 0x1e, 0x74, 0x49, 0x1c, 0x37, 0x0a, 0xd4, 0xdd, 0x71, 0x95, 0x3d, 0x58, 0x52, 0x78, - 0xfd, 0x4d, 0x23, 0x20, 0x62, 0x30, 0xf4, 0x90, 0x55, 0x38, 0x13, 0xbe, 0xe9, 0x77, 0xf0, 0xc8, - 0x1d, 0x74, 0xf0, 0xb8, 0x19, 0xc8, 0x66, 0xa7, 0x13, 0x42, 0xd5, 0xbf, 0x99, 0x8d, 0xcb, 0x34, - 0x50, 0x16, 0x94, 0xd3, 0x83, 0xd1, 0xd1, 0xbc, 0x98, 0x9c, 0x1e, 0xf4, 0xd5, 0x45, 0x50, 0x24, - 0xd7, 0x81, 0x87, 0x2b, 0xfa, 0x83, 0x33, 0xd3, 0x5c, 0xbc, 0x69, 0xd7, 0xe0, 0xd5, 0xf0, 0xce, - 0x54, 0x92, 0x19, 0xd4, 0x4f, 0x47, 0x76, 0xb2, 0xc1, 0x29, 0xd8, 0xd3, 0x47, 0xa6, 0x3c, 0x99, - 0xdd, 0xb0, 0x52, 0xaf, 0xd7, 0xdd, 0x6f, 0xd1, 0xc0, 0x03, 0xa9, 0x76, 0xc3, 0x98, 0xf8, 0x05, - 0xd2, 0x81, 0xf8, 0x05, 0xa9, 0x77, 0xc3, 0x38, 0x3e, 0xc6, 0xb1, 0x1b, 0x96, 0x44, 0x70, 0x22, - 0xf7, 0xf0, 0x60, 0xab, 0x99, 0xde, 0x46, 0xf0, 0x8f, 0x83, 0x3d, 0xab, 0x01, 0xef, 0xec, 0x32, - 0xe8, 0xa2, 0x82, 0xc4, 0x5b, 0x58, 0xd4, 0x27, 0x83, 0xe2, 0x96, 0xe3, 0xee, 0x9a, 0xc1, 0xc6, - 0x7d, 0xff, 0x49, 0x11, 0x7a, 0x03, 0xc0, 0x32, 0xce, 0x63, 0xd0, 0xbc, 0x68, 0x3e, 0xf2, 0x1c, - 0xab, 0x47, 0x83, 0x3e, 0xa2, 0xbf, 0xea, 0x8d, 0x60, 0x9e, 0xc6, 0x7e, 0xac, 0x43, 0xcf, 0x87, - 0x1d, 0x1a, 0xd1, 0x82, 0x4f, 0x54, 0xcf, 0x82, 0x39, 0x9a, 0xb0, 0x6c, 0x75, 0xa1, 0x47, 0x83, - 0x5a, 0x70, 0x69, 0xea, 0x29, 0x50, 0xb4, 0xbc, 0xfb, 0x3c, 0xc7, 0xa6, 0x01, 0xf9, 0xe8, 0x93, - 0x7a, 0x33, 0x38, 0x4e, 0xf3, 0x85, 0xc6, 0x2a, 0x39, 0xb0, 0xd3, 0x9f, 0x8c, 0x54, 0xcb, 0x76, - 0xd6, 0x5d, 0x67, 0xdb, 0x85, 0x9e, 0x87, 0x4f, 0x4d, 0x4d, 0x1b, 0x4c, 0x8a, 0x7a, 0x01, 0x9c, - 0xe8, 0x5a, 0xf6, 0x25, 0x0f, 0xc7, 0x08, 0x5e, 0xa6, 0x6e, 0x63, 0x73, 0x03, 0x62, 0x77, 0x33, - 0x8d, 0x8d, 0xca, 0x81, 0xfd, 0xc4, 0x38, 0x48, 0x45, 0xbd, 0x05, 0x28, 0x94, 0x9b, 0x25, 0xb3, - 0x7d, 0x09, 0xbf, 0xa7, 0xee, 0xa8, 0x07, 0xd2, 0x19, 0x61, 0x90, 0x30, 0xfa, 0x0b, 0x9c, 0x30, - 0x48, 0x24, 0xfd, 0x97, 0xe5, 0xc0, 0x1c, 0x57, 0x80, 0x09, 0xd4, 0xa0, 0x5b, 0xf4, 0xce, 0xef, - 0x58, 0x3e, 0x44, 0xcc, 0xd1, 0xb3, 0x2e, 0x4f, 0x1c, 0xc2, 0xbc, 0x71, 0xe0, 0x43, 0x63, 0x00, - 0x31, 0xc4, 0x17, 0xe9, 0xf0, 0xb0, 0x67, 0x99, 0x47, 0x6d, 0x55, 0x2e, 0x4d, 0x7b, 0x0e, 0x50, - 0x0f, 0x52, 0x63, 0xbc, 0x40, 0x72, 0xe9, 0xbc, 0x40, 0x90, 0xdc, 0xcc, 0x6e, 0xd7, 0xb9, 0x02, - 0x3b, 0x21, 0x59, 0xaa, 0xab, 0x07, 0xd2, 0xb5, 0xcf, 0x8f, 0x32, 0x2f, 0x4c, 0x7d, 0xb1, 0x06, - 0x6a, 0x64, 0x7b, 0xed, 0x36, 0x84, 0x1d, 0x7a, 0x70, 0x2d, 0x78, 0x4c, 0x79, 0xe5, 0x46, 0xea, - 0x59, 0xe4, 0x11, 0xdd, 0xb9, 0xf1, 0xb1, 0xab, 0x41, 0x91, 0xdc, 0x5f, 0xa7, 0xbd, 0x6c, 0x61, - 0x60, 0x5f, 0xb3, 0xc0, 0xf7, 0x35, 0x1b, 0x60, 0xce, 0x76, 0x50, 0x71, 0xeb, 0xa6, 0x6b, 0xee, - 0x7a, 0x49, 0x8b, 0xc4, 0x84, 0x6e, 0x68, 0x11, 0xd4, 0x99, 0xcf, 0x56, 0x8f, 0x19, 0x1c, 0x19, - 0xf5, 0xff, 0x00, 0xc7, 0x2f, 0xd2, 0x00, 0x0f, 0x1e, 0xa5, 0x2c, 0xc5, 0xbb, 0x50, 0xf6, 0x51, - 0x5e, 0xe2, 0xbf, 0x5c, 0x3d, 0x66, 0xf4, 0x13, 0x53, 0xbf, 0x17, 0x2c, 0xa0, 0xc7, 0x8e, 0x73, - 0x25, 0x60, 0x5c, 0x8e, 0xb7, 0x23, 0xfb, 0xc8, 0xaf, 0x71, 0x1f, 0xae, 0x1e, 0x33, 0xfa, 0x48, - 0xa9, 0x0d, 0x00, 0x76, 0xfc, 0xdd, 0x2e, 0x25, 0x9c, 0x8f, 0x57, 0xc9, 0x3e, 0xc2, 0xab, 0xe1, - 0x47, 0xab, 0xc7, 0x0c, 0x86, 0x84, 0x5a, 0x03, 0x33, 0xfe, 0x83, 0x3e, 0xa5, 0x57, 0x88, 0xf7, - 0x5d, 0xe8, 0xa3, 0xd7, 0x0a, 0xbe, 0x59, 0x3d, 0x66, 0x44, 0x04, 0xd4, 0x2a, 0x98, 0xee, 0x5d, - 0xa4, 0xc4, 0x8a, 0xf1, 0xfd, 0x5d, 0x1f, 0xb1, 0xf5, 0x8b, 0x21, 0xad, 0xf0, 0x73, 0xc4, 0x58, - 0xdb, 0xbb, 0x4c, 0x69, 0x4d, 0x09, 0x33, 0x56, 0x0e, 0xbe, 0x41, 0x8c, 0x85, 0x04, 0xd4, 0x2a, - 0x98, 0xf1, 0x6c, 0xb3, 0xe7, 0xed, 0x38, 0xbe, 0x77, 0x7a, 0xba, 0xcf, 0xcd, 0x35, 0x9e, 0x5a, - 0x93, 0x7e, 0x63, 0x44, 0x5f, 0xab, 0x4f, 0x06, 0x57, 0xef, 0xf5, 0x3a, 0xa6, 0x0f, 0xf5, 0x07, - 0x2d, 0xcf, 0xb7, 0xec, 0xed, 0x20, 0x42, 0x31, 0x19, 0x2c, 0x06, 0xbf, 0x54, 0x17, 0xe9, 0x81, - 0x37, 0x80, 0xdb, 0xa6, 0xd6, 0xbf, 0xd7, 0x4a, 0x8a, 0x65, 0xce, 0xb9, 0x3d, 0x0d, 0xe4, 0xd1, - 0x2b, 0x3c, 0xb8, 0x2c, 0x0c, 0x5e, 0xc7, 0xed, 0xd7, 0x1d, 0xdc, 0x80, 0xd1, 0x47, 0x7d, 0xe3, - 0xd3, 0xdc, 0x81, 0xf1, 0xe9, 0x7a, 0x30, 0x6b, 0x79, 0x6b, 0xd6, 0x36, 0x31, 0x8e, 0xe9, 0xf8, - 0xc1, 0x26, 0x91, 0xc5, 0x84, 0x3a, 0xbc, 0x42, 0x06, 0x8e, 0xe3, 0xc1, 0x62, 0x42, 0x90, 0xa2, - 0xdd, 0x04, 0xe6, 0xd8, 0x46, 0x46, 0x2e, 0xc1, 0xb5, 0x22, 0xd3, 0x9a, 0x3e, 0x69, 0x37, 0x82, - 0x05, 0x5e, 0xa7, 0x19, 0x0b, 0x42, 0x0e, 0xba, 0x42, 0xed, 0x06, 0x70, 0xbc, 0xaf, 0x61, 0x05, - 0x21, 0x63, 0x72, 0x51, 0xc8, 0x98, 0xeb, 0x01, 0x88, 0xb4, 0x78, 0x20, 0x99, 0xeb, 0xc0, 0x4c, - 0xa8, 0x97, 0x03, 0x33, 0xfc, 0x69, 0x0e, 0x4c, 0x07, 0xca, 0x36, 0x28, 0x03, 0x1a, 0x99, 0x6c, - 0x66, 0x7f, 0x28, 0x18, 0x99, 0xd8, 0x34, 0x64, 0x26, 0x44, 0x5e, 0xd9, 0x2d, 0xcb, 0xef, 0x06, - 0x27, 0x1b, 0xfb, 0x93, 0xd5, 0x75, 0x00, 0x2c, 0x8c, 0x51, 0x2b, 0x3a, 0xea, 0x78, 0x7b, 0x8a, - 0xf6, 0x40, 0xf4, 0x81, 0xa1, 0x71, 0xf6, 0x3b, 0xe8, 0x39, 0xc4, 0x19, 0x50, 0x20, 0x61, 0xfa, - 0x8f, 0xa9, 0x0b, 0x00, 0xe8, 0xcf, 0x5a, 0xd7, 0x8d, 0xaa, 0x5e, 0x2f, 0xeb, 0x4a, 0x4e, 0x7b, - 0x85, 0x04, 0x66, 0xc2, 0x46, 0x30, 0xb0, 0x92, 0x3a, 0x55, 0xad, 0xa1, 0xf7, 0x8c, 0x1e, 0x6c, - 0x54, 0xac, 0x92, 0x3d, 0x15, 0x3c, 0x6a, 0xcf, 0x83, 0xcb, 0x96, 0xeb, 0xf9, 0x86, 0x73, 0x65, - 0xd9, 0x71, 0xa3, 0x81, 0x95, 0x04, 0xb8, 0x8d, 0x7b, 0x8d, 0x0c, 0xc6, 0x0e, 0xc4, 0x67, 0xde, - 0xa0, 0x4b, 0x17, 0xfe, 0xa3, 0x04, 0x44, 0xd7, 0x77, 0x4d, 0xdb, 0xeb, 0x39, 0x1e, 0x34, 0x9c, - 0x2b, 0x5e, 0xc9, 0xee, 0x94, 0x9d, 0xee, 0xde, 0xae, 0xed, 0x51, 0x93, 0x2f, 0xee, 0x35, 0x92, - 0x0e, 0xbe, 0x45, 0x78, 0x01, 0x80, 0x72, 0xa3, 0x56, 0xd3, 0xcb, 0xad, 0x6a, 0xa3, 0xae, 0x1c, - 0x43, 0xd2, 0x6a, 0x95, 0x96, 0x6a, 0x48, 0x3a, 0xdf, 0x07, 0xa6, 0x83, 0x36, 0x4d, 0xa3, 0xdc, - 0xe4, 0x82, 0x28, 0x37, 0x6a, 0x09, 0x4c, 0x07, 0xad, 0x9c, 0x8e, 0x08, 0x8f, 0xed, 0x3f, 0xd5, - 0xbc, 0x6b, 0xba, 0x3e, 0x36, 0x50, 0x02, 0x22, 0x4b, 0xa6, 0x07, 0x8d, 0xf0, 0xb3, 0xb3, 0x4f, - 0xa0, 0x1c, 0xa8, 0x60, 0xa1, 0x54, 0xab, 0x6d, 0x36, 0x8c, 0xcd, 0x7a, 0xa3, 0xb5, 0x5a, 0xad, - 0xaf, 0x90, 0x11, 0xb2, 0xba, 0x52, 0x6f, 0x18, 0x3a, 0x19, 0x20, 0x9b, 0x4a, 0x8e, 0xdc, 0x62, - 0xbd, 0x34, 0x0d, 0x8a, 0x3d, 0x2c, 0x5d, 0xed, 0x4b, 0x72, 0xca, 0x70, 0x06, 0x21, 0x4e, 0x31, - 0xf7, 0xec, 0x72, 0x47, 0x0a, 0xa4, 0x01, 0x47, 0x7e, 0xcf, 0x82, 0x39, 0x62, 0xaa, 0x7b, 0x78, - 0x77, 0x06, 0x23, 0x27, 0x1b, 0x5c, 0x9a, 0xf6, 0x09, 0x29, 0x45, 0x8c, 0x83, 0x81, 0x1c, 0xa5, - 0x33, 0x2e, 0x7e, 0x2f, 0x37, 0xda, 0xa5, 0x16, 0xd5, 0x7a, 0x4b, 0x37, 0xea, 0xa5, 0x1a, 0xcd, - 0x22, 0xab, 0xa7, 0xc1, 0xc9, 0x7a, 0x83, 0x86, 0x74, 0x6c, 0x6e, 0xb6, 0x1a, 0x9b, 0xd5, 0xb5, - 0xf5, 0x86, 0xd1, 0x52, 0x0a, 0xea, 0x29, 0xa0, 0x92, 0xff, 0x9b, 0xd5, 0xe6, 0x66, 0xb9, 0x54, - 0x2f, 0xeb, 0x35, 0xbd, 0xa2, 0x14, 0xd5, 0xc7, 0x81, 0x1b, 0xc8, 0x25, 0x49, 0x8d, 0xe5, 0x4d, - 0xa3, 0x71, 0xbe, 0x89, 0x10, 0x34, 0xf4, 0x5a, 0x09, 0x29, 0x12, 0x73, 0x9b, 0xf5, 0x94, 0x7a, - 0x15, 0x38, 0x8e, 0xaf, 0xba, 0xaf, 0x35, 0x4a, 0x15, 0x5a, 0xde, 0xb4, 0x7a, 0x2d, 0x38, 0x5d, - 0xad, 0x37, 0x37, 0x96, 0x97, 0xab, 0xe5, 0xaa, 0x5e, 0x6f, 0x6d, 0xae, 0xeb, 0xc6, 0x5a, 0xb5, - 0xd9, 0x44, 0xdf, 0x2a, 0x33, 0xf8, 0xae, 0x60, 0xd2, 0x67, 0x6a, 0xef, 0x97, 0xc1, 0xfc, 0x39, - 0xb3, 0x6b, 0xa1, 0x81, 0x02, 0x5f, 0x22, 0xde, 0x77, 0x1a, 0xc8, 0xc7, 0x97, 0x8d, 0xd3, 0xf3, - 0x04, 0xf8, 0x41, 0xfb, 0x21, 0x39, 0xe5, 0x69, 0x20, 0x0a, 0x04, 0x29, 0x71, 0x91, 0x2b, 0x2d, - 0x66, 0xee, 0xfa, 0x5a, 0x29, 0xc5, 0x69, 0x20, 0x71, 0xf2, 0xe9, 0xc0, 0xff, 0xf9, 0x71, 0x81, - 0xaf, 0x80, 0xb9, 0x8d, 0x7a, 0x69, 0xa3, 0xb5, 0xda, 0x30, 0xaa, 0xdf, 0x83, 0x63, 0xd9, 0xcf, - 0x83, 0x99, 0xe5, 0x86, 0xb1, 0x54, 0xad, 0x54, 0xf4, 0xba, 0x52, 0x50, 0x1f, 0x05, 0xae, 0x6a, - 0xea, 0xc6, 0xb9, 0x6a, 0x59, 0xdf, 0xdc, 0xa8, 0x97, 0xce, 0x95, 0xaa, 0x35, 0xdc, 0x47, 0x14, - 0x13, 0x2e, 0x40, 0x9f, 0xd2, 0x7e, 0x20, 0x0f, 0x00, 0xa9, 0x3a, 0xbe, 0xca, 0x89, 0xb9, 0x26, - 0xfb, 0x0f, 0xd2, 0x4e, 0x1a, 0x22, 0x32, 0x31, 0xed, 0xb7, 0x0a, 0xa6, 0x5d, 0xfa, 0x82, 0xae, - 0x8e, 0x0d, 0xa3, 0x43, 0xfe, 0x06, 0xd4, 0x8c, 0xf0, 0x73, 0xed, 0x03, 0x69, 0xe6, 0x08, 0xb1, - 0x8c, 0xa5, 0x43, 0x72, 0x79, 0x3c, 0x40, 0x6a, 0x2f, 0xce, 0x81, 0x05, 0xbe, 0x62, 0xa8, 0x12, - 0xd8, 0x98, 0x12, 0xab, 0x04, 0xff, 0x31, 0x63, 0x64, 0x9d, 0x7d, 0x12, 0x1d, 0x4e, 0x41, 0xd0, - 0x32, 0xc9, 0xc1, 0xfe, 0xc0, 0x62, 0x51, 0x72, 0x88, 0x79, 0x64, 0x74, 0x28, 0x92, 0x3a, 0x05, - 0xe4, 0xd6, 0x83, 0xbe, 0x22, 0x6b, 0x5f, 0x93, 0xc1, 0x3c, 0x77, 0x0f, 0xb7, 0xf6, 0xce, 0x9c, - 0xc8, 0x1d, 0xb9, 0xcc, 0x0d, 0xdf, 0xb9, 0xc3, 0xde, 0xf0, 0x7d, 0xf6, 0x5e, 0x30, 0x45, 0xd3, - 0xb0, 0x7c, 0x1b, 0x75, 0x64, 0x0a, 0x1c, 0x07, 0xb3, 0x2b, 0x7a, 0x6b, 0xb3, 0xd9, 0x2a, 0x19, - 0x2d, 0xbd, 0xa2, 0xe4, 0xd0, 0xc0, 0xa7, 0xaf, 0xad, 0xb7, 0x2e, 0x28, 0x12, 0x1a, 0x13, 0x57, - 0x36, 0xaa, 0x15, 0x7d, 0xb3, 0x51, 0xaf, 0x5d, 0x50, 0xe4, 0xf4, 0x0e, 0x97, 0xfd, 0x8c, 0x4d, - 0xd8, 0xe1, 0x32, 0xa9, 0xf8, 0xec, 0xe7, 0xae, 0x9f, 0x93, 0x81, 0x42, 0x38, 0xd0, 0x1f, 0xec, - 0x41, 0xd7, 0x82, 0x76, 0x1b, 0x6a, 0x97, 0x44, 0x02, 0xc0, 0x1e, 0x08, 0x7d, 0x88, 0xfb, 0x77, - 0xc6, 0x6a, 0x24, 0x0f, 0x7d, 0x06, 0x77, 0xfe, 0x80, 0xc1, 0xfd, 0x5b, 0x69, 0x3d, 0x2e, 0xfb, - 0xd9, 0x1d, 0x0b, 0x64, 0x9f, 0x4e, 0xe3, 0x71, 0x39, 0x84, 0x83, 0x89, 0xc4, 0x75, 0x8e, 0x19, - 0x8f, 0x15, 0x59, 0x7b, 0x91, 0x0c, 0x8e, 0x57, 0x4c, 0x1f, 0x2e, 0xed, 0xb7, 0x82, 0x7b, 0x33, - 0x63, 0xee, 0xba, 0xce, 0x1d, 0xb8, 0xeb, 0x3a, 0xba, 0x7a, 0x53, 0xea, 0xbb, 0x7a, 0x53, 0x7b, - 0x4f, 0xda, 0x33, 0x9a, 0x7d, 0x3c, 0x8c, 0x2d, 0xf8, 0x72, 0xba, 0xb3, 0x97, 0xc9, 0x5c, 0x64, - 0xdf, 0xc0, 0xde, 0x3e, 0x03, 0x14, 0xc2, 0x0a, 0xe3, 0x54, 0xf8, 0x53, 0xf4, 0x7a, 0xf8, 0xcd, - 0x14, 0x31, 0x1c, 0x83, 0xa8, 0x18, 0x12, 0x1f, 0x15, 0x83, 0x5b, 0xa3, 0x96, 0xfb, 0x1d, 0x41, - 0xd2, 0x76, 0x86, 0x8c, 0x07, 0x61, 0x7c, 0xd8, 0xdc, 0xec, 0x3a, 0xc3, 0xc4, 0xe2, 0x27, 0x73, - 0x85, 0x31, 0xbd, 0x35, 0x54, 0x17, 0x45, 0x26, 0xf9, 0xa6, 0xf6, 0xb4, 0xee, 0xe4, 0x9c, 0x07, - 0x67, 0xc2, 0xf5, 0xe5, 0xd9, 0xb9, 0x93, 0x0f, 0xe3, 0x20, 0x7b, 0x14, 0xbe, 0x25, 0x81, 0x7c, - 0xd3, 0x71, 0xfd, 0x71, 0x61, 0x90, 0x76, 0x0b, 0x9c, 0x91, 0x40, 0x33, 0x7e, 0x0e, 0x9a, 0xdd, - 0x16, 0x78, 0x72, 0xf9, 0x13, 0x08, 0x83, 0x79, 0x1c, 0x2c, 0x10, 0x4e, 0xc2, 0x3b, 0x64, 0xfe, - 0x55, 0x22, 0xfd, 0xd5, 0xfd, 0xa2, 0x88, 0xe0, 0x8d, 0x90, 0x70, 0x0b, 0x3a, 0x00, 0x85, 0x4b, - 0xd3, 0xde, 0xc8, 0xe2, 0x52, 0xe1, 0x71, 0x19, 0x34, 0x03, 0x0f, 0xaf, 0x61, 0x19, 0x57, 0xcf, - 0x94, 0x26, 0xa2, 0x66, 0x42, 0xe1, 0xd9, 0x23, 0xf2, 0x90, 0x0c, 0x8a, 0xd4, 0x05, 0x70, 0xac, - 0x08, 0xa4, 0x6d, 0x19, 0xa1, 0x10, 0xc4, 0x5c, 0x05, 0xe5, 0x71, 0xb7, 0x8c, 0xe4, 0xf2, 0xb3, - 0xc7, 0xe1, 0xdf, 0xa9, 0x6f, 0x6b, 0xe9, 0xb2, 0x69, 0x75, 0xcd, 0x8b, 0xdd, 0x14, 0x91, 0xac, - 0x3f, 0x91, 0xf2, 0x34, 0x5f, 0x58, 0x55, 0xae, 0xbc, 0x18, 0x89, 0x7f, 0x17, 0x98, 0x71, 0xb9, - 0xbd, 0x3f, 0x64, 0x45, 0xf5, 0xf9, 0x15, 0xd3, 0xf7, 0x46, 0x94, 0x33, 0xd5, 0xd1, 0x3d, 0x21, - 0x7e, 0x26, 0x72, 0xd4, 0x68, 0xb6, 0xd4, 0xe9, 0x2c, 0x43, 0xd3, 0xdf, 0x73, 0x61, 0x27, 0xd5, - 0x10, 0xe1, 0xf6, 0x6d, 0x8f, 0x32, 0x92, 0xe0, 0x62, 0x49, 0xd6, 0x78, 0x74, 0x9e, 0x32, 0xa4, - 0x37, 0x08, 0x78, 0x19, 0x4b, 0x97, 0xf4, 0xb6, 0x10, 0x92, 0x06, 0x07, 0xc9, 0xd3, 0x46, 0x63, - 0x22, 0x7b, 0x40, 0x7e, 0x46, 0x06, 0x0b, 0xc4, 0x4e, 0x18, 0x37, 0x26, 0x1f, 0x4a, 0xe9, 0x32, - 0xc4, 0xdc, 0xd2, 0xc5, 0xb2, 0x33, 0x16, 0x58, 0xd2, 0x38, 0x18, 0x89, 0xf1, 0x91, 0x3d, 0x32, - 0xcf, 0x3f, 0x01, 0x00, 0xe3, 0x06, 0xfa, 0x89, 0x62, 0x14, 0xd7, 0x51, 0x7b, 0x27, 0x9d, 0x7f, - 0x34, 0xb9, 0x20, 0xe3, 0x8c, 0x8b, 0x67, 0xb8, 0x41, 0xc5, 0x27, 0x0a, 0x8d, 0x2a, 0xbf, 0x97, - 0xd2, 0xe6, 0xa5, 0x4e, 0x98, 0x43, 0x07, 0xf7, 0x11, 0x7b, 0xb9, 0x4f, 0xa6, 0x30, 0x7e, 0x87, - 0xb1, 0x92, 0x0e, 0xb5, 0xda, 0x08, 0x33, 0xfb, 0xd3, 0xe0, 0xa4, 0xa1, 0x97, 0x2a, 0x8d, 0x7a, - 0xed, 0x02, 0x7b, 0x65, 0x93, 0x22, 0xb3, 0x93, 0x93, 0x4c, 0x60, 0x7b, 0x5d, 0xca, 0x3e, 0x90, - 0x97, 0x55, 0xd2, 0x6c, 0x85, 0x59, 0x5c, 0x19, 0xde, 0xab, 0x09, 0x90, 0x3d, 0x4a, 0x14, 0xbe, - 0x56, 0x04, 0xb3, 0x06, 0x6c, 0x3b, 0xbb, 0xbb, 0xd0, 0xee, 0xc0, 0x8e, 0xf6, 0x3a, 0x19, 0xcc, - 0x85, 0xfb, 0x7f, 0x4d, 0xe8, 0x6b, 0xdf, 0x1b, 0x61, 0x73, 0x16, 0xcc, 0xa1, 0xca, 0x35, 0xf8, - 0xc0, 0xf1, 0x5c, 0x9a, 0x7a, 0x2b, 0x38, 0x11, 0xa0, 0xd0, 0xe8, 0x9b, 0xc2, 0x1c, 0x7c, 0xa1, - 0xbd, 0x97, 0xc5, 0x68, 0x83, 0xc7, 0xe8, 0xde, 0x78, 0x61, 0x86, 0xec, 0x2e, 0xb2, 0xac, 0xc6, - 0x80, 0xf5, 0x3b, 0x21, 0x58, 0xcf, 0xe2, 0xc0, 0xaa, 0x1c, 0x92, 0xfe, 0x51, 0xa2, 0xf6, 0xcb, - 0x32, 0x38, 0x19, 0x74, 0xc4, 0x93, 0x43, 0xeb, 0x93, 0x2c, 0x5a, 0xdf, 0xc7, 0xa3, 0xb5, 0x22, - 0x22, 0xcd, 0x41, 0x2c, 0xc7, 0xa0, 0xf6, 0xc5, 0x10, 0xb5, 0xef, 0xe7, 0x50, 0xab, 0x8d, 0xa9, - 0x9c, 0xa3, 0x44, 0xef, 0x43, 0x32, 0x38, 0x8d, 0xcc, 0xce, 0xb2, 0x63, 0x6f, 0x75, 0xad, 0xb6, - 0x6f, 0xd9, 0xdb, 0x91, 0x4b, 0xdb, 0x8a, 0xc8, 0xca, 0x66, 0x3f, 0xb6, 0xd2, 0x41, 0x6c, 0xf9, - 0x78, 0x1b, 0xa2, 0x6d, 0x2b, 0x8e, 0xad, 0x98, 0x21, 0x8c, 0x71, 0xd6, 0x8e, 0x34, 0x87, 0x4d, - 0x4a, 0xdf, 0xfa, 0x04, 0x39, 0x38, 0x4a, 0xfc, 0x1e, 0x02, 0x8c, 0xe9, 0xf1, 0x42, 0x19, 0x28, - 0xd8, 0x7f, 0x12, 0xf7, 0xec, 0xf4, 0x3e, 0xd3, 0x06, 0xef, 0x59, 0xdf, 0x0b, 0x04, 0x14, 0x78, - 0xd6, 0x07, 0x09, 0xea, 0x4d, 0x60, 0xa1, 0xbd, 0x03, 0xdb, 0x97, 0xaa, 0x76, 0xe0, 0x9b, 0x44, - 0x1c, 0x59, 0xfa, 0x52, 0xf9, 0xc1, 0xec, 0x7e, 0x1e, 0x4c, 0x7e, 0xe1, 0x91, 0x9b, 0xd8, 0xb0, - 0x4c, 0xc5, 0x34, 0xb4, 0x5f, 0x0f, 0x01, 0xaa, 0x73, 0x00, 0xdd, 0x35, 0x12, 0xd5, 0x74, 0xb0, - 0xd4, 0x47, 0x80, 0x45, 0x03, 0xa7, 0x1a, 0xeb, 0xad, 0x6a, 0xa3, 0xbe, 0xb9, 0xd1, 0xd4, 0x2b, - 0x9b, 0x4b, 0x01, 0x38, 0x4d, 0x45, 0xd6, 0xbe, 0x2a, 0x81, 0x29, 0xc2, 0x96, 0xa7, 0x3d, 0x3e, - 0x82, 0x60, 0xe8, 0x91, 0x02, 0xed, 0xed, 0xc2, 0x01, 0x82, 0x42, 0x41, 0xd0, 0x72, 0x62, 0x1a, - 0xc6, 0x53, 0xc1, 0x14, 0x01, 0x39, 0xd8, 0x05, 0x38, 0x13, 0x63, 0xd9, 0x51, 0x32, 0x46, 0x90, - 0x5d, 0x30, 0x58, 0xd0, 0x10, 0x36, 0xb2, 0xb7, 0xc6, 0x9f, 0x9b, 0x27, 0x4b, 0x07, 0xe7, 0x2d, - 0x7f, 0x07, 0x9f, 0x38, 0xd0, 0x9e, 0x29, 0xd2, 0x71, 0xdd, 0x0a, 0x0a, 0x97, 0x51, 0xee, 0x21, - 0xa7, 0x37, 0x48, 0x26, 0xed, 0xe7, 0x85, 0x63, 0x53, 0x73, 0xfa, 0x19, 0xf2, 0x14, 0x03, 0xce, - 0x1a, 0xc8, 0x77, 0x2d, 0xcf, 0xa7, 0x36, 0xf7, 0x9d, 0xa9, 0x08, 0x05, 0x7f, 0xaa, 0x3e, 0xdc, - 0x35, 0x30, 0x19, 0xed, 0x3e, 0x64, 0x31, 0x45, 0xa9, 0x02, 0x27, 0x58, 0x4e, 0x83, 0x29, 0x7a, - 0xb2, 0x9a, 0x6e, 0x4b, 0x05, 0x8f, 0x82, 0x5b, 0x41, 0x42, 0xb5, 0xcd, 0x5e, 0x07, 0xfe, 0xbf, - 0xe3, 0x60, 0x6a, 0xd5, 0xf2, 0x7c, 0xc7, 0xdd, 0xd7, 0x5e, 0x9f, 0x03, 0x53, 0xe7, 0xa0, 0xeb, - 0x59, 0x8e, 0x7d, 0xc0, 0x5d, 0xeb, 0x7a, 0x30, 0xdb, 0x73, 0xe1, 0x65, 0xcb, 0xd9, 0xf3, 0x98, - 0x51, 0x82, 0x49, 0x52, 0x35, 0x30, 0x6d, 0xee, 0xf9, 0x3b, 0x8e, 0x1b, 0x05, 0x64, 0x0a, 0x9e, - 0xd5, 0x33, 0x00, 0x90, 0xff, 0x75, 0x73, 0x17, 0x06, 0x77, 0xae, 0x47, 0x29, 0xaa, 0x0a, 0xf2, - 0xbe, 0xb5, 0x0b, 0x69, 0x84, 0x76, 0xfc, 0x1f, 0x09, 0x18, 0x47, 0x3b, 0xa5, 0x51, 0x65, 0x65, - 0x23, 0x78, 0xd4, 0xfe, 0x50, 0x06, 0xb3, 0x2b, 0xd0, 0xa7, 0xac, 0x7a, 0xda, 0x4b, 0x72, 0x42, - 0x97, 0x22, 0xa1, 0x79, 0x49, 0xd7, 0xf4, 0x82, 0xef, 0xc2, 0x21, 0x97, 0x4f, 0x8c, 0xc2, 0xc5, - 0xcb, 0xec, 0x5d, 0x11, 0x38, 0x76, 0xa8, 0x5f, 0x25, 0xce, 0xfc, 0x34, 0x33, 0xdd, 0x38, 0x3e, - 0xf8, 0x82, 0xb7, 0x89, 0x13, 0xe3, 0x6e, 0x50, 0xd9, 0x2f, 0x32, 0xf5, 0x89, 0xed, 0x8e, 0xa6, - 0x2f, 0xd3, 0x1c, 0x07, 0xae, 0x01, 0x61, 0x29, 0x51, 0x32, 0x46, 0x98, 0x5b, 0x30, 0x62, 0xc7, - 0x70, 0x4e, 0x26, 0x70, 0xf1, 0xab, 0x0c, 0x66, 0x9b, 0x3b, 0xce, 0x95, 0x40, 0x8e, 0xdf, 0x27, - 0x06, 0xec, 0xb5, 0x60, 0xe6, 0x72, 0x1f, 0xa8, 0x51, 0x02, 0x7b, 0xd7, 0x9c, 0xcc, 0xdf, 0x35, - 0xf7, 0x02, 0x39, 0x2d, 0x4c, 0x0c, 0x73, 0x31, 0x30, 0xf1, 0xd7, 0xc3, 0x49, 0x29, 0xae, 0x87, - 0x53, 0x9f, 0x02, 0xa6, 0x28, 0xd7, 0x74, 0x99, 0x3a, 0x19, 0xe0, 0x20, 0x33, 0x5b, 0xc1, 0x3c, - 0x5f, 0xc1, 0x74, 0xc8, 0xc7, 0x57, 0x2e, 0x7b, 0xe4, 0x7f, 0x53, 0xc2, 0xf1, 0x9a, 0x02, 0xe0, - 0xcb, 0x63, 0x00, 0x5e, 0xfb, 0x66, 0x4e, 0x74, 0x33, 0x27, 0x94, 0x40, 0xc8, 0xc1, 0xa1, 0x2e, - 0x3c, 0x1b, 0x4a, 0x2e, 0x7b, 0x79, 0xbe, 0x22, 0x0f, 0xe6, 0x2a, 0xd6, 0xd6, 0x56, 0xd8, 0x49, - 0xbe, 0x54, 0xb0, 0x93, 0x8c, 0x77, 0xa9, 0x42, 0x76, 0xee, 0x9e, 0xeb, 0x42, 0x3b, 0xa8, 0x14, - 0x6d, 0x4e, 0x7d, 0xa9, 0xea, 0xcd, 0xe0, 0x78, 0x30, 0x2e, 0xb0, 0x1d, 0xe5, 0x8c, 0xd1, 0x9f, - 0xac, 0x7d, 0x5d, 0xd8, 0x13, 0x20, 0x90, 0x28, 0x5b, 0xa5, 0x98, 0x06, 0x78, 0x37, 0x98, 0xdf, - 0x21, 0xb9, 0xf1, 0x72, 0x69, 0xd0, 0x59, 0x9e, 0xea, 0x8b, 0x87, 0xbf, 0x06, 0x3d, 0xcf, 0xdc, - 0x86, 0x06, 0x9f, 0xb9, 0xaf, 0xf9, 0xca, 0x69, 0x6e, 0x77, 0x14, 0x73, 0x2a, 0x10, 0xa8, 0x49, - 0xf6, 0xda, 0xf1, 0xc5, 0xb3, 0x20, 0xbf, 0x6c, 0x75, 0xa1, 0xf6, 0x23, 0x12, 0x98, 0x41, 0xb3, - 0x6e, 0xbb, 0x8d, 0x9e, 0x18, 0x07, 0xcb, 0xaf, 0xe5, 0x44, 0x6f, 0x35, 0x46, 0x74, 0x16, 0x43, - 0x1a, 0x31, 0xed, 0x46, 0xec, 0xf6, 0xe2, 0x44, 0x52, 0x13, 0xb8, 0x83, 0x0a, 0x4d, 0x3d, 0xb6, - 0xb6, 0xba, 0x8e, 0xc9, 0x6d, 0x18, 0xf4, 0x9b, 0x42, 0xd1, 0xa1, 0xc0, 0xba, 0xe3, 0xaf, 0x5b, - 0xb6, 0x1d, 0xc6, 0xd9, 0x38, 0x90, 0xce, 0xfb, 0xba, 0x24, 0x86, 0x2a, 0xc3, 0x75, 0xa7, 0xa5, - 0xc7, 0x68, 0xf6, 0x4d, 0x60, 0xe1, 0xe2, 0xbe, 0x0f, 0x3d, 0x9a, 0x8b, 0x16, 0x9b, 0x37, 0xfa, - 0x52, 0x99, 0x8b, 0x06, 0x92, 0x42, 0x9a, 0x25, 0x14, 0x98, 0x4e, 0xd4, 0xab, 0x23, 0xcc, 0x00, - 0x4f, 0x02, 0xa5, 0xde, 0xa8, 0xe8, 0xd8, 0xdf, 0x37, 0xf0, 0xa0, 0xdc, 0xd6, 0x7e, 0x52, 0x06, - 0x73, 0xd8, 0x01, 0x2f, 0x40, 0xe1, 0x06, 0x81, 0xf9, 0x88, 0xf6, 0x65, 0x61, 0x5f, 0x60, 0x5c, - 0x65, 0xb6, 0x80, 0x78, 0x41, 0x6f, 0x59, 0xdd, 0x7e, 0x41, 0x17, 0x8c, 0xbe, 0xd4, 0x01, 0x80, - 0xc8, 0x03, 0x01, 0xf9, 0x65, 0x21, 0x87, 0xe0, 0x61, 0xdc, 0x1d, 0x15, 0x2a, 0xbf, 0x22, 0x83, - 0x59, 0x34, 0x49, 0x09, 0x40, 0x69, 0x70, 0xa0, 0x38, 0x76, 0x77, 0x3f, 0x5a, 0x16, 0x09, 0x1e, - 0x53, 0x35, 0x92, 0x3f, 0x12, 0x9e, 0xb9, 0x63, 0x11, 0x31, 0xbc, 0x4c, 0x08, 0xbf, 0x0f, 0x0a, - 0xcd, 0xe7, 0x87, 0x30, 0x77, 0x54, 0xf0, 0x3d, 0x5c, 0x04, 0xc5, 0x8d, 0x1e, 0x46, 0xee, 0x4b, - 0xb2, 0xc8, 0xa5, 0x1d, 0x07, 0x0e, 0x83, 0x21, 0x33, 0xab, 0xeb, 0xb4, 0xcd, 0xee, 0x7a, 0x74, - 0xaa, 0x36, 0x4a, 0x50, 0xef, 0xa2, 0xfe, 0xe1, 0xe4, 0xc4, 0xf9, 0x4d, 0x89, 0xf7, 0x59, 0x60, - 0x19, 0x31, 0x07, 0xef, 0x6e, 0x05, 0x27, 0x3a, 0x96, 0x67, 0x5e, 0xec, 0x42, 0xdd, 0x6e, 0xbb, - 0xfb, 0x44, 0x1c, 0x74, 0x5a, 0x75, 0xe0, 0x85, 0x7a, 0x0f, 0x28, 0x78, 0xfe, 0x7e, 0x97, 0xcc, - 0x13, 0xd9, 0x73, 0x7a, 0xb1, 0x45, 0x35, 0x51, 0x76, 0x83, 0x7c, 0xc5, 0xba, 0x75, 0x4e, 0x89, - 0xb9, 0x75, 0xaa, 0x4f, 0x02, 0x45, 0xc7, 0xb5, 0xb6, 0x2d, 0x72, 0x45, 0xdd, 0xc2, 0x81, 0xb0, - 0xad, 0xc4, 0x14, 0x68, 0xe0, 0x2c, 0x06, 0xcd, 0xaa, 0x3e, 0x05, 0xcc, 0x58, 0xbb, 0xe6, 0x36, - 0xbc, 0xdf, 0xb2, 0xc9, 0xa1, 0xf6, 0x85, 0x3b, 0x4e, 0x1f, 0x38, 0x82, 0x48, 0xdf, 0x1b, 0x51, - 0x56, 0xf5, 0x6e, 0x70, 0x4d, 0xdb, 0x85, 0xa6, 0x0f, 0x91, 0x80, 0xce, 0x5b, 0x9d, 0x6d, 0xe8, - 0x57, 0xb7, 0xd6, 0x2c, 0xcf, 0xb3, 0xec, 0x6d, 0x7a, 0x0b, 0x65, 0x7c, 0x06, 0xed, 0x83, 0x92, - 0x68, 0x64, 0x3a, 0x2c, 0x19, 0xa2, 0x12, 0x23, 0xdc, 0x96, 0xcd, 0x48, 0x51, 0x16, 0x74, 0x8e, - 0x7d, 0xb5, 0x50, 0xcc, 0xb8, 0x78, 0xb6, 0xb2, 0x1f, 0xfa, 0x7f, 0x5f, 0x02, 0xd3, 0x15, 0xe7, - 0x8a, 0x8d, 0x9b, 0xc9, 0x9d, 0x62, 0x96, 0xf2, 0x80, 0x63, 0xe6, 0xfc, 0xbd, 0xcb, 0x89, 0x67, - 0xca, 0x70, 0x6d, 0x83, 0x22, 0x63, 0x60, 0x48, 0x6c, 0x77, 0x82, 0xb7, 0xe1, 0x26, 0x95, 0x93, - 0xbd, 0x5c, 0x7f, 0x5b, 0x06, 0xf9, 0x8a, 0xeb, 0xf4, 0xb4, 0xb7, 0xe5, 0x52, 0x38, 0x89, 0x75, - 0x5c, 0xa7, 0xd7, 0xc2, 0xd7, 0x59, 0x46, 0xfb, 0x22, 0x6c, 0x9a, 0x7a, 0x27, 0x98, 0xee, 0x39, - 0x9e, 0xe5, 0x07, 0x93, 0x90, 0x85, 0x3b, 0x1e, 0x33, 0xb0, 0x2f, 0x58, 0xa7, 0x99, 0x8c, 0x30, - 0x3b, 0xea, 0xf3, 0xb1, 0x08, 0x91, 0x5c, 0x90, 0x18, 0x83, 0x2b, 0x3d, 0xfb, 0x52, 0xb5, 0x97, - 0xb1, 0x48, 0x3e, 0x8d, 0x47, 0xf2, 0xb1, 0x03, 0x24, 0xec, 0x3a, 0xbd, 0xb1, 0xb8, 0x75, 0xbc, - 0x32, 0x44, 0xf5, 0xe9, 0x1c, 0xaa, 0xb7, 0x08, 0x95, 0x99, 0x3d, 0xa2, 0x1f, 0xcc, 0x03, 0x80, - 0x8d, 0x94, 0x0d, 0x34, 0x7d, 0x12, 0xb3, 0xd0, 0x7e, 0x38, 0xcf, 0xc8, 0xb2, 0xc4, 0xcb, 0xf2, - 0xf1, 0x31, 0x36, 0x10, 0x26, 0x1f, 0x23, 0xd1, 0x12, 0x28, 0xec, 0xa1, 0xd7, 0x54, 0xa2, 0x82, - 0x24, 0xf0, 0xa3, 0x41, 0xbe, 0xd4, 0x7e, 0x33, 0x07, 0x0a, 0x38, 0x41, 0x3d, 0x03, 0x00, 0x36, - 0x0b, 0xc8, 0x91, 0xcc, 0x1c, 0x36, 0x00, 0x98, 0x14, 0xac, 0xad, 0x56, 0x87, 0xbe, 0x26, 0x06, - 0x77, 0x94, 0x80, 0xbe, 0xc6, 0xc6, 0x02, 0xa6, 0x45, 0xcd, 0x07, 0x26, 0x05, 0x7d, 0x8d, 0x9f, - 0x6a, 0x70, 0x8b, 0xdc, 0x34, 0x90, 0x37, 0xa2, 0x84, 0xf0, 0xeb, 0x5a, 0x78, 0x3f, 0x65, 0xf0, - 0x35, 0x4e, 0x41, 0x53, 0x69, 0xac, 0x96, 0x4b, 0x51, 0x11, 0x45, 0x9c, 0xa9, 0x3f, 0x59, 0x7b, - 0x5d, 0xa8, 0x36, 0x15, 0x4e, 0x6d, 0x6e, 0x4f, 0x21, 0xde, 0xec, 0x95, 0xe7, 0x4f, 0x0b, 0x60, - 0xa6, 0xee, 0x74, 0xa8, 0xee, 0x30, 0xd3, 0xcd, 0x4f, 0x17, 0x52, 0x4d, 0x37, 0x43, 0x1a, 0x31, - 0x0a, 0xf2, 0x0c, 0x5e, 0x41, 0xc4, 0x28, 0xb0, 0xfa, 0xa1, 0x2e, 0x81, 0x22, 0xd6, 0xde, 0x83, - 0x17, 0x1f, 0x26, 0x91, 0xc0, 0xa2, 0x35, 0xe8, 0x97, 0xff, 0xe1, 0x74, 0xec, 0xbf, 0x81, 0x02, - 0xae, 0x60, 0xc2, 0xde, 0x10, 0x5f, 0x51, 0x29, 0xb9, 0xa2, 0x72, 0x72, 0x45, 0xf3, 0xfd, 0x15, - 0x4d, 0xb3, 0x8a, 0x10, 0xa7, 0x21, 0xd9, 0xeb, 0xf8, 0xdf, 0x4e, 0x01, 0x50, 0x37, 0x2f, 0x5b, - 0xdb, 0x64, 0x6f, 0xf9, 0x0f, 0x83, 0xd9, 0x13, 0xdd, 0x05, 0xfe, 0x31, 0x66, 0x20, 0xbc, 0x13, - 0x4c, 0xd1, 0x71, 0x8f, 0x56, 0xe4, 0x3a, 0xae, 0x22, 0x11, 0x15, 0x62, 0xd4, 0x3e, 0xe8, 0x1b, - 0x41, 0x7e, 0xee, 0x8e, 0x76, 0xa9, 0xef, 0x8e, 0xf6, 0xc1, 0x3b, 0x18, 0x31, 0x37, 0xb7, 0x6b, - 0xef, 0x13, 0x3e, 0x43, 0xc5, 0xf0, 0xc3, 0xd4, 0x28, 0xa6, 0x09, 0x3e, 0x09, 0x4c, 0x39, 0xe1, - 0x76, 0xb8, 0x1c, 0xbb, 0x8a, 0x56, 0xb5, 0xb7, 0x1c, 0x23, 0xc8, 0x29, 0xb8, 0x75, 0x26, 0xc4, - 0xc7, 0x44, 0x8e, 0x29, 0x9e, 0x5a, 0x09, 0xa2, 0x36, 0xa2, 0x7a, 0x9c, 0xb7, 0xfc, 0x9d, 0x9a, - 0x65, 0x5f, 0xf2, 0xb4, 0xef, 0x17, 0xb3, 0x20, 0x19, 0xfc, 0xa5, 0x74, 0xf8, 0xf3, 0x51, 0x93, - 0x9a, 0x3c, 0x6a, 0xf7, 0xc4, 0x51, 0x19, 0xcc, 0x6d, 0x0c, 0x80, 0x77, 0x81, 0x22, 0x61, 0x94, - 0x76, 0xa2, 0x67, 0x63, 0xf1, 0x0b, 0x29, 0x19, 0xf4, 0x0b, 0xed, 0xbd, 0x21, 0x8e, 0xe7, 0x38, - 0x1c, 0x97, 0x0e, 0xc5, 0x59, 0xe6, 0x90, 0x9e, 0x7d, 0x22, 0x98, 0xa2, 0x92, 0x56, 0x17, 0xd8, - 0x56, 0xac, 0x1c, 0x53, 0x01, 0x28, 0xae, 0x39, 0x97, 0x61, 0xcb, 0x51, 0x72, 0xe8, 0x3f, 0xe2, - 0xaf, 0xe5, 0x28, 0x92, 0xf6, 0xaa, 0x69, 0x30, 0x1d, 0x86, 0xcb, 0xfb, 0x7d, 0x09, 0x28, 0x65, - 0x3c, 0x43, 0x5b, 0x76, 0x9d, 0x5d, 0x52, 0x23, 0x71, 0x7f, 0xfc, 0x9f, 0x11, 0x76, 0x10, 0x09, - 0xc3, 0xd8, 0xf5, 0x17, 0x16, 0x83, 0x25, 0x59, 0xc2, 0x94, 0x82, 0x25, 0x4c, 0xed, 0xad, 0x42, - 0x0e, 0x23, 0xa2, 0xa5, 0x64, 0xdf, 0xd4, 0x7e, 0x4b, 0x02, 0x85, 0x72, 0xd7, 0xb1, 0x21, 0x7b, - 0x68, 0x74, 0xe8, 0xe9, 0xc4, 0xc1, 0xfb, 0x18, 0xda, 0x73, 0x25, 0x51, 0x5b, 0x23, 0x12, 0x00, - 0x2a, 0x5b, 0x50, 0xb6, 0x62, 0x83, 0x54, 0x22, 0xe9, 0xec, 0x05, 0xfa, 0x55, 0x09, 0xcc, 0x90, - 0xc8, 0x64, 0xa5, 0x6e, 0x57, 0x7b, 0x4c, 0x24, 0xd4, 0x01, 0x21, 0x07, 0xb5, 0x5f, 0x16, 0x3e, - 0x14, 0x15, 0xd6, 0x2a, 0xa4, 0x9d, 0x22, 0x44, 0x5b, 0xba, 0x33, 0x3a, 0x62, 0x3b, 0x71, 0x43, - 0x19, 0xca, 0x5e, 0xd4, 0x7f, 0x20, 0x21, 0x03, 0xc0, 0xbe, 0xb4, 0xee, 0xc2, 0xcb, 0x16, 0xbc, - 0xa2, 0x3d, 0x3a, 0x12, 0xf6, 0xc1, 0xb0, 0x4b, 0x6f, 0x12, 0x5e, 0xc4, 0x61, 0x48, 0xc6, 0x6e, - 0x84, 0xcd, 0x76, 0xa3, 0x4c, 0xb4, 0x17, 0xef, 0x8f, 0x85, 0xc5, 0x90, 0x31, 0xd8, 0xec, 0x82, - 0x6b, 0x36, 0xf1, 0x5c, 0x64, 0x2f, 0xd8, 0x8f, 0x4e, 0x81, 0xe9, 0x0d, 0xdb, 0xeb, 0x75, 0x4d, - 0x6f, 0x47, 0xfb, 0x57, 0x19, 0x14, 0xc9, 0x75, 0x9b, 0xda, 0x77, 0x71, 0xd1, 0x5d, 0x9e, 0xbd, - 0x07, 0xdd, 0xc0, 0x81, 0x87, 0x3c, 0x44, 0xf6, 0x91, 0xc4, 0xd8, 0x47, 0xda, 0x07, 0x65, 0xd1, - 0x49, 0x6a, 0x50, 0x28, 0xbd, 0xdf, 0x33, 0x3e, 0xa0, 0x48, 0xcf, 0x6a, 0xfb, 0x7b, 0x2e, 0xf4, - 0x06, 0x06, 0x14, 0x89, 0xa5, 0xb2, 0x4e, 0xbe, 0x32, 0xc2, 0xcf, 0x35, 0x13, 0x4c, 0xd1, 0xc4, - 0x03, 0x9b, 0x51, 0x07, 0x23, 0x1e, 0x9c, 0x02, 0x45, 0xd3, 0xf5, 0x2d, 0xcf, 0xa7, 0xdb, 0xb3, - 0xf4, 0x09, 0x75, 0x97, 0xe4, 0xdf, 0x86, 0xdb, 0x0d, 0xe2, 0x40, 0x85, 0x09, 0xda, 0xaf, 0x08, - 0xcd, 0x1f, 0x93, 0x6b, 0x9e, 0x0e, 0xf2, 0xfb, 0x47, 0x58, 0xe1, 0x7e, 0x14, 0xb8, 0xca, 0x28, - 0xb5, 0xf4, 0x4d, 0x12, 0x36, 0x28, 0x8c, 0x10, 0xd4, 0xd1, 0xde, 0x23, 0x33, 0xeb, 0x77, 0xfb, - 0xdc, 0x18, 0x41, 0xa5, 0x18, 0x8d, 0x11, 0x61, 0x42, 0xc2, 0x5e, 0x37, 0xb7, 0x84, 0x2b, 0x0b, - 0x2f, 0xe1, 0x6a, 0xbf, 0x24, 0xbc, 0x17, 0x15, 0x8a, 0x72, 0xc8, 0x1a, 0x60, 0xd2, 0x75, 0x7c, - 0x1f, 0x16, 0xda, 0x57, 0x1a, 0x56, 0xd2, 0x11, 0xc2, 0xf6, 0xcd, 0x53, 0x40, 0x2a, 0x55, 0xb5, - 0x1f, 0x9d, 0x02, 0x73, 0xe7, 0x5d, 0xcb, 0xb7, 0xec, 0xed, 0x96, 0xe3, 0x74, 0x3d, 0xed, 0x1b, - 0xcc, 0x46, 0xc5, 0x53, 0x40, 0xb1, 0xed, 0xd8, 0x5b, 0xd6, 0x36, 0x15, 0xe3, 0x19, 0xae, 0x72, - 0xa5, 0xea, 0xe2, 0xba, 0xeb, 0x5c, 0xb6, 0x3a, 0xd0, 0x2d, 0xe3, 0x5c, 0x06, 0xcd, 0x8d, 0xf4, - 0x98, 0x09, 0xbc, 0x76, 0x7b, 0xff, 0x57, 0x6c, 0x79, 0x61, 0xe4, 0x17, 0x9a, 0xc8, 0xc4, 0x5d, - 0xab, 0x82, 0xe9, 0xae, 0x69, 0x6f, 0xef, 0x05, 0x33, 0xef, 0xfe, 0x5d, 0xd4, 0x38, 0x4a, 0x35, - 0xfa, 0x91, 0x11, 0x7e, 0x8e, 0x9d, 0xdc, 0x90, 0xa9, 0x4f, 0xda, 0x1e, 0xfe, 0x7f, 0xf6, 0x63, - 0x39, 0x30, 0xcb, 0x14, 0xaa, 0xce, 0x82, 0xa9, 0x8a, 0xbe, 0x5c, 0xda, 0xa8, 0xb5, 0x94, 0x63, - 0x48, 0x8a, 0xcd, 0x8d, 0xb5, 0xb5, 0x92, 0x51, 0xfd, 0x1e, 0x5d, 0xc9, 0xa1, 0x77, 0x2b, 0x46, - 0x09, 0x3d, 0x2b, 0x12, 0x7a, 0x68, 0xae, 0x36, 0x8c, 0x96, 0x5e, 0x57, 0x64, 0x64, 0x8f, 0xea, - 0xcf, 0x5a, 0x2f, 0xd5, 0x2b, 0x4a, 0x1e, 0xfd, 0x5f, 0xda, 0xa8, 0xd5, 0xf4, 0x96, 0x52, 0x88, - 0x42, 0xb1, 0x15, 0x51, 0x72, 0xb9, 0xd4, 0xdc, 0x28, 0xd5, 0x94, 0x29, 0x94, 0xbc, 0xbc, 0x51, - 0xaf, 0x5f, 0x50, 0xa6, 0x51, 0x11, 0xe5, 0x46, 0x7d, 0xb9, 0x5a, 0xd1, 0xeb, 0x2d, 0x65, 0x46, - 0xbd, 0x0a, 0x1c, 0x6f, 0xb6, 0x8c, 0x52, 0x75, 0x65, 0xb5, 0xb5, 0xdc, 0x30, 0xce, 0x97, 0x8c, - 0x8a, 0x02, 0x54, 0x05, 0xcc, 0xad, 0x1b, 0x8d, 0x65, 0x1d, 0xc7, 0xf2, 0x28, 0xd5, 0x94, 0x59, - 0xf4, 0x55, 0xcb, 0x28, 0xd5, 0x9b, 0xb5, 0x52, 0x4b, 0x57, 0xe6, 0xce, 0xde, 0x07, 0xa6, 0x83, - 0xea, 0xaa, 0x45, 0x20, 0xe9, 0x75, 0xe5, 0x18, 0xfe, 0x6d, 0x2a, 0x39, 0xf4, 0xbb, 0x8c, 0xf8, - 0x2d, 0x02, 0xa9, 0xa2, 0x2b, 0x32, 0xfa, 0xad, 0xb6, 0x94, 0x3c, 0xfa, 0x5d, 0x47, 0x2c, 0x16, - 0x81, 0xb4, 0x5a, 0x55, 0x8a, 0xe8, 0xb7, 0xb5, 0xaa, 0x4c, 0xf1, 0xb7, 0x6e, 0x27, 0xf6, 0xc2, - 0x07, 0x25, 0x1f, 0x63, 0x68, 0xf8, 0xd1, 0x1c, 0x19, 0xff, 0xd7, 0x5e, 0x29, 0x89, 0xf4, 0x75, - 0xc9, 0xf4, 0xd3, 0x35, 0x9a, 0xb7, 0xe4, 0xc6, 0xd8, 0x6a, 0x54, 0x0d, 0x9c, 0xd2, 0xeb, 0x95, - 0xf5, 0x46, 0xb5, 0xde, 0x22, 0x01, 0xb3, 0xf4, 0x52, 0x79, 0x15, 0xe3, 0x0c, 0x11, 0x82, 0x6b, - 0x8d, 0x8a, 0x5e, 0xc3, 0x2f, 0x96, 0x1b, 0x1b, 0xf5, 0x8a, 0xb2, 0x85, 0xca, 0x2a, 0x6d, 0xb4, - 0x56, 0x37, 0x0d, 0xfd, 0x99, 0x1b, 0x55, 0x43, 0xaf, 0x28, 0xdb, 0x88, 0x46, 0xad, 0x54, 0x5f, - 0xd9, 0x28, 0xad, 0xd0, 0xfd, 0xc2, 0x8d, 0xf5, 0xf5, 0x06, 0xde, 0x31, 0xdc, 0xd1, 0xfe, 0x21, - 0x0f, 0xa6, 0x4b, 0x7b, 0xbe, 0xb3, 0x65, 0x75, 0xbb, 0xda, 0x43, 0xd2, 0xe1, 0x9b, 0x62, 0x89, - 0x6b, 0x8a, 0x07, 0x1a, 0x50, 0x50, 0x56, 0xd8, 0x78, 0x82, 0x04, 0xa6, 0x1d, 0x9e, 0x8e, 0x9c, - 0xb1, 0x65, 0xba, 0xd3, 0x4c, 0x1e, 0x89, 0x23, 0xae, 0x4d, 0x5b, 0x16, 0x7e, 0x43, 0x1f, 0xcf, - 0xde, 0x0f, 0xe6, 0x58, 0x4a, 0x38, 0xa8, 0x54, 0x69, 0x85, 0x44, 0x9d, 0x0a, 0xe2, 0xcc, 0x91, - 0xa8, 0x53, 0xf8, 0x50, 0x80, 0x84, 0xdb, 0x4b, 0xb5, 0x55, 0x43, 0x7a, 0x7a, 0x1c, 0xcc, 0x56, - 0xf4, 0x66, 0xd9, 0xa8, 0x62, 0x3f, 0x75, 0x25, 0xcf, 0x7b, 0x19, 0x24, 0x5a, 0x66, 0x7c, 0x8d, - 0x44, 0x95, 0xf2, 0x5b, 0x42, 0xf6, 0x56, 0x3c, 0xed, 0x74, 0x0a, 0xf9, 0x92, 0x47, 0x9a, 0x42, - 0x6a, 0x2f, 0xc9, 0x93, 0x75, 0xb2, 0xe6, 0xde, 0xee, 0xae, 0xe9, 0xee, 0x73, 0xfe, 0x6a, 0xa3, - 0xea, 0x5d, 0xfc, 0xf8, 0x9e, 0x18, 0xa1, 0x06, 0x99, 0x50, 0x3d, 0xd7, 0xd9, 0xed, 0x05, 0x7d, - 0x35, 0x7d, 0xd2, 0xfe, 0x1f, 0xe1, 0x99, 0x63, 0xa9, 0xba, 0xc8, 0x54, 0x66, 0x84, 0xa1, 0xfd, - 0x07, 0x24, 0x91, 0x59, 0x64, 0x62, 0x31, 0xdf, 0xee, 0x1a, 0xf1, 0x37, 0x79, 0x70, 0x15, 0x8d, - 0x3e, 0x12, 0xae, 0x3f, 0x20, 0x53, 0xf5, 0x35, 0x99, 0x6a, 0x06, 0x35, 0xa8, 0xe5, 0xc8, 0xa0, - 0x66, 0x36, 0xbc, 0xf3, 0x82, 0x1b, 0xde, 0x6f, 0x13, 0x3e, 0xf4, 0x50, 0xaa, 0x2e, 0x0e, 0xa8, - 0xe3, 0x64, 0xb6, 0xe5, 0x5f, 0x20, 0x89, 0xac, 0xb6, 0x0a, 0x71, 0xf8, 0xed, 0xae, 0x6b, 0xef, - 0xc8, 0x81, 0x05, 0x5e, 0x55, 0xd4, 0x27, 0x83, 0xe9, 0x1e, 0x4d, 0xa1, 0x72, 0x39, 0x1d, 0xa7, - 0x5c, 0x46, 0x98, 0x13, 0x41, 0x04, 0xed, 0x4e, 0xcf, 0xb1, 0xec, 0x70, 0x5d, 0x3e, 0x78, 0x46, - 0xf3, 0x4e, 0x3c, 0x75, 0x08, 0x62, 0xd1, 0xe1, 0x87, 0x28, 0x02, 0x69, 0x9e, 0x89, 0x40, 0x8a, - 0x84, 0xe8, 0xc3, 0x5d, 0x7c, 0xa3, 0xca, 0x9e, 0x4b, 0x1c, 0x5e, 0x24, 0x83, 0x4d, 0x3a, 0xfb, - 0x74, 0x30, 0x1d, 0x94, 0x8f, 0xac, 0xbb, 0x46, 0xad, 0x56, 0x5a, 0x2b, 0x91, 0x85, 0xca, 0xc6, - 0xba, 0x5e, 0x2f, 0x55, 0x95, 0x1c, 0x1a, 0xe8, 0x6a, 0x6b, 0xcd, 0xd6, 0x46, 0xa5, 0xda, 0x50, - 0x24, 0xfc, 0x84, 0x32, 0x95, 0xd7, 0xd7, 0x15, 0x59, 0x7b, 0xe3, 0x14, 0x98, 0x5a, 0x31, 0xbb, - 0x5d, 0xe8, 0xee, 0x6b, 0x5f, 0x95, 0x80, 0x12, 0xcc, 0x0e, 0xd6, 0x4c, 0xdb, 0xda, 0x82, 0x9e, - 0x9f, 0xbc, 0x50, 0xf1, 0x3e, 0xe1, 0x6b, 0x96, 0x68, 0x19, 0x8b, 0xfd, 0xf4, 0x63, 0x74, 0xfc, - 0x36, 0x90, 0xb7, 0xec, 0x2d, 0x87, 0x2e, 0x57, 0xf4, 0xfb, 0xdb, 0x04, 0x1f, 0xe3, 0x6d, 0x03, - 0x9c, 0x51, 0xf0, 0xa6, 0x25, 0x41, 0x2e, 0xb2, 0x5f, 0xb5, 0x78, 0x47, 0x1e, 0xcc, 0x07, 0x4c, - 0x54, 0xed, 0x0e, 0x7c, 0x90, 0xdd, 0x06, 0xfd, 0xc9, 0xbc, 0x68, 0xf0, 0x9b, 0xfe, 0xfa, 0x60, - 0x52, 0x31, 0x22, 0x6d, 0x01, 0xd0, 0x36, 0x7d, 0xb8, 0xed, 0xb8, 0x56, 0xb8, 0x16, 0xf1, 0xe4, - 0x34, 0xd4, 0xca, 0xe4, 0xeb, 0x7d, 0x83, 0xa1, 0xa3, 0xde, 0x03, 0x66, 0x61, 0x18, 0x6d, 0x30, - 0xd8, 0x26, 0x4d, 0xc4, 0x8b, 0xcd, 0xaf, 0xfd, 0x81, 0x50, 0x8c, 0x1d, 0x91, 0x6a, 0xa6, 0xc3, - 0x6c, 0x73, 0xb4, 0xae, 0x67, 0xa3, 0xbe, 0x56, 0x32, 0x9a, 0xab, 0xa5, 0x5a, 0xad, 0x5a, 0x5f, - 0x09, 0xc3, 0xde, 0xaa, 0x60, 0xa1, 0xd2, 0x38, 0x5f, 0x67, 0xe2, 0x12, 0xe7, 0xb5, 0x75, 0x30, - 0x1d, 0xc8, 0x6b, 0xd0, 0x29, 0x2a, 0x56, 0x66, 0xf4, 0x14, 0x15, 0x93, 0x84, 0x4c, 0x43, 0xab, - 0x1d, 0xba, 0xd6, 0xe3, 0xff, 0xda, 0x6f, 0x98, 0xa0, 0x80, 0xfd, 0x59, 0xb4, 0x77, 0xe1, 0x79, - 0x71, 0xaf, 0x6b, 0xb6, 0xa1, 0xb6, 0x9b, 0x62, 0x25, 0x3c, 0xb8, 0xf7, 0x53, 0x3a, 0x70, 0xef, - 0x27, 0xfe, 0x4b, 0x47, 0x8c, 0x93, 0x83, 0x7c, 0x68, 0x0c, 0x92, 0x85, 0x0f, 0x47, 0x93, 0xe8, - 0xd9, 0x44, 0x5c, 0x6f, 0x28, 0x9b, 0x31, 0x2a, 0x19, 0xcf, 0x53, 0xba, 0x55, 0x60, 0x31, 0x1f, - 0xa8, 0x24, 0x8e, 0xb2, 0x6f, 0xf1, 0x5f, 0xca, 0x83, 0x42, 0xb3, 0xd7, 0xb5, 0x7c, 0xed, 0xe7, - 0xa4, 0xb1, 0x60, 0x46, 0xee, 0x6a, 0x95, 0x87, 0xde, 0xd5, 0x1a, 0xf9, 0x4b, 0xe6, 0x05, 0xfc, - 0x25, 0x5b, 0xf0, 0x41, 0x9f, 0xf7, 0x97, 0xbc, 0x93, 0x4e, 0xdb, 0x88, 0xb7, 0xe5, 0x63, 0x07, - 0x88, 0x14, 0x57, 0x6b, 0xc0, 0x9d, 0x08, 0x67, 0x9f, 0x48, 0x43, 0xb3, 0x03, 0x50, 0x5c, 0x6a, - 0xb4, 0x5a, 0x8d, 0x35, 0xe5, 0x18, 0x9e, 0x7e, 0x35, 0xd6, 0x49, 0xa0, 0xdc, 0x6a, 0xbd, 0xae, - 0x1b, 0xdc, 0x8c, 0x8b, 0xbf, 0xb8, 0x2f, 0x71, 0x82, 0xc5, 0x97, 0x9d, 0xa5, 0x7a, 0x89, 0x2d, - 0x82, 0xc7, 0xf3, 0x93, 0xbd, 0x72, 0xfd, 0xb4, 0x0c, 0x0a, 0x6b, 0xd0, 0xdd, 0x86, 0xda, 0xb3, - 0x53, 0x38, 0xd8, 0x6d, 0x59, 0xae, 0x47, 0x42, 0xeb, 0x47, 0x0e, 0x76, 0x6c, 0x9a, 0x7a, 0x23, - 0x98, 0xf7, 0x60, 0xdb, 0xb1, 0x3b, 0x41, 0x26, 0xd2, 0x1f, 0xf1, 0x89, 0xda, 0xcb, 0x53, 0x42, - 0x86, 0x19, 0x1d, 0x8b, 0x97, 0x5c, 0x1a, 0x60, 0x06, 0x95, 0x9a, 0x3d, 0x30, 0x5f, 0x97, 0xd1, - 0x47, 0xbd, 0x7d, 0xed, 0xe5, 0xc2, 0x9e, 0x8f, 0xb7, 0x82, 0xe2, 0xc5, 0xe0, 0x8e, 0x26, 0x39, - 0xb6, 0x3f, 0xa6, 0x79, 0xd4, 0x25, 0x70, 0xc2, 0x83, 0x5d, 0xd8, 0xf6, 0x61, 0x07, 0x35, 0x5d, - 0x63, 0x68, 0xa7, 0x70, 0x30, 0xbb, 0xf6, 0x3b, 0x2c, 0x80, 0x77, 0xf3, 0x00, 0xde, 0x34, 0x40, - 0x94, 0xa8, 0x42, 0xf1, 0x73, 0x13, 0x54, 0x8d, 0x66, 0xd7, 0x09, 0x0d, 0xdf, 0xe0, 0x19, 0xbd, - 0xdb, 0xf1, 0x77, 0xbb, 0xf8, 0x1d, 0x3d, 0x1a, 0x1c, 0x3c, 0xab, 0x8b, 0x60, 0xca, 0xb4, 0xf7, - 0xf1, 0xab, 0x7c, 0x42, 0xad, 0x83, 0x4c, 0xda, 0xab, 0x42, 0xe4, 0xef, 0xe5, 0x90, 0x7f, 0xbc, - 0x18, 0xbb, 0xd9, 0x03, 0xff, 0x43, 0x53, 0xa0, 0xb0, 0x6e, 0x7a, 0x3e, 0xd4, 0xfe, 0xa7, 0x2c, - 0x8a, 0xfc, 0x4d, 0x60, 0x61, 0xcb, 0x69, 0xef, 0x79, 0xb0, 0xc3, 0x37, 0xca, 0xbe, 0xd4, 0x71, - 0x60, 0xae, 0xde, 0x02, 0x94, 0x20, 0x91, 0x92, 0x0d, 0x5c, 0x60, 0x0f, 0xa4, 0xe3, 0x6b, 0xe0, - 0xbc, 0x75, 0xd3, 0xf5, 0x1b, 0x5b, 0x38, 0x2d, 0xbc, 0x06, 0x8e, 0x4d, 0xe4, 0xa0, 0x2f, 0x26, - 0x40, 0x3f, 0x15, 0x0f, 0xfd, 0xb4, 0x00, 0xf4, 0x6a, 0x09, 0x4c, 0x6f, 0x59, 0x5d, 0x88, 0x3f, - 0x98, 0xc1, 0x1f, 0x0c, 0x1a, 0x93, 0xb0, 0xec, 0xc3, 0x31, 0x69, 0xd9, 0xea, 0x42, 0x23, 0xfc, - 0x2c, 0x98, 0xc8, 0x80, 0x68, 0x22, 0x53, 0x23, 0x27, 0xe1, 0x90, 0xe1, 0x65, 0x9b, 0xbb, 0x30, - 0xd8, 0xf8, 0xb6, 0xe9, 0xb1, 0xf4, 0x8e, 0xe9, 0x9b, 0x18, 0x8c, 0x39, 0x03, 0xff, 0xe7, 0x7d, - 0xb2, 0xe5, 0x7e, 0x9f, 0xec, 0xe7, 0xcb, 0xe9, 0x7a, 0xc4, 0x80, 0xd9, 0x98, 0x16, 0x75, 0x31, - 0x00, 0x88, 0x58, 0x8a, 0xe1, 0x33, 0x02, 0xa6, 0x6d, 0xba, 0xd0, 0x5f, 0x67, 0xbd, 0xa0, 0x0b, - 0x06, 0x9f, 0x88, 0x0f, 0xe1, 0x78, 0x4d, 0x73, 0x97, 0x5c, 0xf3, 0x56, 0x46, 0xef, 0xe8, 0xe1, - 0x8a, 0x03, 0xe9, 0x51, 0xff, 0x5b, 0x18, 0x77, 0xff, 0x3b, 0xa8, 0x8e, 0xd9, 0x37, 0xc3, 0xd7, - 0xe6, 0x81, 0x5c, 0xde, 0xf3, 0x1f, 0xd1, 0xdd, 0xef, 0xb7, 0x84, 0x7d, 0xcc, 0x69, 0x7f, 0xb6, - 0xe7, 0x1f, 0x6d, 0xef, 0x9b, 0x52, 0x4b, 0xc4, 0x7c, 0xd9, 0xe3, 0xea, 0x96, 0xbd, 0x8e, 0xbc, - 0x4d, 0x0e, 0x8f, 0x46, 0x3d, 0x94, 0x3b, 0xbc, 0x69, 0xae, 0x91, 0xfe, 0x89, 0xe9, 0x19, 0xc2, - 0xe7, 0xa0, 0xe3, 0xc9, 0x73, 0x37, 0x13, 0x60, 0xd7, 0x56, 0x2c, 0xca, 0x39, 0x83, 0x3c, 0x68, - 0xaf, 0x10, 0x3e, 0x30, 0x4a, 0xc4, 0x96, 0x78, 0x8c, 0x27, 0x9d, 0x4d, 0xf5, 0x1a, 0xa1, 0x63, - 0xa3, 0x09, 0xc5, 0x66, 0x0f, 0xd8, 0xdf, 0xb3, 0xc7, 0x74, 0x4a, 0x87, 0x46, 0x4c, 0x7b, 0xb5, - 0xf0, 0x82, 0x3e, 0xa9, 0xf6, 0x90, 0xbd, 0xfa, 0x74, 0xf2, 0x16, 0x73, 0x14, 0x4b, 0x2c, 0x78, - 0x02, 0xf7, 0xd6, 0xca, 0xa0, 0x48, 0x16, 0x7e, 0xb5, 0x37, 0x0b, 0x37, 0x11, 0xd4, 0x1b, 0xf1, - 0xc7, 0x77, 0xc2, 0xe7, 0x34, 0x6b, 0x0e, 0xdc, 0x31, 0x9f, 0x7c, 0xaa, 0x63, 0x3e, 0x7c, 0x04, - 0x16, 0x81, 0x76, 0x44, 0xea, 0x98, 0xf1, 0x74, 0x32, 0x4d, 0x0b, 0x1b, 0xc8, 0x50, 0xf6, 0x78, - 0xbf, 0xb0, 0x00, 0xe6, 0x48, 0xd1, 0xe4, 0x7c, 0xa1, 0xf6, 0x1e, 0xe9, 0xdb, 0x07, 0x75, 0xb5, - 0x0e, 0xe6, 0xae, 0x60, 0xb6, 0xc9, 0x7d, 0xb4, 0x74, 0xe5, 0xe2, 0x96, 0xc4, 0x75, 0x0f, 0x52, - 0xcf, 0xe0, 0x06, 0x5b, 0xee, 0x7b, 0x24, 0x63, 0xb2, 0xc1, 0x42, 0x0e, 0x4f, 0x14, 0xb1, 0x91, - 0xc5, 0x26, 0xa9, 0xa7, 0x40, 0xf1, 0xb2, 0x05, 0xaf, 0x54, 0x3b, 0xd4, 0xba, 0xa5, 0x4f, 0xda, - 0xaf, 0x0a, 0xfb, 0x4c, 0xb2, 0x70, 0x53, 0x5e, 0xb2, 0xd5, 0x42, 0x31, 0xcf, 0xc9, 0xa1, 0x6c, - 0x4d, 0x20, 0x1a, 0x90, 0x44, 0xee, 0xcc, 0xa6, 0x61, 0xe6, 0xcb, 0x29, 0x14, 0x31, 0xce, 0x70, - 0xe6, 0x83, 0xf0, 0x25, 0x9e, 0x35, 0x27, 0x02, 0x88, 0xca, 0x1f, 0x4b, 0x9f, 0x2f, 0x16, 0x19, - 0x6e, 0x48, 0xd1, 0xd9, 0x4b, 0xfe, 0x75, 0x32, 0x98, 0x69, 0x42, 0x7f, 0xd9, 0x82, 0xdd, 0x8e, - 0xa7, 0xb9, 0x87, 0x37, 0x8d, 0x6e, 0x03, 0xc5, 0x2d, 0x4c, 0x6c, 0xd8, 0xe6, 0x24, 0xcd, 0xa6, - 0xbd, 0x56, 0x12, 0xf5, 0x03, 0xa2, 0xab, 0x6f, 0x01, 0xb7, 0x63, 0x81, 0x49, 0xec, 0x34, 0x5d, - 0x72, 0xc9, 0x13, 0xb8, 0xc6, 0x47, 0x06, 0x73, 0x78, 0xfb, 0x1f, 0xfa, 0xa5, 0xae, 0xb5, 0x6d, - 0x6b, 0x7b, 0x63, 0x68, 0x21, 0xea, 0xed, 0xa0, 0x60, 0x22, 0x6a, 0xd4, 0xdd, 0x4d, 0x1b, 0xd8, - 0x79, 0xe2, 0xf2, 0x0c, 0x92, 0x31, 0xc5, 0xa5, 0x19, 0x91, 0x62, 0x07, 0x3c, 0x4f, 0xf0, 0xd2, - 0x8c, 0xa1, 0x85, 0x67, 0x8f, 0xd8, 0x57, 0x64, 0x70, 0x92, 0x32, 0x70, 0x0e, 0xba, 0xbe, 0xd5, - 0x36, 0xbb, 0x04, 0xb9, 0x17, 0xe7, 0xc6, 0x01, 0xdd, 0x2a, 0x98, 0xbf, 0xcc, 0x92, 0xa5, 0x10, - 0x9e, 0x1d, 0x08, 0x21, 0xc7, 0x80, 0xc1, 0x7f, 0x98, 0xe2, 0xf2, 0x01, 0x4e, 0xaa, 0x1c, 0xcd, - 0x09, 0x5e, 0x3e, 0x20, 0xcc, 0x44, 0xf6, 0x10, 0xbf, 0x8c, 0x06, 0xd5, 0x8c, 0xba, 0xcf, 0x3f, - 0x14, 0xc6, 0x76, 0x03, 0xcc, 0x62, 0x2c, 0xc9, 0x87, 0x74, 0x19, 0x22, 0x41, 0x89, 0xc3, 0x7e, - 0x87, 0x5e, 0x97, 0x1e, 0x7e, 0x6b, 0xb0, 0x74, 0xb4, 0xf3, 0x00, 0x44, 0xaf, 0xd8, 0x4e, 0x3a, - 0x17, 0xd7, 0x49, 0x4b, 0x62, 0x9d, 0xf4, 0x9b, 0x84, 0xc3, 0x1c, 0x0e, 0x66, 0xfb, 0xf0, 0xea, - 0x21, 0x16, 0xe0, 0x6e, 0x78, 0xe9, 0xd9, 0xeb, 0xc5, 0xab, 0xa8, 0x5e, 0x54, 0xf6, 0x7a, 0x5d, - 0xab, 0x8d, 0xe6, 0x53, 0x9f, 0x18, 0xcb, 0x7c, 0x8a, 0xed, 0x0f, 0xe4, 0xbe, 0xfe, 0xe0, 0x10, - 0x96, 0xf4, 0xcd, 0xe0, 0x38, 0x29, 0xa2, 0x1c, 0xb2, 0x55, 0x20, 0x41, 0xdc, 0xfa, 0x92, 0xf9, - 0x88, 0xe2, 0x82, 0x4a, 0x10, 0x0a, 0x61, 0x84, 0xa5, 0xcf, 0x74, 0xc6, 0x6e, 0x5a, 0x05, 0x89, - 0xe3, 0x6c, 0x02, 0x47, 0xb2, 0xf2, 0xc4, 0xda, 0xdd, 0xc0, 0x37, 0xda, 0x6b, 0x5f, 0xcc, 0x8f, - 0x63, 0x44, 0x78, 0x06, 0xf5, 0x34, 0x95, 0x63, 0x97, 0x34, 0xa2, 0x22, 0xc3, 0x7e, 0xa4, 0x05, - 0x1f, 0xf4, 0x57, 0x8f, 0x11, 0xbf, 0x54, 0xf5, 0x16, 0x70, 0xfc, 0xa2, 0xd9, 0xbe, 0xb4, 0xed, - 0x3a, 0x7b, 0xf8, 0xee, 0x6f, 0x87, 0x5e, 0x22, 0xbe, 0x7a, 0xcc, 0xe8, 0x7f, 0xa1, 0xde, 0x11, - 0x98, 0x0e, 0x85, 0x61, 0xa6, 0xc3, 0xea, 0x31, 0x6a, 0x3c, 0xa8, 0x4f, 0x0c, 0x3b, 0x9d, 0x62, - 0x62, 0xa7, 0xb3, 0x7a, 0x2c, 0xe8, 0x76, 0xd4, 0x0a, 0x98, 0xee, 0x58, 0x97, 0xf1, 0x56, 0x35, - 0x9e, 0x75, 0x0d, 0x0b, 0x3a, 0x54, 0xb1, 0x2e, 0x93, 0x8d, 0xed, 0xd5, 0x63, 0x46, 0xf8, 0xa5, - 0xba, 0x02, 0x66, 0xf0, 0xb6, 0x00, 0x26, 0x33, 0x9d, 0x2a, 0xa0, 0xd0, 0xea, 0x31, 0x23, 0xfa, - 0x16, 0x59, 0x1f, 0x79, 0x7c, 0xee, 0xfa, 0xde, 0x60, 0xbb, 0x3d, 0x97, 0x6a, 0xbb, 0x1d, 0xc9, - 0x82, 0x6c, 0xb8, 0x9f, 0x02, 0x85, 0x36, 0x96, 0xb0, 0x44, 0x25, 0x4c, 0x1e, 0xd5, 0xbb, 0x41, - 0x7e, 0xd7, 0x74, 0x83, 0xc9, 0xf3, 0x4d, 0xc3, 0xe9, 0xae, 0x99, 0xee, 0x25, 0x84, 0x20, 0xfa, - 0x6a, 0x69, 0x0a, 0x14, 0xb0, 0xe0, 0xc2, 0x3f, 0xda, 0xdb, 0xf2, 0xc4, 0x0c, 0x29, 0x3b, 0x36, - 0x1a, 0xf6, 0x5b, 0x4e, 0x70, 0x38, 0xfd, 0x57, 0x73, 0xe3, 0xb1, 0x20, 0xaf, 0x62, 0xae, 0xfa, - 0xb0, 0xad, 0x67, 0xef, 0xc1, 0xfb, 0xe1, 0x3e, 0x5d, 0x12, 0x1d, 0xf4, 0x4a, 0x3d, 0x03, 0x80, - 0x4f, 0x4f, 0xea, 0x85, 0x41, 0x4c, 0x99, 0x94, 0x68, 0xf9, 0xa0, 0x30, 0xdc, 0x51, 0xe5, 0x77, - 0x46, 0x30, 0x5d, 0xfa, 0x05, 0x11, 0x3f, 0x03, 0xef, 0x5a, 0x36, 0x53, 0xe7, 0xe0, 0x31, 0x65, - 0xa7, 0x94, 0xd6, 0xa8, 0x19, 0xc2, 0x5e, 0xf6, 0x7d, 0xd3, 0x5b, 0xf2, 0xe4, 0xb6, 0x03, 0x72, - 0x02, 0x5a, 0x7f, 0xd0, 0xf2, 0x7c, 0xcb, 0xde, 0xa6, 0xe7, 0x9b, 0x3f, 0x3b, 0x16, 0xa5, 0x19, - 0x30, 0xe0, 0xc8, 0x03, 0x07, 0x9c, 0x03, 0x01, 0x82, 0xf2, 0x43, 0x02, 0x04, 0x15, 0xd2, 0xad, - 0x1c, 0x7e, 0x84, 0xd5, 0x9f, 0x75, 0x5e, 0x7f, 0xee, 0x8a, 0x01, 0x68, 0x90, 0x5c, 0xc6, 0x62, - 0xdf, 0xbc, 0x2b, 0xd4, 0x94, 0x26, 0xa7, 0x29, 0xf7, 0x8e, 0xce, 0x48, 0xf6, 0xda, 0xf2, 0xa1, - 0x3c, 0xb8, 0x2a, 0x62, 0xa6, 0x0e, 0xaf, 0x50, 0x45, 0xf9, 0xfd, 0xb1, 0x28, 0x4a, 0x7a, 0x47, - 0xe7, 0xac, 0x35, 0xe6, 0x37, 0x85, 0xcf, 0xed, 0xf7, 0x03, 0x15, 0xca, 0x26, 0x46, 0x59, 0x4e, - 0x81, 0x22, 0xe9, 0x61, 0x28, 0x34, 0xf4, 0x29, 0x65, 0x77, 0x23, 0x76, 0xda, 0x5f, 0x94, 0xb7, - 0x09, 0xe8, 0x0f, 0x5d, 0xd7, 0x68, 0xed, 0xb9, 0x76, 0xd5, 0xf6, 0x1d, 0xed, 0x07, 0xc7, 0xa2, - 0x38, 0xa1, 0x37, 0x9c, 0x3c, 0x8a, 0x37, 0xdc, 0x48, 0xab, 0x1c, 0x41, 0x0d, 0x8e, 0x64, 0x95, - 0x23, 0xa6, 0xf0, 0xec, 0xf1, 0x7b, 0xa7, 0x0c, 0x4e, 0xd1, 0xc9, 0xd6, 0x12, 0x6f, 0x21, 0x6a, - 0x17, 0xc6, 0x01, 0xe4, 0xc9, 0xc0, 0x4c, 0xa2, 0x7e, 0xf4, 0xf8, 0x81, 0x8f, 0x52, 0x90, 0x78, - 0x9b, 0x25, 0x37, 0x1d, 0xec, 0xe3, 0x70, 0x2c, 0x48, 0x89, 0x5d, 0x62, 0x99, 0x82, 0x8d, 0xec, - 0x31, 0x7b, 0xa9, 0x0c, 0x8a, 0x24, 0x46, 0x82, 0xb6, 0x91, 0x89, 0xc3, 0x04, 0x7f, 0x3f, 0x8b, - 0xc0, 0x8e, 0x1c, 0xe1, 0x26, 0xb3, 0xf8, 0x11, 0x69, 0xf6, 0xe2, 0x06, 0xb2, 0x32, 0x01, 0x17, - 0x42, 0x09, 0xcc, 0x36, 0xa1, 0x5f, 0x36, 0x5d, 0xd7, 0x32, 0xb7, 0xc7, 0xe5, 0xf1, 0x2d, 0xea, - 0x3d, 0xac, 0x7d, 0x23, 0x27, 0x7a, 0x96, 0x3d, 0x5c, 0x08, 0x0f, 0x58, 0x8d, 0x89, 0x02, 0xfe, - 0x7a, 0xa1, 0xf3, 0xea, 0xc3, 0xa8, 0x4d, 0xc0, 0x63, 0x5b, 0x02, 0x53, 0x41, 0x1c, 0x8c, 0xdb, - 0xb8, 0xd8, 0x28, 0x3b, 0xfe, 0x6e, 0x70, 0x0c, 0x06, 0xff, 0x3f, 0x18, 0x7f, 0x41, 0x7b, 0x65, - 0x4a, 0x47, 0xf9, 0xe4, 0x20, 0x1e, 0xe9, 0xda, 0x58, 0x1a, 0x77, 0xf8, 0xa3, 0x0a, 0xdb, 0xf1, - 0xcb, 0x53, 0x74, 0x39, 0xb2, 0x66, 0xfa, 0xf0, 0x41, 0xed, 0x0f, 0x65, 0x30, 0xd5, 0x84, 0x3e, - 0x1a, 0x6f, 0x11, 0xfb, 0x87, 0xd6, 0x70, 0x95, 0x59, 0xf1, 0xa0, 0x67, 0x6b, 0xd5, 0xfb, 0xc0, - 0x4c, 0xcf, 0x75, 0xda, 0xd0, 0xf3, 0xe8, 0xea, 0x05, 0xeb, 0xa8, 0x36, 0x68, 0xf4, 0xc7, 0xac, - 0x2d, 0xae, 0x07, 0xdf, 0x18, 0xd1, 0xe7, 0x69, 0xcd, 0x00, 0x42, 0x89, 0x56, 0x70, 0xd2, 0x66, - 0x40, 0x52, 0xe1, 0xd9, 0x03, 0xfd, 0xbb, 0x32, 0x98, 0x6b, 0x42, 0x3f, 0x94, 0x62, 0x8a, 0x4d, - 0x8e, 0x78, 0x78, 0x39, 0x28, 0xe5, 0xc3, 0x41, 0xf9, 0x4e, 0xe1, 0x4b, 0x61, 0x79, 0x69, 0x86, - 0xc4, 0xc6, 0x82, 0xe7, 0x5b, 0x84, 0xee, 0x82, 0x15, 0xe3, 0x60, 0x02, 0xc7, 0xd7, 0x1e, 0x0b, - 0x66, 0x30, 0x2f, 0xb8, 0xc1, 0xfe, 0x68, 0x3e, 0x6a, 0xbc, 0x5f, 0xc8, 0xa8, 0xf1, 0xde, 0x03, - 0x0a, 0xbb, 0xa6, 0x7b, 0x29, 0x38, 0x7c, 0xfb, 0x38, 0xb1, 0xd5, 0x2f, 0xcf, 0x20, 0x5f, 0x0d, - 0xf6, 0xd3, 0x2c, 0xa4, 0xf3, 0xd3, 0x7c, 0xbd, 0x94, 0x6a, 0x24, 0x24, 0x73, 0x87, 0x31, 0x36, - 0xf9, 0x14, 0xe3, 0x66, 0x42, 0xd9, 0xd9, 0x2b, 0xc7, 0x8b, 0x65, 0x30, 0x8d, 0xc6, 0x6d, 0x6c, - 0x8f, 0x9f, 0x3f, 0xbc, 0x3a, 0x0c, 0x36, 0xf4, 0x53, 0xf6, 0xc0, 0x81, 0x44, 0xc6, 0x67, 0xde, - 0xa7, 0xe8, 0x81, 0x93, 0x0a, 0xcf, 0x1e, 0x8f, 0x77, 0x13, 0x3c, 0x70, 0x7b, 0xd0, 0xde, 0x20, - 0x03, 0x79, 0x05, 0xfa, 0x93, 0xb6, 0x22, 0xdf, 0x2e, 0x1c, 0x5e, 0x94, 0x13, 0x18, 0xe6, 0x79, - 0x71, 0x05, 0x8e, 0xa7, 0x01, 0x89, 0xc5, 0x15, 0x15, 0x62, 0x20, 0x7b, 0xd4, 0xde, 0x4f, 0x50, - 0x23, 0x9b, 0x0b, 0x3f, 0x30, 0x86, 0x5e, 0x75, 0xb2, 0x0b, 0x1f, 0x81, 0x00, 0x31, 0x8d, 0xa3, - 0x6a, 0x6f, 0x83, 0x0a, 0xcf, 0x1e, 0xb9, 0x9f, 0x91, 0xf1, 0x25, 0x66, 0xe5, 0x1d, 0xd8, 0xbe, - 0x04, 0x3b, 0xec, 0x45, 0xce, 0xa3, 0x42, 0x77, 0x1a, 0x4c, 0xb5, 0x09, 0x35, 0x0c, 0xde, 0xb4, - 0x11, 0x3c, 0xf2, 0x37, 0x0b, 0x25, 0xde, 0x9d, 0xc5, 0x77, 0x44, 0xe4, 0xf3, 0xb1, 0xe0, 0x22, - 0x76, 0xe1, 0x95, 0x40, 0xf1, 0x13, 0x30, 0x5b, 0xc8, 0x2c, 0xa3, 0xda, 0x76, 0x6c, 0xed, 0xbf, - 0x1e, 0x1e, 0x96, 0x6b, 0xc1, 0x8c, 0xd5, 0x76, 0x6c, 0x1c, 0x02, 0x2e, 0x38, 0x04, 0x14, 0x26, - 0x04, 0x6f, 0xf5, 0x5d, 0xe7, 0x01, 0x8b, 0xee, 0x9a, 0x47, 0x09, 0xa3, 0x1a, 0x13, 0x88, 0xf5, - 0xa3, 0x32, 0x26, 0x06, 0x94, 0x9d, 0x3d, 0x64, 0x9f, 0x8c, 0xbc, 0xdb, 0x48, 0x57, 0xf8, 0x88, - 0x58, 0x05, 0x1e, 0x65, 0x38, 0x63, 0x6b, 0x71, 0x24, 0xc3, 0x59, 0x02, 0x03, 0x13, 0xb8, 0x89, - 0x30, 0xc2, 0x31, 0xf3, 0x35, 0xe0, 0x43, 0xa0, 0x33, 0x3e, 0xf3, 0x70, 0x44, 0x74, 0x8e, 0xc6, - 0x44, 0xfc, 0x30, 0x0d, 0x4f, 0x4f, 0x2d, 0x1e, 0xed, 0xbf, 0x8d, 0x03, 0x9c, 0xbb, 0x46, 0xf1, - 0x57, 0x20, 0xde, 0x0a, 0xda, 0x5b, 0x25, 0xd1, 0x10, 0x28, 0x07, 0x24, 0x88, 0xa8, 0x8c, 0x05, - 0xc1, 0x37, 0x09, 0xc5, 0x26, 0x11, 0x29, 0x3f, 0x7b, 0x00, 0x5f, 0x24, 0x83, 0x05, 0xec, 0x23, - 0xd0, 0x85, 0xa6, 0x4b, 0x3a, 0xca, 0xb1, 0x38, 0xca, 0xbf, 0x5b, 0x38, 0xc0, 0x0f, 0x2f, 0x87, - 0x88, 0x8f, 0xb1, 0x40, 0x21, 0x16, 0xdd, 0x47, 0x90, 0x85, 0x89, 0x6c, 0xa3, 0x28, 0x21, 0x0b, - 0x54, 0xc5, 0xc7, 0x83, 0x47, 0x4a, 0x8f, 0x5c, 0x5e, 0x18, 0x41, 0x63, 0x9b, 0xb0, 0x47, 0xae, - 0x08, 0x13, 0xd9, 0x63, 0xf2, 0x86, 0xdb, 0xe9, 0x82, 0x73, 0xcb, 0xbc, 0xd8, 0x85, 0xda, 0xab, - 0xf3, 0xe1, 0x89, 0xb6, 0xdf, 0x1d, 0x8b, 0x07, 0xe6, 0x21, 0x2e, 0xa3, 0x52, 0x41, 0xde, 0x75, - 0xae, 0x90, 0xa5, 0xad, 0x79, 0x03, 0xff, 0x27, 0xf1, 0x2c, 0xbb, 0x7b, 0xbb, 0x36, 0x39, 0x19, - 0x3a, 0x6f, 0x04, 0x8f, 0xea, 0x8d, 0x60, 0xfe, 0x8a, 0xe5, 0xef, 0xac, 0x42, 0xb3, 0x03, 0x5d, - 0xc3, 0xb9, 0x82, 0x3d, 0xe6, 0xa6, 0x0d, 0x3e, 0x91, 0xf7, 0x5f, 0x11, 0xb0, 0x2f, 0x91, 0x50, - 0x26, 0x73, 0xfc, 0x2d, 0x8d, 0xe5, 0x19, 0xcf, 0x55, 0xf6, 0x0a, 0xf3, 0x01, 0x19, 0xcc, 0x18, - 0xce, 0x15, 0xaa, 0x24, 0xff, 0xd7, 0xd1, 0xea, 0x48, 0xea, 0x89, 0x1e, 0x96, 0x5c, 0xc8, 0xfe, - 0xc4, 0x27, 0x7a, 0x89, 0xc5, 0x4f, 0xe4, 0xe4, 0xd2, 0x9c, 0xe1, 0x5c, 0x69, 0x42, 0x9f, 0xb4, - 0x08, 0x6d, 0x73, 0x4c, 0x4e, 0xd6, 0x96, 0x47, 0x08, 0xd2, 0x79, 0x78, 0xf8, 0x9c, 0x76, 0x17, - 0x21, 0x14, 0x50, 0xc8, 0xe2, 0xa4, 0x77, 0x11, 0x86, 0x72, 0x30, 0x81, 0x18, 0x29, 0x32, 0x98, - 0x35, 0x9c, 0x2b, 0x68, 0x68, 0x58, 0xb6, 0xba, 0xdd, 0xf1, 0x8c, 0x90, 0x69, 0x8d, 0xff, 0x40, - 0x0c, 0x01, 0x17, 0x13, 0x37, 0xfe, 0x87, 0x30, 0x90, 0x3d, 0x0c, 0xcf, 0x27, 0x8d, 0x25, 0x18, - 0xa1, 0xed, 0xf1, 0xe0, 0x30, 0x6a, 0x83, 0x08, 0xd9, 0x38, 0xb2, 0x06, 0x11, 0xc7, 0xc1, 0x44, - 0x76, 0x4e, 0x16, 0xca, 0x78, 0x98, 0x1f, 0x6f, 0x9b, 0x78, 0x6f, 0x3a, 0xd7, 0x44, 0x3a, 0xec, - 0x72, 0x8c, 0x8c, 0x05, 0x8d, 0x14, 0x2e, 0x88, 0x02, 0x3c, 0x64, 0x8f, 0xc7, 0xc7, 0x64, 0x30, - 0x47, 0x58, 0x78, 0x84, 0x58, 0x01, 0x23, 0x35, 0x2a, 0xb6, 0x06, 0x47, 0xd3, 0xa8, 0x12, 0x38, - 0x98, 0xc8, 0x7d, 0xfe, 0xc8, 0x8e, 0x1b, 0xe1, 0xf8, 0x78, 0x1c, 0x82, 0x23, 0x1b, 0x63, 0x63, - 0x3c, 0x42, 0x3e, 0x8a, 0x31, 0x76, 0x44, 0xc7, 0xc8, 0x9f, 0x1f, 0xb6, 0xa2, 0x71, 0x62, 0x70, - 0x88, 0xa6, 0x30, 0x46, 0x18, 0x46, 0x6c, 0x0a, 0x47, 0x84, 0xc4, 0x9f, 0xca, 0x00, 0x10, 0x06, - 0xd6, 0x9c, 0xcb, 0xf8, 0x22, 0xcd, 0x31, 0x74, 0x67, 0xfd, 0x6e, 0xf5, 0xf2, 0x10, 0xb7, 0xfa, - 0x94, 0x21, 0x5c, 0xd2, 0xae, 0x04, 0x32, 0x52, 0x46, 0x95, 0x9c, 0xf8, 0x4a, 0x60, 0x72, 0xf9, - 0xd9, 0x63, 0xfc, 0x65, 0x62, 0xcd, 0x45, 0x07, 0x4c, 0x7f, 0x76, 0x2c, 0x28, 0x33, 0xb3, 0x7f, - 0x99, 0x9f, 0xfd, 0x1f, 0x02, 0xdb, 0x51, 0x6d, 0xc4, 0x61, 0x07, 0x47, 0xb3, 0xb7, 0x11, 0x8f, - 0xee, 0x80, 0xe8, 0x0f, 0xe4, 0xc1, 0x71, 0xda, 0x89, 0x7c, 0x3b, 0x40, 0x9c, 0xf2, 0x1c, 0x1e, - 0xd7, 0x49, 0x0e, 0x41, 0x79, 0x5c, 0x0b, 0x52, 0x69, 0x96, 0x32, 0x05, 0xd8, 0x9b, 0xc8, 0xea, - 0x46, 0x51, 0x7f, 0xb0, 0x67, 0xda, 0x1d, 0xf1, 0x70, 0xbf, 0x43, 0x80, 0x0f, 0xd6, 0x1a, 0x65, - 0x7e, 0xad, 0x71, 0xc0, 0xca, 0x64, 0xea, 0x9d, 0x6b, 0x2c, 0x32, 0xc2, 0xee, 0xc4, 0x77, 0xae, - 0xe3, 0xcb, 0xce, 0x1e, 0xa5, 0xf7, 0xca, 0x20, 0xdf, 0x74, 0x5c, 0x5f, 0x7b, 0x41, 0x9a, 0xd6, - 0x49, 0x24, 0x1f, 0x81, 0x14, 0x3c, 0xab, 0x65, 0x90, 0x47, 0x95, 0xa3, 0x33, 0x86, 0xdb, 0x92, - 0x8f, 0x3a, 0x9b, 0xbe, 0x89, 0xbd, 0xba, 0x51, 0xf9, 0x8b, 0xad, 0xfd, 0x1e, 0x34, 0xf0, 0xc7, - 0x69, 0xe3, 0xe9, 0x10, 0xf9, 0x35, 0xe3, 0x0f, 0x60, 0x64, 0x16, 0x4f, 0x27, 0xb6, 0xe4, 0xec, - 0x71, 0x7b, 0xf8, 0x38, 0xf5, 0x6d, 0x5d, 0xb6, 0xba, 0x50, 0x7b, 0x01, 0x71, 0x19, 0xa9, 0x9b, - 0xbb, 0x50, 0xfc, 0x48, 0x4c, 0xa2, 0x6b, 0x2b, 0x8e, 0x2f, 0x2b, 0x47, 0xf1, 0x65, 0xd3, 0x36, - 0x28, 0x72, 0x00, 0x9d, 0xb0, 0x34, 0xe9, 0x06, 0x95, 0x50, 0xf6, 0x44, 0xe2, 0x74, 0x9e, 0x68, - 0x42, 0x9f, 0x18, 0x95, 0x8d, 0xe0, 0x8a, 0xa4, 0xef, 0x1b, 0x4b, 0xc4, 0xce, 0xf0, 0x42, 0x1d, - 0xb9, 0xef, 0x06, 0xa6, 0x0f, 0xb0, 0xe0, 0xac, 0xf1, 0xe0, 0x7c, 0x77, 0xbc, 0x80, 0x78, 0x26, - 0xc7, 0x02, 0xd3, 0xdb, 0x43, 0x98, 0xd6, 0x39, 0x98, 0xee, 0x1e, 0x91, 0x8b, 0xec, 0x01, 0xfb, - 0xf1, 0x02, 0x38, 0x4e, 0x26, 0xfd, 0x25, 0xbb, 0x43, 0x23, 0xac, 0xbe, 0x59, 0x3a, 0xe2, 0xcd, - 0xb6, 0x83, 0x21, 0x58, 0xb9, 0x58, 0xce, 0x85, 0xbe, 0x58, 0xce, 0xea, 0x12, 0x09, 0xe7, 0x8a, - 0x3a, 0x51, 0xbc, 0xd3, 0x36, 0x2c, 0xcc, 0x04, 0x96, 0x3d, 0xee, 0x72, 0xc3, 0xef, 0xf8, 0x7b, - 0x44, 0xa7, 0xc4, 0xef, 0x11, 0xfd, 0xed, 0x74, 0xeb, 0x76, 0xb8, 0xe8, 0x3e, 0x81, 0x67, 0x6c, - 0x3b, 0xa5, 0x58, 0xd1, 0x13, 0xe0, 0xee, 0x3f, 0x87, 0x3b, 0x59, 0x14, 0x41, 0x64, 0x44, 0x77, - 0x32, 0x4c, 0xe0, 0x28, 0xdd, 0xc9, 0x86, 0x31, 0x90, 0x3d, 0x8e, 0xbf, 0x5d, 0xa0, 0xbb, 0xf9, - 0xb8, 0xdd, 0x68, 0x7f, 0x2c, 0x65, 0x3e, 0x4a, 0x7f, 0x33, 0x97, 0xca, 0xff, 0x19, 0xf3, 0x95, - 0x3c, 0x4c, 0xa7, 0xf1, 0x68, 0x4e, 0x22, 0x37, 0x81, 0x75, 0x23, 0x09, 0xfb, 0xa2, 0x9f, 0xb7, - 0x3a, 0xfe, 0xce, 0x98, 0x4e, 0x74, 0x5c, 0x41, 0xb4, 0x68, 0xbc, 0x7a, 0xf2, 0xa0, 0xfd, 0xaf, - 0x5c, 0xaa, 0x10, 0x52, 0xa1, 0x48, 0x30, 0x5b, 0x31, 0x22, 0x4e, 0x11, 0xf8, 0x29, 0x91, 0xde, - 0x04, 0x35, 0xfa, 0x9c, 0xd5, 0x81, 0xce, 0x23, 0x50, 0xa3, 0x31, 0x5f, 0xe3, 0xd3, 0xe8, 0x24, - 0x72, 0xff, 0x49, 0x35, 0x3a, 0x14, 0xc9, 0x98, 0x34, 0x3a, 0x91, 0x5e, 0xf6, 0x32, 0x7e, 0xe5, - 0x1c, 0x9d, 0x48, 0xd5, 0x2c, 0xfb, 0x92, 0xf6, 0x4f, 0x45, 0xa0, 0x04, 0x71, 0x84, 0xfd, 0x1d, - 0x1a, 0x0b, 0xe6, 0x43, 0xc2, 0x77, 0xa3, 0x8c, 0x10, 0xef, 0x85, 0x0f, 0x27, 0x55, 0x38, 0x10, - 0x4e, 0xaa, 0x04, 0xe6, 0x2d, 0xdb, 0x87, 0xae, 0x6d, 0x76, 0x97, 0xbb, 0xe6, 0xb6, 0x77, 0x7a, - 0x6a, 0xe0, 0xe5, 0x75, 0x55, 0x26, 0x8f, 0xc1, 0x7f, 0xc1, 0x5e, 0x20, 0x3a, 0xcd, 0x5f, 0x20, - 0x1a, 0x13, 0xfd, 0x6a, 0x26, 0x3e, 0xfa, 0x55, 0x18, 0xdd, 0x0a, 0x0c, 0x0f, 0x8e, 0x2d, 0x6a, - 0x1b, 0xa7, 0x0c, 0xf7, 0x77, 0x9b, 0x60, 0x14, 0xb6, 0x30, 0xf4, 0xe3, 0x6b, 0xe4, 0x54, 0xab, - 0x7b, 0x48, 0x11, 0x16, 0xfb, 0x95, 0x20, 0xb5, 0x85, 0xca, 0x56, 0x5e, 0xee, 0xab, 0x7c, 0x68, - 0xf2, 0xe4, 0x05, 0x4c, 0x1e, 0x56, 0xa9, 0x0a, 0xa2, 0x77, 0xba, 0x8a, 0x2f, 0x16, 0x8a, 0xd4, - 0x76, 0x02, 0xa7, 0x91, 0x0a, 0xe0, 0x44, 0x10, 0xed, 0xb6, 0xd7, 0x83, 0xa6, 0x6b, 0xda, 0x6d, - 0xa8, 0x7d, 0x52, 0x1a, 0x87, 0xd9, 0xbb, 0x0c, 0xa6, 0xad, 0xb6, 0x63, 0x37, 0xad, 0xe7, 0x04, - 0x97, 0xcb, 0x25, 0x07, 0x59, 0xc7, 0x12, 0xa9, 0xd2, 0x2f, 0x8c, 0xf0, 0x5b, 0xb5, 0x0a, 0x66, - 0xda, 0xa6, 0xdb, 0x21, 0x41, 0xf8, 0x0a, 0x7d, 0x17, 0x39, 0xc5, 0x12, 0x2a, 0x07, 0x9f, 0x18, - 0xd1, 0xd7, 0x6a, 0x83, 0x17, 0x62, 0xb1, 0x2f, 0x9a, 0x47, 0x2c, 0xb1, 0x4a, 0xf4, 0x11, 0x27, - 0x73, 0x24, 0x1d, 0x17, 0x76, 0x4d, 0x72, 0xe9, 0xf8, 0x14, 0xb9, 0x23, 0x3a, 0x4c, 0x48, 0xbb, - 0x3c, 0x80, 0x8b, 0x3a, 0x80, 0xc6, 0xa4, 0x97, 0x07, 0x84, 0xb8, 0xc8, 0x5e, 0x33, 0xdf, 0x55, - 0x04, 0xf3, 0xa4, 0x57, 0xa3, 0xe2, 0xd4, 0x5e, 0x24, 0x83, 0x62, 0x13, 0xfa, 0xf7, 0xc3, 0x7d, - 0xad, 0x79, 0xf8, 0x31, 0x59, 0x01, 0xf2, 0xa5, 0x30, 0xe0, 0x20, 0xfa, 0x9b, 0x76, 0xdf, 0x3e, - 0xe0, 0x6b, 0x91, 0xf0, 0x34, 0xe9, 0x7d, 0xfb, 0xe4, 0xe2, 0xb3, 0xc7, 0xe7, 0x27, 0x64, 0x20, - 0x97, 0x3a, 0x1d, 0xad, 0x7d, 0x78, 0x28, 0xae, 0x07, 0xb3, 0x41, 0x9b, 0x89, 0x62, 0x40, 0xb2, - 0x49, 0x69, 0x17, 0x41, 0x43, 0xd9, 0x94, 0x3a, 0x13, 0xdf, 0x55, 0x48, 0x28, 0x3b, 0x7b, 0x50, - 0xbe, 0x30, 0x45, 0x1b, 0xcd, 0x92, 0xe3, 0x5c, 0xc2, 0x47, 0x65, 0x7e, 0x51, 0x06, 0x85, 0x65, - 0xe8, 0xb7, 0x77, 0x34, 0x6f, 0x2c, 0x6d, 0xa6, 0xef, 0xde, 0xf3, 0x21, 0x41, 0x39, 0xd3, 0x46, - 0x7f, 0x0e, 0xd8, 0x5e, 0xc4, 0x2c, 0x4f, 0x3a, 0xfa, 0x73, 0x62, 0xe9, 0x13, 0x38, 0x04, 0x97, - 0x07, 0x0b, 0xe1, 0x0a, 0x18, 0xc1, 0xec, 0x1d, 0xb9, 0x47, 0xdc, 0x7a, 0xe8, 0x10, 0xbb, 0x59, - 0xfb, 0xfd, 0x74, 0x21, 0xd6, 0x42, 0x99, 0xf3, 0x35, 0xcf, 0x78, 0x61, 0x32, 0x45, 0xf0, 0x35, - 0x31, 0x06, 0x27, 0xb0, 0x02, 0x20, 0x83, 0x69, 0xcc, 0x50, 0xc5, 0xba, 0x8c, 0x5d, 0x0f, 0xb9, - 0x85, 0xca, 0xe7, 0x8e, 0x65, 0xa1, 0xf2, 0x6e, 0x7e, 0xa1, 0x52, 0x30, 0x62, 0x72, 0xb0, 0x4e, - 0x99, 0xd2, 0x17, 0x07, 0x7d, 0x3f, 0xf6, 0x65, 0xca, 0x14, 0xbe, 0x38, 0x43, 0xca, 0xcf, 0x1e, - 0xd1, 0x37, 0xfe, 0x17, 0xda, 0x59, 0x07, 0x1b, 0xb2, 0xda, 0xff, 0x38, 0x01, 0xf2, 0xe7, 0xd0, - 0x9f, 0x7f, 0x8c, 0x6e, 0xd4, 0x7a, 0xf9, 0x18, 0x82, 0x3b, 0x3c, 0x1d, 0xe4, 0x11, 0x7d, 0x3a, - 0xed, 0xb9, 0x45, 0x6c, 0x77, 0x18, 0x31, 0x62, 0xe0, 0xef, 0xd4, 0x53, 0xa0, 0xe8, 0x39, 0x7b, - 0x6e, 0x1b, 0x99, 0xdf, 0x48, 0x63, 0xe8, 0x53, 0xda, 0xa0, 0xa6, 0x1c, 0xe9, 0xc5, 0xf1, 0xb9, - 0x9c, 0x32, 0x17, 0x2c, 0xc9, 0xdc, 0x05, 0x4b, 0x29, 0xf6, 0x1f, 0x04, 0x78, 0xcb, 0x5e, 0x23, - 0xfe, 0x18, 0xdf, 0x35, 0xd8, 0x19, 0x17, 0xec, 0x31, 0x62, 0x39, 0xac, 0x3a, 0xa4, 0x75, 0x18, - 0xe7, 0x45, 0x1b, 0xc6, 0x91, 0x9f, 0xa8, 0xc3, 0xb8, 0x00, 0x0f, 0x13, 0x39, 0xe5, 0x5e, 0xa4, - 0x4e, 0xae, 0x17, 0xc6, 0x89, 0x6e, 0x9e, 0x53, 0xfa, 0x43, 0xa1, 0x33, 0x46, 0xe7, 0xd7, 0x91, - 0xd1, 0x39, 0x22, 0xf7, 0xd7, 0x5f, 0x93, 0x71, 0x24, 0xcd, 0xc0, 0x08, 0x12, 0xbf, 0x28, 0x29, - 0x35, 0x44, 0x68, 0x0c, 0xe6, 0xe2, 0x48, 0xcf, 0x8f, 0x1e, 0x5a, 0x9c, 0x17, 0x1d, 0xc3, 0xff, - 0xa4, 0x43, 0x8b, 0x8b, 0x32, 0x92, 0x3d, 0x90, 0xbf, 0x40, 0x2e, 0x26, 0x2b, 0xb5, 0x7d, 0xeb, - 0xf2, 0x98, 0x5b, 0x1a, 0x3f, 0xbc, 0xa4, 0x8c, 0x26, 0x7c, 0x40, 0x42, 0x84, 0xc3, 0x49, 0x47, - 0x13, 0x16, 0x63, 0x23, 0x7b, 0x98, 0x7e, 0x0c, 0x20, 0xe9, 0xd1, 0xb5, 0x9d, 0x37, 0xc8, 0x40, - 0x6e, 0x42, 0x5f, 0x83, 0x87, 0x47, 0xeb, 0x2c, 0x98, 0x63, 0x96, 0x0e, 0x82, 0x0b, 0x6f, 0xb8, - 0xb4, 0xb4, 0x07, 0xe5, 0x43, 0x91, 0xb1, 0x8b, 0x2e, 0x93, 0x3e, 0x28, 0x2f, 0xc2, 0xc4, 0x04, - 0x0e, 0xca, 0xd3, 0x65, 0x9f, 0x6f, 0x17, 0xa0, 0xc6, 0xb5, 0x02, 0x74, 0x28, 0xa0, 0x8e, 0x62, - 0x29, 0xe8, 0xed, 0x91, 0xb1, 0x31, 0x21, 0xac, 0x3e, 0xc4, 0x62, 0xd5, 0xe0, 0xb1, 0xba, 0x53, - 0x44, 0x4c, 0x62, 0xc6, 0x87, 0xd0, 0x04, 0xff, 0x9d, 0x21, 0x5c, 0x06, 0x07, 0xd7, 0xd3, 0x47, - 0xe6, 0x23, 0x7b, 0xc4, 0x7e, 0x8e, 0x8c, 0x5b, 0x4d, 0x32, 0xb7, 0x1a, 0xcf, 0xb8, 0x45, 0xa7, - 0x6d, 0x32, 0x37, 0x6d, 0x4b, 0x79, 0xb0, 0x22, 0xf2, 0x17, 0x0e, 0x98, 0x1b, 0x06, 0x51, 0x7e, - 0xcc, 0x07, 0x2b, 0x86, 0x72, 0x90, 0x3d, 0x38, 0x5f, 0x93, 0x01, 0x58, 0x71, 0x9d, 0xbd, 0x5e, - 0xc3, 0xed, 0x40, 0x57, 0xfb, 0xb3, 0x68, 0xa6, 0xf6, 0x93, 0x63, 0x98, 0xa9, 0xad, 0x03, 0xb0, - 0x1d, 0x12, 0xa7, 0x1a, 0x7e, 0xbb, 0xd8, 0xbc, 0x2c, 0x62, 0xca, 0x60, 0x68, 0xf0, 0x77, 0x0b, - 0x3f, 0x93, 0xc7, 0x38, 0xa9, 0xcf, 0x8a, 0xc8, 0x8d, 0x73, 0xa6, 0xf6, 0xee, 0x10, 0xeb, 0x16, - 0x87, 0xf5, 0x33, 0x0e, 0xc1, 0x49, 0xf6, 0x98, 0xff, 0xc3, 0x14, 0x98, 0x25, 0xfb, 0xb2, 0x44, - 0xa6, 0x7f, 0x13, 0x81, 0xfe, 0xb3, 0x63, 0x00, 0x7d, 0x03, 0xcc, 0x39, 0x11, 0x75, 0xd2, 0xa7, - 0xb2, 0x2b, 0x65, 0x89, 0xb0, 0x33, 0x7c, 0x19, 0x1c, 0x19, 0xed, 0xe3, 0x2c, 0xf2, 0x06, 0x8f, - 0xfc, 0xdd, 0x09, 0xf2, 0x66, 0x28, 0x8e, 0x13, 0xfa, 0xf7, 0x84, 0xd0, 0x6f, 0x70, 0xd0, 0x97, - 0x0e, 0xc3, 0xca, 0x04, 0xee, 0x55, 0x90, 0x41, 0x1e, 0x1f, 0x83, 0x7c, 0x4b, 0x86, 0x0b, 0x31, - 0xa7, 0xc1, 0x14, 0x6e, 0xb2, 0xe1, 0x04, 0x31, 0x78, 0x44, 0x6f, 0xcc, 0x2d, 0x1f, 0xba, 0xe1, - 0x12, 0x7b, 0xf0, 0x88, 0x78, 0x08, 0xdc, 0xcf, 0xbd, 0xd3, 0x45, 0xb2, 0xe3, 0x1c, 0x26, 0x8c, - 0x3c, 0x7b, 0x64, 0x25, 0x3e, 0xb6, 0x83, 0x91, 0xa3, 0xcc, 0x1e, 0x87, 0x30, 0x92, 0x3d, 0xf0, - 0x5f, 0xcc, 0x83, 0xd3, 0x64, 0xf9, 0x6f, 0xd9, 0x75, 0x76, 0xfb, 0xae, 0x31, 0xb3, 0x0e, 0xaf, - 0x0b, 0x37, 0x81, 0x05, 0x9f, 0x73, 0xbc, 0xa7, 0x3a, 0xd1, 0x97, 0xaa, 0xfd, 0x0e, 0xeb, 0x3c, - 0xf3, 0x2c, 0x1e, 0xc9, 0xa5, 0x04, 0x01, 0xc6, 0xf1, 0x9e, 0x7a, 0x47, 0x45, 0x90, 0x51, 0x66, - 0x35, 0x51, 0x1e, 0x69, 0x71, 0x39, 0xd4, 0xa9, 0x82, 0x88, 0x4e, 0x7d, 0x30, 0xd4, 0xa9, 0xef, - 0xe5, 0x74, 0x6a, 0xe5, 0xf0, 0x22, 0x99, 0xc0, 0x12, 0xd3, 0x02, 0x28, 0x2e, 0x5b, 0x5d, 0x1f, - 0xba, 0xda, 0x97, 0xe9, 0x3c, 0xea, 0xd5, 0x19, 0x76, 0x2f, 0x15, 0x50, 0xdc, 0xc2, 0xa5, 0x51, - 0x83, 0xec, 0x56, 0x31, 0x6c, 0x08, 0x87, 0x06, 0xfd, 0x36, 0x6d, 0x90, 0xbf, 0x3e, 0x32, 0x63, - 0x9b, 0x80, 0xa5, 0x08, 0xf2, 0x37, 0x9c, 0x85, 0x89, 0xdc, 0x6f, 0x55, 0x34, 0xe0, 0x2e, 0x1a, - 0x41, 0x2e, 0x65, 0x87, 0xb0, 0x02, 0x64, 0xab, 0xe3, 0xe1, 0xa6, 0x37, 0x63, 0xa0, 0xbf, 0x69, - 0x5d, 0x8e, 0xfa, 0x45, 0x45, 0x58, 0x9e, 0xb4, 0xcb, 0x91, 0x10, 0x17, 0xd9, 0x63, 0xf6, 0x4d, - 0xec, 0x6f, 0xda, 0xeb, 0x9a, 0x6d, 0x88, 0xb8, 0xcf, 0x0c, 0xb5, 0x05, 0x20, 0x59, 0xc1, 0x88, - 0x2f, 0x59, 0x6c, 0x3b, 0x2d, 0x1c, 0xa2, 0x9d, 0x8e, 0xba, 0x1a, 0x19, 0xca, 0x1c, 0x57, 0xfc, - 0xc8, 0x56, 0x23, 0x13, 0xd9, 0x98, 0xc0, 0xed, 0xa5, 0xc1, 0x79, 0xdc, 0x89, 0xb6, 0xd6, 0x51, - 0xf7, 0x6a, 0xa8, 0xb0, 0xc6, 0x76, 0xf6, 0x76, 0x94, 0xbd, 0x9a, 0x78, 0x1e, 0x26, 0x80, 0xd6, - 0x02, 0x45, 0xeb, 0xf3, 0x74, 0x18, 0xcd, 0x78, 0xbb, 0xd4, 0x73, 0x5c, 0x3f, 0xdd, 0x76, 0x29, - 0xe2, 0xce, 0xc0, 0xdf, 0xa5, 0x3d, 0xbf, 0xc5, 0x1f, 0xcf, 0x1e, 0xd7, 0xf0, 0x99, 0xe2, 0xfc, - 0xd6, 0x30, 0x06, 0xb2, 0x87, 0xf7, 0xad, 0x47, 0x34, 0x78, 0x8e, 0xda, 0x1c, 0x69, 0x1b, 0x18, - 0xdb, 0xd0, 0x39, 0x4a, 0x73, 0x8c, 0xe7, 0x21, 0x7b, 0xbc, 0xfe, 0x9e, 0x19, 0x38, 0xdf, 0x34, - 0xc1, 0x81, 0x33, 0x68, 0x99, 0x85, 0x11, 0x5b, 0xe6, 0xa8, 0xbb, 0x0b, 0x54, 0xd6, 0xe3, 0x1b, - 0x30, 0x47, 0xd9, 0x5d, 0x48, 0x60, 0x22, 0x7b, 0xc4, 0xdf, 0x2c, 0x83, 0x42, 0x73, 0xf2, 0xe3, - 0xe5, 0xa8, 0x73, 0x11, 0x2c, 0xab, 0xe6, 0xd8, 0x86, 0xcb, 0x51, 0xe6, 0x22, 0xb1, 0x2c, 0x4c, - 0x20, 0x7e, 0xff, 0x71, 0x30, 0x87, 0x27, 0xdc, 0xc1, 0x6e, 0xeb, 0xdf, 0xd3, 0x51, 0xf3, 0xf5, - 0x19, 0xb6, 0xd5, 0xfb, 0xc0, 0x74, 0xb0, 0x3b, 0x44, 0x47, 0xce, 0x45, 0xb1, 0xf6, 0x19, 0x70, - 0x69, 0x84, 0xdf, 0x1f, 0xca, 0x27, 0x62, 0xec, 0x3b, 0x81, 0xa3, 0xfa, 0x44, 0x1c, 0xe9, 0x6e, - 0xe0, 0x6f, 0x47, 0x23, 0xea, 0x7f, 0xcd, 0x0e, 0xf3, 0xfe, 0x5d, 0xc2, 0xfc, 0x80, 0x5d, 0xc2, - 0x4f, 0xb2, 0x58, 0x36, 0x79, 0x2c, 0xef, 0x11, 0x15, 0xe1, 0x18, 0xc7, 0xda, 0xf7, 0x86, 0x70, - 0x9e, 0xe3, 0xe0, 0x5c, 0x3a, 0x14, 0x2f, 0x13, 0x38, 0x3f, 0x99, 0x8f, 0xc6, 0xdc, 0x4f, 0x65, - 0xd8, 0x8e, 0xfb, 0x0e, 0x67, 0xe4, 0x0f, 0x1c, 0xce, 0xe0, 0x5a, 0x7a, 0xe1, 0x90, 0x2d, 0xfd, - 0x53, 0xac, 0x76, 0xb4, 0x78, 0xed, 0x78, 0xba, 0x38, 0x22, 0xe3, 0x1b, 0x99, 0xdf, 0x17, 0xaa, - 0xc7, 0x79, 0x4e, 0x3d, 0xca, 0x87, 0x63, 0x26, 0x7b, 0xfd, 0xf8, 0xf5, 0x60, 0x42, 0x7b, 0xc4, - 0xed, 0x7d, 0xd4, 0x8d, 0x48, 0x4e, 0x88, 0x63, 0x1b, 0xb9, 0x47, 0xd9, 0x88, 0x1c, 0xc6, 0xc9, - 0x04, 0x42, 0xba, 0xcd, 0x83, 0x59, 0xcc, 0xd3, 0x79, 0xab, 0xb3, 0x0d, 0x7d, 0xed, 0x35, 0xc4, - 0x55, 0x31, 0x08, 0xa0, 0x39, 0xa6, 0x28, 0x47, 0x71, 0xc7, 0x66, 0xd3, 0xfa, 0x0b, 0x10, 0x26, - 0x17, 0x19, 0x06, 0x27, 0x1d, 0x88, 0x71, 0x28, 0x07, 0xd9, 0x43, 0xf6, 0x71, 0xe2, 0xcc, 0x51, - 0x33, 0xf7, 0x9d, 0x3d, 0x5f, 0x7b, 0x68, 0x0c, 0x1d, 0xf4, 0x12, 0x28, 0x76, 0x31, 0x35, 0x7a, - 0x3a, 0x23, 0x79, 0xba, 0x43, 0x45, 0x40, 0xca, 0x37, 0xe8, 0x97, 0x69, 0x8f, 0x68, 0x44, 0x72, - 0x24, 0x74, 0x26, 0x7d, 0x44, 0x63, 0x48, 0xf9, 0x13, 0xb9, 0xaa, 0x67, 0x1a, 0x95, 0x6e, 0xed, - 0x5a, 0xfe, 0x98, 0x02, 0x41, 0x74, 0x11, 0xad, 0x20, 0x10, 0x04, 0x7e, 0x48, 0x7b, 0xf0, 0x94, - 0x91, 0x0a, 0xfa, 0x7c, 0xd2, 0x07, 0x4f, 0x93, 0x8b, 0xcf, 0x1e, 0x93, 0x9f, 0x26, 0x2d, 0xeb, - 0x1c, 0xf1, 0xc1, 0xcd, 0xd0, 0xbd, 0x77, 0xe4, 0xc6, 0x42, 0x58, 0x3b, 0xba, 0xc6, 0x32, 0xb0, - 0xfc, 0xec, 0x81, 0xf9, 0xc5, 0xef, 0x04, 0x85, 0x0a, 0xbc, 0xb8, 0xb7, 0xad, 0xdd, 0x0d, 0xa6, - 0x5b, 0x2e, 0x84, 0x55, 0x7b, 0xcb, 0x41, 0xd2, 0xf5, 0xd1, 0xff, 0x00, 0x12, 0xfa, 0x84, 0xf0, - 0xd8, 0x81, 0x66, 0x27, 0x3a, 0x86, 0x16, 0x3c, 0x6a, 0x2f, 0x97, 0x40, 0xbe, 0xe9, 0x9b, 0xbe, - 0x36, 0x13, 0x62, 0xab, 0x3d, 0xc4, 0x62, 0x71, 0x37, 0x8f, 0xc5, 0x4d, 0x9c, 0x2c, 0x30, 0x07, - 0x8b, 0xe8, 0xfb, 0x18, 0x00, 0x34, 0x30, 0xfd, 0x80, 0xe7, 0xd8, 0x28, 0x47, 0x70, 0x52, 0x32, - 0x78, 0xd6, 0x5e, 0x15, 0x8a, 0xfb, 0x5e, 0x4e, 0xdc, 0x8f, 0x17, 0x2b, 0x62, 0x02, 0x2b, 0x6d, - 0x12, 0x98, 0x41, 0xa2, 0x5d, 0x85, 0x66, 0xc7, 0xd3, 0xbe, 0x23, 0x52, 0xfe, 0x18, 0x31, 0x6b, - 0x1f, 0x16, 0x8e, 0xe9, 0x49, 0x6a, 0x15, 0x12, 0x8f, 0xf7, 0x17, 0x08, 0x62, 0x9a, 0x48, 0x7c, - 0x4c, 0x93, 0xdb, 0x40, 0xde, 0xb2, 0xb7, 0x1c, 0xea, 0xbd, 0xf6, 0xe8, 0x18, 0xda, 0x48, 0x27, - 0x0c, 0x9c, 0x51, 0x30, 0xe0, 0x67, 0x32, 0x5b, 0x13, 0xb9, 0x3b, 0x2f, 0x8f, 0x4a, 0xd7, 0xfe, - 0xcf, 0xa1, 0xc2, 0x56, 0x55, 0x90, 0xef, 0x99, 0xfe, 0x0e, 0x2d, 0x1a, 0xff, 0x47, 0x36, 0xf2, - 0x9e, 0x6d, 0xda, 0x8e, 0xbd, 0xbf, 0x6b, 0x3d, 0x27, 0xbc, 0xa2, 0x97, 0x4b, 0x43, 0x9c, 0x6f, - 0x43, 0x1b, 0xba, 0xa6, 0x0f, 0x9b, 0x97, 0xb7, 0xf1, 0x1c, 0x6b, 0xda, 0x60, 0x93, 0x52, 0xeb, - 0x3f, 0xe2, 0x38, 0x5e, 0xff, 0xb7, 0xac, 0x2e, 0xc4, 0x01, 0x9f, 0xa8, 0xfe, 0x07, 0xcf, 0xa9, - 0xf4, 0x7f, 0x40, 0x11, 0xd9, 0xa3, 0xf1, 0xaf, 0x12, 0x98, 0x6b, 0x22, 0x85, 0x6b, 0xee, 0xed, - 0xee, 0x9a, 0xee, 0xbe, 0x76, 0x43, 0x84, 0x0a, 0xa3, 0x9a, 0x39, 0x4e, 0x35, 0xb5, 0x5f, 0x13, - 0xbe, 0x9d, 0x9a, 0x36, 0x6d, 0xa6, 0x84, 0xd4, 0xed, 0xe0, 0x89, 0xa0, 0x80, 0xd4, 0x3b, 0xf0, - 0xe7, 0x4b, 0x6c, 0x08, 0x24, 0xa7, 0x60, 0x60, 0xac, 0xa1, 0xbc, 0x4d, 0x20, 0x28, 0x87, 0x04, - 0x8e, 0x37, 0x7d, 0xb3, 0x7d, 0x69, 0xc5, 0x71, 0x9d, 0x3d, 0xdf, 0xb2, 0xa1, 0xa7, 0x3d, 0x26, - 0x42, 0x20, 0xd0, 0xff, 0x5c, 0xa4, 0xff, 0xda, 0xbf, 0xe7, 0x44, 0x47, 0xd1, 0xb0, 0x5b, 0x65, - 0xc9, 0xc7, 0xc4, 0xb9, 0x12, 0x1b, 0x17, 0x45, 0x28, 0x66, 0x2f, 0xb4, 0x37, 0xc9, 0x40, 0xd1, - 0x1f, 0xec, 0x39, 0xae, 0x5f, 0x73, 0xda, 0x66, 0xd7, 0xf3, 0x1d, 0x17, 0x6a, 0x8d, 0x44, 0xa9, - 0xa1, 0x1e, 0xa6, 0xe3, 0xb4, 0xa3, 0xc1, 0x91, 0x3e, 0xb1, 0x6a, 0x27, 0xf3, 0x3a, 0xfe, 0x71, - 0xe1, 0x5d, 0x46, 0x22, 0x95, 0x7e, 0x8e, 0x62, 0xf4, 0x7c, 0x50, 0x97, 0x96, 0xce, 0x15, 0x5f, - 0x6c, 0xe7, 0x51, 0x88, 0xa9, 0x09, 0x2c, 0x95, 0x4b, 0x60, 0xbe, 0xb9, 0x77, 0x31, 0x24, 0xe2, - 0xb1, 0x46, 0xc8, 0x6b, 0x85, 0x83, 0x59, 0x50, 0xc5, 0x63, 0x09, 0xc5, 0xc8, 0xf7, 0x46, 0x30, - 0xef, 0xb1, 0xd9, 0x28, 0xde, 0x7c, 0xa2, 0x60, 0x10, 0x8b, 0xe1, 0xa5, 0x66, 0x2f, 0xc0, 0xf7, - 0x49, 0x60, 0xbe, 0xd1, 0x83, 0x36, 0xec, 0x10, 0x1f, 0x3b, 0x4e, 0x80, 0x2f, 0x4f, 0x29, 0x40, - 0x8e, 0x50, 0x8c, 0x00, 0x23, 0x7f, 0xd8, 0x4a, 0x20, 0xbc, 0x28, 0x21, 0x95, 0xe0, 0x92, 0x4a, - 0xcb, 0x5e, 0x70, 0x5f, 0x92, 0xc0, 0xac, 0xb1, 0x67, 0xaf, 0xbb, 0x0e, 0x1a, 0x8d, 0x5d, 0xed, - 0x9e, 0xa8, 0x83, 0xb8, 0x15, 0x9c, 0xe8, 0xec, 0xb9, 0x78, 0xfd, 0xa9, 0x6a, 0x37, 0x61, 0xdb, - 0xb1, 0x3b, 0x1e, 0xae, 0x47, 0xc1, 0x38, 0xf8, 0xe2, 0xae, 0xfc, 0x0b, 0xfe, 0x4a, 0xce, 0x69, - 0x2f, 0x12, 0x8e, 0x98, 0x43, 0x2a, 0xcf, 0x14, 0x2d, 0xde, 0x13, 0x08, 0xc6, 0xc5, 0x19, 0x56, - 0x42, 0xf6, 0xc2, 0xfd, 0xbc, 0x04, 0xd4, 0x52, 0xbb, 0xed, 0xec, 0xd9, 0x7e, 0x13, 0x76, 0x61, - 0xdb, 0x6f, 0xb9, 0x66, 0x1b, 0xb2, 0xf6, 0xb3, 0x02, 0xe4, 0x8e, 0xe5, 0xd2, 0x3e, 0x18, 0xfd, - 0xa5, 0x72, 0x7c, 0xb9, 0xf0, 0x8e, 0x23, 0xa9, 0xe5, 0xc1, 0x52, 0x52, 0x88, 0x53, 0x6c, 0x5f, - 0x51, 0xb0, 0xa0, 0xec, 0xa5, 0xfa, 0x29, 0x09, 0xcc, 0x04, 0x3d, 0xf6, 0xb6, 0x88, 0x30, 0x7f, - 0x3a, 0xe5, 0x64, 0x24, 0x24, 0x9e, 0x42, 0x86, 0xef, 0x4a, 0x31, 0xab, 0x88, 0xa3, 0x9f, 0x4e, - 0x74, 0xa5, 0xf4, 0xa2, 0x43, 0x8f, 0xf5, 0xc6, 0xe6, 0x72, 0xa3, 0x56, 0xd1, 0x0d, 0x45, 0xd6, - 0xbe, 0x2c, 0x81, 0xfc, 0xba, 0x65, 0x6f, 0xb3, 0x81, 0xcd, 0x4e, 0x22, 0x3b, 0xb2, 0x03, 0x1f, - 0xa4, 0x2d, 0x9d, 0x3c, 0xa8, 0x77, 0x80, 0x93, 0xf6, 0xde, 0xee, 0x45, 0xe8, 0x36, 0xb6, 0xf0, - 0x28, 0xeb, 0xb5, 0x9c, 0x26, 0xb4, 0x89, 0x11, 0x5a, 0x30, 0x06, 0xbe, 0xe3, 0x4d, 0x30, 0x81, - 0xc9, 0x03, 0xe2, 0x24, 0x46, 0xe2, 0x21, 0x53, 0x12, 0xc3, 0x54, 0xaa, 0x69, 0xc3, 0x00, 0xe2, - 0xd9, 0x6b, 0xea, 0x6f, 0x14, 0xc0, 0xd5, 0x25, 0x7b, 0x1f, 0xdb, 0x14, 0xa4, 0x83, 0x2f, 0xef, - 0x98, 0xf6, 0x36, 0xc4, 0x03, 0x44, 0x28, 0x71, 0x36, 0xd2, 0x7f, 0x8e, 0x8f, 0xf4, 0xaf, 0x1a, - 0x60, 0xca, 0x71, 0x3b, 0xd0, 0x5d, 0xda, 0xc7, 0x3c, 0xf5, 0x2f, 0x3b, 0xd3, 0x36, 0x39, 0xa8, - 0x88, 0x45, 0x4a, 0x7e, 0xb1, 0x41, 0xbe, 0x37, 0x02, 0x42, 0x67, 0x6f, 0x05, 0x53, 0x34, 0x4d, - 0x9d, 0x03, 0xd3, 0x0d, 0xa3, 0xa2, 0x1b, 0x9b, 0xd5, 0x8a, 0x72, 0x4c, 0xbd, 0x0a, 0x1c, 0xaf, - 0xb6, 0x74, 0xa3, 0xd4, 0xaa, 0x36, 0xea, 0x9b, 0x38, 0x5d, 0xc9, 0x69, 0xcf, 0xcf, 0x8b, 0x7a, - 0xf6, 0x26, 0x33, 0x33, 0x08, 0x56, 0x03, 0x4c, 0xb5, 0x49, 0x06, 0x3c, 0x84, 0xce, 0xa6, 0xaa, - 0x1d, 0x25, 0x48, 0x12, 0x8c, 0x80, 0x90, 0x7a, 0x06, 0x80, 0x2b, 0xae, 0x63, 0x6f, 0x47, 0x67, - 0xda, 0xa6, 0x0d, 0x26, 0x45, 0x7b, 0x28, 0x07, 0x8a, 0xe4, 0x1b, 0x7c, 0xb3, 0x09, 0xfe, 0x17, - 0x09, 0x3e, 0x78, 0x46, 0x16, 0x2f, 0x96, 0x57, 0x34, 0xd1, 0xa2, 0x8f, 0x48, 0x17, 0x89, 0x0c, - 0x88, 0x25, 0x4c, 0xab, 0x72, 0x1b, 0x28, 0x92, 0x6f, 0xa9, 0xd7, 0x41, 0x7c, 0x94, 0x52, 0x92, - 0x4d, 0xd0, 0x4f, 0x59, 0x5c, 0xa6, 0xd9, 0x6b, 0xf3, 0x47, 0x24, 0x30, 0x5d, 0x87, 0x7e, 0x79, - 0x07, 0xb6, 0x2f, 0x69, 0x8f, 0xe3, 0x17, 0x40, 0xbb, 0x16, 0xb4, 0xfd, 0x0b, 0xbb, 0xdd, 0x70, - 0x01, 0x34, 0x48, 0xd0, 0x5e, 0xc8, 0x76, 0xbe, 0xcf, 0xe0, 0xf5, 0xe7, 0x96, 0x01, 0x75, 0x0d, - 0x4a, 0x88, 0x51, 0x99, 0x53, 0xa0, 0xe8, 0x42, 0x6f, 0xaf, 0x1b, 0x2c, 0xa2, 0xd1, 0x27, 0xed, - 0xe1, 0x50, 0x9c, 0x65, 0x4e, 0x9c, 0xb7, 0x89, 0x17, 0x31, 0x81, 0xb0, 0xa7, 0x79, 0x30, 0x55, - 0xb5, 0x2d, 0xdf, 0x32, 0xbb, 0xda, 0x8b, 0xf2, 0x60, 0xbe, 0x09, 0xfd, 0x75, 0xd3, 0x35, 0x77, - 0xa1, 0x0f, 0x5d, 0x4f, 0xfb, 0x06, 0xdf, 0x27, 0xf4, 0xba, 0xa6, 0xbf, 0xe5, 0xb8, 0xbb, 0x81, - 0x6a, 0x06, 0xcf, 0x48, 0x35, 0x2f, 0x43, 0xd7, 0x8b, 0xf8, 0x0a, 0x1e, 0xd1, 0x9b, 0x2b, 0x8e, - 0x7b, 0x09, 0x0d, 0x82, 0x74, 0x9a, 0x46, 0x1f, 0x11, 0xbd, 0xae, 0xb3, 0x5d, 0x83, 0x97, 0x61, - 0x10, 0x55, 0x2d, 0x7c, 0x46, 0x73, 0x81, 0x8e, 0x53, 0x77, 0x7c, 0xd4, 0x69, 0xd7, 0x9c, 0x6d, - 0x12, 0x76, 0x76, 0xda, 0xe0, 0x13, 0xa3, 0x5c, 0xe6, 0x65, 0x88, 0x73, 0x15, 0xd9, 0x5c, 0x34, - 0x51, 0x5d, 0x04, 0x6a, 0xf8, 0x59, 0x0b, 0x76, 0xe1, 0x2e, 0xf4, 0xdd, 0x7d, 0x7c, 0xbb, 0xc4, - 0xb4, 0x31, 0xe0, 0x0d, 0x1d, 0xa0, 0xc5, 0x27, 0xeb, 0x54, 0x7a, 0x8b, 0x9c, 0xe4, 0x0e, 0x35, - 0x59, 0x17, 0xa1, 0x38, 0x91, 0xdb, 0xb3, 0x64, 0x64, 0xcd, 0xbc, 0x42, 0x06, 0x79, 0x3c, 0x78, - 0xbe, 0x39, 0xc7, 0xad, 0x30, 0xed, 0x42, 0xcf, 0x33, 0xb7, 0x61, 0xb0, 0xc2, 0x44, 0x1f, 0xd5, - 0x3b, 0x41, 0xa1, 0x8b, 0x31, 0x25, 0x83, 0xc3, 0x0d, 0x5c, 0xcd, 0x90, 0x81, 0x81, 0x68, 0x85, - 0x23, 0x01, 0x86, 0xdb, 0x20, 0x5f, 0x9c, 0xbd, 0x0f, 0x14, 0x08, 0xfc, 0x33, 0xa0, 0x50, 0xd1, - 0x97, 0x36, 0x56, 0x94, 0x63, 0xe8, 0x6f, 0xc0, 0xdf, 0x0c, 0x28, 0x2c, 0x97, 0x5a, 0xa5, 0x9a, - 0x22, 0xa1, 0x7a, 0x54, 0xeb, 0xcb, 0x0d, 0x45, 0x46, 0x89, 0xeb, 0xa5, 0x7a, 0xb5, 0xac, 0xe4, - 0xd5, 0x59, 0x30, 0x75, 0xbe, 0x64, 0xd4, 0xab, 0xf5, 0x15, 0xa5, 0xa0, 0xfd, 0x25, 0x8b, 0xdf, - 0x5d, 0x3c, 0x7e, 0x37, 0xc6, 0xf1, 0x34, 0x08, 0xb2, 0x9f, 0x0f, 0x21, 0xbb, 0x87, 0x83, 0xec, - 0x3b, 0x45, 0x88, 0x4c, 0xc0, 0x9d, 0xa9, 0x08, 0xa6, 0xd6, 0x5d, 0xa7, 0x0d, 0x3d, 0x4f, 0xfb, - 0x19, 0x09, 0x14, 0xcb, 0xa6, 0xdd, 0x86, 0x5d, 0xed, 0x9a, 0x08, 0x2a, 0xe2, 0x2a, 0x9a, 0x0b, - 0x5c, 0x45, 0xb5, 0xaf, 0xe5, 0x44, 0x7b, 0x3f, 0x4a, 0x77, 0x91, 0xd0, 0x8c, 0x91, 0x8f, 0x58, - 0x2f, 0x97, 0x48, 0x6a, 0x02, 0x37, 0xec, 0x48, 0x60, 0x86, 0xae, 0x06, 0x5c, 0x84, 0xec, 0x3c, - 0xfc, 0x1b, 0x39, 0xd1, 0xc9, 0x61, 0x50, 0x83, 0x90, 0x4c, 0x8c, 0x3c, 0xc4, 0x26, 0x82, 0xc3, - 0xa8, 0x4d, 0x60, 0xf3, 0x50, 0x02, 0xb3, 0x1b, 0xb6, 0x37, 0x48, 0x28, 0xe2, 0xe1, 0xf8, 0x83, - 0x6a, 0x30, 0x84, 0x0e, 0x15, 0x8e, 0x7f, 0x38, 0xbd, 0xec, 0x05, 0xf3, 0x8d, 0x1c, 0x38, 0xb9, - 0x02, 0x6d, 0xe8, 0x5a, 0x6d, 0x52, 0x83, 0x40, 0x12, 0xf7, 0xf0, 0x92, 0x78, 0x1c, 0xc7, 0xf9, - 0xa0, 0x2f, 0x78, 0x09, 0xbc, 0x3a, 0x94, 0xc0, 0x33, 0x38, 0x09, 0xdc, 0x2a, 0x48, 0x67, 0x02, - 0xd7, 0xaa, 0xcf, 0x80, 0xb9, 0xba, 0xe3, 0x5b, 0x5b, 0x56, 0x9b, 0xf8, 0xa0, 0xfd, 0x9c, 0x0c, - 0xf2, 0x35, 0xcb, 0xf3, 0xb5, 0x52, 0xd4, 0x9d, 0x5c, 0x0f, 0x66, 0x2d, 0xbb, 0xdd, 0xdd, 0xeb, - 0x40, 0x03, 0x9a, 0xa4, 0x5f, 0x99, 0x36, 0xd8, 0xa4, 0x68, 0x6b, 0x1f, 0xb1, 0x25, 0x07, 0x5b, - 0xfb, 0xbf, 0x25, 0xbc, 0x0c, 0xc3, 0xb2, 0x80, 0xe3, 0x52, 0xc6, 0xd8, 0x5d, 0x25, 0x30, 0x6f, - 0x33, 0x59, 0x03, 0x83, 0xbd, 0xff, 0x5e, 0x02, 0x96, 0x9c, 0xc1, 0x7f, 0xa1, 0x7d, 0x40, 0xa8, - 0xb1, 0x0e, 0x63, 0x28, 0x1d, 0x32, 0xcb, 0x23, 0x4c, 0x92, 0x55, 0xb0, 0x50, 0xad, 0xb7, 0x74, - 0xa3, 0x5e, 0xaa, 0xd1, 0x2c, 0xb2, 0xf6, 0xaf, 0x12, 0x28, 0x18, 0xb0, 0xd7, 0xdd, 0x67, 0x03, - 0x4f, 0x53, 0x47, 0xf1, 0x5c, 0xe8, 0x28, 0xae, 0x2e, 0x03, 0x60, 0xb6, 0x51, 0xc1, 0xf8, 0x66, - 0x2e, 0x69, 0x60, 0x38, 0x53, 0xae, 0x82, 0xa5, 0x30, 0xb7, 0xc1, 0x7c, 0xa9, 0xbd, 0x58, 0x78, - 0xe7, 0x88, 0xa3, 0x86, 0x39, 0x8c, 0xe9, 0x13, 0x3e, 0x28, 0xb4, 0xd9, 0x33, 0x94, 0xdc, 0xd1, - 0x88, 0xff, 0x2b, 0x12, 0xc8, 0xb7, 0x50, 0x6f, 0xc9, 0x74, 0x9c, 0x9f, 0x1d, 0x4d, 0xc7, 0x11, - 0x99, 0x18, 0x1d, 0xbf, 0x17, 0xcc, 0xb1, 0x1a, 0x4b, 0x5d, 0x25, 0x12, 0x55, 0x9c, 0xfb, 0x60, - 0x14, 0x0d, 0x1f, 0xc0, 0xce, 0xd1, 0x88, 0xf8, 0xd3, 0x8f, 0x07, 0x60, 0x0d, 0xee, 0x5e, 0x84, - 0xae, 0xb7, 0x63, 0xf5, 0xb4, 0xbf, 0x96, 0xc1, 0xcc, 0x0a, 0xf4, 0x9b, 0xbe, 0xe9, 0xef, 0x79, - 0x7d, 0xdb, 0x9d, 0xb6, 0x53, 0x36, 0xdb, 0x3b, 0x90, 0x76, 0x47, 0xc1, 0xa3, 0xf6, 0x1e, 0x59, - 0xd4, 0x9f, 0x28, 0x2a, 0x67, 0x31, 0x2c, 0x23, 0x06, 0x93, 0x27, 0x80, 0x7c, 0xc7, 0xf4, 0x4d, - 0x8a, 0xc5, 0x35, 0x7d, 0x58, 0x44, 0x84, 0x0c, 0x9c, 0x4d, 0x7b, 0x87, 0x24, 0xe2, 0x50, 0x24, - 0x50, 0x7e, 0x3a, 0x10, 0x3e, 0x90, 0x1b, 0x01, 0x85, 0x13, 0x60, 0xbe, 0xde, 0x68, 0x6d, 0xd6, - 0x1a, 0x2b, 0x2b, 0x3a, 0x4a, 0x55, 0x64, 0xf5, 0x14, 0x50, 0xd7, 0x4b, 0x17, 0xd6, 0xf4, 0x7a, - 0x6b, 0xb3, 0xde, 0xa8, 0xe8, 0xf4, 0xcb, 0xbc, 0x7a, 0x1c, 0xcc, 0x96, 0x4b, 0xe5, 0xd5, 0x20, - 0xa1, 0xa0, 0x9e, 0x06, 0x27, 0xd7, 0xf4, 0xb5, 0x25, 0xdd, 0x68, 0xae, 0x56, 0xd7, 0x37, 0x11, - 0x99, 0xe5, 0xc6, 0x46, 0xbd, 0xa2, 0x14, 0x55, 0x0d, 0x9c, 0x62, 0xde, 0x9c, 0x37, 0x1a, 0xf5, - 0x95, 0xcd, 0x66, 0xab, 0xd4, 0xd2, 0x95, 0x29, 0xf5, 0x2a, 0x70, 0xbc, 0x5c, 0xaa, 0xe3, 0xec, - 0xe5, 0x46, 0xbd, 0xae, 0x97, 0x5b, 0xca, 0xb4, 0xf6, 0xef, 0x79, 0x30, 0x5b, 0xf5, 0xea, 0xe6, - 0x2e, 0x3c, 0x67, 0x76, 0xad, 0x8e, 0xf6, 0x22, 0x66, 0xe6, 0x71, 0x23, 0x98, 0x77, 0xc9, 0x5f, - 0xd8, 0x69, 0x59, 0x90, 0xa0, 0x39, 0x6f, 0xf0, 0x89, 0x68, 0x4e, 0x6e, 0x63, 0x02, 0xc1, 0x9c, - 0x9c, 0x3c, 0xa9, 0x4b, 0x00, 0x90, 0x7f, 0xad, 0xe8, 0x8e, 0xd8, 0xb3, 0xfd, 0xad, 0xc9, 0xdc, - 0x85, 0x1e, 0x74, 0x2f, 0x5b, 0x6d, 0x18, 0xe4, 0x34, 0x98, 0xaf, 0xb4, 0x3f, 0x95, 0x45, 0xf7, - 0x17, 0x19, 0x50, 0x99, 0xea, 0xc4, 0xf4, 0x86, 0x3f, 0x22, 0x8b, 0xec, 0x0e, 0x0a, 0x91, 0x4c, - 0xa7, 0x29, 0x2f, 0x95, 0x46, 0x5b, 0xb6, 0x6d, 0x35, 0x1a, 0x9b, 0xcd, 0xd5, 0x86, 0xd1, 0x52, - 0x64, 0x75, 0x0e, 0x4c, 0xa3, 0xc7, 0x5a, 0xa3, 0xbe, 0xa2, 0xe4, 0xd5, 0xab, 0xc1, 0x89, 0xd5, - 0x52, 0x73, 0xb3, 0x5a, 0x3f, 0x57, 0xaa, 0x55, 0x2b, 0x9b, 0xe5, 0xd5, 0x92, 0xd1, 0x54, 0x0a, - 0xea, 0x35, 0xe0, 0xea, 0x56, 0x55, 0x37, 0x36, 0x97, 0xf5, 0x52, 0x6b, 0xc3, 0xd0, 0x9b, 0x9b, - 0xf5, 0xc6, 0x66, 0xbd, 0xb4, 0xa6, 0x2b, 0x45, 0xd4, 0xfc, 0xf1, 0xab, 0x48, 0x6d, 0xa6, 0x0e, - 0x2a, 0xe3, 0x74, 0x8c, 0x32, 0xce, 0xf4, 0x2b, 0x23, 0x60, 0xd5, 0xca, 0xd0, 0x9b, 0xba, 0x71, - 0x4e, 0x57, 0x66, 0x07, 0xe9, 0xda, 0x9c, 0x7a, 0x12, 0x28, 0x88, 0x87, 0xcd, 0x6a, 0x33, 0xc8, - 0x59, 0x51, 0xe6, 0xb5, 0x4f, 0x15, 0xc1, 0x29, 0x03, 0x6e, 0x5b, 0x9e, 0x0f, 0xdd, 0x75, 0x73, - 0x7f, 0x17, 0xda, 0x7e, 0xd0, 0xc9, 0xff, 0x73, 0x6a, 0x65, 0x5c, 0x03, 0xf3, 0x3d, 0x42, 0x63, - 0x0d, 0xfa, 0x3b, 0x4e, 0x87, 0x8e, 0xc2, 0x8f, 0x8b, 0xed, 0x39, 0x16, 0xd7, 0xd9, 0xec, 0x06, - 0xff, 0x35, 0xa3, 0xdb, 0x72, 0x82, 0x6e, 0xe7, 0x47, 0xd1, 0x6d, 0xf5, 0x5a, 0x30, 0xb3, 0xe7, - 0x41, 0x57, 0xdf, 0x35, 0xad, 0x6e, 0x70, 0xc7, 0x67, 0x98, 0xa0, 0xbd, 0x33, 0x2f, 0x7a, 0x62, - 0x85, 0xa9, 0xcb, 0x60, 0x31, 0xc6, 0xf4, 0xad, 0x67, 0x00, 0xa0, 0x95, 0xdd, 0x70, 0xbb, 0x54, - 0x59, 0x99, 0x14, 0xc4, 0xdf, 0x45, 0xab, 0xdb, 0xb5, 0xec, 0xed, 0x70, 0xdf, 0x3f, 0x4a, 0xd0, - 0x5e, 0x2a, 0x8b, 0x9c, 0x60, 0x49, 0xcb, 0x5b, 0xba, 0xd6, 0xf4, 0x62, 0x69, 0xc2, 0xfd, 0xee, - 0xc1, 0xa6, 0x53, 0x54, 0x15, 0x30, 0x87, 0xd3, 0x68, 0x0b, 0x54, 0xa6, 0x50, 0x1f, 0x1c, 0x90, - 0x5b, 0xd3, 0x5b, 0xab, 0x8d, 0x4a, 0xf8, 0x6e, 0x1a, 0x91, 0x44, 0xcc, 0x94, 0xea, 0x17, 0x70, - 0x6b, 0x9c, 0x51, 0x1f, 0x03, 0xae, 0x61, 0x3a, 0xec, 0x52, 0xcd, 0xd0, 0x4b, 0x95, 0x0b, 0x9b, - 0xfa, 0xb3, 0xaa, 0xcd, 0x56, 0x93, 0x6f, 0x5c, 0x41, 0x3b, 0x9a, 0x45, 0xfc, 0xea, 0x6b, 0xa5, - 0x6a, 0x8d, 0xf6, 0xef, 0xcb, 0x0d, 0x63, 0xad, 0xd4, 0x52, 0xe6, 0xb4, 0x57, 0xc8, 0x40, 0x59, - 0x81, 0xfe, 0xba, 0xe3, 0xfa, 0x66, 0xb7, 0x66, 0xd9, 0x97, 0x36, 0xdc, 0x2e, 0x37, 0xd9, 0x14, - 0x0e, 0xd3, 0xc1, 0x0f, 0x91, 0x1c, 0xc1, 0xf8, 0x1d, 0xf1, 0x1e, 0xce, 0x16, 0x29, 0x53, 0x94, - 0xa0, 0x3d, 0x57, 0x12, 0x59, 0xee, 0x16, 0x2f, 0x35, 0x9d, 0x9e, 0x3c, 0x6f, 0xd2, 0xe3, 0xf3, - 0x00, 0xd4, 0x8a, 0xda, 0x0b, 0xf2, 0x60, 0x7a, 0xd9, 0xb2, 0xcd, 0xae, 0xf5, 0x1c, 0x2e, 0x3a, - 0x66, 0xd4, 0xc7, 0xe4, 0x12, 0xfa, 0x18, 0x69, 0xa4, 0xf1, 0xf3, 0xa7, 0x64, 0xd1, 0xe5, 0x05, - 0x46, 0xf6, 0x01, 0x93, 0x31, 0x83, 0xe7, 0x47, 0x25, 0x91, 0xe5, 0x85, 0xe1, 0xf4, 0xd2, 0x61, - 0xf8, 0x99, 0x6f, 0x0f, 0x1b, 0xab, 0xaf, 0x7d, 0x4f, 0x0f, 0x52, 0x85, 0x19, 0xed, 0xf7, 0x64, - 0xa0, 0xad, 0x40, 0xff, 0x1c, 0x74, 0xc3, 0xa9, 0x00, 0xee, 0xf5, 0xa9, 0xbd, 0xcd, 0x34, 0xd9, - 0x37, 0xb3, 0x00, 0x9e, 0xe7, 0x01, 0x2c, 0x25, 0x34, 0x9e, 0x18, 0xd2, 0x31, 0x8d, 0xb7, 0x0a, - 0x8a, 0x1e, 0x7e, 0x4f, 0xd5, 0xec, 0x89, 0xf1, 0xc3, 0x25, 0x26, 0xc6, 0x52, 0x27, 0x84, 0x0d, - 0x4a, 0x40, 0xfb, 0x66, 0x38, 0x09, 0xfa, 0x1e, 0x4e, 0x3b, 0x96, 0x0f, 0xcd, 0x6c, 0x3a, 0x7d, - 0x71, 0xb3, 0x55, 0x97, 0x41, 0xf6, 0x8d, 0xf6, 0xd1, 0x02, 0x38, 0x39, 0xa8, 0x3a, 0xda, 0x2f, - 0xe7, 0xb8, 0x1d, 0x76, 0x88, 0x87, 0xfc, 0x1c, 0xdd, 0x40, 0x44, 0x0f, 0xea, 0x93, 0xc1, 0xd5, - 0xe1, 0x32, 0x5c, 0xcb, 0xa9, 0xc3, 0x2b, 0x5e, 0x17, 0xfa, 0x3e, 0x74, 0x71, 0xd5, 0xa6, 0x8d, - 0xc1, 0x2f, 0xd5, 0xa7, 0x82, 0x47, 0x59, 0xb6, 0x67, 0x75, 0xa0, 0xdb, 0xb2, 0x7a, 0x5e, 0xc9, - 0xee, 0xb4, 0xf6, 0x7c, 0xc7, 0xb5, 0x4c, 0x7a, 0x23, 0xe5, 0xb4, 0x11, 0xf7, 0x5a, 0xbd, 0x05, - 0x28, 0x96, 0xd7, 0xb0, 0x2f, 0x3a, 0xa6, 0xdb, 0xb1, 0xec, 0xed, 0x9a, 0xe5, 0xf9, 0xd4, 0x03, - 0xf8, 0x40, 0xba, 0xf6, 0x37, 0xb2, 0xe8, 0x61, 0xba, 0x21, 0xb0, 0xc6, 0x74, 0x28, 0x2f, 0x94, - 0x45, 0x8e, 0xc7, 0xa5, 0xa3, 0x9d, 0x4e, 0x59, 0x9e, 0x3f, 0x69, 0x43, 0x62, 0xf0, 0x08, 0x8e, - 0xbb, 0x16, 0x92, 0x1e, 0x18, 0x02, 0xe7, 0x74, 0xa3, 0xba, 0x5c, 0xd5, 0x91, 0x59, 0x71, 0x35, - 0x38, 0x11, 0xbd, 0xab, 0x5c, 0xd8, 0x6c, 0xea, 0xf5, 0x96, 0x32, 0x8d, 0xfa, 0x29, 0x92, 0xbc, - 0x5c, 0xaa, 0xd6, 0xf4, 0xca, 0x66, 0xab, 0x81, 0xde, 0x54, 0x46, 0x33, 0x2d, 0xb4, 0x87, 0xf2, - 0xe0, 0x38, 0x96, 0xed, 0x3e, 0x96, 0x2a, 0x12, 0x4a, 0x9f, 0xaf, 0x6d, 0x08, 0xd0, 0x0c, 0x11, - 0xaf, 0xf6, 0xbb, 0xc2, 0x17, 0x6e, 0x32, 0x10, 0xf6, 0x95, 0x11, 0xa3, 0x19, 0xdf, 0x90, 0x44, - 0x22, 0x54, 0x08, 0x93, 0x4d, 0xa7, 0x14, 0xff, 0x32, 0xe9, 0x11, 0x27, 0x1e, 0x7c, 0x6c, 0x65, - 0x96, 0xf1, 0xc7, 0xcf, 0x5a, 0xaf, 0x1a, 0x58, 0x1d, 0x16, 0x00, 0xc0, 0x29, 0x58, 0x83, 0x88, - 0x1e, 0x0c, 0x1c, 0xaf, 0xe2, 0xf4, 0xa0, 0x54, 0x6e, 0x55, 0xcf, 0xe9, 0x71, 0x7a, 0xf0, 0x39, - 0x19, 0x4c, 0xaf, 0x40, 0x1f, 0xcd, 0xa9, 0x3c, 0xed, 0x69, 0x02, 0xeb, 0x3f, 0xc8, 0x8c, 0xe9, - 0x3a, 0x6d, 0xb3, 0x1b, 0x2e, 0x03, 0x90, 0x27, 0xed, 0x87, 0x47, 0x31, 0x41, 0x82, 0xa2, 0x63, - 0xc6, 0xab, 0xef, 0x06, 0x05, 0x1f, 0xbd, 0xa6, 0xcb, 0xd0, 0xdf, 0x11, 0x3b, 0x5c, 0x21, 0x22, - 0x15, 0xd3, 0x37, 0x0d, 0x92, 0x9f, 0x19, 0x9d, 0x04, 0x6d, 0x97, 0x18, 0x46, 0xbe, 0x1d, 0xed, - 0xcf, 0xbf, 0x94, 0xc1, 0xd5, 0xa4, 0x7d, 0x94, 0x7a, 0xbd, 0xa6, 0xef, 0xb8, 0xd0, 0x80, 0x6d, - 0x68, 0xf5, 0xfc, 0xbe, 0xf5, 0x3d, 0x97, 0xa4, 0x06, 0x9b, 0xcd, 0xf4, 0x51, 0x7b, 0x83, 0x2c, - 0x1a, 0xe1, 0xf7, 0x40, 0x7b, 0xec, 0x2b, 0x2f, 0xa6, 0xb1, 0x7f, 0x52, 0x12, 0x89, 0xd9, 0x9b, - 0x92, 0x78, 0x3a, 0xa0, 0x3e, 0x76, 0x04, 0x40, 0x05, 0x2b, 0x37, 0x86, 0x5e, 0xd6, 0xab, 0xeb, - 0x68, 0x10, 0xb8, 0x0e, 0x3c, 0x7a, 0x7d, 0xc3, 0x28, 0xaf, 0x96, 0x9a, 0xfa, 0xa6, 0xa1, 0xaf, - 0x54, 0x9b, 0x2d, 0xea, 0x94, 0x45, 0xbe, 0x9a, 0x52, 0xaf, 0x05, 0xa7, 0x9b, 0x1b, 0x4b, 0xcd, - 0xb2, 0x51, 0x5d, 0xc7, 0xe9, 0x86, 0x5e, 0xd7, 0xcf, 0xd3, 0xb7, 0xd3, 0xda, 0x87, 0x15, 0x30, - 0x8b, 0x26, 0x00, 0x4d, 0x32, 0x2f, 0xd0, 0xfe, 0x2e, 0x0f, 0x66, 0x0d, 0xe8, 0x39, 0xdd, 0xcb, - 0x78, 0x8e, 0x30, 0xa9, 0xa9, 0xc7, 0xd7, 0x65, 0xd1, 0xf3, 0xdb, 0x0c, 0xb3, 0x8b, 0x0c, 0xa3, - 0xf1, 0x13, 0x4d, 0xf3, 0xb2, 0x69, 0x75, 0xcd, 0x8b, 0xb4, 0xab, 0x99, 0x36, 0xa2, 0x04, 0x75, - 0x11, 0xa8, 0xce, 0x15, 0x1b, 0xba, 0xcd, 0xf6, 0x15, 0xdd, 0xdf, 0x29, 0x75, 0x3a, 0x2e, 0xf4, - 0x3c, 0xba, 0x7a, 0x31, 0xe0, 0x8d, 0x7a, 0x33, 0x38, 0x8e, 0x53, 0x99, 0xcc, 0xc4, 0x41, 0xa6, - 0x3f, 0x39, 0xcc, 0x59, 0xb2, 0xf7, 0x83, 0x9c, 0x05, 0x26, 0x67, 0x94, 0xcc, 0x1e, 0x97, 0x28, - 0xf2, 0xa7, 0x74, 0xae, 0x07, 0xb3, 0xb6, 0xb9, 0x0b, 0xf5, 0x07, 0x7b, 0x96, 0x0b, 0x3d, 0xec, - 0x18, 0x23, 0x1b, 0x6c, 0x92, 0xf6, 0x51, 0xa1, 0xf3, 0xe6, 0x62, 0x12, 0x4b, 0xa7, 0xfb, 0x2b, - 0x23, 0xa8, 0xfe, 0x80, 0x7e, 0x46, 0xd6, 0x3e, 0x2c, 0x83, 0x39, 0xca, 0x54, 0xc9, 0xde, 0xaf, - 0x76, 0xb4, 0xeb, 0x38, 0xe3, 0xd7, 0x44, 0x69, 0x81, 0xf1, 0x8b, 0x1f, 0xb4, 0x1f, 0x95, 0x45, - 0xdd, 0x9d, 0x07, 0x54, 0x1c, 0x97, 0x11, 0xef, 0x38, 0xba, 0xe5, 0xec, 0x51, 0x47, 0xd5, 0x69, - 0x83, 0x3c, 0x64, 0xb9, 0xa8, 0xa7, 0xfd, 0xaa, 0x90, 0x33, 0xb5, 0x60, 0x35, 0x8e, 0x08, 0xc0, - 0x4f, 0xcb, 0x60, 0x81, 0x72, 0xd5, 0xa4, 0xe7, 0x7c, 0x84, 0x0e, 0xbc, 0xfd, 0xb8, 0xb0, 0x21, - 0x38, 0xa0, 0xfe, 0xb4, 0xa4, 0x47, 0x0c, 0x90, 0x1f, 0x17, 0x0a, 0x8e, 0x26, 0x5c, 0x91, 0x23, - 0x82, 0xf2, 0x5d, 0x79, 0x30, 0xbb, 0xe1, 0x41, 0x97, 0xfa, 0xed, 0x6b, 0x0f, 0xe7, 0x81, 0xbc, - 0x02, 0xb9, 0x8d, 0xd4, 0x97, 0x08, 0x7b, 0xf8, 0xb2, 0x95, 0x65, 0x88, 0x22, 0x1b, 0x29, 0x06, - 0xb6, 0x9b, 0xc0, 0x02, 0x11, 0x69, 0xc9, 0xf7, 0x91, 0x91, 0x18, 0x78, 0xd3, 0xf6, 0xa5, 0x8e, - 0x63, 0xab, 0x08, 0x97, 0x85, 0xb2, 0x94, 0x11, 0x4f, 0x35, 0xb8, 0x45, 0xe6, 0xb3, 0x79, 0xa3, - 0x2f, 0x55, 0xbd, 0x1d, 0x5c, 0xe5, 0xf4, 0x20, 0x39, 0xbf, 0xc2, 0x64, 0x2e, 0xe0, 0xcc, 0x83, - 0x5e, 0x69, 0x7f, 0x27, 0xe4, 0xab, 0x2b, 0x2e, 0x9d, 0x74, 0xba, 0xd0, 0x1b, 0x8f, 0x49, 0x72, - 0x12, 0x28, 0x28, 0x07, 0xde, 0x7f, 0x31, 0xf4, 0x66, 0xa3, 0x76, 0x4e, 0x1f, 0xbc, 0x8c, 0x51, - 0xd0, 0x9e, 0x2f, 0x83, 0x99, 0x25, 0xd7, 0x31, 0x3b, 0x6d, 0xd3, 0xf3, 0xb5, 0x6f, 0x4a, 0x60, - 0x6e, 0xdd, 0xdc, 0xef, 0x3a, 0x66, 0x07, 0xfb, 0xf7, 0xf7, 0xf5, 0x05, 0x3d, 0xf2, 0x2a, 0xe8, - 0x0b, 0xe8, 0x23, 0x7f, 0x30, 0x30, 0x3c, 0xba, 0x97, 0x13, 0xb9, 0x57, 0x33, 0xdc, 0xe6, 0x93, - 0x06, 0x05, 0x2b, 0x0d, 0xf8, 0x5a, 0x64, 0x79, 0x8a, 0xb1, 0x28, 0x3f, 0x2c, 0x16, 0x7e, 0x54, - 0x84, 0xe4, 0xd1, 0xec, 0xca, 0xbf, 0x60, 0x1a, 0x14, 0x2b, 0x10, 0x5b, 0x71, 0xff, 0x5d, 0x02, - 0x53, 0x4d, 0xe8, 0x63, 0x0b, 0xee, 0x4e, 0xce, 0x53, 0xb8, 0x83, 0x33, 0x44, 0x4e, 0xec, 0xc1, - 0x33, 0x9a, 0xac, 0x33, 0xe7, 0xad, 0xf1, 0xff, 0x14, 0x1e, 0x89, 0xa4, 0xdc, 0x45, 0x5a, 0xe6, - 0xa1, 0x3c, 0x12, 0x13, 0x49, 0x65, 0xef, 0x6b, 0xf5, 0x1e, 0x89, 0xba, 0x56, 0x31, 0xbd, 0xde, - 0x6b, 0x58, 0xfd, 0x4c, 0xf4, 0x36, 0xa3, 0xcc, 0x27, 0x38, 0x47, 0x3d, 0x09, 0x4c, 0x11, 0x99, - 0x07, 0xf3, 0xd1, 0x7e, 0x3f, 0x05, 0x42, 0x02, 0x9f, 0xbd, 0x0e, 0x72, 0x0a, 0xba, 0xa8, 0xc5, - 0x17, 0x3e, 0x91, 0x18, 0x04, 0x73, 0x75, 0xe8, 0x5f, 0x71, 0xdc, 0x4b, 0x4d, 0xdf, 0xf4, 0xa1, - 0xf6, 0x2f, 0x12, 0xb9, 0x2e, 0x8f, 0x89, 0x7e, 0x52, 0x07, 0x27, 0x48, 0x85, 0x68, 0x46, 0xdc, - 0x7f, 0x93, 0x8a, 0x5c, 0x3f, 0x50, 0x08, 0x4c, 0x3e, 0xe3, 0xe0, 0xa7, 0xda, 0xcf, 0x0c, 0x0c, - 0xfa, 0x24, 0x0d, 0x98, 0x34, 0x50, 0xc9, 0xb0, 0x0c, 0xc6, 0xdf, 0x8f, 0xa7, 0x7d, 0x44, 0xc8, - 0xac, 0x16, 0xa3, 0x79, 0x34, 0x5d, 0xc1, 0xbf, 0x3d, 0x0e, 0xe4, 0xcb, 0x3b, 0xa6, 0xaf, 0xbd, - 0x5b, 0x06, 0xa0, 0xd4, 0xe9, 0xac, 0x11, 0x1f, 0x70, 0xd6, 0x21, 0xed, 0x2c, 0x98, 0x6b, 0xef, - 0x98, 0xd1, 0xcd, 0x19, 0xa4, 0x3f, 0xe0, 0xd2, 0xd4, 0x27, 0x47, 0xce, 0xe4, 0x44, 0xaa, 0x5a, - 0x1f, 0x4c, 0xa8, 0x0c, 0x4a, 0x3b, 0x74, 0x34, 0xe7, 0x43, 0x61, 0x26, 0x1e, 0xa1, 0x43, 0x9f, - 0x2f, 0x46, 0xec, 0xc5, 0xcf, 0xe1, 0x28, 0xe9, 0xf0, 0x80, 0x4d, 0x94, 0x90, 0xf2, 0xa4, 0xb7, - 0x58, 0x40, 0x8f, 0x64, 0xbe, 0x26, 0x12, 0xba, 0x56, 0xd5, 0x3b, 0x56, 0x20, 0x5a, 0x1a, 0x30, - 0x4b, 0x7b, 0x71, 0x2e, 0x1d, 0x7c, 0xc9, 0x82, 0x7b, 0x06, 0x98, 0x87, 0x1d, 0xcb, 0x87, 0x41, - 0x2d, 0xa9, 0x00, 0x93, 0x20, 0xe6, 0x3f, 0xd0, 0x9e, 0x27, 0x1c, 0x74, 0x0d, 0x0b, 0xf4, 0x60, - 0x8d, 0x62, 0xda, 0x9f, 0x58, 0x18, 0x35, 0x31, 0x9a, 0xd9, 0x83, 0xf5, 0xc3, 0x32, 0xb8, 0xba, - 0xe5, 0x6c, 0x6f, 0x77, 0x61, 0x20, 0x26, 0x48, 0xbc, 0x33, 0x35, 0x73, 0x9c, 0x70, 0xe1, 0x9d, - 0x20, 0xe7, 0x01, 0x2b, 0x3c, 0x4a, 0x86, 0x1e, 0xf8, 0x13, 0x53, 0x89, 0xb3, 0x28, 0x2c, 0xae, - 0x81, 0x7c, 0xc6, 0xa0, 0x20, 0x16, 0xf0, 0x59, 0x98, 0x6c, 0xf6, 0x40, 0x7c, 0x41, 0x02, 0xf3, - 0xe4, 0x5e, 0xc4, 0x40, 0x41, 0xef, 0x1f, 0x23, 0x00, 0xda, 0x37, 0x73, 0xa2, 0x7e, 0xb6, 0x58, - 0x26, 0x1c, 0x27, 0x31, 0x22, 0x16, 0x0b, 0xaa, 0x32, 0x94, 0xdc, 0x04, 0x6e, 0xea, 0xcc, 0x83, - 0xd9, 0x15, 0x18, 0xb4, 0x34, 0x4f, 0x7b, 0x7f, 0xca, 0x9e, 0xe8, 0x2c, 0x98, 0xc3, 0x97, 0x83, - 0x35, 0xe8, 0x31, 0x49, 0xb2, 0x6a, 0xc6, 0xa5, 0xa9, 0x37, 0x82, 0xf9, 0x8b, 0x70, 0xcb, 0x71, - 0x61, 0x83, 0x3b, 0x4b, 0xc9, 0x27, 0x0e, 0x0e, 0x4f, 0xa7, 0xde, 0x0c, 0x8e, 0x53, 0x47, 0xf7, - 0x25, 0x34, 0xd7, 0x37, 0xdd, 0x7d, 0x7a, 0x30, 0xad, 0x3f, 0x59, 0xfb, 0x4b, 0xb6, 0xc1, 0x2c, - 0xf1, 0x28, 0xde, 0x7a, 0x50, 0xec, 0x4c, 0xa5, 0x63, 0x46, 0xa7, 0xa7, 0x80, 0x69, 0xaa, 0x23, - 0x81, 0x41, 0x97, 0xd4, 0x83, 0x86, 0x79, 0xd5, 0xa7, 0x80, 0x19, 0x24, 0x22, 0x6c, 0x37, 0xd0, - 0xae, 0xf7, 0xf4, 0x80, 0x0f, 0xf1, 0x7b, 0x23, 0xca, 0xaa, 0xfd, 0x42, 0xa8, 0x33, 0x3a, 0xa7, - 0x33, 0x4f, 0x4c, 0xc3, 0xfc, 0x44, 0x2e, 0x92, 0x57, 0x98, 0xf2, 0x97, 0xf6, 0xab, 0x1d, 0x4f, - 0x5b, 0x4b, 0xa7, 0x35, 0x67, 0x00, 0x08, 0x9b, 0x5f, 0x10, 0x38, 0x83, 0x49, 0xe1, 0x63, 0xe3, - 0x27, 0x1e, 0x05, 0xec, 0x17, 0x07, 0x66, 0x67, 0xbc, 0x80, 0x0a, 0x1e, 0x21, 0x14, 0xe1, 0x24, - 0x7b, 0x74, 0x7e, 0x3e, 0x0f, 0xae, 0x0e, 0x4f, 0x38, 0xd5, 0x4c, 0x2f, 0x6a, 0xd9, 0x17, 0xd2, - 0x41, 0xc4, 0x1d, 0x29, 0x09, 0x9b, 0xe3, 0x49, 0x50, 0xf0, 0xf6, 0x2e, 0x86, 0x8e, 0x80, 0xe4, - 0x41, 0x7b, 0xa3, 0x9c, 0x6a, 0xac, 0x1a, 0xc8, 0xdf, 0x98, 0x1b, 0xe1, 0xad, 0xe0, 0x84, 0xbd, - 0xb7, 0x1b, 0x62, 0x81, 0x7b, 0x1a, 0xda, 0xb3, 0x1c, 0x7c, 0xc1, 0x37, 0xd9, 0xbc, 0x78, 0x93, - 0x4d, 0x31, 0x92, 0x8a, 0x54, 0x3a, 0x7b, 0xf5, 0xf8, 0x4c, 0xdf, 0x11, 0xb4, 0x72, 0x6a, 0xa5, - 0x20, 0xf0, 0x4b, 0x2c, 0xfc, 0xff, 0x94, 0x4b, 0xd5, 0xf3, 0x0e, 0x3f, 0xb9, 0x96, 0xa2, 0x27, - 0x3c, 0xca, 0x63, 0x6b, 0x9f, 0x97, 0x80, 0xd6, 0x8c, 0x1c, 0x72, 0x28, 0xa8, 0xeb, 0x2e, 0xbc, - 0x6c, 0xc1, 0x2b, 0x9c, 0xfb, 0xd6, 0x9b, 0x84, 0xe3, 0x50, 0xf3, 0xba, 0x72, 0x80, 0x68, 0xfc, - 0xba, 0xf8, 0x00, 0x5c, 0xc4, 0xe2, 0x4d, 0xa7, 0x2b, 0x71, 0x02, 0xb1, 0xc3, 0x25, 0x70, 0x86, - 0x41, 0x75, 0xd9, 0x75, 0x76, 0x13, 0x24, 0xfb, 0x0a, 0x56, 0xb2, 0x1b, 0xbc, 0x64, 0xef, 0x4d, - 0x54, 0x97, 0x01, 0x84, 0x63, 0xd4, 0xf1, 0xfd, 0xa1, 0x1c, 0x9f, 0xc5, 0xc9, 0xb1, 0x72, 0x48, - 0xfa, 0xd9, 0xcb, 0xf2, 0x0f, 0xf2, 0x60, 0xce, 0x80, 0x66, 0x27, 0x1c, 0x04, 0xfe, 0x6f, 0xc6, - 0xbc, 0x7b, 0x1a, 0xc8, 0xfb, 0xd1, 0x3a, 0xcd, 0xe3, 0x0e, 0x56, 0x86, 0xfd, 0x12, 0x3f, 0xe0, - 0xe5, 0x1a, 0xfc, 0xd1, 0x81, 0xde, 0x42, 0x12, 0xb0, 0x0d, 0x65, 0x11, 0xdb, 0x30, 0x3f, 0xc8, - 0x36, 0xbc, 0x19, 0x1c, 0xef, 0x9a, 0x9e, 0x5f, 0xb9, 0xd8, 0xb2, 0x76, 0xa1, 0xe7, 0x9b, 0xbb, - 0x3d, 0x6c, 0x05, 0xca, 0x46, 0x7f, 0x32, 0x7f, 0x0f, 0x7c, 0xe2, 0x79, 0xb0, 0x41, 0x55, 0x3c, - 0x7c, 0xcc, 0xdc, 0x0f, 0x09, 0x1d, 0xfe, 0x1a, 0x56, 0x76, 0x3a, 0xcd, 0xb8, 0x6f, 0x84, 0xb5, - 0xa5, 0x53, 0x40, 0x5d, 0xd3, 0x9b, 0xcd, 0xd2, 0x0a, 0x3e, 0x13, 0x12, 0x38, 0x09, 0x75, 0xce, - 0x3e, 0x16, 0x89, 0x8f, 0x20, 0xad, 0xce, 0x45, 0x63, 0xaf, 0x72, 0x4c, 0x9d, 0x05, 0x53, 0x2e, - 0xec, 0x75, 0x2d, 0xe8, 0x29, 0x39, 0xed, 0x1b, 0x12, 0x28, 0x6e, 0xd8, 0x2e, 0x34, 0x3b, 0xda, - 0x33, 0xe3, 0x87, 0x90, 0x11, 0x95, 0x82, 0x8f, 0x7b, 0x95, 0xb8, 0x2a, 0x4b, 0x1b, 0x1d, 0x62, - 0x64, 0x2c, 0xf0, 0x89, 0x2d, 0xc7, 0xc6, 0x97, 0x9a, 0x79, 0x93, 0x3e, 0x3b, 0x05, 0x0a, 0xfa, - 0x6e, 0xcf, 0xdf, 0x3f, 0xfb, 0x58, 0x30, 0xdf, 0xf4, 0x5d, 0x68, 0xee, 0x32, 0x9b, 0xea, 0xbe, - 0x73, 0x09, 0xda, 0xc1, 0xa6, 0x3a, 0x7e, 0xb8, 0xeb, 0x4e, 0x30, 0x65, 0x3b, 0x9b, 0xe6, 0x9e, - 0xbf, 0xa3, 0x5e, 0x77, 0x20, 0x1a, 0x0d, 0x55, 0xbf, 0x06, 0x0d, 0xff, 0xf7, 0xa7, 0x77, 0xe3, - 0xa9, 0x55, 0xd1, 0x76, 0x4a, 0x7b, 0xfe, 0xce, 0xd2, 0xb5, 0x9f, 0xfe, 0xb3, 0x33, 0xb9, 0xcf, - 0xfd, 0xd9, 0x99, 0xdc, 0x57, 0xfe, 0xec, 0x4c, 0xee, 0xc7, 0xff, 0xfc, 0xcc, 0xb1, 0xcf, 0xfd, - 0xf9, 0x99, 0x63, 0x5f, 0xf8, 0xf3, 0x33, 0xc7, 0xbe, 0x47, 0xea, 0x5d, 0xbc, 0x58, 0xc4, 0x54, - 0x9e, 0xf4, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xca, 0x85, 0x9f, 0xc3, 0x2b, 0x02, 0x00, + // 21513 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7b, 0x9c, 0x24, 0x49, + 0x59, 0x37, 0x8a, 0x4f, 0x65, 0x56, 0x55, 0x77, 0x47, 0x5f, 0x26, 0x27, 0x77, 0x76, 0x98, 0x4d, + 0x96, 0xd9, 0x75, 0x76, 0x59, 0xd6, 0x65, 0xe9, 0x5d, 0x16, 0x44, 0x76, 0xd9, 0x65, 0xa9, 0xae, + 0xca, 0xee, 0xae, 0xdd, 0xea, 0xaa, 0x26, 0xab, 0x7a, 0x86, 0xf1, 0x7d, 0xfd, 0xb5, 0x39, 0x55, + 0xd1, 0xdd, 0xb9, 0x53, 0x9d, 0x59, 0x64, 0x66, 0xcf, 0x6c, 0xf3, 0xfb, 0x78, 0x5e, 0x11, 0x57, + 0x40, 0x44, 0x44, 0x45, 0x45, 0xe4, 0xb6, 0x08, 0x08, 0xc8, 0xfd, 0xf6, 0x82, 0x02, 0xca, 0x45, + 0x10, 0x11, 0x51, 0xbc, 0x00, 0xca, 0x11, 0xef, 0xf8, 0x1e, 0x3d, 0xbe, 0x78, 0x14, 0x44, 0x45, + 0xcf, 0x27, 0x2e, 0x99, 0x19, 0x51, 0x5d, 0x99, 0x15, 0x59, 0x5d, 0x59, 0xbd, 0xe8, 0xf9, 0xab, + 0x2a, 0x23, 0x23, 0x9f, 0x78, 0xe2, 0xf9, 0x3e, 0x11, 0xf1, 0x44, 0xc4, 0x13, 0x4f, 0x80, 0xd3, + 0xbd, 0x8b, 0xb7, 0xf5, 0x5c, 0xc7, 0x77, 0xbc, 0xdb, 0xda, 0xce, 0xee, 0xae, 0x69, 0x77, 0xbc, + 0x45, 0xfc, 0xac, 0x4e, 0x99, 0xf6, 0xbe, 0xbf, 0xdf, 0x83, 0xda, 0x8d, 0xbd, 0x4b, 0xdb, 0xb7, + 0x75, 0xad, 0x8b, 0xb7, 0xf5, 0x2e, 0xde, 0xb6, 0xeb, 0x74, 0x60, 0x37, 0xf8, 0x00, 0x3f, 0xd0, + 0xec, 0xda, 0xcd, 0x71, 0xb9, 0xba, 0x4e, 0xdb, 0xec, 0x7a, 0xbe, 0xe3, 0x42, 0x9a, 0xf3, 0x54, + 0x54, 0x24, 0xbc, 0x0c, 0x6d, 0x3f, 0xa0, 0x70, 0xed, 0xb6, 0xe3, 0x6c, 0x77, 0x21, 0x79, 0x77, + 0x71, 0x6f, 0xeb, 0x36, 0xcf, 0x77, 0xf7, 0xda, 0x3e, 0x7d, 0x7b, 0x7d, 0xff, 0xdb, 0x0e, 0xf4, + 0xda, 0xae, 0xd5, 0xf3, 0x1d, 0x97, 0xe4, 0x38, 0xfb, 0xb5, 0xdf, 0x9b, 0x06, 0xb2, 0xd1, 0x6b, + 0x6b, 0x5f, 0x9f, 0x02, 0x72, 0xa9, 0xd7, 0xd3, 0x3e, 0x21, 0x01, 0xb0, 0x02, 0xfd, 0x73, 0xd0, + 0xf5, 0x2c, 0xc7, 0xd6, 0x8e, 0x83, 0x29, 0x03, 0x3e, 0x7b, 0x0f, 0x7a, 0xfe, 0x5d, 0xf9, 0x17, + 0xfc, 0x95, 0x9c, 0xd3, 0x5e, 0x2f, 0x81, 0x69, 0x03, 0x7a, 0x3d, 0xc7, 0xf6, 0xa0, 0xfa, 0x0c, + 0x50, 0x80, 0xae, 0xeb, 0xb8, 0xa7, 0x73, 0xd7, 0xe7, 0x6e, 0x9e, 0xbd, 0xe3, 0x96, 0x45, 0x5a, + 0xfd, 0x45, 0xa3, 0xd7, 0x5e, 0x2c, 0xf5, 0x7a, 0x8b, 0x11, 0xa5, 0xc5, 0xe0, 0xa3, 0x45, 0x1d, + 0x7d, 0x61, 0x90, 0x0f, 0xd5, 0xd3, 0x60, 0xea, 0x32, 0xc9, 0x70, 0x5a, 0xba, 0x3e, 0x77, 0xf3, + 0x8c, 0x11, 0x3c, 0xa2, 0x37, 0x1d, 0xe8, 0x9b, 0x56, 0xd7, 0x3b, 0x2d, 0x93, 0x37, 0xf4, 0x51, + 0x7b, 0x38, 0x07, 0x0a, 0x98, 0x88, 0x5a, 0x06, 0xf9, 0xb6, 0xd3, 0x81, 0xb8, 0xf8, 0x85, 0x3b, + 0x6e, 0x13, 0x2f, 0x7e, 0xb1, 0xec, 0x74, 0xa0, 0x81, 0x3f, 0x56, 0xaf, 0x07, 0xb3, 0x81, 0x58, + 0x22, 0x36, 0xd8, 0xa4, 0xb3, 0x77, 0x80, 0x3c, 0xca, 0xaf, 0x4e, 0x83, 0x7c, 0x7d, 0xa3, 0x56, + 0x53, 0x8e, 0xa9, 0x27, 0xc0, 0xfc, 0x46, 0xfd, 0xfe, 0x7a, 0xe3, 0x7c, 0x7d, 0x53, 0x37, 0x8c, + 0x86, 0xa1, 0xe4, 0xd4, 0x79, 0x30, 0xb3, 0x54, 0xaa, 0x6c, 0x56, 0xeb, 0xeb, 0x1b, 0x2d, 0x45, + 0xd2, 0x5e, 0x25, 0x83, 0x85, 0x26, 0xf4, 0x2b, 0xf0, 0xb2, 0xd5, 0x86, 0x4d, 0xdf, 0xf4, 0xa1, + 0xf6, 0x92, 0x5c, 0x28, 0x4c, 0x75, 0x03, 0x15, 0x1a, 0xbe, 0xa2, 0x15, 0x78, 0xd2, 0x81, 0x0a, + 0xf0, 0x14, 0x16, 0xe9, 0xd7, 0x8b, 0x4c, 0x9a, 0xc1, 0xd2, 0x39, 0xfb, 0x04, 0x30, 0xcb, 0xbc, + 0x53, 0x17, 0x00, 0x58, 0x2a, 0x95, 0xef, 0x5f, 0x31, 0x1a, 0x1b, 0xf5, 0x8a, 0x72, 0x0c, 0x3d, + 0x2f, 0x37, 0x0c, 0x9d, 0x3e, 0xe7, 0xb4, 0x6f, 0xe6, 0x18, 0x30, 0x2b, 0x3c, 0x98, 0x8b, 0xc3, + 0x99, 0x19, 0x00, 0xa8, 0xf6, 0x86, 0x10, 0x9c, 0x15, 0x0e, 0x9c, 0x27, 0xa5, 0x23, 0x97, 0x3d, + 0x40, 0x0f, 0x49, 0x60, 0xba, 0xb9, 0xb3, 0xe7, 0x77, 0x9c, 0x2b, 0xb6, 0x36, 0x13, 0x22, 0xa3, + 0xfd, 0x1d, 0x2b, 0x93, 0xa7, 0xf3, 0x32, 0xb9, 0xf9, 0x60, 0x25, 0x28, 0x85, 0x18, 0x69, 0xbc, + 0x26, 0x94, 0x46, 0x89, 0x93, 0xc6, 0x13, 0x44, 0x09, 0x65, 0x2f, 0x87, 0x2f, 0xdc, 0x0d, 0x0a, + 0xcd, 0x9e, 0xd9, 0x86, 0xda, 0x67, 0x64, 0x30, 0x57, 0x83, 0xe6, 0x65, 0x58, 0xea, 0xf5, 0x5c, + 0xe7, 0x32, 0xd4, 0xca, 0x91, 0xbe, 0x9e, 0x06, 0x53, 0x1e, 0xca, 0x54, 0xed, 0xe0, 0x1a, 0xcc, + 0x18, 0xc1, 0xa3, 0x7a, 0x06, 0x00, 0xab, 0x03, 0x6d, 0xdf, 0xf2, 0x2d, 0xe8, 0x9d, 0x96, 0xae, + 0x97, 0x6f, 0x9e, 0x31, 0x98, 0x14, 0xed, 0xeb, 0x92, 0xa8, 0x8e, 0x61, 0x2e, 0x16, 0x59, 0x0e, + 0x62, 0xa4, 0xfa, 0x3a, 0x49, 0x44, 0xc7, 0x86, 0x92, 0x4b, 0x27, 0xdb, 0xb7, 0xe5, 0xd2, 0x0b, + 0x17, 0xe5, 0xa8, 0x37, 0x36, 0x9b, 0x1b, 0xe5, 0xd5, 0xcd, 0xe6, 0x7a, 0xa9, 0xac, 0x2b, 0x50, + 0x3d, 0x09, 0x14, 0xfc, 0x77, 0xb3, 0xda, 0xdc, 0xac, 0xe8, 0x35, 0xbd, 0xa5, 0x57, 0x94, 0x2d, + 0x55, 0x05, 0x0b, 0x86, 0xfe, 0xcc, 0x0d, 0xbd, 0xd9, 0xda, 0x5c, 0x2e, 0x55, 0x6b, 0x7a, 0x45, + 0xd9, 0x46, 0x1f, 0xd7, 0xaa, 0x6b, 0xd5, 0xd6, 0xa6, 0xa1, 0x97, 0xca, 0xab, 0x7a, 0x45, 0xd9, + 0x51, 0x1f, 0x05, 0xae, 0xaa, 0x37, 0x36, 0x4b, 0xeb, 0xeb, 0x46, 0xe3, 0x9c, 0xbe, 0x49, 0xbf, + 0x68, 0x2a, 0x16, 0x29, 0xa8, 0xb5, 0xd9, 0x5c, 0x2d, 0x19, 0x7a, 0x69, 0xa9, 0xa6, 0x2b, 0x0f, + 0x68, 0xcf, 0x93, 0xc1, 0xfc, 0x9a, 0x79, 0x09, 0x36, 0x77, 0x4c, 0x17, 0x9a, 0x17, 0xbb, 0x50, + 0xbb, 0x41, 0x00, 0x4f, 0xed, 0x33, 0x2c, 0x5e, 0x3a, 0x8f, 0xd7, 0x6d, 0x03, 0x04, 0xcc, 0x15, + 0x11, 0x03, 0xd8, 0x3f, 0x87, 0xcd, 0x60, 0x95, 0x03, 0xec, 0xc9, 0x29, 0xe9, 0xa5, 0x43, 0xec, + 0x07, 0x1f, 0x01, 0x88, 0x69, 0x5f, 0xcc, 0x83, 0x85, 0xaa, 0x7d, 0xd9, 0xf2, 0xe1, 0x0a, 0xb4, + 0xa1, 0x8b, 0xc6, 0x81, 0x57, 0xe5, 0x44, 0xda, 0x55, 0x0b, 0x00, 0x0b, 0x7f, 0xd7, 0xda, 0xef, + 0x41, 0x5c, 0xbd, 0xc1, 0xf2, 0xe2, 0x89, 0x87, 0x43, 0x44, 0x35, 0xfc, 0xd6, 0x60, 0xe8, 0x9c, + 0xbd, 0x01, 0x80, 0xe8, 0x8d, 0x0a, 0x40, 0x71, 0x0d, 0xee, 0x5e, 0x84, 0xae, 0x72, 0x4c, 0x9d, + 0x01, 0x85, 0x15, 0xf4, 0xa5, 0x92, 0xd3, 0x5e, 0x2f, 0x33, 0x2a, 0xb0, 0xcc, 0xab, 0xc0, 0xed, + 0x22, 0x2c, 0x0c, 0x1a, 0xe9, 0xaf, 0x05, 0x33, 0x84, 0x8f, 0xb2, 0xd5, 0xa1, 0x68, 0x45, 0x09, + 0xea, 0x8d, 0x60, 0x9e, 0x3c, 0x2c, 0x5b, 0x5d, 0x78, 0x3f, 0xdc, 0xa7, 0x63, 0x3e, 0x9f, 0xa8, + 0xfd, 0x68, 0xd8, 0xf0, 0xab, 0x9c, 0x1e, 0x7d, 0x57, 0x5a, 0xa6, 0xd2, 0x29, 0xd2, 0xcb, 0x1e, + 0x09, 0x4d, 0xff, 0x40, 0x0b, 0xb7, 0xb4, 0x6f, 0x49, 0x60, 0xb6, 0xe9, 0x3b, 0x3d, 0xd4, 0x5c, + 0x2c, 0x7b, 0x5b, 0xac, 0x7d, 0x7f, 0x8a, 0x6d, 0xdf, 0x65, 0x1e, 0xdc, 0x27, 0x0c, 0x90, 0x23, + 0x53, 0x40, 0x4c, 0xeb, 0xfe, 0x7a, 0xd8, 0xba, 0x97, 0x39, 0x54, 0xee, 0x48, 0x45, 0xed, 0xdb, + 0xb0, 0x6d, 0xbf, 0x4c, 0x06, 0x4a, 0xa0, 0x66, 0x7e, 0x79, 0xcf, 0x75, 0xa1, 0xed, 0x8b, 0x81, + 0xf0, 0x47, 0x2c, 0x08, 0xab, 0x3c, 0x08, 0x77, 0x24, 0x28, 0x73, 0x50, 0x4a, 0x86, 0x6d, 0xec, + 0x57, 0x43, 0x34, 0xef, 0xe7, 0xd0, 0xfc, 0xee, 0xf4, 0x6c, 0xa5, 0x83, 0x74, 0x75, 0x04, 0x44, + 0x4f, 0x02, 0x05, 0x8d, 0x87, 0xe5, 0x56, 0xf5, 0x9c, 0xbe, 0x59, 0xad, 0x9f, 0xab, 0xb6, 0x74, + 0x05, 0x6a, 0x2f, 0x95, 0xa3, 0x3e, 0xd7, 0xc7, 0x9d, 0x9a, 0x18, 0x2a, 0x5f, 0x94, 0x46, 0xeb, + 0xf7, 0x48, 0x19, 0x13, 0xc1, 0x44, 0xbc, 0xdf, 0x1b, 0xc8, 0x54, 0x3a, 0x44, 0xee, 0x1b, 0x01, + 0x91, 0x53, 0x40, 0xad, 0xd6, 0xcf, 0x95, 0x6a, 0xd5, 0x0a, 0x69, 0x63, 0x9b, 0xad, 0x0b, 0xeb, + 0x08, 0x93, 0x9f, 0x94, 0xc1, 0x1c, 0x61, 0xcd, 0x80, 0x97, 0x9d, 0x4b, 0x82, 0xc6, 0xc8, 0x97, + 0x53, 0x1a, 0x8f, 0x6c, 0x09, 0x31, 0xbd, 0xd5, 0x8f, 0xa4, 0x30, 0x1e, 0x13, 0xc8, 0x3d, 0x92, + 0x46, 0x90, 0x03, 0x5d, 0xd3, 0xf6, 0x80, 0x1e, 0x6c, 0xe0, 0x08, 0xf2, 0xb1, 0x7c, 0x60, 0x0f, + 0x9c, 0xb3, 0xe0, 0x15, 0x6d, 0x2d, 0xc2, 0x84, 0x53, 0xdb, 0xdc, 0x50, 0xb5, 0x95, 0x06, 0xa9, + 0xed, 0x5f, 0xb2, 0x76, 0xc4, 0x12, 0x8f, 0xde, 0xad, 0xb1, 0xe2, 0x46, 0x9c, 0xc4, 0xaf, 0x16, + 0x04, 0x8a, 0x22, 0xf1, 0xd6, 0xd2, 0xb5, 0x60, 0x06, 0xff, 0xad, 0x9b, 0xbb, 0x90, 0xb6, 0xa1, + 0x28, 0x41, 0x3d, 0x0b, 0xe6, 0x48, 0xc6, 0xb6, 0x63, 0xa3, 0xfa, 0xe4, 0x71, 0x06, 0x2e, 0x0d, + 0x81, 0xd8, 0x76, 0xa1, 0xe9, 0x3b, 0x2e, 0xa6, 0x51, 0x20, 0x20, 0x32, 0x49, 0xea, 0xad, 0xe0, + 0x84, 0xe5, 0xe1, 0x56, 0xb5, 0xe1, 0x41, 0x97, 0x30, 0x7b, 0xba, 0x78, 0x7d, 0xee, 0xe6, 0x69, + 0xe3, 0xe0, 0x0b, 0xed, 0xab, 0x61, 0x9b, 0xd5, 0x39, 0x3d, 0x7b, 0x62, 0x9a, 0x8a, 0xa7, 0xd3, + 0xb2, 0xcb, 0xa3, 0xf5, 0xa0, 0xa4, 0xdf, 0xdc, 0x44, 0xba, 0xb1, 0x8c, 0x17, 0x06, 0x20, 0x6d, + 0xc5, 0x28, 0x15, 0xe5, 0x2d, 0x37, 0xea, 0x2d, 0xbd, 0xde, 0x52, 0xb6, 0x06, 0xea, 0xdf, 0xb6, + 0xf6, 0xba, 0x3c, 0xc8, 0xdf, 0xe7, 0x58, 0xb6, 0xf6, 0x50, 0x8e, 0x53, 0x20, 0x1b, 0xfa, 0x57, + 0x1c, 0xf7, 0x52, 0xd8, 0xac, 0xa3, 0x84, 0x64, 0x24, 0x23, 0xc5, 0x93, 0x87, 0x2a, 0x5e, 0x7e, + 0x90, 0xe2, 0xfd, 0x04, 0xab, 0x78, 0x77, 0xf3, 0x8a, 0x77, 0xd3, 0x00, 0xf9, 0x23, 0xe6, 0x63, + 0xba, 0x8b, 0x4f, 0x86, 0xdd, 0xc5, 0xbd, 0x1c, 0x8c, 0x8f, 0x17, 0x23, 0x93, 0x0e, 0xc0, 0x2f, + 0x65, 0xda, 0x4d, 0x0c, 0x82, 0x7a, 0x3b, 0x06, 0xea, 0x9d, 0x01, 0x3d, 0x88, 0x75, 0xb0, 0xa3, + 0x79, 0xe0, 0x60, 0xa7, 0x72, 0x49, 0xbd, 0x1a, 0x9c, 0xa8, 0x54, 0x97, 0x97, 0x75, 0x43, 0xaf, + 0xb7, 0x36, 0xeb, 0x7a, 0xeb, 0x7c, 0xc3, 0xb8, 0x5f, 0xe9, 0x6a, 0x0f, 0xcb, 0x00, 0x20, 0x09, + 0x95, 0x4d, 0xbb, 0x0d, 0xbb, 0x62, 0xfd, 0xff, 0xff, 0x2d, 0xa5, 0xeb, 0x41, 0x22, 0xfa, 0x31, + 0x70, 0xbe, 0x52, 0x12, 0x6f, 0x95, 0xb1, 0xc4, 0xd2, 0x81, 0xfa, 0xe6, 0x47, 0xc2, 0xec, 0xe1, + 0x2a, 0x70, 0x3c, 0xa0, 0x47, 0xb3, 0x0f, 0x5e, 0x34, 0x78, 0x7b, 0x1e, 0x2c, 0x50, 0x58, 0x82, + 0x55, 0xa0, 0x17, 0x08, 0x4d, 0x57, 0x35, 0x30, 0x4d, 0x17, 0x7d, 0x82, 0xc1, 0x20, 0x7c, 0x56, + 0x57, 0xc0, 0x6c, 0x0f, 0xba, 0xbb, 0x96, 0xe7, 0x59, 0x8e, 0x4d, 0x96, 0x73, 0x17, 0xee, 0x78, + 0x6c, 0x28, 0x71, 0xbc, 0xf2, 0xbd, 0xb8, 0x6e, 0xba, 0xbe, 0xd5, 0xb6, 0x7a, 0xa6, 0xed, 0xaf, + 0x47, 0x99, 0x0d, 0xf6, 0x4b, 0x64, 0xd8, 0xa5, 0x32, 0xd0, 0xf8, 0x9a, 0xc4, 0xa8, 0xc4, 0xaf, + 0xa4, 0x98, 0x54, 0x26, 0x12, 0x4c, 0xa7, 0x16, 0x9f, 0xc8, 0x54, 0x2d, 0x06, 0xe0, 0xbd, 0xad, + 0x5e, 0x03, 0xae, 0xae, 0xd6, 0xcb, 0x0d, 0xc3, 0xd0, 0xcb, 0xad, 0xcd, 0x75, 0xdd, 0x58, 0xab, + 0x36, 0x9b, 0xd5, 0x46, 0xbd, 0x79, 0x98, 0xd6, 0xae, 0x7d, 0x5a, 0x0e, 0x35, 0xa6, 0x02, 0xdb, + 0x5d, 0xcb, 0x86, 0xda, 0xbd, 0x87, 0x54, 0x18, 0x7e, 0xcd, 0x50, 0x1c, 0x67, 0x5a, 0x7e, 0x0c, + 0xce, 0xaf, 0x4d, 0x8f, 0xf3, 0x60, 0x82, 0xff, 0x89, 0x9b, 0xff, 0x97, 0x65, 0x70, 0x82, 0x69, + 0x88, 0x06, 0xdc, 0x1d, 0xdb, 0x3a, 0xf0, 0x0f, 0xb2, 0x6d, 0xb7, 0xca, 0x63, 0x3a, 0xc8, 0xf6, + 0x3e, 0xc0, 0x46, 0x0c, 0xac, 0x6f, 0x0e, 0x61, 0xad, 0x71, 0xb0, 0x3e, 0x75, 0x04, 0x9a, 0xe9, + 0x90, 0x7d, 0x47, 0xa6, 0xc8, 0x5e, 0x03, 0xae, 0x5e, 0x2f, 0x19, 0xad, 0x6a, 0xb9, 0xba, 0x5e, + 0x42, 0xe3, 0x28, 0x33, 0x64, 0xc7, 0x18, 0xf7, 0x3c, 0xe8, 0x03, 0xf1, 0xfd, 0x48, 0x1e, 0x5c, + 0x3b, 0xb8, 0xa3, 0x2d, 0xef, 0x98, 0xf6, 0x36, 0xd4, 0x2c, 0x11, 0xa8, 0x2b, 0x60, 0xaa, 0x8d, + 0xb3, 0x13, 0x9c, 0xd9, 0x8d, 0xbf, 0x84, 0xbe, 0x9c, 0x94, 0x60, 0x04, 0x9f, 0x6a, 0xef, 0x66, + 0x15, 0xa2, 0xc5, 0x2b, 0xc4, 0xd3, 0x93, 0xc1, 0x3b, 0xc0, 0x77, 0x8c, 0x6e, 0x7c, 0x2e, 0xd4, + 0x8d, 0xf3, 0x9c, 0x6e, 0x94, 0x0f, 0x47, 0x3e, 0x9d, 0x9a, 0xfc, 0xe6, 0x23, 0xa1, 0x03, 0x88, + 0xd5, 0x26, 0x2b, 0x7e, 0x54, 0x18, 0xd8, 0xdd, 0xbf, 0x5a, 0x06, 0xc5, 0x0a, 0xec, 0x42, 0x5f, + 0x70, 0x06, 0xff, 0xf7, 0x92, 0xe8, 0x76, 0x1a, 0x81, 0x81, 0xd0, 0x8e, 0x5f, 0x4b, 0xf1, 0xad, + 0x5d, 0xe8, 0xf9, 0xe6, 0x6e, 0x0f, 0x8b, 0x5a, 0x36, 0xa2, 0x04, 0xed, 0x87, 0x24, 0x91, 0xcd, + 0xb6, 0x84, 0x62, 0xfe, 0x73, 0xac, 0x0a, 0x7f, 0x5e, 0x02, 0xd3, 0x4d, 0xe8, 0x37, 0xdc, 0x0e, + 0x74, 0xb5, 0x66, 0x84, 0xd1, 0xf5, 0x60, 0x16, 0x83, 0x82, 0xa6, 0x99, 0x21, 0x4e, 0x6c, 0x92, + 0x7a, 0x13, 0x58, 0x08, 0x1f, 0xf1, 0xe7, 0xb4, 0x1b, 0xef, 0x4b, 0xd5, 0xbe, 0x96, 0x13, 0xf5, + 0x01, 0xa0, 0x8b, 0xbe, 0x94, 0x9b, 0x98, 0x56, 0x2a, 0xb6, 0x9f, 0x9f, 0x48, 0x2a, 0xfb, 0x6d, + 0xd2, 0x77, 0x4a, 0x00, 0x6c, 0xd8, 0x5e, 0x20, 0xd7, 0xc7, 0xa7, 0x90, 0xab, 0xf6, 0x4f, 0xb9, + 0x74, 0xb3, 0x98, 0xa8, 0x9c, 0x18, 0x89, 0xfd, 0x42, 0x8a, 0xb5, 0x85, 0x58, 0x62, 0x13, 0xd8, + 0x5a, 0x3e, 0x0e, 0x8a, 0xe7, 0xcd, 0x6e, 0x17, 0xfa, 0xda, 0xab, 0x64, 0x50, 0x2c, 0xbb, 0xd0, + 0xf4, 0xa1, 0x06, 0x23, 0xd1, 0x69, 0x60, 0xda, 0x75, 0x1c, 0x7f, 0xdd, 0xf4, 0x77, 0xa8, 0xdc, + 0xc2, 0x67, 0xf5, 0xa9, 0xe0, 0x51, 0x5b, 0x7b, 0xdd, 0xae, 0x0f, 0x1f, 0xf4, 0xd7, 0x5d, 0x6b, + 0xd7, 0x74, 0xf7, 0x6b, 0xa6, 0xbd, 0xbd, 0x67, 0x6e, 0x43, 0xca, 0x5e, 0xdc, 0x6b, 0xea, 0xa8, + 0xf2, 0x4b, 0x6c, 0xc7, 0x73, 0x2f, 0x2f, 0xf4, 0xef, 0xe4, 0xe4, 0x44, 0x58, 0x5c, 0x24, 0xec, + 0xc5, 0xf4, 0x3c, 0x1a, 0x98, 0xde, 0xb5, 0xe1, 0xae, 0x63, 0x5b, 0xed, 0xc0, 0x5a, 0x0d, 0x9e, + 0xb5, 0x8f, 0x86, 0x68, 0x2c, 0x71, 0x68, 0x2c, 0x0a, 0x97, 0x92, 0x0e, 0x8a, 0xe6, 0x08, 0xfd, + 0xce, 0x75, 0xe0, 0xd1, 0xa4, 0x1b, 0xd9, 0x6c, 0x35, 0x36, 0xcb, 0x86, 0x5e, 0x6a, 0xe9, 0x9b, + 0xb5, 0x46, 0xb9, 0x54, 0xdb, 0x34, 0xf4, 0xf5, 0x86, 0x02, 0xd1, 0xec, 0x7c, 0xca, 0x80, 0x6d, + 0xe7, 0x32, 0x74, 0xb5, 0xe7, 0xe6, 0xc4, 0x20, 0x4a, 0x10, 0x4a, 0x12, 0x7c, 0xb2, 0x08, 0x7c, + 0x3f, 0x21, 0xec, 0x67, 0x44, 0x05, 0x4b, 0x99, 0x8f, 0x69, 0x31, 0x1f, 0x13, 0xea, 0x63, 0x12, + 0x49, 0x3d, 0x02, 0x40, 0xfa, 0x47, 0x09, 0x4c, 0x95, 0x1d, 0xfb, 0x32, 0x74, 0x7d, 0x76, 0x92, + 0xc5, 0xe2, 0x90, 0xeb, 0xc3, 0xe1, 0x34, 0x98, 0x82, 0xb6, 0xef, 0x3a, 0xbd, 0x60, 0x96, 0x15, + 0x3c, 0x6a, 0x6f, 0x4c, 0x2b, 0x61, 0x5a, 0x72, 0xfc, 0xda, 0xec, 0xe0, 0x82, 0x38, 0xf6, 0xe4, + 0xbe, 0xb6, 0xf3, 0x70, 0x1a, 0x5c, 0x06, 0x33, 0x90, 0x7d, 0x3f, 0xf6, 0x15, 0x19, 0xcc, 0x93, + 0x76, 0xdb, 0x84, 0xd8, 0x2c, 0xd4, 0x1a, 0xec, 0x3a, 0x67, 0x9f, 0xf0, 0x57, 0x8f, 0x71, 0xe2, + 0x2f, 0x9a, 0xbd, 0x5e, 0xb8, 0x42, 0xbe, 0x7a, 0xcc, 0xa0, 0xcf, 0x44, 0xcd, 0x97, 0x8a, 0x20, + 0x6f, 0xee, 0xf9, 0x3b, 0xda, 0xb7, 0x84, 0x67, 0xbc, 0x5c, 0x3f, 0x42, 0xf9, 0x89, 0x81, 0xe4, + 0x24, 0x28, 0xf8, 0xce, 0x25, 0x18, 0xc8, 0x81, 0x3c, 0x20, 0x38, 0xcc, 0x5e, 0xaf, 0x85, 0x5f, + 0x50, 0x38, 0x82, 0x67, 0x64, 0x60, 0x99, 0xed, 0xb6, 0xb3, 0x67, 0xfb, 0xd5, 0x60, 0x95, 0x3c, + 0x4a, 0xd0, 0xbe, 0x20, 0xb4, 0x0d, 0x25, 0xc0, 0x60, 0x3a, 0xc8, 0x2e, 0x8e, 0xd0, 0x94, 0x16, + 0xc1, 0x2d, 0xa5, 0xf5, 0xf5, 0xcd, 0x56, 0xe3, 0x7e, 0xbd, 0x1e, 0x59, 0xbb, 0x9b, 0xd5, 0xfa, + 0x66, 0x6b, 0x55, 0xdf, 0x2c, 0x6f, 0x18, 0x78, 0x71, 0xb2, 0x54, 0x2e, 0x37, 0x36, 0xea, 0x2d, + 0x05, 0x6a, 0x6f, 0x95, 0xc0, 0x5c, 0xb9, 0xeb, 0x78, 0x21, 0xc2, 0xd7, 0x45, 0x08, 0x87, 0x62, + 0xcc, 0x31, 0x62, 0xd4, 0xfe, 0x35, 0x27, 0xea, 0x27, 0x13, 0x08, 0x84, 0x21, 0x1f, 0xd3, 0x4b, + 0xbd, 0x51, 0xc8, 0x4f, 0x66, 0x38, 0xbd, 0xec, 0x9b, 0xc4, 0x67, 0x96, 0xc1, 0x54, 0x89, 0x28, + 0x86, 0xf6, 0x27, 0x39, 0x50, 0x2c, 0x3b, 0xf6, 0x96, 0xb5, 0x8d, 0x2c, 0x48, 0x68, 0x9b, 0x17, + 0xbb, 0xb0, 0x62, 0xfa, 0xe6, 0x65, 0x0b, 0x5e, 0xc1, 0x15, 0x98, 0x36, 0xfa, 0x52, 0x11, 0x53, + 0x34, 0x05, 0x5e, 0xdc, 0xdb, 0xc6, 0x4c, 0x4d, 0x1b, 0x6c, 0x12, 0x1a, 0x3f, 0xc8, 0xe3, 0xba, + 0x0b, 0x5d, 0xd8, 0x85, 0xa6, 0x07, 0xd1, 0x5c, 0xcc, 0x86, 0x5d, 0xac, 0xb4, 0xd3, 0x46, 0xdc, + 0x6b, 0xf5, 0x2c, 0x98, 0x23, 0xaf, 0xb0, 0xfd, 0xe3, 0x61, 0x35, 0x9e, 0x36, 0xb8, 0x34, 0xf5, + 0x09, 0xa0, 0x00, 0x1f, 0xf4, 0x5d, 0xf3, 0x74, 0x07, 0xe3, 0xf5, 0xa8, 0x45, 0xe2, 0x28, 0xbb, + 0x18, 0x38, 0xca, 0x2e, 0x36, 0xb1, 0x1b, 0xad, 0x41, 0x72, 0x69, 0xff, 0x7b, 0x3a, 0xb4, 0x5e, + 0x3e, 0x2f, 0x47, 0x8a, 0xa1, 0x82, 0xbc, 0x6d, 0xee, 0x42, 0xaa, 0x17, 0xf8, 0xbf, 0x7a, 0x0b, + 0x38, 0x6e, 0x5e, 0x36, 0x7d, 0xd3, 0xad, 0x39, 0x6d, 0xb3, 0x8b, 0x87, 0xcd, 0xa0, 0xe5, 0xf7, + 0xbf, 0xc0, 0x9b, 0x56, 0xbe, 0xe3, 0x42, 0x9c, 0x2b, 0xd8, 0xb4, 0x0a, 0x12, 0x10, 0x75, 0xab, + 0xed, 0xd8, 0x98, 0x7f, 0xd9, 0xc0, 0xff, 0x91, 0x54, 0x3a, 0x96, 0x87, 0x2a, 0x82, 0xa9, 0xd4, + 0xc9, 0x7e, 0x4a, 0x73, 0xdf, 0x6e, 0xe3, 0x0d, 0xab, 0x69, 0x23, 0xee, 0xb5, 0xba, 0x04, 0x66, + 0xe9, 0xee, 0xcb, 0x1a, 0xd2, 0xab, 0x22, 0xd6, 0xab, 0xeb, 0x79, 0x37, 0x44, 0x82, 0xe7, 0x62, + 0x3d, 0xca, 0x67, 0xb0, 0x1f, 0xa9, 0xcf, 0x00, 0x8f, 0xa6, 0x8f, 0xe5, 0x3d, 0xcf, 0x77, 0x76, + 0x09, 0xe8, 0xcb, 0x56, 0x97, 0xd4, 0x60, 0x0a, 0xd7, 0x20, 0x29, 0x8b, 0x7a, 0x07, 0x38, 0xd9, + 0x73, 0xe1, 0x16, 0x74, 0x2f, 0x98, 0xbb, 0x7b, 0x0f, 0xb6, 0x5c, 0xd3, 0xf6, 0x7a, 0x8e, 0xeb, + 0x9f, 0x9e, 0xc6, 0xcc, 0x0f, 0x7c, 0xa7, 0xde, 0x0a, 0x4e, 0x3c, 0xe0, 0x39, 0x76, 0xa9, 0x67, + 0xd5, 0x2c, 0xcf, 0x87, 0x76, 0xa9, 0xd3, 0x71, 0x4f, 0xcf, 0xe0, 0xb2, 0x0e, 0xbe, 0x50, 0x6f, + 0x04, 0xf3, 0x0f, 0x38, 0x96, 0xdd, 0xf4, 0x5d, 0x68, 0xee, 0x6e, 0xb8, 0xdd, 0xd3, 0x80, 0x6c, + 0x10, 0x71, 0x89, 0xb4, 0xf3, 0x9d, 0x06, 0x45, 0x02, 0x89, 0xf6, 0x92, 0x82, 0xb0, 0x57, 0x33, + 0x15, 0x52, 0xa2, 0xb5, 0x78, 0x3b, 0x98, 0xa2, 0xbd, 0x26, 0x06, 0x7f, 0xf6, 0x8e, 0x53, 0x7d, + 0x0b, 0x24, 0x94, 0x8a, 0x11, 0x64, 0x53, 0x9f, 0x04, 0x8a, 0x6d, 0x2c, 0x2a, 0xac, 0x07, 0xb3, + 0x77, 0x3c, 0x7a, 0x70, 0xa1, 0x38, 0x8b, 0x41, 0xb3, 0x6a, 0x5f, 0x94, 0x85, 0x1c, 0xa1, 0x93, + 0x38, 0x4e, 0xd7, 0x53, 0x7c, 0x55, 0x1a, 0xa1, 0x2b, 0xbe, 0x15, 0xdc, 0x4c, 0xfb, 0x59, 0x6a, + 0xd3, 0x54, 0x36, 0x97, 0x36, 0x82, 0x59, 0x2d, 0xb2, 0x74, 0x9a, 0xad, 0x92, 0xd1, 0xda, 0xac, + 0x37, 0x2a, 0x68, 0x36, 0x7c, 0x0b, 0xb8, 0x69, 0x48, 0x6e, 0xbd, 0xb5, 0x59, 0x2f, 0xad, 0xe9, + 0xca, 0x16, 0x6f, 0x2f, 0x35, 0x5b, 0x8d, 0xf5, 0x4d, 0x63, 0xa3, 0x5e, 0xaf, 0xd6, 0x57, 0x08, + 0x31, 0x64, 0xa0, 0x9e, 0x8a, 0x32, 0x9c, 0x37, 0xaa, 0x2d, 0x7d, 0xb3, 0xdc, 0xa8, 0x2f, 0x57, + 0x57, 0x14, 0x6b, 0x98, 0xb1, 0xf5, 0x80, 0x7a, 0x3d, 0xb8, 0x96, 0xe3, 0xa4, 0xda, 0xa8, 0xa3, + 0x29, 0x7a, 0xb9, 0x54, 0x2f, 0xeb, 0x68, 0x3e, 0x7e, 0x49, 0xd5, 0xc0, 0xd5, 0x84, 0xdc, 0xe6, + 0x72, 0xb5, 0xc6, 0xee, 0xaa, 0x7d, 0x2a, 0xa7, 0x9e, 0x06, 0x57, 0xb1, 0xef, 0xa8, 0x4f, 0x84, + 0xf2, 0x1b, 0x39, 0xf5, 0x46, 0x70, 0x1d, 0xf7, 0x15, 0xd9, 0x20, 0xdb, 0xac, 0x56, 0x36, 0xd7, + 0xaa, 0xcd, 0xb5, 0x52, 0xab, 0xbc, 0xaa, 0x7c, 0x1a, 0x4f, 0x5f, 0x42, 0x7b, 0x9c, 0xf1, 0x4e, + 0x7e, 0x19, 0x6b, 0x27, 0x94, 0x78, 0x45, 0x7d, 0xfc, 0x40, 0xd8, 0x93, 0xed, 0xe2, 0x4f, 0x84, + 0x23, 0x4e, 0x85, 0x53, 0xa1, 0xdb, 0x53, 0xd0, 0x4a, 0xa7, 0x43, 0xad, 0x11, 0x54, 0xe8, 0x7a, + 0x70, 0x6d, 0x5d, 0x27, 0x48, 0x19, 0x7a, 0xb9, 0x71, 0x4e, 0x37, 0x36, 0xcf, 0x97, 0x6a, 0x35, + 0xbd, 0xb5, 0xb9, 0x5c, 0x35, 0x9a, 0x2d, 0x65, 0x4b, 0xfb, 0x27, 0x29, 0x5c, 0x96, 0x62, 0xa4, + 0xf5, 0x27, 0x52, 0xda, 0x66, 0x9d, 0xb8, 0xfc, 0xf4, 0x5d, 0xa0, 0xe8, 0xf9, 0xa6, 0xbf, 0xe7, + 0xd1, 0x56, 0xfd, 0x98, 0xc1, 0xad, 0x7a, 0xb1, 0x89, 0x33, 0x19, 0x34, 0xb3, 0xf6, 0xc5, 0x5c, + 0x9a, 0x66, 0x3a, 0x86, 0x95, 0x29, 0x6b, 0x04, 0x11, 0x9f, 0x01, 0x5a, 0xa0, 0xed, 0xd5, 0xe6, + 0x66, 0xa9, 0x66, 0xe8, 0xa5, 0xca, 0x85, 0x70, 0x3d, 0x0a, 0xaa, 0x57, 0x83, 0x13, 0x1b, 0xf5, + 0xd2, 0x52, 0x4d, 0xc7, 0xcd, 0xa5, 0x51, 0xaf, 0xeb, 0x65, 0x24, 0xf7, 0x1f, 0xc2, 0xbb, 0x3f, + 0xc8, 0x2a, 0xc7, 0x7c, 0x23, 0xcb, 0x89, 0x91, 0xff, 0x5f, 0x09, 0xbb, 0xb9, 0x45, 0x1a, 0xc6, + 0xd2, 0x1a, 0x2f, 0x0e, 0x5f, 0x10, 0xf2, 0x6c, 0x13, 0xe2, 0x24, 0x1d, 0x1e, 0xdf, 0x37, 0x02, + 0x1e, 0x57, 0x83, 0x13, 0x2c, 0x1e, 0xd8, 0xc3, 0x2d, 0x1e, 0x86, 0x3f, 0x96, 0xc1, 0xd4, 0x9a, + 0xb5, 0x8d, 0xdd, 0x8b, 0xf7, 0x22, 0x03, 0x65, 0x01, 0x48, 0xa1, 0xf7, 0x8e, 0x64, 0x75, 0xb8, + 0xc9, 0xbc, 0x24, 0xbe, 0xde, 0x22, 0x34, 0x61, 0xff, 0x62, 0xea, 0x9e, 0x89, 0x32, 0x1c, 0xd3, + 0x33, 0xbd, 0x50, 0x4a, 0xd3, 0x33, 0x0d, 0xa6, 0x95, 0x0a, 0x26, 0x64, 0x3a, 0xb8, 0xf0, 0xd9, + 0x7b, 0x96, 0x0b, 0x3b, 0xd8, 0x4c, 0xc4, 0xf5, 0x96, 0x0d, 0x3e, 0xf1, 0xac, 0x7b, 0x38, 0x30, + 0x59, 0x2f, 0x9b, 0x39, 0x30, 0x1d, 0x8e, 0x26, 0x78, 0xc3, 0x07, 0xbd, 0xd4, 0xeb, 0x8d, 0x8d, + 0x95, 0xd5, 0xcd, 0x65, 0x43, 0xd7, 0xe9, 0x12, 0xf1, 0xb6, 0xf6, 0x2e, 0x09, 0xcc, 0xd3, 0x1a, + 0x52, 0xef, 0x89, 0xeb, 0x62, 0x41, 0xa6, 0x70, 0xfc, 0x07, 0x3b, 0x3d, 0x59, 0xe1, 0xe1, 0x78, + 0x62, 0x92, 0x08, 0x13, 0xdd, 0x27, 0xde, 0x14, 0x36, 0xa1, 0xfb, 0x38, 0x50, 0x9e, 0x92, 0x9a, + 0x62, 0xf6, 0x53, 0x94, 0x97, 0x00, 0x50, 0x6c, 0xc2, 0x2e, 0x6c, 0xfb, 0xda, 0x87, 0xe4, 0x91, + 0xdb, 0x44, 0x9c, 0xb9, 0x2d, 0xa7, 0x32, 0xb7, 0xf3, 0x19, 0x98, 0xdb, 0x85, 0xd1, 0xcd, 0xed, + 0x62, 0x5a, 0x73, 0x7b, 0x2a, 0xce, 0xdc, 0x4e, 0xe8, 0x35, 0xa6, 0x13, 0x7b, 0x8d, 0x3e, 0x43, + 0xdd, 0xa8, 0x51, 0x93, 0x9e, 0x4f, 0xa4, 0xca, 0xfc, 0xf1, 0x62, 0xda, 0x71, 0x9c, 0x00, 0x7f, + 0xb4, 0xe6, 0xf9, 0x8f, 0x15, 0xd2, 0x8c, 0xfb, 0x03, 0x39, 0x4e, 0xd7, 0x4a, 0x5e, 0x99, 0xcf, + 0x60, 0xd1, 0x51, 0xbd, 0x01, 0x5c, 0x17, 0x3d, 0x6f, 0xea, 0xcf, 0xaa, 0x36, 0x5b, 0x4d, 0x6c, + 0x93, 0x97, 0x1b, 0x86, 0xb1, 0xb1, 0x4e, 0xb6, 0xab, 0x4e, 0x01, 0x35, 0xa2, 0x62, 0x6c, 0xd4, + 0x89, 0x05, 0xbe, 0xcd, 0x53, 0x5f, 0xae, 0xd6, 0x2b, 0x9b, 0xe1, 0xa8, 0x56, 0x5f, 0x6e, 0x28, + 0x3b, 0xea, 0x22, 0xb8, 0x85, 0xa1, 0x8e, 0x3b, 0x40, 0x52, 0x42, 0xa9, 0x5e, 0xd9, 0x5c, 0xab, + 0xeb, 0x6b, 0x8d, 0x7a, 0xb5, 0x8c, 0xd3, 0x9b, 0x7a, 0x4b, 0xb1, 0x90, 0x29, 0xd8, 0x67, 0xf3, + 0x37, 0xf5, 0x92, 0x51, 0x5e, 0xd5, 0x0d, 0x52, 0xe4, 0x03, 0xea, 0x4d, 0xe0, 0x6c, 0xa9, 0xde, + 0x68, 0xa1, 0x94, 0x52, 0xfd, 0x42, 0xeb, 0xc2, 0xba, 0xbe, 0xb9, 0x6e, 0x34, 0xca, 0x7a, 0xb3, + 0x89, 0x46, 0x52, 0x3a, 0x43, 0x50, 0xba, 0xea, 0xd3, 0xc1, 0x5d, 0x0c, 0x6b, 0x7a, 0x0b, 0xfb, + 0x46, 0xac, 0x35, 0xb0, 0x7b, 0x5c, 0x45, 0xdf, 0x5c, 0x2d, 0x35, 0x37, 0xab, 0xf5, 0x72, 0x63, + 0x6d, 0xbd, 0xd4, 0xaa, 0xa2, 0x01, 0x77, 0xdd, 0x68, 0xb4, 0x1a, 0x9b, 0xe7, 0x74, 0xa3, 0x59, + 0x6d, 0xd4, 0x15, 0x1b, 0x55, 0x99, 0x19, 0xa1, 0x03, 0x4b, 0xc9, 0x51, 0xaf, 0x05, 0xa7, 0x83, + 0xf4, 0x5a, 0x03, 0x09, 0x9a, 0x99, 0x33, 0xf4, 0x58, 0x3b, 0xab, 0xd9, 0x6a, 0x18, 0x64, 0xd6, + 0xb0, 0x56, 0x5d, 0x31, 0xd0, 0x54, 0x47, 0x79, 0x76, 0xa6, 0x73, 0x8a, 0x7f, 0x91, 0x40, 0xbe, + 0xe9, 0x3b, 0x3d, 0xed, 0x3b, 0xa3, 0xee, 0xf0, 0x0c, 0x00, 0x2e, 0x76, 0x85, 0xa8, 0x98, 0xbe, + 0x49, 0x57, 0x6b, 0x98, 0x14, 0xed, 0xd7, 0x85, 0xf7, 0x6f, 0x23, 0xab, 0xcb, 0xe9, 0xc5, 0x0c, + 0x1f, 0xdf, 0x14, 0x3b, 0x0e, 0x19, 0x4f, 0x28, 0x5d, 0x7b, 0xf8, 0x91, 0x51, 0x76, 0x68, 0x35, + 0x70, 0x8a, 0x81, 0x15, 0xc9, 0x3f, 0x50, 0x19, 0xa8, 0x3e, 0x0a, 0x5c, 0xd5, 0xa7, 0x7c, 0x58, + 0xe7, 0xb6, 0xd4, 0xef, 0x00, 0x8f, 0x61, 0xd4, 0x5f, 0x5f, 0x6b, 0x9c, 0xd3, 0x43, 0x45, 0xaf, + 0x94, 0x5a, 0x25, 0x65, 0x5b, 0xfb, 0xbc, 0x0c, 0xf2, 0x6b, 0xce, 0xe5, 0xfe, 0x6d, 0x73, 0x1b, + 0x5e, 0x61, 0xf6, 0x56, 0x82, 0x47, 0xfe, 0x08, 0x96, 0x90, 0xd8, 0xd7, 0xe2, 0x5d, 0x64, 0xbe, + 0x20, 0xa5, 0x11, 0xfb, 0xda, 0x61, 0xfd, 0x62, 0xfe, 0x66, 0x14, 0xb1, 0xc7, 0x88, 0x16, 0xaa, + 0x67, 0xc1, 0x99, 0xe8, 0x45, 0xb5, 0xa2, 0xd7, 0x5b, 0xd5, 0xe5, 0x0b, 0x91, 0x70, 0xab, 0x86, + 0x90, 0xf8, 0x87, 0x75, 0x73, 0xc9, 0x6b, 0x05, 0xa7, 0xc1, 0xc9, 0xe8, 0xdd, 0x8a, 0xde, 0x0a, + 0xde, 0x3c, 0xa0, 0x3d, 0x54, 0x00, 0x73, 0xa4, 0xdb, 0xdf, 0xe8, 0x75, 0x90, 0xf5, 0xfd, 0xa4, + 0x08, 0xdd, 0x9b, 0xc1, 0xf1, 0xea, 0xfa, 0x72, 0xb3, 0xe9, 0x3b, 0xae, 0xb9, 0x0d, 0xf1, 0x38, + 0x4a, 0xa4, 0xd5, 0x9f, 0xac, 0xbd, 0x57, 0x78, 0xf5, 0x9f, 0x1f, 0x6a, 0x48, 0x99, 0x31, 0xa8, + 0x7f, 0x45, 0x68, 0xb5, 0x5e, 0x80, 0x60, 0x3a, 0xf4, 0x1f, 0x18, 0x73, 0x9b, 0x8b, 0xc7, 0x65, + 0xeb, 0xec, 0xf3, 0x25, 0x30, 0xd3, 0xb2, 0x76, 0xe1, 0x73, 0x1c, 0x1b, 0x7a, 0xea, 0x14, 0x90, + 0x57, 0xd6, 0x5a, 0xca, 0x31, 0xf4, 0x07, 0x4d, 0x8b, 0x72, 0xf8, 0x8f, 0x8e, 0x0a, 0x40, 0x7f, + 0x4a, 0x2d, 0x45, 0x46, 0x7f, 0xd6, 0xf4, 0x96, 0x92, 0x47, 0x7f, 0xea, 0x7a, 0x4b, 0x29, 0xa0, + 0x3f, 0xeb, 0xb5, 0x96, 0x52, 0x44, 0x7f, 0xaa, 0xcd, 0x96, 0x32, 0x85, 0xfe, 0x2c, 0x35, 0x5b, + 0xca, 0x34, 0xfa, 0x73, 0xae, 0xd9, 0x52, 0x66, 0xd0, 0x9f, 0x72, 0xab, 0xa5, 0x00, 0xf4, 0xe7, + 0xbe, 0x66, 0x4b, 0x99, 0x45, 0x7f, 0x4a, 0xe5, 0x96, 0x32, 0x87, 0xff, 0xe8, 0x2d, 0x65, 0x1e, + 0xfd, 0x69, 0x36, 0x5b, 0xca, 0x02, 0xa6, 0xdc, 0x6c, 0x29, 0xc7, 0x71, 0x59, 0xd5, 0x96, 0xa2, + 0xa0, 0x3f, 0xab, 0xcd, 0x96, 0x72, 0x02, 0x67, 0x6e, 0xb6, 0x14, 0x15, 0x17, 0xda, 0x6c, 0x29, + 0x57, 0xe1, 0x3c, 0xcd, 0x96, 0x72, 0x12, 0x17, 0xd1, 0x6c, 0x29, 0x57, 0x63, 0x36, 0xf4, 0x96, + 0x72, 0x0a, 0xe7, 0x31, 0x5a, 0xca, 0xa3, 0xf0, 0xab, 0x7a, 0x4b, 0x39, 0x8d, 0x19, 0xd3, 0x5b, + 0xca, 0x35, 0xf8, 0x8f, 0xd1, 0x52, 0x34, 0xfc, 0xaa, 0xd4, 0x52, 0x1e, 0xad, 0x3d, 0x06, 0xcc, + 0xac, 0x40, 0x9f, 0x80, 0xa8, 0x29, 0x40, 0x5e, 0x81, 0x3e, 0x3b, 0x11, 0x7f, 0x55, 0x1e, 0x3c, + 0x8a, 0x2e, 0xde, 0x2c, 0xbb, 0xce, 0x6e, 0x0d, 0x6e, 0x9b, 0xed, 0x7d, 0xfd, 0x41, 0x64, 0xf0, + 0x69, 0x2f, 0xce, 0x71, 0x2b, 0xda, 0xbd, 0xa8, 0x37, 0xc2, 0xff, 0x13, 0x0d, 0xe4, 0x60, 0x8d, + 0x5a, 0xe6, 0xd7, 0xa8, 0xe3, 0x4c, 0xc2, 0xbc, 0xc8, 0x44, 0xf2, 0x1f, 0xd8, 0xc6, 0xc0, 0x6d, + 0x48, 0xe5, 0xfa, 0x36, 0xa4, 0x50, 0x0b, 0xeb, 0x41, 0xd7, 0x73, 0x6c, 0xb3, 0xdb, 0xa4, 0xee, + 0x47, 0x64, 0xae, 0xda, 0x9f, 0xac, 0x3e, 0x33, 0x68, 0x54, 0xc4, 0xe0, 0x7b, 0x5a, 0xd2, 0xf2, + 0x56, 0xbf, 0x84, 0x62, 0xda, 0xd7, 0xa7, 0xc3, 0xf6, 0xd5, 0xe2, 0xda, 0xd7, 0x33, 0x0e, 0x41, + 0x3b, 0x5d, 0x53, 0xab, 0x8e, 0x36, 0x15, 0x8d, 0x9c, 0xf3, 0x83, 0xfd, 0x2f, 0x59, 0xfb, 0xbc, + 0x04, 0x4e, 0xe9, 0xf6, 0xa0, 0xa9, 0x0c, 0xab, 0x46, 0x6f, 0x65, 0xa1, 0x59, 0xe7, 0x45, 0x7a, + 0xd7, 0xc0, 0x6a, 0x0f, 0xa6, 0x19, 0x23, 0xd1, 0xcf, 0x86, 0x12, 0x6d, 0x72, 0x12, 0xbd, 0x77, + 0x74, 0xd2, 0xe9, 0x04, 0x5a, 0x1f, 0x6b, 0xdf, 0x95, 0xd7, 0xfe, 0x42, 0x02, 0x27, 0x88, 0x07, + 0xe1, 0x7d, 0x64, 0xe6, 0x84, 0x7b, 0x7b, 0xde, 0xfa, 0xea, 0x46, 0xb3, 0x2c, 0xa2, 0xdf, 0x4c, + 0x8a, 0xf6, 0x3a, 0x56, 0xe0, 0xf7, 0xf3, 0x02, 0x8f, 0xe9, 0xc7, 0xfb, 0x8b, 0x8b, 0x91, 0xf5, + 0x6f, 0x84, 0xb2, 0xae, 0x73, 0xb2, 0xbe, 0x6b, 0x24, 0xaa, 0x47, 0x2b, 0xe6, 0xaf, 0xe6, 0xc1, + 0x63, 0x08, 0x87, 0x54, 0x11, 0x48, 0x3f, 0x58, 0xb2, 0x3b, 0x06, 0xf4, 0x7c, 0xd3, 0xf5, 0xb9, + 0xd0, 0x2b, 0x7d, 0x53, 0xf3, 0x5c, 0x06, 0x53, 0x73, 0x69, 0xe8, 0xd4, 0x5c, 0x7b, 0x0f, 0x6b, + 0xe0, 0x9d, 0xe7, 0x91, 0x2d, 0x25, 0x60, 0x10, 0x53, 0xc3, 0xb8, 0x16, 0x15, 0x5a, 0x7e, 0xdf, + 0xc3, 0xa1, 0xbc, 0x7c, 0xe8, 0x12, 0xd2, 0x21, 0xfe, 0xeb, 0xe3, 0xb5, 0xc4, 0xf3, 0xec, 0x3b, + 0xde, 0x6c, 0x54, 0x3a, 0x99, 0x4e, 0xa1, 0x5e, 0x3a, 0x0d, 0x66, 0x70, 0x97, 0x53, 0xb3, 0xec, + 0x4b, 0xda, 0x9f, 0xcb, 0x60, 0xae, 0x0e, 0xaf, 0x94, 0x77, 0xcc, 0x6e, 0x17, 0xda, 0xdb, 0x50, + 0x7b, 0x80, 0xb3, 0xed, 0xcd, 0x5e, 0xaf, 0x1e, 0xed, 0x0f, 0x07, 0x8f, 0xea, 0xbd, 0xa0, 0xe0, + 0xb5, 0x9d, 0x30, 0xa8, 0xc3, 0x77, 0xc6, 0xac, 0x5e, 0x97, 0xf6, 0xfc, 0x9d, 0x45, 0x5c, 0x56, + 0xa9, 0x67, 0x35, 0xd1, 0x07, 0x06, 0xf9, 0x8e, 0x8e, 0x93, 0x7f, 0x35, 0xb0, 0x33, 0xce, 0x25, + 0x74, 0xc6, 0x21, 0xe3, 0x8b, 0x2c, 0xd3, 0x31, 0x8b, 0x24, 0xd7, 0x83, 0xd9, 0x76, 0x90, 0x25, + 0x3c, 0xa5, 0xc7, 0x26, 0x69, 0x7f, 0x99, 0xaa, 0xbb, 0x16, 0x2a, 0x3c, 0x9d, 0x56, 0xc1, 0x31, + 0x9b, 0x9a, 0x57, 0x83, 0x13, 0xad, 0x46, 0x63, 0x73, 0xad, 0x54, 0xbf, 0x10, 0xc5, 0x56, 0xd9, + 0xd2, 0x5e, 0x99, 0x07, 0x0b, 0x4d, 0xa7, 0x7b, 0x19, 0x46, 0x38, 0x57, 0x39, 0xf7, 0x4f, 0x56, + 0x4e, 0xb9, 0x03, 0x72, 0x52, 0x4f, 0x81, 0xa2, 0x69, 0x7b, 0x57, 0x60, 0x60, 0xfe, 0xd3, 0x27, + 0x0a, 0xe3, 0x47, 0xd8, 0x8e, 0xc0, 0xe0, 0x61, 0xbc, 0x7b, 0x88, 0x24, 0x79, 0xae, 0x62, 0x80, + 0x3c, 0x0b, 0xe6, 0x3c, 0xe2, 0x25, 0xd2, 0x62, 0x9c, 0x81, 0xb8, 0x34, 0xcc, 0x22, 0x71, 0x53, + 0x92, 0x29, 0x8b, 0xf8, 0x49, 0x7b, 0x38, 0xec, 0x3f, 0x36, 0x38, 0x88, 0x4b, 0x87, 0x61, 0x2c, + 0x1d, 0xc8, 0xaf, 0x1e, 0xf7, 0x24, 0xfe, 0x34, 0x38, 0x19, 0x9c, 0x50, 0x2f, 0xaf, 0x96, 0x6a, + 0x35, 0xbd, 0xbe, 0xa2, 0x6f, 0x56, 0x2b, 0x64, 0x3f, 0x39, 0x4a, 0x29, 0xb5, 0x5a, 0xfa, 0xda, + 0x7a, 0xab, 0xb9, 0xa9, 0x3f, 0xab, 0xac, 0xeb, 0x15, 0xec, 0x80, 0x8d, 0x4f, 0x50, 0x06, 0xae, + 0xf2, 0xa5, 0x7a, 0xf3, 0xbc, 0x6e, 0x28, 0x3b, 0x67, 0x4b, 0x60, 0x96, 0x19, 0x28, 0x10, 0x77, + 0x15, 0xb8, 0x65, 0xee, 0x75, 0xa9, 0x39, 0xae, 0x1c, 0x43, 0xdc, 0x61, 0xd9, 0x34, 0xec, 0xee, + 0xbe, 0x92, 0x53, 0x15, 0x30, 0xc7, 0x8e, 0x09, 0x8a, 0xa4, 0xbd, 0xf3, 0x5a, 0x30, 0x73, 0xde, + 0x71, 0x2f, 0x61, 0xaf, 0x61, 0xed, 0x03, 0x24, 0x06, 0x5b, 0x10, 0x51, 0x82, 0x31, 0xc0, 0x5e, + 0x2d, 0xee, 0x26, 0x16, 0x50, 0x5b, 0x1c, 0x1a, 0x35, 0xe2, 0x7a, 0x30, 0x7b, 0x25, 0xc8, 0x1d, + 0xb5, 0x74, 0x26, 0x49, 0xfb, 0x45, 0x31, 0xc7, 0xaf, 0xe1, 0x45, 0x66, 0xbf, 0xea, 0xff, 0x76, + 0x09, 0x14, 0x57, 0xa0, 0x5f, 0xea, 0x76, 0x59, 0xb9, 0xbd, 0x5c, 0xf8, 0x1c, 0x29, 0x57, 0x89, + 0x52, 0xb7, 0x1b, 0xdf, 0xa8, 0x18, 0x01, 0x05, 0xe7, 0x9d, 0xb8, 0x34, 0x41, 0x2f, 0xed, 0x21, + 0x05, 0x66, 0x2f, 0xb1, 0x8f, 0x46, 0xae, 0xd9, 0xaf, 0x67, 0xcc, 0xa4, 0x27, 0x46, 0xf1, 0xf7, + 0x72, 0xc9, 0x4e, 0x52, 0x41, 0x3e, 0xf5, 0x7e, 0x30, 0xb5, 0xe7, 0xc1, 0xb2, 0xe9, 0x05, 0x43, + 0x1b, 0x5f, 0xd3, 0xc6, 0xc5, 0x07, 0x60, 0xdb, 0x5f, 0xac, 0xee, 0xa2, 0x89, 0xcf, 0x06, 0xc9, + 0x18, 0xc6, 0x2b, 0xa2, 0xcf, 0x46, 0x40, 0x01, 0x4d, 0x3b, 0xaf, 0x58, 0xfe, 0x4e, 0x79, 0xc7, + 0xf4, 0xe9, 0x66, 0x4b, 0xf8, 0xac, 0xbd, 0x64, 0x04, 0x38, 0x13, 0x1d, 0x76, 0x62, 0x8f, 0xa3, + 0xa7, 0x06, 0x71, 0x0c, 0x5e, 0x36, 0xa3, 0x80, 0xf8, 0xb7, 0x12, 0xc8, 0x37, 0x7a, 0xd0, 0x16, + 0x3e, 0x7b, 0x19, 0xca, 0x56, 0xea, 0x93, 0xed, 0xc3, 0xe2, 0x6e, 0xc1, 0x61, 0xa5, 0x51, 0xc9, + 0x31, 0x92, 0xbd, 0x0d, 0xe4, 0x2d, 0x7b, 0xcb, 0xa1, 0x96, 0xed, 0xa3, 0x63, 0x6c, 0x9d, 0xaa, + 0xbd, 0xe5, 0x18, 0x38, 0xa3, 0xa8, 0x47, 0x70, 0x52, 0xd9, 0xd9, 0x8b, 0xfb, 0xef, 0xa6, 0x41, + 0x91, 0xa8, 0xb3, 0xf6, 0x32, 0x19, 0xc8, 0xa5, 0x4e, 0x27, 0x46, 0xf0, 0xd2, 0x01, 0xc1, 0x3b, + 0xf8, 0xb3, 0x10, 0x93, 0xf0, 0x99, 0x0f, 0xbc, 0x26, 0xd8, 0xb7, 0xd3, 0x26, 0x55, 0xea, 0x74, + 0xe2, 0xcf, 0x2d, 0x84, 0x05, 0x4a, 0x7c, 0x81, 0x6c, 0x0b, 0x97, 0xc5, 0x5a, 0x78, 0xea, 0x81, + 0x20, 0x96, 0xbf, 0xec, 0x21, 0xfa, 0x07, 0x09, 0x4c, 0xd5, 0x2c, 0xcf, 0x47, 0xd8, 0x94, 0x44, + 0xb0, 0xb9, 0x16, 0xcc, 0x04, 0xa2, 0x41, 0x5d, 0x1e, 0xea, 0xcf, 0xa3, 0x04, 0x7e, 0x26, 0x7e, + 0x1f, 0x8f, 0xce, 0x93, 0x93, 0x6b, 0x4f, 0xb9, 0x88, 0x3f, 0xd3, 0x16, 0x15, 0x2b, 0xf5, 0x17, + 0xfb, 0x4b, 0xa1, 0xc0, 0xd7, 0x38, 0x81, 0xdf, 0x39, 0x4a, 0x91, 0xd9, 0x0b, 0xfd, 0xf7, 0x25, + 0x00, 0x50, 0xd9, 0xf4, 0xe0, 0xf0, 0xe3, 0xb8, 0x70, 0x20, 0x09, 0xd2, 0x7d, 0x25, 0x2b, 0xdd, + 0x35, 0x5e, 0xba, 0xdf, 0x3d, 0xbc, 0xaa, 0x49, 0x07, 0x84, 0x55, 0x05, 0xc8, 0x56, 0x28, 0x5a, + 0xf4, 0x57, 0x7b, 0x7b, 0x28, 0xd4, 0x75, 0x4e, 0xa8, 0x77, 0x8f, 0x58, 0x52, 0xf6, 0x72, 0xfd, + 0x23, 0x09, 0x4c, 0x35, 0xa1, 0x8f, 0xba, 0x49, 0xed, 0x9c, 0x48, 0x0f, 0xcf, 0xb4, 0x6d, 0x49, + 0xb0, 0x6d, 0x7f, 0x23, 0x27, 0x1a, 0x18, 0x2e, 0x92, 0x0c, 0xe5, 0x29, 0x66, 0xf5, 0xe1, 0xf5, + 0x42, 0x81, 0xe1, 0x86, 0x51, 0xcb, 0x5e, 0xba, 0x6f, 0x95, 0x42, 0x4f, 0x11, 0xfe, 0x5c, 0x1f, + 0x6b, 0x16, 0xe7, 0x0e, 0x9a, 0xc5, 0xe2, 0xe7, 0xfa, 0xd8, 0x3a, 0xc6, 0x3b, 0x26, 0xa4, 0x36, + 0x36, 0xc6, 0xe0, 0x33, 0x30, 0x8a, 0xbc, 0x9e, 0x27, 0x83, 0x22, 0xdd, 0x3c, 0xb8, 0x37, 0x79, + 0xef, 0x60, 0xf8, 0xd4, 0xe2, 0xfd, 0x23, 0x98, 0x72, 0x49, 0xcb, 0xf2, 0x21, 0x1b, 0x12, 0xc3, + 0xc6, 0xad, 0xa0, 0x80, 0xa3, 0x66, 0xd3, 0x71, 0x2e, 0x72, 0xf7, 0x08, 0x48, 0xe8, 0xe8, 0xad, + 0x41, 0x32, 0xa5, 0x46, 0x61, 0x0c, 0x2b, 0xf9, 0xa3, 0xa0, 0xf0, 0x75, 0x15, 0x80, 0xf5, 0xbd, + 0x8b, 0x5d, 0xcb, 0xdb, 0xb1, 0x6c, 0xec, 0x23, 0x36, 0x47, 0x1f, 0x49, 0xf0, 0xe7, 0x44, 0xf3, + 0x2f, 0xd6, 0x28, 0x50, 0x80, 0xbc, 0xe7, 0x5a, 0x74, 0x19, 0x00, 0xfd, 0x55, 0xef, 0x09, 0xbd, + 0x2d, 0xf3, 0x7d, 0x81, 0x5b, 0x90, 0x18, 0x22, 0x0e, 0x16, 0x99, 0xd2, 0x23, 0xaf, 0x4b, 0x36, + 0xc2, 0x77, 0x81, 0x8f, 0xf0, 0xcd, 0x9d, 0xe6, 0x2e, 0xf6, 0x9d, 0xe6, 0x46, 0x38, 0x7a, 0xd6, + 0x73, 0x20, 0x76, 0x3d, 0x92, 0x0d, 0xfc, 0x1f, 0x7d, 0x81, 0xdd, 0x83, 0xb0, 0x77, 0x1e, 0x39, + 0x33, 0x10, 0x25, 0xb0, 0x7d, 0xde, 0x8c, 0x60, 0x9f, 0xf7, 0xd9, 0x68, 0xee, 0xf3, 0xfd, 0x82, + 0x86, 0x73, 0x0a, 0xc9, 0xdd, 0x02, 0x14, 0xcb, 0x6e, 0x77, 0xf7, 0x3a, 0xe4, 0xd8, 0x09, 0xea, + 0xdb, 0xe8, 0x69, 0x94, 0x03, 0xe9, 0xda, 0xc7, 0x85, 0xc3, 0x72, 0x32, 0x12, 0x4f, 0x9c, 0xd3, + 0x50, 0x7e, 0xa4, 0x90, 0x1f, 0x66, 0x47, 0x38, 0xa9, 0x3f, 0x1e, 0x46, 0x3f, 0x9d, 0x66, 0xef, + 0x8e, 0xb0, 0x7a, 0xa3, 0x82, 0x85, 0xe0, 0x90, 0x7c, 0x63, 0xe9, 0x3e, 0xbd, 0xdc, 0x52, 0xe0, + 0xc1, 0x83, 0xf3, 0xf8, 0x88, 0x3c, 0x39, 0x0e, 0x1f, 0xad, 0xd0, 0x68, 0xff, 0x4b, 0x02, 0x45, + 0x6a, 0x7c, 0xdc, 0x7b, 0x48, 0x40, 0xb5, 0x57, 0x8d, 0x02, 0x49, 0x62, 0xac, 0x92, 0xcf, 0xa4, + 0x05, 0x60, 0x0c, 0xe6, 0xc6, 0x85, 0xcc, 0x00, 0xd0, 0xfe, 0x59, 0x02, 0x79, 0x64, 0x14, 0x89, + 0x45, 0x82, 0xf8, 0xb4, 0xb0, 0x83, 0x30, 0x23, 0x00, 0x44, 0x3e, 0x46, 0xbf, 0x97, 0xc0, 0x4c, + 0x8f, 0x64, 0x0c, 0xe3, 0x90, 0xdc, 0x28, 0xd0, 0x35, 0x41, 0x23, 0xfa, 0x4c, 0x7b, 0x9f, 0xd0, + 0xf1, 0x87, 0x64, 0x7e, 0xd2, 0xc1, 0xa1, 0x8f, 0x23, 0x68, 0xc4, 0x96, 0xf6, 0x6f, 0x12, 0x00, + 0x06, 0xf4, 0x9c, 0xee, 0x65, 0xb8, 0xe1, 0x5a, 0xda, 0xa3, 0x23, 0x00, 0x68, 0xb3, 0xcf, 0x45, + 0xcd, 0xfe, 0x73, 0x92, 0xa8, 0x2b, 0x30, 0xa7, 0x79, 0x01, 0xf1, 0x18, 0xf1, 0x3f, 0x1d, 0x4c, + 0x51, 0x39, 0x52, 0x0b, 0x53, 0x4c, 0xf8, 0xc1, 0x47, 0xda, 0x07, 0x85, 0x5c, 0x89, 0x45, 0x38, + 0x4a, 0x07, 0x40, 0x79, 0x04, 0x00, 0x8e, 0x83, 0xd9, 0x00, 0x80, 0x0d, 0xa3, 0xaa, 0x40, 0xed, + 0xdd, 0x32, 0xf6, 0xb7, 0x20, 0x43, 0xdd, 0xe1, 0x7b, 0x9a, 0xbf, 0x10, 0x9e, 0xfa, 0x33, 0xf2, + 0x08, 0xcb, 0xcf, 0x08, 0xa0, 0xdf, 0x16, 0x9a, 0xeb, 0x0b, 0x30, 0xf4, 0x48, 0xe9, 0xaf, 0xce, + 0xea, 0x60, 0x9e, 0xb3, 0x51, 0xd4, 0xd3, 0xe0, 0x24, 0x97, 0x40, 0xc6, 0xbb, 0x8e, 0x72, 0x4c, + 0xd5, 0xc0, 0x29, 0xee, 0x0d, 0x7d, 0x80, 0x1d, 0x25, 0xa7, 0x3d, 0xfc, 0x85, 0x5c, 0xb8, 0xfa, + 0xf3, 0xfe, 0x3c, 0x5d, 0x77, 0xfb, 0x24, 0x1f, 0xfa, 0xb2, 0xed, 0xd8, 0x3e, 0x7c, 0x90, 0x71, + 0x5a, 0x09, 0x13, 0x12, 0x6d, 0x88, 0xd3, 0x60, 0xca, 0x77, 0x59, 0x47, 0x96, 0xe0, 0x91, 0x55, + 0xac, 0x02, 0xaf, 0x58, 0x75, 0x70, 0x96, 0x5a, 0x13, 0x06, 0xec, 0x9a, 0x48, 0x86, 0x5e, 0xc9, + 0xab, 0xc0, 0x1e, 0xb4, 0x3b, 0xd0, 0xf6, 0x09, 0x9f, 0xc1, 0x29, 0x58, 0x81, 0x9c, 0xbc, 0x32, + 0xde, 0xc3, 0x2b, 0xe3, 0xe3, 0x06, 0x2d, 0xe8, 0x26, 0xac, 0xfe, 0xdd, 0x09, 0x00, 0xa9, 0xdb, + 0x39, 0x0b, 0x5e, 0xa1, 0x6a, 0x78, 0x4d, 0xdf, 0x1a, 0x60, 0x23, 0xcc, 0x60, 0x30, 0x99, 0xb5, + 0x2f, 0x87, 0xea, 0xf7, 0x0c, 0x4e, 0xfd, 0x6e, 0x15, 0x64, 0x21, 0x9d, 0xd6, 0xf5, 0x46, 0xd0, + 0xba, 0x79, 0x30, 0x13, 0xed, 0x2d, 0xcb, 0xea, 0x35, 0xe0, 0xea, 0xc0, 0xdf, 0xb8, 0xae, 0xeb, + 0x95, 0xe6, 0xe6, 0xc6, 0xfa, 0x8a, 0x51, 0xaa, 0xe8, 0x0a, 0x40, 0xfa, 0x49, 0xf4, 0x32, 0x74, + 0x13, 0xce, 0x6b, 0x7f, 0x20, 0x81, 0x02, 0x3e, 0xc2, 0xad, 0x7d, 0xef, 0x98, 0x34, 0xc7, 0xe3, + 0x5c, 0xa0, 0xc2, 0x71, 0x57, 0xfc, 0x42, 0x13, 0x2a, 0x4c, 0xcc, 0xd5, 0xa1, 0x2e, 0x34, 0x49, + 0x20, 0x94, 0xfd, 0xbc, 0x08, 0x35, 0xc9, 0xe6, 0x8e, 0x73, 0xe5, 0xbf, 0x72, 0x93, 0x44, 0xf5, + 0x3f, 0xe2, 0x26, 0x39, 0x80, 0x85, 0x89, 0x37, 0xc9, 0x01, 0xed, 0x2e, 0xa1, 0x99, 0x6a, 0x1f, + 0x29, 0x84, 0xb3, 0xc1, 0x4f, 0x48, 0x87, 0xda, 0x09, 0x2b, 0x81, 0x79, 0xcb, 0xf6, 0xa1, 0x6b, + 0x9b, 0xdd, 0xe5, 0xae, 0xb9, 0x1d, 0xd8, 0xa7, 0xfd, 0xdb, 0x1f, 0x55, 0x26, 0x8f, 0xc1, 0x7f, + 0xa1, 0x9e, 0x01, 0xc0, 0x87, 0xbb, 0xbd, 0xae, 0xe9, 0x47, 0xaa, 0xc7, 0xa4, 0xb0, 0xda, 0x97, + 0xe7, 0xb5, 0xef, 0x76, 0x70, 0x15, 0x01, 0xad, 0xb5, 0xdf, 0x83, 0x1b, 0xb6, 0xf5, 0xec, 0x3d, + 0x1c, 0x29, 0x99, 0xe8, 0xe8, 0xa0, 0x57, 0xdc, 0x7e, 0x50, 0x91, 0xdf, 0x0f, 0x52, 0xef, 0x06, + 0xd7, 0xe0, 0x20, 0xd8, 0xf8, 0xc6, 0x90, 0xf3, 0x56, 0x67, 0x1b, 0xfa, 0xd5, 0xad, 0x35, 0xcb, + 0xf3, 0x2c, 0x7b, 0x1b, 0x4f, 0xce, 0xa7, 0x8d, 0xf8, 0x0c, 0xda, 0xdf, 0x0a, 0x47, 0x61, 0x0a, + 0xfa, 0x8c, 0x21, 0x51, 0x98, 0xc2, 0x76, 0x2a, 0xf7, 0xb5, 0xd3, 0x70, 0x8d, 0x27, 0x2f, 0xb0, + 0xc6, 0xc3, 0x62, 0x5a, 0x10, 0x5c, 0x2b, 0x78, 0xad, 0x50, 0x98, 0xa7, 0xa4, 0x6a, 0x4c, 0x60, + 0x4d, 0x48, 0x06, 0x0b, 0xa4, 0xe8, 0x25, 0xc7, 0xb9, 0xb4, 0x6b, 0xba, 0x97, 0xb4, 0x9f, 0x38, + 0xdc, 0x9e, 0x6e, 0xe2, 0x5e, 0x56, 0xdc, 0x06, 0x6d, 0x9f, 0xf2, 0xe6, 0xfb, 0x95, 0x57, 0xfb, + 0xac, 0xf0, 0x94, 0x84, 0x93, 0x67, 0x50, 0xa9, 0xc9, 0x6c, 0x76, 0x89, 0x1d, 0x76, 0x14, 0x61, + 0x30, 0x7b, 0xe0, 0x7f, 0x33, 0x04, 0x3e, 0x18, 0x47, 0xd8, 0x7d, 0x82, 0x71, 0xe2, 0xae, 0x7d, + 0x65, 0x34, 0xec, 0x02, 0xbe, 0x46, 0xc0, 0x4e, 0x01, 0xf2, 0xa5, 0xd0, 0x35, 0x09, 0xfd, 0x65, + 0x2b, 0x94, 0xcf, 0x0e, 0xcd, 0x18, 0x96, 0x27, 0x82, 0xe6, 0x49, 0x9e, 0x85, 0x46, 0x2f, 0x53, + 0x4c, 0xbf, 0x24, 0xbc, 0xff, 0x36, 0x50, 0x40, 0x84, 0xbb, 0xc9, 0xb4, 0x4a, 0xb1, 0xcd, 0x3b, + 0x71, 0x36, 0xb3, 0x47, 0xf3, 0xc5, 0x05, 0x30, 0x13, 0x44, 0xc3, 0xc2, 0xf7, 0x0b, 0x86, 0x18, + 0x9e, 0x02, 0x45, 0xcf, 0xd9, 0x73, 0xdb, 0x90, 0xee, 0x88, 0xd2, 0xa7, 0x11, 0x76, 0xef, 0x86, + 0x9a, 0x0b, 0x07, 0x2c, 0x92, 0x7c, 0x6a, 0x8b, 0x24, 0xde, 0xde, 0x4d, 0xb0, 0x1f, 0xb4, 0x97, + 0x08, 0x5f, 0x02, 0xc2, 0x61, 0xd6, 0x84, 0xfe, 0x23, 0xd1, 0x08, 0xf8, 0x35, 0xa1, 0xbd, 0xa1, + 0x21, 0x35, 0x49, 0xa7, 0x72, 0x8d, 0x11, 0xec, 0xe0, 0x47, 0x83, 0x47, 0x05, 0x39, 0xa8, 0x01, + 0x8c, 0x0d, 0xde, 0x0d, 0xa3, 0xa6, 0xc8, 0xda, 0xf3, 0xf2, 0x40, 0x21, 0xac, 0x35, 0x42, 0x5b, + 0x50, 0x7b, 0x79, 0xee, 0xa8, 0x0d, 0xde, 0xf8, 0x19, 0xec, 0xef, 0x4a, 0xa2, 0xa1, 0xc3, 0x39, + 0xc1, 0x47, 0xb5, 0x8b, 0xd1, 0xa4, 0x11, 0x9a, 0x59, 0x82, 0xf2, 0x69, 0x6f, 0xc9, 0x89, 0x44, + 0x22, 0x17, 0x63, 0x31, 0xfb, 0x5e, 0xe9, 0x1b, 0xf9, 0x20, 0xa8, 0xe1, 0xb2, 0xeb, 0xec, 0x6e, + 0xb8, 0x5d, 0xed, 0xdf, 0x85, 0x2e, 0x7a, 0x88, 0x99, 0x5d, 0x48, 0xf1, 0xb3, 0x0b, 0xbc, 0x22, + 0xdd, 0x8d, 0x36, 0xc6, 0xba, 0x23, 0x0c, 0xdf, 0xea, 0x4d, 0x60, 0xc1, 0xec, 0x74, 0xd6, 0xcd, + 0x6d, 0x58, 0x46, 0xd3, 0x76, 0xdb, 0xa7, 0x01, 0xcf, 0xfa, 0x52, 0x13, 0xa7, 0x32, 0x7c, 0x1f, + 0x39, 0x75, 0xc0, 0x2a, 0x15, 0x5f, 0x86, 0xe5, 0x40, 0xa4, 0xf2, 0x9b, 0xc8, 0xf0, 0x87, 0x86, + 0x8c, 0xf6, 0x8e, 0x19, 0x85, 0x67, 0xa4, 0x4f, 0x82, 0x9e, 0x59, 0x02, 0x7c, 0x67, 0xaf, 0x79, + 0xbf, 0x22, 0x81, 0x29, 0x84, 0x47, 0xa9, 0xd3, 0xd1, 0x1e, 0xcb, 0x45, 0x31, 0x8d, 0xf5, 0x8d, + 0x7b, 0xa1, 0xb0, 0x53, 0x62, 0x50, 0x43, 0x42, 0x3f, 0x06, 0x93, 0x48, 0x88, 0x12, 0x27, 0x44, + 0x31, 0xdf, 0xc3, 0xc4, 0x22, 0xb2, 0x17, 0xdf, 0xa7, 0x25, 0x30, 0x1f, 0xcc, 0x33, 0x96, 0xa1, + 0xdf, 0xde, 0xd1, 0xee, 0x14, 0x5d, 0xe7, 0xa2, 0x2d, 0x31, 0xdc, 0x12, 0xee, 0x6a, 0xdf, 0xca, + 0xa5, 0x54, 0x79, 0xae, 0xe4, 0x98, 0x45, 0xc2, 0x54, 0xba, 0x98, 0x44, 0x30, 0x7b, 0x61, 0x7e, + 0x59, 0x02, 0xa0, 0xe5, 0x84, 0x93, 0xe5, 0x43, 0x48, 0xf2, 0x27, 0x85, 0x77, 0x8b, 0x69, 0xc5, + 0xa3, 0x62, 0xd3, 0xf7, 0x1c, 0x82, 0xae, 0x55, 0xc3, 0x4a, 0x9a, 0x48, 0x5b, 0x9f, 0xa9, 0xec, + 0xf5, 0xba, 0x56, 0xdb, 0xf4, 0xfb, 0xfd, 0x01, 0xe3, 0xc5, 0x8b, 0x2f, 0xe7, 0x4e, 0x65, 0x34, + 0x86, 0x65, 0xc4, 0xc8, 0x92, 0x44, 0xfd, 0x91, 0x82, 0xa8, 0x3f, 0x82, 0x3e, 0x3e, 0x43, 0x88, + 0x4f, 0x40, 0x3d, 0x65, 0x70, 0xbc, 0xd1, 0x83, 0xf6, 0x92, 0x0b, 0xcd, 0x4e, 0xdb, 0xdd, 0xdb, + 0xbd, 0xe8, 0xb1, 0xce, 0xac, 0xc9, 0x3a, 0xca, 0xac, 0x5c, 0x4b, 0xdc, 0xca, 0xb5, 0xf6, 0xc3, + 0xb2, 0x68, 0x5c, 0x36, 0x66, 0x7f, 0x85, 0xe1, 0x61, 0x84, 0xa1, 0x2e, 0x95, 0x0b, 0x56, 0xdf, + 0x22, 0x75, 0x3e, 0xcd, 0x22, 0xf5, 0x9b, 0x85, 0xa2, 0xbc, 0x09, 0xd5, 0x6b, 0x22, 0x9e, 0x74, + 0x0b, 0x4d, 0xe8, 0xc7, 0xc0, 0x7b, 0x23, 0x98, 0xbf, 0x18, 0xbd, 0x09, 0x21, 0xe6, 0x13, 0x07, + 0xf8, 0xb7, 0xbe, 0x35, 0xed, 0x0a, 0x0d, 0xcf, 0x42, 0x0c, 0xba, 0x21, 0x82, 0x92, 0x88, 0x13, + 0x5d, 0xaa, 0xe5, 0x96, 0xc4, 0xf2, 0xb3, 0x47, 0xe1, 0xe3, 0x12, 0x98, 0xc5, 0x57, 0x8e, 0x2f, + 0xed, 0xe3, 0x63, 0x9d, 0x82, 0x46, 0xc9, 0x8b, 0x59, 0x31, 0xab, 0x20, 0xdf, 0xb5, 0xec, 0x4b, + 0x81, 0xf7, 0x23, 0xfa, 0x1f, 0x5d, 0x58, 0x2a, 0x0d, 0xb8, 0xb0, 0x34, 0xdc, 0x26, 0x09, 0xcb, + 0x8d, 0x19, 0x4d, 0xdf, 0x90, 0x13, 0xb9, 0xb0, 0x74, 0x28, 0xb9, 0xec, 0xc5, 0xf8, 0xd7, 0x79, + 0x50, 0x6c, 0x42, 0xd3, 0x6d, 0xef, 0x68, 0xef, 0x97, 0x06, 0x4e, 0x25, 0xa6, 0xf9, 0xa9, 0xc4, + 0x32, 0x98, 0xda, 0xb2, 0xba, 0x3e, 0x74, 0x89, 0x47, 0x38, 0xdb, 0xb5, 0x93, 0x26, 0xbe, 0xd4, + 0x75, 0xda, 0x97, 0x16, 0xa9, 0x69, 0xbf, 0x18, 0x44, 0x8f, 0x5e, 0x5c, 0xc6, 0x1f, 0x19, 0xc1, + 0xc7, 0xc8, 0x20, 0xf4, 0x1c, 0xd7, 0x8f, 0xbb, 0x8d, 0x28, 0x86, 0x4a, 0xd3, 0x71, 0x7d, 0x83, + 0x7c, 0x88, 0x60, 0xde, 0xda, 0xeb, 0x76, 0x5b, 0xf0, 0x41, 0x3f, 0x98, 0xd6, 0x05, 0xcf, 0xc8, + 0x58, 0x74, 0xb6, 0xb6, 0x3c, 0x48, 0x16, 0x15, 0x0a, 0x06, 0x7d, 0x52, 0x4f, 0x82, 0x42, 0xd7, + 0xda, 0xb5, 0xc8, 0x44, 0xa4, 0x60, 0x90, 0x07, 0xf5, 0x16, 0xa0, 0x44, 0x73, 0x20, 0xc2, 0xe8, + 0xe9, 0x22, 0x6e, 0x9a, 0x07, 0xd2, 0x91, 0xce, 0x5c, 0x82, 0xfb, 0xde, 0xe9, 0x29, 0xfc, 0x1e, + 0xff, 0xe7, 0x8f, 0xdf, 0x88, 0x6c, 0x98, 0x10, 0x89, 0xc7, 0xcf, 0x70, 0x5d, 0xd8, 0x76, 0xdc, + 0x4e, 0x20, 0x9b, 0xf8, 0x09, 0x06, 0xcd, 0x97, 0x6e, 0x9b, 0x63, 0x60, 0xe1, 0xd9, 0x6b, 0xda, + 0x7b, 0x8a, 0xa8, 0xdb, 0x44, 0x45, 0x9f, 0xb7, 0xfc, 0x9d, 0x35, 0xe8, 0x9b, 0xda, 0x5f, 0xcb, + 0x03, 0x35, 0x6e, 0xf6, 0xff, 0xd3, 0xb8, 0x21, 0x1a, 0x47, 0x22, 0x80, 0xf9, 0x7b, 0xae, 0x8d, + 0xe4, 0x48, 0xbd, 0x6a, 0x99, 0x14, 0xf5, 0x6e, 0x70, 0x4d, 0xf4, 0x14, 0x2c, 0xa5, 0x56, 0x18, + 0x47, 0xdb, 0x69, 0x23, 0x3e, 0x83, 0xba, 0x0e, 0x6e, 0x20, 0x2f, 0x57, 0x5b, 0x6b, 0xb5, 0x55, + 0x6b, 0x7b, 0xa7, 0x6b, 0x6d, 0xef, 0xf8, 0x5e, 0xd5, 0xf6, 0x7c, 0x68, 0x76, 0x1a, 0x5b, 0x06, + 0xb9, 0x47, 0x0c, 0x60, 0x3a, 0x22, 0x59, 0x79, 0x8f, 0x71, 0xb1, 0xd1, 0x8d, 0xd5, 0x94, 0x98, + 0x96, 0xf2, 0x14, 0xd4, 0x52, 0xbc, 0xbd, 0x6e, 0x88, 0xe9, 0xb5, 0x7d, 0x98, 0x46, 0xaa, 0xbe, + 0xd7, 0xc5, 0xcd, 0x05, 0x67, 0x4e, 0x3b, 0xce, 0x25, 0x70, 0x92, 0x7d, 0xb3, 0xf9, 0xf7, 0x22, + 0x28, 0xac, 0xb8, 0x66, 0x6f, 0x47, 0x7b, 0x1e, 0xd3, 0x3f, 0x8f, 0xab, 0x4d, 0x84, 0xda, 0x29, + 0x0d, 0xd3, 0x4e, 0x79, 0x88, 0x76, 0xe6, 0x19, 0xed, 0x8c, 0x5f, 0x74, 0x3e, 0x0b, 0xe6, 0xda, + 0x4e, 0xb7, 0x0b, 0xdb, 0x48, 0x1e, 0xd5, 0x0e, 0x5e, 0xed, 0x99, 0x31, 0xb8, 0x34, 0x1c, 0x61, + 0x1f, 0xfa, 0x4d, 0xb2, 0xc6, 0x4e, 0x94, 0x3e, 0x4a, 0xd0, 0x5e, 0x2e, 0x81, 0xbc, 0xde, 0xd9, + 0x86, 0xdc, 0x3a, 0x7c, 0x8e, 0x59, 0x87, 0x3f, 0x05, 0x8a, 0xbe, 0xe9, 0x6e, 0x43, 0x3f, 0x58, + 0x27, 0x20, 0x4f, 0x61, 0xe0, 0x7f, 0x99, 0x09, 0xfc, 0xff, 0xdd, 0x20, 0x8f, 0x64, 0x46, 0x9d, + 0xe4, 0x6f, 0x18, 0x04, 0x3f, 0x96, 0xfd, 0x22, 0x2a, 0x71, 0x11, 0xd5, 0xda, 0xc0, 0x1f, 0xf4, + 0x63, 0x5d, 0x38, 0x18, 0x98, 0xf6, 0x5a, 0x30, 0x63, 0xb5, 0x1d, 0xbb, 0xba, 0x6b, 0x6e, 0x43, + 0x5a, 0xcd, 0x28, 0x21, 0x78, 0xab, 0xef, 0x3a, 0x0f, 0x58, 0x74, 0x51, 0x2b, 0x4a, 0x40, 0x55, + 0xd8, 0xb1, 0x3a, 0x1d, 0x68, 0xd3, 0x96, 0x4d, 0x9f, 0xce, 0x9e, 0x01, 0x79, 0xc4, 0x03, 0xd2, + 0x1f, 0x64, 0x2c, 0x28, 0xc7, 0xd4, 0x39, 0xd4, 0xac, 0x48, 0xe3, 0x55, 0x72, 0xfc, 0x9a, 0xab, + 0x88, 0xd7, 0x10, 0xa9, 0xdc, 0xe0, 0xc6, 0xf5, 0x04, 0x50, 0xb0, 0x9d, 0x0e, 0x1c, 0x3a, 0x08, + 0x91, 0x5c, 0xea, 0x93, 0x41, 0x01, 0x76, 0x50, 0xaf, 0x20, 0xe3, 0xec, 0x67, 0x92, 0x65, 0x69, + 0x90, 0xcc, 0xe9, 0x5c, 0x93, 0x06, 0x71, 0x9b, 0x7d, 0x03, 0xfc, 0xd1, 0x29, 0x70, 0x9c, 0xf4, + 0x01, 0xcd, 0xbd, 0x8b, 0x88, 0xd4, 0x45, 0xa8, 0xbd, 0x7e, 0xf0, 0xc0, 0x75, 0x9c, 0x57, 0xf6, + 0x93, 0xa0, 0xe0, 0xed, 0x5d, 0x0c, 0x8d, 0x50, 0xf2, 0xc0, 0x36, 0x5d, 0x69, 0x2c, 0xc3, 0x99, + 0x3c, 0xea, 0x70, 0xc6, 0x0d, 0x4d, 0x72, 0xd0, 0xf8, 0xa3, 0x81, 0x8c, 0x1c, 0xef, 0x08, 0x06, + 0xb2, 0x41, 0xc3, 0xd0, 0x69, 0x30, 0x65, 0x6e, 0xf9, 0xd0, 0x8d, 0xcc, 0x44, 0xfa, 0x88, 0x86, + 0xca, 0x8b, 0x70, 0xcb, 0x71, 0x91, 0x58, 0x48, 0x90, 0xd8, 0xf0, 0x99, 0x69, 0xb9, 0x80, 0xdb, + 0x41, 0xbb, 0x15, 0x9c, 0xb0, 0x9d, 0x0a, 0xec, 0x51, 0x39, 0x13, 0x14, 0xe7, 0xc9, 0x5d, 0xed, + 0x07, 0x5e, 0x1c, 0xe8, 0x4a, 0x16, 0x0e, 0x76, 0x25, 0xda, 0xe7, 0xd2, 0xce, 0x99, 0xfb, 0x80, + 0x1e, 0x9b, 0x85, 0xa6, 0x3e, 0x0d, 0xcc, 0x75, 0xa8, 0x87, 0x58, 0xdb, 0x0a, 0x5b, 0x49, 0xec, + 0x77, 0x5c, 0xe6, 0x48, 0x91, 0xf2, 0xac, 0x22, 0xad, 0x80, 0x69, 0x7c, 0x10, 0x1b, 0x69, 0x52, + 0xa1, 0xcf, 0x23, 0x1f, 0x4f, 0xeb, 0xc2, 0x4a, 0x31, 0x62, 0x5b, 0x2c, 0xd3, 0x4f, 0x8c, 0xf0, + 0xe3, 0x74, 0xb3, 0xef, 0x64, 0x09, 0x65, 0xdf, 0x1c, 0x7f, 0xa9, 0x08, 0xae, 0x29, 0xbb, 0x8e, + 0xe7, 0xe1, 0x63, 0x38, 0xfd, 0x0d, 0xf3, 0x8d, 0x12, 0x77, 0x05, 0xd0, 0x23, 0xba, 0xf9, 0x0d, + 0x6a, 0x50, 0x93, 0x6b, 0x1a, 0x7f, 0x21, 0x1c, 0xc2, 0x26, 0xdc, 0x7f, 0x88, 0x11, 0xfa, 0x7f, + 0x8d, 0x46, 0xf2, 0x9e, 0x9c, 0x48, 0x54, 0x9d, 0x94, 0xb2, 0xca, 0xbe, 0xb9, 0x7c, 0x49, 0x02, + 0x8f, 0xee, 0xe7, 0x66, 0xc3, 0xf6, 0xc2, 0x06, 0x73, 0xdd, 0x90, 0xf6, 0xc2, 0x47, 0x61, 0x49, + 0xbc, 0xf1, 0x37, 0xa6, 0xee, 0x4c, 0x69, 0x31, 0x8b, 0x25, 0xd1, 0x81, 0x9e, 0xa4, 0x1b, 0x7f, + 0x53, 0x93, 0xcf, 0x5e, 0xb8, 0xbf, 0x9b, 0x07, 0xc7, 0x57, 0x5c, 0x67, 0xaf, 0xe7, 0x45, 0x3d, + 0xd0, 0x9f, 0x0c, 0xde, 0x90, 0x2d, 0x8a, 0x98, 0x06, 0xd7, 0x83, 0x59, 0x97, 0x5a, 0x73, 0xd1, + 0xf6, 0x2c, 0x9b, 0xc4, 0xf6, 0x5e, 0xf2, 0x61, 0x7a, 0xaf, 0xa8, 0x9f, 0xc9, 0x73, 0xfd, 0x4c, + 0x7f, 0xcf, 0x51, 0x18, 0xd0, 0x73, 0xfc, 0xb1, 0x94, 0x72, 0x50, 0xed, 0x13, 0x51, 0x4c, 0x7f, + 0x51, 0x06, 0xc5, 0x6d, 0x9c, 0x91, 0x76, 0x17, 0x8f, 0x17, 0xab, 0x19, 0x26, 0x6e, 0xd0, 0x4f, + 0x23, 0xb9, 0xca, 0xac, 0x0e, 0xa7, 0x1a, 0xe0, 0x92, 0xb9, 0xcd, 0x5e, 0xa9, 0x1e, 0xce, 0x83, + 0xb9, 0xb0, 0xf4, 0x6a, 0xc7, 0xe3, 0x62, 0xbd, 0x32, 0x1a, 0x35, 0x2f, 0xa2, 0x51, 0x07, 0xd6, + 0x99, 0xc3, 0x51, 0x47, 0x66, 0x46, 0x9d, 0x81, 0xa3, 0xcb, 0x5c, 0xcc, 0xe8, 0xa2, 0x3d, 0x57, + 0x16, 0xbd, 0x44, 0x8f, 0xef, 0x5a, 0x71, 0x6d, 0x1e, 0xc9, 0x83, 0x85, 0xe0, 0x55, 0x7e, 0xc3, + 0x6b, 0x95, 0xbd, 0x92, 0x7c, 0x58, 0x02, 0x27, 0x0e, 0x76, 0xe6, 0xdf, 0xc1, 0x7b, 0xa9, 0xa1, + 0x3a, 0x79, 0xa1, 0x97, 0x1a, 0x7e, 0xe2, 0x37, 0xe9, 0x12, 0x43, 0xa2, 0x70, 0xf6, 0xde, 0xf0, + 0x4e, 0x5c, 0x2c, 0xe8, 0x89, 0x20, 0xd1, 0xec, 0x05, 0xf8, 0x53, 0x32, 0x98, 0x69, 0x42, 0xbf, + 0x66, 0xee, 0x3b, 0x7b, 0xbe, 0x66, 0x8a, 0x6e, 0xcf, 0x3d, 0x15, 0x14, 0xbb, 0xf8, 0x13, 0xdc, + 0xc1, 0xb0, 0x21, 0x48, 0xd9, 0xfd, 0x2d, 0xec, 0x1b, 0x44, 0x48, 0x1b, 0x34, 0x3f, 0x1f, 0x8b, + 0x46, 0x64, 0x77, 0x34, 0xe4, 0x6e, 0x2c, 0x5b, 0x3b, 0xa9, 0xf6, 0x4e, 0xe3, 0x8a, 0xce, 0x1e, + 0x96, 0x1f, 0x96, 0xc1, 0x7c, 0x13, 0xfa, 0x55, 0x6f, 0xd9, 0xbc, 0xec, 0xb8, 0x96, 0x0f, 0xb5, + 0x15, 0x51, 0x68, 0xce, 0x00, 0x60, 0x85, 0x9f, 0xd1, 0x08, 0x59, 0x4c, 0x8a, 0xf6, 0x96, 0xb4, + 0x8e, 0x42, 0x1c, 0x1f, 0x63, 0x01, 0x21, 0x95, 0x8f, 0x45, 0x52, 0xf1, 0x13, 0xb8, 0x06, 0x5c, + 0xa2, 0x40, 0x94, 0xdc, 0xf6, 0x8e, 0x75, 0x19, 0x76, 0x52, 0x02, 0x11, 0x7c, 0x16, 0x01, 0x11, + 0x12, 0x4a, 0xed, 0xbe, 0xc2, 0xf1, 0x31, 0x0e, 0xf7, 0x95, 0x24, 0x82, 0x13, 0x09, 0x72, 0x85, + 0xba, 0x1e, 0xba, 0x9e, 0x79, 0xaf, 0xa8, 0x58, 0x23, 0x93, 0x4d, 0x62, 0x4d, 0xb6, 0x91, 0x3a, + 0x16, 0x52, 0xf6, 0x30, 0x9d, 0xce, 0x67, 0xd1, 0xb1, 0x0c, 0x2c, 0x3a, 0x7b, 0xa1, 0xbf, 0x4f, + 0x06, 0x57, 0x87, 0xd1, 0x5f, 0x9a, 0xd0, 0xaf, 0x98, 0xde, 0xce, 0x45, 0xc7, 0x74, 0x3b, 0x5a, + 0x79, 0x0c, 0x07, 0x0e, 0xb5, 0x3f, 0x64, 0x41, 0xa8, 0xf3, 0x20, 0x0c, 0x74, 0x25, 0x1d, 0xc8, + 0xcb, 0x38, 0x3a, 0x99, 0x44, 0x6f, 0xd7, 0x77, 0x84, 0x60, 0x3d, 0x93, 0x03, 0xeb, 0x9e, 0x51, + 0x59, 0xcc, 0x1e, 0xb8, 0x9f, 0x25, 0x23, 0x02, 0xe3, 0xf5, 0x7c, 0x41, 0x14, 0xb0, 0x18, 0xaf, + 0x57, 0x39, 0xd6, 0xeb, 0x75, 0xa4, 0x31, 0x62, 0xa8, 0xc7, 0x72, 0xb6, 0x63, 0xc4, 0x11, 0x7a, + 0x23, 0xbf, 0x4b, 0x06, 0x0a, 0x0e, 0xff, 0xc5, 0x78, 0x84, 0xb3, 0xd1, 0xb4, 0x93, 0xd1, 0x39, + 0xe0, 0x7d, 0x3e, 0x95, 0xd6, 0xfb, 0x5c, 0x7b, 0x67, 0x5a, 0x1f, 0xf3, 0x7e, 0x6e, 0xc7, 0x82, + 0x58, 0x2a, 0x17, 0xf2, 0x21, 0x1c, 0x64, 0x0f, 0xda, 0x8f, 0xc9, 0x00, 0xa0, 0x06, 0x4d, 0xcf, + 0x46, 0x3c, 0x4b, 0x14, 0xae, 0xdb, 0x58, 0xbf, 0x7b, 0x04, 0xd4, 0xd5, 0x7d, 0x40, 0x11, 0x8a, + 0xd1, 0xa9, 0x8b, 0xd7, 0xa7, 0xf5, 0xad, 0x8c, 0xb8, 0x1a, 0x0b, 0x2c, 0xa9, 0xbc, 0x2d, 0x63, + 0xcb, 0xce, 0x1e, 0x90, 0xff, 0x29, 0x81, 0x42, 0xcb, 0x69, 0x42, 0xff, 0xf0, 0xa6, 0x40, 0xea, + 0xa8, 0x01, 0xb8, 0xdc, 0x71, 0x44, 0x0d, 0x18, 0x44, 0x28, 0x7b, 0xd1, 0xbd, 0x57, 0x02, 0x73, + 0x2d, 0xa7, 0x1c, 0x2e, 0x4e, 0x89, 0xfb, 0xaa, 0xfe, 0x6b, 0x2e, 0xe5, 0x1a, 0x06, 0x5b, 0x4c, + 0x8c, 0xc0, 0x52, 0xad, 0x1e, 0x24, 0xd0, 0xcb, 0x5e, 0x6e, 0x77, 0x82, 0xe3, 0x1b, 0x76, 0xc7, + 0x31, 0x60, 0xc7, 0xa1, 0x2b, 0xdd, 0xaa, 0x0a, 0xf2, 0x7b, 0x76, 0xc7, 0xc1, 0x2c, 0x17, 0x0c, + 0xfc, 0x1f, 0xa5, 0xb9, 0xb0, 0xe3, 0x50, 0xdf, 0x00, 0xfc, 0x5f, 0xfb, 0x0b, 0x19, 0xe4, 0xd1, + 0xb7, 0xe2, 0xa2, 0x7e, 0x97, 0x9c, 0x32, 0x0e, 0x02, 0x22, 0x3f, 0x16, 0x4b, 0xe8, 0x5e, 0x66, + 0xed, 0x9f, 0x78, 0xb0, 0xde, 0x10, 0x57, 0x1e, 0x23, 0x8a, 0x68, 0xcd, 0x5f, 0x3d, 0x0d, 0xa6, + 0x2e, 0x76, 0x9d, 0xf6, 0xa5, 0xe8, 0xb8, 0x3e, 0x7d, 0x54, 0x6f, 0x01, 0x05, 0xd7, 0xb4, 0xb7, + 0x21, 0xdd, 0x53, 0x38, 0xd9, 0xd7, 0x17, 0x62, 0xaf, 0x17, 0x83, 0x64, 0xd1, 0xde, 0x99, 0x26, + 0x02, 0xc3, 0x80, 0xca, 0xa7, 0xd3, 0x87, 0xca, 0x08, 0x27, 0xcf, 0x14, 0x30, 0x57, 0x2e, 0xd5, + 0xc9, 0xad, 0x86, 0x8d, 0x73, 0xba, 0x22, 0x63, 0x98, 0x91, 0x4c, 0x32, 0x84, 0x19, 0x91, 0xff, + 0x2f, 0x0b, 0xf3, 0x80, 0xca, 0x1f, 0x05, 0xcc, 0x9f, 0x96, 0xc0, 0x7c, 0xcd, 0xf2, 0xfc, 0x38, + 0x6f, 0xff, 0x84, 0xe8, 0xbf, 0x2f, 0x49, 0x6b, 0x2a, 0x73, 0xe5, 0x08, 0x87, 0xfd, 0x4d, 0x65, + 0x0e, 0x27, 0x15, 0x31, 0x99, 0x63, 0x29, 0x98, 0x03, 0x72, 0xa5, 0xbd, 0xb0, 0x24, 0x53, 0x1b, + 0x4a, 0x51, 0x21, 0x93, 0x37, 0x94, 0x62, 0xcb, 0xce, 0x5e, 0xbe, 0x7f, 0x21, 0x81, 0x13, 0xa8, + 0xf8, 0xa4, 0x65, 0xa9, 0x78, 0x31, 0x0f, 0x5d, 0x96, 0x4a, 0xbd, 0x32, 0x7e, 0x80, 0x97, 0x71, + 0xac, 0x8c, 0x0f, 0x23, 0x3a, 0x61, 0x31, 0xc7, 0x2c, 0xc3, 0x0e, 0x13, 0x73, 0xc2, 0x32, 0xec, + 0xe8, 0x62, 0x4e, 0x5e, 0x8a, 0x1d, 0x51, 0xcc, 0x47, 0xb6, 0xc0, 0xfa, 0x0b, 0x72, 0x28, 0xe6, + 0xd8, 0xb5, 0x8d, 0x04, 0x31, 0xa7, 0x3e, 0xd1, 0xab, 0xbd, 0x7b, 0x44, 0xc1, 0x8f, 0x79, 0x7d, + 0x63, 0x14, 0x98, 0x8e, 0x70, 0x8d, 0xe3, 0xe7, 0x64, 0xb0, 0x40, 0xb9, 0x18, 0x3c, 0x65, 0x4e, + 0xc0, 0x28, 0xf5, 0x94, 0x39, 0xf5, 0x19, 0x20, 0x9e, 0xb3, 0xc9, 0x9f, 0x01, 0x4a, 0x2c, 0x3f, + 0x7b, 0x70, 0xfe, 0x2a, 0x0f, 0x4e, 0x21, 0x16, 0xd6, 0x9c, 0x8e, 0xb5, 0xb5, 0x4f, 0xb8, 0x38, + 0x67, 0x76, 0xf7, 0xa0, 0xa7, 0x7d, 0x40, 0x12, 0x45, 0xe9, 0xbf, 0x03, 0xe0, 0xf4, 0xa0, 0x4b, + 0xe2, 0xb8, 0x51, 0xa0, 0xee, 0x8e, 0xab, 0xec, 0xc1, 0x92, 0xc2, 0xcb, 0x70, 0x1a, 0x01, 0x11, + 0x83, 0xa1, 0x87, 0xac, 0xc2, 0x99, 0xf0, 0x4d, 0xbf, 0x83, 0x47, 0xee, 0xa0, 0x83, 0xc7, 0xcd, + 0x40, 0x36, 0x3b, 0x9d, 0x10, 0xaa, 0xfe, 0xcd, 0x6c, 0x5c, 0xa6, 0x81, 0xb2, 0xa0, 0x9c, 0x1e, + 0x8c, 0x8e, 0xe6, 0xc5, 0xe4, 0xf4, 0xa0, 0xaf, 0x2e, 0x82, 0x22, 0xb9, 0x1c, 0x3c, 0x5c, 0xd1, + 0x1f, 0x9c, 0x99, 0xe6, 0xe2, 0x4d, 0xbb, 0x06, 0xaf, 0x86, 0x77, 0xa6, 0x92, 0xcc, 0xa0, 0x7e, + 0x3a, 0xb2, 0x93, 0x0d, 0x4e, 0xc1, 0x9e, 0x3e, 0x32, 0xe5, 0xc9, 0xec, 0x86, 0x95, 0x7a, 0xbd, + 0xee, 0x7e, 0x8b, 0x06, 0x1e, 0x48, 0xb5, 0x1b, 0xc6, 0xc4, 0x2f, 0x90, 0x0e, 0xc4, 0x2f, 0x48, + 0xbd, 0x1b, 0xc6, 0xf1, 0x31, 0x8e, 0xdd, 0xb0, 0x24, 0x82, 0x13, 0xb9, 0x95, 0x07, 0x5b, 0xcd, + 0xf4, 0x6e, 0x82, 0x7f, 0x1c, 0xec, 0x59, 0x0d, 0x78, 0x67, 0x97, 0x41, 0xd7, 0x16, 0x24, 0xde, + 0xc9, 0xa2, 0x3e, 0x19, 0x14, 0xb7, 0x1c, 0x77, 0xd7, 0x0c, 0x36, 0xee, 0xfb, 0x4f, 0x8a, 0xd0, + 0xfb, 0x00, 0x96, 0x71, 0x1e, 0x83, 0xe6, 0x45, 0xf3, 0x91, 0xe7, 0x58, 0x3d, 0x1a, 0xf4, 0x11, + 0xfd, 0x55, 0x6f, 0x04, 0xf3, 0x34, 0xf6, 0x63, 0x1d, 0x7a, 0x3e, 0xec, 0xd0, 0x88, 0x16, 0x7c, + 0xa2, 0x7a, 0x16, 0xcc, 0xd1, 0x84, 0x65, 0xab, 0x0b, 0x3d, 0x1a, 0xd4, 0x82, 0x4b, 0x53, 0x4f, + 0x81, 0xa2, 0xe5, 0xdd, 0xe7, 0x39, 0x36, 0x0d, 0xc8, 0x47, 0x9f, 0xd4, 0x9b, 0xc1, 0x71, 0x9a, + 0x2f, 0x34, 0x56, 0xc9, 0x81, 0x9d, 0xfe, 0x64, 0xa4, 0x5a, 0xb6, 0xb3, 0xee, 0x3a, 0xdb, 0x2e, + 0xf4, 0x3c, 0x7c, 0x6a, 0x6a, 0xda, 0x60, 0x52, 0xd4, 0x0b, 0xe0, 0x44, 0xd7, 0xb2, 0x2f, 0x79, + 0x38, 0x46, 0xf0, 0x32, 0x75, 0x1b, 0x9b, 0x1b, 0x10, 0xbb, 0x9b, 0x69, 0x6c, 0x54, 0x0e, 0xec, + 0x27, 0xc6, 0x41, 0x2a, 0x4c, 0x94, 0xfc, 0x25, 0xb3, 0x7d, 0x09, 0xbf, 0xa7, 0xee, 0xa8, 0x07, + 0xd2, 0x19, 0x61, 0x90, 0x3b, 0x00, 0x16, 0x38, 0x61, 0xe0, 0x34, 0xed, 0x65, 0x39, 0x30, 0xc7, + 0x15, 0x60, 0x02, 0x35, 0xe8, 0x16, 0xbd, 0xf3, 0x3b, 0x96, 0x0f, 0x11, 0x73, 0xf4, 0xac, 0xcb, + 0x13, 0x87, 0x30, 0x6f, 0x1c, 0xf8, 0xd0, 0x18, 0x40, 0x0c, 0xf1, 0x45, 0x3a, 0x3c, 0xec, 0x59, + 0xe6, 0x51, 0x5b, 0x95, 0x4b, 0xd3, 0x9e, 0x03, 0xd4, 0x83, 0xd4, 0x18, 0x2f, 0x90, 0x5c, 0x3a, + 0x2f, 0x10, 0x24, 0x37, 0xb3, 0xdb, 0x75, 0xae, 0xc0, 0x4e, 0x48, 0x96, 0xea, 0xea, 0x81, 0x74, + 0xed, 0xf3, 0xa3, 0xcc, 0x0b, 0x53, 0x5f, 0xb3, 0x81, 0x1a, 0xd9, 0x5e, 0xbb, 0x0d, 0x61, 0x87, + 0x1e, 0x5c, 0x0b, 0x1e, 0x53, 0x5e, 0xc0, 0x91, 0x7a, 0x16, 0x79, 0x44, 0x37, 0x70, 0x7c, 0xf4, + 0x6a, 0x50, 0x24, 0xb7, 0xd9, 0x69, 0x2f, 0x5b, 0x18, 0xd8, 0xd7, 0x2c, 0xf0, 0x7d, 0xcd, 0x06, + 0x98, 0xb3, 0x1d, 0x54, 0xdc, 0xba, 0xe9, 0x9a, 0xbb, 0x5e, 0xd2, 0x22, 0x31, 0xa1, 0x1b, 0x5a, + 0x04, 0x75, 0xe6, 0xb3, 0xd5, 0x63, 0x06, 0x47, 0x46, 0xfd, 0xff, 0x81, 0xe3, 0x17, 0x69, 0x80, + 0x07, 0x8f, 0x52, 0x96, 0xe2, 0x5d, 0x28, 0xfb, 0x28, 0x2f, 0xf1, 0x5f, 0xae, 0x1e, 0x33, 0xfa, + 0x89, 0xa9, 0xff, 0x0d, 0x2c, 0xa0, 0xc7, 0x8e, 0x73, 0x25, 0x60, 0x5c, 0x8e, 0xb7, 0x23, 0xfb, + 0xc8, 0xaf, 0x71, 0x1f, 0xae, 0x1e, 0x33, 0xfa, 0x48, 0xa9, 0x0d, 0x00, 0x76, 0xfc, 0xdd, 0x2e, + 0x25, 0x9c, 0x8f, 0x57, 0xc9, 0x3e, 0xc2, 0xab, 0xe1, 0x47, 0xab, 0xc7, 0x0c, 0x86, 0x84, 0x5a, + 0x03, 0x33, 0xfe, 0x83, 0x3e, 0xa5, 0x57, 0x88, 0xf7, 0x5d, 0xe8, 0xa3, 0xd7, 0x0a, 0xbe, 0x59, + 0x3d, 0x66, 0x44, 0x04, 0xd4, 0x2a, 0x98, 0xee, 0x5d, 0xa4, 0xc4, 0x8a, 0xf1, 0xfd, 0x5d, 0x1f, + 0xb1, 0xf5, 0x8b, 0x21, 0xad, 0xf0, 0x73, 0xc4, 0x58, 0xdb, 0xbb, 0x4c, 0x69, 0x4d, 0x09, 0x33, + 0x56, 0x0e, 0xbe, 0x41, 0x8c, 0x85, 0x04, 0xd4, 0x2a, 0x98, 0xf1, 0x6c, 0xb3, 0xe7, 0xed, 0x38, + 0xbe, 0x77, 0x7a, 0xba, 0xcf, 0xcd, 0x35, 0x9e, 0x5a, 0x93, 0x7e, 0x63, 0x44, 0x5f, 0xab, 0x4f, + 0x06, 0x57, 0xef, 0xf5, 0x3a, 0xa6, 0x0f, 0xf5, 0x07, 0x2d, 0xcf, 0xb7, 0xec, 0xed, 0x20, 0x42, + 0x31, 0x19, 0x2c, 0x06, 0xbf, 0x54, 0x17, 0xe9, 0x81, 0x37, 0x80, 0xdb, 0xa6, 0xd6, 0xbf, 0xd7, + 0x4a, 0x8a, 0x65, 0xce, 0xb9, 0x3d, 0x0d, 0xe4, 0xd1, 0x2b, 0x3c, 0xb8, 0x2c, 0x0c, 0x5e, 0xc7, + 0xed, 0xd7, 0x1d, 0xdc, 0x80, 0xd1, 0x47, 0x7d, 0xe3, 0xd3, 0xdc, 0x81, 0xf1, 0xe9, 0x7a, 0x30, + 0x6b, 0x79, 0x6b, 0xd6, 0x36, 0x31, 0x8e, 0xe9, 0xf8, 0xc1, 0x26, 0x91, 0xc5, 0x84, 0x3a, 0xbc, + 0x42, 0x06, 0x8e, 0xe3, 0xc1, 0x62, 0x42, 0x90, 0xa2, 0xdd, 0x04, 0xe6, 0xd8, 0x46, 0x46, 0xae, + 0xc4, 0xb5, 0x22, 0xd3, 0x9a, 0x3e, 0x69, 0x37, 0x82, 0x05, 0x5e, 0xa7, 0x19, 0x0b, 0x42, 0x0e, + 0xba, 0x42, 0xed, 0x06, 0x70, 0xbc, 0xaf, 0x61, 0x05, 0x21, 0x63, 0x72, 0x51, 0xc8, 0x98, 0xeb, + 0x01, 0x88, 0xb4, 0x78, 0x20, 0x99, 0xeb, 0xc0, 0x4c, 0xa8, 0x97, 0x03, 0x33, 0xfc, 0x69, 0x0e, + 0x4c, 0x07, 0xca, 0x36, 0x28, 0x03, 0x1a, 0x99, 0x6c, 0x66, 0x7f, 0x28, 0x18, 0x99, 0xd8, 0x34, + 0x64, 0x26, 0x44, 0x5e, 0xd9, 0x2d, 0xcb, 0xef, 0x06, 0x27, 0x1b, 0xfb, 0x93, 0xd5, 0x75, 0x00, + 0x2c, 0x8c, 0x51, 0x2b, 0x3a, 0xea, 0x78, 0x7b, 0x8a, 0xf6, 0x40, 0xf4, 0x81, 0xa1, 0x71, 0xf6, + 0x3b, 0xe8, 0x39, 0xc4, 0x19, 0x50, 0x20, 0x61, 0xfa, 0x8f, 0xa9, 0x0b, 0x00, 0xe8, 0xcf, 0x5a, + 0xd7, 0x8d, 0xaa, 0x5e, 0x2f, 0xeb, 0x4a, 0x4e, 0x7b, 0x85, 0x04, 0x66, 0xc2, 0x46, 0x30, 0xb0, + 0x92, 0x3a, 0x55, 0xad, 0xa1, 0xb7, 0x8e, 0x1e, 0x6c, 0x54, 0xac, 0x92, 0x3d, 0x15, 0x3c, 0x6a, + 0xcf, 0x83, 0xcb, 0x96, 0xeb, 0xf9, 0x86, 0x73, 0x65, 0xd9, 0x71, 0xa3, 0x81, 0x95, 0x04, 0xb8, + 0x8d, 0x7b, 0x8d, 0x0c, 0xc6, 0x0e, 0xc4, 0x67, 0xde, 0xa0, 0x4b, 0x17, 0xfe, 0xa3, 0x04, 0x44, + 0xd7, 0x77, 0x4d, 0xdb, 0xeb, 0x39, 0x1e, 0x34, 0x9c, 0x2b, 0x5e, 0xc9, 0xee, 0x94, 0x9d, 0xee, + 0xde, 0xae, 0xed, 0x51, 0x93, 0x2f, 0xee, 0x35, 0x92, 0x0e, 0xbe, 0x53, 0x78, 0x01, 0x80, 0x72, + 0xa3, 0x56, 0xd3, 0xcb, 0xad, 0x6a, 0xa3, 0xae, 0x1c, 0x43, 0xd2, 0x6a, 0x95, 0x96, 0x6a, 0x48, + 0x3a, 0xdf, 0x0b, 0xa6, 0x83, 0x36, 0x4d, 0xa3, 0xdc, 0xe4, 0x82, 0x28, 0x37, 0x6a, 0x09, 0x4c, + 0x07, 0xad, 0x9c, 0x8e, 0x08, 0x8f, 0xed, 0x3f, 0xd5, 0xbc, 0x6b, 0xba, 0x3e, 0x36, 0x50, 0x02, + 0x22, 0x4b, 0xa6, 0x07, 0x8d, 0xf0, 0xb3, 0xb3, 0x4f, 0xa0, 0x1c, 0xa8, 0x60, 0xa1, 0x54, 0xab, + 0x6d, 0x36, 0x8c, 0xcd, 0x7a, 0xa3, 0xb5, 0x5a, 0xad, 0xaf, 0x90, 0x11, 0xb2, 0xba, 0x52, 0x6f, + 0x18, 0x3a, 0x19, 0x20, 0x9b, 0x4a, 0x8e, 0xdc, 0x69, 0xbd, 0x34, 0x0d, 0x8a, 0x3d, 0x2c, 0x5d, + 0xed, 0x4b, 0x72, 0xca, 0x70, 0x06, 0x21, 0x4e, 0x31, 0xb7, 0xee, 0x72, 0x47, 0x0a, 0xa4, 0x01, + 0x47, 0x7e, 0xcf, 0x82, 0x39, 0x62, 0xaa, 0x7b, 0x78, 0x77, 0x06, 0x23, 0x27, 0x1b, 0x5c, 0x9a, + 0xf6, 0x71, 0x29, 0x45, 0x8c, 0x83, 0x81, 0x1c, 0xa5, 0x33, 0x2e, 0x7e, 0x2f, 0x37, 0xda, 0xa5, + 0x16, 0xd5, 0x7a, 0x4b, 0x37, 0xea, 0xa5, 0x1a, 0xcd, 0x22, 0xab, 0xa7, 0xc1, 0xc9, 0x7a, 0x83, + 0x86, 0x74, 0x6c, 0x6e, 0xb6, 0x1a, 0x9b, 0xd5, 0xb5, 0xf5, 0x86, 0xd1, 0x52, 0x0a, 0xea, 0x29, + 0xa0, 0x92, 0xff, 0x9b, 0xd5, 0xe6, 0x66, 0xb9, 0x54, 0x2f, 0xeb, 0x35, 0xbd, 0xa2, 0x14, 0xd5, + 0xc7, 0x81, 0x1b, 0xc8, 0x25, 0x49, 0x8d, 0xe5, 0x4d, 0xa3, 0x71, 0xbe, 0x89, 0x10, 0x34, 0xf4, + 0x5a, 0x09, 0x29, 0x12, 0x73, 0xb7, 0xf5, 0x94, 0x7a, 0x15, 0x38, 0x8e, 0x2f, 0xbe, 0xaf, 0x35, + 0x4a, 0x15, 0x5a, 0xde, 0xb4, 0x7a, 0x2d, 0x38, 0x5d, 0xad, 0x37, 0x37, 0x96, 0x97, 0xab, 0xe5, + 0xaa, 0x5e, 0x6f, 0x6d, 0xae, 0xeb, 0xc6, 0x5a, 0xb5, 0xd9, 0x44, 0xdf, 0x2a, 0x33, 0xf8, 0xe6, + 0x60, 0xd2, 0x67, 0x6a, 0xef, 0x97, 0xc1, 0xfc, 0x39, 0xb3, 0x6b, 0xa1, 0x81, 0x02, 0x5f, 0x29, + 0xde, 0x77, 0x1a, 0xc8, 0xc7, 0x57, 0x8f, 0xd3, 0xf3, 0x04, 0xf8, 0x41, 0xfb, 0x21, 0x39, 0xe5, + 0x69, 0x20, 0x0a, 0x04, 0x29, 0x71, 0x91, 0x2b, 0x2d, 0x66, 0xee, 0xfa, 0x5a, 0x29, 0xc5, 0x69, + 0x20, 0x71, 0xf2, 0xe9, 0xc0, 0xff, 0xf9, 0x71, 0x81, 0xaf, 0x80, 0xb9, 0x8d, 0x7a, 0x69, 0xa3, + 0xb5, 0xda, 0x30, 0xaa, 0xdf, 0x83, 0x63, 0xd9, 0xcf, 0x83, 0x99, 0xe5, 0x86, 0xb1, 0x54, 0xad, + 0x54, 0xf4, 0xba, 0x52, 0x50, 0x1f, 0x05, 0xae, 0x6a, 0xea, 0xc6, 0xb9, 0x6a, 0x59, 0xdf, 0xdc, + 0xa8, 0x97, 0xce, 0x95, 0xaa, 0x35, 0xdc, 0x47, 0x14, 0x13, 0xae, 0x43, 0x9f, 0xd2, 0x7e, 0x20, + 0x0f, 0x00, 0xa9, 0x3a, 0xbe, 0xca, 0x89, 0xb9, 0x34, 0xfb, 0x0f, 0xd2, 0x4e, 0x1a, 0x22, 0x32, + 0x31, 0xed, 0xb7, 0x0a, 0xa6, 0x5d, 0xfa, 0x82, 0xae, 0x8e, 0x0d, 0xa3, 0x43, 0xfe, 0x06, 0xd4, + 0x8c, 0xf0, 0x73, 0xed, 0x03, 0x69, 0xe6, 0x08, 0xb1, 0x8c, 0xa5, 0x43, 0x72, 0x79, 0x3c, 0x40, + 0x6a, 0x2f, 0xce, 0x81, 0x05, 0xbe, 0x62, 0xa8, 0x12, 0xd8, 0x98, 0x12, 0xab, 0x04, 0xff, 0x31, + 0x63, 0x64, 0x9d, 0x7d, 0x12, 0x1d, 0x4e, 0x41, 0xd0, 0x32, 0xc9, 0xc1, 0xfe, 0xc0, 0x62, 0x51, + 0x72, 0x88, 0x79, 0x64, 0x74, 0x28, 0x92, 0x3a, 0x05, 0xe4, 0xd6, 0x83, 0xbe, 0x22, 0x6b, 0x5f, + 0x93, 0xc1, 0x3c, 0x77, 0x2b, 0xb7, 0xf6, 0xce, 0x9c, 0xc8, 0x8d, 0xb9, 0xcc, 0x7d, 0xdf, 0xb9, + 0xc3, 0xde, 0xf7, 0x7d, 0xf6, 0x5e, 0x30, 0x45, 0xd3, 0xb0, 0x7c, 0x1b, 0x75, 0x64, 0x0a, 0x1c, + 0x07, 0xb3, 0x2b, 0x7a, 0x6b, 0xb3, 0xd9, 0x2a, 0x19, 0x2d, 0xbd, 0xa2, 0xe4, 0xd0, 0xc0, 0xa7, + 0xaf, 0xad, 0xb7, 0x2e, 0x28, 0x12, 0x1a, 0x13, 0x57, 0x36, 0xaa, 0x15, 0x7d, 0xb3, 0x51, 0xaf, + 0x5d, 0x50, 0xe4, 0xf4, 0x0e, 0x97, 0xfd, 0x8c, 0x4d, 0xd8, 0xe1, 0x32, 0xa9, 0xf8, 0xec, 0xe7, + 0xae, 0x9f, 0x93, 0x81, 0x42, 0x38, 0xd0, 0x1f, 0xec, 0x41, 0xd7, 0x82, 0x76, 0x1b, 0x6a, 0x97, + 0x44, 0x02, 0xc0, 0x1e, 0x08, 0x7d, 0x88, 0xfb, 0x77, 0xc6, 0x6a, 0x24, 0x0f, 0x7d, 0x06, 0x77, + 0xfe, 0x80, 0xc1, 0xfd, 0xd9, 0xb4, 0x1e, 0x97, 0xfd, 0xec, 0x8e, 0x05, 0xb2, 0x4f, 0xa5, 0xf1, + 0xb8, 0x1c, 0xc2, 0xc1, 0x44, 0xe2, 0x3a, 0xc7, 0x8c, 0xc7, 0x8a, 0xac, 0xbd, 0x48, 0x06, 0xc7, + 0x2b, 0xa6, 0x0f, 0x97, 0xf6, 0x5b, 0xc1, 0x2d, 0x9a, 0x31, 0x37, 0x5f, 0xe7, 0x0e, 0xdc, 0x7c, + 0x1d, 0x5d, 0xc4, 0x29, 0xf5, 0x5d, 0xc4, 0xa9, 0xbd, 0x27, 0xed, 0x19, 0xcd, 0x3e, 0x1e, 0xc6, + 0x16, 0x7c, 0x39, 0xdd, 0xd9, 0xcb, 0x64, 0x2e, 0xb2, 0x6f, 0x60, 0x6f, 0x9f, 0x01, 0x0a, 0x61, + 0x85, 0x71, 0x2a, 0xfc, 0x29, 0x7a, 0x59, 0xfc, 0x66, 0x8a, 0x18, 0x8e, 0x41, 0x54, 0x0c, 0x89, + 0x8f, 0x8a, 0xc1, 0xad, 0x51, 0xcb, 0xfd, 0x8e, 0x20, 0x69, 0x3b, 0x43, 0xc6, 0x83, 0x30, 0x3e, + 0x6c, 0x6e, 0x76, 0x9d, 0x61, 0x62, 0xf1, 0x93, 0xb9, 0xd0, 0x98, 0xde, 0x1a, 0xaa, 0x8b, 0x22, + 0x93, 0x7c, 0x6f, 0x7b, 0x5a, 0x77, 0x72, 0xce, 0x83, 0x33, 0xe1, 0x32, 0xf3, 0xec, 0xdc, 0xc9, + 0x87, 0x71, 0x90, 0x3d, 0x0a, 0xdf, 0x92, 0x40, 0xbe, 0xe9, 0xb8, 0xfe, 0xb8, 0x30, 0x48, 0xbb, + 0x05, 0xce, 0x48, 0xa0, 0x19, 0x3f, 0x07, 0xcd, 0x6e, 0x0b, 0x3c, 0xb9, 0xfc, 0x09, 0x84, 0xc1, + 0x3c, 0x0e, 0x16, 0x08, 0x27, 0xe1, 0x1d, 0x32, 0xff, 0x26, 0x91, 0xfe, 0xea, 0x7e, 0x51, 0x44, + 0xf0, 0x46, 0x48, 0xb8, 0x05, 0x1d, 0x80, 0xc2, 0xa5, 0x69, 0x6f, 0x64, 0x71, 0xa9, 0xf0, 0xb8, + 0x0c, 0x9a, 0x81, 0x87, 0xd7, 0xb0, 0x8c, 0xab, 0x67, 0x4a, 0x13, 0x51, 0x33, 0xa1, 0xf0, 0xec, + 0x11, 0x79, 0x48, 0x06, 0x45, 0xea, 0x02, 0x38, 0x56, 0x04, 0xd2, 0xb6, 0x8c, 0x50, 0x08, 0x62, + 0xae, 0x82, 0xf2, 0xb8, 0x5b, 0x46, 0x72, 0xf9, 0xd9, 0xe3, 0xf0, 0x1f, 0xd4, 0xb7, 0xb5, 0x74, + 0xd9, 0xb4, 0xba, 0xe6, 0xc5, 0x6e, 0x8a, 0x48, 0xd6, 0x1f, 0x4f, 0x79, 0x9a, 0x2f, 0xac, 0x2a, + 0x57, 0x5e, 0x8c, 0xc4, 0xbf, 0x0b, 0xcc, 0xb8, 0xdc, 0xde, 0x1f, 0xb2, 0xa2, 0xfa, 0xfc, 0x8a, + 0xe9, 0x7b, 0x23, 0xca, 0x99, 0xea, 0xe8, 0x9e, 0x10, 0x3f, 0x13, 0x39, 0x6a, 0x34, 0x5b, 0xea, + 0x74, 0x96, 0xa1, 0xe9, 0xef, 0xb9, 0xb0, 0x93, 0x6a, 0x88, 0x70, 0xfb, 0xb6, 0x47, 0x19, 0x49, + 0x70, 0xb1, 0x24, 0x6b, 0x3c, 0x3a, 0x4f, 0x19, 0xd2, 0x1b, 0x04, 0xbc, 0x8c, 0xa5, 0x4b, 0x7a, + 0x5b, 0x08, 0x49, 0x83, 0x83, 0xe4, 0x69, 0xa3, 0x31, 0x91, 0x3d, 0x20, 0x3f, 0x23, 0x83, 0x05, + 0x62, 0x27, 0x8c, 0x1b, 0x93, 0x0f, 0xa5, 0x74, 0x19, 0x62, 0x6e, 0xe9, 0x62, 0xd9, 0x19, 0x0b, + 0x2c, 0x69, 0x1c, 0x8c, 0xc4, 0xf8, 0xc8, 0x1e, 0x99, 0xe7, 0x9f, 0x00, 0x80, 0x71, 0x03, 0xfd, + 0x78, 0x31, 0x8a, 0xeb, 0xa8, 0xbd, 0x93, 0xce, 0x3f, 0x9a, 0x5c, 0x90, 0x71, 0xc6, 0xc5, 0x33, + 0xdc, 0xa0, 0xe2, 0x13, 0x85, 0x46, 0x95, 0xdf, 0x4b, 0x69, 0xf3, 0x52, 0x27, 0xcc, 0xa1, 0x83, + 0xfb, 0x88, 0xbd, 0xdc, 0x27, 0x52, 0x18, 0xbf, 0xc3, 0x58, 0x49, 0x87, 0x5a, 0x6d, 0x84, 0x99, + 0xfd, 0x69, 0x70, 0xd2, 0xd0, 0x4b, 0x95, 0x46, 0xbd, 0x76, 0x81, 0xbd, 0xb2, 0x49, 0x91, 0xd9, + 0xc9, 0x49, 0x26, 0xb0, 0xbd, 0x2e, 0x65, 0x1f, 0xc8, 0xcb, 0x2a, 0x69, 0xb6, 0xc2, 0x2c, 0xae, + 0x0c, 0xef, 0xd5, 0x04, 0xc8, 0x1e, 0x25, 0x0a, 0x5f, 0x2b, 0x82, 0x59, 0x03, 0xb6, 0x9d, 0xdd, + 0x5d, 0x68, 0x77, 0x60, 0x47, 0x7b, 0x9d, 0x0c, 0xe6, 0xc2, 0xfd, 0xbf, 0x26, 0xf4, 0xb5, 0xff, + 0x16, 0x61, 0x73, 0x16, 0xcc, 0xa1, 0xca, 0x35, 0xf8, 0xc0, 0xf1, 0x5c, 0x9a, 0x7a, 0x2b, 0x38, + 0x11, 0xa0, 0xd0, 0xe8, 0x9b, 0xc2, 0x1c, 0x7c, 0xa1, 0xbd, 0x97, 0xc5, 0x68, 0x83, 0xc7, 0xe8, + 0xde, 0x78, 0x61, 0x86, 0xec, 0x2e, 0xb2, 0xac, 0xc6, 0x80, 0xf5, 0x3b, 0x21, 0x58, 0xcf, 0xe2, + 0xc0, 0xaa, 0x1c, 0x92, 0xfe, 0x51, 0xa2, 0xf6, 0xcb, 0x32, 0x38, 0x19, 0x74, 0xc4, 0x93, 0x43, + 0xeb, 0x13, 0x2c, 0x5a, 0xdf, 0xcb, 0xa3, 0xb5, 0x22, 0x22, 0xcd, 0x41, 0x2c, 0xc7, 0xa0, 0xf6, + 0xc5, 0x10, 0xb5, 0xef, 0xe3, 0x50, 0xab, 0x8d, 0xa9, 0x9c, 0xa3, 0x44, 0xef, 0x43, 0x32, 0x38, + 0x8d, 0xcc, 0xce, 0xb2, 0x63, 0x6f, 0x75, 0xad, 0xb6, 0x6f, 0xd9, 0xdb, 0x91, 0x4b, 0xdb, 0x8a, + 0xc8, 0xca, 0x66, 0x3f, 0xb6, 0xd2, 0x41, 0x6c, 0xf9, 0x78, 0x1b, 0xa2, 0x6d, 0x2b, 0x8e, 0xad, + 0x98, 0x21, 0x8c, 0x71, 0xd6, 0x8e, 0x34, 0x87, 0x4d, 0x4a, 0xdf, 0xfa, 0x04, 0x39, 0x38, 0x4a, + 0xfc, 0x1e, 0x02, 0x8c, 0xe9, 0xf1, 0x42, 0x19, 0x28, 0xd8, 0x7f, 0x12, 0xf7, 0xec, 0xf4, 0x3e, + 0xd3, 0x06, 0xef, 0x59, 0xdf, 0x0b, 0x04, 0x14, 0x78, 0xd6, 0x07, 0x09, 0xea, 0x4d, 0x60, 0xa1, + 0xbd, 0x03, 0xdb, 0x97, 0xaa, 0x76, 0xe0, 0x9b, 0x44, 0x1c, 0x59, 0xfa, 0x52, 0xf9, 0xc1, 0xec, + 0x7e, 0x1e, 0x4c, 0x7e, 0xe1, 0x91, 0x9b, 0xd8, 0xb0, 0x4c, 0xc5, 0x34, 0xb4, 0xdf, 0x08, 0x01, + 0xaa, 0x73, 0x00, 0xdd, 0x35, 0x12, 0xd5, 0x74, 0xb0, 0xd4, 0x47, 0x80, 0x45, 0x03, 0xa7, 0x1a, + 0xeb, 0xad, 0x6a, 0xa3, 0xbe, 0xb9, 0xd1, 0xd4, 0x2b, 0x9b, 0x4b, 0x01, 0x38, 0x4d, 0x45, 0xd6, + 0xbe, 0x2a, 0x81, 0x29, 0xc2, 0x96, 0xa7, 0x3d, 0x3e, 0x82, 0x60, 0xe8, 0x91, 0x02, 0xed, 0xed, + 0xc2, 0x01, 0x82, 0x42, 0x41, 0xd0, 0x72, 0x62, 0x1a, 0xc6, 0x53, 0xc1, 0x14, 0x01, 0x39, 0xd8, + 0x05, 0x38, 0x13, 0x63, 0xd9, 0x51, 0x32, 0x46, 0x90, 0x5d, 0x30, 0x58, 0xd0, 0x10, 0x36, 0xb2, + 0xb7, 0xc6, 0x9f, 0x9b, 0x27, 0x4b, 0x07, 0xe7, 0x2d, 0x7f, 0x07, 0x9f, 0x38, 0xd0, 0x9e, 0x29, + 0xd2, 0x71, 0xdd, 0x0a, 0x0a, 0x97, 0x51, 0xee, 0x21, 0xa7, 0x37, 0x48, 0x26, 0xed, 0xe7, 0x85, + 0x63, 0x53, 0x73, 0xfa, 0x19, 0xf2, 0x14, 0x03, 0xce, 0x1a, 0xc8, 0x77, 0x2d, 0xcf, 0xa7, 0x36, + 0xf7, 0x9d, 0xa9, 0x08, 0x05, 0x7f, 0xaa, 0x3e, 0xdc, 0x35, 0x30, 0x19, 0xed, 0x3e, 0x64, 0x31, + 0x45, 0xa9, 0x02, 0x27, 0x58, 0x4e, 0x83, 0x29, 0x7a, 0xb2, 0x9a, 0x6e, 0x4b, 0x05, 0x8f, 0x82, + 0x5b, 0x41, 0x42, 0xb5, 0xcd, 0x5e, 0x07, 0xfe, 0x9f, 0xe3, 0x60, 0x6a, 0xd5, 0xf2, 0x7c, 0xc7, + 0xdd, 0xd7, 0x5e, 0x9f, 0x03, 0x53, 0xe7, 0xa0, 0xeb, 0x59, 0x8e, 0x7d, 0xc0, 0x5d, 0xeb, 0x7a, + 0x30, 0xdb, 0x73, 0xe1, 0x65, 0xcb, 0xd9, 0xf3, 0x98, 0x51, 0x82, 0x49, 0x52, 0x35, 0x30, 0x6d, + 0xee, 0xf9, 0x3b, 0x8e, 0x1b, 0x05, 0x64, 0x0a, 0x9e, 0xd5, 0x33, 0x00, 0x90, 0xff, 0x75, 0x73, + 0x17, 0x06, 0x77, 0xae, 0x47, 0x29, 0xaa, 0x0a, 0xf2, 0xbe, 0xb5, 0x0b, 0x69, 0x84, 0x76, 0xfc, + 0x1f, 0x09, 0x18, 0x47, 0x3b, 0xa5, 0x51, 0x65, 0x65, 0x23, 0x78, 0xd4, 0xfe, 0x50, 0x06, 0xb3, + 0x2b, 0xd0, 0xa7, 0xac, 0x7a, 0xda, 0x4b, 0x72, 0x42, 0x97, 0x22, 0xa1, 0x79, 0x49, 0xd7, 0xf4, + 0x82, 0xef, 0xc2, 0x21, 0x97, 0x4f, 0x8c, 0xc2, 0xc5, 0xcb, 0xec, 0x5d, 0x11, 0x38, 0x76, 0xa8, + 0x5f, 0x25, 0xce, 0xfc, 0x34, 0x33, 0xdd, 0x38, 0x3e, 0xf8, 0x82, 0xb7, 0x89, 0x13, 0xe3, 0x6e, + 0x50, 0xd9, 0x2f, 0x32, 0xf5, 0x89, 0xed, 0x8e, 0xa6, 0x2f, 0xd3, 0x1c, 0x07, 0xae, 0x01, 0x61, + 0x29, 0x51, 0x32, 0x46, 0x98, 0x5b, 0x30, 0x62, 0xc7, 0x70, 0x4e, 0x26, 0x70, 0xf1, 0xab, 0x0c, + 0x66, 0x9b, 0x3b, 0xce, 0x95, 0x40, 0x8e, 0xdf, 0x2b, 0x06, 0xec, 0xb5, 0x60, 0xe6, 0x72, 0x1f, + 0xa8, 0x51, 0x02, 0x7b, 0xd7, 0x9c, 0xcc, 0xdf, 0x35, 0xf7, 0x02, 0x39, 0x2d, 0x4c, 0x0c, 0x73, + 0x31, 0x30, 0xf1, 0xd7, 0xc3, 0x49, 0x29, 0xae, 0x87, 0x53, 0x9f, 0x02, 0xa6, 0x28, 0xd7, 0x74, + 0x99, 0x3a, 0x19, 0xe0, 0x20, 0x33, 0x5b, 0xc1, 0x3c, 0x5f, 0xc1, 0x74, 0xc8, 0xc7, 0x57, 0x2e, + 0x7b, 0xe4, 0x7f, 0x4b, 0xc2, 0xf1, 0x9a, 0x02, 0xe0, 0xcb, 0x63, 0x00, 0x5e, 0xfb, 0x66, 0x4e, + 0x74, 0x33, 0x27, 0x94, 0x40, 0xc8, 0xc1, 0xa1, 0x2e, 0x3c, 0x1b, 0x4a, 0x2e, 0x7b, 0x79, 0xbe, + 0x22, 0x0f, 0xe6, 0x2a, 0xd6, 0xd6, 0x56, 0xd8, 0x49, 0xbe, 0x54, 0xb0, 0x93, 0x8c, 0x77, 0xa9, + 0x42, 0x76, 0xee, 0x9e, 0xeb, 0x42, 0x3b, 0xa8, 0x14, 0x6d, 0x4e, 0x7d, 0xa9, 0xea, 0xcd, 0xe0, + 0x78, 0x30, 0x2e, 0xb0, 0x1d, 0xe5, 0x8c, 0xd1, 0x9f, 0xac, 0x7d, 0x5d, 0xd8, 0x13, 0x20, 0x90, + 0x28, 0x5b, 0xa5, 0x98, 0x06, 0x78, 0x37, 0x98, 0xdf, 0x21, 0xb9, 0xf1, 0x72, 0x69, 0xd0, 0x59, + 0x9e, 0xea, 0x8b, 0x87, 0xbf, 0x06, 0x3d, 0xcf, 0xdc, 0x86, 0x06, 0x9f, 0xb9, 0xaf, 0xf9, 0xca, + 0x69, 0x6e, 0x77, 0x14, 0x73, 0x2a, 0x10, 0xa8, 0x49, 0xf6, 0xda, 0xf1, 0xc5, 0xb3, 0x20, 0xbf, + 0x6c, 0x75, 0xa1, 0xf6, 0x23, 0x12, 0x98, 0x41, 0xb3, 0x6e, 0xbb, 0x8d, 0x9e, 0x18, 0x07, 0xcb, + 0xaf, 0xe5, 0x44, 0x6f, 0x35, 0x46, 0x74, 0x16, 0x43, 0x1a, 0x31, 0xed, 0x46, 0xec, 0xf6, 0xe2, + 0x44, 0x52, 0x13, 0xb8, 0x83, 0x0a, 0x4d, 0x3d, 0xb6, 0xb6, 0xba, 0x8e, 0xc9, 0x6d, 0x18, 0xf4, + 0x9b, 0x42, 0xd1, 0xa1, 0xc0, 0xba, 0xe3, 0xaf, 0x5b, 0xb6, 0x1d, 0xc6, 0xd9, 0x38, 0x90, 0xce, + 0xfb, 0xba, 0x24, 0x86, 0x2a, 0xc3, 0x75, 0xa7, 0xa5, 0xc7, 0x68, 0xf6, 0x4d, 0x60, 0xe1, 0xe2, + 0xbe, 0x0f, 0x3d, 0x9a, 0x8b, 0x16, 0x9b, 0x37, 0xfa, 0x52, 0x99, 0x8b, 0x06, 0x92, 0x42, 0x9a, + 0x25, 0x14, 0x98, 0x4e, 0xd4, 0xab, 0x23, 0xcc, 0x00, 0x4f, 0x02, 0xa5, 0xde, 0xa8, 0xe8, 0xd8, + 0xdf, 0x37, 0xf0, 0xa0, 0xdc, 0xd6, 0x7e, 0x52, 0x06, 0x73, 0xd8, 0x01, 0x2f, 0x40, 0xe1, 0x06, + 0x81, 0xf9, 0x88, 0xf6, 0x65, 0x61, 0x5f, 0x60, 0x5c, 0x65, 0xb6, 0x80, 0x78, 0x41, 0x6f, 0x59, + 0xdd, 0x7e, 0x41, 0x17, 0x8c, 0xbe, 0xd4, 0x01, 0x80, 0xc8, 0x03, 0x01, 0xf9, 0x65, 0x21, 0x87, + 0xe0, 0x61, 0xdc, 0x1d, 0x15, 0x2a, 0xbf, 0x22, 0x83, 0x59, 0x34, 0x49, 0x09, 0x40, 0x69, 0x70, + 0xa0, 0x38, 0x76, 0x77, 0x3f, 0x5a, 0x16, 0x09, 0x1e, 0x53, 0x35, 0x92, 0x3f, 0x12, 0x9e, 0xb9, + 0x63, 0x11, 0x31, 0xbc, 0x4c, 0x08, 0xbf, 0x0f, 0x0a, 0xcd, 0xe7, 0x87, 0x30, 0x77, 0x54, 0xf0, + 0x3d, 0x5c, 0x04, 0xc5, 0x8d, 0x1e, 0x46, 0xee, 0x4b, 0xb2, 0xc8, 0xa5, 0x1d, 0x07, 0x0e, 0x83, + 0x21, 0x33, 0xab, 0xeb, 0xb4, 0xcd, 0xee, 0x7a, 0x74, 0xaa, 0x36, 0x4a, 0x50, 0xef, 0xa2, 0xfe, + 0xe1, 0xe4, 0xc4, 0xf9, 0x4d, 0x89, 0xf7, 0x59, 0x60, 0x19, 0x31, 0x07, 0xef, 0x6e, 0x05, 0x27, + 0x3a, 0x96, 0x67, 0x5e, 0xec, 0x42, 0xdd, 0x6e, 0xbb, 0xfb, 0x44, 0x1c, 0x74, 0x5a, 0x75, 0xe0, + 0x85, 0x7a, 0x0f, 0x28, 0x78, 0xfe, 0x7e, 0x97, 0xcc, 0x13, 0xd9, 0x73, 0x7a, 0xb1, 0x45, 0x35, + 0x51, 0x76, 0x83, 0x7c, 0xc5, 0xba, 0x75, 0x4e, 0x89, 0xb9, 0x75, 0xaa, 0x4f, 0x02, 0x45, 0xc7, + 0xb5, 0xb6, 0x2d, 0x72, 0x45, 0xdd, 0xc2, 0x81, 0xb0, 0xad, 0xc4, 0x14, 0x68, 0xe0, 0x2c, 0x06, + 0xcd, 0xaa, 0x3e, 0x05, 0xcc, 0x58, 0xbb, 0xe6, 0x36, 0xbc, 0xdf, 0xb2, 0xc9, 0xa1, 0xf6, 0x85, + 0x3b, 0x4e, 0x1f, 0x38, 0x82, 0x48, 0xdf, 0x1b, 0x51, 0x56, 0xf5, 0x6e, 0x70, 0x4d, 0xdb, 0x85, + 0xa6, 0x0f, 0x91, 0x80, 0xce, 0x5b, 0x9d, 0x6d, 0xe8, 0x57, 0xb7, 0xd6, 0x2c, 0xcf, 0xb3, 0xec, + 0x6d, 0x7a, 0x0b, 0x65, 0x7c, 0x06, 0xed, 0x83, 0x92, 0x68, 0x64, 0x3a, 0x2c, 0x19, 0xa2, 0x12, + 0x23, 0xdc, 0x96, 0xcd, 0x48, 0x51, 0x16, 0x74, 0x8e, 0x7d, 0xb5, 0x50, 0xcc, 0xb8, 0x78, 0xb6, + 0xb2, 0x1f, 0xfa, 0x7f, 0x5f, 0x02, 0xd3, 0x15, 0xe7, 0x8a, 0x8d, 0x9b, 0xc9, 0x9d, 0x62, 0x96, + 0xf2, 0x80, 0x63, 0xe6, 0xfc, 0xbd, 0xcb, 0x89, 0x67, 0xca, 0x70, 0x6d, 0x83, 0x22, 0x63, 0x60, + 0x48, 0x6c, 0x77, 0x82, 0xb7, 0xe1, 0x26, 0x95, 0x93, 0xbd, 0x5c, 0x7f, 0x5b, 0x06, 0xf9, 0x8a, + 0xeb, 0xf4, 0xb4, 0xb7, 0xe5, 0x52, 0x38, 0x89, 0x75, 0x5c, 0xa7, 0xd7, 0xc2, 0xd7, 0x59, 0x46, + 0xfb, 0x22, 0x6c, 0x9a, 0x7a, 0x27, 0x98, 0xee, 0x39, 0x9e, 0xe5, 0x07, 0x93, 0x90, 0x85, 0x3b, + 0x1e, 0x33, 0xb0, 0x2f, 0x58, 0xa7, 0x99, 0x8c, 0x30, 0x3b, 0xea, 0xf3, 0xb1, 0x08, 0x91, 0x5c, + 0x90, 0x18, 0x83, 0x2b, 0x3d, 0xfb, 0x52, 0xb5, 0x97, 0xb1, 0x48, 0x3e, 0x8d, 0x47, 0xf2, 0xb1, + 0x03, 0x24, 0xec, 0x3a, 0xbd, 0xb1, 0xb8, 0x75, 0xbc, 0x32, 0x44, 0xf5, 0xe9, 0x1c, 0xaa, 0xb7, + 0x08, 0x95, 0x99, 0x3d, 0xa2, 0x1f, 0xcc, 0x03, 0x80, 0x8d, 0x94, 0x0d, 0x34, 0x7d, 0x12, 0xb3, + 0xd0, 0x7e, 0x38, 0xcf, 0xc8, 0xb2, 0xc4, 0xcb, 0xf2, 0xf1, 0x31, 0x36, 0x10, 0x26, 0x1f, 0x23, + 0xd1, 0x12, 0x28, 0xec, 0xa1, 0xd7, 0x54, 0xa2, 0x82, 0x24, 0xf0, 0xa3, 0x41, 0xbe, 0xd4, 0x7e, + 0x2b, 0x07, 0x0a, 0x38, 0x41, 0x3d, 0x03, 0x00, 0x36, 0x0b, 0xc8, 0x91, 0xcc, 0x1c, 0x36, 0x00, + 0x98, 0x14, 0xac, 0xad, 0x56, 0x87, 0xbe, 0x26, 0x06, 0x77, 0x94, 0x80, 0xbe, 0xc6, 0xc6, 0x02, + 0xa6, 0x45, 0xcd, 0x07, 0x26, 0x05, 0x7d, 0x8d, 0x9f, 0x6a, 0x70, 0x8b, 0xdc, 0x34, 0x90, 0x37, + 0xa2, 0x84, 0xf0, 0xeb, 0x5a, 0x78, 0x3f, 0x65, 0xf0, 0x35, 0x4e, 0x41, 0x53, 0x69, 0xac, 0x96, + 0x4b, 0x51, 0x11, 0x45, 0x9c, 0xa9, 0x3f, 0x59, 0x7b, 0x5d, 0xa8, 0x36, 0x15, 0x4e, 0x6d, 0x6e, + 0x4f, 0x21, 0xde, 0xec, 0x95, 0xe7, 0x4f, 0x0b, 0x60, 0xa6, 0xee, 0x74, 0xa8, 0xee, 0x30, 0xd3, + 0xcd, 0x4f, 0x15, 0x52, 0x4d, 0x37, 0x43, 0x1a, 0x31, 0x0a, 0xf2, 0x0c, 0x5e, 0x41, 0xc4, 0x28, + 0xb0, 0xfa, 0xa1, 0x2e, 0x81, 0x22, 0xd6, 0xde, 0x83, 0x17, 0x1f, 0x26, 0x91, 0xc0, 0xa2, 0x35, + 0xe8, 0x97, 0xff, 0xe9, 0x74, 0xec, 0x7f, 0x80, 0x02, 0xae, 0x60, 0xc2, 0xde, 0x10, 0x5f, 0x51, + 0x29, 0xb9, 0xa2, 0x72, 0x72, 0x45, 0xf3, 0xfd, 0x15, 0x4d, 0xb3, 0x8a, 0x10, 0xa7, 0x21, 0xd9, + 0xeb, 0xf8, 0xdf, 0x4e, 0x01, 0x50, 0x37, 0x2f, 0x5b, 0xdb, 0x64, 0x6f, 0xf9, 0x0f, 0x83, 0xd9, + 0x13, 0xdd, 0x05, 0xfe, 0x31, 0x66, 0x20, 0xbc, 0x13, 0x4c, 0xd1, 0x71, 0x8f, 0x56, 0xe4, 0x3a, + 0xae, 0x22, 0x11, 0x15, 0x62, 0xd4, 0x3e, 0xe8, 0x1b, 0x41, 0x7e, 0xee, 0x8e, 0x76, 0xa9, 0xef, + 0x8e, 0xf6, 0xc1, 0x3b, 0x18, 0x31, 0x37, 0xb7, 0x6b, 0xef, 0x13, 0x3e, 0x43, 0xc5, 0xf0, 0xc3, + 0xd4, 0x28, 0xa6, 0x09, 0x3e, 0x09, 0x4c, 0x39, 0xe1, 0x76, 0xb8, 0x1c, 0xbb, 0x8a, 0x56, 0xb5, + 0xb7, 0x1c, 0x23, 0xc8, 0x29, 0xb8, 0x75, 0x26, 0xc4, 0xc7, 0x44, 0x8e, 0x29, 0x9e, 0x5a, 0x09, + 0xa2, 0x36, 0xa2, 0x7a, 0x9c, 0xb7, 0xfc, 0x9d, 0x9a, 0x65, 0x5f, 0xf2, 0xb4, 0xef, 0x13, 0xb3, + 0x20, 0x19, 0xfc, 0xa5, 0x74, 0xf8, 0xf3, 0x51, 0x93, 0x9a, 0x3c, 0x6a, 0xf7, 0xc4, 0x51, 0x19, + 0xcc, 0x6d, 0x0c, 0x80, 0x77, 0x81, 0x22, 0x61, 0x94, 0x76, 0xa2, 0x67, 0x63, 0xf1, 0x0b, 0x29, + 0x19, 0xf4, 0x0b, 0xed, 0xbd, 0x21, 0x8e, 0xe7, 0x38, 0x1c, 0x97, 0x0e, 0xc5, 0x59, 0xe6, 0x90, + 0x9e, 0x7d, 0x22, 0x98, 0xa2, 0x92, 0x56, 0x17, 0xd8, 0x56, 0xac, 0x1c, 0x53, 0x01, 0x28, 0xae, + 0x39, 0x97, 0x61, 0xcb, 0x51, 0x72, 0xe8, 0x3f, 0xe2, 0xaf, 0xe5, 0x28, 0x92, 0xf6, 0xaa, 0x69, + 0x30, 0x1d, 0x86, 0xcb, 0xfb, 0x7d, 0x09, 0x28, 0x65, 0x3c, 0x43, 0x5b, 0x76, 0x9d, 0x5d, 0x52, + 0x23, 0x71, 0x7f, 0xfc, 0x9f, 0x11, 0x76, 0x10, 0x09, 0xc3, 0xd8, 0xf5, 0x17, 0x16, 0x83, 0x25, + 0x59, 0xc2, 0x94, 0x82, 0x25, 0x4c, 0xed, 0xad, 0x42, 0x0e, 0x23, 0xa2, 0xa5, 0x64, 0xdf, 0xd4, + 0x3e, 0x2b, 0x81, 0x42, 0xb9, 0xeb, 0xd8, 0x90, 0x3d, 0x34, 0x3a, 0xf4, 0x74, 0xe2, 0xe0, 0x7d, + 0x0c, 0xed, 0xb9, 0x92, 0xa8, 0xad, 0x11, 0x09, 0x00, 0x95, 0x2d, 0x28, 0x5b, 0xb1, 0x41, 0x2a, + 0x91, 0x74, 0xf6, 0x02, 0xfd, 0xaa, 0x04, 0x66, 0x48, 0x64, 0xb2, 0x52, 0xb7, 0xab, 0x3d, 0x26, + 0x12, 0xea, 0x80, 0x90, 0x83, 0xda, 0x2f, 0x0b, 0x1f, 0x8a, 0x0a, 0x6b, 0x15, 0xd2, 0x4e, 0x11, + 0xa2, 0x2d, 0xdd, 0x19, 0x1d, 0xb1, 0x9d, 0xb8, 0xa1, 0x0c, 0x65, 0x2f, 0xea, 0x3f, 0x90, 0x90, + 0x01, 0x60, 0x5f, 0x5a, 0x77, 0xe1, 0x65, 0x0b, 0x5e, 0xd1, 0x1e, 0x1d, 0x09, 0xfb, 0x60, 0xd8, + 0xa5, 0x37, 0x09, 0x2f, 0xe2, 0x30, 0x24, 0x63, 0x37, 0xc2, 0x66, 0xbb, 0x51, 0x26, 0xda, 0x8b, + 0xf7, 0xc7, 0xc2, 0x62, 0xc8, 0x18, 0x6c, 0x76, 0xc1, 0x35, 0x9b, 0x78, 0x2e, 0xb2, 0x17, 0xec, + 0xaf, 0x4e, 0x81, 0xe9, 0x0d, 0xdb, 0xeb, 0x75, 0x4d, 0x6f, 0x47, 0xfb, 0x37, 0x19, 0x14, 0xc9, + 0x75, 0x9b, 0xda, 0x77, 0x71, 0xd1, 0x5d, 0x9e, 0xbd, 0x07, 0xdd, 0xc0, 0x81, 0x87, 0x3c, 0x44, + 0xf6, 0x91, 0xc4, 0xd8, 0x47, 0xda, 0x07, 0x65, 0xd1, 0x49, 0x6a, 0x50, 0x28, 0xbd, 0xdf, 0x33, + 0x3e, 0xa0, 0x48, 0xcf, 0x6a, 0xfb, 0x7b, 0x2e, 0xf4, 0x06, 0x06, 0x14, 0x89, 0xa5, 0xb2, 0x4e, + 0xbe, 0x32, 0xc2, 0xcf, 0x35, 0x13, 0x4c, 0xd1, 0xc4, 0x03, 0x9b, 0x51, 0x07, 0x23, 0x1e, 0x9c, + 0x02, 0x45, 0xd3, 0xf5, 0x2d, 0xcf, 0xa7, 0xdb, 0xb3, 0xf4, 0x09, 0x75, 0x97, 0xe4, 0xdf, 0x86, + 0xdb, 0x0d, 0xe2, 0x40, 0x85, 0x09, 0xda, 0xaf, 0x08, 0xcd, 0x1f, 0x93, 0x6b, 0x9e, 0x0e, 0xf2, + 0xfb, 0x47, 0x58, 0xe1, 0x7e, 0x14, 0xb8, 0xca, 0x28, 0xb5, 0xf4, 0x4d, 0x12, 0x36, 0x28, 0x8c, + 0x10, 0xd4, 0xd1, 0xde, 0x23, 0x33, 0xeb, 0x77, 0xfb, 0xdc, 0x18, 0x41, 0xa5, 0x18, 0x8d, 0x11, + 0x61, 0x42, 0xc2, 0x5e, 0x37, 0xb7, 0x84, 0x2b, 0x0b, 0x2f, 0xe1, 0x6a, 0xbf, 0x24, 0xbc, 0x17, + 0x15, 0x8a, 0x72, 0xc8, 0x1a, 0x60, 0xd2, 0x75, 0x7c, 0x1f, 0x16, 0xda, 0x57, 0x1a, 0x56, 0xd2, + 0x11, 0xc2, 0xf6, 0xcd, 0x53, 0x40, 0x2a, 0x55, 0xb5, 0x1f, 0x9d, 0x02, 0x73, 0xe7, 0x5d, 0xcb, + 0xb7, 0xec, 0xed, 0x96, 0xe3, 0x74, 0x3d, 0xed, 0x1b, 0xcc, 0x46, 0xc5, 0x53, 0x40, 0xb1, 0xed, + 0xd8, 0x5b, 0xd6, 0x36, 0x15, 0xe3, 0x19, 0xae, 0x72, 0xa5, 0xea, 0xe2, 0xba, 0xeb, 0x5c, 0xb6, + 0x3a, 0xd0, 0x2d, 0xe3, 0x5c, 0x06, 0xcd, 0x8d, 0xf4, 0x98, 0x09, 0xbc, 0x76, 0x7b, 0xff, 0x57, + 0x6c, 0x79, 0x61, 0xe4, 0x17, 0x9a, 0xc8, 0xc4, 0x5d, 0xab, 0x82, 0xe9, 0xae, 0x69, 0x6f, 0xef, + 0x05, 0x33, 0xef, 0xfe, 0x5d, 0xd4, 0x38, 0x4a, 0x35, 0xfa, 0x91, 0x11, 0x7e, 0x8e, 0x9d, 0xdc, + 0x90, 0xa9, 0x4f, 0xda, 0x1e, 0xfe, 0x7f, 0xf6, 0xa3, 0x39, 0x30, 0xcb, 0x14, 0xaa, 0xce, 0x82, + 0xa9, 0x8a, 0xbe, 0x5c, 0xda, 0xa8, 0xb5, 0x94, 0x63, 0x48, 0x8a, 0xcd, 0x8d, 0xb5, 0xb5, 0x92, + 0x51, 0xfd, 0x1e, 0x5d, 0xc9, 0xa1, 0x77, 0x2b, 0x46, 0x09, 0x3d, 0x2b, 0x12, 0x7a, 0x68, 0xae, + 0x36, 0x8c, 0x96, 0x5e, 0x57, 0x64, 0x64, 0x8f, 0xea, 0xcf, 0x5a, 0x2f, 0xd5, 0x2b, 0x4a, 0x1e, + 0xfd, 0x5f, 0xda, 0xa8, 0xd5, 0xf4, 0x96, 0x52, 0x88, 0x42, 0xb1, 0x15, 0x51, 0x72, 0xb9, 0xd4, + 0xdc, 0x28, 0xd5, 0x94, 0x29, 0x94, 0xbc, 0xbc, 0x51, 0xaf, 0x5f, 0x50, 0xa6, 0x51, 0x11, 0xe5, + 0x46, 0x7d, 0xb9, 0x5a, 0xd1, 0xeb, 0x2d, 0x65, 0x46, 0xbd, 0x0a, 0x1c, 0x6f, 0xb6, 0x8c, 0x52, + 0x75, 0x65, 0xb5, 0xb5, 0xdc, 0x30, 0xce, 0x97, 0x8c, 0x8a, 0x02, 0x54, 0x05, 0xcc, 0xad, 0x1b, + 0x8d, 0x65, 0x1d, 0xc7, 0xf2, 0x28, 0xd5, 0x94, 0x59, 0xf4, 0x55, 0xcb, 0x28, 0xd5, 0x9b, 0xb5, + 0x52, 0x4b, 0x57, 0xe6, 0xce, 0xde, 0x07, 0xa6, 0x83, 0xea, 0xaa, 0x45, 0x20, 0xe9, 0x75, 0xe5, + 0x18, 0xfe, 0x6d, 0x2a, 0x39, 0xf4, 0xbb, 0x8c, 0xf8, 0x2d, 0x02, 0xa9, 0xa2, 0x2b, 0x32, 0xfa, + 0xad, 0xb6, 0x94, 0x3c, 0xfa, 0x5d, 0x47, 0x2c, 0x16, 0x81, 0xb4, 0x5a, 0x55, 0x8a, 0xe8, 0xb7, + 0xb5, 0xaa, 0x4c, 0xf1, 0xb7, 0x6e, 0x27, 0xf6, 0xc2, 0x07, 0x25, 0x1f, 0x63, 0x68, 0xf8, 0xd1, + 0x1c, 0x19, 0xff, 0xd7, 0x5e, 0x29, 0x89, 0xf4, 0x75, 0xc9, 0xf4, 0xd3, 0x35, 0x9a, 0xb7, 0xe4, + 0xc6, 0xd8, 0x6a, 0x54, 0x0d, 0x9c, 0xd2, 0xeb, 0x95, 0xf5, 0x46, 0xb5, 0xde, 0x22, 0x01, 0xb3, + 0xf4, 0x52, 0x79, 0x15, 0xe3, 0x0c, 0x11, 0x82, 0x6b, 0x8d, 0x8a, 0x5e, 0xc3, 0x2f, 0x96, 0x1b, + 0x1b, 0xf5, 0x8a, 0xb2, 0x85, 0xca, 0x2a, 0x6d, 0xb4, 0x56, 0x37, 0x0d, 0xfd, 0x99, 0x1b, 0x55, + 0x43, 0xaf, 0x28, 0xdb, 0x88, 0x46, 0xad, 0x54, 0x5f, 0xd9, 0x28, 0xad, 0xd0, 0xfd, 0xc2, 0x8d, + 0xf5, 0xf5, 0x06, 0xde, 0x31, 0xdc, 0xd1, 0xfe, 0x21, 0x0f, 0xa6, 0x4b, 0x7b, 0xbe, 0xb3, 0x65, + 0x75, 0xbb, 0xda, 0x43, 0xd2, 0xe1, 0x9b, 0x62, 0x89, 0x6b, 0x8a, 0x07, 0x1a, 0x50, 0x50, 0x56, + 0xd8, 0x78, 0x82, 0x04, 0xa6, 0x1d, 0x9e, 0x8e, 0x9c, 0xb1, 0x65, 0xba, 0xd3, 0x4c, 0x1e, 0x89, + 0x23, 0xae, 0x4d, 0x5b, 0x16, 0x7e, 0x43, 0x1f, 0xcf, 0xde, 0x0f, 0xe6, 0x58, 0x4a, 0x38, 0xa8, + 0x54, 0x69, 0x85, 0x44, 0x9d, 0x0a, 0xe2, 0xcc, 0x91, 0xa8, 0x53, 0xf8, 0x50, 0x80, 0x84, 0xdb, + 0x4b, 0xb5, 0x55, 0x43, 0x7a, 0x7a, 0x1c, 0xcc, 0x56, 0xf4, 0x66, 0xd9, 0xa8, 0x62, 0x3f, 0x75, + 0x25, 0xcf, 0x7b, 0x19, 0x24, 0x5a, 0x66, 0x7c, 0x8d, 0x44, 0x95, 0xf2, 0x5b, 0x42, 0xf6, 0x56, + 0x3c, 0xed, 0x74, 0x0a, 0xf9, 0x92, 0x47, 0x9a, 0x42, 0x6a, 0x2f, 0xc9, 0x93, 0x75, 0xb2, 0xe6, + 0xde, 0xee, 0xae, 0xe9, 0xee, 0x73, 0xfe, 0x6a, 0xa3, 0xea, 0x5d, 0xfc, 0xf8, 0x9e, 0x18, 0xa1, + 0x06, 0x99, 0x50, 0x3d, 0xd7, 0xd9, 0xed, 0x05, 0x7d, 0x35, 0x7d, 0xd2, 0xfe, 0x2f, 0xe1, 0x99, + 0x63, 0xa9, 0xba, 0xc8, 0x54, 0x66, 0x84, 0xa1, 0xfd, 0x07, 0x24, 0x91, 0x59, 0x64, 0x62, 0x31, + 0xdf, 0xee, 0x1a, 0xf1, 0x37, 0x79, 0x70, 0x15, 0x8d, 0x3e, 0x12, 0xae, 0x3f, 0x20, 0x53, 0xf5, + 0x35, 0x99, 0x6a, 0x06, 0x35, 0xa8, 0xe5, 0xc8, 0xa0, 0x66, 0x36, 0xbc, 0xf3, 0x82, 0x1b, 0xde, + 0x6f, 0x13, 0x3e, 0xf4, 0x50, 0xaa, 0x2e, 0x0e, 0xa8, 0xe3, 0x64, 0xb6, 0xe5, 0x5f, 0x20, 0x89, + 0xac, 0xb6, 0x0a, 0x71, 0xf8, 0xed, 0xae, 0x6b, 0xef, 0xc8, 0x81, 0x05, 0x5e, 0x55, 0xd4, 0x27, + 0x83, 0xe9, 0x1e, 0x4d, 0xa1, 0x72, 0x39, 0x1d, 0xa7, 0x5c, 0x46, 0x98, 0x13, 0x41, 0x04, 0xed, + 0x4e, 0xcf, 0xb1, 0xec, 0x70, 0x5d, 0x3e, 0x78, 0x46, 0xf3, 0x4e, 0x3c, 0x75, 0x08, 0x62, 0xd1, + 0xe1, 0x87, 0x28, 0x02, 0x69, 0x9e, 0x89, 0x40, 0x8a, 0x84, 0xe8, 0xc3, 0x5d, 0x7c, 0xa3, 0xca, + 0x9e, 0x4b, 0x1c, 0x5e, 0x24, 0x83, 0x4d, 0x3a, 0xfb, 0x74, 0x30, 0x1d, 0x94, 0x8f, 0xac, 0xbb, + 0x46, 0xad, 0x56, 0x5a, 0x2b, 0x91, 0x85, 0xca, 0xc6, 0xba, 0x5e, 0x2f, 0x55, 0x95, 0x1c, 0x1a, + 0xe8, 0x6a, 0x6b, 0xcd, 0xd6, 0x46, 0xa5, 0xda, 0x50, 0x24, 0xfc, 0x84, 0x32, 0x95, 0xd7, 0xd7, + 0x15, 0x59, 0x7b, 0xe3, 0x14, 0x98, 0x5a, 0x31, 0xbb, 0x5d, 0xe8, 0xee, 0x6b, 0x5f, 0x95, 0x80, + 0x12, 0xcc, 0x0e, 0xd6, 0x4c, 0xdb, 0xda, 0x82, 0x9e, 0x9f, 0xbc, 0x50, 0xf1, 0x3e, 0xe1, 0x6b, + 0x96, 0x68, 0x19, 0x8b, 0xfd, 0xf4, 0x63, 0x74, 0xfc, 0x36, 0x90, 0xb7, 0xec, 0x2d, 0x87, 0x2e, + 0x57, 0xf4, 0xfb, 0xdb, 0x04, 0x1f, 0xe3, 0x6d, 0x03, 0x9c, 0x51, 0xf0, 0xa6, 0x25, 0x41, 0x2e, + 0xb2, 0x5f, 0xb5, 0x78, 0x47, 0x1e, 0xcc, 0x07, 0x4c, 0x54, 0xed, 0x0e, 0x7c, 0x90, 0xdd, 0x06, + 0xfd, 0xc9, 0xbc, 0x68, 0xf0, 0x9b, 0xfe, 0xfa, 0x60, 0x52, 0x31, 0x22, 0x6d, 0x01, 0xd0, 0x36, + 0x7d, 0xb8, 0xed, 0xb8, 0x56, 0xb8, 0x16, 0xf1, 0xe4, 0x34, 0xd4, 0xca, 0xe4, 0xeb, 0x7d, 0x83, + 0xa1, 0xa3, 0xde, 0x03, 0x66, 0x61, 0x18, 0x6d, 0x30, 0xd8, 0x26, 0x4d, 0xc4, 0x8b, 0xcd, 0xaf, + 0xfd, 0x81, 0x50, 0x8c, 0x1d, 0x91, 0x6a, 0xa6, 0xc3, 0x6c, 0x73, 0xb4, 0xae, 0x67, 0xa3, 0xbe, + 0x56, 0x32, 0x9a, 0xab, 0xa5, 0x5a, 0xad, 0x5a, 0x5f, 0x09, 0xc3, 0xde, 0xaa, 0x60, 0xa1, 0xd2, + 0x38, 0x5f, 0x67, 0xe2, 0x12, 0xe7, 0xb5, 0x75, 0x30, 0x1d, 0xc8, 0x6b, 0xd0, 0x29, 0x2a, 0x56, + 0x66, 0xf4, 0x14, 0x15, 0x93, 0x84, 0x4c, 0x43, 0xab, 0x1d, 0xba, 0xd6, 0xe3, 0xff, 0xda, 0x6f, + 0x9a, 0xa0, 0x80, 0xfd, 0x59, 0xb4, 0x77, 0xe1, 0x79, 0x71, 0xaf, 0x6b, 0xb6, 0xa1, 0xb6, 0x9b, + 0x62, 0x25, 0x3c, 0xb8, 0xf7, 0x53, 0x3a, 0x70, 0xef, 0x27, 0xfe, 0x4b, 0x47, 0x8c, 0x93, 0x83, + 0x7c, 0x68, 0x0c, 0x92, 0x85, 0x0f, 0x47, 0x93, 0xe8, 0xd9, 0x44, 0x5c, 0x6f, 0x28, 0x9b, 0x31, + 0x2a, 0x19, 0xcf, 0x53, 0xba, 0x55, 0x60, 0x31, 0x1f, 0xa8, 0x24, 0x8e, 0xb2, 0x6f, 0xf1, 0x5f, + 0xca, 0x83, 0x42, 0xb3, 0xd7, 0xb5, 0x7c, 0xed, 0xe7, 0xa4, 0xb1, 0x60, 0x46, 0xee, 0x6a, 0x95, + 0x87, 0xde, 0xd5, 0x1a, 0xf9, 0x4b, 0xe6, 0x05, 0xfc, 0x25, 0x5b, 0xf0, 0x41, 0x9f, 0xf7, 0x97, + 0xbc, 0x93, 0x4e, 0xdb, 0x88, 0xb7, 0xe5, 0x63, 0x07, 0x88, 0x14, 0x57, 0x6b, 0xc0, 0x9d, 0x08, + 0x67, 0x9f, 0x48, 0x43, 0xb3, 0x03, 0x50, 0x5c, 0x6a, 0xb4, 0x5a, 0x8d, 0x35, 0xe5, 0x18, 0x9e, + 0x7e, 0x35, 0xd6, 0x49, 0xa0, 0xdc, 0x6a, 0xbd, 0xae, 0x1b, 0xdc, 0x8c, 0x8b, 0xbf, 0xb8, 0x2f, + 0x71, 0x82, 0xc5, 0x97, 0x9d, 0xa5, 0x7a, 0x89, 0x2d, 0x82, 0xc7, 0xf3, 0x93, 0xbd, 0x72, 0xfd, + 0xb4, 0x0c, 0x0a, 0x6b, 0xd0, 0xdd, 0x86, 0xda, 0xb3, 0x53, 0x38, 0xd8, 0x6d, 0x59, 0xae, 0x47, + 0x42, 0xeb, 0x47, 0x0e, 0x76, 0x6c, 0x9a, 0x7a, 0x23, 0x98, 0xf7, 0x60, 0xdb, 0xb1, 0x3b, 0x41, + 0x26, 0xd2, 0x1f, 0xf1, 0x89, 0xda, 0xcb, 0x53, 0x42, 0x86, 0x19, 0x1d, 0x8b, 0x97, 0x5c, 0x1a, + 0x60, 0x06, 0x95, 0x9a, 0x3d, 0x30, 0x5f, 0x97, 0xd1, 0x47, 0xbd, 0x7d, 0xed, 0xe5, 0xc2, 0x9e, + 0x8f, 0xb7, 0x82, 0xe2, 0xc5, 0xe0, 0x8e, 0x26, 0x39, 0xb6, 0x3f, 0xa6, 0x79, 0xd4, 0x25, 0x70, + 0xc2, 0x83, 0x5d, 0xd8, 0xf6, 0x61, 0x07, 0x35, 0x5d, 0x63, 0x68, 0xa7, 0x70, 0x30, 0xbb, 0xf6, + 0x3b, 0x2c, 0x80, 0x77, 0xf3, 0x00, 0xde, 0x34, 0x40, 0x94, 0xa8, 0x42, 0xf1, 0x73, 0x13, 0x54, + 0x8d, 0x66, 0xd7, 0x09, 0x0d, 0xdf, 0xe0, 0x19, 0xbd, 0xdb, 0xf1, 0x77, 0xbb, 0xf8, 0x1d, 0x3d, + 0x1a, 0x1c, 0x3c, 0xab, 0x8b, 0x60, 0xca, 0xb4, 0xf7, 0xf1, 0xab, 0x7c, 0x42, 0xad, 0x83, 0x4c, + 0xda, 0xab, 0x42, 0xe4, 0xef, 0xe5, 0x90, 0x7f, 0xbc, 0x18, 0xbb, 0xd9, 0x03, 0xff, 0x43, 0x53, + 0xa0, 0xb0, 0x6e, 0x7a, 0x3e, 0xd4, 0xfe, 0xb7, 0x2c, 0x8a, 0xfc, 0x4d, 0x60, 0x61, 0xcb, 0x69, + 0xef, 0x79, 0xb0, 0xc3, 0x37, 0xca, 0xbe, 0xd4, 0x71, 0x60, 0xae, 0xde, 0x02, 0x94, 0x20, 0x91, + 0x92, 0x0d, 0x5c, 0x60, 0x0f, 0xa4, 0xe3, 0x6b, 0xe0, 0xbc, 0x75, 0xd3, 0xf5, 0x1b, 0x5b, 0x38, + 0x2d, 0xbc, 0x06, 0x8e, 0x4d, 0xe4, 0xa0, 0x2f, 0x26, 0x40, 0x3f, 0x15, 0x0f, 0xfd, 0xb4, 0x00, + 0xf4, 0x6a, 0x09, 0x4c, 0x6f, 0x59, 0x5d, 0x88, 0x3f, 0x98, 0xc1, 0x1f, 0x0c, 0x1a, 0x93, 0xb0, + 0xec, 0xc3, 0x31, 0x69, 0xd9, 0xea, 0x42, 0x23, 0xfc, 0x2c, 0x98, 0xc8, 0x80, 0x68, 0x22, 0x53, + 0x23, 0x27, 0xe1, 0x90, 0xe1, 0x65, 0x9b, 0xbb, 0x30, 0xd8, 0xf8, 0xb6, 0xe9, 0xb1, 0xf4, 0x8e, + 0xe9, 0x9b, 0x18, 0x8c, 0x39, 0x03, 0xff, 0xe7, 0x7d, 0xb2, 0xe5, 0x7e, 0x9f, 0xec, 0xe7, 0xcb, + 0xe9, 0x7a, 0xc4, 0x80, 0xd9, 0x98, 0x16, 0x75, 0x31, 0x00, 0x88, 0x58, 0x8a, 0xe1, 0x33, 0x02, + 0xa6, 0x6d, 0xba, 0xd0, 0x5f, 0x67, 0xbd, 0xa0, 0x0b, 0x06, 0x9f, 0x88, 0x0f, 0xe1, 0x78, 0x4d, + 0x73, 0x97, 0x5c, 0xf3, 0x56, 0x46, 0xef, 0xe8, 0xe1, 0x8a, 0x03, 0xe9, 0x51, 0xff, 0x5b, 0x18, + 0x77, 0xff, 0x3b, 0xa8, 0x8e, 0xd9, 0x37, 0xc3, 0xd7, 0xe6, 0x81, 0x5c, 0xde, 0xf3, 0x1f, 0xd1, + 0xdd, 0xef, 0xb7, 0x84, 0x7d, 0xcc, 0x69, 0x7f, 0xb6, 0xe7, 0x1f, 0x6d, 0xef, 0x9b, 0x52, 0x4b, + 0xc4, 0x7c, 0xd9, 0xe3, 0xea, 0x96, 0xbd, 0x8e, 0xbc, 0x4d, 0x0e, 0x8f, 0x46, 0x3d, 0x94, 0x3b, + 0xbc, 0x69, 0xae, 0x91, 0xfe, 0x89, 0xe9, 0x19, 0xc2, 0xe7, 0xa0, 0xe3, 0xc9, 0x73, 0x37, 0x13, + 0x60, 0xd7, 0x56, 0x2c, 0xca, 0x39, 0x83, 0x3c, 0x68, 0xaf, 0x10, 0x3e, 0x30, 0x4a, 0xc4, 0x96, + 0x78, 0x8c, 0x27, 0x9d, 0x4d, 0xf5, 0x1a, 0xa1, 0x63, 0xa3, 0x09, 0xc5, 0x66, 0x0f, 0xd8, 0xdf, + 0xb3, 0xc7, 0x74, 0x4a, 0x87, 0x46, 0x4c, 0x7b, 0xb5, 0xf0, 0x82, 0x3e, 0xa9, 0xf6, 0x90, 0xbd, + 0xfa, 0x74, 0xf2, 0x16, 0x73, 0x14, 0x4b, 0x2c, 0x78, 0x02, 0xf7, 0xd6, 0xca, 0xa0, 0x48, 0x16, + 0x7e, 0xb5, 0x37, 0x0b, 0x37, 0x11, 0xd4, 0x1b, 0xf1, 0xc7, 0x77, 0xc2, 0xe7, 0x34, 0x6b, 0x0e, + 0xdc, 0x31, 0x9f, 0x7c, 0xaa, 0x63, 0x3e, 0x7c, 0x04, 0x16, 0x81, 0x76, 0x44, 0xea, 0x98, 0xf1, + 0x74, 0x32, 0x4d, 0x0b, 0x1b, 0xc8, 0x50, 0xf6, 0x78, 0xbf, 0xb0, 0x00, 0xe6, 0x48, 0xd1, 0xe4, + 0x7c, 0xa1, 0xf6, 0x1e, 0xe9, 0xdb, 0x07, 0x75, 0xb5, 0x0e, 0xe6, 0xae, 0x60, 0xb6, 0xc9, 0x7d, + 0xb4, 0x74, 0xe5, 0xe2, 0x96, 0xc4, 0x75, 0x0f, 0x52, 0xcf, 0xe0, 0x06, 0x5b, 0xee, 0x7b, 0x24, + 0x63, 0xb2, 0xc1, 0x42, 0x0e, 0x4f, 0x14, 0xb1, 0x91, 0xc5, 0x26, 0xa9, 0xa7, 0x40, 0xf1, 0xb2, + 0x05, 0xaf, 0x54, 0x3b, 0xd4, 0xba, 0xa5, 0x4f, 0xda, 0xaf, 0x09, 0xfb, 0x4c, 0xb2, 0x70, 0x53, + 0x5e, 0xb2, 0xd5, 0x42, 0x31, 0xcf, 0xc9, 0xa1, 0x6c, 0x4d, 0x20, 0x1a, 0x90, 0x44, 0xee, 0xcc, + 0xa6, 0x61, 0xe6, 0xcb, 0x29, 0x14, 0x31, 0xce, 0x70, 0xe6, 0x83, 0xf0, 0x25, 0x9e, 0x35, 0x27, + 0x02, 0x88, 0xca, 0x1f, 0x4b, 0x9f, 0x2f, 0x16, 0x19, 0x6e, 0x48, 0xd1, 0xd9, 0x4b, 0xfe, 0x75, + 0x32, 0x98, 0x69, 0x42, 0x7f, 0xd9, 0x82, 0xdd, 0x8e, 0xa7, 0xb9, 0x87, 0x37, 0x8d, 0x6e, 0x03, + 0xc5, 0x2d, 0x4c, 0x6c, 0xd8, 0xe6, 0x24, 0xcd, 0xa6, 0xbd, 0x56, 0x12, 0xf5, 0x03, 0xa2, 0xab, + 0x6f, 0x01, 0xb7, 0x63, 0x81, 0x49, 0xec, 0x34, 0x5d, 0x72, 0xc9, 0x13, 0xb8, 0xc6, 0x47, 0x06, + 0x73, 0x78, 0xfb, 0x1f, 0xfa, 0xa5, 0xae, 0xb5, 0x6d, 0x6b, 0x7b, 0x63, 0x68, 0x21, 0xea, 0xed, + 0xa0, 0x60, 0x22, 0x6a, 0xd4, 0xdd, 0x4d, 0x1b, 0xd8, 0x79, 0xe2, 0xf2, 0x0c, 0x92, 0x31, 0xc5, + 0xa5, 0x19, 0x91, 0x62, 0x07, 0x3c, 0x4f, 0xf0, 0xd2, 0x8c, 0xa1, 0x85, 0x67, 0x8f, 0xd8, 0x57, + 0x64, 0x70, 0x92, 0x32, 0x70, 0x0e, 0xba, 0xbe, 0xd5, 0x36, 0xbb, 0x04, 0xb9, 0x17, 0xe7, 0xc6, + 0x01, 0xdd, 0x2a, 0x98, 0xbf, 0xcc, 0x92, 0xa5, 0x10, 0x9e, 0x1d, 0x08, 0x21, 0xc7, 0x80, 0xc1, + 0x7f, 0x98, 0xe2, 0xf2, 0x01, 0x4e, 0xaa, 0x1c, 0xcd, 0x09, 0x5e, 0x3e, 0x20, 0xcc, 0x44, 0xf6, + 0x10, 0xbf, 0x8c, 0x06, 0xd5, 0x8c, 0xba, 0xcf, 0x3f, 0x14, 0xc6, 0x76, 0x03, 0xcc, 0x62, 0x2c, + 0xc9, 0x87, 0x74, 0x19, 0x22, 0x41, 0x89, 0xc3, 0x7e, 0x87, 0x5e, 0x97, 0x1e, 0x7e, 0x6b, 0xb0, + 0x74, 0xb4, 0xf3, 0x00, 0x44, 0xaf, 0xd8, 0x4e, 0x3a, 0x17, 0xd7, 0x49, 0x4b, 0x62, 0x9d, 0xf4, + 0x9b, 0x84, 0xc3, 0x1c, 0x0e, 0x66, 0xfb, 0xf0, 0xea, 0x21, 0x16, 0xe0, 0x6e, 0x78, 0xe9, 0xd9, + 0xeb, 0xc5, 0xab, 0xa8, 0x5e, 0x54, 0xf6, 0x7a, 0x5d, 0xab, 0x8d, 0xe6, 0x53, 0x1f, 0x1f, 0xcb, + 0x7c, 0x8a, 0xed, 0x0f, 0xe4, 0xbe, 0xfe, 0xe0, 0x10, 0x96, 0xf4, 0xcd, 0xe0, 0x38, 0x29, 0xa2, + 0x1c, 0xb2, 0x55, 0x20, 0x41, 0xdc, 0xfa, 0x92, 0xf9, 0x88, 0xe2, 0x82, 0x4a, 0x10, 0x0a, 0x61, + 0x84, 0xa5, 0xcf, 0x74, 0xc6, 0x6e, 0x5a, 0x05, 0x89, 0xe3, 0x6c, 0x02, 0x47, 0xb2, 0xf2, 0xc4, + 0xda, 0xdd, 0xc0, 0x37, 0xda, 0x6b, 0x5f, 0xcc, 0x8f, 0x63, 0x44, 0x78, 0x06, 0xf5, 0x34, 0x95, + 0x63, 0x97, 0x34, 0xa2, 0x22, 0xc3, 0x7e, 0xa4, 0x05, 0x1f, 0xf4, 0x57, 0x8f, 0x11, 0xbf, 0x54, + 0xf5, 0x16, 0x70, 0xfc, 0xa2, 0xd9, 0xbe, 0xb4, 0xed, 0x3a, 0x7b, 0xf8, 0xee, 0x6f, 0x87, 0x5e, + 0x22, 0xbe, 0x7a, 0xcc, 0xe8, 0x7f, 0xa1, 0xde, 0x11, 0x98, 0x0e, 0x85, 0x61, 0xa6, 0xc3, 0xea, + 0x31, 0x6a, 0x3c, 0xa8, 0x4f, 0x0c, 0x3b, 0x9d, 0x62, 0x62, 0xa7, 0xb3, 0x7a, 0x2c, 0xe8, 0x76, + 0xd4, 0x0a, 0x98, 0xee, 0x58, 0x97, 0xf1, 0x56, 0x35, 0x9e, 0x75, 0x0d, 0x0b, 0x3a, 0x54, 0xb1, + 0x2e, 0x93, 0x8d, 0xed, 0xd5, 0x63, 0x46, 0xf8, 0xa5, 0xba, 0x02, 0x66, 0xf0, 0xb6, 0x00, 0x26, + 0x33, 0x9d, 0x2a, 0xa0, 0xd0, 0xea, 0x31, 0x23, 0xfa, 0x16, 0x59, 0x1f, 0x79, 0x7c, 0xee, 0xfa, + 0xde, 0x60, 0xbb, 0x3d, 0x97, 0x6a, 0xbb, 0x1d, 0xc9, 0x82, 0x6c, 0xb8, 0x9f, 0x02, 0x85, 0x36, + 0x96, 0xb0, 0x44, 0x25, 0x4c, 0x1e, 0xd5, 0xbb, 0x41, 0x7e, 0xd7, 0x74, 0x83, 0xc9, 0xf3, 0x4d, + 0xc3, 0xe9, 0xae, 0x99, 0xee, 0x25, 0x84, 0x20, 0xfa, 0x6a, 0x69, 0x0a, 0x14, 0xb0, 0xe0, 0xc2, + 0x3f, 0xda, 0xdb, 0xf2, 0xc4, 0x0c, 0x29, 0x3b, 0x36, 0x1a, 0xf6, 0x5b, 0x4e, 0x70, 0x38, 0xfd, + 0xd7, 0x72, 0xe3, 0xb1, 0x20, 0xaf, 0x62, 0xae, 0xfa, 0xb0, 0xad, 0x67, 0xef, 0xc1, 0xfb, 0xe1, + 0x3e, 0x5d, 0x12, 0x1d, 0xf4, 0x4a, 0x3d, 0x03, 0x80, 0x4f, 0x4f, 0xea, 0x85, 0x41, 0x4c, 0x99, + 0x94, 0x68, 0xf9, 0xa0, 0x30, 0xdc, 0x51, 0xe5, 0x77, 0x46, 0x30, 0x5d, 0xfa, 0x05, 0x11, 0x3f, + 0x03, 0xef, 0x5a, 0x36, 0x53, 0xe7, 0xe0, 0x31, 0x65, 0xa7, 0x94, 0xd6, 0xa8, 0x19, 0xc2, 0x5e, + 0xf6, 0x7d, 0xd3, 0x5b, 0xf2, 0xe4, 0xb6, 0x03, 0x72, 0x02, 0x5a, 0x7f, 0xd0, 0xf2, 0x7c, 0xcb, + 0xde, 0xa6, 0xe7, 0x9b, 0x3f, 0x33, 0x16, 0xa5, 0x19, 0x30, 0xe0, 0xc8, 0x03, 0x07, 0x9c, 0x03, + 0x01, 0x82, 0xf2, 0x43, 0x02, 0x04, 0x15, 0xd2, 0xad, 0x1c, 0x7e, 0x84, 0xd5, 0x9f, 0x75, 0x5e, + 0x7f, 0xee, 0x8a, 0x01, 0x68, 0x90, 0x5c, 0xc6, 0x62, 0xdf, 0xbc, 0x2b, 0xd4, 0x94, 0x26, 0xa7, + 0x29, 0xf7, 0x8e, 0xce, 0x48, 0xf6, 0xda, 0xf2, 0xa1, 0x3c, 0xb8, 0x2a, 0x62, 0xa6, 0x0e, 0xaf, + 0x50, 0x45, 0xf9, 0xfd, 0xb1, 0x28, 0x4a, 0x7a, 0x47, 0xe7, 0xac, 0x35, 0xe6, 0xb7, 0x84, 0xcf, + 0xed, 0xf7, 0x03, 0x15, 0xca, 0x26, 0x46, 0x59, 0x4e, 0x81, 0x22, 0xe9, 0x61, 0x28, 0x34, 0xf4, + 0x29, 0x65, 0x77, 0x23, 0x76, 0xda, 0x5f, 0x94, 0xb7, 0x09, 0xe8, 0x0f, 0x5d, 0xd7, 0x68, 0xed, + 0xb9, 0x76, 0xd5, 0xf6, 0x1d, 0xed, 0x07, 0xc7, 0xa2, 0x38, 0xa1, 0x37, 0x9c, 0x3c, 0x8a, 0x37, + 0xdc, 0x48, 0xab, 0x1c, 0x41, 0x0d, 0x8e, 0x64, 0x95, 0x23, 0xa6, 0xf0, 0xec, 0xf1, 0x7b, 0xa7, + 0x0c, 0x4e, 0xd1, 0xc9, 0xd6, 0x12, 0x6f, 0x21, 0x6a, 0x17, 0xc6, 0x01, 0xe4, 0xc9, 0xc0, 0x4c, + 0xa2, 0x7e, 0xf4, 0xf8, 0x81, 0x8f, 0x52, 0x90, 0x78, 0x9b, 0x25, 0x37, 0x1d, 0xec, 0xe3, 0x70, + 0x2c, 0x48, 0x89, 0x5d, 0x62, 0x99, 0x82, 0x8d, 0xec, 0x31, 0x7b, 0xa9, 0x0c, 0x8a, 0x24, 0x46, + 0x82, 0xb6, 0x91, 0x89, 0xc3, 0x04, 0x7f, 0x3f, 0x8b, 0xc0, 0x8e, 0x1c, 0xe1, 0x26, 0xb3, 0xf8, + 0x11, 0x69, 0xf6, 0xe2, 0x06, 0xb2, 0x32, 0x01, 0x17, 0x42, 0x09, 0xcc, 0x36, 0xa1, 0x5f, 0x36, + 0x5d, 0xd7, 0x32, 0xb7, 0xc7, 0xe5, 0xf1, 0x2d, 0xea, 0x3d, 0xac, 0x7d, 0x23, 0x27, 0x7a, 0x96, + 0x3d, 0x5c, 0x08, 0x0f, 0x58, 0x8d, 0x89, 0x02, 0xfe, 0x7a, 0xa1, 0xf3, 0xea, 0xc3, 0xa8, 0x4d, + 0xc0, 0x63, 0x5b, 0x02, 0x53, 0x41, 0x1c, 0x8c, 0xdb, 0xb8, 0xd8, 0x28, 0x3b, 0xfe, 0x6e, 0x70, + 0x0c, 0x06, 0xff, 0x3f, 0x18, 0x7f, 0x41, 0x7b, 0x65, 0x4a, 0x47, 0xf9, 0xe4, 0x20, 0x1e, 0xe9, + 0xda, 0x58, 0x1a, 0x77, 0xf8, 0xa3, 0x0a, 0xdb, 0xf1, 0xcb, 0x53, 0x74, 0x39, 0xb2, 0x66, 0xfa, + 0xf0, 0x41, 0xed, 0x0f, 0x65, 0x30, 0xd5, 0x84, 0x3e, 0x1a, 0x6f, 0x11, 0xfb, 0x87, 0xd6, 0x70, + 0x95, 0x59, 0xf1, 0xa0, 0x67, 0x6b, 0xd5, 0xfb, 0xc0, 0x4c, 0xcf, 0x75, 0xda, 0xd0, 0xf3, 0xe8, + 0xea, 0x05, 0xeb, 0xa8, 0x36, 0x68, 0xf4, 0xc7, 0xac, 0x2d, 0xae, 0x07, 0xdf, 0x18, 0xd1, 0xe7, + 0x69, 0xcd, 0x00, 0x42, 0x89, 0x56, 0x70, 0xd2, 0x66, 0x40, 0x52, 0xe1, 0xd9, 0x03, 0xfd, 0xbb, + 0x32, 0x98, 0x6b, 0x42, 0x3f, 0x94, 0x62, 0x8a, 0x4d, 0x8e, 0x78, 0x78, 0x39, 0x28, 0xe5, 0xc3, + 0x41, 0xf9, 0x4e, 0xe1, 0x4b, 0x61, 0x79, 0x69, 0x86, 0xc4, 0xc6, 0x82, 0xe7, 0x5b, 0x84, 0xee, + 0x82, 0x15, 0xe3, 0x60, 0x02, 0xc7, 0xd7, 0x1e, 0x0b, 0x66, 0x30, 0x2f, 0xb8, 0xc1, 0xfe, 0x68, + 0x3e, 0x6a, 0xbc, 0x5f, 0xc8, 0xa8, 0xf1, 0xde, 0x03, 0x0a, 0xbb, 0xa6, 0x7b, 0x29, 0x38, 0x7c, + 0xfb, 0x38, 0xb1, 0xd5, 0x2f, 0xcf, 0x20, 0x5f, 0x0d, 0xf6, 0xd3, 0x2c, 0xa4, 0xf3, 0xd3, 0x7c, + 0xbd, 0x94, 0x6a, 0x24, 0x24, 0x73, 0x87, 0x31, 0x36, 0xf9, 0x14, 0xe3, 0x66, 0x42, 0xd9, 0xd9, + 0x2b, 0xc7, 0x8b, 0x65, 0x30, 0x8d, 0xc6, 0x6d, 0x6c, 0x8f, 0x9f, 0x3f, 0xbc, 0x3a, 0x0c, 0x36, + 0xf4, 0x53, 0xf6, 0xc0, 0x81, 0x44, 0xc6, 0x67, 0xde, 0xa7, 0xe8, 0x81, 0x93, 0x0a, 0xcf, 0x1e, + 0x8f, 0x77, 0x13, 0x3c, 0x70, 0x7b, 0xd0, 0xde, 0x20, 0x03, 0x79, 0x05, 0xfa, 0x93, 0xb6, 0x22, + 0xdf, 0x2e, 0x1c, 0x5e, 0x94, 0x13, 0x18, 0xe6, 0x79, 0x71, 0x05, 0x8e, 0xa7, 0x01, 0x89, 0xc5, + 0x15, 0x15, 0x62, 0x20, 0x7b, 0xd4, 0xde, 0x4f, 0x50, 0x23, 0x9b, 0x0b, 0x3f, 0x30, 0x86, 0x5e, + 0x75, 0xb2, 0x0b, 0x1f, 0x81, 0x00, 0x31, 0x8d, 0xa3, 0x6a, 0x6f, 0x83, 0x0a, 0xcf, 0x1e, 0xb9, + 0x9f, 0x91, 0xf1, 0x25, 0x66, 0xe5, 0x1d, 0xd8, 0xbe, 0x04, 0x3b, 0xec, 0x45, 0xce, 0xa3, 0x42, + 0x77, 0x1a, 0x4c, 0xb5, 0x09, 0x35, 0x0c, 0xde, 0xb4, 0x11, 0x3c, 0xf2, 0x37, 0x0b, 0x25, 0xde, + 0x9d, 0xc5, 0x77, 0x44, 0xe4, 0xf3, 0xb1, 0xe0, 0x22, 0x76, 0xe1, 0x95, 0x40, 0xf1, 0x13, 0x30, + 0x5b, 0xc8, 0x2c, 0xa3, 0xda, 0x76, 0x6c, 0xed, 0xfb, 0x0f, 0x0f, 0xcb, 0xb5, 0x60, 0xc6, 0x6a, + 0x3b, 0x36, 0x0e, 0x01, 0x17, 0x1c, 0x02, 0x0a, 0x13, 0x82, 0xb7, 0xfa, 0xae, 0xf3, 0x80, 0x45, + 0x77, 0xcd, 0xa3, 0x84, 0x51, 0x8d, 0x09, 0xc4, 0xfa, 0x51, 0x19, 0x13, 0x03, 0xca, 0xce, 0x1e, + 0xb2, 0x4f, 0x44, 0xde, 0x6d, 0xa4, 0x2b, 0x7c, 0x44, 0xac, 0x02, 0x8f, 0x32, 0x9c, 0xb1, 0xb5, + 0x38, 0x92, 0xe1, 0x2c, 0x81, 0x81, 0x09, 0xdc, 0x44, 0x18, 0xe1, 0x98, 0xf9, 0x1a, 0xf0, 0x21, + 0xd0, 0x19, 0x9f, 0x79, 0x38, 0x22, 0x3a, 0x47, 0x63, 0x22, 0x7e, 0x98, 0x86, 0xa7, 0xa7, 0x16, + 0x8f, 0xf6, 0x3f, 0xc6, 0x01, 0xce, 0x5d, 0xa3, 0xf8, 0x2b, 0x10, 0x6f, 0x05, 0xed, 0xad, 0x92, + 0x68, 0x08, 0x94, 0x03, 0x12, 0x44, 0x54, 0xc6, 0x82, 0xe0, 0x9b, 0x84, 0x62, 0x93, 0x88, 0x94, + 0x9f, 0x3d, 0x80, 0x2f, 0x92, 0xc1, 0x02, 0xf6, 0x11, 0xe8, 0x42, 0xd3, 0x25, 0x1d, 0xe5, 0x58, + 0x1c, 0xe5, 0xdf, 0x2d, 0x1c, 0xe0, 0x87, 0x97, 0x43, 0xc4, 0xc7, 0x58, 0xa0, 0x10, 0x8b, 0xee, + 0x23, 0xc8, 0xc2, 0x44, 0xb6, 0x51, 0x94, 0x90, 0x05, 0xaa, 0xe2, 0xe3, 0xc1, 0x23, 0xa5, 0x47, + 0x2e, 0x2f, 0x8c, 0xa0, 0xb1, 0x4d, 0xd8, 0x23, 0x57, 0x84, 0x89, 0xec, 0x31, 0x79, 0xc3, 0xed, + 0x74, 0xc1, 0xb9, 0x65, 0x5e, 0xec, 0x42, 0xed, 0xd5, 0xf9, 0xf0, 0x44, 0xdb, 0xef, 0x8e, 0xc5, + 0x03, 0xf3, 0x10, 0x97, 0x51, 0xa9, 0x20, 0xef, 0x3a, 0x57, 0xc8, 0xd2, 0xd6, 0xbc, 0x81, 0xff, + 0x93, 0x78, 0x96, 0xdd, 0xbd, 0x5d, 0x9b, 0x9c, 0x0c, 0x9d, 0x37, 0x82, 0x47, 0xf5, 0x46, 0x30, + 0x7f, 0xc5, 0xf2, 0x77, 0x56, 0xa1, 0xd9, 0x81, 0xae, 0xe1, 0x5c, 0xc1, 0x1e, 0x73, 0xd3, 0x06, + 0x9f, 0xc8, 0xfb, 0xaf, 0x08, 0xd8, 0x97, 0x48, 0x28, 0x93, 0x39, 0xfe, 0x96, 0xc6, 0xf2, 0x8c, + 0xe7, 0x2a, 0x7b, 0x85, 0xf9, 0x80, 0x0c, 0x66, 0x0c, 0xe7, 0x0a, 0x55, 0x92, 0xff, 0xe3, 0x68, + 0x75, 0x24, 0xf5, 0x44, 0x0f, 0x4b, 0x2e, 0x64, 0x7f, 0xe2, 0x13, 0xbd, 0xc4, 0xe2, 0x27, 0x72, + 0x72, 0x69, 0xce, 0x70, 0xae, 0x34, 0xa1, 0x4f, 0x5a, 0x84, 0xb6, 0x39, 0x26, 0x27, 0x6b, 0xcb, + 0x23, 0x04, 0xe9, 0x3c, 0x3c, 0x7c, 0x4e, 0xbb, 0x8b, 0x10, 0x0a, 0x28, 0x64, 0x71, 0xd2, 0xbb, + 0x08, 0x43, 0x39, 0x98, 0x40, 0x8c, 0x14, 0x19, 0xcc, 0x1a, 0xce, 0x15, 0x34, 0x34, 0x2c, 0x5b, + 0xdd, 0xee, 0x78, 0x46, 0xc8, 0xb4, 0xc6, 0x7f, 0x20, 0x86, 0x80, 0x8b, 0x89, 0x1b, 0xff, 0x43, + 0x18, 0xc8, 0x1e, 0x86, 0xe7, 0x93, 0xc6, 0x12, 0x8c, 0xd0, 0xf6, 0x78, 0x70, 0x18, 0xb5, 0x41, + 0x84, 0x6c, 0x1c, 0x59, 0x83, 0x88, 0xe3, 0x60, 0x22, 0x3b, 0x27, 0x0b, 0x65, 0x3c, 0xcc, 0x8f, + 0xb7, 0x4d, 0xbc, 0x37, 0x9d, 0x6b, 0x22, 0x1d, 0x76, 0x39, 0x46, 0xc6, 0x82, 0x46, 0x0a, 0x17, + 0x44, 0x01, 0x1e, 0xb2, 0xc7, 0xe3, 0xa3, 0x32, 0x98, 0x23, 0x2c, 0x3c, 0x42, 0xac, 0x80, 0x91, + 0x1a, 0x15, 0x5b, 0x83, 0xa3, 0x69, 0x54, 0x09, 0x1c, 0x4c, 0xe4, 0x3e, 0x7f, 0x64, 0xc7, 0x8d, + 0x70, 0x7c, 0x3c, 0x0e, 0xc1, 0x91, 0x8d, 0xb1, 0x31, 0x1e, 0x21, 0x1f, 0xc5, 0x18, 0x3b, 0xa2, + 0x63, 0xe4, 0xcf, 0x0f, 0x5b, 0xd1, 0x38, 0x31, 0x38, 0x44, 0x53, 0x18, 0x23, 0x0c, 0x23, 0x36, + 0x85, 0x23, 0x42, 0xe2, 0x4f, 0x65, 0x00, 0x08, 0x03, 0x6b, 0xce, 0x65, 0x7c, 0x91, 0xe6, 0x18, + 0xba, 0xb3, 0x7e, 0xb7, 0x7a, 0x79, 0x88, 0x5b, 0x7d, 0xca, 0x10, 0x2e, 0x69, 0x57, 0x02, 0x19, + 0x29, 0xa3, 0x4a, 0x4e, 0x7c, 0x25, 0x30, 0xb9, 0xfc, 0xec, 0x31, 0xfe, 0x32, 0xb1, 0xe6, 0xa2, + 0x03, 0xa6, 0x3f, 0x3b, 0x16, 0x94, 0x99, 0xd9, 0xbf, 0xcc, 0xcf, 0xfe, 0x0f, 0x81, 0xed, 0xa8, + 0x36, 0xe2, 0xb0, 0x83, 0xa3, 0xd9, 0xdb, 0x88, 0x47, 0x77, 0x40, 0xf4, 0x07, 0xf2, 0xe0, 0x38, + 0xed, 0x44, 0xbe, 0x1d, 0x20, 0x4e, 0x79, 0x0e, 0x8f, 0xeb, 0x24, 0x87, 0xa0, 0x3c, 0xae, 0x05, + 0xa9, 0x34, 0x4b, 0x99, 0x02, 0xec, 0x4d, 0x64, 0x75, 0xa3, 0xa8, 0x3f, 0xd8, 0x33, 0xed, 0x8e, + 0x78, 0xb8, 0xdf, 0x21, 0xc0, 0x07, 0x6b, 0x8d, 0x32, 0xbf, 0xd6, 0x38, 0x60, 0x65, 0x32, 0xf5, + 0xce, 0x35, 0x16, 0x19, 0x61, 0x77, 0xe2, 0x3b, 0xd7, 0xf1, 0x65, 0x67, 0x8f, 0xd2, 0x7b, 0x65, + 0x90, 0x6f, 0x3a, 0xae, 0xaf, 0xbd, 0x20, 0x4d, 0xeb, 0x24, 0x92, 0x8f, 0x40, 0x0a, 0x9e, 0xd5, + 0x32, 0xc8, 0xa3, 0xca, 0xd1, 0x19, 0xc3, 0x6d, 0xc9, 0x47, 0x9d, 0x4d, 0xdf, 0xc4, 0x5e, 0xdd, + 0xa8, 0xfc, 0xc5, 0xd6, 0x7e, 0x0f, 0x1a, 0xf8, 0xe3, 0xb4, 0xf1, 0x74, 0x88, 0xfc, 0x9a, 0xf1, + 0x07, 0x30, 0x32, 0x8b, 0xa7, 0x13, 0x5b, 0x72, 0xf6, 0xb8, 0x3d, 0x7c, 0x9c, 0xfa, 0xb6, 0x2e, + 0x5b, 0x5d, 0xa8, 0xbd, 0x80, 0xb8, 0x8c, 0xd4, 0xcd, 0x5d, 0x28, 0x7e, 0x24, 0x26, 0xd1, 0xb5, + 0x15, 0xc7, 0x97, 0x95, 0xa3, 0xf8, 0xb2, 0x69, 0x1b, 0x14, 0x39, 0x80, 0x4e, 0x58, 0x9a, 0x74, + 0x83, 0x4a, 0x28, 0x7b, 0x22, 0x71, 0x3a, 0x4f, 0x34, 0xa1, 0x4f, 0x8c, 0xca, 0x46, 0x70, 0x45, + 0xd2, 0xf7, 0x8e, 0x25, 0x62, 0x67, 0x78, 0xa1, 0x8e, 0xdc, 0x77, 0x03, 0xd3, 0x07, 0x58, 0x70, + 0xd6, 0x78, 0x70, 0xbe, 0x3b, 0x5e, 0x40, 0x3c, 0x93, 0x63, 0x81, 0xe9, 0xed, 0x21, 0x4c, 0xeb, + 0x1c, 0x4c, 0x77, 0x8f, 0xc8, 0x45, 0xf6, 0x80, 0xfd, 0x78, 0x01, 0x1c, 0x27, 0x93, 0xfe, 0x92, + 0xdd, 0xa1, 0x11, 0x56, 0xdf, 0x2c, 0x1d, 0xf1, 0x66, 0xdb, 0xc1, 0x10, 0xac, 0x5c, 0x2c, 0xe7, + 0x42, 0x5f, 0x2c, 0x67, 0x75, 0x89, 0x84, 0x73, 0x45, 0x9d, 0x28, 0xde, 0x69, 0x1b, 0x16, 0x66, + 0x02, 0xcb, 0x1e, 0x77, 0xb9, 0xe1, 0x77, 0xfc, 0x3d, 0xa2, 0x53, 0xe2, 0xf7, 0x88, 0xfe, 0x76, + 0xba, 0x75, 0x3b, 0x5c, 0x74, 0x9f, 0xc0, 0x33, 0xb6, 0x9d, 0x52, 0xac, 0xe8, 0x09, 0x70, 0xf7, + 0x5f, 0xc3, 0x9d, 0x2c, 0x8a, 0x20, 0x32, 0xa2, 0x3b, 0x19, 0x26, 0x70, 0x94, 0xee, 0x64, 0xc3, + 0x18, 0xc8, 0x1e, 0xc7, 0xdf, 0x2e, 0xd0, 0xdd, 0x7c, 0xdc, 0x6e, 0xb4, 0x3f, 0x96, 0x32, 0x1f, + 0xa5, 0xbf, 0x99, 0x4b, 0xe5, 0xff, 0x8c, 0xf9, 0x4a, 0x1e, 0xa6, 0xd3, 0x78, 0x34, 0x27, 0x91, + 0x9b, 0xc0, 0xba, 0x91, 0x84, 0x7d, 0xd1, 0xcf, 0x5b, 0x1d, 0x7f, 0x67, 0x4c, 0x27, 0x3a, 0xae, + 0x20, 0x5a, 0x34, 0x5e, 0x3d, 0x79, 0xd0, 0xfe, 0x35, 0x97, 0x2a, 0x84, 0x54, 0x28, 0x12, 0xcc, + 0x56, 0x8c, 0x88, 0x53, 0x04, 0x7e, 0x4a, 0xa4, 0x37, 0x41, 0x8d, 0x3e, 0x67, 0x75, 0xa0, 0xf3, + 0x08, 0xd4, 0x68, 0xcc, 0xd7, 0xf8, 0x34, 0x3a, 0x89, 0xdc, 0x7f, 0x51, 0x8d, 0x0e, 0x45, 0x32, + 0x26, 0x8d, 0x4e, 0xa4, 0x97, 0xbd, 0x8c, 0x5f, 0x39, 0x47, 0x27, 0x52, 0x35, 0xcb, 0xbe, 0xa4, + 0xfd, 0x53, 0x11, 0x28, 0x41, 0x1c, 0x61, 0x7f, 0x87, 0xc6, 0x82, 0xf9, 0x90, 0xf0, 0xdd, 0x28, + 0x23, 0xc4, 0x7b, 0xe1, 0xc3, 0x49, 0x15, 0x0e, 0x84, 0x93, 0x2a, 0x81, 0x79, 0xcb, 0xf6, 0xa1, + 0x6b, 0x9b, 0xdd, 0xe5, 0xae, 0xb9, 0xed, 0x9d, 0x9e, 0x1a, 0x78, 0x79, 0x5d, 0x95, 0xc9, 0x63, + 0xf0, 0x5f, 0xb0, 0x17, 0x88, 0x4e, 0xf3, 0x17, 0x88, 0xc6, 0x44, 0xbf, 0x9a, 0x89, 0x8f, 0x7e, + 0x15, 0x46, 0xb7, 0x02, 0xc3, 0x83, 0x63, 0x8b, 0xda, 0xc6, 0x29, 0xc3, 0xfd, 0xdd, 0x26, 0x18, + 0x85, 0x2d, 0x0c, 0xfd, 0xf8, 0x1a, 0x39, 0xd5, 0xea, 0x1e, 0x52, 0x84, 0xc5, 0x7e, 0x25, 0x48, + 0x6d, 0xa1, 0xb2, 0x95, 0x97, 0xfb, 0x2a, 0x1f, 0x9a, 0x3c, 0x79, 0x01, 0x93, 0x87, 0x55, 0xaa, + 0x82, 0xe8, 0x9d, 0xae, 0xe2, 0x8b, 0x85, 0x22, 0xb5, 0x9d, 0xc0, 0x69, 0xa4, 0x02, 0x38, 0x11, + 0x44, 0xbb, 0xed, 0xf5, 0xa0, 0xe9, 0x9a, 0x76, 0x1b, 0x6a, 0x9f, 0x90, 0xc6, 0x61, 0xf6, 0x2e, + 0x83, 0x69, 0xab, 0xed, 0xd8, 0x4d, 0xeb, 0x39, 0xc1, 0xe5, 0x72, 0xc9, 0x41, 0xd6, 0xb1, 0x44, + 0xaa, 0xf4, 0x0b, 0x23, 0xfc, 0x56, 0xad, 0x82, 0x99, 0xb6, 0xe9, 0x76, 0x48, 0x10, 0xbe, 0x42, + 0xdf, 0x45, 0x4e, 0xb1, 0x84, 0xca, 0xc1, 0x27, 0x46, 0xf4, 0xb5, 0xda, 0xe0, 0x85, 0x58, 0xec, + 0x8b, 0xe6, 0x11, 0x4b, 0xac, 0x12, 0x7d, 0xc4, 0xc9, 0x1c, 0x49, 0xc7, 0x85, 0x5d, 0x93, 0x5c, + 0x3a, 0x3e, 0x45, 0xee, 0x88, 0x0e, 0x13, 0xd2, 0x2e, 0x0f, 0xe0, 0xa2, 0x0e, 0xa0, 0x31, 0xe9, + 0xe5, 0x01, 0x21, 0x2e, 0xb2, 0xd7, 0xcc, 0x77, 0x15, 0xc1, 0x3c, 0xe9, 0xd5, 0xa8, 0x38, 0xb5, + 0x17, 0xc9, 0xa0, 0xd8, 0x84, 0xfe, 0xfd, 0x70, 0x5f, 0x6b, 0x1e, 0x7e, 0x4c, 0x56, 0x80, 0x7c, + 0x29, 0x0c, 0x38, 0x88, 0xfe, 0xa6, 0xdd, 0xb7, 0x0f, 0xf8, 0x5a, 0x24, 0x3c, 0x4d, 0x7a, 0xdf, + 0x3e, 0xb9, 0xf8, 0xec, 0xf1, 0xf9, 0x09, 0x19, 0xc8, 0xa5, 0x4e, 0x47, 0x6b, 0x1f, 0x1e, 0x8a, + 0xeb, 0xc1, 0x6c, 0xd0, 0x66, 0xa2, 0x18, 0x90, 0x6c, 0x52, 0xda, 0x45, 0xd0, 0x50, 0x36, 0xa5, + 0xce, 0xc4, 0x77, 0x15, 0x12, 0xca, 0xce, 0x1e, 0x94, 0x2f, 0x4c, 0xd1, 0x46, 0xb3, 0xe4, 0x38, + 0x97, 0xf0, 0x51, 0x99, 0x5f, 0x94, 0x41, 0x61, 0x19, 0xfa, 0xed, 0x1d, 0xcd, 0x1b, 0x4b, 0x9b, + 0xe9, 0xbb, 0xf7, 0x7c, 0x48, 0x50, 0xce, 0xb4, 0xd1, 0x9f, 0x03, 0xb6, 0x17, 0x31, 0xcb, 0x93, + 0x8e, 0xfe, 0x9c, 0x58, 0xfa, 0x04, 0x0e, 0xc1, 0xe5, 0xc1, 0x42, 0xb8, 0x02, 0x46, 0x30, 0x7b, + 0x47, 0xee, 0x11, 0xb7, 0x1e, 0x3a, 0xc4, 0x6e, 0xd6, 0x7e, 0x3f, 0x5d, 0x88, 0xb5, 0x50, 0xe6, + 0x7c, 0xcd, 0x33, 0x5e, 0x98, 0x4c, 0x11, 0x7c, 0x4d, 0x8c, 0xc1, 0x09, 0xac, 0x00, 0xc8, 0x60, + 0x1a, 0x33, 0x54, 0xb1, 0x2e, 0x63, 0xd7, 0x43, 0x6e, 0xa1, 0xf2, 0xb9, 0x63, 0x59, 0xa8, 0xbc, + 0x9b, 0x5f, 0xa8, 0x14, 0x8c, 0x98, 0x1c, 0xac, 0x53, 0xa6, 0xf4, 0xc5, 0x41, 0xdf, 0x8f, 0x7d, + 0x99, 0x32, 0x85, 0x2f, 0xce, 0x90, 0xf2, 0xb3, 0x47, 0xf4, 0x8d, 0xff, 0x9d, 0x76, 0xd6, 0xc1, + 0x86, 0xac, 0xf6, 0xbf, 0x4e, 0x80, 0xfc, 0x39, 0xf4, 0xe7, 0x1f, 0xa3, 0x1b, 0xb5, 0x5e, 0x3e, + 0x86, 0xe0, 0x0e, 0x4f, 0x07, 0x79, 0x44, 0x9f, 0x4e, 0x7b, 0x6e, 0x11, 0xdb, 0x1d, 0x46, 0x8c, + 0x18, 0xf8, 0x3b, 0xf5, 0x14, 0x28, 0x7a, 0xce, 0x9e, 0xdb, 0x46, 0xe6, 0x37, 0xd2, 0x18, 0xfa, + 0x94, 0x36, 0xa8, 0x29, 0x47, 0x7a, 0x71, 0x7c, 0x2e, 0xa7, 0xcc, 0x05, 0x4b, 0x32, 0x77, 0xc1, + 0x52, 0x8a, 0xfd, 0x07, 0x01, 0xde, 0xb2, 0xd7, 0x88, 0x3f, 0xc6, 0x77, 0x0d, 0x76, 0xc6, 0x05, + 0x7b, 0x8c, 0x58, 0x0e, 0xab, 0x0e, 0x69, 0x1d, 0xc6, 0x79, 0xd1, 0x86, 0x71, 0xe4, 0x27, 0xea, + 0x30, 0x2e, 0xc0, 0xc3, 0x44, 0x4e, 0xb9, 0x17, 0xa9, 0x93, 0xeb, 0x85, 0x71, 0xa2, 0x9b, 0xe7, + 0x94, 0xfe, 0x50, 0xe8, 0x8c, 0xd1, 0xf9, 0x75, 0x64, 0x74, 0x8e, 0xc8, 0xfd, 0xf5, 0xd7, 0x65, + 0x1c, 0x49, 0x33, 0x30, 0x82, 0xc4, 0x2f, 0x4a, 0x4a, 0x0d, 0x11, 0x1a, 0x83, 0xb9, 0x38, 0xd2, + 0xf3, 0xa3, 0x87, 0x16, 0xe7, 0x45, 0xc7, 0xf0, 0x3f, 0xe9, 0xd0, 0xe2, 0xa2, 0x8c, 0x64, 0x0f, + 0xe4, 0x2f, 0x90, 0x8b, 0xc9, 0x4a, 0x6d, 0xdf, 0xba, 0x3c, 0xe6, 0x96, 0xc6, 0x0f, 0x2f, 0x29, + 0xa3, 0x09, 0x1f, 0x90, 0x10, 0xe1, 0x70, 0xd2, 0xd1, 0x84, 0xc5, 0xd8, 0xc8, 0x1e, 0xa6, 0x1f, + 0x03, 0x48, 0x7a, 0x74, 0x6d, 0xe7, 0x0d, 0x32, 0x90, 0x9b, 0xd0, 0xd7, 0xe0, 0xe1, 0xd1, 0x3a, + 0x0b, 0xe6, 0x98, 0xa5, 0x83, 0xe0, 0xc2, 0x1b, 0x2e, 0x2d, 0xed, 0x41, 0xf9, 0x50, 0x64, 0xec, + 0xa2, 0xcb, 0xa4, 0x0f, 0xca, 0x8b, 0x30, 0x31, 0x81, 0x83, 0xf2, 0x74, 0xd9, 0xe7, 0xdb, 0x05, + 0xa8, 0x71, 0xad, 0x00, 0x1d, 0x0a, 0xa8, 0xa3, 0x58, 0x0a, 0x7a, 0x7b, 0x64, 0x6c, 0x4c, 0x08, + 0xab, 0x0f, 0xb1, 0x58, 0x35, 0x78, 0xac, 0xee, 0x14, 0x11, 0x93, 0x98, 0xf1, 0x21, 0x34, 0xc1, + 0x7f, 0x67, 0x08, 0x97, 0xc1, 0xc1, 0xf5, 0xf4, 0x91, 0xf9, 0xc8, 0x1e, 0xb1, 0x9f, 0x23, 0xe3, + 0x56, 0x93, 0xcc, 0xad, 0xc6, 0x33, 0x6e, 0xd1, 0x69, 0x9b, 0xcc, 0x4d, 0xdb, 0x52, 0x1e, 0xac, + 0x88, 0xfc, 0x85, 0x03, 0xe6, 0x86, 0x41, 0x94, 0x1f, 0xf3, 0xc1, 0x8a, 0xa1, 0x1c, 0x64, 0x0f, + 0xce, 0xd7, 0x64, 0x00, 0x56, 0x5c, 0x67, 0xaf, 0xd7, 0x70, 0x3b, 0xd0, 0xd5, 0xfe, 0x2c, 0x9a, + 0xa9, 0xfd, 0xe4, 0x18, 0x66, 0x6a, 0xeb, 0x00, 0x6c, 0x87, 0xc4, 0xa9, 0x86, 0xdf, 0x2e, 0x36, + 0x2f, 0x8b, 0x98, 0x32, 0x18, 0x1a, 0xfc, 0xdd, 0xc2, 0xcf, 0xe4, 0x31, 0x4e, 0xea, 0xb3, 0x22, + 0x72, 0xe3, 0x9c, 0xa9, 0xbd, 0x3b, 0xc4, 0xba, 0xc5, 0x61, 0xfd, 0x8c, 0x43, 0x70, 0x92, 0x3d, + 0xe6, 0xff, 0x30, 0x05, 0x66, 0xc9, 0xbe, 0x2c, 0x91, 0xe9, 0xdf, 0x44, 0xa0, 0xff, 0xec, 0x18, + 0x40, 0xdf, 0x00, 0x73, 0x4e, 0x44, 0x9d, 0xf4, 0xa9, 0xec, 0x4a, 0x59, 0x22, 0xec, 0x0c, 0x5f, + 0x06, 0x47, 0x46, 0xfb, 0x18, 0x8b, 0xbc, 0xc1, 0x23, 0x7f, 0x77, 0x82, 0xbc, 0x19, 0x8a, 0xe3, + 0x84, 0xfe, 0x3d, 0x21, 0xf4, 0x1b, 0x1c, 0xf4, 0xa5, 0xc3, 0xb0, 0x32, 0x81, 0x7b, 0x15, 0x64, + 0x90, 0xc7, 0xc7, 0x20, 0xdf, 0x92, 0xe1, 0x42, 0xcc, 0x69, 0x30, 0x85, 0x9b, 0x6c, 0x38, 0x41, + 0x0c, 0x1e, 0xd1, 0x1b, 0x73, 0xcb, 0x87, 0x6e, 0xb8, 0xc4, 0x1e, 0x3c, 0x22, 0x1e, 0x02, 0xf7, + 0x73, 0xef, 0x74, 0x91, 0xec, 0x38, 0x87, 0x09, 0x23, 0xcf, 0x1e, 0x59, 0x89, 0x8f, 0xed, 0x60, + 0xe4, 0x28, 0xb3, 0xc7, 0x21, 0x8c, 0x64, 0x0f, 0xfc, 0x17, 0xf3, 0xe0, 0x34, 0x59, 0xfe, 0x5b, + 0x76, 0x9d, 0xdd, 0xbe, 0x6b, 0xcc, 0xac, 0xc3, 0xeb, 0xc2, 0x4d, 0x60, 0xc1, 0xe7, 0x1c, 0xef, + 0xa9, 0x4e, 0xf4, 0xa5, 0x6a, 0xbf, 0xc3, 0x3a, 0xcf, 0x3c, 0x8b, 0x47, 0x72, 0x29, 0x41, 0x80, + 0x71, 0xbc, 0xa7, 0xde, 0x51, 0x11, 0x64, 0x94, 0x59, 0x4d, 0x94, 0x47, 0x5a, 0x5c, 0x0e, 0x75, + 0xaa, 0x20, 0xa2, 0x53, 0x1f, 0x0c, 0x75, 0xea, 0xbf, 0x71, 0x3a, 0xb5, 0x72, 0x78, 0x91, 0x4c, + 0x60, 0x89, 0x69, 0x01, 0x14, 0x97, 0xad, 0xae, 0x0f, 0x5d, 0xed, 0xcb, 0x74, 0x1e, 0xf5, 0xea, + 0x0c, 0xbb, 0x97, 0x0a, 0x28, 0x6e, 0xe1, 0xd2, 0xa8, 0x41, 0x76, 0xab, 0x18, 0x36, 0x84, 0x43, + 0x83, 0x7e, 0x9b, 0x36, 0xc8, 0x5f, 0x1f, 0x99, 0xb1, 0x4d, 0xc0, 0x52, 0x04, 0xf9, 0x1b, 0xce, + 0xc2, 0x44, 0xee, 0xb7, 0x2a, 0x1a, 0x70, 0x17, 0x8d, 0x20, 0x97, 0xb2, 0x43, 0x58, 0x01, 0xb2, + 0xd5, 0xf1, 0x70, 0xd3, 0x9b, 0x31, 0xd0, 0xdf, 0xb4, 0x2e, 0x47, 0xfd, 0xa2, 0x22, 0x2c, 0x4f, + 0xda, 0xe5, 0x48, 0x88, 0x8b, 0xec, 0x31, 0xfb, 0x26, 0xf6, 0x37, 0xed, 0x75, 0xcd, 0x36, 0x44, + 0xdc, 0x67, 0x86, 0xda, 0x02, 0x90, 0xac, 0x60, 0xc4, 0x97, 0x2c, 0xb6, 0x9d, 0x16, 0x0e, 0xd1, + 0x4e, 0x47, 0x5d, 0x8d, 0x0c, 0x65, 0x8e, 0x2b, 0x7e, 0x64, 0xab, 0x91, 0x89, 0x6c, 0x4c, 0xe0, + 0xf6, 0xd2, 0xe0, 0x3c, 0xee, 0x44, 0x5b, 0xeb, 0xa8, 0x7b, 0x35, 0x54, 0x58, 0x63, 0x3b, 0x7b, + 0x3b, 0xca, 0x5e, 0x4d, 0x3c, 0x0f, 0x13, 0x40, 0x6b, 0x81, 0xa2, 0xf5, 0x79, 0x3a, 0x8c, 0x66, + 0xbc, 0x5d, 0xea, 0x39, 0xae, 0x9f, 0x6e, 0xbb, 0x14, 0x71, 0x67, 0xe0, 0xef, 0xd2, 0x9e, 0xdf, + 0xe2, 0x8f, 0x67, 0x8f, 0x6b, 0xf8, 0x4c, 0x71, 0x7e, 0x6b, 0x18, 0x03, 0xd9, 0xc3, 0xfb, 0xd6, + 0x23, 0x1a, 0x3c, 0x47, 0x6d, 0x8e, 0xb4, 0x0d, 0x8c, 0x6d, 0xe8, 0x1c, 0xa5, 0x39, 0xc6, 0xf3, + 0x90, 0x3d, 0x5e, 0x7f, 0xcf, 0x0c, 0x9c, 0x6f, 0x9a, 0xe0, 0xc0, 0x19, 0xb4, 0xcc, 0xc2, 0x88, + 0x2d, 0x73, 0xd4, 0xdd, 0x05, 0x2a, 0xeb, 0xf1, 0x0d, 0x98, 0xa3, 0xec, 0x2e, 0x24, 0x30, 0x91, + 0x3d, 0xe2, 0x6f, 0x96, 0x41, 0xa1, 0x39, 0xf9, 0xf1, 0x72, 0xd4, 0xb9, 0x08, 0x96, 0x55, 0x73, + 0x6c, 0xc3, 0xe5, 0x28, 0x73, 0x91, 0x58, 0x16, 0x26, 0x10, 0xbf, 0xff, 0x38, 0x98, 0xc3, 0x13, + 0xee, 0x60, 0xb7, 0xf5, 0xef, 0xe9, 0xa8, 0xf9, 0xfa, 0x0c, 0xdb, 0xea, 0x7d, 0x60, 0x3a, 0xd8, + 0x1d, 0xa2, 0x23, 0xe7, 0xa2, 0x58, 0xfb, 0x0c, 0xb8, 0x34, 0xc2, 0xef, 0x0f, 0xe5, 0x13, 0x31, + 0xf6, 0x9d, 0xc0, 0x51, 0x7d, 0x22, 0x8e, 0x74, 0x37, 0xf0, 0xb7, 0xa3, 0x11, 0xf5, 0xfb, 0xb3, + 0xc3, 0xbc, 0x7f, 0x97, 0x30, 0x3f, 0x60, 0x97, 0xf0, 0x13, 0x2c, 0x96, 0x4d, 0x1e, 0xcb, 0x7b, + 0x44, 0x45, 0x38, 0xc6, 0xb1, 0xf6, 0xbd, 0x21, 0x9c, 0xe7, 0x38, 0x38, 0x97, 0x0e, 0xc5, 0xcb, + 0x04, 0xce, 0x4f, 0xe6, 0xa3, 0x31, 0xf7, 0x93, 0x19, 0xb6, 0xe3, 0xbe, 0xc3, 0x19, 0xf9, 0x03, + 0x87, 0x33, 0xb8, 0x96, 0x5e, 0x38, 0x64, 0x4b, 0xff, 0x24, 0xab, 0x1d, 0x2d, 0x5e, 0x3b, 0x9e, + 0x2e, 0x8e, 0xc8, 0xf8, 0x46, 0xe6, 0xf7, 0x85, 0xea, 0x71, 0x9e, 0x53, 0x8f, 0xf2, 0xe1, 0x98, + 0xc9, 0x5e, 0x3f, 0x7e, 0x23, 0x98, 0xd0, 0x1e, 0x71, 0x7b, 0x1f, 0x75, 0x23, 0x92, 0x13, 0xe2, + 0xd8, 0x46, 0xee, 0x51, 0x36, 0x22, 0x87, 0x71, 0x32, 0x81, 0x90, 0x6e, 0xf3, 0x60, 0x16, 0xf3, + 0x74, 0xde, 0xea, 0x6c, 0x43, 0x5f, 0x7b, 0x0d, 0x71, 0x55, 0x0c, 0x02, 0x68, 0x8e, 0x29, 0xca, + 0x51, 0xdc, 0xb1, 0xd9, 0xb4, 0xfe, 0x02, 0x84, 0xc9, 0x45, 0x86, 0xc1, 0x49, 0x07, 0x62, 0x1c, + 0xca, 0x41, 0xf6, 0x90, 0x7d, 0x8c, 0x38, 0x73, 0xd4, 0xcc, 0x7d, 0x67, 0xcf, 0xd7, 0x1e, 0x1a, + 0x43, 0x07, 0xbd, 0x04, 0x8a, 0x5d, 0x4c, 0x8d, 0x9e, 0xce, 0x48, 0x9e, 0xee, 0x50, 0x11, 0x90, + 0xf2, 0x0d, 0xfa, 0x65, 0xda, 0x23, 0x1a, 0x91, 0x1c, 0x09, 0x9d, 0x49, 0x1f, 0xd1, 0x18, 0x52, + 0xfe, 0x44, 0xae, 0xea, 0x99, 0x46, 0xa5, 0x5b, 0xbb, 0x96, 0x3f, 0xa6, 0x40, 0x10, 0x5d, 0x44, + 0x2b, 0x08, 0x04, 0x81, 0x1f, 0xd2, 0x1e, 0x3c, 0x65, 0xa4, 0x82, 0x3e, 0x9f, 0xf4, 0xc1, 0xd3, + 0xe4, 0xe2, 0xb3, 0xc7, 0xe4, 0xa7, 0x49, 0xcb, 0x3a, 0x47, 0x7c, 0x70, 0x33, 0x74, 0xef, 0x1d, + 0xb9, 0xb1, 0x10, 0xd6, 0x8e, 0xae, 0xb1, 0x0c, 0x2c, 0x3f, 0x7b, 0x60, 0x7e, 0xf1, 0x3b, 0x41, + 0xa1, 0x02, 0x2f, 0xee, 0x6d, 0x6b, 0x77, 0x83, 0xe9, 0x96, 0x0b, 0x61, 0xd5, 0xde, 0x72, 0x90, + 0x74, 0x7d, 0xf4, 0x3f, 0x80, 0x84, 0x3e, 0x21, 0x3c, 0x76, 0xa0, 0xd9, 0x89, 0x8e, 0xa1, 0x05, + 0x8f, 0xda, 0xcb, 0x25, 0x90, 0x6f, 0xfa, 0xa6, 0xaf, 0xcd, 0x84, 0xd8, 0x6a, 0x0f, 0xb1, 0x58, + 0xdc, 0xcd, 0x63, 0x71, 0x13, 0x27, 0x0b, 0xcc, 0xc1, 0x22, 0xfa, 0x3e, 0x06, 0x00, 0x0d, 0x4c, + 0x3f, 0xe0, 0x39, 0x36, 0xca, 0x11, 0x9c, 0x94, 0x0c, 0x9e, 0xb5, 0x57, 0x85, 0xe2, 0xbe, 0x97, + 0x13, 0xf7, 0xe3, 0xc5, 0x8a, 0x98, 0xc0, 0x4a, 0x9b, 0x04, 0x66, 0x90, 0x68, 0x57, 0xa1, 0xd9, + 0xf1, 0xb4, 0xef, 0x88, 0x94, 0x3f, 0x46, 0xcc, 0xda, 0x87, 0x85, 0x63, 0x7a, 0x92, 0x5a, 0x85, + 0xc4, 0xe3, 0xfd, 0x05, 0x82, 0x98, 0x26, 0x12, 0x1f, 0xd3, 0xe4, 0x36, 0x90, 0xb7, 0xec, 0x2d, + 0x87, 0x7a, 0xaf, 0x3d, 0x3a, 0x86, 0x36, 0xd2, 0x09, 0x03, 0x67, 0x14, 0x0c, 0xf8, 0x99, 0xcc, + 0xd6, 0x44, 0xee, 0xce, 0xcb, 0xa3, 0xd2, 0xb5, 0xff, 0xff, 0x50, 0x61, 0xab, 0x2a, 0xc8, 0xf7, + 0x4c, 0x7f, 0x87, 0x16, 0x8d, 0xff, 0x23, 0x1b, 0x79, 0xcf, 0x36, 0x6d, 0xc7, 0xde, 0xdf, 0xb5, + 0x9e, 0x13, 0x5e, 0xd1, 0xcb, 0xa5, 0x21, 0xce, 0xb7, 0xa1, 0x0d, 0x5d, 0xd3, 0x87, 0xcd, 0xcb, + 0xdb, 0x78, 0x8e, 0x35, 0x6d, 0xb0, 0x49, 0xa9, 0xf5, 0x1f, 0x71, 0x1c, 0xaf, 0xff, 0x5b, 0x56, + 0x17, 0xe2, 0x80, 0x4f, 0x54, 0xff, 0x83, 0xe7, 0x54, 0xfa, 0x3f, 0xa0, 0x88, 0xec, 0xd1, 0xf8, + 0x37, 0x09, 0xcc, 0x35, 0x91, 0xc2, 0x35, 0xf7, 0x76, 0x77, 0x4d, 0x77, 0x5f, 0xbb, 0x21, 0x42, + 0x85, 0x51, 0xcd, 0x1c, 0xa7, 0x9a, 0xda, 0xaf, 0x0b, 0xdf, 0x4e, 0x4d, 0x9b, 0x36, 0x53, 0x42, + 0xea, 0x76, 0xf0, 0x44, 0x50, 0x40, 0xea, 0x1d, 0xf8, 0xf3, 0x25, 0x36, 0x04, 0x92, 0x53, 0x30, + 0x30, 0xd6, 0x50, 0xde, 0x26, 0x10, 0x94, 0x43, 0x02, 0xc7, 0x9b, 0xbe, 0xd9, 0xbe, 0xb4, 0xe2, + 0xb8, 0xce, 0x9e, 0x6f, 0xd9, 0xd0, 0xd3, 0x1e, 0x13, 0x21, 0x10, 0xe8, 0x7f, 0x2e, 0xd2, 0x7f, + 0xed, 0x3f, 0x72, 0xa2, 0xa3, 0x68, 0xd8, 0xad, 0xb2, 0xe4, 0x63, 0xe2, 0x5c, 0x89, 0x8d, 0x8b, + 0x22, 0x14, 0xb3, 0x17, 0xda, 0x9b, 0x64, 0xa0, 0xe8, 0x0f, 0xf6, 0x1c, 0xd7, 0xaf, 0x39, 0x6d, + 0xb3, 0xeb, 0xf9, 0x8e, 0x0b, 0xb5, 0x46, 0xa2, 0xd4, 0x50, 0x0f, 0xd3, 0x71, 0xda, 0xd1, 0xe0, + 0x48, 0x9f, 0x58, 0xb5, 0x93, 0x79, 0x1d, 0xff, 0x98, 0xf0, 0x2e, 0x23, 0x91, 0x4a, 0x3f, 0x47, + 0x31, 0x7a, 0x3e, 0xa8, 0x4b, 0x4b, 0xe7, 0x8a, 0x2f, 0xb6, 0xf3, 0x28, 0xc4, 0xd4, 0x04, 0x96, + 0xca, 0x25, 0x30, 0xdf, 0xdc, 0xbb, 0x18, 0x12, 0xf1, 0x58, 0x23, 0xe4, 0xb5, 0xc2, 0xc1, 0x2c, + 0xa8, 0xe2, 0xb1, 0x84, 0x62, 0xe4, 0x7b, 0x23, 0x98, 0xf7, 0xd8, 0x6c, 0x14, 0x6f, 0x3e, 0x51, + 0x30, 0x88, 0xc5, 0xf0, 0x52, 0xb3, 0x17, 0xe0, 0xfb, 0x24, 0x30, 0xdf, 0xe8, 0x41, 0x1b, 0x76, + 0x88, 0x8f, 0x1d, 0x27, 0xc0, 0x97, 0xa7, 0x14, 0x20, 0x47, 0x28, 0x46, 0x80, 0x91, 0x3f, 0x6c, + 0x25, 0x10, 0x5e, 0x94, 0x90, 0x4a, 0x70, 0x49, 0xa5, 0x65, 0x2f, 0xb8, 0x2f, 0x49, 0x60, 0xd6, + 0xd8, 0xb3, 0xd7, 0x5d, 0x07, 0x8d, 0xc6, 0xae, 0x76, 0x4f, 0xd4, 0x41, 0xdc, 0x0a, 0x4e, 0x74, + 0xf6, 0x5c, 0xbc, 0xfe, 0x54, 0xb5, 0x9b, 0xb0, 0xed, 0xd8, 0x1d, 0x0f, 0xd7, 0xa3, 0x60, 0x1c, + 0x7c, 0x71, 0x57, 0xfe, 0x05, 0x7f, 0x25, 0xe7, 0xb4, 0x17, 0x09, 0x47, 0xcc, 0x21, 0x95, 0x67, + 0x8a, 0x16, 0xef, 0x09, 0x04, 0xe3, 0xe2, 0x0c, 0x2b, 0x21, 0x7b, 0xe1, 0x7e, 0x5e, 0x02, 0x6a, + 0xa9, 0xdd, 0x76, 0xf6, 0x6c, 0xbf, 0x09, 0xbb, 0xb0, 0xed, 0xb7, 0x5c, 0xb3, 0x0d, 0x59, 0xfb, + 0x59, 0x01, 0x72, 0xc7, 0x72, 0x69, 0x1f, 0x8c, 0xfe, 0x52, 0x39, 0xbe, 0x5c, 0x78, 0xc7, 0x91, + 0xd4, 0xf2, 0x60, 0x29, 0x29, 0xc4, 0x29, 0xb6, 0xaf, 0x28, 0x58, 0x50, 0xf6, 0x52, 0xfd, 0xa4, + 0x04, 0x66, 0x82, 0x1e, 0x7b, 0x5b, 0x44, 0x98, 0x3f, 0x9d, 0x72, 0x32, 0x12, 0x12, 0x4f, 0x21, + 0xc3, 0x77, 0xa5, 0x98, 0x55, 0xc4, 0xd1, 0x4f, 0x27, 0xba, 0x52, 0x7a, 0xd1, 0xa1, 0xc7, 0x7a, + 0x63, 0x73, 0xb9, 0x51, 0xab, 0xe8, 0x86, 0x22, 0x6b, 0x5f, 0x96, 0x40, 0x7e, 0xdd, 0xb2, 0xb7, + 0xd9, 0xc0, 0x66, 0x27, 0x91, 0x1d, 0xd9, 0x81, 0x0f, 0xd2, 0x96, 0x4e, 0x1e, 0xd4, 0x3b, 0xc0, + 0x49, 0x7b, 0x6f, 0xf7, 0x22, 0x74, 0x1b, 0x5b, 0x78, 0x94, 0xf5, 0x5a, 0x4e, 0x13, 0xda, 0xc4, + 0x08, 0x2d, 0x18, 0x03, 0xdf, 0xf1, 0x26, 0x98, 0xc0, 0xe4, 0x01, 0x71, 0x12, 0x23, 0xf1, 0x90, + 0x29, 0x89, 0x61, 0x2a, 0xd5, 0xb4, 0x61, 0x00, 0xf1, 0xec, 0x35, 0xf5, 0x37, 0x0b, 0xe0, 0xea, + 0x92, 0xbd, 0x8f, 0x6d, 0x0a, 0xd2, 0xc1, 0x97, 0x77, 0x4c, 0x7b, 0x1b, 0xe2, 0x01, 0x22, 0x94, + 0x38, 0x1b, 0xe9, 0x3f, 0xc7, 0x47, 0xfa, 0x57, 0x0d, 0x30, 0xe5, 0xb8, 0x1d, 0xe8, 0x2e, 0xed, + 0x63, 0x9e, 0xfa, 0x97, 0x9d, 0x69, 0x9b, 0x1c, 0x54, 0xc4, 0x22, 0x25, 0xbf, 0xd8, 0x20, 0xdf, + 0x1b, 0x01, 0xa1, 0xb3, 0xb7, 0x82, 0x29, 0x9a, 0xa6, 0xce, 0x81, 0xe9, 0x86, 0x51, 0xd1, 0x8d, + 0xcd, 0x6a, 0x45, 0x39, 0xa6, 0x5e, 0x05, 0x8e, 0x57, 0x5b, 0xba, 0x51, 0x6a, 0x55, 0x1b, 0xf5, + 0x4d, 0x9c, 0xae, 0xe4, 0xb4, 0xe7, 0xe7, 0x45, 0x3d, 0x7b, 0x93, 0x99, 0x19, 0x04, 0xab, 0x01, + 0xa6, 0xda, 0x24, 0x03, 0x1e, 0x42, 0x67, 0x53, 0xd5, 0x8e, 0x12, 0x24, 0x09, 0x46, 0x40, 0x48, + 0x3d, 0x03, 0xc0, 0x15, 0xd7, 0xb1, 0xb7, 0xa3, 0x33, 0x6d, 0xd3, 0x06, 0x93, 0xa2, 0x3d, 0x94, + 0x03, 0x45, 0xf2, 0x0d, 0xbe, 0xd9, 0x04, 0xff, 0x8b, 0x04, 0x1f, 0x3c, 0x23, 0x8b, 0x17, 0xcb, + 0x2b, 0x9a, 0x68, 0xd1, 0x47, 0xa4, 0x8b, 0x44, 0x06, 0xc4, 0x12, 0xa6, 0x55, 0xb9, 0x0d, 0x14, + 0xc9, 0xb7, 0xd4, 0xeb, 0x20, 0x3e, 0x4a, 0x29, 0xc9, 0x26, 0xe8, 0xa7, 0x2c, 0x2e, 0xd3, 0xec, + 0xb5, 0xf9, 0x23, 0x12, 0x98, 0xae, 0x43, 0xbf, 0xbc, 0x03, 0xdb, 0x97, 0xb4, 0xc7, 0xf1, 0x0b, + 0xa0, 0x5d, 0x0b, 0xda, 0xfe, 0x85, 0xdd, 0x6e, 0xb8, 0x00, 0x1a, 0x24, 0x68, 0x2f, 0x64, 0x3b, + 0xdf, 0x67, 0xf0, 0xfa, 0x73, 0xcb, 0x80, 0xba, 0x06, 0x25, 0xc4, 0xa8, 0xcc, 0x29, 0x50, 0x74, + 0xa1, 0xb7, 0xd7, 0x0d, 0x16, 0xd1, 0xe8, 0x93, 0xf6, 0x70, 0x28, 0xce, 0x32, 0x27, 0xce, 0xdb, + 0xc4, 0x8b, 0x98, 0x40, 0xd8, 0xd3, 0x3c, 0x98, 0xaa, 0xda, 0x96, 0x6f, 0x99, 0x5d, 0xed, 0x45, + 0x79, 0x30, 0xdf, 0x84, 0xfe, 0xba, 0xe9, 0x9a, 0xbb, 0xd0, 0x87, 0xae, 0xa7, 0x7d, 0x83, 0xef, + 0x13, 0x7a, 0x5d, 0xd3, 0xdf, 0x72, 0xdc, 0xdd, 0x40, 0x35, 0x83, 0x67, 0xa4, 0x9a, 0x97, 0xa1, + 0xeb, 0x45, 0x7c, 0x05, 0x8f, 0xe8, 0xcd, 0x15, 0xc7, 0xbd, 0x84, 0x06, 0x41, 0x3a, 0x4d, 0xa3, + 0x8f, 0x88, 0x5e, 0xd7, 0xd9, 0xae, 0xc1, 0xcb, 0x30, 0x88, 0xaa, 0x16, 0x3e, 0xa3, 0xb9, 0x40, + 0xc7, 0xa9, 0x3b, 0x3e, 0xea, 0xb4, 0x6b, 0xce, 0x36, 0x09, 0x3b, 0x3b, 0x6d, 0xf0, 0x89, 0x51, + 0x2e, 0xf3, 0x32, 0xc4, 0xb9, 0x8a, 0x6c, 0x2e, 0x9a, 0xa8, 0x2e, 0x02, 0x35, 0xfc, 0xac, 0x05, + 0xbb, 0x70, 0x17, 0xfa, 0xee, 0x3e, 0xbe, 0x5d, 0x62, 0xda, 0x18, 0xf0, 0x86, 0x0e, 0xd0, 0xe2, + 0x93, 0x75, 0x2a, 0xbd, 0x45, 0x4e, 0x72, 0x87, 0x9a, 0xac, 0x8b, 0x50, 0x9c, 0xc8, 0xed, 0x59, + 0x32, 0xb2, 0x66, 0x5e, 0x21, 0x83, 0x3c, 0x1e, 0x3c, 0xdf, 0x9c, 0xe3, 0x56, 0x98, 0x76, 0xa1, + 0xe7, 0x99, 0xdb, 0x30, 0x58, 0x61, 0xa2, 0x8f, 0xea, 0x9d, 0xa0, 0xd0, 0xc5, 0x98, 0x92, 0xc1, + 0xe1, 0x06, 0xae, 0x66, 0xc8, 0xc0, 0x40, 0xb4, 0xc2, 0x91, 0x00, 0xc3, 0x6d, 0x90, 0x2f, 0xce, + 0xde, 0x07, 0x0a, 0x04, 0xfe, 0x19, 0x50, 0xa8, 0xe8, 0x4b, 0x1b, 0x2b, 0xca, 0x31, 0xf4, 0x37, + 0xe0, 0x6f, 0x06, 0x14, 0x96, 0x4b, 0xad, 0x52, 0x4d, 0x91, 0x50, 0x3d, 0xaa, 0xf5, 0xe5, 0x86, + 0x22, 0xa3, 0xc4, 0xf5, 0x52, 0xbd, 0x5a, 0x56, 0xf2, 0xea, 0x2c, 0x98, 0x3a, 0x5f, 0x32, 0xea, + 0xd5, 0xfa, 0x8a, 0x52, 0xd0, 0xfe, 0x92, 0xc5, 0xef, 0x2e, 0x1e, 0xbf, 0x1b, 0xe3, 0x78, 0x1a, + 0x04, 0xd9, 0xcf, 0x87, 0x90, 0xdd, 0xc3, 0x41, 0xf6, 0x9d, 0x22, 0x44, 0x26, 0xe0, 0xce, 0x54, + 0x04, 0x53, 0xeb, 0xae, 0xd3, 0x86, 0x9e, 0xa7, 0xfd, 0x8c, 0x04, 0x8a, 0x65, 0xd3, 0x6e, 0xc3, + 0xae, 0x76, 0x4d, 0x04, 0x15, 0x71, 0x15, 0xcd, 0x05, 0xae, 0xa2, 0xda, 0xd7, 0x72, 0xa2, 0xbd, + 0x1f, 0xa5, 0xbb, 0x48, 0x68, 0xc6, 0xc8, 0x47, 0xac, 0x97, 0x4b, 0x24, 0x35, 0x81, 0x1b, 0x76, + 0x24, 0x30, 0x43, 0x57, 0x03, 0x2e, 0x42, 0x76, 0x1e, 0xfe, 0x8d, 0x9c, 0xe8, 0xe4, 0x30, 0xa8, + 0x41, 0x48, 0x26, 0x46, 0x1e, 0x62, 0x13, 0xc1, 0x61, 0xd4, 0x26, 0xb0, 0x79, 0x28, 0x81, 0xd9, + 0x0d, 0xdb, 0x1b, 0x24, 0x14, 0xf1, 0x70, 0xfc, 0x41, 0x35, 0x18, 0x42, 0x87, 0x0a, 0xc7, 0x3f, + 0x9c, 0x5e, 0xf6, 0x82, 0xf9, 0x46, 0x0e, 0x9c, 0x5c, 0x81, 0x36, 0x74, 0xad, 0x36, 0xa9, 0x41, + 0x20, 0x89, 0x7b, 0x78, 0x49, 0x3c, 0x8e, 0xe3, 0x7c, 0xd0, 0x17, 0xbc, 0x04, 0x5e, 0x1d, 0x4a, + 0xe0, 0x19, 0x9c, 0x04, 0x6e, 0x15, 0xa4, 0x33, 0x81, 0x6b, 0xd5, 0x67, 0xc0, 0x5c, 0xdd, 0xf1, + 0xad, 0x2d, 0xab, 0x4d, 0x7c, 0xd0, 0x7e, 0x4e, 0x06, 0xf9, 0x9a, 0xe5, 0xf9, 0x5a, 0x29, 0xea, + 0x4e, 0xae, 0x07, 0xb3, 0x96, 0xdd, 0xee, 0xee, 0x75, 0xa0, 0x01, 0x4d, 0xd2, 0xaf, 0x4c, 0x1b, + 0x6c, 0x52, 0xb4, 0xb5, 0x8f, 0xd8, 0x92, 0x83, 0xad, 0xfd, 0xcf, 0x0a, 0x2f, 0xc3, 0xb0, 0x2c, + 0xe0, 0xb8, 0x94, 0x31, 0x76, 0x57, 0x09, 0xcc, 0xdb, 0x4c, 0xd6, 0xc0, 0x60, 0xef, 0xbf, 0x97, + 0x80, 0x25, 0x67, 0xf0, 0x5f, 0x68, 0x1f, 0x10, 0x6a, 0xac, 0xc3, 0x18, 0x4a, 0x87, 0xcc, 0xf2, + 0x08, 0x93, 0x64, 0x15, 0x2c, 0x54, 0xeb, 0x2d, 0xdd, 0xa8, 0x97, 0x6a, 0x34, 0x8b, 0xac, 0xfd, + 0x9b, 0x04, 0x0a, 0x06, 0xec, 0x75, 0xf7, 0xd9, 0xc0, 0xd3, 0xd4, 0x51, 0x3c, 0x17, 0x3a, 0x8a, + 0xab, 0xcb, 0x00, 0x98, 0x6d, 0x54, 0x30, 0xbe, 0x99, 0x4b, 0x1a, 0x18, 0xce, 0x94, 0xab, 0x60, + 0x29, 0xcc, 0x6d, 0x30, 0x5f, 0x6a, 0x2f, 0x16, 0xde, 0x39, 0xe2, 0xa8, 0x61, 0x0e, 0x63, 0xfa, + 0x84, 0x0f, 0x0a, 0x6d, 0xf6, 0x0c, 0x25, 0x77, 0x34, 0xe2, 0xff, 0x8a, 0x04, 0xf2, 0x2d, 0xd4, + 0x5b, 0x32, 0x1d, 0xe7, 0x67, 0x46, 0xd3, 0x71, 0x44, 0x26, 0x46, 0xc7, 0xef, 0x05, 0x73, 0xac, + 0xc6, 0x52, 0x57, 0x89, 0x44, 0x15, 0xe7, 0x3e, 0x18, 0x45, 0xc3, 0x07, 0xb0, 0x73, 0x34, 0x22, + 0xfe, 0xd4, 0xe3, 0x01, 0x58, 0x83, 0xbb, 0x17, 0xa1, 0xeb, 0xed, 0x58, 0x3d, 0xed, 0xaf, 0x65, + 0x30, 0xb3, 0x02, 0xfd, 0xa6, 0x6f, 0xfa, 0x7b, 0x5e, 0xdf, 0x76, 0xa7, 0xed, 0x94, 0xcd, 0xf6, + 0x0e, 0xa4, 0xdd, 0x51, 0xf0, 0xa8, 0xbd, 0x47, 0x16, 0xf5, 0x27, 0x8a, 0xca, 0x59, 0x0c, 0xcb, + 0x88, 0xc1, 0xe4, 0x09, 0x20, 0xdf, 0x31, 0x7d, 0x93, 0x62, 0x71, 0x4d, 0x1f, 0x16, 0x11, 0x21, + 0x03, 0x67, 0xd3, 0xde, 0x21, 0x89, 0x38, 0x14, 0x09, 0x94, 0x9f, 0x0e, 0x84, 0x0f, 0xe4, 0x46, + 0x40, 0xe1, 0x04, 0x98, 0xaf, 0x37, 0x5a, 0x9b, 0xb5, 0xc6, 0xca, 0x8a, 0x8e, 0x52, 0x15, 0x59, + 0x3d, 0x05, 0xd4, 0xf5, 0xd2, 0x85, 0x35, 0xbd, 0xde, 0xda, 0xac, 0x37, 0x2a, 0x3a, 0xfd, 0x32, + 0xaf, 0x1e, 0x07, 0xb3, 0xe5, 0x52, 0x79, 0x35, 0x48, 0x28, 0xa8, 0xa7, 0xc1, 0xc9, 0x35, 0x7d, + 0x6d, 0x49, 0x37, 0x9a, 0xab, 0xd5, 0xf5, 0x4d, 0x44, 0x66, 0xb9, 0xb1, 0x51, 0xaf, 0x28, 0x45, + 0x55, 0x03, 0xa7, 0x98, 0x37, 0xe7, 0x8d, 0x46, 0x7d, 0x65, 0xb3, 0xd9, 0x2a, 0xb5, 0x74, 0x65, + 0x4a, 0xbd, 0x0a, 0x1c, 0x2f, 0x97, 0xea, 0x38, 0x7b, 0xb9, 0x51, 0xaf, 0xeb, 0xe5, 0x96, 0x32, + 0xad, 0xfd, 0x47, 0x1e, 0xcc, 0x56, 0xbd, 0xba, 0xb9, 0x0b, 0xcf, 0x99, 0x5d, 0xab, 0xa3, 0xbd, + 0x88, 0x99, 0x79, 0xdc, 0x08, 0xe6, 0x5d, 0xf2, 0x17, 0x76, 0x5a, 0x16, 0x24, 0x68, 0xce, 0x1b, + 0x7c, 0x22, 0x9a, 0x93, 0xdb, 0x98, 0x40, 0x30, 0x27, 0x27, 0x4f, 0xea, 0x12, 0x00, 0xe4, 0x5f, + 0x2b, 0xba, 0x23, 0xf6, 0x6c, 0x7f, 0x6b, 0x32, 0x77, 0xa1, 0x07, 0xdd, 0xcb, 0x56, 0x1b, 0x06, + 0x39, 0x0d, 0xe6, 0x2b, 0xed, 0x4f, 0x65, 0xd1, 0xfd, 0x45, 0x06, 0x54, 0xa6, 0x3a, 0x31, 0xbd, + 0xe1, 0x8f, 0xc8, 0x22, 0xbb, 0x83, 0x42, 0x24, 0xd3, 0x69, 0xca, 0x4b, 0xa5, 0xd1, 0x96, 0x6d, + 0x5b, 0x8d, 0xc6, 0x66, 0x73, 0xb5, 0x61, 0xb4, 0x14, 0x59, 0x9d, 0x03, 0xd3, 0xe8, 0xb1, 0xd6, + 0xa8, 0xaf, 0x28, 0x79, 0xf5, 0x6a, 0x70, 0x62, 0xb5, 0xd4, 0xdc, 0xac, 0xd6, 0xcf, 0x95, 0x6a, + 0xd5, 0xca, 0x66, 0x79, 0xb5, 0x64, 0x34, 0x95, 0x82, 0x7a, 0x0d, 0xb8, 0xba, 0x55, 0xd5, 0x8d, + 0xcd, 0x65, 0xbd, 0xd4, 0xda, 0x30, 0xf4, 0xe6, 0x66, 0xbd, 0xb1, 0x59, 0x2f, 0xad, 0xe9, 0x4a, + 0x11, 0x35, 0x7f, 0xfc, 0x2a, 0x52, 0x9b, 0xa9, 0x83, 0xca, 0x38, 0x1d, 0xa3, 0x8c, 0x33, 0xfd, + 0xca, 0x08, 0x58, 0xb5, 0x32, 0xf4, 0xa6, 0x6e, 0x9c, 0xd3, 0x95, 0xd9, 0x41, 0xba, 0x36, 0xa7, + 0x9e, 0x04, 0x0a, 0xe2, 0x61, 0xb3, 0xda, 0x0c, 0x72, 0x56, 0x94, 0x79, 0xed, 0x93, 0x45, 0x70, + 0xca, 0x80, 0xdb, 0x96, 0xe7, 0x43, 0x77, 0xdd, 0xdc, 0xdf, 0x85, 0xb6, 0x1f, 0x74, 0xf2, 0xff, + 0x9c, 0x5a, 0x19, 0xd7, 0xc0, 0x7c, 0x8f, 0xd0, 0x58, 0x83, 0xfe, 0x8e, 0xd3, 0xa1, 0xa3, 0xf0, + 0xe3, 0x62, 0x7b, 0x8e, 0xc5, 0x75, 0x36, 0xbb, 0xc1, 0x7f, 0xcd, 0xe8, 0xb6, 0x9c, 0xa0, 0xdb, + 0xf9, 0x51, 0x74, 0x5b, 0xbd, 0x16, 0xcc, 0xec, 0x79, 0xd0, 0xd5, 0x77, 0x4d, 0xab, 0x1b, 0xdc, + 0xf1, 0x19, 0x26, 0x68, 0xef, 0xcc, 0x8b, 0x9e, 0x58, 0x61, 0xea, 0x32, 0x58, 0x8c, 0x31, 0x7d, + 0xeb, 0x19, 0x00, 0x68, 0x65, 0x37, 0xdc, 0x2e, 0x55, 0x56, 0x26, 0x05, 0xf1, 0x77, 0xd1, 0xea, + 0x76, 0x2d, 0x7b, 0x3b, 0xdc, 0xf7, 0x8f, 0x12, 0xb4, 0x97, 0xca, 0x22, 0x27, 0x58, 0xd2, 0xf2, + 0x96, 0xae, 0x35, 0xbd, 0x58, 0x9a, 0x70, 0xbf, 0x7b, 0xb0, 0xe9, 0x14, 0x55, 0x05, 0xcc, 0xe1, + 0x34, 0xda, 0x02, 0x95, 0x29, 0xd4, 0x07, 0x07, 0xe4, 0xd6, 0xf4, 0xd6, 0x6a, 0xa3, 0x12, 0xbe, + 0x9b, 0x46, 0x24, 0x11, 0x33, 0xa5, 0xfa, 0x05, 0xdc, 0x1a, 0x67, 0xd4, 0xc7, 0x80, 0x6b, 0x98, + 0x0e, 0xbb, 0x54, 0x33, 0xf4, 0x52, 0xe5, 0xc2, 0xa6, 0xfe, 0xac, 0x6a, 0xb3, 0xd5, 0xe4, 0x1b, + 0x57, 0xd0, 0x8e, 0x66, 0x11, 0xbf, 0xfa, 0x5a, 0xa9, 0x5a, 0xa3, 0xfd, 0xfb, 0x72, 0xc3, 0x58, + 0x2b, 0xb5, 0x94, 0x39, 0xed, 0x15, 0x32, 0x50, 0x56, 0xa0, 0xbf, 0xee, 0xb8, 0xbe, 0xd9, 0xad, + 0x59, 0xf6, 0xa5, 0x0d, 0xb7, 0xcb, 0x4d, 0x36, 0x85, 0xc3, 0x74, 0xf0, 0x43, 0x24, 0x47, 0x30, + 0x7e, 0x47, 0xbc, 0x87, 0xb3, 0x45, 0xca, 0x14, 0x25, 0x68, 0xcf, 0x95, 0x44, 0x96, 0xbb, 0xc5, + 0x4b, 0x4d, 0xa7, 0x27, 0xcf, 0x9b, 0xf4, 0xf8, 0x3c, 0x00, 0xb5, 0xa2, 0xf6, 0x82, 0x3c, 0x98, + 0x5e, 0xb6, 0x6c, 0xb3, 0x6b, 0x3d, 0x87, 0x8b, 0x8e, 0x19, 0xf5, 0x31, 0xb9, 0x84, 0x3e, 0x46, + 0x1a, 0x69, 0xfc, 0xfc, 0x29, 0x59, 0x74, 0x79, 0x81, 0x91, 0x7d, 0xc0, 0x64, 0xcc, 0xe0, 0xf9, + 0xab, 0x92, 0xc8, 0xf2, 0xc2, 0x70, 0x7a, 0xe9, 0x30, 0xfc, 0xf4, 0xb7, 0x87, 0x8d, 0xd5, 0xd7, + 0xbe, 0xa7, 0x07, 0xa9, 0xc2, 0x8c, 0xf6, 0x7b, 0x32, 0xd0, 0x56, 0xa0, 0x7f, 0x0e, 0xba, 0xe1, + 0x54, 0x00, 0xf7, 0xfa, 0xd4, 0xde, 0x66, 0x9a, 0xec, 0x9b, 0x59, 0x00, 0xcf, 0xf3, 0x00, 0x96, + 0x12, 0x1a, 0x4f, 0x0c, 0xe9, 0x98, 0xc6, 0x5b, 0x05, 0x45, 0x0f, 0xbf, 0xa7, 0x6a, 0xf6, 0xc4, + 0xf8, 0xe1, 0x12, 0x13, 0x63, 0xa9, 0x13, 0xc2, 0x06, 0x25, 0xa0, 0x7d, 0x33, 0x9c, 0x04, 0x7d, + 0x0f, 0xa7, 0x1d, 0xcb, 0x87, 0x66, 0x36, 0x9d, 0xbe, 0xb8, 0xd9, 0xaa, 0xcb, 0x20, 0xfb, 0x46, + 0xfb, 0xd5, 0x02, 0x38, 0x39, 0xa8, 0x3a, 0xda, 0x2f, 0xe7, 0xb8, 0x1d, 0x76, 0x88, 0x87, 0xfc, + 0x1c, 0xdd, 0x40, 0x44, 0x0f, 0xea, 0x93, 0xc1, 0xd5, 0xe1, 0x32, 0x5c, 0xcb, 0xa9, 0xc3, 0x2b, + 0x5e, 0x17, 0xfa, 0x3e, 0x74, 0x71, 0xd5, 0xa6, 0x8d, 0xc1, 0x2f, 0xd5, 0xa7, 0x82, 0x47, 0x59, + 0xb6, 0x67, 0x75, 0xa0, 0xdb, 0xb2, 0x7a, 0x5e, 0xc9, 0xee, 0xb4, 0xf6, 0x7c, 0xc7, 0xb5, 0x4c, + 0x7a, 0x23, 0xe5, 0xb4, 0x11, 0xf7, 0x5a, 0xbd, 0x05, 0x28, 0x96, 0xd7, 0xb0, 0x2f, 0x3a, 0xa6, + 0xdb, 0xb1, 0xec, 0xed, 0x9a, 0xe5, 0xf9, 0xd4, 0x03, 0xf8, 0x40, 0xba, 0xf6, 0x37, 0xb2, 0xe8, + 0x61, 0xba, 0x21, 0xb0, 0xc6, 0x74, 0x28, 0x2f, 0x94, 0x45, 0x8e, 0xc7, 0xa5, 0xa3, 0x9d, 0x4e, + 0x59, 0x9e, 0x3f, 0x69, 0x43, 0x62, 0xf0, 0x08, 0x8e, 0xbb, 0x16, 0x92, 0x1e, 0x18, 0x02, 0xe7, + 0x74, 0xa3, 0xba, 0x5c, 0xd5, 0x91, 0x59, 0x71, 0x35, 0x38, 0x11, 0xbd, 0xab, 0x5c, 0xd8, 0x6c, + 0xea, 0xf5, 0x96, 0x32, 0x8d, 0xfa, 0x29, 0x92, 0xbc, 0x5c, 0xaa, 0xd6, 0xf4, 0xca, 0x66, 0xab, + 0x81, 0xde, 0x54, 0x46, 0x33, 0x2d, 0xb4, 0x87, 0xf2, 0xe0, 0x38, 0x96, 0xed, 0x3e, 0x96, 0x2a, + 0x12, 0x4a, 0x9f, 0xaf, 0x6d, 0x08, 0xd0, 0x0c, 0x11, 0xaf, 0xf6, 0xbb, 0xc2, 0x17, 0x6e, 0x32, + 0x10, 0xf6, 0x95, 0x11, 0xa3, 0x19, 0xdf, 0x90, 0x44, 0x22, 0x54, 0x08, 0x93, 0x4d, 0xa7, 0x14, + 0xff, 0x32, 0xe9, 0x11, 0x27, 0x1e, 0x7c, 0x6c, 0x65, 0x96, 0xf1, 0xc7, 0xcf, 0x5a, 0xaf, 0x1a, + 0x58, 0x1d, 0x16, 0x00, 0xc0, 0x29, 0x58, 0x83, 0x88, 0x1e, 0x0c, 0x1c, 0xaf, 0xe2, 0xf4, 0xa0, + 0x54, 0x6e, 0x55, 0xcf, 0xe9, 0x71, 0x7a, 0xf0, 0x39, 0x19, 0x4c, 0xaf, 0x40, 0x1f, 0xcd, 0xa9, + 0x3c, 0xed, 0x69, 0x02, 0xeb, 0x3f, 0xc8, 0x8c, 0xe9, 0x3a, 0x6d, 0xb3, 0x1b, 0x2e, 0x03, 0x90, + 0x27, 0xed, 0x87, 0x47, 0x31, 0x41, 0x82, 0xa2, 0x63, 0xc6, 0xab, 0xef, 0x06, 0x05, 0x1f, 0xbd, + 0xa6, 0xcb, 0xd0, 0xdf, 0x11, 0x3b, 0x5c, 0x21, 0x22, 0x15, 0xd3, 0x37, 0x0d, 0x92, 0x9f, 0x19, + 0x9d, 0x04, 0x6d, 0x97, 0x18, 0x46, 0xbe, 0x1d, 0xed, 0xcf, 0xbf, 0x94, 0xc1, 0xd5, 0xa4, 0x7d, + 0x94, 0x7a, 0xbd, 0xa6, 0xef, 0xb8, 0xd0, 0x80, 0x6d, 0x68, 0xf5, 0xfc, 0xbe, 0xf5, 0x3d, 0x97, + 0xa4, 0x06, 0x9b, 0xcd, 0xf4, 0x51, 0x7b, 0x83, 0x2c, 0x1a, 0xe1, 0xf7, 0x40, 0x7b, 0xec, 0x2b, + 0x2f, 0xa6, 0xb1, 0x7f, 0x42, 0x12, 0x89, 0xd9, 0x9b, 0x92, 0x78, 0x3a, 0xa0, 0x3e, 0x7a, 0x04, + 0x40, 0x05, 0x2b, 0x37, 0x86, 0x5e, 0xd6, 0xab, 0xeb, 0x68, 0x10, 0xb8, 0x0e, 0x3c, 0x7a, 0x7d, + 0xc3, 0x28, 0xaf, 0x96, 0x9a, 0xfa, 0xa6, 0xa1, 0xaf, 0x54, 0x9b, 0x2d, 0xea, 0x94, 0x45, 0xbe, + 0x9a, 0x52, 0xaf, 0x05, 0xa7, 0x9b, 0x1b, 0x4b, 0xcd, 0xb2, 0x51, 0x5d, 0xc7, 0xe9, 0x86, 0x5e, + 0xd7, 0xcf, 0xd3, 0xb7, 0xd3, 0xda, 0x87, 0x15, 0x30, 0x8b, 0x26, 0x00, 0x4d, 0x32, 0x2f, 0xd0, + 0xfe, 0x2e, 0x0f, 0x66, 0x0d, 0xe8, 0x39, 0xdd, 0xcb, 0x78, 0x8e, 0x30, 0xa9, 0xa9, 0xc7, 0xd7, + 0x65, 0xd1, 0xf3, 0xdb, 0x0c, 0xb3, 0x8b, 0x0c, 0xa3, 0xf1, 0x13, 0x4d, 0xf3, 0xb2, 0x69, 0x75, + 0xcd, 0x8b, 0xb4, 0xab, 0x99, 0x36, 0xa2, 0x04, 0x75, 0x11, 0xa8, 0xce, 0x15, 0x1b, 0xba, 0xcd, + 0xf6, 0x15, 0xdd, 0xdf, 0x29, 0x75, 0x3a, 0x2e, 0xf4, 0x3c, 0xba, 0x7a, 0x31, 0xe0, 0x8d, 0x7a, + 0x33, 0x38, 0x8e, 0x53, 0x99, 0xcc, 0xc4, 0x41, 0xa6, 0x3f, 0x39, 0xcc, 0x59, 0xb2, 0xf7, 0x83, + 0x9c, 0x05, 0x26, 0x67, 0x94, 0xcc, 0x1e, 0x97, 0x28, 0xf2, 0xa7, 0x74, 0xae, 0x07, 0xb3, 0xb6, + 0xb9, 0x0b, 0xf5, 0x07, 0x7b, 0x96, 0x0b, 0x3d, 0xec, 0x18, 0x23, 0x1b, 0x6c, 0x92, 0xf6, 0xab, + 0x42, 0xe7, 0xcd, 0xc5, 0x24, 0x96, 0x4e, 0xf7, 0x57, 0x46, 0x50, 0xfd, 0x01, 0xfd, 0x8c, 0xac, + 0x7d, 0x58, 0x06, 0x73, 0x94, 0xa9, 0x92, 0xbd, 0x5f, 0xed, 0x68, 0xd7, 0x71, 0xc6, 0xaf, 0x89, + 0xd2, 0x02, 0xe3, 0x17, 0x3f, 0x68, 0x3f, 0x2a, 0x8b, 0xba, 0x3b, 0x0f, 0xa8, 0x38, 0x2e, 0x23, + 0xde, 0x71, 0x74, 0xcb, 0xd9, 0xa3, 0x8e, 0xaa, 0xd3, 0x06, 0x79, 0xc8, 0x72, 0x51, 0x4f, 0xfb, + 0x35, 0x21, 0x67, 0x6a, 0xc1, 0x6a, 0x1c, 0x11, 0x80, 0x9f, 0x92, 0xc1, 0x02, 0xe5, 0xaa, 0x49, + 0xcf, 0xf9, 0x08, 0x1d, 0x78, 0xfb, 0x71, 0x61, 0x43, 0x70, 0x40, 0xfd, 0x69, 0x49, 0x8f, 0x18, + 0x20, 0x3f, 0x26, 0x14, 0x1c, 0x4d, 0xb8, 0x22, 0x47, 0x04, 0xe5, 0xbb, 0xf2, 0x60, 0x76, 0xc3, + 0x83, 0x2e, 0xf5, 0xdb, 0xd7, 0x1e, 0xce, 0x03, 0x79, 0x05, 0x72, 0x1b, 0xa9, 0x2f, 0x11, 0xf6, + 0xf0, 0x65, 0x2b, 0xcb, 0x10, 0x45, 0x36, 0x52, 0x0c, 0x6c, 0x37, 0x81, 0x05, 0x22, 0xd2, 0x92, + 0xef, 0x23, 0x23, 0x31, 0xf0, 0xa6, 0xed, 0x4b, 0x1d, 0xc7, 0x56, 0x11, 0x2e, 0x0b, 0x65, 0x29, + 0x23, 0x9e, 0x6a, 0x70, 0x8b, 0xcc, 0x67, 0xf3, 0x46, 0x5f, 0xaa, 0x7a, 0x3b, 0xb8, 0xca, 0xe9, + 0x41, 0x72, 0x7e, 0x85, 0xc9, 0x5c, 0xc0, 0x99, 0x07, 0xbd, 0xd2, 0xfe, 0x4e, 0xc8, 0x57, 0x57, + 0x5c, 0x3a, 0xe9, 0x74, 0xa1, 0x37, 0x1e, 0x93, 0xe4, 0x24, 0x50, 0x50, 0x0e, 0xbc, 0xff, 0x62, + 0xe8, 0xcd, 0x46, 0xed, 0x9c, 0x3e, 0x78, 0x19, 0xa3, 0xa0, 0x3d, 0x5f, 0x06, 0x33, 0x4b, 0xae, + 0x63, 0x76, 0xda, 0xa6, 0xe7, 0x6b, 0xdf, 0x94, 0xc0, 0xdc, 0xba, 0xb9, 0xdf, 0x75, 0xcc, 0x0e, + 0xf6, 0xef, 0xef, 0xeb, 0x0b, 0x7a, 0xe4, 0x55, 0xd0, 0x17, 0xd0, 0x47, 0xfe, 0x60, 0x60, 0x78, + 0x74, 0x2f, 0x27, 0x72, 0xaf, 0x66, 0xb8, 0xcd, 0x27, 0x0d, 0x0a, 0x56, 0x1a, 0xf0, 0xb5, 0xc8, + 0xf2, 0x14, 0x63, 0x51, 0x7e, 0x58, 0x2c, 0xfc, 0xa8, 0x08, 0xc9, 0xa3, 0xd9, 0x95, 0x7f, 0xc1, + 0x34, 0x28, 0x56, 0x20, 0xb6, 0xe2, 0xfe, 0xa7, 0x04, 0xa6, 0x9a, 0xd0, 0xc7, 0x16, 0xdc, 0x9d, + 0x9c, 0xa7, 0x70, 0x07, 0x67, 0x88, 0x9c, 0xd8, 0x83, 0x67, 0x34, 0x59, 0x67, 0xce, 0x5b, 0xe3, + 0xff, 0x29, 0x3c, 0x12, 0x49, 0xb9, 0x8b, 0xb4, 0xcc, 0x43, 0x79, 0x24, 0x26, 0x92, 0xca, 0xde, + 0xd7, 0xea, 0x3d, 0x12, 0x75, 0xad, 0x62, 0x7a, 0xbd, 0xd7, 0xb0, 0xfa, 0x99, 0xe8, 0x6d, 0x46, + 0x99, 0x4f, 0x70, 0x8e, 0x7a, 0x12, 0x98, 0x22, 0x32, 0x0f, 0xe6, 0xa3, 0xfd, 0x7e, 0x0a, 0x84, + 0x04, 0x3e, 0x7b, 0x1d, 0xe4, 0x14, 0x74, 0x51, 0x8b, 0x2f, 0x7c, 0x22, 0x31, 0x08, 0xe6, 0xea, + 0xd0, 0xbf, 0xe2, 0xb8, 0x97, 0x9a, 0xbe, 0xe9, 0x43, 0xed, 0x5f, 0x24, 0x72, 0x5d, 0x1e, 0x13, + 0xfd, 0xa4, 0x0e, 0x4e, 0x90, 0x0a, 0xd1, 0x8c, 0xb8, 0xff, 0x26, 0x15, 0xb9, 0x7e, 0xa0, 0x10, + 0x98, 0x7c, 0xc6, 0xc1, 0x4f, 0xb5, 0x9f, 0x19, 0x18, 0xf4, 0x49, 0x1a, 0x30, 0x69, 0xa0, 0x92, + 0x61, 0x19, 0x8c, 0xbf, 0x1f, 0x4f, 0xfb, 0x88, 0x90, 0x59, 0x2d, 0x46, 0xf3, 0x68, 0xba, 0x82, + 0x7f, 0x7f, 0x1c, 0xc8, 0x97, 0x77, 0x4c, 0x5f, 0x7b, 0xb7, 0x0c, 0x40, 0xa9, 0xd3, 0x59, 0x23, + 0x3e, 0xe0, 0xac, 0x43, 0xda, 0x59, 0x30, 0xd7, 0xde, 0x31, 0xa3, 0x9b, 0x33, 0x48, 0x7f, 0xc0, + 0xa5, 0xa9, 0x4f, 0x8e, 0x9c, 0xc9, 0x89, 0x54, 0xb5, 0x3e, 0x98, 0x50, 0x19, 0x94, 0x76, 0xe8, + 0x68, 0xce, 0x87, 0xc2, 0x4c, 0x3c, 0x42, 0x87, 0x3e, 0x5f, 0x8c, 0xd8, 0x8b, 0x9f, 0xc3, 0x51, + 0xd2, 0xe1, 0x01, 0x9b, 0x28, 0x21, 0xe5, 0x49, 0x6f, 0xb1, 0x80, 0x1e, 0xc9, 0x7c, 0x4d, 0x24, + 0x74, 0xad, 0xaa, 0x77, 0xac, 0x40, 0xb4, 0x34, 0x60, 0x96, 0xf6, 0xe2, 0x5c, 0x3a, 0xf8, 0x92, + 0x05, 0xf7, 0x0c, 0x30, 0x0f, 0x3b, 0x96, 0x0f, 0x83, 0x5a, 0x52, 0x01, 0x26, 0x41, 0xcc, 0x7f, + 0xa0, 0x3d, 0x4f, 0x38, 0xe8, 0x1a, 0x16, 0xe8, 0xc1, 0x1a, 0xc5, 0xb4, 0x3f, 0xb1, 0x30, 0x6a, + 0x62, 0x34, 0xb3, 0x07, 0xeb, 0x87, 0x65, 0x70, 0x75, 0xcb, 0xd9, 0xde, 0xee, 0xc2, 0x40, 0x4c, + 0x90, 0x78, 0x67, 0x6a, 0xe6, 0x38, 0xe1, 0xc2, 0x3b, 0x41, 0xce, 0x03, 0x56, 0x78, 0x94, 0x0c, + 0x3d, 0xf0, 0x27, 0xa6, 0x12, 0x67, 0x51, 0x58, 0x5c, 0x03, 0xf9, 0x8c, 0x41, 0x41, 0x2c, 0xe0, + 0xb3, 0x30, 0xd9, 0xec, 0x81, 0xf8, 0x82, 0x04, 0xe6, 0xc9, 0xbd, 0x88, 0x81, 0x82, 0xde, 0x3f, + 0x46, 0x00, 0xb4, 0x6f, 0xe6, 0x44, 0xfd, 0x6c, 0xb1, 0x4c, 0x38, 0x4e, 0x62, 0x44, 0x2c, 0x16, + 0x54, 0x65, 0x28, 0xb9, 0x09, 0xdc, 0xd4, 0x99, 0x07, 0xb3, 0x2b, 0x30, 0x68, 0x69, 0x9e, 0xf6, + 0xfe, 0x94, 0x3d, 0xd1, 0x59, 0x30, 0x87, 0x2f, 0x07, 0x6b, 0xd0, 0x63, 0x92, 0x64, 0xd5, 0x8c, + 0x4b, 0x53, 0x6f, 0x04, 0xf3, 0x17, 0xe1, 0x96, 0xe3, 0xc2, 0x06, 0x77, 0x96, 0x92, 0x4f, 0x1c, + 0x1c, 0x9e, 0x4e, 0xbd, 0x19, 0x1c, 0xa7, 0x8e, 0xee, 0x4b, 0x68, 0xae, 0x6f, 0xba, 0xfb, 0xf4, + 0x60, 0x5a, 0x7f, 0xb2, 0xf6, 0x97, 0x6c, 0x83, 0x59, 0xe2, 0x51, 0xbc, 0xf5, 0xa0, 0xd8, 0x99, + 0x4a, 0xc7, 0x8c, 0x4e, 0x4f, 0x01, 0xd3, 0x54, 0x47, 0x02, 0x83, 0x2e, 0xa9, 0x07, 0x0d, 0xf3, + 0xaa, 0x4f, 0x01, 0x33, 0x48, 0x44, 0xd8, 0x6e, 0xa0, 0x5d, 0xef, 0xe9, 0x01, 0x1f, 0xe2, 0xf7, + 0x46, 0x94, 0x55, 0xfb, 0x85, 0x50, 0x67, 0x74, 0x4e, 0x67, 0x9e, 0x98, 0x86, 0xf9, 0x89, 0x5c, + 0x24, 0xaf, 0x30, 0xe5, 0x2f, 0xed, 0x57, 0x3b, 0x9e, 0xb6, 0x96, 0x4e, 0x6b, 0xce, 0x00, 0x10, + 0x36, 0xbf, 0x20, 0x70, 0x06, 0x93, 0xc2, 0xc7, 0xc6, 0x4f, 0x3c, 0x0a, 0xd8, 0x2f, 0x0e, 0xcc, + 0xce, 0x78, 0x01, 0x15, 0x3c, 0x42, 0x28, 0xc2, 0x49, 0xf6, 0xe8, 0xfc, 0x7c, 0x1e, 0x5c, 0x1d, + 0x9e, 0x70, 0xaa, 0x99, 0x5e, 0xd4, 0xb2, 0x2f, 0xa4, 0x83, 0x88, 0x3b, 0x52, 0x12, 0x36, 0xc7, + 0x93, 0xa0, 0xe0, 0xed, 0x5d, 0x0c, 0x1d, 0x01, 0xc9, 0x83, 0xf6, 0x46, 0x39, 0xd5, 0x58, 0x35, + 0x90, 0xbf, 0x31, 0x37, 0xc2, 0x5b, 0xc1, 0x09, 0x7b, 0x6f, 0x37, 0xc4, 0x02, 0xf7, 0x34, 0xb4, + 0x67, 0x39, 0xf8, 0x82, 0x6f, 0xb2, 0x79, 0xf1, 0x26, 0x9b, 0x62, 0x24, 0x15, 0xa9, 0x74, 0xf6, + 0xea, 0xf1, 0xe9, 0xbe, 0x23, 0x68, 0xe5, 0xd4, 0x4a, 0x41, 0xe0, 0x97, 0x58, 0xf8, 0xff, 0x29, + 0x97, 0xaa, 0xe7, 0x1d, 0x7e, 0x72, 0x2d, 0x45, 0x4f, 0x78, 0x94, 0xc7, 0xd6, 0x3e, 0x2f, 0x01, + 0xad, 0x19, 0x39, 0xe4, 0x50, 0x50, 0xd7, 0x5d, 0x78, 0xd9, 0x82, 0x57, 0x38, 0xf7, 0xad, 0x37, + 0x09, 0xc7, 0xa1, 0xe6, 0x75, 0xe5, 0x00, 0xd1, 0xf8, 0x75, 0xf1, 0x01, 0xb8, 0x88, 0xc5, 0x9b, + 0x4e, 0x57, 0xe2, 0x04, 0x62, 0x87, 0x4b, 0xe0, 0x0c, 0x83, 0xea, 0xb2, 0xeb, 0xec, 0x26, 0x48, + 0xf6, 0x15, 0xac, 0x64, 0x37, 0x78, 0xc9, 0xde, 0x9b, 0xa8, 0x2e, 0x03, 0x08, 0xc7, 0xa8, 0xe3, + 0xfb, 0x43, 0x39, 0x3e, 0x8b, 0x93, 0x63, 0xe5, 0x90, 0xf4, 0xb3, 0x97, 0xe5, 0x1f, 0xe4, 0xc1, + 0x9c, 0x01, 0xcd, 0x4e, 0x38, 0x08, 0xfc, 0x9f, 0x8c, 0x79, 0xf7, 0x34, 0x90, 0xf7, 0xa3, 0x75, + 0x9a, 0xc7, 0x1d, 0xac, 0x0c, 0xfb, 0x25, 0x7e, 0xc0, 0xcb, 0x35, 0xf8, 0xa3, 0x03, 0xbd, 0x85, + 0x24, 0x60, 0x1b, 0xca, 0x22, 0xb6, 0x61, 0x7e, 0x90, 0x6d, 0x78, 0x33, 0x38, 0xde, 0x35, 0x3d, + 0xbf, 0x72, 0xb1, 0x65, 0xed, 0x42, 0xcf, 0x37, 0x77, 0x7b, 0xd8, 0x0a, 0x94, 0x8d, 0xfe, 0x64, + 0xfe, 0x1e, 0xf8, 0xc4, 0xf3, 0x60, 0x83, 0xaa, 0x78, 0xf8, 0x98, 0xb9, 0x1f, 0x12, 0x3a, 0xfc, + 0x35, 0xac, 0xec, 0x74, 0x9a, 0x71, 0xdf, 0x08, 0x6b, 0x4b, 0xa7, 0x80, 0xba, 0xa6, 0x37, 0x9b, + 0xa5, 0x15, 0x7c, 0x26, 0x24, 0x70, 0x12, 0xea, 0x9c, 0x7d, 0x2c, 0x12, 0x1f, 0x41, 0x5a, 0x9d, + 0x8b, 0xc6, 0x5e, 0xe5, 0x98, 0x3a, 0x0b, 0xa6, 0x5c, 0xd8, 0xeb, 0x5a, 0xd0, 0x53, 0x72, 0xda, + 0x37, 0x24, 0x50, 0xdc, 0xb0, 0x5d, 0x68, 0x76, 0xb4, 0x67, 0xc6, 0x0f, 0x21, 0x23, 0x2a, 0x05, + 0x1f, 0xf7, 0x2a, 0x71, 0x55, 0x96, 0x36, 0x3a, 0xc4, 0xc8, 0x58, 0xe0, 0x13, 0x5b, 0x8e, 0x8d, + 0x2f, 0x35, 0xf3, 0x26, 0x7d, 0x76, 0x0a, 0x14, 0xf4, 0xdd, 0x9e, 0xbf, 0x7f, 0xf6, 0xb1, 0x60, + 0xbe, 0xe9, 0xbb, 0xd0, 0xdc, 0x65, 0x36, 0xd5, 0x7d, 0xe7, 0x12, 0xb4, 0x83, 0x4d, 0x75, 0xfc, + 0x70, 0xd7, 0x9d, 0x60, 0xca, 0x76, 0x36, 0xcd, 0x3d, 0x7f, 0x47, 0xbd, 0xee, 0x40, 0x34, 0x1a, + 0xaa, 0x7e, 0x0d, 0x1a, 0xfe, 0xef, 0x4f, 0xef, 0xc6, 0x53, 0xab, 0xa2, 0xed, 0x94, 0xf6, 0xfc, + 0x9d, 0xa5, 0x6b, 0x3f, 0xf5, 0x67, 0x67, 0x72, 0x9f, 0xfb, 0xb3, 0x33, 0xb9, 0xaf, 0xfc, 0xd9, + 0x99, 0xdc, 0x8f, 0xff, 0xf9, 0x99, 0x63, 0x9f, 0xfb, 0xf3, 0x33, 0xc7, 0xbe, 0xf0, 0xe7, 0x67, + 0x8e, 0x7d, 0x8f, 0xd4, 0xbb, 0x78, 0xb1, 0x88, 0xa9, 0x3c, 0xe9, 0xff, 0x0d, 0x00, 0x00, 0xff, + 0xff, 0xe5, 0x76, 0x0c, 0x3b, 0xd1, 0x2b, 0x02, 0x00, } func (m *Rpc) Marshal() (dAtA []byte, err error) { @@ -85110,9 +85111,9 @@ func (m *RpcPublishingCreateRequest) MarshalToSizedBuffer(dAtA []byte) (int, err _ = i var l int _ = l - if m.JoinSpace { + if m.IncludeSpaceInfo { i-- - if m.JoinSpace { + if m.IncludeSpaceInfo { dAtA[i] = 1 } else { dAtA[i] = 0 @@ -128508,7 +128509,7 @@ func (m *RpcPublishingCreateRequest) Size() (n int) { if l > 0 { n += 1 + l + sovCommands(uint64(l)) } - if m.JoinSpace { + if m.IncludeSpaceInfo { n += 2 } return n @@ -165552,7 +165553,7 @@ func (m *RpcPublishingCreateRequest) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 4: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field JoinSpace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field IncludeSpaceInfo", wireType) } var v int for shift := uint(0); ; shift += 7 { @@ -165569,7 +165570,7 @@ func (m *RpcPublishingCreateRequest) Unmarshal(dAtA []byte) error { break } } - m.JoinSpace = bool(v != 0) + m.IncludeSpaceInfo = bool(v != 0) default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) From 891c3468360a6845275f935591b6bb9a05db54c3 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 26 Mar 2025 12:49:10 +0100 Subject: [PATCH 096/132] GO-4459: Add router_test.go --- core/api/server/middleware_test.go | 11 +---- core/api/server/router_test.go | 75 ++++++++++++++++++++++++++++++ core/api/server/server_test.go | 6 +-- 3 files changed, 79 insertions(+), 13 deletions(-) create mode 100644 core/api/server/router_test.go diff --git a/core/api/server/middleware_test.go b/core/api/server/middleware_test.go index d6dab5dba..44bfdeca4 100644 --- a/core/api/server/middleware_test.go +++ b/core/api/server/middleware_test.go @@ -11,7 +11,6 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" - "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/anytype/account/mock_account" "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/pb" @@ -19,12 +18,6 @@ import ( "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) -type fixture struct { - *Server - accountService account.Service - mwMock *mock_service.MockClientCommandsServer -} - func newFixture(t *testing.T) *fixture { mwMock := mock_service.NewMockClientCommandsServer(t) accountService := mock_account.NewMockService(t) @@ -168,9 +161,7 @@ func TestEnsureAccountInfo(t *testing.T) { expectedInfo := &model.AccountInfo{ GatewayUrl: "http://localhost:31006", } - fx.accountService.(*mock_account.MockService). - On("GetInfo", mock.Anything). - Return(expectedInfo, nil).Once() + fx.accountService.(*mock_account.MockService).On("GetInfo", mock.Anything).Return(expectedInfo, nil).Once() // when middleware := fx.ensureAccountInfo(fx.accountService) diff --git a/core/api/server/router_test.go b/core/api/server/router_test.go new file mode 100644 index 000000000..36331b194 --- /dev/null +++ b/core/api/server/router_test.go @@ -0,0 +1,75 @@ +package server + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/gogo/protobuf/types" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/anyproto/anytype-heart/core/anytype/account/mock_account" + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" +) + +func TestRouter_Unauthenticated(t *testing.T) { + t.Run("GET /v1/spaces without auth returns 401", func(t *testing.T) { + // given + fx := newServerFixture(t) + engine := fx.NewRouter(fx.accountService, fx.mwMock) + w := httptest.NewRecorder() + req := httptest.NewRequest("GET", "/v1/spaces", nil) + + // when + engine.ServeHTTP(w, req) + + // then + require.Equal(t, http.StatusUnauthorized, w.Code) + }) +} + +func TestRouter_AuthRoute(t *testing.T) { + t.Run("POST /v1/auth/token is accessible without auth", func(t *testing.T) { + // given + fx := newServerFixture(t) + engine := fx.NewRouter(fx.accountService, fx.mwMock) + w := httptest.NewRecorder() + req := httptest.NewRequest("POST", "/v1/auth/token", nil) + + // when + engine.ServeHTTP(w, req) + + // then + require.NotEqual(t, http.StatusUnauthorized, w.Code) + }) +} + +func TestRouter_MetadataHeader(t *testing.T) { + t.Run("Response includes Anytype-Version header", func(t *testing.T) { + // given + fx := newServerFixture(t) + engine := fx.NewRouter(fx.accountService, fx.mwMock) + fx.KeyToToken = map[string]string{"validKey": "dummyToken"} + fx.accountService.(*mock_account.MockService).On("GetInfo", mock.Anything). + Return(&model.AccountInfo{ + GatewayUrl: "http://localhost:31006", + }, nil).Once() + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). + Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{}, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }, nil).Once() + + w := httptest.NewRecorder() + req := httptest.NewRequest("GET", "/v1/spaces", nil) + req.Header.Set("Authorization", "Bearer validKey") + + // when + engine.ServeHTTP(w, req) + + // then + require.Equal(t, "2025-03-17", w.Header().Get("Anytype-Version")) + }) +} diff --git a/core/api/server/server_test.go b/core/api/server/server_test.go index b3cef992c..a1f880d1d 100644 --- a/core/api/server/server_test.go +++ b/core/api/server/server_test.go @@ -10,18 +10,18 @@ import ( "github.com/anyproto/anytype-heart/pb/service/mock_service" ) -type srvFixture struct { +type fixture struct { *Server accountService account.Service mwMock *mock_service.MockClientCommandsServer } -func newServerFixture(t *testing.T) *srvFixture { +func newServerFixture(t *testing.T) *fixture { mwMock := mock_service.NewMockClientCommandsServer(t) accountService := mock_account.NewMockService(t) server := NewServer(accountService, mwMock) - return &srvFixture{ + return &fixture{ Server: server, accountService: accountService, mwMock: mwMock, From cc9f55ed4dfb012c6a9e1d1fa7267e29e4ab48c2 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Thu, 27 Mar 2025 17:36:07 +0100 Subject: [PATCH 097/132] GO-5320: add widget for root collection Signed-off-by: AnastasiaShemyakinskaya --- core/block/import/common/collection.go | 94 ++++++++++++++++++- core/block/import/common/collection_test.go | 92 ++++++++++++++++++ .../import/common/workerpool/workerpool.go | 16 ++++ core/block/import/csv/converter.go | 7 +- core/block/import/csv/converter_test.go | 48 ++++++---- core/block/import/html/converter.go | 7 +- core/block/import/html/converter_test.go | 6 +- core/block/import/importer.go | 5 + core/block/import/markdown/import.go | 11 ++- core/block/import/markdown/import_test.go | 19 +++- .../import/notion/api/database/database.go | 14 +-- .../notion/api/database/database_test.go | 18 ++-- core/block/import/notion/converter.go | 6 +- core/block/import/pb/converter_test.go | 6 +- core/block/import/pb/gallery.go | 61 ++++-------- core/block/import/pb/gallery_test.go | 48 ++++++++-- core/block/import/pb/space.go | 6 +- core/block/import/pb/space_test.go | 27 +++++- core/block/import/txt/converter.go | 7 +- core/block/import/txt/converter_test.go | 6 +- 20 files changed, 382 insertions(+), 122 deletions(-) create mode 100644 core/block/import/common/collection_test.go diff --git a/core/block/import/common/collection.go b/core/block/import/common/collection.go index 101601269..ccf812d15 100644 --- a/core/block/import/common/collection.go +++ b/core/block/import/common/collection.go @@ -4,6 +4,7 @@ import ( "fmt" "time" + "github.com/globalsign/mgo/bson" "github.com/google/uuid" "github.com/anyproto/anytype-heart/core/block/collection" @@ -18,12 +19,15 @@ import ( "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) +const rootWidget = "rootWidget" + type ImportCollectionSetting struct { collectionName string targetObjects []string icon string fileKeys []*pb.ChangeFileKeys needToAddDate, shouldBeFavorite, shouldAddRelations bool + widgetSnapshot *Snapshot } func MakeImportCollectionSetting( @@ -32,6 +36,7 @@ func MakeImportCollectionSetting( icon string, fileKeys []*pb.ChangeFileKeys, needToAddDate, shouldBeFavorite, shouldAddRelations bool, + widgetSnapshot *Snapshot, ) *ImportCollectionSetting { return &ImportCollectionSetting{ collectionName: collectionName, @@ -41,6 +46,7 @@ func MakeImportCollectionSetting( needToAddDate: needToAddDate, shouldBeFavorite: shouldBeFavorite, shouldAddRelations: shouldAddRelations, + widgetSnapshot: widgetSnapshot, } } @@ -52,7 +58,7 @@ func NewImportCollection(service *collection.Service) *ImportCollection { return &ImportCollection{service: service} } -func (r *ImportCollection) MakeImportCollection(req *ImportCollectionSetting) (*Snapshot, error) { +func (r *ImportCollection) MakeImportCollection(req *ImportCollectionSetting) (*Snapshot, *Snapshot, error) { if req.needToAddDate { importDate := time.Now().Format(time.RFC3339) req.collectionName = fmt.Sprintf("%s %s", req.collectionName, importDate) @@ -62,20 +68,100 @@ func (r *ImportCollection) MakeImportCollection(req *ImportCollectionSetting) (* Value: model.InternalFlag_collectionDontIndexLinks, }}) if err != nil { - return nil, err + return nil, nil, err } if req.shouldAddRelations { err = r.addRelations(st) if err != nil { - return nil, err + return nil, nil, err } } detailsStruct = st.CombinedDetails().Merge(detailsStruct) st.UpdateStoreSlice(template.CollectionStoreKey, req.targetObjects) - return r.getRootCollectionSnapshot(req.collectionName, st, detailsStruct, req.fileKeys), nil + rootCollectionSnapshot := r.getRootCollectionSnapshot(req.collectionName, st, detailsStruct, req.fileKeys) + widgetSnapshot := r.makeWidgetSnapshot(req, rootCollectionSnapshot) + return rootCollectionSnapshot, widgetSnapshot, nil +} + +func (r *ImportCollection) makeWidgetSnapshot(req *ImportCollectionSetting, rootSnapshot *Snapshot) *Snapshot { + if req.widgetSnapshot == nil { + return r.buildNewWidgetSnapshot(rootSnapshot.Id) + } + return r.enhanceExistingSnapshot(req.widgetSnapshot, rootSnapshot.Id) +} + +func (r *ImportCollection) buildNewWidgetSnapshot(targetID string) *Snapshot { + linkBlock := r.createLinkBlock(targetID) + widgetBlock := r.createWidgetBlock(linkBlock.Id) + rootBlock := r.createSmartBlock(widgetBlock.Id) + + return &Snapshot{ + Id: rootBlock.Id, + FileName: rootWidget, + Snapshot: &SnapshotModel{ + SbType: sb.SmartBlockTypeWidget, + Data: &StateSnapshot{ + Blocks: []*model.Block{rootBlock, widgetBlock, linkBlock}, + Details: r.defaultWidgetDetails(), + ObjectTypes: []string{bundle.TypeKeyDashboard.String()}, + }, + }, + } +} + +func (r *ImportCollection) enhanceExistingSnapshot(snapshot *Snapshot, targetID string) *Snapshot { + linkBlock := r.createLinkBlock(targetID) + widgetBlock := r.createWidgetBlock(linkBlock.Id) + + for _, block := range snapshot.Snapshot.Data.Blocks { + if block.GetSmartblock() != nil { + block.ChildrenIds = append(block.ChildrenIds, widgetBlock.Id) + } + } + + snapshot.Snapshot.Data.Blocks = append(snapshot.Snapshot.Data.Blocks, linkBlock, widgetBlock) + return snapshot +} + +func (r *ImportCollection) createLinkBlock(targetID string) *model.Block { + return &model.Block{ + Id: bson.NewObjectId().Hex(), + Content: &model.BlockContentOfLink{ + Link: &model.BlockContentLink{ + TargetBlockId: targetID, + }, + }, + } +} + +func (r *ImportCollection) createWidgetBlock(childID string) *model.Block { + return &model.Block{ + Id: bson.NewObjectId().Hex(), + ChildrenIds: []string{childID}, + Content: &model.BlockContentOfWidget{ + Widget: &model.BlockContentWidget{ + Layout: model.BlockContentWidget_CompactList, + }, + }, + } +} + +func (r *ImportCollection) createSmartBlock(childID string) *model.Block { + return &model.Block{ + Id: uuid.New().String(), + ChildrenIds: []string{childID}, + Content: &model.BlockContentOfSmartblock{Smartblock: &model.BlockContentSmartblock{}}, + } +} + +func (r *ImportCollection) defaultWidgetDetails() *domain.Details { + return domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ + bundle.RelationKeyLayout: domain.Int64(model.ObjectType_dashboard), + bundle.RelationKeyIsHidden: domain.Bool(true), + }) } func (r *ImportCollection) getRootCollectionSnapshot( diff --git a/core/block/import/common/collection_test.go b/core/block/import/common/collection_test.go new file mode 100644 index 000000000..3e9aef2e2 --- /dev/null +++ b/core/block/import/common/collection_test.go @@ -0,0 +1,92 @@ +package common + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" + + "github.com/anyproto/anytype-heart/core/block/collection" + "github.com/anyproto/anytype-heart/core/domain" + "github.com/anyproto/anytype-heart/pkg/lib/bundle" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" +) + +func TestMakeImportCollection(t *testing.T) { + tests := []struct { + name string + needToAddDate bool + shouldBeFavorite bool + shouldAddRelation bool + widgetSnapshot bool + }{ + {"all false", false, false, false, false}, + {"add date", true, false, false, false}, + {"add favorite", false, true, false, false}, + {"add relations", false, false, true, false}, + {"with existing widget snapshot", false, false, false, true}, + {"all True", true, true, true, true}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + importer := NewImportCollection(collection.New()) + + var widget *Snapshot + if tt.widgetSnapshot { + widget = &Snapshot{ + Id: "widget-id", + FileName: "existing", + Snapshot: &SnapshotModel{ + Data: &StateSnapshot{ + Blocks: []*model.Block{ + { + Id: "root-block", + ChildrenIds: []string{}, + Content: &model.BlockContentOfSmartblock{ + Smartblock: &model.BlockContentSmartblock{}, + }, + }, + }, + }, + }, + } + } + + req := MakeImportCollectionSetting( + "My Collection", + []string{"obj1", "obj2"}, + "icon.png", + nil, + tt.needToAddDate, + tt.shouldBeFavorite, + tt.shouldAddRelation, + widget, + ) + + root, widgetSnap, err := importer.MakeImportCollection(req) + + assert.NoError(t, err) + assert.NotNil(t, root) + assert.NotNil(t, widgetSnap) + + if tt.needToAddDate { + assert.Contains(t, root.FileName, time.Now().Format("2006")) + } else { + assert.Equal(t, "My Collection", root.FileName) + } + + if tt.shouldBeFavorite { + assert.Equal(t, domain.Bool(true), root.Snapshot.Data.Details.Get(bundle.RelationKeyIsFavorite)) + } else { + assert.Equal(t, domain.Bool(false), root.Snapshot.Data.Details.Get(bundle.RelationKeyIsFavorite)) + } + + if tt.widgetSnapshot { + assert.Equal(t, "existing", widgetSnap.FileName) + } else { + assert.Equal(t, "rootWidget", widgetSnap.FileName) + } + }) + } +} diff --git a/core/block/import/common/workerpool/workerpool.go b/core/block/import/common/workerpool/workerpool.go index 3238acc63..9eea0d891 100644 --- a/core/block/import/common/workerpool/workerpool.go +++ b/core/block/import/common/workerpool/workerpool.go @@ -13,6 +13,7 @@ type WorkerPool struct { tasks chan ITask results chan interface{} quit chan struct{} + finalizer ITask } func NewPool(numWorkers int) *WorkerPool { @@ -34,6 +35,10 @@ func (p *WorkerPool) AddWork(t ITask) bool { return false } +func (p *WorkerPool) SetFinalizer(t ITask) { + p.finalizer = t +} + func (p *WorkerPool) Start(data interface{}) { wg := &sync.WaitGroup{} for i := 0; i < p.numWorkers; i++ { @@ -43,6 +48,7 @@ func (p *WorkerPool) Start(data interface{}) { }(i) } wg.Wait() + p.finalize(data) p.CloseResult() } @@ -72,3 +78,13 @@ func (p *WorkerPool) CloseResult() { func (p *WorkerPool) CloseTask() { close(p.tasks) } + +func (p *WorkerPool) finalize(data interface{}) { + if p.finalizer != nil { + select { + case <-p.quit: + return + case p.results <- p.finalizer.Execute(data): + } + } +} diff --git a/core/block/import/csv/converter.go b/core/block/import/csv/converter.go index a097088c9..8e50769e3 100644 --- a/core/block/import/csv/converter.go +++ b/core/block/import/csv/converter.go @@ -67,8 +67,8 @@ func (c *CSV) GetSnapshots(ctx context.Context, req *pb.RpcObjectImportRequest, return nil, allErrors } rootCollection := common.NewImportCollection(c.collectionService) - settings := common.MakeImportCollectionSetting(rootCollectionName, result.objectIDs, "", nil, true, true, true) - rootCol, err := rootCollection.MakeImportCollection(settings) + settings := common.MakeImportCollectionSetting(rootCollectionName, result.objectIDs, "", nil, true, false, true, nil) + rootCol, widgetSnapshot, err := rootCollection.MakeImportCollection(settings) if err != nil { allErrors.Add(err) if req.Mode == pb.RpcObjectImportRequest_ALL_OR_NOTHING { @@ -80,6 +80,9 @@ func (c *CSV) GetSnapshots(ctx context.Context, req *pb.RpcObjectImportRequest, result.snapshots = append(result.snapshots, rootCol) rootCollectionID = rootCol.Id } + if widgetSnapshot != nil { + result.snapshots = append(result.snapshots, widgetSnapshot) + } progress.SetTotal(int64(len(result.snapshots))) if allErrors.IsEmpty() { return &common.Response{Snapshots: result.snapshots, RootCollectionID: rootCollectionID}, nil diff --git a/core/block/import/csv/converter_test.go b/core/block/import/csv/converter_test.go index b5bb86307..07792616a 100644 --- a/core/block/import/csv/converter_test.go +++ b/core/block/import/csv/converter_test.go @@ -34,7 +34,7 @@ func TestCsv_GetSnapshotsEmptyFile(t *testing.T) { }, p) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 2) // test + root collection + assert.Len(t, sn.Snapshots, 3) // test + root collection + root collection widget assert.Contains(t, sn.Snapshots[0].FileName, "test.csv") assert.Len(t, pbtypes.GetStringList(sn.Snapshots[0].Snapshot.Data.Collections, template.CollectionStoreKey), 0) assert.NotEmpty(t, sn.Snapshots[1].Snapshot.Data.ObjectTypes) // empty collection @@ -63,21 +63,31 @@ func TestCsv_GetSnapshots(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 6) // Journal.csv + root collection + 2 objects in Journal.csv + 2 relations (Created, Tags) + assert.Len(t, sn.Snapshots, 7) // Journal.csv + root collection + 2 objects in Journal.csv + 2 relations (Created, Tags) assert.Contains(t, sn.Snapshots[0].FileName, "Journal.csv") assert.Len(t, pbtypes.GetStringList(sn.Snapshots[0].Snapshot.Data.Collections, template.CollectionStoreKey), 2) // 2 objects - var found bool + var found, foundWidget bool + var rootCollectionId string for _, snapshot := range sn.Snapshots { if strings.Contains(snapshot.FileName, rootCollectionName) { found = true + rootCollectionId = snapshot.Id assert.NotEmpty(t, snapshot.Snapshot.Data.ObjectTypes) assert.Equal(t, snapshot.Snapshot.Data.ObjectTypes[0], bundle.TypeKeyCollection.String()) assert.Len(t, pbtypes.GetStringList(snapshot.Snapshot.Data.Collections, template.CollectionStoreKey), 1) // only Journal.csv collection } + if snapshot.Snapshot.SbType == sb.SmartBlockTypeWidget { + foundWidget = true + assert.Len(t, snapshot.Snapshot.Data.Blocks, 3) + assert.NotNil(t, snapshot.Snapshot.Data.Blocks[1].GetWidget()) + assert.NotNil(t, snapshot.Snapshot.Data.Blocks[2].GetLink()) + assert.Equal(t, rootCollectionId, snapshot.Snapshot.Data.Blocks[2].GetLink().GetTargetBlockId()) + } } assert.True(t, found) + assert.True(t, foundWidget) } func TestCsv_GetSnapshotsTable(t *testing.T) { @@ -97,7 +107,7 @@ func TestCsv_GetSnapshotsTable(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 2) // 1 page with table + root collection + assert.Len(t, sn.Snapshots, 3) // 1 page with table + root collection + root collection widget assert.Contains(t, sn.Snapshots[0].FileName, "Journal.csv") var found bool @@ -127,7 +137,7 @@ func TestCsv_GetSnapshotsTableUseFirstColumnForRelationsOn(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 2) // 1 page with table + root collection + assert.Len(t, sn.Snapshots, 3) // 1 page with table + root collection + root collection widget assert.Contains(t, sn.Snapshots[0].FileName, "Journal.csv") var rowsID []string @@ -167,7 +177,7 @@ func TestCsv_GetSnapshotsSemiColon(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 16) // 8 objects + root collection + semicolon collection + 5 relations + assert.Len(t, sn.Snapshots, 17) // 8 objects + root collection + semicolon collection + 5 relations + root collection widget assert.Contains(t, sn.Snapshots[0].FileName, "semicolon.csv") assert.Len(t, pbtypes.GetStringList(sn.Snapshots[0].Snapshot.Data.Collections, template.CollectionStoreKey), 8) assert.Equal(t, sn.Snapshots[0].Snapshot.Data.ObjectTypes[0], bundle.TypeKeyCollection.String()) @@ -192,7 +202,7 @@ func TestCsv_GetSnapshotsTranspose(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 4) // 2 object + root collection + transpose collection + 1 relations + assert.Len(t, sn.Snapshots, 5) // 2 object + root collection + transpose collection + 1 relations + root collection widget for _, snapshot := range sn.Snapshots { if snapshot.Snapshot.SbType == sb.SmartBlockTypeRelation { @@ -236,7 +246,7 @@ func TestCsv_GetSnapshotsTranspose(t *testing.T) { // then assert.Nil(t, err) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 4) + assert.Len(t, sn.Snapshots, 5) for _, snapshot := range sn.Snapshots { if snapshot.Snapshot.SbType == sb.SmartBlockTypeRelation { @@ -265,7 +275,7 @@ func TestCsv_GetSnapshotsTransposeUseFirstRowForRelationsOff(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 5) // 2 object + root collection + transpose collection + 1 relations + assert.Len(t, sn.Snapshots, 6) // 2 object + root collection + transpose collection + 1 relations + root collection widget for _, snapshot := range sn.Snapshots { if snapshot.Snapshot.SbType == sb.SmartBlockTypeRelation { @@ -292,7 +302,7 @@ func TestCsv_GetSnapshotsUseFirstColumnForRelationsOn(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 6) // Journal.csv collection, root collection + 2 objects in Journal.csv + 2 relations (Created, Tags) + assert.Len(t, sn.Snapshots, 7) // Journal.csv collection, root collection + 2 objects in Journal.csv + 2 relations (Created, Tags) + root collection widget var rowsObjects []*common.Snapshot for _, snapshot := range sn.Snapshots { @@ -303,7 +313,7 @@ func TestCsv_GetSnapshotsUseFirstColumnForRelationsOn(t *testing.T) { } } - assert.Len(t, rowsObjects, 2) + assert.Len(t, rowsObjects, 3) want := [][]string{ {"Hawaii Vacation", "July 13, 2022 8:54 AM", "Special Event"}, @@ -338,7 +348,7 @@ func TestCsv_GetSnapshotsUseFirstColumnForRelationsOff(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 7) // Journal.csv collection, root collection + 3 objects in Journal.csv + 2 relations (Created, Tags) + assert.Len(t, sn.Snapshots, 8) // Journal.csv collection, root collection + 3 objects in Journal.csv + 2 relations (Created, Tags) + root collection widget var objects []*common.Snapshot for _, snapshot := range sn.Snapshots { @@ -349,7 +359,7 @@ func TestCsv_GetSnapshotsUseFirstColumnForRelationsOff(t *testing.T) { } } - assert.Len(t, objects, 3) // first row is also an object + assert.Len(t, objects, 4) // first row is also an object want := [][]string{ {"Name", "Created", "Tags"}, @@ -514,7 +524,7 @@ func TestCsv_GetSnapshots1000RowsFile(t *testing.T) { var objects []*common.Snapshot for _, snapshot := range sn.Snapshots { // only objects created from rows - if snapshot.Snapshot.SbType != sb.SmartBlockTypeRelation && + if snapshot.Snapshot.SbType != sb.SmartBlockTypeRelation && snapshot.Snapshot.SbType != sb.SmartBlockTypeWidget && !lo.Contains(snapshot.Snapshot.Data.ObjectTypes, bundle.TypeKeyCollection.String()) { objects = append(objects, snapshot) } @@ -540,7 +550,7 @@ func TestCsv_GetSnapshots1000RowsFile(t *testing.T) { objects = []*common.Snapshot{} for _, snapshot := range sn.Snapshots { // only objects created from rows - if snapshot.Snapshot.SbType != sb.SmartBlockTypeRelation && + if snapshot.Snapshot.SbType != sb.SmartBlockTypeRelation && snapshot.Snapshot.SbType != sb.SmartBlockTypeWidget && !lo.Contains(snapshot.Snapshot.Data.ObjectTypes, bundle.TypeKeyCollection.String()) { objects = append(objects, snapshot) } @@ -663,7 +673,7 @@ func TestCsv_GetSnapshots10Relations(t *testing.T) { var objects []*common.Snapshot for _, snapshot := range sn.Snapshots { // only objects created from rows - if snapshot.Snapshot.SbType != sb.SmartBlockTypeRelation && + if snapshot.Snapshot.SbType != sb.SmartBlockTypeRelation && snapshot.Snapshot.SbType != sb.SmartBlockTypeWidget && !lo.Contains(snapshot.Snapshot.Data.ObjectTypes, bundle.TypeKeyCollection.String()) { objects = append(objects, snapshot) } @@ -694,7 +704,7 @@ func TestCsv_GetSnapshots10Relations(t *testing.T) { objects = []*common.Snapshot{} for _, snapshot := range sn.Snapshots { // only objects created from rows - if snapshot.Snapshot.SbType != sb.SmartBlockTypeRelation && + if snapshot.Snapshot.SbType != sb.SmartBlockTypeRelation && snapshot.Snapshot.SbType != sb.SmartBlockTypeWidget && !lo.Contains(snapshot.Snapshot.Data.ObjectTypes, bundle.TypeKeyCollection.String()) { objects = append(objects, snapshot) } @@ -738,7 +748,7 @@ func TestCsv_GetSnapshotsTableModeDifferentColumnsNumber(t *testing.T) { objects = append(objects, snapshot) } } - assert.Len(t, objects, 1) + assert.Len(t, objects, 2) assert.Equal(t, objects[0].Snapshot.Data.Details.GetString(bundle.RelationKeyName), "differentcolumnnumber") numberOfCSVColumns := lo.CountBy(objects[0].Snapshot.Data.Blocks, func(item *model.Block) bool { return item.GetTableColumn() != nil }) assert.Equal(t, 5, numberOfCSVColumns) @@ -771,7 +781,7 @@ func TestCsv_GetSnapshotsTableModeDifferentColumnsNumber(t *testing.T) { var objects []*common.Snapshot for _, snapshot := range sn.Snapshots { // only objects created from rows - if snapshot.Snapshot.SbType != sb.SmartBlockTypeRelation && + if snapshot.Snapshot.SbType != sb.SmartBlockTypeRelation && snapshot.Snapshot.SbType != sb.SmartBlockTypeWidget && !lo.Contains(snapshot.Snapshot.Data.ObjectTypes, bundle.TypeKeyCollection.String()) { objects = append(objects, snapshot) } diff --git a/core/block/import/html/converter.go b/core/block/import/html/converter.go index bf3e711fc..036edf186 100644 --- a/core/block/import/html/converter.go +++ b/core/block/import/html/converter.go @@ -66,8 +66,8 @@ func (h *HTML) GetSnapshots(ctx context.Context, req *pb.RpcObjectImportRequest, return nil, allErrors } rootCollection := common.NewImportCollection(h.collectionService) - settings := common.MakeImportCollectionSetting(rootCollectionName, targetObjects, "", nil, true, true, true) - rootCollectionSnapshot, err := rootCollection.MakeImportCollection(settings) + settings := common.MakeImportCollectionSetting(rootCollectionName, targetObjects, "", nil, true, false, true, nil) + rootCollectionSnapshot, widgetSnapshot, err := rootCollection.MakeImportCollection(settings) if err != nil { allErrors.Add(err) if allErrors.ShouldAbortImport(len(path), req.Type) { @@ -79,6 +79,9 @@ func (h *HTML) GetSnapshots(ctx context.Context, req *pb.RpcObjectImportRequest, snapshots = append(snapshots, rootCollectionSnapshot) rootCollectionID = rootCollectionSnapshot.Id } + if widgetSnapshot != nil { + snapshots = append(snapshots, widgetSnapshot) + } progress.SetTotal(int64(numberOfStages * len(snapshots))) if allErrors.IsEmpty() { return &common.Response{Snapshots: snapshots, RootCollectionID: rootCollectionID}, nil diff --git a/core/block/import/html/converter_test.go b/core/block/import/html/converter_test.go index 3198db518..ad560993e 100644 --- a/core/block/import/html/converter_test.go +++ b/core/block/import/html/converter_test.go @@ -44,7 +44,7 @@ func TestHTML_GetSnapshots(t *testing.T) { ) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 2) + assert.Len(t, sn.Snapshots, 3) assert.Contains(t, sn.Snapshots[0].FileName, "test.html") assert.NotEmpty(t, sn.Snapshots[0].Snapshot.Data.Details.GetString("name")) assert.Equal(t, sn.Snapshots[0].Snapshot.Data.Details.GetString("name"), "test") @@ -53,6 +53,10 @@ func TestHTML_GetSnapshots(t *testing.T) { assert.NotEmpty(t, sn.Snapshots[1].Snapshot.Data.ObjectTypes) assert.Equal(t, sn.Snapshots[1].Snapshot.Data.ObjectTypes[0], bundle.TypeKeyCollection.String()) + assert.Len(t, sn.Snapshots[2].Snapshot.Data.Blocks, 3) + assert.NotNil(t, sn.Snapshots[2].Snapshot.Data.Blocks[1].GetWidget()) + assert.NotNil(t, sn.Snapshots[2].Snapshot.Data.Blocks[2].GetLink()) + assert.Equal(t, sn.Snapshots[1].Id, sn.Snapshots[2].Snapshot.Data.Blocks[2].GetLink().GetTargetBlockId()) assert.NotEmpty(t, err) assert.True(t, errors.Is(err.GetResultError(model.Import_Html), common.ErrFileImportNoObjectsInDirectory)) }) diff --git a/core/block/import/importer.go b/core/block/import/importer.go index be951427d..3ae7874ad 100644 --- a/core/block/import/importer.go +++ b/core/block/import/importer.go @@ -42,6 +42,7 @@ import ( "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/core" + "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock" "github.com/anyproto/anytype-heart/pkg/lib/localstore/addr" "github.com/anyproto/anytype-heart/pkg/lib/localstore/filestore" "github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore" @@ -492,6 +493,10 @@ func (i *Import) extractInternalKey(snapshot *common.Snapshot, oldIDToNew map[st func (i *Import) addWork(res *common.Response, pool *workerpool.WorkerPool) { for _, snapshot := range res.Snapshots { t := creator.NewTask(snapshot, i.oc) + if snapshot.Snapshot.SbType == smartblock.SmartBlockTypeWidget { + pool.SetFinalizer(t) + continue + } stop := pool.AddWork(t) if stop { break diff --git a/core/block/import/markdown/import.go b/core/block/import/markdown/import.go index e519effc3..f731f90bb 100644 --- a/core/block/import/markdown/import.go +++ b/core/block/import/markdown/import.go @@ -102,8 +102,8 @@ func (m *Markdown) processFiles(req *pb.RpcObjectImportRequest, progress process func (m *Markdown) createRootCollection(allSnapshots []*common.Snapshot, allRootObjectsIds []string) ([]*common.Snapshot, string, error) { rootCollection := common.NewImportCollection(m.service) - settings := common.MakeImportCollectionSetting(rootCollectionName, allRootObjectsIds, "", nil, true, true, true) - rootCol, err := rootCollection.MakeImportCollection(settings) + settings := common.MakeImportCollectionSetting(rootCollectionName, allRootObjectsIds, "", nil, true, false, true, nil) + rootCol, widgetSnapshot, err := rootCollection.MakeImportCollection(settings) if err != nil { return nil, "", err } @@ -113,6 +113,9 @@ func (m *Markdown) createRootCollection(allSnapshots []*common.Snapshot, allRoot allSnapshots = append(allSnapshots, rootCol) rootCollectionID = rootCol.Id } + if widgetSnapshot != nil { + allSnapshots = append(allSnapshots, widgetSnapshot) + } return allSnapshots, rootCollectionID, nil } @@ -424,8 +427,8 @@ func (m *Markdown) createSnapshots( func (m *Markdown) addCollectionSnapshot(fileName string, file *FileInfo, snapshots []*common.Snapshot) ([]*common.Snapshot, error) { c := common.NewImportCollection(m.service) - settings := common.MakeImportCollectionSetting(file.Title, file.CollectionsObjectsIds, "", nil, false, false, false) - csvCollection, err := c.MakeImportCollection(settings) + settings := common.MakeImportCollectionSetting(file.Title, file.CollectionsObjectsIds, "", nil, false, false, false, nil) + csvCollection, _, err := c.MakeImportCollection(settings) if err != nil { return nil, err } diff --git a/core/block/import/markdown/import_test.go b/core/block/import/markdown/import_test.go index 9cafe0409..386273b56 100644 --- a/core/block/import/markdown/import_test.go +++ b/core/block/import/markdown/import_test.go @@ -14,6 +14,7 @@ import ( "github.com/anyproto/anytype-heart/core/block/import/common/test" "github.com/anyproto/anytype-heart/core/block/process" "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" "github.com/anyproto/anytype-heart/tests/blockbuilder" ) @@ -37,10 +38,10 @@ func TestMarkdown_GetSnapshots(t *testing.T) { // then assert.Nil(t, err) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 3) + assert.Len(t, sn.Snapshots, 4) var ( - found bool - subPageId string + found, foundWidget bool + subPageId string ) for _, snapshot := range sn.Snapshots { if snapshot.FileName == filepath.Join(testDirectory, "test_database", "test.md") { @@ -54,10 +55,18 @@ func TestMarkdown_GetSnapshots(t *testing.T) { assert.NotEmpty(t, snapshot.Snapshot.Data.Collections.Fields["objects"]) assert.Len(t, snapshot.Snapshot.Data.Collections.Fields["objects"].GetListValue().GetValues(), 1) assert.Equal(t, subPageId, snapshot.Snapshot.Data.Collections.Fields["objects"].GetListValue().GetValues()[0].GetStringValue()) + } + if snapshot.Snapshot.SbType == smartblock.SmartBlockTypeWidget { + foundWidget = true + assert.Len(t, snapshot.Snapshot.Data.Blocks, 3) + assert.NotNil(t, snapshot.Snapshot.Data.Blocks[1].GetWidget()) + assert.NotNil(t, snapshot.Snapshot.Data.Blocks[2].GetLink()) + assert.NotEmpty(t, snapshot.Snapshot.Data.Blocks[2].GetLink().GetTargetBlockId()) break } } assert.True(t, found) + assert.True(t, foundWidget) }) t.Run("no object error", func(t *testing.T) { // given @@ -98,7 +107,7 @@ func TestMarkdown_GetSnapshots(t *testing.T) { // then assert.Nil(t, err) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 7) + assert.Len(t, sn.Snapshots, 8) fileNameToObjectId := make(map[string]string, len(sn.Snapshots)) for _, snapshot := range sn.Snapshots { @@ -179,7 +188,7 @@ func TestMarkdown_GetSnapshots(t *testing.T) { // then assert.Nil(t, ce) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 4) + assert.Len(t, sn.Snapshots, 5) fileNameToObjectId := make(map[string]string, len(sn.Snapshots)) for _, snapshot := range sn.Snapshots { fileNameToObjectId[snapshot.FileName] = snapshot.Id diff --git a/core/block/import/notion/api/database/database.go b/core/block/import/notion/api/database/database.go index 997687e0f..cbd4357a1 100644 --- a/core/block/import/notion/api/database/database.go +++ b/core/block/import/notion/api/database/database.go @@ -345,18 +345,20 @@ func (ds *Service) AddPagesToCollections(databaseSnapshots []*common.Snapshot, p } } -func (ds *Service) AddObjectsToNotionCollection(notionContext *api.NotionImportContext, +func (ds *Service) AddObjectsToNotionCollection( + notionContext *api.NotionImportContext, notionDB []Database, - notionPages []page.Page) (*common.Snapshot, error) { + notionPages []page.Page, +) (*common.Snapshot, *common.Snapshot, error) { allObjects := ds.filterObjects(notionContext, notionDB, notionPages) rootCollection := common.NewImportCollection(ds.collectionService) - settings := common.MakeImportCollectionSetting(rootCollectionName, allObjects, "", nil, true, true, true) - rootCol, err := rootCollection.MakeImportCollection(settings) + settings := common.MakeImportCollectionSetting(rootCollectionName, allObjects, "", nil, true, false, true, nil) + rootCol, widget, err := rootCollection.MakeImportCollection(settings) if err != nil { - return nil, err + return nil, nil, err } - return rootCol, nil + return rootCol, widget, nil } func (ds *Service) filterObjects(notionContext *api.NotionImportContext, diff --git a/core/block/import/notion/api/database/database_test.go b/core/block/import/notion/api/database/database_test.go index 53090238c..ead10e9dd 100644 --- a/core/block/import/notion/api/database/database_test.go +++ b/core/block/import/notion/api/database/database_test.go @@ -41,7 +41,7 @@ func TestService_AddObjectsToNotionCollection(t *testing.T) { } // when - collection, err := service.AddObjectsToNotionCollection(notionImportContext, nil, notionPages) + collection, _, err := service.AddObjectsToNotionCollection(notionImportContext, nil, notionPages) // then assert.Nil(t, err) @@ -83,7 +83,7 @@ func TestService_AddObjectsToNotionCollection(t *testing.T) { } // when - collection, err := service.AddObjectsToNotionCollection(notionImportContext, nil, notionPages) + collection, _, err := service.AddObjectsToNotionCollection(notionImportContext, nil, notionPages) // then assert.Nil(t, err) @@ -119,7 +119,7 @@ func TestService_AddObjectsToNotionCollection(t *testing.T) { } // when - collection, err := service.AddObjectsToNotionCollection(notionImportContext, nil, notionPages) + collection, _, err := service.AddObjectsToNotionCollection(notionImportContext, nil, notionPages) // then assert.Nil(t, err) @@ -166,7 +166,7 @@ func TestService_AddObjectsToNotionCollection(t *testing.T) { } // when - collection, err := service.AddObjectsToNotionCollection(notionImportContext, notionDB, notionPages) + collection, _, err := service.AddObjectsToNotionCollection(notionImportContext, notionDB, notionPages) // then assert.Nil(t, err) @@ -205,7 +205,7 @@ func TestService_AddObjectsToNotionCollection(t *testing.T) { } // when - collection, err := service.AddObjectsToNotionCollection(notionImportContext, notionDB, notionPages) + collection, _, err := service.AddObjectsToNotionCollection(notionImportContext, notionDB, notionPages) // then assert.Nil(t, err) @@ -251,7 +251,7 @@ func TestService_AddObjectsToNotionCollection(t *testing.T) { } // when - collection, err := service.AddObjectsToNotionCollection(notionImportContext, notionDB, notionPages) + collection, _, err := service.AddObjectsToNotionCollection(notionImportContext, notionDB, notionPages) // then assert.Nil(t, err) @@ -287,7 +287,7 @@ func TestService_AddObjectsToNotionCollection(t *testing.T) { } // when - collection, err := service.AddObjectsToNotionCollection(notionImportContext, notionDB, nil) + collection, _, err := service.AddObjectsToNotionCollection(notionImportContext, notionDB, nil) // then assert.Nil(t, err) @@ -329,7 +329,7 @@ func TestService_AddObjectsToNotionCollection(t *testing.T) { } // when - collection, err := service.AddObjectsToNotionCollection(notionImportContext, nil, notionPages) + collection, _, err := service.AddObjectsToNotionCollection(notionImportContext, nil, notionPages) // then assert.Nil(t, err) @@ -368,7 +368,7 @@ func TestService_AddObjectsToNotionCollection(t *testing.T) { } // when - collection, err := service.AddObjectsToNotionCollection(notionImportContext, nil, notionPages) + collection, _, err := service.AddObjectsToNotionCollection(notionImportContext, nil, notionPages) // then assert.Nil(t, err) diff --git a/core/block/import/notion/converter.go b/core/block/import/notion/converter.go index f16ecf1d9..ae58034ba 100644 --- a/core/block/import/notion/converter.go +++ b/core/block/import/notion/converter.go @@ -116,7 +116,7 @@ func (n *Notion) GetSnapshots(ctx context.Context, req *pb.RpcObjectImportReques n.dbService.AddPagesToCollections(dbs, pages, db, notionImportContext.NotionPageIdsToAnytype, notionImportContext.NotionDatabaseIdsToAnytype) - rootCollectionSnapshot, err := n.dbService.AddObjectsToNotionCollection(notionImportContext, db, pages) + rootCollectionSnapshot, widgetSnapshot, err := n.dbService.AddObjectsToNotionCollection(notionImportContext, db, pages) if err != nil { ce.Add(err) if ce.ShouldAbortImport(0, req.Type) { @@ -132,6 +132,10 @@ func (n *Notion) GetSnapshots(ctx context.Context, req *pb.RpcObjectImportReques allSnapshots = append(allSnapshots, pgs...) allSnapshots = append(allSnapshots, dbs...) + if widgetSnapshot != nil { + allSnapshots = append(allSnapshots, widgetSnapshot) + } + if !ce.IsEmpty() { return &common.Response{Snapshots: allSnapshots, RootCollectionID: rootCollectionID}, ce } diff --git a/core/block/import/pb/converter_test.go b/core/block/import/pb/converter_test.go index 59040cbc3..d9b8c62c2 100644 --- a/core/block/import/pb/converter_test.go +++ b/core/block/import/pb/converter_test.go @@ -50,7 +50,7 @@ func Test_GetSnapshotsSuccess(t *testing.T) { }, process.NewNoOp()) assert.Nil(t, ce) - assert.Len(t, res.Snapshots, 2) + assert.Len(t, res.Snapshots, 3) assert.Contains(t, res.Snapshots[1].FileName, rootCollectionName) assert.NotEmpty(t, res.Snapshots[1].Snapshot.Data.ObjectTypes) @@ -159,7 +159,7 @@ func Test_GetSnapshotsFailedToGetSnapshotForTwoFiles(t *testing.T) { assert.NotNil(t, ce) assert.NotNil(t, res.Snapshots) - assert.Len(t, res.Snapshots, 2) + assert.Len(t, res.Snapshots, 3) assert.False(t, ce.IsEmpty()) } @@ -215,7 +215,7 @@ func Test_GetSnapshotsSkipFileWithoutExtension(t *testing.T) { assert.Nil(t, ce) assert.NotNil(t, res.Snapshots) - assert.Len(t, res.Snapshots, 2) + assert.Len(t, res.Snapshots, 3) assert.Equal(t, res.Snapshots[0].FileName, "bafyreig5sd7mlmhindapjuvzc4gnetdbszztb755sa7nflojkljmu56mmi.pb") assert.Contains(t, res.Snapshots[1].FileName, rootCollectionName) diff --git a/core/block/import/pb/gallery.go b/core/block/import/pb/gallery.go index 2945dd4f7..0cea9c4cd 100644 --- a/core/block/import/pb/gallery.go +++ b/core/block/import/pb/gallery.go @@ -1,7 +1,6 @@ package pb import ( - "github.com/globalsign/mgo/bson" "github.com/samber/lo" "github.com/anyproto/anytype-heart/core/block/collection" @@ -13,7 +12,6 @@ import ( "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock" "github.com/anyproto/anytype-heart/pkg/lib/localstore/addr" - "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) const widgetCollectionPattern = "'s Widgets" @@ -32,7 +30,7 @@ func (g *GalleryImport) ProvideCollection(snapshots []*common.Snapshot, params *pb.RpcObjectImportRequestPbParams, workspaceSnapshot *common.Snapshot, isNewSpace bool, -) (collectionsSnapshots []*common.Snapshot, err error) { +) (resultSnapshots []*common.Snapshot, err error) { if isNewSpace { return nil, nil } @@ -41,8 +39,9 @@ func (g *GalleryImport) ProvideCollection(snapshots []*common.Snapshot, widgetObjects = g.getObjectsFromWidgets(widget) } var ( - icon string - fileKeys []*pb.ChangeFileKeys + icon string + fileKeys []*pb.ChangeFileKeys + widgetSnapshot *common.Snapshot ) if workspaceSnapshot != nil { // we use space icon for import collection icon = workspaceSnapshot.Snapshot.Data.Details.GetString(bundle.RelationKeyIconImage) @@ -54,42 +53,39 @@ func (g *GalleryImport) ProvideCollection(snapshots []*common.Snapshot, } rootCollection := common.NewImportCollection(g.service) if len(widgetObjects) > 0 { - collectionsSnapshots, err = g.getWidgetsCollection(collectionName, rootCollection, widgetObjects, icon, fileKeys, widget, collectionsSnapshots) + resultSnapshots, widgetSnapshot, err = g.getWidgetsCollection(collectionName, rootCollection, widgetObjects, icon, fileKeys, resultSnapshots) if err != nil { return nil, err } } objectsIDs := g.getObjectsIDs(snapshots) - settings := common.MakeImportCollectionSetting(collectionName, objectsIDs, icon, fileKeys, false, true, true) - objectsCollection, err := rootCollection.MakeImportCollection(settings) + settings := common.MakeImportCollectionSetting(collectionName, objectsIDs, icon, fileKeys, false, false, true, widgetSnapshot) + objectsCollection, widgetSnapshot, err := rootCollection.MakeImportCollection(settings) if err != nil { return nil, err } - collectionsSnapshots = append(collectionsSnapshots, objectsCollection) - return collectionsSnapshots, err + resultSnapshots = append(resultSnapshots, objectsCollection, widgetSnapshot) + return resultSnapshots, nil } -func (g *GalleryImport) getWidgetsCollection(collectionName string, +func (g *GalleryImport) getWidgetsCollection( + collectionName string, rootCollection *common.ImportCollection, widgetObjects []string, icon string, fileKeys []*pb.ChangeFileKeys, - widget *common.Snapshot, collectionsSnapshots []*common.Snapshot, -) ([]*common.Snapshot, error) { +) ([]*common.Snapshot, *common.Snapshot, error) { widgetCollectionName := collectionName + widgetCollectionPattern - settings := common.MakeImportCollectionSetting(widgetCollectionName, widgetObjects, icon, fileKeys, false, false, true) - widgetsCollectionSnapshot, err := rootCollection.MakeImportCollection(settings) + settings := common.MakeImportCollectionSetting(widgetCollectionName, widgetObjects, icon, fileKeys, false, false, true, nil) + widgetsCollectionSnapshot, widget, err := rootCollection.MakeImportCollection(settings) if err != nil { - return nil, err - } - if widgetsCollectionSnapshot != nil && widget != nil { - g.addCollectionWidget(widget, widgetsCollectionSnapshot.Id) + return nil, nil, err } if widgetsCollectionSnapshot != nil { collectionsSnapshots = append(collectionsSnapshots, widgetsCollectionSnapshot) } - return collectionsSnapshots, nil + return collectionsSnapshots, widget, nil } func (g *GalleryImport) getObjectsFromWidgets(widgetSnapshot *common.Snapshot) []string { @@ -113,31 +109,6 @@ func (g *GalleryImport) getObjectsFromWidgets(widgetSnapshot *common.Snapshot) [ return objectsInWidget } -func (g *GalleryImport) addCollectionWidget(widgetSnapshot *common.Snapshot, collectionID string) { - id := bson.NewObjectId().Hex() - // create widget for import collection - linkBlock := &model.Block{ - Id: id, - Content: &model.BlockContentOfLink{ - Link: &model.BlockContentLink{ - TargetBlockId: collectionID, - }, - }, - } - widgetID := bson.NewObjectId().Hex() - widgetBlock := &model.Block{ - Id: widgetID, - ChildrenIds: []string{id}, - Content: &model.BlockContentOfWidget{Widget: &model.BlockContentWidget{ - Layout: model.BlockContentWidget_CompactList, - Limit: 0, - ViewId: "", - }}, - } - // for widget object we only add import collection, other widgets should be erased - widgetSnapshot.Snapshot.Data.Blocks = []*model.Block{widgetBlock, linkBlock} -} - func (g *GalleryImport) getObjectsIDs(snapshots []*common.Snapshot) []string { var resultIDs []string for _, snapshot := range snapshots { diff --git a/core/block/import/pb/gallery_test.go b/core/block/import/pb/gallery_test.go index 140390ca6..57835df8e 100644 --- a/core/block/import/pb/gallery_test.go +++ b/core/block/import/pb/gallery_test.go @@ -28,7 +28,7 @@ func TestGalleryImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) - assert.Len(t, collection, 1) + assert.Len(t, collection, 2) assert.NotContains(t, widgetCollectionPattern, collection[0].FileName) }) t.Run("CollectionTitle parameter is empty - collection with default name", func(t *testing.T) { @@ -41,7 +41,7 @@ func TestGalleryImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) - assert.Len(t, collection, 1) + assert.Len(t, collection, 2) assert.Equal(t, rootCollectionName, collection[0].FileName) }) t.Run("CollectionTitle parameter is equal 'test' - collection with name test", func(t *testing.T) { @@ -54,7 +54,7 @@ func TestGalleryImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) - assert.Len(t, collection, 1) + assert.Len(t, collection, 2) assert.Equal(t, "test", collection[0].FileName) }) t.Run("widget with sets - only objects root collection as we ignore default sets and not create widgets collection", func(t *testing.T) { @@ -135,7 +135,7 @@ func TestGalleryImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) - assert.Len(t, collection, 1) + assert.Len(t, collection, 2) assert.NotContains(t, widgetCollectionPattern, collection[0].FileName) }) t.Run("default sets and objects in widget - root collection with objects from widget and object root collection are created", func(t *testing.T) { @@ -206,7 +206,7 @@ func TestGalleryImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) - assert.Len(t, collection, 2) + assert.Len(t, collection, 3) rootCollectionState := state.NewDocFromSnapshot("", collection[0].Snapshot.ToProto()).(*state.State) objectsInCollection := rootCollectionState.GetStoreSlice(template.CollectionStoreKey) assert.Len(t, objectsInCollection, 1) @@ -241,7 +241,7 @@ func TestGalleryImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) - assert.Len(t, collection, 1) + assert.Len(t, collection, 2) assert.NotContains(t, widgetCollectionPattern, collection[0].FileName) }) @@ -255,7 +255,7 @@ func TestGalleryImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) - assert.Len(t, collection, 1) + assert.Len(t, collection, 2) assert.Empty(t, collection[0].Snapshot.Data.Details.GetString(bundle.RelationKeyIconImage)) }) t.Run("workspace without icon - root collection without icon", func(t *testing.T) { @@ -278,7 +278,7 @@ func TestGalleryImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) - assert.Len(t, collection, 1) + assert.Len(t, collection, 2) assert.Empty(t, collection[0].Snapshot.Data.Details.GetString(bundle.RelationKeyIconImage)) }) t.Run("workspace with icon - root collection with icon", func(t *testing.T) { @@ -303,7 +303,7 @@ func TestGalleryImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) - assert.Len(t, collection, 1) + assert.Len(t, collection, 2) assert.Equal(t, "icon", collection[0].Snapshot.Data.Details.GetString(bundle.RelationKeyIconImage)) }) t.Run("if import in new space - not create anything", func(t *testing.T) { @@ -349,7 +349,35 @@ func TestGalleryImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) - assert.Len(t, collection, 1) + assert.Len(t, collection, 2) assert.NotContains(t, widgetCollectionPattern, collection[0].FileName) }) + t.Run("widget with collection", func(t *testing.T) { + // given + p := GalleryImport{} + params := &pb.RpcObjectImportRequestPbParams{NoCollection: false} + + // object with widget + widgetSnapshot := &common.Snapshot{ + Id: "widgetID", + Snapshot: &common.SnapshotModel{ + SbType: smartblock.SmartBlockTypeWidget, + Data: &common.StateSnapshot{ + Blocks: []*model.Block{}, + }, + }, + } + + // when + collection, err := p.ProvideCollection(nil, widgetSnapshot, nil, params, nil, false) + + // then + assert.Nil(t, err) + assert.Len(t, collection, 2) + assert.Equal(t, smartblock.SmartBlockTypeWidget, collection[1].Snapshot.SbType) + assert.Len(t, collection[1].Snapshot.Data.Blocks, 3) + assert.NotNil(t, collection[1].Snapshot.Data.Blocks[1].GetWidget()) + assert.NotNil(t, collection[1].Snapshot.Data.Blocks[2].GetLink()) + assert.Equal(t, collection[0].Id, collection[1].Snapshot.Data.Blocks[2].GetLink().GetTargetBlockId()) + }) } diff --git a/core/block/import/pb/space.go b/core/block/import/pb/space.go index 73e69e29a..f459fde1d 100644 --- a/core/block/import/pb/space.go +++ b/core/block/import/pb/space.go @@ -56,12 +56,12 @@ func (s *SpaceImport) ProvideCollection(snapshots []*common.Snapshot, }) } rootCollection := common.NewImportCollection(s.service) - settings := common.MakeImportCollectionSetting(rootCollectionName, rootObjects, "", nil, true, true, true) - rootCollectionSnapshot, err := rootCollection.MakeImportCollection(settings) + settings := common.MakeImportCollectionSetting(rootCollectionName, rootObjects, "", nil, true, false, true, widgetSnapshot) + rootCollectionSnapshot, widgetSnapshot, err := rootCollection.MakeImportCollection(settings) if err != nil { return nil, err } - return []*common.Snapshot{rootCollectionSnapshot}, nil + return []*common.Snapshot{rootCollectionSnapshot, widgetSnapshot}, nil } func (s *SpaceImport) objectShouldBeSkipped(item *common.Snapshot) bool { diff --git a/core/block/import/pb/space_test.go b/core/block/import/pb/space_test.go index 119fa6cbe..f12b561ae 100644 --- a/core/block/import/pb/space_test.go +++ b/core/block/import/pb/space_test.go @@ -27,7 +27,7 @@ func TestSpaceImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) - assert.Len(t, collection, 1) + assert.Len(t, collection, 2) rootCollectionState := state.NewDocFromSnapshot("", collection[0].Snapshot.ToProto()).(*state.State) objectsInCollection := rootCollectionState.GetStoreSlice(template.CollectionStoreKey) assert.Len(t, objectsInCollection, 0) @@ -82,7 +82,7 @@ func TestSpaceImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) assert.NotNil(t, collection) - assert.Len(t, collection, 1) + assert.Len(t, collection, 2) rootCollectionState := state.NewDocFromSnapshot("", collection[0].Snapshot.ToProto()).(*state.State) objectsInCollection := rootCollectionState.GetStoreSlice(template.CollectionStoreKey) assert.Len(t, objectsInCollection, 3) @@ -172,7 +172,7 @@ func TestSpaceImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) assert.NotNil(t, collection) - assert.Len(t, collection, 1) + assert.Len(t, collection, 2) rootCollectionState := state.NewDocFromSnapshot("", collection[0].Snapshot.ToProto()).(*state.State) objectsInCollection := rootCollectionState.GetStoreSlice(template.CollectionStoreKey) assert.Len(t, objectsInCollection, 1) @@ -261,7 +261,7 @@ func TestSpaceImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) assert.NotNil(t, collection) - assert.Len(t, collection, 1) + assert.Len(t, collection, 2) rootCollectionState := state.NewDocFromSnapshot("", collection[0].Snapshot.ToProto()).(*state.State) objectsInCollection := rootCollectionState.GetStoreSlice(template.CollectionStoreKey) assert.Len(t, objectsInCollection, 1) @@ -365,9 +365,26 @@ func TestSpaceImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) assert.NotNil(t, collection) - assert.Len(t, collection, 1) + assert.Len(t, collection, 2) rootCollectionState := state.NewDocFromSnapshot("", collection[0].Snapshot.ToProto()).(*state.State) objectsInCollection := rootCollectionState.GetStoreSlice(template.CollectionStoreKey) assert.Equal(t, []string{"newObjectInWidget", "id1", "spaceDashboardId"}, objectsInCollection) }) + t.Run("widget with collection", func(t *testing.T) { + // given + p := SpaceImport{} + params := &pb.RpcObjectImportRequestPbParams{NoCollection: false} + + // when + collection, err := p.ProvideCollection(nil, nil, nil, params, nil, false) + + // then + assert.Nil(t, err) + assert.Len(t, collection, 2) + assert.Equal(t, smartblock2.SmartBlockTypeWidget, collection[1].Snapshot.SbType) + assert.Len(t, collection[1].Snapshot.Data.Blocks, 3) + assert.NotNil(t, collection[1].Snapshot.Data.Blocks[1].GetWidget()) + assert.NotNil(t, collection[1].Snapshot.Data.Blocks[2].GetLink()) + assert.Equal(t, collection[0].Id, collection[1].Snapshot.Data.Blocks[2].GetLink().GetTargetBlockId()) + }) } diff --git a/core/block/import/txt/converter.go b/core/block/import/txt/converter.go index 5facbacc8..dca7bbe53 100644 --- a/core/block/import/txt/converter.go +++ b/core/block/import/txt/converter.go @@ -56,8 +56,8 @@ func (t *TXT) GetSnapshots(ctx context.Context, req *pb.RpcObjectImportRequest, return nil, allErrors } rootCollection := common.NewImportCollection(t.service) - settings := common.MakeImportCollectionSetting(rootCollectionName, targetObjects, "", nil, true, true, true) - rootCol, err := rootCollection.MakeImportCollection(settings) + settings := common.MakeImportCollectionSetting(rootCollectionName, targetObjects, "", nil, true, false, true, nil) + rootCol, widget, err := rootCollection.MakeImportCollection(settings) if err != nil { allErrors.Add(err) if allErrors.ShouldAbortImport(len(paths), req.Type) { @@ -69,6 +69,9 @@ func (t *TXT) GetSnapshots(ctx context.Context, req *pb.RpcObjectImportRequest, snapshots = append(snapshots, rootCol) rootCollectionID = rootCol.Id } + if widget != nil { + snapshots = append(snapshots, widget) + } progress.SetTotal(int64(numberOfStages * len(snapshots))) if allErrors.IsEmpty() { return &common.Response{Snapshots: snapshots, RootCollectionID: rootCollectionID}, nil diff --git a/core/block/import/txt/converter_test.go b/core/block/import/txt/converter_test.go index 10deca90e..4929647e6 100644 --- a/core/block/import/txt/converter_test.go +++ b/core/block/import/txt/converter_test.go @@ -31,7 +31,7 @@ func TestTXT_GetSnapshots(t *testing.T) { assert.NotNil(t, err) assert.True(t, errors.Is(err.GetResultError(model.Import_Txt), common.ErrFileImportNoObjectsInDirectory)) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 2) + assert.Len(t, sn.Snapshots, 3) assert.Contains(t, sn.Snapshots[0].FileName, "test.txt") assert.Equal(t, sn.Snapshots[0].Snapshot.Data.Details.GetString("name"), "test") @@ -39,6 +39,10 @@ func TestTXT_GetSnapshots(t *testing.T) { assert.NotEmpty(t, sn.Snapshots[1].Snapshot.Data.ObjectTypes) assert.Equal(t, sn.Snapshots[1].Snapshot.Data.ObjectTypes[0], bundle.TypeKeyCollection.String()) + assert.Len(t, sn.Snapshots[2].Snapshot.Data.Blocks, 3) + assert.NotNil(t, sn.Snapshots[2].Snapshot.Data.Blocks[1].GetWidget()) + assert.NotNil(t, sn.Snapshots[2].Snapshot.Data.Blocks[2].GetLink()) + assert.Equal(t, sn.Snapshots[1].Id, sn.Snapshots[2].Snapshot.Data.Blocks[2].GetLink().GetTargetBlockId()) var ( found bool text string From 4c989382a57e8624346cc232dbd92cc00fb2dd47 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Thu, 27 Mar 2025 18:55:25 +0100 Subject: [PATCH 098/132] GO-5320: refactored import collection Signed-off-by: AnastasiaShemyakinskaya --- core/block/import/common/collection.go | 72 ++++++++++++++----- core/block/import/common/collection_test.go | 18 ++--- core/block/import/csv/converter.go | 7 +- core/block/import/html/converter.go | 7 +- core/block/import/markdown/import.go | 12 +++- .../import/notion/api/database/database.go | 7 +- core/block/import/pb/gallery.go | 17 ++++- core/block/import/pb/space.go | 8 ++- core/block/import/txt/converter.go | 7 +- 9 files changed, 120 insertions(+), 35 deletions(-) diff --git a/core/block/import/common/collection.go b/core/block/import/common/collection.go index ccf812d15..badf05f5b 100644 --- a/core/block/import/common/collection.go +++ b/core/block/import/common/collection.go @@ -30,23 +30,61 @@ type ImportCollectionSetting struct { widgetSnapshot *Snapshot } -func MakeImportCollectionSetting( - collectionName string, - targetObjects []string, - icon string, - fileKeys []*pb.ChangeFileKeys, - needToAddDate, shouldBeFavorite, shouldAddRelations bool, - widgetSnapshot *Snapshot, -) *ImportCollectionSetting { - return &ImportCollectionSetting{ - collectionName: collectionName, - targetObjects: targetObjects, - icon: icon, - fileKeys: fileKeys, - needToAddDate: needToAddDate, - shouldBeFavorite: shouldBeFavorite, - shouldAddRelations: shouldAddRelations, - widgetSnapshot: widgetSnapshot, +type ImportCollectionOption func(*ImportCollectionSetting) + +func NewImportCollectionSetting(opts ...ImportCollectionOption) *ImportCollectionSetting { + s := &ImportCollectionSetting{} + for _, opt := range opts { + opt(s) + } + return s +} + +func WithCollectionName(name string) ImportCollectionOption { + return func(s *ImportCollectionSetting) { + s.collectionName = name + } +} + +func WithTargetObjects(objs []string) ImportCollectionOption { + return func(s *ImportCollectionSetting) { + s.targetObjects = objs + } +} + +func WithIcon(icon string) ImportCollectionOption { + return func(s *ImportCollectionSetting) { + s.icon = icon + } +} + +func WithFileKeys(keys []*pb.ChangeFileKeys) ImportCollectionOption { + return func(s *ImportCollectionSetting) { + s.fileKeys = keys + } +} + +func WithAddDate() ImportCollectionOption { + return func(s *ImportCollectionSetting) { + s.needToAddDate = true + } +} + +func WithFavorite() ImportCollectionOption { + return func(s *ImportCollectionSetting) { + s.shouldBeFavorite = true + } +} + +func WithRelations() ImportCollectionOption { + return func(s *ImportCollectionSetting) { + s.shouldAddRelations = true + } +} + +func WithWidgetSnapshot(snapshot *Snapshot) ImportCollectionOption { + return func(s *ImportCollectionSetting) { + s.widgetSnapshot = snapshot } } diff --git a/core/block/import/common/collection_test.go b/core/block/import/common/collection_test.go index 3e9aef2e2..1d69268f6 100644 --- a/core/block/import/common/collection_test.go +++ b/core/block/import/common/collection_test.go @@ -53,17 +53,17 @@ func TestMakeImportCollection(t *testing.T) { } } - req := MakeImportCollectionSetting( - "My Collection", - []string{"obj1", "obj2"}, - "icon.png", - nil, - tt.needToAddDate, - tt.shouldBeFavorite, - tt.shouldAddRelation, - widget, + req := NewImportCollectionSetting( + WithCollectionName("My Collection"), + WithTargetObjects([]string{"obj1", "obj2"}), + WithIcon("icon.png"), + WithWidgetSnapshot(widget), ) + req.needToAddDate = tt.needToAddDate + req.shouldBeFavorite = tt.shouldBeFavorite + req.shouldAddRelations = tt.shouldAddRelation + root, widgetSnap, err := importer.MakeImportCollection(req) assert.NoError(t, err) diff --git a/core/block/import/csv/converter.go b/core/block/import/csv/converter.go index 8e50769e3..c9f68ba08 100644 --- a/core/block/import/csv/converter.go +++ b/core/block/import/csv/converter.go @@ -67,7 +67,12 @@ func (c *CSV) GetSnapshots(ctx context.Context, req *pb.RpcObjectImportRequest, return nil, allErrors } rootCollection := common.NewImportCollection(c.collectionService) - settings := common.MakeImportCollectionSetting(rootCollectionName, result.objectIDs, "", nil, true, false, true, nil) + settings := common.NewImportCollectionSetting( + common.WithCollectionName(rootCollectionName), + common.WithTargetObjects(result.objectIDs), + common.WithAddDate(), + common.WithRelations(), + ) rootCol, widgetSnapshot, err := rootCollection.MakeImportCollection(settings) if err != nil { allErrors.Add(err) diff --git a/core/block/import/html/converter.go b/core/block/import/html/converter.go index 036edf186..846d8bf7c 100644 --- a/core/block/import/html/converter.go +++ b/core/block/import/html/converter.go @@ -66,7 +66,12 @@ func (h *HTML) GetSnapshots(ctx context.Context, req *pb.RpcObjectImportRequest, return nil, allErrors } rootCollection := common.NewImportCollection(h.collectionService) - settings := common.MakeImportCollectionSetting(rootCollectionName, targetObjects, "", nil, true, false, true, nil) + settings := common.NewImportCollectionSetting( + common.WithCollectionName(rootCollectionName), + common.WithTargetObjects(targetObjects), + common.WithAddDate(), + common.WithRelations(), + ) rootCollectionSnapshot, widgetSnapshot, err := rootCollection.MakeImportCollection(settings) if err != nil { allErrors.Add(err) diff --git a/core/block/import/markdown/import.go b/core/block/import/markdown/import.go index f731f90bb..0ccb27eb4 100644 --- a/core/block/import/markdown/import.go +++ b/core/block/import/markdown/import.go @@ -102,7 +102,12 @@ func (m *Markdown) processFiles(req *pb.RpcObjectImportRequest, progress process func (m *Markdown) createRootCollection(allSnapshots []*common.Snapshot, allRootObjectsIds []string) ([]*common.Snapshot, string, error) { rootCollection := common.NewImportCollection(m.service) - settings := common.MakeImportCollectionSetting(rootCollectionName, allRootObjectsIds, "", nil, true, false, true, nil) + settings := common.NewImportCollectionSetting( + common.WithCollectionName(rootCollectionName), + common.WithTargetObjects(allRootObjectsIds), + common.WithAddDate(), + common.WithRelations(), + ) rootCol, widgetSnapshot, err := rootCollection.MakeImportCollection(settings) if err != nil { return nil, "", err @@ -427,7 +432,10 @@ func (m *Markdown) createSnapshots( func (m *Markdown) addCollectionSnapshot(fileName string, file *FileInfo, snapshots []*common.Snapshot) ([]*common.Snapshot, error) { c := common.NewImportCollection(m.service) - settings := common.MakeImportCollectionSetting(file.Title, file.CollectionsObjectsIds, "", nil, false, false, false, nil) + settings := common.NewImportCollectionSetting( + common.WithCollectionName(file.Title), + common.WithTargetObjects(file.CollectionsObjectsIds), + ) csvCollection, _, err := c.MakeImportCollection(settings) if err != nil { return nil, err diff --git a/core/block/import/notion/api/database/database.go b/core/block/import/notion/api/database/database.go index cbd4357a1..0acf026bf 100644 --- a/core/block/import/notion/api/database/database.go +++ b/core/block/import/notion/api/database/database.go @@ -353,7 +353,12 @@ func (ds *Service) AddObjectsToNotionCollection( allObjects := ds.filterObjects(notionContext, notionDB, notionPages) rootCollection := common.NewImportCollection(ds.collectionService) - settings := common.MakeImportCollectionSetting(rootCollectionName, allObjects, "", nil, true, false, true, nil) + settings := common.NewImportCollectionSetting( + common.WithCollectionName(rootCollectionName), + common.WithTargetObjects(allObjects), + common.WithAddDate(), + common.WithRelations(), + ) rootCol, widget, err := rootCollection.MakeImportCollection(settings) if err != nil { return nil, nil, err diff --git a/core/block/import/pb/gallery.go b/core/block/import/pb/gallery.go index 0cea9c4cd..8faf42561 100644 --- a/core/block/import/pb/gallery.go +++ b/core/block/import/pb/gallery.go @@ -59,7 +59,14 @@ func (g *GalleryImport) ProvideCollection(snapshots []*common.Snapshot, } } objectsIDs := g.getObjectsIDs(snapshots) - settings := common.MakeImportCollectionSetting(collectionName, objectsIDs, icon, fileKeys, false, false, true, widgetSnapshot) + settings := common.NewImportCollectionSetting( + common.WithCollectionName(collectionName), + common.WithTargetObjects(objectsIDs), + common.WithIcon(icon), + common.WithRelations(), + common.WithFileKeys(fileKeys), + common.WithWidgetSnapshot(widgetSnapshot), + ) objectsCollection, widgetSnapshot, err := rootCollection.MakeImportCollection(settings) if err != nil { return nil, err @@ -77,7 +84,13 @@ func (g *GalleryImport) getWidgetsCollection( collectionsSnapshots []*common.Snapshot, ) ([]*common.Snapshot, *common.Snapshot, error) { widgetCollectionName := collectionName + widgetCollectionPattern - settings := common.MakeImportCollectionSetting(widgetCollectionName, widgetObjects, icon, fileKeys, false, false, true, nil) + settings := common.NewImportCollectionSetting( + common.WithCollectionName(widgetCollectionName), + common.WithTargetObjects(widgetObjects), + common.WithIcon(icon), + common.WithRelations(), + common.WithFileKeys(fileKeys), + ) widgetsCollectionSnapshot, widget, err := rootCollection.MakeImportCollection(settings) if err != nil { return nil, nil, err diff --git a/core/block/import/pb/space.go b/core/block/import/pb/space.go index f459fde1d..b62d7edc9 100644 --- a/core/block/import/pb/space.go +++ b/core/block/import/pb/space.go @@ -56,7 +56,13 @@ func (s *SpaceImport) ProvideCollection(snapshots []*common.Snapshot, }) } rootCollection := common.NewImportCollection(s.service) - settings := common.MakeImportCollectionSetting(rootCollectionName, rootObjects, "", nil, true, false, true, widgetSnapshot) + settings := common.NewImportCollectionSetting( + common.WithCollectionName(rootCollectionName), + common.WithTargetObjects(rootObjects), + common.WithRelations(), + common.WithAddDate(), + common.WithWidgetSnapshot(widgetSnapshot), + ) rootCollectionSnapshot, widgetSnapshot, err := rootCollection.MakeImportCollection(settings) if err != nil { return nil, err diff --git a/core/block/import/txt/converter.go b/core/block/import/txt/converter.go index dca7bbe53..07c16dc71 100644 --- a/core/block/import/txt/converter.go +++ b/core/block/import/txt/converter.go @@ -56,7 +56,12 @@ func (t *TXT) GetSnapshots(ctx context.Context, req *pb.RpcObjectImportRequest, return nil, allErrors } rootCollection := common.NewImportCollection(t.service) - settings := common.MakeImportCollectionSetting(rootCollectionName, targetObjects, "", nil, true, false, true, nil) + settings := common.NewImportCollectionSetting( + common.WithCollectionName(rootCollectionName), + common.WithTargetObjects(targetObjects), + common.WithRelations(), + common.WithAddDate(), + ) rootCol, widget, err := rootCollection.MakeImportCollection(settings) if err != nil { allErrors.Add(err) From 555d95b9426dbb743eadff318fbe93e259f83c32 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 28 Mar 2025 08:19:03 +0100 Subject: [PATCH 099/132] GO-4459: Refactor API services and tests to use new apicore interfaces --- .mockery.yaml | 4 +- core/api/apicore/apicore.go | 49 + .../mock_apicore/mock_ClientCommands.go | 1164 ++ core/api/internal/auth/service.go | 6 +- core/api/internal/auth/service_test.go | 6 +- core/api/internal/export/service.go | 6 +- core/api/internal/export/service_test.go | 6 +- core/api/internal/list/service.go | 6 +- core/api/internal/list/service_test.go | 6 +- core/api/internal/object/service.go | 6 +- core/api/internal/object/service_test.go | 6 +- core/api/internal/search/service.go | 6 +- core/api/internal/search/service_test.go | 6 +- core/api/internal/space/service.go | 6 +- core/api/internal/space/service_test.go | 6 +- core/api/server/middleware.go | 7 +- core/api/server/middleware_test.go | 2 +- core/api/server/router.go | 5 +- core/api/server/server.go | 5 +- core/api/server/server_test.go | 4 +- core/api/service.go | 10 +- core/api/util/util.go | 8 +- .../mock_service/mock_ClientCommandsServer.go | 14283 ---------------- 23 files changed, 1270 insertions(+), 14343 deletions(-) create mode 100644 core/api/apicore/apicore.go create mode 100644 core/api/apicore/mock_apicore/mock_ClientCommands.go delete mode 100644 pb/service/mock_service/mock_ClientCommandsServer.go diff --git a/.mockery.yaml b/.mockery.yaml index 3240af8d2..18ad4e2ea 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -237,9 +237,9 @@ packages: github.com/anyproto/anytype-heart/core/identity: interfaces: Service: - github.com/anyproto/anytype-heart/pb/service: + github.com/anyproto/anytype-heart/core/api/apicore: interfaces: - ClientCommandsServer: + ClientCommands: github.com/anyproto/anytype-heart/core/block/template: interfaces: Service: diff --git a/core/api/apicore/apicore.go b/core/api/apicore/apicore.go new file mode 100644 index 000000000..5c05add4a --- /dev/null +++ b/core/api/apicore/apicore.go @@ -0,0 +1,49 @@ +package apicore + +import ( + "context" + + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" +) + +type AccountInfo interface { + GetInfo(ctx context.Context) (*model.AccountInfo, error) +} + +type ClientCommands interface { + // Wallet + AccountLocalLinkNewChallenge(context.Context, *pb.RpcAccountLocalLinkNewChallengeRequest) *pb.RpcAccountLocalLinkNewChallengeResponse + AccountLocalLinkSolveChallenge(context.Context, *pb.RpcAccountLocalLinkSolveChallengeRequest) *pb.RpcAccountLocalLinkSolveChallengeResponse + WalletCreateSession(context.Context, *pb.RpcWalletCreateSessionRequest) *pb.RpcWalletCreateSessionResponse + + // Space + WorkspaceCreate(context.Context, *pb.RpcWorkspaceCreateRequest) *pb.RpcWorkspaceCreateResponse + WorkspaceOpen(context.Context, *pb.RpcWorkspaceOpenRequest) *pb.RpcWorkspaceOpenResponse + WorkspaceSetInfo(context.Context, *pb.RpcWorkspaceSetInfoRequest) *pb.RpcWorkspaceSetInfoResponse + SpaceRequestApprove(context.Context, *pb.RpcSpaceRequestApproveRequest) *pb.RpcSpaceRequestApproveResponse + SpaceRequestDecline(context.Context, *pb.RpcSpaceRequestDeclineRequest) *pb.RpcSpaceRequestDeclineResponse + SpaceParticipantRemove(context.Context, *pb.RpcSpaceParticipantRemoveRequest) *pb.RpcSpaceParticipantRemoveResponse + SpaceParticipantPermissionsChange(context.Context, *pb.RpcSpaceParticipantPermissionsChangeRequest) *pb.RpcSpaceParticipantPermissionsChangeResponse + + // Object + ObjectShow(context.Context, *pb.RpcObjectShowRequest) *pb.RpcObjectShowResponse + ObjectCreate(context.Context, *pb.RpcObjectCreateRequest) *pb.RpcObjectCreateResponse + ObjectCreateBookmark(context.Context, *pb.RpcObjectCreateBookmarkRequest) *pb.RpcObjectCreateBookmarkResponse + ObjectSearch(context.Context, *pb.RpcObjectSearchRequest) *pb.RpcObjectSearchResponse + ObjectSearchSubscribe(context.Context, *pb.RpcObjectSearchSubscribeRequest) *pb.RpcObjectSearchSubscribeResponse + ObjectSetDetails(context.Context, *pb.RpcObjectSetDetailsRequest) *pb.RpcObjectSetDetailsResponse + ObjectSetIsArchived(context.Context, *pb.RpcObjectSetIsArchivedRequest) *pb.RpcObjectSetIsArchivedResponse + ObjectListExport(context.Context, *pb.RpcObjectListExportRequest) *pb.RpcObjectListExportResponse + + // List + ObjectCollectionAdd(context.Context, *pb.RpcObjectCollectionAddRequest) *pb.RpcObjectCollectionAddResponse + ObjectCollectionRemove(context.Context, *pb.RpcObjectCollectionRemoveRequest) *pb.RpcObjectCollectionRemoveResponse + + // Property + ObjectRelationAddFeatured(context.Context, *pb.RpcObjectRelationAddFeaturedRequest) *pb.RpcObjectRelationAddFeaturedResponse + + // Block + BlockCreate(context.Context, *pb.RpcBlockCreateRequest) *pb.RpcBlockCreateResponse + BlockPaste(context.Context, *pb.RpcBlockPasteRequest) *pb.RpcBlockPasteResponse +} diff --git a/core/api/apicore/mock_apicore/mock_ClientCommands.go b/core/api/apicore/mock_apicore/mock_ClientCommands.go new file mode 100644 index 000000000..55e09a275 --- /dev/null +++ b/core/api/apicore/mock_apicore/mock_ClientCommands.go @@ -0,0 +1,1164 @@ +// Code generated by mockery. DO NOT EDIT. + +package mock_apicore + +import ( + context "context" + + pb "github.com/anyproto/anytype-heart/pb" + mock "github.com/stretchr/testify/mock" +) + +// MockClientCommands is an autogenerated mock type for the ClientCommands type +type MockClientCommands struct { + mock.Mock +} + +type MockClientCommands_Expecter struct { + mock *mock.Mock +} + +func (_m *MockClientCommands) EXPECT() *MockClientCommands_Expecter { + return &MockClientCommands_Expecter{mock: &_m.Mock} +} + +// AccountLocalLinkNewChallenge provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) AccountLocalLinkNewChallenge(_a0 context.Context, _a1 *pb.RpcAccountLocalLinkNewChallengeRequest) *pb.RpcAccountLocalLinkNewChallengeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AccountLocalLinkNewChallenge") + } + + var r0 *pb.RpcAccountLocalLinkNewChallengeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountLocalLinkNewChallengeRequest) *pb.RpcAccountLocalLinkNewChallengeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcAccountLocalLinkNewChallengeResponse) + } + } + + return r0 +} + +// MockClientCommands_AccountLocalLinkNewChallenge_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountLocalLinkNewChallenge' +type MockClientCommands_AccountLocalLinkNewChallenge_Call struct { + *mock.Call +} + +// AccountLocalLinkNewChallenge is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcAccountLocalLinkNewChallengeRequest +func (_e *MockClientCommands_Expecter) AccountLocalLinkNewChallenge(_a0 interface{}, _a1 interface{}) *MockClientCommands_AccountLocalLinkNewChallenge_Call { + return &MockClientCommands_AccountLocalLinkNewChallenge_Call{Call: _e.mock.On("AccountLocalLinkNewChallenge", _a0, _a1)} +} + +func (_c *MockClientCommands_AccountLocalLinkNewChallenge_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountLocalLinkNewChallengeRequest)) *MockClientCommands_AccountLocalLinkNewChallenge_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcAccountLocalLinkNewChallengeRequest)) + }) + return _c +} + +func (_c *MockClientCommands_AccountLocalLinkNewChallenge_Call) Return(_a0 *pb.RpcAccountLocalLinkNewChallengeResponse) *MockClientCommands_AccountLocalLinkNewChallenge_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_AccountLocalLinkNewChallenge_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountLocalLinkNewChallengeRequest) *pb.RpcAccountLocalLinkNewChallengeResponse) *MockClientCommands_AccountLocalLinkNewChallenge_Call { + _c.Call.Return(run) + return _c +} + +// AccountLocalLinkSolveChallenge provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) AccountLocalLinkSolveChallenge(_a0 context.Context, _a1 *pb.RpcAccountLocalLinkSolveChallengeRequest) *pb.RpcAccountLocalLinkSolveChallengeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AccountLocalLinkSolveChallenge") + } + + var r0 *pb.RpcAccountLocalLinkSolveChallengeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountLocalLinkSolveChallengeRequest) *pb.RpcAccountLocalLinkSolveChallengeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcAccountLocalLinkSolveChallengeResponse) + } + } + + return r0 +} + +// MockClientCommands_AccountLocalLinkSolveChallenge_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountLocalLinkSolveChallenge' +type MockClientCommands_AccountLocalLinkSolveChallenge_Call struct { + *mock.Call +} + +// AccountLocalLinkSolveChallenge is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcAccountLocalLinkSolveChallengeRequest +func (_e *MockClientCommands_Expecter) AccountLocalLinkSolveChallenge(_a0 interface{}, _a1 interface{}) *MockClientCommands_AccountLocalLinkSolveChallenge_Call { + return &MockClientCommands_AccountLocalLinkSolveChallenge_Call{Call: _e.mock.On("AccountLocalLinkSolveChallenge", _a0, _a1)} +} + +func (_c *MockClientCommands_AccountLocalLinkSolveChallenge_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountLocalLinkSolveChallengeRequest)) *MockClientCommands_AccountLocalLinkSolveChallenge_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcAccountLocalLinkSolveChallengeRequest)) + }) + return _c +} + +func (_c *MockClientCommands_AccountLocalLinkSolveChallenge_Call) Return(_a0 *pb.RpcAccountLocalLinkSolveChallengeResponse) *MockClientCommands_AccountLocalLinkSolveChallenge_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_AccountLocalLinkSolveChallenge_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountLocalLinkSolveChallengeRequest) *pb.RpcAccountLocalLinkSolveChallengeResponse) *MockClientCommands_AccountLocalLinkSolveChallenge_Call { + _c.Call.Return(run) + return _c +} + +// BlockCreate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) BlockCreate(_a0 context.Context, _a1 *pb.RpcBlockCreateRequest) *pb.RpcBlockCreateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockCreate") + } + + var r0 *pb.RpcBlockCreateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockCreateRequest) *pb.RpcBlockCreateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockCreateResponse) + } + } + + return r0 +} + +// MockClientCommands_BlockCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockCreate' +type MockClientCommands_BlockCreate_Call struct { + *mock.Call +} + +// BlockCreate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockCreateRequest +func (_e *MockClientCommands_Expecter) BlockCreate(_a0 interface{}, _a1 interface{}) *MockClientCommands_BlockCreate_Call { + return &MockClientCommands_BlockCreate_Call{Call: _e.mock.On("BlockCreate", _a0, _a1)} +} + +func (_c *MockClientCommands_BlockCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockCreateRequest)) *MockClientCommands_BlockCreate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockCreateRequest)) + }) + return _c +} + +func (_c *MockClientCommands_BlockCreate_Call) Return(_a0 *pb.RpcBlockCreateResponse) *MockClientCommands_BlockCreate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_BlockCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockCreateRequest) *pb.RpcBlockCreateResponse) *MockClientCommands_BlockCreate_Call { + _c.Call.Return(run) + return _c +} + +// BlockPaste provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) BlockPaste(_a0 context.Context, _a1 *pb.RpcBlockPasteRequest) *pb.RpcBlockPasteResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockPaste") + } + + var r0 *pb.RpcBlockPasteResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockPasteRequest) *pb.RpcBlockPasteResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockPasteResponse) + } + } + + return r0 +} + +// MockClientCommands_BlockPaste_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockPaste' +type MockClientCommands_BlockPaste_Call struct { + *mock.Call +} + +// BlockPaste is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockPasteRequest +func (_e *MockClientCommands_Expecter) BlockPaste(_a0 interface{}, _a1 interface{}) *MockClientCommands_BlockPaste_Call { + return &MockClientCommands_BlockPaste_Call{Call: _e.mock.On("BlockPaste", _a0, _a1)} +} + +func (_c *MockClientCommands_BlockPaste_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockPasteRequest)) *MockClientCommands_BlockPaste_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockPasteRequest)) + }) + return _c +} + +func (_c *MockClientCommands_BlockPaste_Call) Return(_a0 *pb.RpcBlockPasteResponse) *MockClientCommands_BlockPaste_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_BlockPaste_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockPasteRequest) *pb.RpcBlockPasteResponse) *MockClientCommands_BlockPaste_Call { + _c.Call.Return(run) + return _c +} + +// ObjectCollectionAdd provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) ObjectCollectionAdd(_a0 context.Context, _a1 *pb.RpcObjectCollectionAddRequest) *pb.RpcObjectCollectionAddResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectCollectionAdd") + } + + var r0 *pb.RpcObjectCollectionAddResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCollectionAddRequest) *pb.RpcObjectCollectionAddResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectCollectionAddResponse) + } + } + + return r0 +} + +// MockClientCommands_ObjectCollectionAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCollectionAdd' +type MockClientCommands_ObjectCollectionAdd_Call struct { + *mock.Call +} + +// ObjectCollectionAdd is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectCollectionAddRequest +func (_e *MockClientCommands_Expecter) ObjectCollectionAdd(_a0 interface{}, _a1 interface{}) *MockClientCommands_ObjectCollectionAdd_Call { + return &MockClientCommands_ObjectCollectionAdd_Call{Call: _e.mock.On("ObjectCollectionAdd", _a0, _a1)} +} + +func (_c *MockClientCommands_ObjectCollectionAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCollectionAddRequest)) *MockClientCommands_ObjectCollectionAdd_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectCollectionAddRequest)) + }) + return _c +} + +func (_c *MockClientCommands_ObjectCollectionAdd_Call) Return(_a0 *pb.RpcObjectCollectionAddResponse) *MockClientCommands_ObjectCollectionAdd_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_ObjectCollectionAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCollectionAddRequest) *pb.RpcObjectCollectionAddResponse) *MockClientCommands_ObjectCollectionAdd_Call { + _c.Call.Return(run) + return _c +} + +// ObjectCollectionRemove provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) ObjectCollectionRemove(_a0 context.Context, _a1 *pb.RpcObjectCollectionRemoveRequest) *pb.RpcObjectCollectionRemoveResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectCollectionRemove") + } + + var r0 *pb.RpcObjectCollectionRemoveResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCollectionRemoveRequest) *pb.RpcObjectCollectionRemoveResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectCollectionRemoveResponse) + } + } + + return r0 +} + +// MockClientCommands_ObjectCollectionRemove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCollectionRemove' +type MockClientCommands_ObjectCollectionRemove_Call struct { + *mock.Call +} + +// ObjectCollectionRemove is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectCollectionRemoveRequest +func (_e *MockClientCommands_Expecter) ObjectCollectionRemove(_a0 interface{}, _a1 interface{}) *MockClientCommands_ObjectCollectionRemove_Call { + return &MockClientCommands_ObjectCollectionRemove_Call{Call: _e.mock.On("ObjectCollectionRemove", _a0, _a1)} +} + +func (_c *MockClientCommands_ObjectCollectionRemove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCollectionRemoveRequest)) *MockClientCommands_ObjectCollectionRemove_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectCollectionRemoveRequest)) + }) + return _c +} + +func (_c *MockClientCommands_ObjectCollectionRemove_Call) Return(_a0 *pb.RpcObjectCollectionRemoveResponse) *MockClientCommands_ObjectCollectionRemove_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_ObjectCollectionRemove_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCollectionRemoveRequest) *pb.RpcObjectCollectionRemoveResponse) *MockClientCommands_ObjectCollectionRemove_Call { + _c.Call.Return(run) + return _c +} + +// ObjectCreate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) ObjectCreate(_a0 context.Context, _a1 *pb.RpcObjectCreateRequest) *pb.RpcObjectCreateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectCreate") + } + + var r0 *pb.RpcObjectCreateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCreateRequest) *pb.RpcObjectCreateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectCreateResponse) + } + } + + return r0 +} + +// MockClientCommands_ObjectCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCreate' +type MockClientCommands_ObjectCreate_Call struct { + *mock.Call +} + +// ObjectCreate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectCreateRequest +func (_e *MockClientCommands_Expecter) ObjectCreate(_a0 interface{}, _a1 interface{}) *MockClientCommands_ObjectCreate_Call { + return &MockClientCommands_ObjectCreate_Call{Call: _e.mock.On("ObjectCreate", _a0, _a1)} +} + +func (_c *MockClientCommands_ObjectCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCreateRequest)) *MockClientCommands_ObjectCreate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectCreateRequest)) + }) + return _c +} + +func (_c *MockClientCommands_ObjectCreate_Call) Return(_a0 *pb.RpcObjectCreateResponse) *MockClientCommands_ObjectCreate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_ObjectCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCreateRequest) *pb.RpcObjectCreateResponse) *MockClientCommands_ObjectCreate_Call { + _c.Call.Return(run) + return _c +} + +// ObjectCreateBookmark provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) ObjectCreateBookmark(_a0 context.Context, _a1 *pb.RpcObjectCreateBookmarkRequest) *pb.RpcObjectCreateBookmarkResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectCreateBookmark") + } + + var r0 *pb.RpcObjectCreateBookmarkResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCreateBookmarkRequest) *pb.RpcObjectCreateBookmarkResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectCreateBookmarkResponse) + } + } + + return r0 +} + +// MockClientCommands_ObjectCreateBookmark_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCreateBookmark' +type MockClientCommands_ObjectCreateBookmark_Call struct { + *mock.Call +} + +// ObjectCreateBookmark is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectCreateBookmarkRequest +func (_e *MockClientCommands_Expecter) ObjectCreateBookmark(_a0 interface{}, _a1 interface{}) *MockClientCommands_ObjectCreateBookmark_Call { + return &MockClientCommands_ObjectCreateBookmark_Call{Call: _e.mock.On("ObjectCreateBookmark", _a0, _a1)} +} + +func (_c *MockClientCommands_ObjectCreateBookmark_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCreateBookmarkRequest)) *MockClientCommands_ObjectCreateBookmark_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectCreateBookmarkRequest)) + }) + return _c +} + +func (_c *MockClientCommands_ObjectCreateBookmark_Call) Return(_a0 *pb.RpcObjectCreateBookmarkResponse) *MockClientCommands_ObjectCreateBookmark_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_ObjectCreateBookmark_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCreateBookmarkRequest) *pb.RpcObjectCreateBookmarkResponse) *MockClientCommands_ObjectCreateBookmark_Call { + _c.Call.Return(run) + return _c +} + +// ObjectListExport provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) ObjectListExport(_a0 context.Context, _a1 *pb.RpcObjectListExportRequest) *pb.RpcObjectListExportResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectListExport") + } + + var r0 *pb.RpcObjectListExportResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectListExportRequest) *pb.RpcObjectListExportResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectListExportResponse) + } + } + + return r0 +} + +// MockClientCommands_ObjectListExport_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectListExport' +type MockClientCommands_ObjectListExport_Call struct { + *mock.Call +} + +// ObjectListExport is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectListExportRequest +func (_e *MockClientCommands_Expecter) ObjectListExport(_a0 interface{}, _a1 interface{}) *MockClientCommands_ObjectListExport_Call { + return &MockClientCommands_ObjectListExport_Call{Call: _e.mock.On("ObjectListExport", _a0, _a1)} +} + +func (_c *MockClientCommands_ObjectListExport_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectListExportRequest)) *MockClientCommands_ObjectListExport_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectListExportRequest)) + }) + return _c +} + +func (_c *MockClientCommands_ObjectListExport_Call) Return(_a0 *pb.RpcObjectListExportResponse) *MockClientCommands_ObjectListExport_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_ObjectListExport_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectListExportRequest) *pb.RpcObjectListExportResponse) *MockClientCommands_ObjectListExport_Call { + _c.Call.Return(run) + return _c +} + +// ObjectRelationAddFeatured provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) ObjectRelationAddFeatured(_a0 context.Context, _a1 *pb.RpcObjectRelationAddFeaturedRequest) *pb.RpcObjectRelationAddFeaturedResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectRelationAddFeatured") + } + + var r0 *pb.RpcObjectRelationAddFeaturedResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectRelationAddFeaturedRequest) *pb.RpcObjectRelationAddFeaturedResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectRelationAddFeaturedResponse) + } + } + + return r0 +} + +// MockClientCommands_ObjectRelationAddFeatured_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectRelationAddFeatured' +type MockClientCommands_ObjectRelationAddFeatured_Call struct { + *mock.Call +} + +// ObjectRelationAddFeatured is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectRelationAddFeaturedRequest +func (_e *MockClientCommands_Expecter) ObjectRelationAddFeatured(_a0 interface{}, _a1 interface{}) *MockClientCommands_ObjectRelationAddFeatured_Call { + return &MockClientCommands_ObjectRelationAddFeatured_Call{Call: _e.mock.On("ObjectRelationAddFeatured", _a0, _a1)} +} + +func (_c *MockClientCommands_ObjectRelationAddFeatured_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectRelationAddFeaturedRequest)) *MockClientCommands_ObjectRelationAddFeatured_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectRelationAddFeaturedRequest)) + }) + return _c +} + +func (_c *MockClientCommands_ObjectRelationAddFeatured_Call) Return(_a0 *pb.RpcObjectRelationAddFeaturedResponse) *MockClientCommands_ObjectRelationAddFeatured_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_ObjectRelationAddFeatured_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectRelationAddFeaturedRequest) *pb.RpcObjectRelationAddFeaturedResponse) *MockClientCommands_ObjectRelationAddFeatured_Call { + _c.Call.Return(run) + return _c +} + +// ObjectSearch provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) ObjectSearch(_a0 context.Context, _a1 *pb.RpcObjectSearchRequest) *pb.RpcObjectSearchResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectSearch") + } + + var r0 *pb.RpcObjectSearchResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSearchRequest) *pb.RpcObjectSearchResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectSearchResponse) + } + } + + return r0 +} + +// MockClientCommands_ObjectSearch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSearch' +type MockClientCommands_ObjectSearch_Call struct { + *mock.Call +} + +// ObjectSearch is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectSearchRequest +func (_e *MockClientCommands_Expecter) ObjectSearch(_a0 interface{}, _a1 interface{}) *MockClientCommands_ObjectSearch_Call { + return &MockClientCommands_ObjectSearch_Call{Call: _e.mock.On("ObjectSearch", _a0, _a1)} +} + +func (_c *MockClientCommands_ObjectSearch_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSearchRequest)) *MockClientCommands_ObjectSearch_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectSearchRequest)) + }) + return _c +} + +func (_c *MockClientCommands_ObjectSearch_Call) Return(_a0 *pb.RpcObjectSearchResponse) *MockClientCommands_ObjectSearch_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_ObjectSearch_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSearchRequest) *pb.RpcObjectSearchResponse) *MockClientCommands_ObjectSearch_Call { + _c.Call.Return(run) + return _c +} + +// ObjectSearchSubscribe provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) ObjectSearchSubscribe(_a0 context.Context, _a1 *pb.RpcObjectSearchSubscribeRequest) *pb.RpcObjectSearchSubscribeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectSearchSubscribe") + } + + var r0 *pb.RpcObjectSearchSubscribeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSearchSubscribeRequest) *pb.RpcObjectSearchSubscribeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectSearchSubscribeResponse) + } + } + + return r0 +} + +// MockClientCommands_ObjectSearchSubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSearchSubscribe' +type MockClientCommands_ObjectSearchSubscribe_Call struct { + *mock.Call +} + +// ObjectSearchSubscribe is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectSearchSubscribeRequest +func (_e *MockClientCommands_Expecter) ObjectSearchSubscribe(_a0 interface{}, _a1 interface{}) *MockClientCommands_ObjectSearchSubscribe_Call { + return &MockClientCommands_ObjectSearchSubscribe_Call{Call: _e.mock.On("ObjectSearchSubscribe", _a0, _a1)} +} + +func (_c *MockClientCommands_ObjectSearchSubscribe_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSearchSubscribeRequest)) *MockClientCommands_ObjectSearchSubscribe_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectSearchSubscribeRequest)) + }) + return _c +} + +func (_c *MockClientCommands_ObjectSearchSubscribe_Call) Return(_a0 *pb.RpcObjectSearchSubscribeResponse) *MockClientCommands_ObjectSearchSubscribe_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_ObjectSearchSubscribe_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSearchSubscribeRequest) *pb.RpcObjectSearchSubscribeResponse) *MockClientCommands_ObjectSearchSubscribe_Call { + _c.Call.Return(run) + return _c +} + +// ObjectSetDetails provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) ObjectSetDetails(_a0 context.Context, _a1 *pb.RpcObjectSetDetailsRequest) *pb.RpcObjectSetDetailsResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectSetDetails") + } + + var r0 *pb.RpcObjectSetDetailsResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSetDetailsRequest) *pb.RpcObjectSetDetailsResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectSetDetailsResponse) + } + } + + return r0 +} + +// MockClientCommands_ObjectSetDetails_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSetDetails' +type MockClientCommands_ObjectSetDetails_Call struct { + *mock.Call +} + +// ObjectSetDetails is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectSetDetailsRequest +func (_e *MockClientCommands_Expecter) ObjectSetDetails(_a0 interface{}, _a1 interface{}) *MockClientCommands_ObjectSetDetails_Call { + return &MockClientCommands_ObjectSetDetails_Call{Call: _e.mock.On("ObjectSetDetails", _a0, _a1)} +} + +func (_c *MockClientCommands_ObjectSetDetails_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSetDetailsRequest)) *MockClientCommands_ObjectSetDetails_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectSetDetailsRequest)) + }) + return _c +} + +func (_c *MockClientCommands_ObjectSetDetails_Call) Return(_a0 *pb.RpcObjectSetDetailsResponse) *MockClientCommands_ObjectSetDetails_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_ObjectSetDetails_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSetDetailsRequest) *pb.RpcObjectSetDetailsResponse) *MockClientCommands_ObjectSetDetails_Call { + _c.Call.Return(run) + return _c +} + +// ObjectSetIsArchived provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) ObjectSetIsArchived(_a0 context.Context, _a1 *pb.RpcObjectSetIsArchivedRequest) *pb.RpcObjectSetIsArchivedResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectSetIsArchived") + } + + var r0 *pb.RpcObjectSetIsArchivedResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSetIsArchivedRequest) *pb.RpcObjectSetIsArchivedResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectSetIsArchivedResponse) + } + } + + return r0 +} + +// MockClientCommands_ObjectSetIsArchived_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSetIsArchived' +type MockClientCommands_ObjectSetIsArchived_Call struct { + *mock.Call +} + +// ObjectSetIsArchived is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectSetIsArchivedRequest +func (_e *MockClientCommands_Expecter) ObjectSetIsArchived(_a0 interface{}, _a1 interface{}) *MockClientCommands_ObjectSetIsArchived_Call { + return &MockClientCommands_ObjectSetIsArchived_Call{Call: _e.mock.On("ObjectSetIsArchived", _a0, _a1)} +} + +func (_c *MockClientCommands_ObjectSetIsArchived_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSetIsArchivedRequest)) *MockClientCommands_ObjectSetIsArchived_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectSetIsArchivedRequest)) + }) + return _c +} + +func (_c *MockClientCommands_ObjectSetIsArchived_Call) Return(_a0 *pb.RpcObjectSetIsArchivedResponse) *MockClientCommands_ObjectSetIsArchived_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_ObjectSetIsArchived_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSetIsArchivedRequest) *pb.RpcObjectSetIsArchivedResponse) *MockClientCommands_ObjectSetIsArchived_Call { + _c.Call.Return(run) + return _c +} + +// ObjectShow provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) ObjectShow(_a0 context.Context, _a1 *pb.RpcObjectShowRequest) *pb.RpcObjectShowResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectShow") + } + + var r0 *pb.RpcObjectShowResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectShowRequest) *pb.RpcObjectShowResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectShowResponse) + } + } + + return r0 +} + +// MockClientCommands_ObjectShow_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectShow' +type MockClientCommands_ObjectShow_Call struct { + *mock.Call +} + +// ObjectShow is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectShowRequest +func (_e *MockClientCommands_Expecter) ObjectShow(_a0 interface{}, _a1 interface{}) *MockClientCommands_ObjectShow_Call { + return &MockClientCommands_ObjectShow_Call{Call: _e.mock.On("ObjectShow", _a0, _a1)} +} + +func (_c *MockClientCommands_ObjectShow_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectShowRequest)) *MockClientCommands_ObjectShow_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectShowRequest)) + }) + return _c +} + +func (_c *MockClientCommands_ObjectShow_Call) Return(_a0 *pb.RpcObjectShowResponse) *MockClientCommands_ObjectShow_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_ObjectShow_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectShowRequest) *pb.RpcObjectShowResponse) *MockClientCommands_ObjectShow_Call { + _c.Call.Return(run) + return _c +} + +// SpaceParticipantPermissionsChange provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) SpaceParticipantPermissionsChange(_a0 context.Context, _a1 *pb.RpcSpaceParticipantPermissionsChangeRequest) *pb.RpcSpaceParticipantPermissionsChangeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for SpaceParticipantPermissionsChange") + } + + var r0 *pb.RpcSpaceParticipantPermissionsChangeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceParticipantPermissionsChangeRequest) *pb.RpcSpaceParticipantPermissionsChangeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcSpaceParticipantPermissionsChangeResponse) + } + } + + return r0 +} + +// MockClientCommands_SpaceParticipantPermissionsChange_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceParticipantPermissionsChange' +type MockClientCommands_SpaceParticipantPermissionsChange_Call struct { + *mock.Call +} + +// SpaceParticipantPermissionsChange is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcSpaceParticipantPermissionsChangeRequest +func (_e *MockClientCommands_Expecter) SpaceParticipantPermissionsChange(_a0 interface{}, _a1 interface{}) *MockClientCommands_SpaceParticipantPermissionsChange_Call { + return &MockClientCommands_SpaceParticipantPermissionsChange_Call{Call: _e.mock.On("SpaceParticipantPermissionsChange", _a0, _a1)} +} + +func (_c *MockClientCommands_SpaceParticipantPermissionsChange_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceParticipantPermissionsChangeRequest)) *MockClientCommands_SpaceParticipantPermissionsChange_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcSpaceParticipantPermissionsChangeRequest)) + }) + return _c +} + +func (_c *MockClientCommands_SpaceParticipantPermissionsChange_Call) Return(_a0 *pb.RpcSpaceParticipantPermissionsChangeResponse) *MockClientCommands_SpaceParticipantPermissionsChange_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_SpaceParticipantPermissionsChange_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceParticipantPermissionsChangeRequest) *pb.RpcSpaceParticipantPermissionsChangeResponse) *MockClientCommands_SpaceParticipantPermissionsChange_Call { + _c.Call.Return(run) + return _c +} + +// SpaceParticipantRemove provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) SpaceParticipantRemove(_a0 context.Context, _a1 *pb.RpcSpaceParticipantRemoveRequest) *pb.RpcSpaceParticipantRemoveResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for SpaceParticipantRemove") + } + + var r0 *pb.RpcSpaceParticipantRemoveResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceParticipantRemoveRequest) *pb.RpcSpaceParticipantRemoveResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcSpaceParticipantRemoveResponse) + } + } + + return r0 +} + +// MockClientCommands_SpaceParticipantRemove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceParticipantRemove' +type MockClientCommands_SpaceParticipantRemove_Call struct { + *mock.Call +} + +// SpaceParticipantRemove is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcSpaceParticipantRemoveRequest +func (_e *MockClientCommands_Expecter) SpaceParticipantRemove(_a0 interface{}, _a1 interface{}) *MockClientCommands_SpaceParticipantRemove_Call { + return &MockClientCommands_SpaceParticipantRemove_Call{Call: _e.mock.On("SpaceParticipantRemove", _a0, _a1)} +} + +func (_c *MockClientCommands_SpaceParticipantRemove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceParticipantRemoveRequest)) *MockClientCommands_SpaceParticipantRemove_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcSpaceParticipantRemoveRequest)) + }) + return _c +} + +func (_c *MockClientCommands_SpaceParticipantRemove_Call) Return(_a0 *pb.RpcSpaceParticipantRemoveResponse) *MockClientCommands_SpaceParticipantRemove_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_SpaceParticipantRemove_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceParticipantRemoveRequest) *pb.RpcSpaceParticipantRemoveResponse) *MockClientCommands_SpaceParticipantRemove_Call { + _c.Call.Return(run) + return _c +} + +// SpaceRequestApprove provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) SpaceRequestApprove(_a0 context.Context, _a1 *pb.RpcSpaceRequestApproveRequest) *pb.RpcSpaceRequestApproveResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for SpaceRequestApprove") + } + + var r0 *pb.RpcSpaceRequestApproveResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceRequestApproveRequest) *pb.RpcSpaceRequestApproveResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcSpaceRequestApproveResponse) + } + } + + return r0 +} + +// MockClientCommands_SpaceRequestApprove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceRequestApprove' +type MockClientCommands_SpaceRequestApprove_Call struct { + *mock.Call +} + +// SpaceRequestApprove is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcSpaceRequestApproveRequest +func (_e *MockClientCommands_Expecter) SpaceRequestApprove(_a0 interface{}, _a1 interface{}) *MockClientCommands_SpaceRequestApprove_Call { + return &MockClientCommands_SpaceRequestApprove_Call{Call: _e.mock.On("SpaceRequestApprove", _a0, _a1)} +} + +func (_c *MockClientCommands_SpaceRequestApprove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceRequestApproveRequest)) *MockClientCommands_SpaceRequestApprove_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcSpaceRequestApproveRequest)) + }) + return _c +} + +func (_c *MockClientCommands_SpaceRequestApprove_Call) Return(_a0 *pb.RpcSpaceRequestApproveResponse) *MockClientCommands_SpaceRequestApprove_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_SpaceRequestApprove_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceRequestApproveRequest) *pb.RpcSpaceRequestApproveResponse) *MockClientCommands_SpaceRequestApprove_Call { + _c.Call.Return(run) + return _c +} + +// SpaceRequestDecline provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) SpaceRequestDecline(_a0 context.Context, _a1 *pb.RpcSpaceRequestDeclineRequest) *pb.RpcSpaceRequestDeclineResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for SpaceRequestDecline") + } + + var r0 *pb.RpcSpaceRequestDeclineResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceRequestDeclineRequest) *pb.RpcSpaceRequestDeclineResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcSpaceRequestDeclineResponse) + } + } + + return r0 +} + +// MockClientCommands_SpaceRequestDecline_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceRequestDecline' +type MockClientCommands_SpaceRequestDecline_Call struct { + *mock.Call +} + +// SpaceRequestDecline is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcSpaceRequestDeclineRequest +func (_e *MockClientCommands_Expecter) SpaceRequestDecline(_a0 interface{}, _a1 interface{}) *MockClientCommands_SpaceRequestDecline_Call { + return &MockClientCommands_SpaceRequestDecline_Call{Call: _e.mock.On("SpaceRequestDecline", _a0, _a1)} +} + +func (_c *MockClientCommands_SpaceRequestDecline_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceRequestDeclineRequest)) *MockClientCommands_SpaceRequestDecline_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcSpaceRequestDeclineRequest)) + }) + return _c +} + +func (_c *MockClientCommands_SpaceRequestDecline_Call) Return(_a0 *pb.RpcSpaceRequestDeclineResponse) *MockClientCommands_SpaceRequestDecline_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_SpaceRequestDecline_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceRequestDeclineRequest) *pb.RpcSpaceRequestDeclineResponse) *MockClientCommands_SpaceRequestDecline_Call { + _c.Call.Return(run) + return _c +} + +// WalletCreateSession provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) WalletCreateSession(_a0 context.Context, _a1 *pb.RpcWalletCreateSessionRequest) *pb.RpcWalletCreateSessionResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for WalletCreateSession") + } + + var r0 *pb.RpcWalletCreateSessionResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWalletCreateSessionRequest) *pb.RpcWalletCreateSessionResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcWalletCreateSessionResponse) + } + } + + return r0 +} + +// MockClientCommands_WalletCreateSession_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WalletCreateSession' +type MockClientCommands_WalletCreateSession_Call struct { + *mock.Call +} + +// WalletCreateSession is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcWalletCreateSessionRequest +func (_e *MockClientCommands_Expecter) WalletCreateSession(_a0 interface{}, _a1 interface{}) *MockClientCommands_WalletCreateSession_Call { + return &MockClientCommands_WalletCreateSession_Call{Call: _e.mock.On("WalletCreateSession", _a0, _a1)} +} + +func (_c *MockClientCommands_WalletCreateSession_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWalletCreateSessionRequest)) *MockClientCommands_WalletCreateSession_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcWalletCreateSessionRequest)) + }) + return _c +} + +func (_c *MockClientCommands_WalletCreateSession_Call) Return(_a0 *pb.RpcWalletCreateSessionResponse) *MockClientCommands_WalletCreateSession_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_WalletCreateSession_Call) RunAndReturn(run func(context.Context, *pb.RpcWalletCreateSessionRequest) *pb.RpcWalletCreateSessionResponse) *MockClientCommands_WalletCreateSession_Call { + _c.Call.Return(run) + return _c +} + +// WorkspaceCreate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) WorkspaceCreate(_a0 context.Context, _a1 *pb.RpcWorkspaceCreateRequest) *pb.RpcWorkspaceCreateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for WorkspaceCreate") + } + + var r0 *pb.RpcWorkspaceCreateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceCreateRequest) *pb.RpcWorkspaceCreateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcWorkspaceCreateResponse) + } + } + + return r0 +} + +// MockClientCommands_WorkspaceCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceCreate' +type MockClientCommands_WorkspaceCreate_Call struct { + *mock.Call +} + +// WorkspaceCreate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcWorkspaceCreateRequest +func (_e *MockClientCommands_Expecter) WorkspaceCreate(_a0 interface{}, _a1 interface{}) *MockClientCommands_WorkspaceCreate_Call { + return &MockClientCommands_WorkspaceCreate_Call{Call: _e.mock.On("WorkspaceCreate", _a0, _a1)} +} + +func (_c *MockClientCommands_WorkspaceCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceCreateRequest)) *MockClientCommands_WorkspaceCreate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceCreateRequest)) + }) + return _c +} + +func (_c *MockClientCommands_WorkspaceCreate_Call) Return(_a0 *pb.RpcWorkspaceCreateResponse) *MockClientCommands_WorkspaceCreate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_WorkspaceCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceCreateRequest) *pb.RpcWorkspaceCreateResponse) *MockClientCommands_WorkspaceCreate_Call { + _c.Call.Return(run) + return _c +} + +// WorkspaceOpen provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) WorkspaceOpen(_a0 context.Context, _a1 *pb.RpcWorkspaceOpenRequest) *pb.RpcWorkspaceOpenResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for WorkspaceOpen") + } + + var r0 *pb.RpcWorkspaceOpenResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceOpenRequest) *pb.RpcWorkspaceOpenResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcWorkspaceOpenResponse) + } + } + + return r0 +} + +// MockClientCommands_WorkspaceOpen_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceOpen' +type MockClientCommands_WorkspaceOpen_Call struct { + *mock.Call +} + +// WorkspaceOpen is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcWorkspaceOpenRequest +func (_e *MockClientCommands_Expecter) WorkspaceOpen(_a0 interface{}, _a1 interface{}) *MockClientCommands_WorkspaceOpen_Call { + return &MockClientCommands_WorkspaceOpen_Call{Call: _e.mock.On("WorkspaceOpen", _a0, _a1)} +} + +func (_c *MockClientCommands_WorkspaceOpen_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceOpenRequest)) *MockClientCommands_WorkspaceOpen_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceOpenRequest)) + }) + return _c +} + +func (_c *MockClientCommands_WorkspaceOpen_Call) Return(_a0 *pb.RpcWorkspaceOpenResponse) *MockClientCommands_WorkspaceOpen_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_WorkspaceOpen_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceOpenRequest) *pb.RpcWorkspaceOpenResponse) *MockClientCommands_WorkspaceOpen_Call { + _c.Call.Return(run) + return _c +} + +// WorkspaceSetInfo provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommands) WorkspaceSetInfo(_a0 context.Context, _a1 *pb.RpcWorkspaceSetInfoRequest) *pb.RpcWorkspaceSetInfoResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for WorkspaceSetInfo") + } + + var r0 *pb.RpcWorkspaceSetInfoResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceSetInfoRequest) *pb.RpcWorkspaceSetInfoResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcWorkspaceSetInfoResponse) + } + } + + return r0 +} + +// MockClientCommands_WorkspaceSetInfo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceSetInfo' +type MockClientCommands_WorkspaceSetInfo_Call struct { + *mock.Call +} + +// WorkspaceSetInfo is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcWorkspaceSetInfoRequest +func (_e *MockClientCommands_Expecter) WorkspaceSetInfo(_a0 interface{}, _a1 interface{}) *MockClientCommands_WorkspaceSetInfo_Call { + return &MockClientCommands_WorkspaceSetInfo_Call{Call: _e.mock.On("WorkspaceSetInfo", _a0, _a1)} +} + +func (_c *MockClientCommands_WorkspaceSetInfo_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceSetInfoRequest)) *MockClientCommands_WorkspaceSetInfo_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceSetInfoRequest)) + }) + return _c +} + +func (_c *MockClientCommands_WorkspaceSetInfo_Call) Return(_a0 *pb.RpcWorkspaceSetInfoResponse) *MockClientCommands_WorkspaceSetInfo_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommands_WorkspaceSetInfo_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceSetInfoRequest) *pb.RpcWorkspaceSetInfoResponse) *MockClientCommands_WorkspaceSetInfo_Call { + _c.Call.Return(run) + return _c +} + +// NewMockClientCommands creates a new instance of MockClientCommands. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockClientCommands(t interface { + mock.TestingT + Cleanup(func()) +}) *MockClientCommands { + mock := &MockClientCommands{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/core/api/internal/auth/service.go b/core/api/internal/auth/service.go index 33b3aecd6..c0bd7bb21 100644 --- a/core/api/internal/auth/service.go +++ b/core/api/internal/auth/service.go @@ -4,8 +4,8 @@ import ( "context" "errors" + "github.com/anyproto/anytype-heart/core/api/apicore" "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pb/service" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) @@ -22,10 +22,10 @@ type Service interface { } type AuthService struct { - mw service.ClientCommandsServer + mw apicore.ClientCommands } -func NewService(mw service.ClientCommandsServer) *AuthService { +func NewService(mw apicore.ClientCommands) *AuthService { return &AuthService{mw: mw} } diff --git a/core/api/internal/auth/service_test.go b/core/api/internal/auth/service_test.go index af067f7e4..cd85248d1 100644 --- a/core/api/internal/auth/service_test.go +++ b/core/api/internal/auth/service_test.go @@ -7,8 +7,8 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + "github.com/anyproto/anytype-heart/core/api/apicore/mock_apicore" "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pb/service/mock_service" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) @@ -22,11 +22,11 @@ const ( type fixture struct { *AuthService - mwMock *mock_service.MockClientCommandsServer + mwMock *mock_apicore.MockClientCommands } func newFixture(t *testing.T) *fixture { - mwMock := mock_service.NewMockClientCommandsServer(t) + mwMock := mock_apicore.NewMockClientCommands(t) authService := NewService(mwMock) return &fixture{ diff --git a/core/api/internal/export/service.go b/core/api/internal/export/service.go index bcb4e4e33..ce4bb3d46 100644 --- a/core/api/internal/export/service.go +++ b/core/api/internal/export/service.go @@ -4,8 +4,8 @@ import ( "context" "errors" + "github.com/anyproto/anytype-heart/core/api/apicore" "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pb/service" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) @@ -19,10 +19,10 @@ type Service interface { } type ExportService struct { - mw service.ClientCommandsServer + mw apicore.ClientCommands } -func NewService(mw service.ClientCommandsServer) *ExportService { +func NewService(mw apicore.ClientCommands) *ExportService { return &ExportService{mw: mw} } diff --git a/core/api/internal/export/service_test.go b/core/api/internal/export/service_test.go index 6dd705b8a..332f7e828 100644 --- a/core/api/internal/export/service_test.go +++ b/core/api/internal/export/service_test.go @@ -7,8 +7,8 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + "github.com/anyproto/anytype-heart/core/api/apicore/mock_apicore" "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pb/service/mock_service" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) @@ -22,11 +22,11 @@ const ( type fixture struct { *ExportService - mwMock *mock_service.MockClientCommandsServer + mwMock *mock_apicore.MockClientCommands } func newFixture(t *testing.T) *fixture { - mwMock := mock_service.NewMockClientCommandsServer(t) + mwMock := mock_apicore.NewMockClientCommands(t) exportService := NewService(mwMock) return &fixture{ diff --git a/core/api/internal/list/service.go b/core/api/internal/list/service.go index 2cc463abe..050969a67 100644 --- a/core/api/internal/list/service.go +++ b/core/api/internal/list/service.go @@ -6,11 +6,11 @@ import ( "github.com/iancoleman/strcase" + "github.com/anyproto/anytype-heart/core/api/apicore" "github.com/anyproto/anytype-heart/core/api/internal/object" "github.com/anyproto/anytype-heart/core/api/pagination" "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pb/service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) @@ -33,11 +33,11 @@ type Service interface { } type ListService struct { - mw service.ClientCommandsServer + mw apicore.ClientCommands objectService *object.ObjectService } -func NewService(mw service.ClientCommandsServer, objectService *object.ObjectService) *ListService { +func NewService(mw apicore.ClientCommands, objectService *object.ObjectService) *ListService { return &ListService{mw: mw, objectService: objectService} } diff --git a/core/api/internal/list/service_test.go b/core/api/internal/list/service_test.go index f4e487126..e0d335f7a 100644 --- a/core/api/internal/list/service_test.go +++ b/core/api/internal/list/service_test.go @@ -8,10 +8,10 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + "github.com/anyproto/anytype-heart/core/api/apicore/mock_apicore" "github.com/anyproto/anytype-heart/core/api/internal/object" "github.com/anyproto/anytype-heart/core/api/internal/space" "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pb/service/mock_service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" "github.com/anyproto/anytype-heart/util/pbtypes" @@ -30,12 +30,12 @@ const ( type fixture struct { *ListService - mwMock *mock_service.MockClientCommandsServer + mwMock *mock_apicore.MockClientCommands objectService *object.ObjectService } func newFixture(t *testing.T) *fixture { - mwMock := mock_service.NewMockClientCommandsServer(t) + mwMock := mock_apicore.NewMockClientCommands(t) spaceService := space.NewService(mwMock) objectService := object.NewService(mwMock, spaceService) objectService.AccountInfo = &model.AccountInfo{ diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 2505f1f6c..18a2c7d2a 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -8,12 +8,12 @@ import ( "github.com/gogo/protobuf/types" "github.com/iancoleman/strcase" + "github.com/anyproto/anytype-heart/core/api/apicore" "github.com/anyproto/anytype-heart/core/api/internal/space" "github.com/anyproto/anytype-heart/core/api/pagination" "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/core/domain" "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pb/service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" "github.com/anyproto/anytype-heart/util/pbtypes" @@ -103,12 +103,12 @@ type Service interface { } type ObjectService struct { - mw service.ClientCommandsServer + mw apicore.ClientCommands spaceService *space.SpaceService AccountInfo *model.AccountInfo } -func NewService(mw service.ClientCommandsServer, spaceService *space.SpaceService) *ObjectService { +func NewService(mw apicore.ClientCommands, spaceService *space.SpaceService) *ObjectService { return &ObjectService{mw: mw, spaceService: spaceService} } diff --git a/core/api/internal/object/service_test.go b/core/api/internal/object/service_test.go index 9064bbf5e..ef53eb72d 100644 --- a/core/api/internal/object/service_test.go +++ b/core/api/internal/object/service_test.go @@ -8,10 +8,10 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + "github.com/anyproto/anytype-heart/core/api/apicore/mock_apicore" "github.com/anyproto/anytype-heart/core/api/internal/space" "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pb/service/mock_service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" "github.com/anyproto/anytype-heart/util/pbtypes" @@ -40,11 +40,11 @@ const ( type fixture struct { *ObjectService - mwMock *mock_service.MockClientCommandsServer + mwMock *mock_apicore.MockClientCommands } func newFixture(t *testing.T) *fixture { - mwMock := mock_service.NewMockClientCommandsServer(t) + mwMock := mock_apicore.NewMockClientCommands(t) spaceService := space.NewService(mwMock) objectService := NewService(mwMock, spaceService) diff --git a/core/api/internal/search/service.go b/core/api/internal/search/service.go index 329af7e80..b941e7c6c 100644 --- a/core/api/internal/search/service.go +++ b/core/api/internal/search/service.go @@ -6,12 +6,12 @@ import ( "sort" "strings" + "github.com/anyproto/anytype-heart/core/api/apicore" "github.com/anyproto/anytype-heart/core/api/internal/object" "github.com/anyproto/anytype-heart/core/api/internal/space" "github.com/anyproto/anytype-heart/core/api/pagination" "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pb/service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" "github.com/anyproto/anytype-heart/util/pbtypes" @@ -28,13 +28,13 @@ type Service interface { } type SearchService struct { - mw service.ClientCommandsServer + mw apicore.ClientCommands spaceService *space.SpaceService objectService *object.ObjectService AccountInfo *model.AccountInfo } -func NewService(mw service.ClientCommandsServer, spaceService *space.SpaceService, objectService *object.ObjectService) *SearchService { +func NewService(mw apicore.ClientCommands, spaceService *space.SpaceService, objectService *object.ObjectService) *SearchService { return &SearchService{mw: mw, spaceService: spaceService, objectService: objectService} } diff --git a/core/api/internal/search/service_test.go b/core/api/internal/search/service_test.go index 7c6e44d60..1277e1fbf 100644 --- a/core/api/internal/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -8,11 +8,11 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + "github.com/anyproto/anytype-heart/core/api/apicore/mock_apicore" "github.com/anyproto/anytype-heart/core/api/internal/object" "github.com/anyproto/anytype-heart/core/api/internal/space" "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pb/service/mock_service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" "github.com/anyproto/anytype-heart/util/pbtypes" @@ -40,11 +40,11 @@ const ( type fixture struct { *SearchService - mwMock *mock_service.MockClientCommandsServer + mwMock *mock_apicore.MockClientCommands } func newFixture(t *testing.T) *fixture { - mwMock := mock_service.NewMockClientCommandsServer(t) + mwMock := mock_apicore.NewMockClientCommands(t) spaceService := space.NewService(mwMock) spaceService.AccountInfo = &model.AccountInfo{TechSpaceId: techSpaceId, GatewayUrl: gatewayUrl} diff --git a/core/api/internal/space/service.go b/core/api/internal/space/service.go index 683d63187..9362ff577 100644 --- a/core/api/internal/space/service.go +++ b/core/api/internal/space/service.go @@ -10,10 +10,10 @@ import ( "github.com/gogo/protobuf/types" "github.com/iancoleman/strcase" + "github.com/anyproto/anytype-heart/core/api/apicore" "github.com/anyproto/anytype-heart/core/api/pagination" "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pb/service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" "github.com/anyproto/anytype-heart/util/pbtypes" @@ -43,11 +43,11 @@ type Service interface { } type SpaceService struct { - mw service.ClientCommandsServer + mw apicore.ClientCommands AccountInfo *model.AccountInfo } -func NewService(mw service.ClientCommandsServer) *SpaceService { +func NewService(mw apicore.ClientCommands) *SpaceService { return &SpaceService{mw: mw} } diff --git a/core/api/internal/space/service_test.go b/core/api/internal/space/service_test.go index 9dd38daf4..add83ca27 100644 --- a/core/api/internal/space/service_test.go +++ b/core/api/internal/space/service_test.go @@ -9,9 +9,9 @@ import ( "github.com/gogo/protobuf/types" + "github.com/anyproto/anytype-heart/core/api/apicore/mock_apicore" "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pb/service/mock_service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" "github.com/anyproto/anytype-heart/util/pbtypes" @@ -27,11 +27,11 @@ const ( type fixture struct { *SpaceService - mwMock *mock_service.MockClientCommandsServer + mwMock *mock_apicore.MockClientCommands } func newFixture(t *testing.T) *fixture { - mwMock := mock_service.NewMockClientCommandsServer(t) + mwMock := mock_apicore.NewMockClientCommands(t) spaceService := NewService(mwMock) spaceService.AccountInfo = &model.AccountInfo{ TechSpaceId: techSpaceId, diff --git a/core/api/server/middleware.go b/core/api/server/middleware.go index 569f0a3ee..1ac02aa98 100644 --- a/core/api/server/middleware.go +++ b/core/api/server/middleware.go @@ -11,10 +11,9 @@ import ( "github.com/didip/tollbooth/v8/limiter" "github.com/gin-gonic/gin" - "github.com/anyproto/anytype-heart/core/anytype/account" + "github.com/anyproto/anytype-heart/core/api/apicore" "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pb/service" ) var ( @@ -43,7 +42,7 @@ func (s *Server) rateLimit(max float64) gin.HandlerFunc { } // ensureAuthenticated is a middleware that ensures the request is authenticated. -func (s *Server) ensureAuthenticated(mw service.ClientCommandsServer) gin.HandlerFunc { +func (s *Server) ensureAuthenticated(mw apicore.ClientCommands) gin.HandlerFunc { return func(c *gin.Context) { authHeader := c.GetHeader("Authorization") if authHeader == "" { @@ -86,7 +85,7 @@ func (s *Server) ensureAuthenticated(mw service.ClientCommandsServer) gin.Handle } // ensureAccountInfo is a middleware that ensures the account info is available in the services. -func (s *Server) ensureAccountInfo(accountService account.Service) gin.HandlerFunc { +func (s *Server) ensureAccountInfo(accountService apicore.AccountInfo) gin.HandlerFunc { return func(c *gin.Context) { accInfo, err := accountService.GetInfo(context.Background()) if err != nil { diff --git a/core/api/server/middleware_test.go b/core/api/server/middleware_test.go index 44bfdeca4..a0d283551 100644 --- a/core/api/server/middleware_test.go +++ b/core/api/server/middleware_test.go @@ -19,7 +19,7 @@ import ( ) func newFixture(t *testing.T) *fixture { - mwMock := mock_service.NewMockClientCommandsServer(t) + mwMock := mock_apicore.NewMockClientCommands(t) accountService := mock_account.NewMockService(t) server := NewServer(accountService, mwMock) diff --git a/core/api/server/router.go b/core/api/server/router.go index bc04565fd..3cb89298f 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -7,9 +7,9 @@ import ( swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" + "github.com/anyproto/anytype-heart/core/api/apicore" _ "github.com/anyproto/anytype-heart/core/api/docs" - "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/api/internal/auth" "github.com/anyproto/anytype-heart/core/api/internal/export" "github.com/anyproto/anytype-heart/core/api/internal/list" @@ -17,7 +17,6 @@ import ( "github.com/anyproto/anytype-heart/core/api/internal/search" "github.com/anyproto/anytype-heart/core/api/internal/space" "github.com/anyproto/anytype-heart/core/api/pagination" - "github.com/anyproto/anytype-heart/pb/service" ) const ( @@ -29,7 +28,7 @@ const ( ) // NewRouter builds and returns a *gin.Engine with all routes configured. -func (s *Server) NewRouter(accountService account.Service, mw service.ClientCommandsServer) *gin.Engine { +func (s *Server) NewRouter(accountService apicore.AccountInfo, mw apicore.ClientCommands) *gin.Engine { debug := os.Getenv("ANYTYPE_API_DEBUG") == "1" if !debug { gin.SetMode(gin.ReleaseMode) diff --git a/core/api/server/server.go b/core/api/server/server.go index f38dc6c7e..0e9683c39 100644 --- a/core/api/server/server.go +++ b/core/api/server/server.go @@ -5,14 +5,13 @@ import ( "github.com/gin-gonic/gin" - "github.com/anyproto/anytype-heart/core/anytype/account" + "github.com/anyproto/anytype-heart/core/api/apicore" "github.com/anyproto/anytype-heart/core/api/internal/auth" "github.com/anyproto/anytype-heart/core/api/internal/export" "github.com/anyproto/anytype-heart/core/api/internal/list" "github.com/anyproto/anytype-heart/core/api/internal/object" "github.com/anyproto/anytype-heart/core/api/internal/search" "github.com/anyproto/anytype-heart/core/api/internal/space" - "github.com/anyproto/anytype-heart/pb/service" ) // Server wraps the HTTP server and service logic. @@ -31,7 +30,7 @@ type Server struct { } // NewServer constructs a new Server with default config and sets up the routes. -func NewServer(accountService account.Service, mw service.ClientCommandsServer) *Server { +func NewServer(accountService apicore.AccountInfo, mw apicore.ClientCommands) *Server { s := &Server{ authService: auth.NewService(mw), exportService: export.NewService(mw), diff --git a/core/api/server/server_test.go b/core/api/server/server_test.go index a1f880d1d..ef56a56b5 100644 --- a/core/api/server/server_test.go +++ b/core/api/server/server_test.go @@ -13,11 +13,11 @@ import ( type fixture struct { *Server accountService account.Service - mwMock *mock_service.MockClientCommandsServer + mwMock *mock_apicore.MockClientCommands } func newServerFixture(t *testing.T) *fixture { - mwMock := mock_service.NewMockClientCommandsServer(t) + mwMock := mock_apicore.NewMockClientCommands(t) accountService := mock_account.NewMockService(t) server := NewServer(accountService, mwMock) diff --git a/core/api/service.go b/core/api/service.go index 4d98e334d..eb9b0abc5 100644 --- a/core/api/service.go +++ b/core/api/service.go @@ -12,8 +12,8 @@ import ( "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/anytype/config" + "github.com/anyproto/anytype-heart/core/api/apicore" "github.com/anyproto/anytype-heart/core/api/server" - "github.com/anyproto/anytype-heart/pb/service" ) const ( @@ -22,7 +22,7 @@ const ( ) var ( - mwSrv service.ClientCommandsServer + mwSrv apicore.ClientCommands ) type Service interface { @@ -33,8 +33,8 @@ type Service interface { type apiService struct { srv *server.Server httpSrv *http.Server - mw service.ClientCommandsServer - accountService account.Service + mw apicore.ClientCommands + accountService apicore.AccountInfo listenAddr string lock sync.Mutex } @@ -130,6 +130,6 @@ func (s *apiService) ReassignAddress(ctx context.Context, listenAddr string) (er return nil } -func SetMiddlewareParams(mw service.ClientCommandsServer) { +func SetMiddlewareParams(mw apicore.ClientCommands) { mwSrv = mw } diff --git a/core/api/util/util.go b/core/api/util/util.go index d6460c243..5d13a8074 100644 --- a/core/api/util/util.go +++ b/core/api/util/util.go @@ -5,8 +5,8 @@ import ( "errors" "fmt" + "github.com/anyproto/anytype-heart/core/api/apicore" "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pb/service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" "github.com/anyproto/anytype-heart/util/pbtypes" @@ -81,7 +81,7 @@ func GetIcon(accountInfo *model.AccountInfo, iconEmoji string, iconImage string, } // ResolveUniqueKeyToTypeId resolves the unique key to the type's ID -func ResolveUniqueKeyToTypeId(mw service.ClientCommandsServer, spaceId string, uniqueKey string) (typeId string, err error) { +func ResolveUniqueKeyToTypeId(mw apicore.ClientCommands, spaceId string, uniqueKey string) (typeId string, err error) { resp := mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ @@ -108,7 +108,7 @@ func ResolveUniqueKeyToTypeId(mw service.ClientCommandsServer, spaceId string, u } // ResolveIdtoUniqueKey resolves the type's ID to the unique key -func ResolveIdtoUniqueKey(mw service.ClientCommandsServer, spaceId string, typeId string) (uniqueKey string, err error) { +func ResolveIdtoUniqueKey(mw apicore.ClientCommands, spaceId string, typeId string) (uniqueKey string, err error) { resp := mw.ObjectShow(context.Background(), &pb.RpcObjectShowRequest{ SpaceId: spaceId, ObjectId: typeId, @@ -122,7 +122,7 @@ func ResolveIdtoUniqueKey(mw service.ClientCommandsServer, spaceId string, typeI } // ResolveRelationKeyToPropertyName resolves the property key to the property's name -func ResolveRelationKeyToPropertyName(mw service.ClientCommandsServer, spaceId string, relationKey string) (property string, err error) { +func ResolveRelationKeyToPropertyName(mw apicore.ClientCommands, spaceId string, relationKey string) (property string, err error) { resp := mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ diff --git a/pb/service/mock_service/mock_ClientCommandsServer.go b/pb/service/mock_service/mock_ClientCommandsServer.go deleted file mode 100644 index a4db01e73..000000000 --- a/pb/service/mock_service/mock_ClientCommandsServer.go +++ /dev/null @@ -1,14283 +0,0 @@ -// Code generated by mockery. DO NOT EDIT. - -package mock_service - -import ( - context "context" - - pb "github.com/anyproto/anytype-heart/pb" - mock "github.com/stretchr/testify/mock" - - service "github.com/anyproto/anytype-heart/pb/service" -) - -// MockClientCommandsServer is an autogenerated mock type for the ClientCommandsServer type -type MockClientCommandsServer struct { - mock.Mock -} - -type MockClientCommandsServer_Expecter struct { - mock *mock.Mock -} - -func (_m *MockClientCommandsServer) EXPECT() *MockClientCommandsServer_Expecter { - return &MockClientCommandsServer_Expecter{mock: &_m.Mock} -} - -// AIAutofill provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AIAutofill(_a0 context.Context, _a1 *pb.RpcAIAutofillRequest) *pb.RpcAIAutofillResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AIAutofill") - } - - var r0 *pb.RpcAIAutofillResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAIAutofillRequest) *pb.RpcAIAutofillResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAIAutofillResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AIAutofill_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AIAutofill' -type MockClientCommandsServer_AIAutofill_Call struct { - *mock.Call -} - -// AIAutofill is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAIAutofillRequest -func (_e *MockClientCommandsServer_Expecter) AIAutofill(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AIAutofill_Call { - return &MockClientCommandsServer_AIAutofill_Call{Call: _e.mock.On("AIAutofill", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AIAutofill_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAIAutofillRequest)) *MockClientCommandsServer_AIAutofill_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAIAutofillRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AIAutofill_Call) Return(_a0 *pb.RpcAIAutofillResponse) *MockClientCommandsServer_AIAutofill_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AIAutofill_Call) RunAndReturn(run func(context.Context, *pb.RpcAIAutofillRequest) *pb.RpcAIAutofillResponse) *MockClientCommandsServer_AIAutofill_Call { - _c.Call.Return(run) - return _c -} - -// AIListSummary provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AIListSummary(_a0 context.Context, _a1 *pb.RpcAIListSummaryRequest) *pb.RpcAIListSummaryResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AIListSummary") - } - - var r0 *pb.RpcAIListSummaryResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAIListSummaryRequest) *pb.RpcAIListSummaryResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAIListSummaryResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AIListSummary_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AIListSummary' -type MockClientCommandsServer_AIListSummary_Call struct { - *mock.Call -} - -// AIListSummary is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAIListSummaryRequest -func (_e *MockClientCommandsServer_Expecter) AIListSummary(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AIListSummary_Call { - return &MockClientCommandsServer_AIListSummary_Call{Call: _e.mock.On("AIListSummary", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AIListSummary_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAIListSummaryRequest)) *MockClientCommandsServer_AIListSummary_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAIListSummaryRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AIListSummary_Call) Return(_a0 *pb.RpcAIListSummaryResponse) *MockClientCommandsServer_AIListSummary_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AIListSummary_Call) RunAndReturn(run func(context.Context, *pb.RpcAIListSummaryRequest) *pb.RpcAIListSummaryResponse) *MockClientCommandsServer_AIListSummary_Call { - _c.Call.Return(run) - return _c -} - -// AIObjectCreateFromUrl provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AIObjectCreateFromUrl(_a0 context.Context, _a1 *pb.RpcAIObjectCreateFromUrlRequest) *pb.RpcAIObjectCreateFromUrlResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AIObjectCreateFromUrl") - } - - var r0 *pb.RpcAIObjectCreateFromUrlResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAIObjectCreateFromUrlRequest) *pb.RpcAIObjectCreateFromUrlResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAIObjectCreateFromUrlResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AIObjectCreateFromUrl_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AIObjectCreateFromUrl' -type MockClientCommandsServer_AIObjectCreateFromUrl_Call struct { - *mock.Call -} - -// AIObjectCreateFromUrl is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAIObjectCreateFromUrlRequest -func (_e *MockClientCommandsServer_Expecter) AIObjectCreateFromUrl(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AIObjectCreateFromUrl_Call { - return &MockClientCommandsServer_AIObjectCreateFromUrl_Call{Call: _e.mock.On("AIObjectCreateFromUrl", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AIObjectCreateFromUrl_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAIObjectCreateFromUrlRequest)) *MockClientCommandsServer_AIObjectCreateFromUrl_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAIObjectCreateFromUrlRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AIObjectCreateFromUrl_Call) Return(_a0 *pb.RpcAIObjectCreateFromUrlResponse) *MockClientCommandsServer_AIObjectCreateFromUrl_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AIObjectCreateFromUrl_Call) RunAndReturn(run func(context.Context, *pb.RpcAIObjectCreateFromUrlRequest) *pb.RpcAIObjectCreateFromUrlResponse) *MockClientCommandsServer_AIObjectCreateFromUrl_Call { - _c.Call.Return(run) - return _c -} - -// AIWritingTools provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AIWritingTools(_a0 context.Context, _a1 *pb.RpcAIWritingToolsRequest) *pb.RpcAIWritingToolsResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AIWritingTools") - } - - var r0 *pb.RpcAIWritingToolsResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAIWritingToolsRequest) *pb.RpcAIWritingToolsResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAIWritingToolsResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AIWritingTools_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AIWritingTools' -type MockClientCommandsServer_AIWritingTools_Call struct { - *mock.Call -} - -// AIWritingTools is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAIWritingToolsRequest -func (_e *MockClientCommandsServer_Expecter) AIWritingTools(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AIWritingTools_Call { - return &MockClientCommandsServer_AIWritingTools_Call{Call: _e.mock.On("AIWritingTools", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AIWritingTools_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAIWritingToolsRequest)) *MockClientCommandsServer_AIWritingTools_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAIWritingToolsRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AIWritingTools_Call) Return(_a0 *pb.RpcAIWritingToolsResponse) *MockClientCommandsServer_AIWritingTools_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AIWritingTools_Call) RunAndReturn(run func(context.Context, *pb.RpcAIWritingToolsRequest) *pb.RpcAIWritingToolsResponse) *MockClientCommandsServer_AIWritingTools_Call { - _c.Call.Return(run) - return _c -} - -// AccountChangeJsonApiAddr provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AccountChangeJsonApiAddr(_a0 context.Context, _a1 *pb.RpcAccountChangeJsonApiAddrRequest) *pb.RpcAccountChangeJsonApiAddrResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AccountChangeJsonApiAddr") - } - - var r0 *pb.RpcAccountChangeJsonApiAddrResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountChangeJsonApiAddrRequest) *pb.RpcAccountChangeJsonApiAddrResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAccountChangeJsonApiAddrResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AccountChangeJsonApiAddr_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountChangeJsonApiAddr' -type MockClientCommandsServer_AccountChangeJsonApiAddr_Call struct { - *mock.Call -} - -// AccountChangeJsonApiAddr is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAccountChangeJsonApiAddrRequest -func (_e *MockClientCommandsServer_Expecter) AccountChangeJsonApiAddr(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountChangeJsonApiAddr_Call { - return &MockClientCommandsServer_AccountChangeJsonApiAddr_Call{Call: _e.mock.On("AccountChangeJsonApiAddr", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AccountChangeJsonApiAddr_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountChangeJsonApiAddrRequest)) *MockClientCommandsServer_AccountChangeJsonApiAddr_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAccountChangeJsonApiAddrRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AccountChangeJsonApiAddr_Call) Return(_a0 *pb.RpcAccountChangeJsonApiAddrResponse) *MockClientCommandsServer_AccountChangeJsonApiAddr_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AccountChangeJsonApiAddr_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountChangeJsonApiAddrRequest) *pb.RpcAccountChangeJsonApiAddrResponse) *MockClientCommandsServer_AccountChangeJsonApiAddr_Call { - _c.Call.Return(run) - return _c -} - -// AccountChangeNetworkConfigAndRestart provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AccountChangeNetworkConfigAndRestart(_a0 context.Context, _a1 *pb.RpcAccountChangeNetworkConfigAndRestartRequest) *pb.RpcAccountChangeNetworkConfigAndRestartResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AccountChangeNetworkConfigAndRestart") - } - - var r0 *pb.RpcAccountChangeNetworkConfigAndRestartResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountChangeNetworkConfigAndRestartRequest) *pb.RpcAccountChangeNetworkConfigAndRestartResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAccountChangeNetworkConfigAndRestartResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AccountChangeNetworkConfigAndRestart_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountChangeNetworkConfigAndRestart' -type MockClientCommandsServer_AccountChangeNetworkConfigAndRestart_Call struct { - *mock.Call -} - -// AccountChangeNetworkConfigAndRestart is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAccountChangeNetworkConfigAndRestartRequest -func (_e *MockClientCommandsServer_Expecter) AccountChangeNetworkConfigAndRestart(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountChangeNetworkConfigAndRestart_Call { - return &MockClientCommandsServer_AccountChangeNetworkConfigAndRestart_Call{Call: _e.mock.On("AccountChangeNetworkConfigAndRestart", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AccountChangeNetworkConfigAndRestart_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountChangeNetworkConfigAndRestartRequest)) *MockClientCommandsServer_AccountChangeNetworkConfigAndRestart_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAccountChangeNetworkConfigAndRestartRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AccountChangeNetworkConfigAndRestart_Call) Return(_a0 *pb.RpcAccountChangeNetworkConfigAndRestartResponse) *MockClientCommandsServer_AccountChangeNetworkConfigAndRestart_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AccountChangeNetworkConfigAndRestart_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountChangeNetworkConfigAndRestartRequest) *pb.RpcAccountChangeNetworkConfigAndRestartResponse) *MockClientCommandsServer_AccountChangeNetworkConfigAndRestart_Call { - _c.Call.Return(run) - return _c -} - -// AccountConfigUpdate provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AccountConfigUpdate(_a0 context.Context, _a1 *pb.RpcAccountConfigUpdateRequest) *pb.RpcAccountConfigUpdateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AccountConfigUpdate") - } - - var r0 *pb.RpcAccountConfigUpdateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountConfigUpdateRequest) *pb.RpcAccountConfigUpdateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAccountConfigUpdateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AccountConfigUpdate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountConfigUpdate' -type MockClientCommandsServer_AccountConfigUpdate_Call struct { - *mock.Call -} - -// AccountConfigUpdate is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAccountConfigUpdateRequest -func (_e *MockClientCommandsServer_Expecter) AccountConfigUpdate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountConfigUpdate_Call { - return &MockClientCommandsServer_AccountConfigUpdate_Call{Call: _e.mock.On("AccountConfigUpdate", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AccountConfigUpdate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountConfigUpdateRequest)) *MockClientCommandsServer_AccountConfigUpdate_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAccountConfigUpdateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AccountConfigUpdate_Call) Return(_a0 *pb.RpcAccountConfigUpdateResponse) *MockClientCommandsServer_AccountConfigUpdate_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AccountConfigUpdate_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountConfigUpdateRequest) *pb.RpcAccountConfigUpdateResponse) *MockClientCommandsServer_AccountConfigUpdate_Call { - _c.Call.Return(run) - return _c -} - -// AccountCreate provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AccountCreate(_a0 context.Context, _a1 *pb.RpcAccountCreateRequest) *pb.RpcAccountCreateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AccountCreate") - } - - var r0 *pb.RpcAccountCreateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountCreateRequest) *pb.RpcAccountCreateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAccountCreateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AccountCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountCreate' -type MockClientCommandsServer_AccountCreate_Call struct { - *mock.Call -} - -// AccountCreate is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAccountCreateRequest -func (_e *MockClientCommandsServer_Expecter) AccountCreate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountCreate_Call { - return &MockClientCommandsServer_AccountCreate_Call{Call: _e.mock.On("AccountCreate", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AccountCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountCreateRequest)) *MockClientCommandsServer_AccountCreate_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAccountCreateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AccountCreate_Call) Return(_a0 *pb.RpcAccountCreateResponse) *MockClientCommandsServer_AccountCreate_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AccountCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountCreateRequest) *pb.RpcAccountCreateResponse) *MockClientCommandsServer_AccountCreate_Call { - _c.Call.Return(run) - return _c -} - -// AccountDelete provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AccountDelete(_a0 context.Context, _a1 *pb.RpcAccountDeleteRequest) *pb.RpcAccountDeleteResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AccountDelete") - } - - var r0 *pb.RpcAccountDeleteResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountDeleteRequest) *pb.RpcAccountDeleteResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAccountDeleteResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AccountDelete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountDelete' -type MockClientCommandsServer_AccountDelete_Call struct { - *mock.Call -} - -// AccountDelete is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAccountDeleteRequest -func (_e *MockClientCommandsServer_Expecter) AccountDelete(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountDelete_Call { - return &MockClientCommandsServer_AccountDelete_Call{Call: _e.mock.On("AccountDelete", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AccountDelete_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountDeleteRequest)) *MockClientCommandsServer_AccountDelete_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAccountDeleteRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AccountDelete_Call) Return(_a0 *pb.RpcAccountDeleteResponse) *MockClientCommandsServer_AccountDelete_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AccountDelete_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountDeleteRequest) *pb.RpcAccountDeleteResponse) *MockClientCommandsServer_AccountDelete_Call { - _c.Call.Return(run) - return _c -} - -// AccountEnableLocalNetworkSync provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AccountEnableLocalNetworkSync(_a0 context.Context, _a1 *pb.RpcAccountEnableLocalNetworkSyncRequest) *pb.RpcAccountEnableLocalNetworkSyncResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AccountEnableLocalNetworkSync") - } - - var r0 *pb.RpcAccountEnableLocalNetworkSyncResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountEnableLocalNetworkSyncRequest) *pb.RpcAccountEnableLocalNetworkSyncResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAccountEnableLocalNetworkSyncResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AccountEnableLocalNetworkSync_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountEnableLocalNetworkSync' -type MockClientCommandsServer_AccountEnableLocalNetworkSync_Call struct { - *mock.Call -} - -// AccountEnableLocalNetworkSync is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAccountEnableLocalNetworkSyncRequest -func (_e *MockClientCommandsServer_Expecter) AccountEnableLocalNetworkSync(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountEnableLocalNetworkSync_Call { - return &MockClientCommandsServer_AccountEnableLocalNetworkSync_Call{Call: _e.mock.On("AccountEnableLocalNetworkSync", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AccountEnableLocalNetworkSync_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountEnableLocalNetworkSyncRequest)) *MockClientCommandsServer_AccountEnableLocalNetworkSync_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAccountEnableLocalNetworkSyncRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AccountEnableLocalNetworkSync_Call) Return(_a0 *pb.RpcAccountEnableLocalNetworkSyncResponse) *MockClientCommandsServer_AccountEnableLocalNetworkSync_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AccountEnableLocalNetworkSync_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountEnableLocalNetworkSyncRequest) *pb.RpcAccountEnableLocalNetworkSyncResponse) *MockClientCommandsServer_AccountEnableLocalNetworkSync_Call { - _c.Call.Return(run) - return _c -} - -// AccountLocalLinkNewChallenge provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AccountLocalLinkNewChallenge(_a0 context.Context, _a1 *pb.RpcAccountLocalLinkNewChallengeRequest) *pb.RpcAccountLocalLinkNewChallengeResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AccountLocalLinkNewChallenge") - } - - var r0 *pb.RpcAccountLocalLinkNewChallengeResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountLocalLinkNewChallengeRequest) *pb.RpcAccountLocalLinkNewChallengeResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAccountLocalLinkNewChallengeResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AccountLocalLinkNewChallenge_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountLocalLinkNewChallenge' -type MockClientCommandsServer_AccountLocalLinkNewChallenge_Call struct { - *mock.Call -} - -// AccountLocalLinkNewChallenge is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAccountLocalLinkNewChallengeRequest -func (_e *MockClientCommandsServer_Expecter) AccountLocalLinkNewChallenge(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountLocalLinkNewChallenge_Call { - return &MockClientCommandsServer_AccountLocalLinkNewChallenge_Call{Call: _e.mock.On("AccountLocalLinkNewChallenge", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AccountLocalLinkNewChallenge_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountLocalLinkNewChallengeRequest)) *MockClientCommandsServer_AccountLocalLinkNewChallenge_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAccountLocalLinkNewChallengeRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AccountLocalLinkNewChallenge_Call) Return(_a0 *pb.RpcAccountLocalLinkNewChallengeResponse) *MockClientCommandsServer_AccountLocalLinkNewChallenge_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AccountLocalLinkNewChallenge_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountLocalLinkNewChallengeRequest) *pb.RpcAccountLocalLinkNewChallengeResponse) *MockClientCommandsServer_AccountLocalLinkNewChallenge_Call { - _c.Call.Return(run) - return _c -} - -// AccountLocalLinkSolveChallenge provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AccountLocalLinkSolveChallenge(_a0 context.Context, _a1 *pb.RpcAccountLocalLinkSolveChallengeRequest) *pb.RpcAccountLocalLinkSolveChallengeResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AccountLocalLinkSolveChallenge") - } - - var r0 *pb.RpcAccountLocalLinkSolveChallengeResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountLocalLinkSolveChallengeRequest) *pb.RpcAccountLocalLinkSolveChallengeResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAccountLocalLinkSolveChallengeResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AccountLocalLinkSolveChallenge_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountLocalLinkSolveChallenge' -type MockClientCommandsServer_AccountLocalLinkSolveChallenge_Call struct { - *mock.Call -} - -// AccountLocalLinkSolveChallenge is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAccountLocalLinkSolveChallengeRequest -func (_e *MockClientCommandsServer_Expecter) AccountLocalLinkSolveChallenge(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountLocalLinkSolveChallenge_Call { - return &MockClientCommandsServer_AccountLocalLinkSolveChallenge_Call{Call: _e.mock.On("AccountLocalLinkSolveChallenge", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AccountLocalLinkSolveChallenge_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountLocalLinkSolveChallengeRequest)) *MockClientCommandsServer_AccountLocalLinkSolveChallenge_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAccountLocalLinkSolveChallengeRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AccountLocalLinkSolveChallenge_Call) Return(_a0 *pb.RpcAccountLocalLinkSolveChallengeResponse) *MockClientCommandsServer_AccountLocalLinkSolveChallenge_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AccountLocalLinkSolveChallenge_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountLocalLinkSolveChallengeRequest) *pb.RpcAccountLocalLinkSolveChallengeResponse) *MockClientCommandsServer_AccountLocalLinkSolveChallenge_Call { - _c.Call.Return(run) - return _c -} - -// AccountMigrate provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AccountMigrate(_a0 context.Context, _a1 *pb.RpcAccountMigrateRequest) *pb.RpcAccountMigrateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AccountMigrate") - } - - var r0 *pb.RpcAccountMigrateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountMigrateRequest) *pb.RpcAccountMigrateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAccountMigrateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AccountMigrate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountMigrate' -type MockClientCommandsServer_AccountMigrate_Call struct { - *mock.Call -} - -// AccountMigrate is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAccountMigrateRequest -func (_e *MockClientCommandsServer_Expecter) AccountMigrate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountMigrate_Call { - return &MockClientCommandsServer_AccountMigrate_Call{Call: _e.mock.On("AccountMigrate", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AccountMigrate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountMigrateRequest)) *MockClientCommandsServer_AccountMigrate_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAccountMigrateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AccountMigrate_Call) Return(_a0 *pb.RpcAccountMigrateResponse) *MockClientCommandsServer_AccountMigrate_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AccountMigrate_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountMigrateRequest) *pb.RpcAccountMigrateResponse) *MockClientCommandsServer_AccountMigrate_Call { - _c.Call.Return(run) - return _c -} - -// AccountMigrateCancel provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AccountMigrateCancel(_a0 context.Context, _a1 *pb.RpcAccountMigrateCancelRequest) *pb.RpcAccountMigrateCancelResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AccountMigrateCancel") - } - - var r0 *pb.RpcAccountMigrateCancelResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountMigrateCancelRequest) *pb.RpcAccountMigrateCancelResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAccountMigrateCancelResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AccountMigrateCancel_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountMigrateCancel' -type MockClientCommandsServer_AccountMigrateCancel_Call struct { - *mock.Call -} - -// AccountMigrateCancel is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAccountMigrateCancelRequest -func (_e *MockClientCommandsServer_Expecter) AccountMigrateCancel(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountMigrateCancel_Call { - return &MockClientCommandsServer_AccountMigrateCancel_Call{Call: _e.mock.On("AccountMigrateCancel", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AccountMigrateCancel_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountMigrateCancelRequest)) *MockClientCommandsServer_AccountMigrateCancel_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAccountMigrateCancelRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AccountMigrateCancel_Call) Return(_a0 *pb.RpcAccountMigrateCancelResponse) *MockClientCommandsServer_AccountMigrateCancel_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AccountMigrateCancel_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountMigrateCancelRequest) *pb.RpcAccountMigrateCancelResponse) *MockClientCommandsServer_AccountMigrateCancel_Call { - _c.Call.Return(run) - return _c -} - -// AccountMove provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AccountMove(_a0 context.Context, _a1 *pb.RpcAccountMoveRequest) *pb.RpcAccountMoveResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AccountMove") - } - - var r0 *pb.RpcAccountMoveResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountMoveRequest) *pb.RpcAccountMoveResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAccountMoveResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AccountMove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountMove' -type MockClientCommandsServer_AccountMove_Call struct { - *mock.Call -} - -// AccountMove is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAccountMoveRequest -func (_e *MockClientCommandsServer_Expecter) AccountMove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountMove_Call { - return &MockClientCommandsServer_AccountMove_Call{Call: _e.mock.On("AccountMove", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AccountMove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountMoveRequest)) *MockClientCommandsServer_AccountMove_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAccountMoveRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AccountMove_Call) Return(_a0 *pb.RpcAccountMoveResponse) *MockClientCommandsServer_AccountMove_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AccountMove_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountMoveRequest) *pb.RpcAccountMoveResponse) *MockClientCommandsServer_AccountMove_Call { - _c.Call.Return(run) - return _c -} - -// AccountRecover provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AccountRecover(_a0 context.Context, _a1 *pb.RpcAccountRecoverRequest) *pb.RpcAccountRecoverResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AccountRecover") - } - - var r0 *pb.RpcAccountRecoverResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountRecoverRequest) *pb.RpcAccountRecoverResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAccountRecoverResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AccountRecover_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountRecover' -type MockClientCommandsServer_AccountRecover_Call struct { - *mock.Call -} - -// AccountRecover is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAccountRecoverRequest -func (_e *MockClientCommandsServer_Expecter) AccountRecover(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountRecover_Call { - return &MockClientCommandsServer_AccountRecover_Call{Call: _e.mock.On("AccountRecover", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AccountRecover_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountRecoverRequest)) *MockClientCommandsServer_AccountRecover_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAccountRecoverRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AccountRecover_Call) Return(_a0 *pb.RpcAccountRecoverResponse) *MockClientCommandsServer_AccountRecover_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AccountRecover_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountRecoverRequest) *pb.RpcAccountRecoverResponse) *MockClientCommandsServer_AccountRecover_Call { - _c.Call.Return(run) - return _c -} - -// AccountRecoverFromLegacyExport provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AccountRecoverFromLegacyExport(_a0 context.Context, _a1 *pb.RpcAccountRecoverFromLegacyExportRequest) *pb.RpcAccountRecoverFromLegacyExportResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AccountRecoverFromLegacyExport") - } - - var r0 *pb.RpcAccountRecoverFromLegacyExportResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountRecoverFromLegacyExportRequest) *pb.RpcAccountRecoverFromLegacyExportResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAccountRecoverFromLegacyExportResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AccountRecoverFromLegacyExport_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountRecoverFromLegacyExport' -type MockClientCommandsServer_AccountRecoverFromLegacyExport_Call struct { - *mock.Call -} - -// AccountRecoverFromLegacyExport is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAccountRecoverFromLegacyExportRequest -func (_e *MockClientCommandsServer_Expecter) AccountRecoverFromLegacyExport(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountRecoverFromLegacyExport_Call { - return &MockClientCommandsServer_AccountRecoverFromLegacyExport_Call{Call: _e.mock.On("AccountRecoverFromLegacyExport", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AccountRecoverFromLegacyExport_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountRecoverFromLegacyExportRequest)) *MockClientCommandsServer_AccountRecoverFromLegacyExport_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAccountRecoverFromLegacyExportRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AccountRecoverFromLegacyExport_Call) Return(_a0 *pb.RpcAccountRecoverFromLegacyExportResponse) *MockClientCommandsServer_AccountRecoverFromLegacyExport_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AccountRecoverFromLegacyExport_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountRecoverFromLegacyExportRequest) *pb.RpcAccountRecoverFromLegacyExportResponse) *MockClientCommandsServer_AccountRecoverFromLegacyExport_Call { - _c.Call.Return(run) - return _c -} - -// AccountRevertDeletion provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AccountRevertDeletion(_a0 context.Context, _a1 *pb.RpcAccountRevertDeletionRequest) *pb.RpcAccountRevertDeletionResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AccountRevertDeletion") - } - - var r0 *pb.RpcAccountRevertDeletionResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountRevertDeletionRequest) *pb.RpcAccountRevertDeletionResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAccountRevertDeletionResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AccountRevertDeletion_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountRevertDeletion' -type MockClientCommandsServer_AccountRevertDeletion_Call struct { - *mock.Call -} - -// AccountRevertDeletion is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAccountRevertDeletionRequest -func (_e *MockClientCommandsServer_Expecter) AccountRevertDeletion(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountRevertDeletion_Call { - return &MockClientCommandsServer_AccountRevertDeletion_Call{Call: _e.mock.On("AccountRevertDeletion", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AccountRevertDeletion_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountRevertDeletionRequest)) *MockClientCommandsServer_AccountRevertDeletion_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAccountRevertDeletionRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AccountRevertDeletion_Call) Return(_a0 *pb.RpcAccountRevertDeletionResponse) *MockClientCommandsServer_AccountRevertDeletion_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AccountRevertDeletion_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountRevertDeletionRequest) *pb.RpcAccountRevertDeletionResponse) *MockClientCommandsServer_AccountRevertDeletion_Call { - _c.Call.Return(run) - return _c -} - -// AccountSelect provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AccountSelect(_a0 context.Context, _a1 *pb.RpcAccountSelectRequest) *pb.RpcAccountSelectResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AccountSelect") - } - - var r0 *pb.RpcAccountSelectResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountSelectRequest) *pb.RpcAccountSelectResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAccountSelectResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AccountSelect_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountSelect' -type MockClientCommandsServer_AccountSelect_Call struct { - *mock.Call -} - -// AccountSelect is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAccountSelectRequest -func (_e *MockClientCommandsServer_Expecter) AccountSelect(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountSelect_Call { - return &MockClientCommandsServer_AccountSelect_Call{Call: _e.mock.On("AccountSelect", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AccountSelect_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountSelectRequest)) *MockClientCommandsServer_AccountSelect_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAccountSelectRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AccountSelect_Call) Return(_a0 *pb.RpcAccountSelectResponse) *MockClientCommandsServer_AccountSelect_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AccountSelect_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountSelectRequest) *pb.RpcAccountSelectResponse) *MockClientCommandsServer_AccountSelect_Call { - _c.Call.Return(run) - return _c -} - -// AccountStop provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AccountStop(_a0 context.Context, _a1 *pb.RpcAccountStopRequest) *pb.RpcAccountStopResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AccountStop") - } - - var r0 *pb.RpcAccountStopResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountStopRequest) *pb.RpcAccountStopResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAccountStopResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AccountStop_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountStop' -type MockClientCommandsServer_AccountStop_Call struct { - *mock.Call -} - -// AccountStop is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAccountStopRequest -func (_e *MockClientCommandsServer_Expecter) AccountStop(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountStop_Call { - return &MockClientCommandsServer_AccountStop_Call{Call: _e.mock.On("AccountStop", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AccountStop_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountStopRequest)) *MockClientCommandsServer_AccountStop_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAccountStopRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AccountStop_Call) Return(_a0 *pb.RpcAccountStopResponse) *MockClientCommandsServer_AccountStop_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AccountStop_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountStopRequest) *pb.RpcAccountStopResponse) *MockClientCommandsServer_AccountStop_Call { - _c.Call.Return(run) - return _c -} - -// AppGetVersion provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AppGetVersion(_a0 context.Context, _a1 *pb.RpcAppGetVersionRequest) *pb.RpcAppGetVersionResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AppGetVersion") - } - - var r0 *pb.RpcAppGetVersionResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAppGetVersionRequest) *pb.RpcAppGetVersionResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAppGetVersionResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AppGetVersion_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AppGetVersion' -type MockClientCommandsServer_AppGetVersion_Call struct { - *mock.Call -} - -// AppGetVersion is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAppGetVersionRequest -func (_e *MockClientCommandsServer_Expecter) AppGetVersion(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AppGetVersion_Call { - return &MockClientCommandsServer_AppGetVersion_Call{Call: _e.mock.On("AppGetVersion", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AppGetVersion_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAppGetVersionRequest)) *MockClientCommandsServer_AppGetVersion_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAppGetVersionRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AppGetVersion_Call) Return(_a0 *pb.RpcAppGetVersionResponse) *MockClientCommandsServer_AppGetVersion_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AppGetVersion_Call) RunAndReturn(run func(context.Context, *pb.RpcAppGetVersionRequest) *pb.RpcAppGetVersionResponse) *MockClientCommandsServer_AppGetVersion_Call { - _c.Call.Return(run) - return _c -} - -// AppSetDeviceState provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AppSetDeviceState(_a0 context.Context, _a1 *pb.RpcAppSetDeviceStateRequest) *pb.RpcAppSetDeviceStateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AppSetDeviceState") - } - - var r0 *pb.RpcAppSetDeviceStateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAppSetDeviceStateRequest) *pb.RpcAppSetDeviceStateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAppSetDeviceStateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AppSetDeviceState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AppSetDeviceState' -type MockClientCommandsServer_AppSetDeviceState_Call struct { - *mock.Call -} - -// AppSetDeviceState is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAppSetDeviceStateRequest -func (_e *MockClientCommandsServer_Expecter) AppSetDeviceState(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AppSetDeviceState_Call { - return &MockClientCommandsServer_AppSetDeviceState_Call{Call: _e.mock.On("AppSetDeviceState", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AppSetDeviceState_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAppSetDeviceStateRequest)) *MockClientCommandsServer_AppSetDeviceState_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAppSetDeviceStateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AppSetDeviceState_Call) Return(_a0 *pb.RpcAppSetDeviceStateResponse) *MockClientCommandsServer_AppSetDeviceState_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AppSetDeviceState_Call) RunAndReturn(run func(context.Context, *pb.RpcAppSetDeviceStateRequest) *pb.RpcAppSetDeviceStateResponse) *MockClientCommandsServer_AppSetDeviceState_Call { - _c.Call.Return(run) - return _c -} - -// AppShutdown provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) AppShutdown(_a0 context.Context, _a1 *pb.RpcAppShutdownRequest) *pb.RpcAppShutdownResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AppShutdown") - } - - var r0 *pb.RpcAppShutdownResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAppShutdownRequest) *pb.RpcAppShutdownResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcAppShutdownResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_AppShutdown_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AppShutdown' -type MockClientCommandsServer_AppShutdown_Call struct { - *mock.Call -} - -// AppShutdown is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcAppShutdownRequest -func (_e *MockClientCommandsServer_Expecter) AppShutdown(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AppShutdown_Call { - return &MockClientCommandsServer_AppShutdown_Call{Call: _e.mock.On("AppShutdown", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_AppShutdown_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAppShutdownRequest)) *MockClientCommandsServer_AppShutdown_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcAppShutdownRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_AppShutdown_Call) Return(_a0 *pb.RpcAppShutdownResponse) *MockClientCommandsServer_AppShutdown_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_AppShutdown_Call) RunAndReturn(run func(context.Context, *pb.RpcAppShutdownRequest) *pb.RpcAppShutdownResponse) *MockClientCommandsServer_AppShutdown_Call { - _c.Call.Return(run) - return _c -} - -// BlockBookmarkCreateAndFetch provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockBookmarkCreateAndFetch(_a0 context.Context, _a1 *pb.RpcBlockBookmarkCreateAndFetchRequest) *pb.RpcBlockBookmarkCreateAndFetchResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockBookmarkCreateAndFetch") - } - - var r0 *pb.RpcBlockBookmarkCreateAndFetchResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockBookmarkCreateAndFetchRequest) *pb.RpcBlockBookmarkCreateAndFetchResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockBookmarkCreateAndFetchResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockBookmarkCreateAndFetch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockBookmarkCreateAndFetch' -type MockClientCommandsServer_BlockBookmarkCreateAndFetch_Call struct { - *mock.Call -} - -// BlockBookmarkCreateAndFetch is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockBookmarkCreateAndFetchRequest -func (_e *MockClientCommandsServer_Expecter) BlockBookmarkCreateAndFetch(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockBookmarkCreateAndFetch_Call { - return &MockClientCommandsServer_BlockBookmarkCreateAndFetch_Call{Call: _e.mock.On("BlockBookmarkCreateAndFetch", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockBookmarkCreateAndFetch_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockBookmarkCreateAndFetchRequest)) *MockClientCommandsServer_BlockBookmarkCreateAndFetch_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockBookmarkCreateAndFetchRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockBookmarkCreateAndFetch_Call) Return(_a0 *pb.RpcBlockBookmarkCreateAndFetchResponse) *MockClientCommandsServer_BlockBookmarkCreateAndFetch_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockBookmarkCreateAndFetch_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockBookmarkCreateAndFetchRequest) *pb.RpcBlockBookmarkCreateAndFetchResponse) *MockClientCommandsServer_BlockBookmarkCreateAndFetch_Call { - _c.Call.Return(run) - return _c -} - -// BlockBookmarkFetch provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockBookmarkFetch(_a0 context.Context, _a1 *pb.RpcBlockBookmarkFetchRequest) *pb.RpcBlockBookmarkFetchResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockBookmarkFetch") - } - - var r0 *pb.RpcBlockBookmarkFetchResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockBookmarkFetchRequest) *pb.RpcBlockBookmarkFetchResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockBookmarkFetchResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockBookmarkFetch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockBookmarkFetch' -type MockClientCommandsServer_BlockBookmarkFetch_Call struct { - *mock.Call -} - -// BlockBookmarkFetch is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockBookmarkFetchRequest -func (_e *MockClientCommandsServer_Expecter) BlockBookmarkFetch(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockBookmarkFetch_Call { - return &MockClientCommandsServer_BlockBookmarkFetch_Call{Call: _e.mock.On("BlockBookmarkFetch", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockBookmarkFetch_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockBookmarkFetchRequest)) *MockClientCommandsServer_BlockBookmarkFetch_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockBookmarkFetchRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockBookmarkFetch_Call) Return(_a0 *pb.RpcBlockBookmarkFetchResponse) *MockClientCommandsServer_BlockBookmarkFetch_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockBookmarkFetch_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockBookmarkFetchRequest) *pb.RpcBlockBookmarkFetchResponse) *MockClientCommandsServer_BlockBookmarkFetch_Call { - _c.Call.Return(run) - return _c -} - -// BlockCopy provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockCopy(_a0 context.Context, _a1 *pb.RpcBlockCopyRequest) *pb.RpcBlockCopyResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockCopy") - } - - var r0 *pb.RpcBlockCopyResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockCopyRequest) *pb.RpcBlockCopyResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockCopyResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockCopy_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockCopy' -type MockClientCommandsServer_BlockCopy_Call struct { - *mock.Call -} - -// BlockCopy is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockCopyRequest -func (_e *MockClientCommandsServer_Expecter) BlockCopy(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockCopy_Call { - return &MockClientCommandsServer_BlockCopy_Call{Call: _e.mock.On("BlockCopy", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockCopy_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockCopyRequest)) *MockClientCommandsServer_BlockCopy_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockCopyRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockCopy_Call) Return(_a0 *pb.RpcBlockCopyResponse) *MockClientCommandsServer_BlockCopy_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockCopy_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockCopyRequest) *pb.RpcBlockCopyResponse) *MockClientCommandsServer_BlockCopy_Call { - _c.Call.Return(run) - return _c -} - -// BlockCreate provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockCreate(_a0 context.Context, _a1 *pb.RpcBlockCreateRequest) *pb.RpcBlockCreateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockCreate") - } - - var r0 *pb.RpcBlockCreateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockCreateRequest) *pb.RpcBlockCreateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockCreateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockCreate' -type MockClientCommandsServer_BlockCreate_Call struct { - *mock.Call -} - -// BlockCreate is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockCreateRequest -func (_e *MockClientCommandsServer_Expecter) BlockCreate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockCreate_Call { - return &MockClientCommandsServer_BlockCreate_Call{Call: _e.mock.On("BlockCreate", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockCreateRequest)) *MockClientCommandsServer_BlockCreate_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockCreateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockCreate_Call) Return(_a0 *pb.RpcBlockCreateResponse) *MockClientCommandsServer_BlockCreate_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockCreateRequest) *pb.RpcBlockCreateResponse) *MockClientCommandsServer_BlockCreate_Call { - _c.Call.Return(run) - return _c -} - -// BlockCreateWidget provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockCreateWidget(_a0 context.Context, _a1 *pb.RpcBlockCreateWidgetRequest) *pb.RpcBlockCreateWidgetResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockCreateWidget") - } - - var r0 *pb.RpcBlockCreateWidgetResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockCreateWidgetRequest) *pb.RpcBlockCreateWidgetResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockCreateWidgetResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockCreateWidget_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockCreateWidget' -type MockClientCommandsServer_BlockCreateWidget_Call struct { - *mock.Call -} - -// BlockCreateWidget is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockCreateWidgetRequest -func (_e *MockClientCommandsServer_Expecter) BlockCreateWidget(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockCreateWidget_Call { - return &MockClientCommandsServer_BlockCreateWidget_Call{Call: _e.mock.On("BlockCreateWidget", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockCreateWidget_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockCreateWidgetRequest)) *MockClientCommandsServer_BlockCreateWidget_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockCreateWidgetRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockCreateWidget_Call) Return(_a0 *pb.RpcBlockCreateWidgetResponse) *MockClientCommandsServer_BlockCreateWidget_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockCreateWidget_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockCreateWidgetRequest) *pb.RpcBlockCreateWidgetResponse) *MockClientCommandsServer_BlockCreateWidget_Call { - _c.Call.Return(run) - return _c -} - -// BlockCut provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockCut(_a0 context.Context, _a1 *pb.RpcBlockCutRequest) *pb.RpcBlockCutResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockCut") - } - - var r0 *pb.RpcBlockCutResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockCutRequest) *pb.RpcBlockCutResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockCutResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockCut_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockCut' -type MockClientCommandsServer_BlockCut_Call struct { - *mock.Call -} - -// BlockCut is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockCutRequest -func (_e *MockClientCommandsServer_Expecter) BlockCut(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockCut_Call { - return &MockClientCommandsServer_BlockCut_Call{Call: _e.mock.On("BlockCut", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockCut_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockCutRequest)) *MockClientCommandsServer_BlockCut_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockCutRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockCut_Call) Return(_a0 *pb.RpcBlockCutResponse) *MockClientCommandsServer_BlockCut_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockCut_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockCutRequest) *pb.RpcBlockCutResponse) *MockClientCommandsServer_BlockCut_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewCreateFromExistingObject provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewCreateFromExistingObject(_a0 context.Context, _a1 *pb.RpcBlockDataviewCreateFromExistingObjectRequest) *pb.RpcBlockDataviewCreateFromExistingObjectResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewCreateFromExistingObject") - } - - var r0 *pb.RpcBlockDataviewCreateFromExistingObjectResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewCreateFromExistingObjectRequest) *pb.RpcBlockDataviewCreateFromExistingObjectResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewCreateFromExistingObjectResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewCreateFromExistingObject_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewCreateFromExistingObject' -type MockClientCommandsServer_BlockDataviewCreateFromExistingObject_Call struct { - *mock.Call -} - -// BlockDataviewCreateFromExistingObject is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewCreateFromExistingObjectRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewCreateFromExistingObject(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewCreateFromExistingObject_Call { - return &MockClientCommandsServer_BlockDataviewCreateFromExistingObject_Call{Call: _e.mock.On("BlockDataviewCreateFromExistingObject", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewCreateFromExistingObject_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewCreateFromExistingObjectRequest)) *MockClientCommandsServer_BlockDataviewCreateFromExistingObject_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewCreateFromExistingObjectRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewCreateFromExistingObject_Call) Return(_a0 *pb.RpcBlockDataviewCreateFromExistingObjectResponse) *MockClientCommandsServer_BlockDataviewCreateFromExistingObject_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewCreateFromExistingObject_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewCreateFromExistingObjectRequest) *pb.RpcBlockDataviewCreateFromExistingObjectResponse) *MockClientCommandsServer_BlockDataviewCreateFromExistingObject_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewFilterAdd provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewFilterAdd(_a0 context.Context, _a1 *pb.RpcBlockDataviewFilterAddRequest) *pb.RpcBlockDataviewFilterAddResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewFilterAdd") - } - - var r0 *pb.RpcBlockDataviewFilterAddResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewFilterAddRequest) *pb.RpcBlockDataviewFilterAddResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewFilterAddResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewFilterAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewFilterAdd' -type MockClientCommandsServer_BlockDataviewFilterAdd_Call struct { - *mock.Call -} - -// BlockDataviewFilterAdd is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewFilterAddRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewFilterAdd(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewFilterAdd_Call { - return &MockClientCommandsServer_BlockDataviewFilterAdd_Call{Call: _e.mock.On("BlockDataviewFilterAdd", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewFilterAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewFilterAddRequest)) *MockClientCommandsServer_BlockDataviewFilterAdd_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewFilterAddRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewFilterAdd_Call) Return(_a0 *pb.RpcBlockDataviewFilterAddResponse) *MockClientCommandsServer_BlockDataviewFilterAdd_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewFilterAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewFilterAddRequest) *pb.RpcBlockDataviewFilterAddResponse) *MockClientCommandsServer_BlockDataviewFilterAdd_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewFilterRemove provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewFilterRemove(_a0 context.Context, _a1 *pb.RpcBlockDataviewFilterRemoveRequest) *pb.RpcBlockDataviewFilterRemoveResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewFilterRemove") - } - - var r0 *pb.RpcBlockDataviewFilterRemoveResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewFilterRemoveRequest) *pb.RpcBlockDataviewFilterRemoveResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewFilterRemoveResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewFilterRemove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewFilterRemove' -type MockClientCommandsServer_BlockDataviewFilterRemove_Call struct { - *mock.Call -} - -// BlockDataviewFilterRemove is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewFilterRemoveRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewFilterRemove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewFilterRemove_Call { - return &MockClientCommandsServer_BlockDataviewFilterRemove_Call{Call: _e.mock.On("BlockDataviewFilterRemove", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewFilterRemove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewFilterRemoveRequest)) *MockClientCommandsServer_BlockDataviewFilterRemove_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewFilterRemoveRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewFilterRemove_Call) Return(_a0 *pb.RpcBlockDataviewFilterRemoveResponse) *MockClientCommandsServer_BlockDataviewFilterRemove_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewFilterRemove_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewFilterRemoveRequest) *pb.RpcBlockDataviewFilterRemoveResponse) *MockClientCommandsServer_BlockDataviewFilterRemove_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewFilterReplace provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewFilterReplace(_a0 context.Context, _a1 *pb.RpcBlockDataviewFilterReplaceRequest) *pb.RpcBlockDataviewFilterReplaceResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewFilterReplace") - } - - var r0 *pb.RpcBlockDataviewFilterReplaceResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewFilterReplaceRequest) *pb.RpcBlockDataviewFilterReplaceResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewFilterReplaceResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewFilterReplace_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewFilterReplace' -type MockClientCommandsServer_BlockDataviewFilterReplace_Call struct { - *mock.Call -} - -// BlockDataviewFilterReplace is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewFilterReplaceRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewFilterReplace(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewFilterReplace_Call { - return &MockClientCommandsServer_BlockDataviewFilterReplace_Call{Call: _e.mock.On("BlockDataviewFilterReplace", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewFilterReplace_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewFilterReplaceRequest)) *MockClientCommandsServer_BlockDataviewFilterReplace_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewFilterReplaceRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewFilterReplace_Call) Return(_a0 *pb.RpcBlockDataviewFilterReplaceResponse) *MockClientCommandsServer_BlockDataviewFilterReplace_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewFilterReplace_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewFilterReplaceRequest) *pb.RpcBlockDataviewFilterReplaceResponse) *MockClientCommandsServer_BlockDataviewFilterReplace_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewFilterSort provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewFilterSort(_a0 context.Context, _a1 *pb.RpcBlockDataviewFilterSortRequest) *pb.RpcBlockDataviewFilterSortResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewFilterSort") - } - - var r0 *pb.RpcBlockDataviewFilterSortResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewFilterSortRequest) *pb.RpcBlockDataviewFilterSortResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewFilterSortResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewFilterSort_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewFilterSort' -type MockClientCommandsServer_BlockDataviewFilterSort_Call struct { - *mock.Call -} - -// BlockDataviewFilterSort is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewFilterSortRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewFilterSort(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewFilterSort_Call { - return &MockClientCommandsServer_BlockDataviewFilterSort_Call{Call: _e.mock.On("BlockDataviewFilterSort", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewFilterSort_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewFilterSortRequest)) *MockClientCommandsServer_BlockDataviewFilterSort_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewFilterSortRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewFilterSort_Call) Return(_a0 *pb.RpcBlockDataviewFilterSortResponse) *MockClientCommandsServer_BlockDataviewFilterSort_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewFilterSort_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewFilterSortRequest) *pb.RpcBlockDataviewFilterSortResponse) *MockClientCommandsServer_BlockDataviewFilterSort_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewGroupOrderUpdate provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewGroupOrderUpdate(_a0 context.Context, _a1 *pb.RpcBlockDataviewGroupOrderUpdateRequest) *pb.RpcBlockDataviewGroupOrderUpdateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewGroupOrderUpdate") - } - - var r0 *pb.RpcBlockDataviewGroupOrderUpdateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewGroupOrderUpdateRequest) *pb.RpcBlockDataviewGroupOrderUpdateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewGroupOrderUpdateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewGroupOrderUpdate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewGroupOrderUpdate' -type MockClientCommandsServer_BlockDataviewGroupOrderUpdate_Call struct { - *mock.Call -} - -// BlockDataviewGroupOrderUpdate is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewGroupOrderUpdateRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewGroupOrderUpdate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewGroupOrderUpdate_Call { - return &MockClientCommandsServer_BlockDataviewGroupOrderUpdate_Call{Call: _e.mock.On("BlockDataviewGroupOrderUpdate", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewGroupOrderUpdate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewGroupOrderUpdateRequest)) *MockClientCommandsServer_BlockDataviewGroupOrderUpdate_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewGroupOrderUpdateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewGroupOrderUpdate_Call) Return(_a0 *pb.RpcBlockDataviewGroupOrderUpdateResponse) *MockClientCommandsServer_BlockDataviewGroupOrderUpdate_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewGroupOrderUpdate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewGroupOrderUpdateRequest) *pb.RpcBlockDataviewGroupOrderUpdateResponse) *MockClientCommandsServer_BlockDataviewGroupOrderUpdate_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewObjectOrderMove provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewObjectOrderMove(_a0 context.Context, _a1 *pb.RpcBlockDataviewObjectOrderMoveRequest) *pb.RpcBlockDataviewObjectOrderMoveResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewObjectOrderMove") - } - - var r0 *pb.RpcBlockDataviewObjectOrderMoveResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewObjectOrderMoveRequest) *pb.RpcBlockDataviewObjectOrderMoveResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewObjectOrderMoveResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewObjectOrderMove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewObjectOrderMove' -type MockClientCommandsServer_BlockDataviewObjectOrderMove_Call struct { - *mock.Call -} - -// BlockDataviewObjectOrderMove is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewObjectOrderMoveRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewObjectOrderMove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewObjectOrderMove_Call { - return &MockClientCommandsServer_BlockDataviewObjectOrderMove_Call{Call: _e.mock.On("BlockDataviewObjectOrderMove", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewObjectOrderMove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewObjectOrderMoveRequest)) *MockClientCommandsServer_BlockDataviewObjectOrderMove_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewObjectOrderMoveRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewObjectOrderMove_Call) Return(_a0 *pb.RpcBlockDataviewObjectOrderMoveResponse) *MockClientCommandsServer_BlockDataviewObjectOrderMove_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewObjectOrderMove_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewObjectOrderMoveRequest) *pb.RpcBlockDataviewObjectOrderMoveResponse) *MockClientCommandsServer_BlockDataviewObjectOrderMove_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewObjectOrderUpdate provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewObjectOrderUpdate(_a0 context.Context, _a1 *pb.RpcBlockDataviewObjectOrderUpdateRequest) *pb.RpcBlockDataviewObjectOrderUpdateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewObjectOrderUpdate") - } - - var r0 *pb.RpcBlockDataviewObjectOrderUpdateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewObjectOrderUpdateRequest) *pb.RpcBlockDataviewObjectOrderUpdateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewObjectOrderUpdateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewObjectOrderUpdate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewObjectOrderUpdate' -type MockClientCommandsServer_BlockDataviewObjectOrderUpdate_Call struct { - *mock.Call -} - -// BlockDataviewObjectOrderUpdate is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewObjectOrderUpdateRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewObjectOrderUpdate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewObjectOrderUpdate_Call { - return &MockClientCommandsServer_BlockDataviewObjectOrderUpdate_Call{Call: _e.mock.On("BlockDataviewObjectOrderUpdate", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewObjectOrderUpdate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewObjectOrderUpdateRequest)) *MockClientCommandsServer_BlockDataviewObjectOrderUpdate_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewObjectOrderUpdateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewObjectOrderUpdate_Call) Return(_a0 *pb.RpcBlockDataviewObjectOrderUpdateResponse) *MockClientCommandsServer_BlockDataviewObjectOrderUpdate_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewObjectOrderUpdate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewObjectOrderUpdateRequest) *pb.RpcBlockDataviewObjectOrderUpdateResponse) *MockClientCommandsServer_BlockDataviewObjectOrderUpdate_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewRelationAdd provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewRelationAdd(_a0 context.Context, _a1 *pb.RpcBlockDataviewRelationAddRequest) *pb.RpcBlockDataviewRelationAddResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewRelationAdd") - } - - var r0 *pb.RpcBlockDataviewRelationAddResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewRelationAddRequest) *pb.RpcBlockDataviewRelationAddResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewRelationAddResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewRelationAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewRelationAdd' -type MockClientCommandsServer_BlockDataviewRelationAdd_Call struct { - *mock.Call -} - -// BlockDataviewRelationAdd is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewRelationAddRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewRelationAdd(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewRelationAdd_Call { - return &MockClientCommandsServer_BlockDataviewRelationAdd_Call{Call: _e.mock.On("BlockDataviewRelationAdd", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewRelationAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewRelationAddRequest)) *MockClientCommandsServer_BlockDataviewRelationAdd_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewRelationAddRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewRelationAdd_Call) Return(_a0 *pb.RpcBlockDataviewRelationAddResponse) *MockClientCommandsServer_BlockDataviewRelationAdd_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewRelationAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewRelationAddRequest) *pb.RpcBlockDataviewRelationAddResponse) *MockClientCommandsServer_BlockDataviewRelationAdd_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewRelationDelete provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewRelationDelete(_a0 context.Context, _a1 *pb.RpcBlockDataviewRelationDeleteRequest) *pb.RpcBlockDataviewRelationDeleteResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewRelationDelete") - } - - var r0 *pb.RpcBlockDataviewRelationDeleteResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewRelationDeleteRequest) *pb.RpcBlockDataviewRelationDeleteResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewRelationDeleteResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewRelationDelete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewRelationDelete' -type MockClientCommandsServer_BlockDataviewRelationDelete_Call struct { - *mock.Call -} - -// BlockDataviewRelationDelete is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewRelationDeleteRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewRelationDelete(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewRelationDelete_Call { - return &MockClientCommandsServer_BlockDataviewRelationDelete_Call{Call: _e.mock.On("BlockDataviewRelationDelete", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewRelationDelete_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewRelationDeleteRequest)) *MockClientCommandsServer_BlockDataviewRelationDelete_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewRelationDeleteRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewRelationDelete_Call) Return(_a0 *pb.RpcBlockDataviewRelationDeleteResponse) *MockClientCommandsServer_BlockDataviewRelationDelete_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewRelationDelete_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewRelationDeleteRequest) *pb.RpcBlockDataviewRelationDeleteResponse) *MockClientCommandsServer_BlockDataviewRelationDelete_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewRelationSet provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewRelationSet(_a0 context.Context, _a1 *pb.RpcBlockDataviewRelationSetRequest) *pb.RpcBlockDataviewRelationSetResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewRelationSet") - } - - var r0 *pb.RpcBlockDataviewRelationSetResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewRelationSetRequest) *pb.RpcBlockDataviewRelationSetResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewRelationSetResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewRelationSet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewRelationSet' -type MockClientCommandsServer_BlockDataviewRelationSet_Call struct { - *mock.Call -} - -// BlockDataviewRelationSet is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewRelationSetRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewRelationSet(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewRelationSet_Call { - return &MockClientCommandsServer_BlockDataviewRelationSet_Call{Call: _e.mock.On("BlockDataviewRelationSet", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewRelationSet_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewRelationSetRequest)) *MockClientCommandsServer_BlockDataviewRelationSet_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewRelationSetRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewRelationSet_Call) Return(_a0 *pb.RpcBlockDataviewRelationSetResponse) *MockClientCommandsServer_BlockDataviewRelationSet_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewRelationSet_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewRelationSetRequest) *pb.RpcBlockDataviewRelationSetResponse) *MockClientCommandsServer_BlockDataviewRelationSet_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewSetSource provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewSetSource(_a0 context.Context, _a1 *pb.RpcBlockDataviewSetSourceRequest) *pb.RpcBlockDataviewSetSourceResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewSetSource") - } - - var r0 *pb.RpcBlockDataviewSetSourceResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewSetSourceRequest) *pb.RpcBlockDataviewSetSourceResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewSetSourceResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewSetSource_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewSetSource' -type MockClientCommandsServer_BlockDataviewSetSource_Call struct { - *mock.Call -} - -// BlockDataviewSetSource is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewSetSourceRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewSetSource(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewSetSource_Call { - return &MockClientCommandsServer_BlockDataviewSetSource_Call{Call: _e.mock.On("BlockDataviewSetSource", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewSetSource_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewSetSourceRequest)) *MockClientCommandsServer_BlockDataviewSetSource_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewSetSourceRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewSetSource_Call) Return(_a0 *pb.RpcBlockDataviewSetSourceResponse) *MockClientCommandsServer_BlockDataviewSetSource_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewSetSource_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewSetSourceRequest) *pb.RpcBlockDataviewSetSourceResponse) *MockClientCommandsServer_BlockDataviewSetSource_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewSortAdd provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewSortAdd(_a0 context.Context, _a1 *pb.RpcBlockDataviewSortAddRequest) *pb.RpcBlockDataviewSortAddResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewSortAdd") - } - - var r0 *pb.RpcBlockDataviewSortAddResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewSortAddRequest) *pb.RpcBlockDataviewSortAddResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewSortAddResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewSortAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewSortAdd' -type MockClientCommandsServer_BlockDataviewSortAdd_Call struct { - *mock.Call -} - -// BlockDataviewSortAdd is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewSortAddRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewSortAdd(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewSortAdd_Call { - return &MockClientCommandsServer_BlockDataviewSortAdd_Call{Call: _e.mock.On("BlockDataviewSortAdd", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewSortAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewSortAddRequest)) *MockClientCommandsServer_BlockDataviewSortAdd_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewSortAddRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewSortAdd_Call) Return(_a0 *pb.RpcBlockDataviewSortAddResponse) *MockClientCommandsServer_BlockDataviewSortAdd_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewSortAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewSortAddRequest) *pb.RpcBlockDataviewSortAddResponse) *MockClientCommandsServer_BlockDataviewSortAdd_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewSortRemove provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewSortRemove(_a0 context.Context, _a1 *pb.RpcBlockDataviewSortRemoveRequest) *pb.RpcBlockDataviewSortRemoveResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewSortRemove") - } - - var r0 *pb.RpcBlockDataviewSortRemoveResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewSortRemoveRequest) *pb.RpcBlockDataviewSortRemoveResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewSortRemoveResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewSortRemove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewSortRemove' -type MockClientCommandsServer_BlockDataviewSortRemove_Call struct { - *mock.Call -} - -// BlockDataviewSortRemove is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewSortRemoveRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewSortRemove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewSortRemove_Call { - return &MockClientCommandsServer_BlockDataviewSortRemove_Call{Call: _e.mock.On("BlockDataviewSortRemove", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewSortRemove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewSortRemoveRequest)) *MockClientCommandsServer_BlockDataviewSortRemove_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewSortRemoveRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewSortRemove_Call) Return(_a0 *pb.RpcBlockDataviewSortRemoveResponse) *MockClientCommandsServer_BlockDataviewSortRemove_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewSortRemove_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewSortRemoveRequest) *pb.RpcBlockDataviewSortRemoveResponse) *MockClientCommandsServer_BlockDataviewSortRemove_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewSortReplace provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewSortReplace(_a0 context.Context, _a1 *pb.RpcBlockDataviewSortReplaceRequest) *pb.RpcBlockDataviewSortReplaceResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewSortReplace") - } - - var r0 *pb.RpcBlockDataviewSortReplaceResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewSortReplaceRequest) *pb.RpcBlockDataviewSortReplaceResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewSortReplaceResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewSortReplace_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewSortReplace' -type MockClientCommandsServer_BlockDataviewSortReplace_Call struct { - *mock.Call -} - -// BlockDataviewSortReplace is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewSortReplaceRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewSortReplace(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewSortReplace_Call { - return &MockClientCommandsServer_BlockDataviewSortReplace_Call{Call: _e.mock.On("BlockDataviewSortReplace", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewSortReplace_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewSortReplaceRequest)) *MockClientCommandsServer_BlockDataviewSortReplace_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewSortReplaceRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewSortReplace_Call) Return(_a0 *pb.RpcBlockDataviewSortReplaceResponse) *MockClientCommandsServer_BlockDataviewSortReplace_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewSortReplace_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewSortReplaceRequest) *pb.RpcBlockDataviewSortReplaceResponse) *MockClientCommandsServer_BlockDataviewSortReplace_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewSortSort provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewSortSort(_a0 context.Context, _a1 *pb.RpcBlockDataviewSortSSortRequest) *pb.RpcBlockDataviewSortSSortResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewSortSort") - } - - var r0 *pb.RpcBlockDataviewSortSSortResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewSortSSortRequest) *pb.RpcBlockDataviewSortSSortResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewSortSSortResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewSortSort_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewSortSort' -type MockClientCommandsServer_BlockDataviewSortSort_Call struct { - *mock.Call -} - -// BlockDataviewSortSort is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewSortSSortRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewSortSort(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewSortSort_Call { - return &MockClientCommandsServer_BlockDataviewSortSort_Call{Call: _e.mock.On("BlockDataviewSortSort", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewSortSort_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewSortSSortRequest)) *MockClientCommandsServer_BlockDataviewSortSort_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewSortSSortRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewSortSort_Call) Return(_a0 *pb.RpcBlockDataviewSortSSortResponse) *MockClientCommandsServer_BlockDataviewSortSort_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewSortSort_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewSortSSortRequest) *pb.RpcBlockDataviewSortSSortResponse) *MockClientCommandsServer_BlockDataviewSortSort_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewViewCreate provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewViewCreate(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewCreateRequest) *pb.RpcBlockDataviewViewCreateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewViewCreate") - } - - var r0 *pb.RpcBlockDataviewViewCreateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewViewCreateRequest) *pb.RpcBlockDataviewViewCreateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewViewCreateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewViewCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewViewCreate' -type MockClientCommandsServer_BlockDataviewViewCreate_Call struct { - *mock.Call -} - -// BlockDataviewViewCreate is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewViewCreateRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewViewCreate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewViewCreate_Call { - return &MockClientCommandsServer_BlockDataviewViewCreate_Call{Call: _e.mock.On("BlockDataviewViewCreate", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewViewCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewCreateRequest)) *MockClientCommandsServer_BlockDataviewViewCreate_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewViewCreateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewViewCreate_Call) Return(_a0 *pb.RpcBlockDataviewViewCreateResponse) *MockClientCommandsServer_BlockDataviewViewCreate_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewViewCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewViewCreateRequest) *pb.RpcBlockDataviewViewCreateResponse) *MockClientCommandsServer_BlockDataviewViewCreate_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewViewDelete provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewViewDelete(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewDeleteRequest) *pb.RpcBlockDataviewViewDeleteResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewViewDelete") - } - - var r0 *pb.RpcBlockDataviewViewDeleteResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewViewDeleteRequest) *pb.RpcBlockDataviewViewDeleteResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewViewDeleteResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewViewDelete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewViewDelete' -type MockClientCommandsServer_BlockDataviewViewDelete_Call struct { - *mock.Call -} - -// BlockDataviewViewDelete is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewViewDeleteRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewViewDelete(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewViewDelete_Call { - return &MockClientCommandsServer_BlockDataviewViewDelete_Call{Call: _e.mock.On("BlockDataviewViewDelete", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewViewDelete_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewDeleteRequest)) *MockClientCommandsServer_BlockDataviewViewDelete_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewViewDeleteRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewViewDelete_Call) Return(_a0 *pb.RpcBlockDataviewViewDeleteResponse) *MockClientCommandsServer_BlockDataviewViewDelete_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewViewDelete_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewViewDeleteRequest) *pb.RpcBlockDataviewViewDeleteResponse) *MockClientCommandsServer_BlockDataviewViewDelete_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewViewRelationAdd provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewViewRelationAdd(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewRelationAddRequest) *pb.RpcBlockDataviewViewRelationAddResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewViewRelationAdd") - } - - var r0 *pb.RpcBlockDataviewViewRelationAddResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewViewRelationAddRequest) *pb.RpcBlockDataviewViewRelationAddResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewViewRelationAddResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewViewRelationAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewViewRelationAdd' -type MockClientCommandsServer_BlockDataviewViewRelationAdd_Call struct { - *mock.Call -} - -// BlockDataviewViewRelationAdd is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewViewRelationAddRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewViewRelationAdd(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewViewRelationAdd_Call { - return &MockClientCommandsServer_BlockDataviewViewRelationAdd_Call{Call: _e.mock.On("BlockDataviewViewRelationAdd", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewViewRelationAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewRelationAddRequest)) *MockClientCommandsServer_BlockDataviewViewRelationAdd_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewViewRelationAddRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewViewRelationAdd_Call) Return(_a0 *pb.RpcBlockDataviewViewRelationAddResponse) *MockClientCommandsServer_BlockDataviewViewRelationAdd_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewViewRelationAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewViewRelationAddRequest) *pb.RpcBlockDataviewViewRelationAddResponse) *MockClientCommandsServer_BlockDataviewViewRelationAdd_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewViewRelationRemove provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewViewRelationRemove(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewRelationRemoveRequest) *pb.RpcBlockDataviewViewRelationRemoveResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewViewRelationRemove") - } - - var r0 *pb.RpcBlockDataviewViewRelationRemoveResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewViewRelationRemoveRequest) *pb.RpcBlockDataviewViewRelationRemoveResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewViewRelationRemoveResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewViewRelationRemove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewViewRelationRemove' -type MockClientCommandsServer_BlockDataviewViewRelationRemove_Call struct { - *mock.Call -} - -// BlockDataviewViewRelationRemove is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewViewRelationRemoveRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewViewRelationRemove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewViewRelationRemove_Call { - return &MockClientCommandsServer_BlockDataviewViewRelationRemove_Call{Call: _e.mock.On("BlockDataviewViewRelationRemove", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewViewRelationRemove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewRelationRemoveRequest)) *MockClientCommandsServer_BlockDataviewViewRelationRemove_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewViewRelationRemoveRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewViewRelationRemove_Call) Return(_a0 *pb.RpcBlockDataviewViewRelationRemoveResponse) *MockClientCommandsServer_BlockDataviewViewRelationRemove_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewViewRelationRemove_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewViewRelationRemoveRequest) *pb.RpcBlockDataviewViewRelationRemoveResponse) *MockClientCommandsServer_BlockDataviewViewRelationRemove_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewViewRelationReplace provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewViewRelationReplace(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewRelationReplaceRequest) *pb.RpcBlockDataviewViewRelationReplaceResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewViewRelationReplace") - } - - var r0 *pb.RpcBlockDataviewViewRelationReplaceResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewViewRelationReplaceRequest) *pb.RpcBlockDataviewViewRelationReplaceResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewViewRelationReplaceResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewViewRelationReplace_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewViewRelationReplace' -type MockClientCommandsServer_BlockDataviewViewRelationReplace_Call struct { - *mock.Call -} - -// BlockDataviewViewRelationReplace is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewViewRelationReplaceRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewViewRelationReplace(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewViewRelationReplace_Call { - return &MockClientCommandsServer_BlockDataviewViewRelationReplace_Call{Call: _e.mock.On("BlockDataviewViewRelationReplace", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewViewRelationReplace_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewRelationReplaceRequest)) *MockClientCommandsServer_BlockDataviewViewRelationReplace_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewViewRelationReplaceRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewViewRelationReplace_Call) Return(_a0 *pb.RpcBlockDataviewViewRelationReplaceResponse) *MockClientCommandsServer_BlockDataviewViewRelationReplace_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewViewRelationReplace_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewViewRelationReplaceRequest) *pb.RpcBlockDataviewViewRelationReplaceResponse) *MockClientCommandsServer_BlockDataviewViewRelationReplace_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewViewRelationSort provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewViewRelationSort(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewRelationSortRequest) *pb.RpcBlockDataviewViewRelationSortResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewViewRelationSort") - } - - var r0 *pb.RpcBlockDataviewViewRelationSortResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewViewRelationSortRequest) *pb.RpcBlockDataviewViewRelationSortResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewViewRelationSortResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewViewRelationSort_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewViewRelationSort' -type MockClientCommandsServer_BlockDataviewViewRelationSort_Call struct { - *mock.Call -} - -// BlockDataviewViewRelationSort is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewViewRelationSortRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewViewRelationSort(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewViewRelationSort_Call { - return &MockClientCommandsServer_BlockDataviewViewRelationSort_Call{Call: _e.mock.On("BlockDataviewViewRelationSort", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewViewRelationSort_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewRelationSortRequest)) *MockClientCommandsServer_BlockDataviewViewRelationSort_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewViewRelationSortRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewViewRelationSort_Call) Return(_a0 *pb.RpcBlockDataviewViewRelationSortResponse) *MockClientCommandsServer_BlockDataviewViewRelationSort_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewViewRelationSort_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewViewRelationSortRequest) *pb.RpcBlockDataviewViewRelationSortResponse) *MockClientCommandsServer_BlockDataviewViewRelationSort_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewViewSetActive provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewViewSetActive(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewSetActiveRequest) *pb.RpcBlockDataviewViewSetActiveResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewViewSetActive") - } - - var r0 *pb.RpcBlockDataviewViewSetActiveResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewViewSetActiveRequest) *pb.RpcBlockDataviewViewSetActiveResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewViewSetActiveResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewViewSetActive_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewViewSetActive' -type MockClientCommandsServer_BlockDataviewViewSetActive_Call struct { - *mock.Call -} - -// BlockDataviewViewSetActive is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewViewSetActiveRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewViewSetActive(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewViewSetActive_Call { - return &MockClientCommandsServer_BlockDataviewViewSetActive_Call{Call: _e.mock.On("BlockDataviewViewSetActive", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewViewSetActive_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewSetActiveRequest)) *MockClientCommandsServer_BlockDataviewViewSetActive_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewViewSetActiveRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewViewSetActive_Call) Return(_a0 *pb.RpcBlockDataviewViewSetActiveResponse) *MockClientCommandsServer_BlockDataviewViewSetActive_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewViewSetActive_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewViewSetActiveRequest) *pb.RpcBlockDataviewViewSetActiveResponse) *MockClientCommandsServer_BlockDataviewViewSetActive_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewViewSetPosition provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewViewSetPosition(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewSetPositionRequest) *pb.RpcBlockDataviewViewSetPositionResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewViewSetPosition") - } - - var r0 *pb.RpcBlockDataviewViewSetPositionResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewViewSetPositionRequest) *pb.RpcBlockDataviewViewSetPositionResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewViewSetPositionResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewViewSetPosition_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewViewSetPosition' -type MockClientCommandsServer_BlockDataviewViewSetPosition_Call struct { - *mock.Call -} - -// BlockDataviewViewSetPosition is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewViewSetPositionRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewViewSetPosition(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewViewSetPosition_Call { - return &MockClientCommandsServer_BlockDataviewViewSetPosition_Call{Call: _e.mock.On("BlockDataviewViewSetPosition", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewViewSetPosition_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewSetPositionRequest)) *MockClientCommandsServer_BlockDataviewViewSetPosition_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewViewSetPositionRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewViewSetPosition_Call) Return(_a0 *pb.RpcBlockDataviewViewSetPositionResponse) *MockClientCommandsServer_BlockDataviewViewSetPosition_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewViewSetPosition_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewViewSetPositionRequest) *pb.RpcBlockDataviewViewSetPositionResponse) *MockClientCommandsServer_BlockDataviewViewSetPosition_Call { - _c.Call.Return(run) - return _c -} - -// BlockDataviewViewUpdate provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDataviewViewUpdate(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewUpdateRequest) *pb.RpcBlockDataviewViewUpdateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDataviewViewUpdate") - } - - var r0 *pb.RpcBlockDataviewViewUpdateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewViewUpdateRequest) *pb.RpcBlockDataviewViewUpdateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDataviewViewUpdateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDataviewViewUpdate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewViewUpdate' -type MockClientCommandsServer_BlockDataviewViewUpdate_Call struct { - *mock.Call -} - -// BlockDataviewViewUpdate is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDataviewViewUpdateRequest -func (_e *MockClientCommandsServer_Expecter) BlockDataviewViewUpdate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewViewUpdate_Call { - return &MockClientCommandsServer_BlockDataviewViewUpdate_Call{Call: _e.mock.On("BlockDataviewViewUpdate", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDataviewViewUpdate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewUpdateRequest)) *MockClientCommandsServer_BlockDataviewViewUpdate_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewViewUpdateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewViewUpdate_Call) Return(_a0 *pb.RpcBlockDataviewViewUpdateResponse) *MockClientCommandsServer_BlockDataviewViewUpdate_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDataviewViewUpdate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewViewUpdateRequest) *pb.RpcBlockDataviewViewUpdateResponse) *MockClientCommandsServer_BlockDataviewViewUpdate_Call { - _c.Call.Return(run) - return _c -} - -// BlockDivListSetStyle provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockDivListSetStyle(_a0 context.Context, _a1 *pb.RpcBlockDivListSetStyleRequest) *pb.RpcBlockDivListSetStyleResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockDivListSetStyle") - } - - var r0 *pb.RpcBlockDivListSetStyleResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDivListSetStyleRequest) *pb.RpcBlockDivListSetStyleResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockDivListSetStyleResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockDivListSetStyle_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDivListSetStyle' -type MockClientCommandsServer_BlockDivListSetStyle_Call struct { - *mock.Call -} - -// BlockDivListSetStyle is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockDivListSetStyleRequest -func (_e *MockClientCommandsServer_Expecter) BlockDivListSetStyle(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDivListSetStyle_Call { - return &MockClientCommandsServer_BlockDivListSetStyle_Call{Call: _e.mock.On("BlockDivListSetStyle", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockDivListSetStyle_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDivListSetStyleRequest)) *MockClientCommandsServer_BlockDivListSetStyle_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockDivListSetStyleRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockDivListSetStyle_Call) Return(_a0 *pb.RpcBlockDivListSetStyleResponse) *MockClientCommandsServer_BlockDivListSetStyle_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockDivListSetStyle_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDivListSetStyleRequest) *pb.RpcBlockDivListSetStyleResponse) *MockClientCommandsServer_BlockDivListSetStyle_Call { - _c.Call.Return(run) - return _c -} - -// BlockExport provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockExport(_a0 context.Context, _a1 *pb.RpcBlockExportRequest) *pb.RpcBlockExportResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockExport") - } - - var r0 *pb.RpcBlockExportResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockExportRequest) *pb.RpcBlockExportResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockExportResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockExport_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockExport' -type MockClientCommandsServer_BlockExport_Call struct { - *mock.Call -} - -// BlockExport is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockExportRequest -func (_e *MockClientCommandsServer_Expecter) BlockExport(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockExport_Call { - return &MockClientCommandsServer_BlockExport_Call{Call: _e.mock.On("BlockExport", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockExport_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockExportRequest)) *MockClientCommandsServer_BlockExport_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockExportRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockExport_Call) Return(_a0 *pb.RpcBlockExportResponse) *MockClientCommandsServer_BlockExport_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockExport_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockExportRequest) *pb.RpcBlockExportResponse) *MockClientCommandsServer_BlockExport_Call { - _c.Call.Return(run) - return _c -} - -// BlockFileCreateAndUpload provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockFileCreateAndUpload(_a0 context.Context, _a1 *pb.RpcBlockFileCreateAndUploadRequest) *pb.RpcBlockFileCreateAndUploadResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockFileCreateAndUpload") - } - - var r0 *pb.RpcBlockFileCreateAndUploadResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockFileCreateAndUploadRequest) *pb.RpcBlockFileCreateAndUploadResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockFileCreateAndUploadResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockFileCreateAndUpload_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockFileCreateAndUpload' -type MockClientCommandsServer_BlockFileCreateAndUpload_Call struct { - *mock.Call -} - -// BlockFileCreateAndUpload is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockFileCreateAndUploadRequest -func (_e *MockClientCommandsServer_Expecter) BlockFileCreateAndUpload(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockFileCreateAndUpload_Call { - return &MockClientCommandsServer_BlockFileCreateAndUpload_Call{Call: _e.mock.On("BlockFileCreateAndUpload", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockFileCreateAndUpload_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockFileCreateAndUploadRequest)) *MockClientCommandsServer_BlockFileCreateAndUpload_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockFileCreateAndUploadRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockFileCreateAndUpload_Call) Return(_a0 *pb.RpcBlockFileCreateAndUploadResponse) *MockClientCommandsServer_BlockFileCreateAndUpload_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockFileCreateAndUpload_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockFileCreateAndUploadRequest) *pb.RpcBlockFileCreateAndUploadResponse) *MockClientCommandsServer_BlockFileCreateAndUpload_Call { - _c.Call.Return(run) - return _c -} - -// BlockFileListSetStyle provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockFileListSetStyle(_a0 context.Context, _a1 *pb.RpcBlockFileListSetStyleRequest) *pb.RpcBlockFileListSetStyleResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockFileListSetStyle") - } - - var r0 *pb.RpcBlockFileListSetStyleResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockFileListSetStyleRequest) *pb.RpcBlockFileListSetStyleResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockFileListSetStyleResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockFileListSetStyle_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockFileListSetStyle' -type MockClientCommandsServer_BlockFileListSetStyle_Call struct { - *mock.Call -} - -// BlockFileListSetStyle is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockFileListSetStyleRequest -func (_e *MockClientCommandsServer_Expecter) BlockFileListSetStyle(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockFileListSetStyle_Call { - return &MockClientCommandsServer_BlockFileListSetStyle_Call{Call: _e.mock.On("BlockFileListSetStyle", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockFileListSetStyle_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockFileListSetStyleRequest)) *MockClientCommandsServer_BlockFileListSetStyle_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockFileListSetStyleRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockFileListSetStyle_Call) Return(_a0 *pb.RpcBlockFileListSetStyleResponse) *MockClientCommandsServer_BlockFileListSetStyle_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockFileListSetStyle_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockFileListSetStyleRequest) *pb.RpcBlockFileListSetStyleResponse) *MockClientCommandsServer_BlockFileListSetStyle_Call { - _c.Call.Return(run) - return _c -} - -// BlockFileSetName provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockFileSetName(_a0 context.Context, _a1 *pb.RpcBlockFileSetNameRequest) *pb.RpcBlockFileSetNameResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockFileSetName") - } - - var r0 *pb.RpcBlockFileSetNameResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockFileSetNameRequest) *pb.RpcBlockFileSetNameResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockFileSetNameResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockFileSetName_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockFileSetName' -type MockClientCommandsServer_BlockFileSetName_Call struct { - *mock.Call -} - -// BlockFileSetName is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockFileSetNameRequest -func (_e *MockClientCommandsServer_Expecter) BlockFileSetName(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockFileSetName_Call { - return &MockClientCommandsServer_BlockFileSetName_Call{Call: _e.mock.On("BlockFileSetName", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockFileSetName_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockFileSetNameRequest)) *MockClientCommandsServer_BlockFileSetName_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockFileSetNameRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockFileSetName_Call) Return(_a0 *pb.RpcBlockFileSetNameResponse) *MockClientCommandsServer_BlockFileSetName_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockFileSetName_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockFileSetNameRequest) *pb.RpcBlockFileSetNameResponse) *MockClientCommandsServer_BlockFileSetName_Call { - _c.Call.Return(run) - return _c -} - -// BlockFileSetTargetObjectId provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockFileSetTargetObjectId(_a0 context.Context, _a1 *pb.RpcBlockFileSetTargetObjectIdRequest) *pb.RpcBlockFileSetTargetObjectIdResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockFileSetTargetObjectId") - } - - var r0 *pb.RpcBlockFileSetTargetObjectIdResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockFileSetTargetObjectIdRequest) *pb.RpcBlockFileSetTargetObjectIdResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockFileSetTargetObjectIdResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockFileSetTargetObjectId_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockFileSetTargetObjectId' -type MockClientCommandsServer_BlockFileSetTargetObjectId_Call struct { - *mock.Call -} - -// BlockFileSetTargetObjectId is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockFileSetTargetObjectIdRequest -func (_e *MockClientCommandsServer_Expecter) BlockFileSetTargetObjectId(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockFileSetTargetObjectId_Call { - return &MockClientCommandsServer_BlockFileSetTargetObjectId_Call{Call: _e.mock.On("BlockFileSetTargetObjectId", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockFileSetTargetObjectId_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockFileSetTargetObjectIdRequest)) *MockClientCommandsServer_BlockFileSetTargetObjectId_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockFileSetTargetObjectIdRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockFileSetTargetObjectId_Call) Return(_a0 *pb.RpcBlockFileSetTargetObjectIdResponse) *MockClientCommandsServer_BlockFileSetTargetObjectId_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockFileSetTargetObjectId_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockFileSetTargetObjectIdRequest) *pb.RpcBlockFileSetTargetObjectIdResponse) *MockClientCommandsServer_BlockFileSetTargetObjectId_Call { - _c.Call.Return(run) - return _c -} - -// BlockImageSetName provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockImageSetName(_a0 context.Context, _a1 *pb.RpcBlockImageSetNameRequest) *pb.RpcBlockImageSetNameResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockImageSetName") - } - - var r0 *pb.RpcBlockImageSetNameResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockImageSetNameRequest) *pb.RpcBlockImageSetNameResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockImageSetNameResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockImageSetName_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockImageSetName' -type MockClientCommandsServer_BlockImageSetName_Call struct { - *mock.Call -} - -// BlockImageSetName is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockImageSetNameRequest -func (_e *MockClientCommandsServer_Expecter) BlockImageSetName(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockImageSetName_Call { - return &MockClientCommandsServer_BlockImageSetName_Call{Call: _e.mock.On("BlockImageSetName", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockImageSetName_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockImageSetNameRequest)) *MockClientCommandsServer_BlockImageSetName_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockImageSetNameRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockImageSetName_Call) Return(_a0 *pb.RpcBlockImageSetNameResponse) *MockClientCommandsServer_BlockImageSetName_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockImageSetName_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockImageSetNameRequest) *pb.RpcBlockImageSetNameResponse) *MockClientCommandsServer_BlockImageSetName_Call { - _c.Call.Return(run) - return _c -} - -// BlockLatexSetText provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockLatexSetText(_a0 context.Context, _a1 *pb.RpcBlockLatexSetTextRequest) *pb.RpcBlockLatexSetTextResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockLatexSetText") - } - - var r0 *pb.RpcBlockLatexSetTextResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockLatexSetTextRequest) *pb.RpcBlockLatexSetTextResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockLatexSetTextResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockLatexSetText_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockLatexSetText' -type MockClientCommandsServer_BlockLatexSetText_Call struct { - *mock.Call -} - -// BlockLatexSetText is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockLatexSetTextRequest -func (_e *MockClientCommandsServer_Expecter) BlockLatexSetText(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockLatexSetText_Call { - return &MockClientCommandsServer_BlockLatexSetText_Call{Call: _e.mock.On("BlockLatexSetText", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockLatexSetText_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockLatexSetTextRequest)) *MockClientCommandsServer_BlockLatexSetText_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockLatexSetTextRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockLatexSetText_Call) Return(_a0 *pb.RpcBlockLatexSetTextResponse) *MockClientCommandsServer_BlockLatexSetText_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockLatexSetText_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockLatexSetTextRequest) *pb.RpcBlockLatexSetTextResponse) *MockClientCommandsServer_BlockLatexSetText_Call { - _c.Call.Return(run) - return _c -} - -// BlockLinkCreateWithObject provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockLinkCreateWithObject(_a0 context.Context, _a1 *pb.RpcBlockLinkCreateWithObjectRequest) *pb.RpcBlockLinkCreateWithObjectResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockLinkCreateWithObject") - } - - var r0 *pb.RpcBlockLinkCreateWithObjectResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockLinkCreateWithObjectRequest) *pb.RpcBlockLinkCreateWithObjectResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockLinkCreateWithObjectResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockLinkCreateWithObject_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockLinkCreateWithObject' -type MockClientCommandsServer_BlockLinkCreateWithObject_Call struct { - *mock.Call -} - -// BlockLinkCreateWithObject is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockLinkCreateWithObjectRequest -func (_e *MockClientCommandsServer_Expecter) BlockLinkCreateWithObject(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockLinkCreateWithObject_Call { - return &MockClientCommandsServer_BlockLinkCreateWithObject_Call{Call: _e.mock.On("BlockLinkCreateWithObject", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockLinkCreateWithObject_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockLinkCreateWithObjectRequest)) *MockClientCommandsServer_BlockLinkCreateWithObject_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockLinkCreateWithObjectRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockLinkCreateWithObject_Call) Return(_a0 *pb.RpcBlockLinkCreateWithObjectResponse) *MockClientCommandsServer_BlockLinkCreateWithObject_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockLinkCreateWithObject_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockLinkCreateWithObjectRequest) *pb.RpcBlockLinkCreateWithObjectResponse) *MockClientCommandsServer_BlockLinkCreateWithObject_Call { - _c.Call.Return(run) - return _c -} - -// BlockLinkListSetAppearance provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockLinkListSetAppearance(_a0 context.Context, _a1 *pb.RpcBlockLinkListSetAppearanceRequest) *pb.RpcBlockLinkListSetAppearanceResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockLinkListSetAppearance") - } - - var r0 *pb.RpcBlockLinkListSetAppearanceResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockLinkListSetAppearanceRequest) *pb.RpcBlockLinkListSetAppearanceResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockLinkListSetAppearanceResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockLinkListSetAppearance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockLinkListSetAppearance' -type MockClientCommandsServer_BlockLinkListSetAppearance_Call struct { - *mock.Call -} - -// BlockLinkListSetAppearance is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockLinkListSetAppearanceRequest -func (_e *MockClientCommandsServer_Expecter) BlockLinkListSetAppearance(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockLinkListSetAppearance_Call { - return &MockClientCommandsServer_BlockLinkListSetAppearance_Call{Call: _e.mock.On("BlockLinkListSetAppearance", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockLinkListSetAppearance_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockLinkListSetAppearanceRequest)) *MockClientCommandsServer_BlockLinkListSetAppearance_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockLinkListSetAppearanceRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockLinkListSetAppearance_Call) Return(_a0 *pb.RpcBlockLinkListSetAppearanceResponse) *MockClientCommandsServer_BlockLinkListSetAppearance_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockLinkListSetAppearance_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockLinkListSetAppearanceRequest) *pb.RpcBlockLinkListSetAppearanceResponse) *MockClientCommandsServer_BlockLinkListSetAppearance_Call { - _c.Call.Return(run) - return _c -} - -// BlockListConvertToObjects provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockListConvertToObjects(_a0 context.Context, _a1 *pb.RpcBlockListConvertToObjectsRequest) *pb.RpcBlockListConvertToObjectsResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockListConvertToObjects") - } - - var r0 *pb.RpcBlockListConvertToObjectsResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockListConvertToObjectsRequest) *pb.RpcBlockListConvertToObjectsResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockListConvertToObjectsResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockListConvertToObjects_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockListConvertToObjects' -type MockClientCommandsServer_BlockListConvertToObjects_Call struct { - *mock.Call -} - -// BlockListConvertToObjects is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockListConvertToObjectsRequest -func (_e *MockClientCommandsServer_Expecter) BlockListConvertToObjects(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockListConvertToObjects_Call { - return &MockClientCommandsServer_BlockListConvertToObjects_Call{Call: _e.mock.On("BlockListConvertToObjects", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockListConvertToObjects_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockListConvertToObjectsRequest)) *MockClientCommandsServer_BlockListConvertToObjects_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockListConvertToObjectsRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockListConvertToObjects_Call) Return(_a0 *pb.RpcBlockListConvertToObjectsResponse) *MockClientCommandsServer_BlockListConvertToObjects_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockListConvertToObjects_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockListConvertToObjectsRequest) *pb.RpcBlockListConvertToObjectsResponse) *MockClientCommandsServer_BlockListConvertToObjects_Call { - _c.Call.Return(run) - return _c -} - -// BlockListDelete provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockListDelete(_a0 context.Context, _a1 *pb.RpcBlockListDeleteRequest) *pb.RpcBlockListDeleteResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockListDelete") - } - - var r0 *pb.RpcBlockListDeleteResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockListDeleteRequest) *pb.RpcBlockListDeleteResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockListDeleteResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockListDelete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockListDelete' -type MockClientCommandsServer_BlockListDelete_Call struct { - *mock.Call -} - -// BlockListDelete is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockListDeleteRequest -func (_e *MockClientCommandsServer_Expecter) BlockListDelete(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockListDelete_Call { - return &MockClientCommandsServer_BlockListDelete_Call{Call: _e.mock.On("BlockListDelete", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockListDelete_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockListDeleteRequest)) *MockClientCommandsServer_BlockListDelete_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockListDeleteRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockListDelete_Call) Return(_a0 *pb.RpcBlockListDeleteResponse) *MockClientCommandsServer_BlockListDelete_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockListDelete_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockListDeleteRequest) *pb.RpcBlockListDeleteResponse) *MockClientCommandsServer_BlockListDelete_Call { - _c.Call.Return(run) - return _c -} - -// BlockListDuplicate provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockListDuplicate(_a0 context.Context, _a1 *pb.RpcBlockListDuplicateRequest) *pb.RpcBlockListDuplicateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockListDuplicate") - } - - var r0 *pb.RpcBlockListDuplicateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockListDuplicateRequest) *pb.RpcBlockListDuplicateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockListDuplicateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockListDuplicate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockListDuplicate' -type MockClientCommandsServer_BlockListDuplicate_Call struct { - *mock.Call -} - -// BlockListDuplicate is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockListDuplicateRequest -func (_e *MockClientCommandsServer_Expecter) BlockListDuplicate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockListDuplicate_Call { - return &MockClientCommandsServer_BlockListDuplicate_Call{Call: _e.mock.On("BlockListDuplicate", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockListDuplicate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockListDuplicateRequest)) *MockClientCommandsServer_BlockListDuplicate_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockListDuplicateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockListDuplicate_Call) Return(_a0 *pb.RpcBlockListDuplicateResponse) *MockClientCommandsServer_BlockListDuplicate_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockListDuplicate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockListDuplicateRequest) *pb.RpcBlockListDuplicateResponse) *MockClientCommandsServer_BlockListDuplicate_Call { - _c.Call.Return(run) - return _c -} - -// BlockListMoveToExistingObject provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockListMoveToExistingObject(_a0 context.Context, _a1 *pb.RpcBlockListMoveToExistingObjectRequest) *pb.RpcBlockListMoveToExistingObjectResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockListMoveToExistingObject") - } - - var r0 *pb.RpcBlockListMoveToExistingObjectResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockListMoveToExistingObjectRequest) *pb.RpcBlockListMoveToExistingObjectResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockListMoveToExistingObjectResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockListMoveToExistingObject_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockListMoveToExistingObject' -type MockClientCommandsServer_BlockListMoveToExistingObject_Call struct { - *mock.Call -} - -// BlockListMoveToExistingObject is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockListMoveToExistingObjectRequest -func (_e *MockClientCommandsServer_Expecter) BlockListMoveToExistingObject(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockListMoveToExistingObject_Call { - return &MockClientCommandsServer_BlockListMoveToExistingObject_Call{Call: _e.mock.On("BlockListMoveToExistingObject", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockListMoveToExistingObject_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockListMoveToExistingObjectRequest)) *MockClientCommandsServer_BlockListMoveToExistingObject_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockListMoveToExistingObjectRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockListMoveToExistingObject_Call) Return(_a0 *pb.RpcBlockListMoveToExistingObjectResponse) *MockClientCommandsServer_BlockListMoveToExistingObject_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockListMoveToExistingObject_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockListMoveToExistingObjectRequest) *pb.RpcBlockListMoveToExistingObjectResponse) *MockClientCommandsServer_BlockListMoveToExistingObject_Call { - _c.Call.Return(run) - return _c -} - -// BlockListMoveToNewObject provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockListMoveToNewObject(_a0 context.Context, _a1 *pb.RpcBlockListMoveToNewObjectRequest) *pb.RpcBlockListMoveToNewObjectResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockListMoveToNewObject") - } - - var r0 *pb.RpcBlockListMoveToNewObjectResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockListMoveToNewObjectRequest) *pb.RpcBlockListMoveToNewObjectResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockListMoveToNewObjectResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockListMoveToNewObject_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockListMoveToNewObject' -type MockClientCommandsServer_BlockListMoveToNewObject_Call struct { - *mock.Call -} - -// BlockListMoveToNewObject is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockListMoveToNewObjectRequest -func (_e *MockClientCommandsServer_Expecter) BlockListMoveToNewObject(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockListMoveToNewObject_Call { - return &MockClientCommandsServer_BlockListMoveToNewObject_Call{Call: _e.mock.On("BlockListMoveToNewObject", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockListMoveToNewObject_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockListMoveToNewObjectRequest)) *MockClientCommandsServer_BlockListMoveToNewObject_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockListMoveToNewObjectRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockListMoveToNewObject_Call) Return(_a0 *pb.RpcBlockListMoveToNewObjectResponse) *MockClientCommandsServer_BlockListMoveToNewObject_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockListMoveToNewObject_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockListMoveToNewObjectRequest) *pb.RpcBlockListMoveToNewObjectResponse) *MockClientCommandsServer_BlockListMoveToNewObject_Call { - _c.Call.Return(run) - return _c -} - -// BlockListSetAlign provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockListSetAlign(_a0 context.Context, _a1 *pb.RpcBlockListSetAlignRequest) *pb.RpcBlockListSetAlignResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockListSetAlign") - } - - var r0 *pb.RpcBlockListSetAlignResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockListSetAlignRequest) *pb.RpcBlockListSetAlignResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockListSetAlignResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockListSetAlign_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockListSetAlign' -type MockClientCommandsServer_BlockListSetAlign_Call struct { - *mock.Call -} - -// BlockListSetAlign is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockListSetAlignRequest -func (_e *MockClientCommandsServer_Expecter) BlockListSetAlign(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockListSetAlign_Call { - return &MockClientCommandsServer_BlockListSetAlign_Call{Call: _e.mock.On("BlockListSetAlign", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockListSetAlign_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockListSetAlignRequest)) *MockClientCommandsServer_BlockListSetAlign_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockListSetAlignRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockListSetAlign_Call) Return(_a0 *pb.RpcBlockListSetAlignResponse) *MockClientCommandsServer_BlockListSetAlign_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockListSetAlign_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockListSetAlignRequest) *pb.RpcBlockListSetAlignResponse) *MockClientCommandsServer_BlockListSetAlign_Call { - _c.Call.Return(run) - return _c -} - -// BlockListSetBackgroundColor provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockListSetBackgroundColor(_a0 context.Context, _a1 *pb.RpcBlockListSetBackgroundColorRequest) *pb.RpcBlockListSetBackgroundColorResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockListSetBackgroundColor") - } - - var r0 *pb.RpcBlockListSetBackgroundColorResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockListSetBackgroundColorRequest) *pb.RpcBlockListSetBackgroundColorResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockListSetBackgroundColorResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockListSetBackgroundColor_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockListSetBackgroundColor' -type MockClientCommandsServer_BlockListSetBackgroundColor_Call struct { - *mock.Call -} - -// BlockListSetBackgroundColor is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockListSetBackgroundColorRequest -func (_e *MockClientCommandsServer_Expecter) BlockListSetBackgroundColor(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockListSetBackgroundColor_Call { - return &MockClientCommandsServer_BlockListSetBackgroundColor_Call{Call: _e.mock.On("BlockListSetBackgroundColor", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockListSetBackgroundColor_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockListSetBackgroundColorRequest)) *MockClientCommandsServer_BlockListSetBackgroundColor_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockListSetBackgroundColorRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockListSetBackgroundColor_Call) Return(_a0 *pb.RpcBlockListSetBackgroundColorResponse) *MockClientCommandsServer_BlockListSetBackgroundColor_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockListSetBackgroundColor_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockListSetBackgroundColorRequest) *pb.RpcBlockListSetBackgroundColorResponse) *MockClientCommandsServer_BlockListSetBackgroundColor_Call { - _c.Call.Return(run) - return _c -} - -// BlockListSetFields provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockListSetFields(_a0 context.Context, _a1 *pb.RpcBlockListSetFieldsRequest) *pb.RpcBlockListSetFieldsResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockListSetFields") - } - - var r0 *pb.RpcBlockListSetFieldsResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockListSetFieldsRequest) *pb.RpcBlockListSetFieldsResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockListSetFieldsResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockListSetFields_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockListSetFields' -type MockClientCommandsServer_BlockListSetFields_Call struct { - *mock.Call -} - -// BlockListSetFields is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockListSetFieldsRequest -func (_e *MockClientCommandsServer_Expecter) BlockListSetFields(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockListSetFields_Call { - return &MockClientCommandsServer_BlockListSetFields_Call{Call: _e.mock.On("BlockListSetFields", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockListSetFields_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockListSetFieldsRequest)) *MockClientCommandsServer_BlockListSetFields_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockListSetFieldsRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockListSetFields_Call) Return(_a0 *pb.RpcBlockListSetFieldsResponse) *MockClientCommandsServer_BlockListSetFields_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockListSetFields_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockListSetFieldsRequest) *pb.RpcBlockListSetFieldsResponse) *MockClientCommandsServer_BlockListSetFields_Call { - _c.Call.Return(run) - return _c -} - -// BlockListSetVerticalAlign provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockListSetVerticalAlign(_a0 context.Context, _a1 *pb.RpcBlockListSetVerticalAlignRequest) *pb.RpcBlockListSetVerticalAlignResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockListSetVerticalAlign") - } - - var r0 *pb.RpcBlockListSetVerticalAlignResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockListSetVerticalAlignRequest) *pb.RpcBlockListSetVerticalAlignResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockListSetVerticalAlignResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockListSetVerticalAlign_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockListSetVerticalAlign' -type MockClientCommandsServer_BlockListSetVerticalAlign_Call struct { - *mock.Call -} - -// BlockListSetVerticalAlign is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockListSetVerticalAlignRequest -func (_e *MockClientCommandsServer_Expecter) BlockListSetVerticalAlign(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockListSetVerticalAlign_Call { - return &MockClientCommandsServer_BlockListSetVerticalAlign_Call{Call: _e.mock.On("BlockListSetVerticalAlign", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockListSetVerticalAlign_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockListSetVerticalAlignRequest)) *MockClientCommandsServer_BlockListSetVerticalAlign_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockListSetVerticalAlignRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockListSetVerticalAlign_Call) Return(_a0 *pb.RpcBlockListSetVerticalAlignResponse) *MockClientCommandsServer_BlockListSetVerticalAlign_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockListSetVerticalAlign_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockListSetVerticalAlignRequest) *pb.RpcBlockListSetVerticalAlignResponse) *MockClientCommandsServer_BlockListSetVerticalAlign_Call { - _c.Call.Return(run) - return _c -} - -// BlockListTurnInto provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockListTurnInto(_a0 context.Context, _a1 *pb.RpcBlockListTurnIntoRequest) *pb.RpcBlockListTurnIntoResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockListTurnInto") - } - - var r0 *pb.RpcBlockListTurnIntoResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockListTurnIntoRequest) *pb.RpcBlockListTurnIntoResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockListTurnIntoResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockListTurnInto_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockListTurnInto' -type MockClientCommandsServer_BlockListTurnInto_Call struct { - *mock.Call -} - -// BlockListTurnInto is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockListTurnIntoRequest -func (_e *MockClientCommandsServer_Expecter) BlockListTurnInto(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockListTurnInto_Call { - return &MockClientCommandsServer_BlockListTurnInto_Call{Call: _e.mock.On("BlockListTurnInto", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockListTurnInto_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockListTurnIntoRequest)) *MockClientCommandsServer_BlockListTurnInto_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockListTurnIntoRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockListTurnInto_Call) Return(_a0 *pb.RpcBlockListTurnIntoResponse) *MockClientCommandsServer_BlockListTurnInto_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockListTurnInto_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockListTurnIntoRequest) *pb.RpcBlockListTurnIntoResponse) *MockClientCommandsServer_BlockListTurnInto_Call { - _c.Call.Return(run) - return _c -} - -// BlockMerge provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockMerge(_a0 context.Context, _a1 *pb.RpcBlockMergeRequest) *pb.RpcBlockMergeResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockMerge") - } - - var r0 *pb.RpcBlockMergeResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockMergeRequest) *pb.RpcBlockMergeResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockMergeResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockMerge_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockMerge' -type MockClientCommandsServer_BlockMerge_Call struct { - *mock.Call -} - -// BlockMerge is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockMergeRequest -func (_e *MockClientCommandsServer_Expecter) BlockMerge(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockMerge_Call { - return &MockClientCommandsServer_BlockMerge_Call{Call: _e.mock.On("BlockMerge", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockMerge_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockMergeRequest)) *MockClientCommandsServer_BlockMerge_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockMergeRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockMerge_Call) Return(_a0 *pb.RpcBlockMergeResponse) *MockClientCommandsServer_BlockMerge_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockMerge_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockMergeRequest) *pb.RpcBlockMergeResponse) *MockClientCommandsServer_BlockMerge_Call { - _c.Call.Return(run) - return _c -} - -// BlockPaste provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockPaste(_a0 context.Context, _a1 *pb.RpcBlockPasteRequest) *pb.RpcBlockPasteResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockPaste") - } - - var r0 *pb.RpcBlockPasteResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockPasteRequest) *pb.RpcBlockPasteResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockPasteResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockPaste_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockPaste' -type MockClientCommandsServer_BlockPaste_Call struct { - *mock.Call -} - -// BlockPaste is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockPasteRequest -func (_e *MockClientCommandsServer_Expecter) BlockPaste(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockPaste_Call { - return &MockClientCommandsServer_BlockPaste_Call{Call: _e.mock.On("BlockPaste", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockPaste_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockPasteRequest)) *MockClientCommandsServer_BlockPaste_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockPasteRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockPaste_Call) Return(_a0 *pb.RpcBlockPasteResponse) *MockClientCommandsServer_BlockPaste_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockPaste_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockPasteRequest) *pb.RpcBlockPasteResponse) *MockClientCommandsServer_BlockPaste_Call { - _c.Call.Return(run) - return _c -} - -// BlockPreview provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockPreview(_a0 context.Context, _a1 *pb.RpcBlockPreviewRequest) *pb.RpcBlockPreviewResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockPreview") - } - - var r0 *pb.RpcBlockPreviewResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockPreviewRequest) *pb.RpcBlockPreviewResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockPreviewResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockPreview_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockPreview' -type MockClientCommandsServer_BlockPreview_Call struct { - *mock.Call -} - -// BlockPreview is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockPreviewRequest -func (_e *MockClientCommandsServer_Expecter) BlockPreview(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockPreview_Call { - return &MockClientCommandsServer_BlockPreview_Call{Call: _e.mock.On("BlockPreview", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockPreview_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockPreviewRequest)) *MockClientCommandsServer_BlockPreview_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockPreviewRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockPreview_Call) Return(_a0 *pb.RpcBlockPreviewResponse) *MockClientCommandsServer_BlockPreview_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockPreview_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockPreviewRequest) *pb.RpcBlockPreviewResponse) *MockClientCommandsServer_BlockPreview_Call { - _c.Call.Return(run) - return _c -} - -// BlockRelationAdd provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockRelationAdd(_a0 context.Context, _a1 *pb.RpcBlockRelationAddRequest) *pb.RpcBlockRelationAddResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockRelationAdd") - } - - var r0 *pb.RpcBlockRelationAddResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockRelationAddRequest) *pb.RpcBlockRelationAddResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockRelationAddResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockRelationAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockRelationAdd' -type MockClientCommandsServer_BlockRelationAdd_Call struct { - *mock.Call -} - -// BlockRelationAdd is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockRelationAddRequest -func (_e *MockClientCommandsServer_Expecter) BlockRelationAdd(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockRelationAdd_Call { - return &MockClientCommandsServer_BlockRelationAdd_Call{Call: _e.mock.On("BlockRelationAdd", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockRelationAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockRelationAddRequest)) *MockClientCommandsServer_BlockRelationAdd_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockRelationAddRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockRelationAdd_Call) Return(_a0 *pb.RpcBlockRelationAddResponse) *MockClientCommandsServer_BlockRelationAdd_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockRelationAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockRelationAddRequest) *pb.RpcBlockRelationAddResponse) *MockClientCommandsServer_BlockRelationAdd_Call { - _c.Call.Return(run) - return _c -} - -// BlockRelationSetKey provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockRelationSetKey(_a0 context.Context, _a1 *pb.RpcBlockRelationSetKeyRequest) *pb.RpcBlockRelationSetKeyResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockRelationSetKey") - } - - var r0 *pb.RpcBlockRelationSetKeyResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockRelationSetKeyRequest) *pb.RpcBlockRelationSetKeyResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockRelationSetKeyResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockRelationSetKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockRelationSetKey' -type MockClientCommandsServer_BlockRelationSetKey_Call struct { - *mock.Call -} - -// BlockRelationSetKey is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockRelationSetKeyRequest -func (_e *MockClientCommandsServer_Expecter) BlockRelationSetKey(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockRelationSetKey_Call { - return &MockClientCommandsServer_BlockRelationSetKey_Call{Call: _e.mock.On("BlockRelationSetKey", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockRelationSetKey_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockRelationSetKeyRequest)) *MockClientCommandsServer_BlockRelationSetKey_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockRelationSetKeyRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockRelationSetKey_Call) Return(_a0 *pb.RpcBlockRelationSetKeyResponse) *MockClientCommandsServer_BlockRelationSetKey_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockRelationSetKey_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockRelationSetKeyRequest) *pb.RpcBlockRelationSetKeyResponse) *MockClientCommandsServer_BlockRelationSetKey_Call { - _c.Call.Return(run) - return _c -} - -// BlockReplace provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockReplace(_a0 context.Context, _a1 *pb.RpcBlockReplaceRequest) *pb.RpcBlockReplaceResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockReplace") - } - - var r0 *pb.RpcBlockReplaceResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockReplaceRequest) *pb.RpcBlockReplaceResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockReplaceResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockReplace_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockReplace' -type MockClientCommandsServer_BlockReplace_Call struct { - *mock.Call -} - -// BlockReplace is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockReplaceRequest -func (_e *MockClientCommandsServer_Expecter) BlockReplace(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockReplace_Call { - return &MockClientCommandsServer_BlockReplace_Call{Call: _e.mock.On("BlockReplace", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockReplace_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockReplaceRequest)) *MockClientCommandsServer_BlockReplace_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockReplaceRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockReplace_Call) Return(_a0 *pb.RpcBlockReplaceResponse) *MockClientCommandsServer_BlockReplace_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockReplace_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockReplaceRequest) *pb.RpcBlockReplaceResponse) *MockClientCommandsServer_BlockReplace_Call { - _c.Call.Return(run) - return _c -} - -// BlockSetCarriage provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockSetCarriage(_a0 context.Context, _a1 *pb.RpcBlockSetCarriageRequest) *pb.RpcBlockSetCarriageResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockSetCarriage") - } - - var r0 *pb.RpcBlockSetCarriageResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockSetCarriageRequest) *pb.RpcBlockSetCarriageResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockSetCarriageResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockSetCarriage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockSetCarriage' -type MockClientCommandsServer_BlockSetCarriage_Call struct { - *mock.Call -} - -// BlockSetCarriage is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockSetCarriageRequest -func (_e *MockClientCommandsServer_Expecter) BlockSetCarriage(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockSetCarriage_Call { - return &MockClientCommandsServer_BlockSetCarriage_Call{Call: _e.mock.On("BlockSetCarriage", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockSetCarriage_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockSetCarriageRequest)) *MockClientCommandsServer_BlockSetCarriage_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockSetCarriageRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockSetCarriage_Call) Return(_a0 *pb.RpcBlockSetCarriageResponse) *MockClientCommandsServer_BlockSetCarriage_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockSetCarriage_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockSetCarriageRequest) *pb.RpcBlockSetCarriageResponse) *MockClientCommandsServer_BlockSetCarriage_Call { - _c.Call.Return(run) - return _c -} - -// BlockSetFields provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockSetFields(_a0 context.Context, _a1 *pb.RpcBlockSetFieldsRequest) *pb.RpcBlockSetFieldsResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockSetFields") - } - - var r0 *pb.RpcBlockSetFieldsResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockSetFieldsRequest) *pb.RpcBlockSetFieldsResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockSetFieldsResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockSetFields_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockSetFields' -type MockClientCommandsServer_BlockSetFields_Call struct { - *mock.Call -} - -// BlockSetFields is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockSetFieldsRequest -func (_e *MockClientCommandsServer_Expecter) BlockSetFields(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockSetFields_Call { - return &MockClientCommandsServer_BlockSetFields_Call{Call: _e.mock.On("BlockSetFields", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockSetFields_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockSetFieldsRequest)) *MockClientCommandsServer_BlockSetFields_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockSetFieldsRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockSetFields_Call) Return(_a0 *pb.RpcBlockSetFieldsResponse) *MockClientCommandsServer_BlockSetFields_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockSetFields_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockSetFieldsRequest) *pb.RpcBlockSetFieldsResponse) *MockClientCommandsServer_BlockSetFields_Call { - _c.Call.Return(run) - return _c -} - -// BlockSplit provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockSplit(_a0 context.Context, _a1 *pb.RpcBlockSplitRequest) *pb.RpcBlockSplitResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockSplit") - } - - var r0 *pb.RpcBlockSplitResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockSplitRequest) *pb.RpcBlockSplitResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockSplitResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockSplit_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockSplit' -type MockClientCommandsServer_BlockSplit_Call struct { - *mock.Call -} - -// BlockSplit is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockSplitRequest -func (_e *MockClientCommandsServer_Expecter) BlockSplit(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockSplit_Call { - return &MockClientCommandsServer_BlockSplit_Call{Call: _e.mock.On("BlockSplit", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockSplit_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockSplitRequest)) *MockClientCommandsServer_BlockSplit_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockSplitRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockSplit_Call) Return(_a0 *pb.RpcBlockSplitResponse) *MockClientCommandsServer_BlockSplit_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockSplit_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockSplitRequest) *pb.RpcBlockSplitResponse) *MockClientCommandsServer_BlockSplit_Call { - _c.Call.Return(run) - return _c -} - -// BlockTableColumnCreate provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTableColumnCreate(_a0 context.Context, _a1 *pb.RpcBlockTableColumnCreateRequest) *pb.RpcBlockTableColumnCreateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTableColumnCreate") - } - - var r0 *pb.RpcBlockTableColumnCreateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableColumnCreateRequest) *pb.RpcBlockTableColumnCreateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTableColumnCreateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTableColumnCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableColumnCreate' -type MockClientCommandsServer_BlockTableColumnCreate_Call struct { - *mock.Call -} - -// BlockTableColumnCreate is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTableColumnCreateRequest -func (_e *MockClientCommandsServer_Expecter) BlockTableColumnCreate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableColumnCreate_Call { - return &MockClientCommandsServer_BlockTableColumnCreate_Call{Call: _e.mock.On("BlockTableColumnCreate", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTableColumnCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableColumnCreateRequest)) *MockClientCommandsServer_BlockTableColumnCreate_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTableColumnCreateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableColumnCreate_Call) Return(_a0 *pb.RpcBlockTableColumnCreateResponse) *MockClientCommandsServer_BlockTableColumnCreate_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableColumnCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableColumnCreateRequest) *pb.RpcBlockTableColumnCreateResponse) *MockClientCommandsServer_BlockTableColumnCreate_Call { - _c.Call.Return(run) - return _c -} - -// BlockTableColumnDelete provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTableColumnDelete(_a0 context.Context, _a1 *pb.RpcBlockTableColumnDeleteRequest) *pb.RpcBlockTableColumnDeleteResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTableColumnDelete") - } - - var r0 *pb.RpcBlockTableColumnDeleteResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableColumnDeleteRequest) *pb.RpcBlockTableColumnDeleteResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTableColumnDeleteResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTableColumnDelete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableColumnDelete' -type MockClientCommandsServer_BlockTableColumnDelete_Call struct { - *mock.Call -} - -// BlockTableColumnDelete is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTableColumnDeleteRequest -func (_e *MockClientCommandsServer_Expecter) BlockTableColumnDelete(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableColumnDelete_Call { - return &MockClientCommandsServer_BlockTableColumnDelete_Call{Call: _e.mock.On("BlockTableColumnDelete", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTableColumnDelete_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableColumnDeleteRequest)) *MockClientCommandsServer_BlockTableColumnDelete_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTableColumnDeleteRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableColumnDelete_Call) Return(_a0 *pb.RpcBlockTableColumnDeleteResponse) *MockClientCommandsServer_BlockTableColumnDelete_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableColumnDelete_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableColumnDeleteRequest) *pb.RpcBlockTableColumnDeleteResponse) *MockClientCommandsServer_BlockTableColumnDelete_Call { - _c.Call.Return(run) - return _c -} - -// BlockTableColumnDuplicate provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTableColumnDuplicate(_a0 context.Context, _a1 *pb.RpcBlockTableColumnDuplicateRequest) *pb.RpcBlockTableColumnDuplicateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTableColumnDuplicate") - } - - var r0 *pb.RpcBlockTableColumnDuplicateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableColumnDuplicateRequest) *pb.RpcBlockTableColumnDuplicateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTableColumnDuplicateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTableColumnDuplicate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableColumnDuplicate' -type MockClientCommandsServer_BlockTableColumnDuplicate_Call struct { - *mock.Call -} - -// BlockTableColumnDuplicate is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTableColumnDuplicateRequest -func (_e *MockClientCommandsServer_Expecter) BlockTableColumnDuplicate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableColumnDuplicate_Call { - return &MockClientCommandsServer_BlockTableColumnDuplicate_Call{Call: _e.mock.On("BlockTableColumnDuplicate", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTableColumnDuplicate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableColumnDuplicateRequest)) *MockClientCommandsServer_BlockTableColumnDuplicate_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTableColumnDuplicateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableColumnDuplicate_Call) Return(_a0 *pb.RpcBlockTableColumnDuplicateResponse) *MockClientCommandsServer_BlockTableColumnDuplicate_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableColumnDuplicate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableColumnDuplicateRequest) *pb.RpcBlockTableColumnDuplicateResponse) *MockClientCommandsServer_BlockTableColumnDuplicate_Call { - _c.Call.Return(run) - return _c -} - -// BlockTableColumnListFill provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTableColumnListFill(_a0 context.Context, _a1 *pb.RpcBlockTableColumnListFillRequest) *pb.RpcBlockTableColumnListFillResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTableColumnListFill") - } - - var r0 *pb.RpcBlockTableColumnListFillResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableColumnListFillRequest) *pb.RpcBlockTableColumnListFillResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTableColumnListFillResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTableColumnListFill_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableColumnListFill' -type MockClientCommandsServer_BlockTableColumnListFill_Call struct { - *mock.Call -} - -// BlockTableColumnListFill is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTableColumnListFillRequest -func (_e *MockClientCommandsServer_Expecter) BlockTableColumnListFill(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableColumnListFill_Call { - return &MockClientCommandsServer_BlockTableColumnListFill_Call{Call: _e.mock.On("BlockTableColumnListFill", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTableColumnListFill_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableColumnListFillRequest)) *MockClientCommandsServer_BlockTableColumnListFill_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTableColumnListFillRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableColumnListFill_Call) Return(_a0 *pb.RpcBlockTableColumnListFillResponse) *MockClientCommandsServer_BlockTableColumnListFill_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableColumnListFill_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableColumnListFillRequest) *pb.RpcBlockTableColumnListFillResponse) *MockClientCommandsServer_BlockTableColumnListFill_Call { - _c.Call.Return(run) - return _c -} - -// BlockTableColumnMove provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTableColumnMove(_a0 context.Context, _a1 *pb.RpcBlockTableColumnMoveRequest) *pb.RpcBlockTableColumnMoveResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTableColumnMove") - } - - var r0 *pb.RpcBlockTableColumnMoveResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableColumnMoveRequest) *pb.RpcBlockTableColumnMoveResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTableColumnMoveResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTableColumnMove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableColumnMove' -type MockClientCommandsServer_BlockTableColumnMove_Call struct { - *mock.Call -} - -// BlockTableColumnMove is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTableColumnMoveRequest -func (_e *MockClientCommandsServer_Expecter) BlockTableColumnMove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableColumnMove_Call { - return &MockClientCommandsServer_BlockTableColumnMove_Call{Call: _e.mock.On("BlockTableColumnMove", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTableColumnMove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableColumnMoveRequest)) *MockClientCommandsServer_BlockTableColumnMove_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTableColumnMoveRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableColumnMove_Call) Return(_a0 *pb.RpcBlockTableColumnMoveResponse) *MockClientCommandsServer_BlockTableColumnMove_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableColumnMove_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableColumnMoveRequest) *pb.RpcBlockTableColumnMoveResponse) *MockClientCommandsServer_BlockTableColumnMove_Call { - _c.Call.Return(run) - return _c -} - -// BlockTableCreate provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTableCreate(_a0 context.Context, _a1 *pb.RpcBlockTableCreateRequest) *pb.RpcBlockTableCreateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTableCreate") - } - - var r0 *pb.RpcBlockTableCreateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableCreateRequest) *pb.RpcBlockTableCreateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTableCreateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTableCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableCreate' -type MockClientCommandsServer_BlockTableCreate_Call struct { - *mock.Call -} - -// BlockTableCreate is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTableCreateRequest -func (_e *MockClientCommandsServer_Expecter) BlockTableCreate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableCreate_Call { - return &MockClientCommandsServer_BlockTableCreate_Call{Call: _e.mock.On("BlockTableCreate", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTableCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableCreateRequest)) *MockClientCommandsServer_BlockTableCreate_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTableCreateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableCreate_Call) Return(_a0 *pb.RpcBlockTableCreateResponse) *MockClientCommandsServer_BlockTableCreate_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableCreateRequest) *pb.RpcBlockTableCreateResponse) *MockClientCommandsServer_BlockTableCreate_Call { - _c.Call.Return(run) - return _c -} - -// BlockTableExpand provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTableExpand(_a0 context.Context, _a1 *pb.RpcBlockTableExpandRequest) *pb.RpcBlockTableExpandResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTableExpand") - } - - var r0 *pb.RpcBlockTableExpandResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableExpandRequest) *pb.RpcBlockTableExpandResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTableExpandResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTableExpand_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableExpand' -type MockClientCommandsServer_BlockTableExpand_Call struct { - *mock.Call -} - -// BlockTableExpand is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTableExpandRequest -func (_e *MockClientCommandsServer_Expecter) BlockTableExpand(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableExpand_Call { - return &MockClientCommandsServer_BlockTableExpand_Call{Call: _e.mock.On("BlockTableExpand", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTableExpand_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableExpandRequest)) *MockClientCommandsServer_BlockTableExpand_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTableExpandRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableExpand_Call) Return(_a0 *pb.RpcBlockTableExpandResponse) *MockClientCommandsServer_BlockTableExpand_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableExpand_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableExpandRequest) *pb.RpcBlockTableExpandResponse) *MockClientCommandsServer_BlockTableExpand_Call { - _c.Call.Return(run) - return _c -} - -// BlockTableRowCreate provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTableRowCreate(_a0 context.Context, _a1 *pb.RpcBlockTableRowCreateRequest) *pb.RpcBlockTableRowCreateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTableRowCreate") - } - - var r0 *pb.RpcBlockTableRowCreateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableRowCreateRequest) *pb.RpcBlockTableRowCreateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTableRowCreateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTableRowCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableRowCreate' -type MockClientCommandsServer_BlockTableRowCreate_Call struct { - *mock.Call -} - -// BlockTableRowCreate is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTableRowCreateRequest -func (_e *MockClientCommandsServer_Expecter) BlockTableRowCreate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableRowCreate_Call { - return &MockClientCommandsServer_BlockTableRowCreate_Call{Call: _e.mock.On("BlockTableRowCreate", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTableRowCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableRowCreateRequest)) *MockClientCommandsServer_BlockTableRowCreate_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTableRowCreateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableRowCreate_Call) Return(_a0 *pb.RpcBlockTableRowCreateResponse) *MockClientCommandsServer_BlockTableRowCreate_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableRowCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableRowCreateRequest) *pb.RpcBlockTableRowCreateResponse) *MockClientCommandsServer_BlockTableRowCreate_Call { - _c.Call.Return(run) - return _c -} - -// BlockTableRowDelete provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTableRowDelete(_a0 context.Context, _a1 *pb.RpcBlockTableRowDeleteRequest) *pb.RpcBlockTableRowDeleteResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTableRowDelete") - } - - var r0 *pb.RpcBlockTableRowDeleteResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableRowDeleteRequest) *pb.RpcBlockTableRowDeleteResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTableRowDeleteResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTableRowDelete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableRowDelete' -type MockClientCommandsServer_BlockTableRowDelete_Call struct { - *mock.Call -} - -// BlockTableRowDelete is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTableRowDeleteRequest -func (_e *MockClientCommandsServer_Expecter) BlockTableRowDelete(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableRowDelete_Call { - return &MockClientCommandsServer_BlockTableRowDelete_Call{Call: _e.mock.On("BlockTableRowDelete", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTableRowDelete_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableRowDeleteRequest)) *MockClientCommandsServer_BlockTableRowDelete_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTableRowDeleteRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableRowDelete_Call) Return(_a0 *pb.RpcBlockTableRowDeleteResponse) *MockClientCommandsServer_BlockTableRowDelete_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableRowDelete_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableRowDeleteRequest) *pb.RpcBlockTableRowDeleteResponse) *MockClientCommandsServer_BlockTableRowDelete_Call { - _c.Call.Return(run) - return _c -} - -// BlockTableRowDuplicate provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTableRowDuplicate(_a0 context.Context, _a1 *pb.RpcBlockTableRowDuplicateRequest) *pb.RpcBlockTableRowDuplicateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTableRowDuplicate") - } - - var r0 *pb.RpcBlockTableRowDuplicateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableRowDuplicateRequest) *pb.RpcBlockTableRowDuplicateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTableRowDuplicateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTableRowDuplicate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableRowDuplicate' -type MockClientCommandsServer_BlockTableRowDuplicate_Call struct { - *mock.Call -} - -// BlockTableRowDuplicate is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTableRowDuplicateRequest -func (_e *MockClientCommandsServer_Expecter) BlockTableRowDuplicate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableRowDuplicate_Call { - return &MockClientCommandsServer_BlockTableRowDuplicate_Call{Call: _e.mock.On("BlockTableRowDuplicate", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTableRowDuplicate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableRowDuplicateRequest)) *MockClientCommandsServer_BlockTableRowDuplicate_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTableRowDuplicateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableRowDuplicate_Call) Return(_a0 *pb.RpcBlockTableRowDuplicateResponse) *MockClientCommandsServer_BlockTableRowDuplicate_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableRowDuplicate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableRowDuplicateRequest) *pb.RpcBlockTableRowDuplicateResponse) *MockClientCommandsServer_BlockTableRowDuplicate_Call { - _c.Call.Return(run) - return _c -} - -// BlockTableRowListClean provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTableRowListClean(_a0 context.Context, _a1 *pb.RpcBlockTableRowListCleanRequest) *pb.RpcBlockTableRowListCleanResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTableRowListClean") - } - - var r0 *pb.RpcBlockTableRowListCleanResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableRowListCleanRequest) *pb.RpcBlockTableRowListCleanResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTableRowListCleanResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTableRowListClean_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableRowListClean' -type MockClientCommandsServer_BlockTableRowListClean_Call struct { - *mock.Call -} - -// BlockTableRowListClean is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTableRowListCleanRequest -func (_e *MockClientCommandsServer_Expecter) BlockTableRowListClean(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableRowListClean_Call { - return &MockClientCommandsServer_BlockTableRowListClean_Call{Call: _e.mock.On("BlockTableRowListClean", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTableRowListClean_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableRowListCleanRequest)) *MockClientCommandsServer_BlockTableRowListClean_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTableRowListCleanRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableRowListClean_Call) Return(_a0 *pb.RpcBlockTableRowListCleanResponse) *MockClientCommandsServer_BlockTableRowListClean_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableRowListClean_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableRowListCleanRequest) *pb.RpcBlockTableRowListCleanResponse) *MockClientCommandsServer_BlockTableRowListClean_Call { - _c.Call.Return(run) - return _c -} - -// BlockTableRowListFill provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTableRowListFill(_a0 context.Context, _a1 *pb.RpcBlockTableRowListFillRequest) *pb.RpcBlockTableRowListFillResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTableRowListFill") - } - - var r0 *pb.RpcBlockTableRowListFillResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableRowListFillRequest) *pb.RpcBlockTableRowListFillResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTableRowListFillResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTableRowListFill_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableRowListFill' -type MockClientCommandsServer_BlockTableRowListFill_Call struct { - *mock.Call -} - -// BlockTableRowListFill is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTableRowListFillRequest -func (_e *MockClientCommandsServer_Expecter) BlockTableRowListFill(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableRowListFill_Call { - return &MockClientCommandsServer_BlockTableRowListFill_Call{Call: _e.mock.On("BlockTableRowListFill", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTableRowListFill_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableRowListFillRequest)) *MockClientCommandsServer_BlockTableRowListFill_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTableRowListFillRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableRowListFill_Call) Return(_a0 *pb.RpcBlockTableRowListFillResponse) *MockClientCommandsServer_BlockTableRowListFill_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableRowListFill_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableRowListFillRequest) *pb.RpcBlockTableRowListFillResponse) *MockClientCommandsServer_BlockTableRowListFill_Call { - _c.Call.Return(run) - return _c -} - -// BlockTableRowSetHeader provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTableRowSetHeader(_a0 context.Context, _a1 *pb.RpcBlockTableRowSetHeaderRequest) *pb.RpcBlockTableRowSetHeaderResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTableRowSetHeader") - } - - var r0 *pb.RpcBlockTableRowSetHeaderResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableRowSetHeaderRequest) *pb.RpcBlockTableRowSetHeaderResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTableRowSetHeaderResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTableRowSetHeader_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableRowSetHeader' -type MockClientCommandsServer_BlockTableRowSetHeader_Call struct { - *mock.Call -} - -// BlockTableRowSetHeader is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTableRowSetHeaderRequest -func (_e *MockClientCommandsServer_Expecter) BlockTableRowSetHeader(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableRowSetHeader_Call { - return &MockClientCommandsServer_BlockTableRowSetHeader_Call{Call: _e.mock.On("BlockTableRowSetHeader", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTableRowSetHeader_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableRowSetHeaderRequest)) *MockClientCommandsServer_BlockTableRowSetHeader_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTableRowSetHeaderRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableRowSetHeader_Call) Return(_a0 *pb.RpcBlockTableRowSetHeaderResponse) *MockClientCommandsServer_BlockTableRowSetHeader_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableRowSetHeader_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableRowSetHeaderRequest) *pb.RpcBlockTableRowSetHeaderResponse) *MockClientCommandsServer_BlockTableRowSetHeader_Call { - _c.Call.Return(run) - return _c -} - -// BlockTableSort provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTableSort(_a0 context.Context, _a1 *pb.RpcBlockTableSortRequest) *pb.RpcBlockTableSortResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTableSort") - } - - var r0 *pb.RpcBlockTableSortResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableSortRequest) *pb.RpcBlockTableSortResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTableSortResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTableSort_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableSort' -type MockClientCommandsServer_BlockTableSort_Call struct { - *mock.Call -} - -// BlockTableSort is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTableSortRequest -func (_e *MockClientCommandsServer_Expecter) BlockTableSort(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableSort_Call { - return &MockClientCommandsServer_BlockTableSort_Call{Call: _e.mock.On("BlockTableSort", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTableSort_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableSortRequest)) *MockClientCommandsServer_BlockTableSort_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTableSortRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableSort_Call) Return(_a0 *pb.RpcBlockTableSortResponse) *MockClientCommandsServer_BlockTableSort_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTableSort_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableSortRequest) *pb.RpcBlockTableSortResponse) *MockClientCommandsServer_BlockTableSort_Call { - _c.Call.Return(run) - return _c -} - -// BlockTextListClearContent provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTextListClearContent(_a0 context.Context, _a1 *pb.RpcBlockTextListClearContentRequest) *pb.RpcBlockTextListClearContentResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTextListClearContent") - } - - var r0 *pb.RpcBlockTextListClearContentResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTextListClearContentRequest) *pb.RpcBlockTextListClearContentResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTextListClearContentResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTextListClearContent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTextListClearContent' -type MockClientCommandsServer_BlockTextListClearContent_Call struct { - *mock.Call -} - -// BlockTextListClearContent is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTextListClearContentRequest -func (_e *MockClientCommandsServer_Expecter) BlockTextListClearContent(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTextListClearContent_Call { - return &MockClientCommandsServer_BlockTextListClearContent_Call{Call: _e.mock.On("BlockTextListClearContent", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTextListClearContent_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTextListClearContentRequest)) *MockClientCommandsServer_BlockTextListClearContent_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTextListClearContentRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTextListClearContent_Call) Return(_a0 *pb.RpcBlockTextListClearContentResponse) *MockClientCommandsServer_BlockTextListClearContent_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTextListClearContent_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTextListClearContentRequest) *pb.RpcBlockTextListClearContentResponse) *MockClientCommandsServer_BlockTextListClearContent_Call { - _c.Call.Return(run) - return _c -} - -// BlockTextListClearStyle provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTextListClearStyle(_a0 context.Context, _a1 *pb.RpcBlockTextListClearStyleRequest) *pb.RpcBlockTextListClearStyleResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTextListClearStyle") - } - - var r0 *pb.RpcBlockTextListClearStyleResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTextListClearStyleRequest) *pb.RpcBlockTextListClearStyleResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTextListClearStyleResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTextListClearStyle_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTextListClearStyle' -type MockClientCommandsServer_BlockTextListClearStyle_Call struct { - *mock.Call -} - -// BlockTextListClearStyle is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTextListClearStyleRequest -func (_e *MockClientCommandsServer_Expecter) BlockTextListClearStyle(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTextListClearStyle_Call { - return &MockClientCommandsServer_BlockTextListClearStyle_Call{Call: _e.mock.On("BlockTextListClearStyle", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTextListClearStyle_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTextListClearStyleRequest)) *MockClientCommandsServer_BlockTextListClearStyle_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTextListClearStyleRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTextListClearStyle_Call) Return(_a0 *pb.RpcBlockTextListClearStyleResponse) *MockClientCommandsServer_BlockTextListClearStyle_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTextListClearStyle_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTextListClearStyleRequest) *pb.RpcBlockTextListClearStyleResponse) *MockClientCommandsServer_BlockTextListClearStyle_Call { - _c.Call.Return(run) - return _c -} - -// BlockTextListSetColor provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTextListSetColor(_a0 context.Context, _a1 *pb.RpcBlockTextListSetColorRequest) *pb.RpcBlockTextListSetColorResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTextListSetColor") - } - - var r0 *pb.RpcBlockTextListSetColorResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTextListSetColorRequest) *pb.RpcBlockTextListSetColorResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTextListSetColorResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTextListSetColor_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTextListSetColor' -type MockClientCommandsServer_BlockTextListSetColor_Call struct { - *mock.Call -} - -// BlockTextListSetColor is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTextListSetColorRequest -func (_e *MockClientCommandsServer_Expecter) BlockTextListSetColor(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTextListSetColor_Call { - return &MockClientCommandsServer_BlockTextListSetColor_Call{Call: _e.mock.On("BlockTextListSetColor", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTextListSetColor_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTextListSetColorRequest)) *MockClientCommandsServer_BlockTextListSetColor_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTextListSetColorRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTextListSetColor_Call) Return(_a0 *pb.RpcBlockTextListSetColorResponse) *MockClientCommandsServer_BlockTextListSetColor_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTextListSetColor_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTextListSetColorRequest) *pb.RpcBlockTextListSetColorResponse) *MockClientCommandsServer_BlockTextListSetColor_Call { - _c.Call.Return(run) - return _c -} - -// BlockTextListSetMark provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTextListSetMark(_a0 context.Context, _a1 *pb.RpcBlockTextListSetMarkRequest) *pb.RpcBlockTextListSetMarkResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTextListSetMark") - } - - var r0 *pb.RpcBlockTextListSetMarkResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTextListSetMarkRequest) *pb.RpcBlockTextListSetMarkResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTextListSetMarkResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTextListSetMark_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTextListSetMark' -type MockClientCommandsServer_BlockTextListSetMark_Call struct { - *mock.Call -} - -// BlockTextListSetMark is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTextListSetMarkRequest -func (_e *MockClientCommandsServer_Expecter) BlockTextListSetMark(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTextListSetMark_Call { - return &MockClientCommandsServer_BlockTextListSetMark_Call{Call: _e.mock.On("BlockTextListSetMark", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTextListSetMark_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTextListSetMarkRequest)) *MockClientCommandsServer_BlockTextListSetMark_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTextListSetMarkRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTextListSetMark_Call) Return(_a0 *pb.RpcBlockTextListSetMarkResponse) *MockClientCommandsServer_BlockTextListSetMark_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTextListSetMark_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTextListSetMarkRequest) *pb.RpcBlockTextListSetMarkResponse) *MockClientCommandsServer_BlockTextListSetMark_Call { - _c.Call.Return(run) - return _c -} - -// BlockTextListSetStyle provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTextListSetStyle(_a0 context.Context, _a1 *pb.RpcBlockTextListSetStyleRequest) *pb.RpcBlockTextListSetStyleResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTextListSetStyle") - } - - var r0 *pb.RpcBlockTextListSetStyleResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTextListSetStyleRequest) *pb.RpcBlockTextListSetStyleResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTextListSetStyleResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTextListSetStyle_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTextListSetStyle' -type MockClientCommandsServer_BlockTextListSetStyle_Call struct { - *mock.Call -} - -// BlockTextListSetStyle is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTextListSetStyleRequest -func (_e *MockClientCommandsServer_Expecter) BlockTextListSetStyle(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTextListSetStyle_Call { - return &MockClientCommandsServer_BlockTextListSetStyle_Call{Call: _e.mock.On("BlockTextListSetStyle", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTextListSetStyle_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTextListSetStyleRequest)) *MockClientCommandsServer_BlockTextListSetStyle_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTextListSetStyleRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTextListSetStyle_Call) Return(_a0 *pb.RpcBlockTextListSetStyleResponse) *MockClientCommandsServer_BlockTextListSetStyle_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTextListSetStyle_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTextListSetStyleRequest) *pb.RpcBlockTextListSetStyleResponse) *MockClientCommandsServer_BlockTextListSetStyle_Call { - _c.Call.Return(run) - return _c -} - -// BlockTextSetChecked provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTextSetChecked(_a0 context.Context, _a1 *pb.RpcBlockTextSetCheckedRequest) *pb.RpcBlockTextSetCheckedResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTextSetChecked") - } - - var r0 *pb.RpcBlockTextSetCheckedResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTextSetCheckedRequest) *pb.RpcBlockTextSetCheckedResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTextSetCheckedResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTextSetChecked_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTextSetChecked' -type MockClientCommandsServer_BlockTextSetChecked_Call struct { - *mock.Call -} - -// BlockTextSetChecked is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTextSetCheckedRequest -func (_e *MockClientCommandsServer_Expecter) BlockTextSetChecked(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTextSetChecked_Call { - return &MockClientCommandsServer_BlockTextSetChecked_Call{Call: _e.mock.On("BlockTextSetChecked", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTextSetChecked_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTextSetCheckedRequest)) *MockClientCommandsServer_BlockTextSetChecked_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTextSetCheckedRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTextSetChecked_Call) Return(_a0 *pb.RpcBlockTextSetCheckedResponse) *MockClientCommandsServer_BlockTextSetChecked_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTextSetChecked_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTextSetCheckedRequest) *pb.RpcBlockTextSetCheckedResponse) *MockClientCommandsServer_BlockTextSetChecked_Call { - _c.Call.Return(run) - return _c -} - -// BlockTextSetColor provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTextSetColor(_a0 context.Context, _a1 *pb.RpcBlockTextSetColorRequest) *pb.RpcBlockTextSetColorResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTextSetColor") - } - - var r0 *pb.RpcBlockTextSetColorResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTextSetColorRequest) *pb.RpcBlockTextSetColorResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTextSetColorResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTextSetColor_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTextSetColor' -type MockClientCommandsServer_BlockTextSetColor_Call struct { - *mock.Call -} - -// BlockTextSetColor is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTextSetColorRequest -func (_e *MockClientCommandsServer_Expecter) BlockTextSetColor(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTextSetColor_Call { - return &MockClientCommandsServer_BlockTextSetColor_Call{Call: _e.mock.On("BlockTextSetColor", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTextSetColor_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTextSetColorRequest)) *MockClientCommandsServer_BlockTextSetColor_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTextSetColorRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTextSetColor_Call) Return(_a0 *pb.RpcBlockTextSetColorResponse) *MockClientCommandsServer_BlockTextSetColor_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTextSetColor_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTextSetColorRequest) *pb.RpcBlockTextSetColorResponse) *MockClientCommandsServer_BlockTextSetColor_Call { - _c.Call.Return(run) - return _c -} - -// BlockTextSetIcon provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTextSetIcon(_a0 context.Context, _a1 *pb.RpcBlockTextSetIconRequest) *pb.RpcBlockTextSetIconResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTextSetIcon") - } - - var r0 *pb.RpcBlockTextSetIconResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTextSetIconRequest) *pb.RpcBlockTextSetIconResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTextSetIconResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTextSetIcon_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTextSetIcon' -type MockClientCommandsServer_BlockTextSetIcon_Call struct { - *mock.Call -} - -// BlockTextSetIcon is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTextSetIconRequest -func (_e *MockClientCommandsServer_Expecter) BlockTextSetIcon(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTextSetIcon_Call { - return &MockClientCommandsServer_BlockTextSetIcon_Call{Call: _e.mock.On("BlockTextSetIcon", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTextSetIcon_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTextSetIconRequest)) *MockClientCommandsServer_BlockTextSetIcon_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTextSetIconRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTextSetIcon_Call) Return(_a0 *pb.RpcBlockTextSetIconResponse) *MockClientCommandsServer_BlockTextSetIcon_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTextSetIcon_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTextSetIconRequest) *pb.RpcBlockTextSetIconResponse) *MockClientCommandsServer_BlockTextSetIcon_Call { - _c.Call.Return(run) - return _c -} - -// BlockTextSetStyle provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTextSetStyle(_a0 context.Context, _a1 *pb.RpcBlockTextSetStyleRequest) *pb.RpcBlockTextSetStyleResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTextSetStyle") - } - - var r0 *pb.RpcBlockTextSetStyleResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTextSetStyleRequest) *pb.RpcBlockTextSetStyleResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTextSetStyleResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTextSetStyle_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTextSetStyle' -type MockClientCommandsServer_BlockTextSetStyle_Call struct { - *mock.Call -} - -// BlockTextSetStyle is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTextSetStyleRequest -func (_e *MockClientCommandsServer_Expecter) BlockTextSetStyle(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTextSetStyle_Call { - return &MockClientCommandsServer_BlockTextSetStyle_Call{Call: _e.mock.On("BlockTextSetStyle", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTextSetStyle_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTextSetStyleRequest)) *MockClientCommandsServer_BlockTextSetStyle_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTextSetStyleRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTextSetStyle_Call) Return(_a0 *pb.RpcBlockTextSetStyleResponse) *MockClientCommandsServer_BlockTextSetStyle_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTextSetStyle_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTextSetStyleRequest) *pb.RpcBlockTextSetStyleResponse) *MockClientCommandsServer_BlockTextSetStyle_Call { - _c.Call.Return(run) - return _c -} - -// BlockTextSetText provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockTextSetText(_a0 context.Context, _a1 *pb.RpcBlockTextSetTextRequest) *pb.RpcBlockTextSetTextResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockTextSetText") - } - - var r0 *pb.RpcBlockTextSetTextResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTextSetTextRequest) *pb.RpcBlockTextSetTextResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockTextSetTextResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockTextSetText_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTextSetText' -type MockClientCommandsServer_BlockTextSetText_Call struct { - *mock.Call -} - -// BlockTextSetText is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockTextSetTextRequest -func (_e *MockClientCommandsServer_Expecter) BlockTextSetText(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTextSetText_Call { - return &MockClientCommandsServer_BlockTextSetText_Call{Call: _e.mock.On("BlockTextSetText", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockTextSetText_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTextSetTextRequest)) *MockClientCommandsServer_BlockTextSetText_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockTextSetTextRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockTextSetText_Call) Return(_a0 *pb.RpcBlockTextSetTextResponse) *MockClientCommandsServer_BlockTextSetText_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockTextSetText_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTextSetTextRequest) *pb.RpcBlockTextSetTextResponse) *MockClientCommandsServer_BlockTextSetText_Call { - _c.Call.Return(run) - return _c -} - -// BlockUpload provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockUpload(_a0 context.Context, _a1 *pb.RpcBlockUploadRequest) *pb.RpcBlockUploadResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockUpload") - } - - var r0 *pb.RpcBlockUploadResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockUploadRequest) *pb.RpcBlockUploadResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockUploadResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockUpload_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockUpload' -type MockClientCommandsServer_BlockUpload_Call struct { - *mock.Call -} - -// BlockUpload is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockUploadRequest -func (_e *MockClientCommandsServer_Expecter) BlockUpload(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockUpload_Call { - return &MockClientCommandsServer_BlockUpload_Call{Call: _e.mock.On("BlockUpload", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockUpload_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockUploadRequest)) *MockClientCommandsServer_BlockUpload_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockUploadRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockUpload_Call) Return(_a0 *pb.RpcBlockUploadResponse) *MockClientCommandsServer_BlockUpload_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockUpload_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockUploadRequest) *pb.RpcBlockUploadResponse) *MockClientCommandsServer_BlockUpload_Call { - _c.Call.Return(run) - return _c -} - -// BlockVideoSetName provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockVideoSetName(_a0 context.Context, _a1 *pb.RpcBlockVideoSetNameRequest) *pb.RpcBlockVideoSetNameResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockVideoSetName") - } - - var r0 *pb.RpcBlockVideoSetNameResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockVideoSetNameRequest) *pb.RpcBlockVideoSetNameResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockVideoSetNameResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockVideoSetName_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockVideoSetName' -type MockClientCommandsServer_BlockVideoSetName_Call struct { - *mock.Call -} - -// BlockVideoSetName is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockVideoSetNameRequest -func (_e *MockClientCommandsServer_Expecter) BlockVideoSetName(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockVideoSetName_Call { - return &MockClientCommandsServer_BlockVideoSetName_Call{Call: _e.mock.On("BlockVideoSetName", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockVideoSetName_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockVideoSetNameRequest)) *MockClientCommandsServer_BlockVideoSetName_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockVideoSetNameRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockVideoSetName_Call) Return(_a0 *pb.RpcBlockVideoSetNameResponse) *MockClientCommandsServer_BlockVideoSetName_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockVideoSetName_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockVideoSetNameRequest) *pb.RpcBlockVideoSetNameResponse) *MockClientCommandsServer_BlockVideoSetName_Call { - _c.Call.Return(run) - return _c -} - -// BlockWidgetSetLayout provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockWidgetSetLayout(_a0 context.Context, _a1 *pb.RpcBlockWidgetSetLayoutRequest) *pb.RpcBlockWidgetSetLayoutResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockWidgetSetLayout") - } - - var r0 *pb.RpcBlockWidgetSetLayoutResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockWidgetSetLayoutRequest) *pb.RpcBlockWidgetSetLayoutResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockWidgetSetLayoutResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockWidgetSetLayout_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockWidgetSetLayout' -type MockClientCommandsServer_BlockWidgetSetLayout_Call struct { - *mock.Call -} - -// BlockWidgetSetLayout is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockWidgetSetLayoutRequest -func (_e *MockClientCommandsServer_Expecter) BlockWidgetSetLayout(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockWidgetSetLayout_Call { - return &MockClientCommandsServer_BlockWidgetSetLayout_Call{Call: _e.mock.On("BlockWidgetSetLayout", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockWidgetSetLayout_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockWidgetSetLayoutRequest)) *MockClientCommandsServer_BlockWidgetSetLayout_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockWidgetSetLayoutRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockWidgetSetLayout_Call) Return(_a0 *pb.RpcBlockWidgetSetLayoutResponse) *MockClientCommandsServer_BlockWidgetSetLayout_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockWidgetSetLayout_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockWidgetSetLayoutRequest) *pb.RpcBlockWidgetSetLayoutResponse) *MockClientCommandsServer_BlockWidgetSetLayout_Call { - _c.Call.Return(run) - return _c -} - -// BlockWidgetSetLimit provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockWidgetSetLimit(_a0 context.Context, _a1 *pb.RpcBlockWidgetSetLimitRequest) *pb.RpcBlockWidgetSetLimitResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockWidgetSetLimit") - } - - var r0 *pb.RpcBlockWidgetSetLimitResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockWidgetSetLimitRequest) *pb.RpcBlockWidgetSetLimitResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockWidgetSetLimitResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockWidgetSetLimit_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockWidgetSetLimit' -type MockClientCommandsServer_BlockWidgetSetLimit_Call struct { - *mock.Call -} - -// BlockWidgetSetLimit is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockWidgetSetLimitRequest -func (_e *MockClientCommandsServer_Expecter) BlockWidgetSetLimit(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockWidgetSetLimit_Call { - return &MockClientCommandsServer_BlockWidgetSetLimit_Call{Call: _e.mock.On("BlockWidgetSetLimit", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockWidgetSetLimit_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockWidgetSetLimitRequest)) *MockClientCommandsServer_BlockWidgetSetLimit_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockWidgetSetLimitRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockWidgetSetLimit_Call) Return(_a0 *pb.RpcBlockWidgetSetLimitResponse) *MockClientCommandsServer_BlockWidgetSetLimit_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockWidgetSetLimit_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockWidgetSetLimitRequest) *pb.RpcBlockWidgetSetLimitResponse) *MockClientCommandsServer_BlockWidgetSetLimit_Call { - _c.Call.Return(run) - return _c -} - -// BlockWidgetSetTargetId provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockWidgetSetTargetId(_a0 context.Context, _a1 *pb.RpcBlockWidgetSetTargetIdRequest) *pb.RpcBlockWidgetSetTargetIdResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockWidgetSetTargetId") - } - - var r0 *pb.RpcBlockWidgetSetTargetIdResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockWidgetSetTargetIdRequest) *pb.RpcBlockWidgetSetTargetIdResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockWidgetSetTargetIdResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockWidgetSetTargetId_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockWidgetSetTargetId' -type MockClientCommandsServer_BlockWidgetSetTargetId_Call struct { - *mock.Call -} - -// BlockWidgetSetTargetId is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockWidgetSetTargetIdRequest -func (_e *MockClientCommandsServer_Expecter) BlockWidgetSetTargetId(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockWidgetSetTargetId_Call { - return &MockClientCommandsServer_BlockWidgetSetTargetId_Call{Call: _e.mock.On("BlockWidgetSetTargetId", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockWidgetSetTargetId_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockWidgetSetTargetIdRequest)) *MockClientCommandsServer_BlockWidgetSetTargetId_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockWidgetSetTargetIdRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockWidgetSetTargetId_Call) Return(_a0 *pb.RpcBlockWidgetSetTargetIdResponse) *MockClientCommandsServer_BlockWidgetSetTargetId_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockWidgetSetTargetId_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockWidgetSetTargetIdRequest) *pb.RpcBlockWidgetSetTargetIdResponse) *MockClientCommandsServer_BlockWidgetSetTargetId_Call { - _c.Call.Return(run) - return _c -} - -// BlockWidgetSetViewId provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BlockWidgetSetViewId(_a0 context.Context, _a1 *pb.RpcBlockWidgetSetViewIdRequest) *pb.RpcBlockWidgetSetViewIdResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BlockWidgetSetViewId") - } - - var r0 *pb.RpcBlockWidgetSetViewIdResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockWidgetSetViewIdRequest) *pb.RpcBlockWidgetSetViewIdResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBlockWidgetSetViewIdResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BlockWidgetSetViewId_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockWidgetSetViewId' -type MockClientCommandsServer_BlockWidgetSetViewId_Call struct { - *mock.Call -} - -// BlockWidgetSetViewId is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBlockWidgetSetViewIdRequest -func (_e *MockClientCommandsServer_Expecter) BlockWidgetSetViewId(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockWidgetSetViewId_Call { - return &MockClientCommandsServer_BlockWidgetSetViewId_Call{Call: _e.mock.On("BlockWidgetSetViewId", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BlockWidgetSetViewId_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockWidgetSetViewIdRequest)) *MockClientCommandsServer_BlockWidgetSetViewId_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBlockWidgetSetViewIdRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BlockWidgetSetViewId_Call) Return(_a0 *pb.RpcBlockWidgetSetViewIdResponse) *MockClientCommandsServer_BlockWidgetSetViewId_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BlockWidgetSetViewId_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockWidgetSetViewIdRequest) *pb.RpcBlockWidgetSetViewIdResponse) *MockClientCommandsServer_BlockWidgetSetViewId_Call { - _c.Call.Return(run) - return _c -} - -// BroadcastPayloadEvent provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) BroadcastPayloadEvent(_a0 context.Context, _a1 *pb.RpcBroadcastPayloadEventRequest) *pb.RpcBroadcastPayloadEventResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for BroadcastPayloadEvent") - } - - var r0 *pb.RpcBroadcastPayloadEventResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBroadcastPayloadEventRequest) *pb.RpcBroadcastPayloadEventResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcBroadcastPayloadEventResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_BroadcastPayloadEvent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BroadcastPayloadEvent' -type MockClientCommandsServer_BroadcastPayloadEvent_Call struct { - *mock.Call -} - -// BroadcastPayloadEvent is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcBroadcastPayloadEventRequest -func (_e *MockClientCommandsServer_Expecter) BroadcastPayloadEvent(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BroadcastPayloadEvent_Call { - return &MockClientCommandsServer_BroadcastPayloadEvent_Call{Call: _e.mock.On("BroadcastPayloadEvent", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_BroadcastPayloadEvent_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBroadcastPayloadEventRequest)) *MockClientCommandsServer_BroadcastPayloadEvent_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcBroadcastPayloadEventRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_BroadcastPayloadEvent_Call) Return(_a0 *pb.RpcBroadcastPayloadEventResponse) *MockClientCommandsServer_BroadcastPayloadEvent_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_BroadcastPayloadEvent_Call) RunAndReturn(run func(context.Context, *pb.RpcBroadcastPayloadEventRequest) *pb.RpcBroadcastPayloadEventResponse) *MockClientCommandsServer_BroadcastPayloadEvent_Call { - _c.Call.Return(run) - return _c -} - -// ChatAddMessage provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ChatAddMessage(_a0 context.Context, _a1 *pb.RpcChatAddMessageRequest) *pb.RpcChatAddMessageResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ChatAddMessage") - } - - var r0 *pb.RpcChatAddMessageResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcChatAddMessageRequest) *pb.RpcChatAddMessageResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcChatAddMessageResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ChatAddMessage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChatAddMessage' -type MockClientCommandsServer_ChatAddMessage_Call struct { - *mock.Call -} - -// ChatAddMessage is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcChatAddMessageRequest -func (_e *MockClientCommandsServer_Expecter) ChatAddMessage(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ChatAddMessage_Call { - return &MockClientCommandsServer_ChatAddMessage_Call{Call: _e.mock.On("ChatAddMessage", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ChatAddMessage_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcChatAddMessageRequest)) *MockClientCommandsServer_ChatAddMessage_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcChatAddMessageRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ChatAddMessage_Call) Return(_a0 *pb.RpcChatAddMessageResponse) *MockClientCommandsServer_ChatAddMessage_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ChatAddMessage_Call) RunAndReturn(run func(context.Context, *pb.RpcChatAddMessageRequest) *pb.RpcChatAddMessageResponse) *MockClientCommandsServer_ChatAddMessage_Call { - _c.Call.Return(run) - return _c -} - -// ChatDeleteMessage provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ChatDeleteMessage(_a0 context.Context, _a1 *pb.RpcChatDeleteMessageRequest) *pb.RpcChatDeleteMessageResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ChatDeleteMessage") - } - - var r0 *pb.RpcChatDeleteMessageResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcChatDeleteMessageRequest) *pb.RpcChatDeleteMessageResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcChatDeleteMessageResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ChatDeleteMessage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChatDeleteMessage' -type MockClientCommandsServer_ChatDeleteMessage_Call struct { - *mock.Call -} - -// ChatDeleteMessage is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcChatDeleteMessageRequest -func (_e *MockClientCommandsServer_Expecter) ChatDeleteMessage(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ChatDeleteMessage_Call { - return &MockClientCommandsServer_ChatDeleteMessage_Call{Call: _e.mock.On("ChatDeleteMessage", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ChatDeleteMessage_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcChatDeleteMessageRequest)) *MockClientCommandsServer_ChatDeleteMessage_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcChatDeleteMessageRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ChatDeleteMessage_Call) Return(_a0 *pb.RpcChatDeleteMessageResponse) *MockClientCommandsServer_ChatDeleteMessage_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ChatDeleteMessage_Call) RunAndReturn(run func(context.Context, *pb.RpcChatDeleteMessageRequest) *pb.RpcChatDeleteMessageResponse) *MockClientCommandsServer_ChatDeleteMessage_Call { - _c.Call.Return(run) - return _c -} - -// ChatEditMessageContent provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ChatEditMessageContent(_a0 context.Context, _a1 *pb.RpcChatEditMessageContentRequest) *pb.RpcChatEditMessageContentResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ChatEditMessageContent") - } - - var r0 *pb.RpcChatEditMessageContentResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcChatEditMessageContentRequest) *pb.RpcChatEditMessageContentResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcChatEditMessageContentResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ChatEditMessageContent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChatEditMessageContent' -type MockClientCommandsServer_ChatEditMessageContent_Call struct { - *mock.Call -} - -// ChatEditMessageContent is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcChatEditMessageContentRequest -func (_e *MockClientCommandsServer_Expecter) ChatEditMessageContent(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ChatEditMessageContent_Call { - return &MockClientCommandsServer_ChatEditMessageContent_Call{Call: _e.mock.On("ChatEditMessageContent", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ChatEditMessageContent_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcChatEditMessageContentRequest)) *MockClientCommandsServer_ChatEditMessageContent_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcChatEditMessageContentRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ChatEditMessageContent_Call) Return(_a0 *pb.RpcChatEditMessageContentResponse) *MockClientCommandsServer_ChatEditMessageContent_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ChatEditMessageContent_Call) RunAndReturn(run func(context.Context, *pb.RpcChatEditMessageContentRequest) *pb.RpcChatEditMessageContentResponse) *MockClientCommandsServer_ChatEditMessageContent_Call { - _c.Call.Return(run) - return _c -} - -// ChatGetMessages provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ChatGetMessages(_a0 context.Context, _a1 *pb.RpcChatGetMessagesRequest) *pb.RpcChatGetMessagesResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ChatGetMessages") - } - - var r0 *pb.RpcChatGetMessagesResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcChatGetMessagesRequest) *pb.RpcChatGetMessagesResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcChatGetMessagesResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ChatGetMessages_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChatGetMessages' -type MockClientCommandsServer_ChatGetMessages_Call struct { - *mock.Call -} - -// ChatGetMessages is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcChatGetMessagesRequest -func (_e *MockClientCommandsServer_Expecter) ChatGetMessages(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ChatGetMessages_Call { - return &MockClientCommandsServer_ChatGetMessages_Call{Call: _e.mock.On("ChatGetMessages", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ChatGetMessages_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcChatGetMessagesRequest)) *MockClientCommandsServer_ChatGetMessages_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcChatGetMessagesRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ChatGetMessages_Call) Return(_a0 *pb.RpcChatGetMessagesResponse) *MockClientCommandsServer_ChatGetMessages_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ChatGetMessages_Call) RunAndReturn(run func(context.Context, *pb.RpcChatGetMessagesRequest) *pb.RpcChatGetMessagesResponse) *MockClientCommandsServer_ChatGetMessages_Call { - _c.Call.Return(run) - return _c -} - -// ChatGetMessagesByIds provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ChatGetMessagesByIds(_a0 context.Context, _a1 *pb.RpcChatGetMessagesByIdsRequest) *pb.RpcChatGetMessagesByIdsResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ChatGetMessagesByIds") - } - - var r0 *pb.RpcChatGetMessagesByIdsResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcChatGetMessagesByIdsRequest) *pb.RpcChatGetMessagesByIdsResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcChatGetMessagesByIdsResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ChatGetMessagesByIds_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChatGetMessagesByIds' -type MockClientCommandsServer_ChatGetMessagesByIds_Call struct { - *mock.Call -} - -// ChatGetMessagesByIds is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcChatGetMessagesByIdsRequest -func (_e *MockClientCommandsServer_Expecter) ChatGetMessagesByIds(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ChatGetMessagesByIds_Call { - return &MockClientCommandsServer_ChatGetMessagesByIds_Call{Call: _e.mock.On("ChatGetMessagesByIds", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ChatGetMessagesByIds_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcChatGetMessagesByIdsRequest)) *MockClientCommandsServer_ChatGetMessagesByIds_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcChatGetMessagesByIdsRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ChatGetMessagesByIds_Call) Return(_a0 *pb.RpcChatGetMessagesByIdsResponse) *MockClientCommandsServer_ChatGetMessagesByIds_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ChatGetMessagesByIds_Call) RunAndReturn(run func(context.Context, *pb.RpcChatGetMessagesByIdsRequest) *pb.RpcChatGetMessagesByIdsResponse) *MockClientCommandsServer_ChatGetMessagesByIds_Call { - _c.Call.Return(run) - return _c -} - -// ChatReadMessages provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ChatReadMessages(_a0 context.Context, _a1 *pb.RpcChatReadMessagesRequest) *pb.RpcChatReadMessagesResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ChatReadMessages") - } - - var r0 *pb.RpcChatReadMessagesResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcChatReadMessagesRequest) *pb.RpcChatReadMessagesResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcChatReadMessagesResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ChatReadMessages_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChatReadMessages' -type MockClientCommandsServer_ChatReadMessages_Call struct { - *mock.Call -} - -// ChatReadMessages is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcChatReadMessagesRequest -func (_e *MockClientCommandsServer_Expecter) ChatReadMessages(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ChatReadMessages_Call { - return &MockClientCommandsServer_ChatReadMessages_Call{Call: _e.mock.On("ChatReadMessages", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ChatReadMessages_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcChatReadMessagesRequest)) *MockClientCommandsServer_ChatReadMessages_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcChatReadMessagesRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ChatReadMessages_Call) Return(_a0 *pb.RpcChatReadMessagesResponse) *MockClientCommandsServer_ChatReadMessages_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ChatReadMessages_Call) RunAndReturn(run func(context.Context, *pb.RpcChatReadMessagesRequest) *pb.RpcChatReadMessagesResponse) *MockClientCommandsServer_ChatReadMessages_Call { - _c.Call.Return(run) - return _c -} - -// ChatSubscribeLastMessages provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ChatSubscribeLastMessages(_a0 context.Context, _a1 *pb.RpcChatSubscribeLastMessagesRequest) *pb.RpcChatSubscribeLastMessagesResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ChatSubscribeLastMessages") - } - - var r0 *pb.RpcChatSubscribeLastMessagesResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcChatSubscribeLastMessagesRequest) *pb.RpcChatSubscribeLastMessagesResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcChatSubscribeLastMessagesResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ChatSubscribeLastMessages_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChatSubscribeLastMessages' -type MockClientCommandsServer_ChatSubscribeLastMessages_Call struct { - *mock.Call -} - -// ChatSubscribeLastMessages is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcChatSubscribeLastMessagesRequest -func (_e *MockClientCommandsServer_Expecter) ChatSubscribeLastMessages(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ChatSubscribeLastMessages_Call { - return &MockClientCommandsServer_ChatSubscribeLastMessages_Call{Call: _e.mock.On("ChatSubscribeLastMessages", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ChatSubscribeLastMessages_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcChatSubscribeLastMessagesRequest)) *MockClientCommandsServer_ChatSubscribeLastMessages_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcChatSubscribeLastMessagesRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ChatSubscribeLastMessages_Call) Return(_a0 *pb.RpcChatSubscribeLastMessagesResponse) *MockClientCommandsServer_ChatSubscribeLastMessages_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ChatSubscribeLastMessages_Call) RunAndReturn(run func(context.Context, *pb.RpcChatSubscribeLastMessagesRequest) *pb.RpcChatSubscribeLastMessagesResponse) *MockClientCommandsServer_ChatSubscribeLastMessages_Call { - _c.Call.Return(run) - return _c -} - -// ChatSubscribeToMessagePreviews provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ChatSubscribeToMessagePreviews(_a0 context.Context, _a1 *pb.RpcChatSubscribeToMessagePreviewsRequest) *pb.RpcChatSubscribeToMessagePreviewsResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ChatSubscribeToMessagePreviews") - } - - var r0 *pb.RpcChatSubscribeToMessagePreviewsResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcChatSubscribeToMessagePreviewsRequest) *pb.RpcChatSubscribeToMessagePreviewsResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcChatSubscribeToMessagePreviewsResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ChatSubscribeToMessagePreviews_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChatSubscribeToMessagePreviews' -type MockClientCommandsServer_ChatSubscribeToMessagePreviews_Call struct { - *mock.Call -} - -// ChatSubscribeToMessagePreviews is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcChatSubscribeToMessagePreviewsRequest -func (_e *MockClientCommandsServer_Expecter) ChatSubscribeToMessagePreviews(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ChatSubscribeToMessagePreviews_Call { - return &MockClientCommandsServer_ChatSubscribeToMessagePreviews_Call{Call: _e.mock.On("ChatSubscribeToMessagePreviews", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ChatSubscribeToMessagePreviews_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcChatSubscribeToMessagePreviewsRequest)) *MockClientCommandsServer_ChatSubscribeToMessagePreviews_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcChatSubscribeToMessagePreviewsRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ChatSubscribeToMessagePreviews_Call) Return(_a0 *pb.RpcChatSubscribeToMessagePreviewsResponse) *MockClientCommandsServer_ChatSubscribeToMessagePreviews_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ChatSubscribeToMessagePreviews_Call) RunAndReturn(run func(context.Context, *pb.RpcChatSubscribeToMessagePreviewsRequest) *pb.RpcChatSubscribeToMessagePreviewsResponse) *MockClientCommandsServer_ChatSubscribeToMessagePreviews_Call { - _c.Call.Return(run) - return _c -} - -// ChatToggleMessageReaction provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ChatToggleMessageReaction(_a0 context.Context, _a1 *pb.RpcChatToggleMessageReactionRequest) *pb.RpcChatToggleMessageReactionResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ChatToggleMessageReaction") - } - - var r0 *pb.RpcChatToggleMessageReactionResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcChatToggleMessageReactionRequest) *pb.RpcChatToggleMessageReactionResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcChatToggleMessageReactionResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ChatToggleMessageReaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChatToggleMessageReaction' -type MockClientCommandsServer_ChatToggleMessageReaction_Call struct { - *mock.Call -} - -// ChatToggleMessageReaction is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcChatToggleMessageReactionRequest -func (_e *MockClientCommandsServer_Expecter) ChatToggleMessageReaction(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ChatToggleMessageReaction_Call { - return &MockClientCommandsServer_ChatToggleMessageReaction_Call{Call: _e.mock.On("ChatToggleMessageReaction", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ChatToggleMessageReaction_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcChatToggleMessageReactionRequest)) *MockClientCommandsServer_ChatToggleMessageReaction_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcChatToggleMessageReactionRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ChatToggleMessageReaction_Call) Return(_a0 *pb.RpcChatToggleMessageReactionResponse) *MockClientCommandsServer_ChatToggleMessageReaction_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ChatToggleMessageReaction_Call) RunAndReturn(run func(context.Context, *pb.RpcChatToggleMessageReactionRequest) *pb.RpcChatToggleMessageReactionResponse) *MockClientCommandsServer_ChatToggleMessageReaction_Call { - _c.Call.Return(run) - return _c -} - -// ChatUnreadMessages provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ChatUnreadMessages(_a0 context.Context, _a1 *pb.RpcChatUnreadRequest) *pb.RpcChatUnreadResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ChatUnreadMessages") - } - - var r0 *pb.RpcChatUnreadResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcChatUnreadRequest) *pb.RpcChatUnreadResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcChatUnreadResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ChatUnreadMessages_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChatUnreadMessages' -type MockClientCommandsServer_ChatUnreadMessages_Call struct { - *mock.Call -} - -// ChatUnreadMessages is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcChatUnreadRequest -func (_e *MockClientCommandsServer_Expecter) ChatUnreadMessages(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ChatUnreadMessages_Call { - return &MockClientCommandsServer_ChatUnreadMessages_Call{Call: _e.mock.On("ChatUnreadMessages", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ChatUnreadMessages_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcChatUnreadRequest)) *MockClientCommandsServer_ChatUnreadMessages_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcChatUnreadRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ChatUnreadMessages_Call) Return(_a0 *pb.RpcChatUnreadResponse) *MockClientCommandsServer_ChatUnreadMessages_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ChatUnreadMessages_Call) RunAndReturn(run func(context.Context, *pb.RpcChatUnreadRequest) *pb.RpcChatUnreadResponse) *MockClientCommandsServer_ChatUnreadMessages_Call { - _c.Call.Return(run) - return _c -} - -// ChatUnsubscribe provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ChatUnsubscribe(_a0 context.Context, _a1 *pb.RpcChatUnsubscribeRequest) *pb.RpcChatUnsubscribeResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ChatUnsubscribe") - } - - var r0 *pb.RpcChatUnsubscribeResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcChatUnsubscribeRequest) *pb.RpcChatUnsubscribeResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcChatUnsubscribeResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ChatUnsubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChatUnsubscribe' -type MockClientCommandsServer_ChatUnsubscribe_Call struct { - *mock.Call -} - -// ChatUnsubscribe is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcChatUnsubscribeRequest -func (_e *MockClientCommandsServer_Expecter) ChatUnsubscribe(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ChatUnsubscribe_Call { - return &MockClientCommandsServer_ChatUnsubscribe_Call{Call: _e.mock.On("ChatUnsubscribe", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ChatUnsubscribe_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcChatUnsubscribeRequest)) *MockClientCommandsServer_ChatUnsubscribe_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcChatUnsubscribeRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ChatUnsubscribe_Call) Return(_a0 *pb.RpcChatUnsubscribeResponse) *MockClientCommandsServer_ChatUnsubscribe_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ChatUnsubscribe_Call) RunAndReturn(run func(context.Context, *pb.RpcChatUnsubscribeRequest) *pb.RpcChatUnsubscribeResponse) *MockClientCommandsServer_ChatUnsubscribe_Call { - _c.Call.Return(run) - return _c -} - -// ChatUnsubscribeFromMessagePreviews provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ChatUnsubscribeFromMessagePreviews(_a0 context.Context, _a1 *pb.RpcChatUnsubscribeFromMessagePreviewsRequest) *pb.RpcChatUnsubscribeFromMessagePreviewsResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ChatUnsubscribeFromMessagePreviews") - } - - var r0 *pb.RpcChatUnsubscribeFromMessagePreviewsResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcChatUnsubscribeFromMessagePreviewsRequest) *pb.RpcChatUnsubscribeFromMessagePreviewsResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcChatUnsubscribeFromMessagePreviewsResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ChatUnsubscribeFromMessagePreviews_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChatUnsubscribeFromMessagePreviews' -type MockClientCommandsServer_ChatUnsubscribeFromMessagePreviews_Call struct { - *mock.Call -} - -// ChatUnsubscribeFromMessagePreviews is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcChatUnsubscribeFromMessagePreviewsRequest -func (_e *MockClientCommandsServer_Expecter) ChatUnsubscribeFromMessagePreviews(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ChatUnsubscribeFromMessagePreviews_Call { - return &MockClientCommandsServer_ChatUnsubscribeFromMessagePreviews_Call{Call: _e.mock.On("ChatUnsubscribeFromMessagePreviews", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ChatUnsubscribeFromMessagePreviews_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcChatUnsubscribeFromMessagePreviewsRequest)) *MockClientCommandsServer_ChatUnsubscribeFromMessagePreviews_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcChatUnsubscribeFromMessagePreviewsRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ChatUnsubscribeFromMessagePreviews_Call) Return(_a0 *pb.RpcChatUnsubscribeFromMessagePreviewsResponse) *MockClientCommandsServer_ChatUnsubscribeFromMessagePreviews_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ChatUnsubscribeFromMessagePreviews_Call) RunAndReturn(run func(context.Context, *pb.RpcChatUnsubscribeFromMessagePreviewsRequest) *pb.RpcChatUnsubscribeFromMessagePreviewsResponse) *MockClientCommandsServer_ChatUnsubscribeFromMessagePreviews_Call { - _c.Call.Return(run) - return _c -} - -// DebugAccountSelectTrace provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) DebugAccountSelectTrace(_a0 context.Context, _a1 *pb.RpcDebugAccountSelectTraceRequest) *pb.RpcDebugAccountSelectTraceResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for DebugAccountSelectTrace") - } - - var r0 *pb.RpcDebugAccountSelectTraceResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugAccountSelectTraceRequest) *pb.RpcDebugAccountSelectTraceResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcDebugAccountSelectTraceResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_DebugAccountSelectTrace_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugAccountSelectTrace' -type MockClientCommandsServer_DebugAccountSelectTrace_Call struct { - *mock.Call -} - -// DebugAccountSelectTrace is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcDebugAccountSelectTraceRequest -func (_e *MockClientCommandsServer_Expecter) DebugAccountSelectTrace(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugAccountSelectTrace_Call { - return &MockClientCommandsServer_DebugAccountSelectTrace_Call{Call: _e.mock.On("DebugAccountSelectTrace", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_DebugAccountSelectTrace_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugAccountSelectTraceRequest)) *MockClientCommandsServer_DebugAccountSelectTrace_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcDebugAccountSelectTraceRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_DebugAccountSelectTrace_Call) Return(_a0 *pb.RpcDebugAccountSelectTraceResponse) *MockClientCommandsServer_DebugAccountSelectTrace_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_DebugAccountSelectTrace_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugAccountSelectTraceRequest) *pb.RpcDebugAccountSelectTraceResponse) *MockClientCommandsServer_DebugAccountSelectTrace_Call { - _c.Call.Return(run) - return _c -} - -// DebugAnystoreObjectChanges provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) DebugAnystoreObjectChanges(_a0 context.Context, _a1 *pb.RpcDebugAnystoreObjectChangesRequest) *pb.RpcDebugAnystoreObjectChangesResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for DebugAnystoreObjectChanges") - } - - var r0 *pb.RpcDebugAnystoreObjectChangesResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugAnystoreObjectChangesRequest) *pb.RpcDebugAnystoreObjectChangesResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcDebugAnystoreObjectChangesResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_DebugAnystoreObjectChanges_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugAnystoreObjectChanges' -type MockClientCommandsServer_DebugAnystoreObjectChanges_Call struct { - *mock.Call -} - -// DebugAnystoreObjectChanges is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcDebugAnystoreObjectChangesRequest -func (_e *MockClientCommandsServer_Expecter) DebugAnystoreObjectChanges(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugAnystoreObjectChanges_Call { - return &MockClientCommandsServer_DebugAnystoreObjectChanges_Call{Call: _e.mock.On("DebugAnystoreObjectChanges", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_DebugAnystoreObjectChanges_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugAnystoreObjectChangesRequest)) *MockClientCommandsServer_DebugAnystoreObjectChanges_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcDebugAnystoreObjectChangesRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_DebugAnystoreObjectChanges_Call) Return(_a0 *pb.RpcDebugAnystoreObjectChangesResponse) *MockClientCommandsServer_DebugAnystoreObjectChanges_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_DebugAnystoreObjectChanges_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugAnystoreObjectChangesRequest) *pb.RpcDebugAnystoreObjectChangesResponse) *MockClientCommandsServer_DebugAnystoreObjectChanges_Call { - _c.Call.Return(run) - return _c -} - -// DebugExportLocalstore provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) DebugExportLocalstore(_a0 context.Context, _a1 *pb.RpcDebugExportLocalstoreRequest) *pb.RpcDebugExportLocalstoreResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for DebugExportLocalstore") - } - - var r0 *pb.RpcDebugExportLocalstoreResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugExportLocalstoreRequest) *pb.RpcDebugExportLocalstoreResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcDebugExportLocalstoreResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_DebugExportLocalstore_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugExportLocalstore' -type MockClientCommandsServer_DebugExportLocalstore_Call struct { - *mock.Call -} - -// DebugExportLocalstore is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcDebugExportLocalstoreRequest -func (_e *MockClientCommandsServer_Expecter) DebugExportLocalstore(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugExportLocalstore_Call { - return &MockClientCommandsServer_DebugExportLocalstore_Call{Call: _e.mock.On("DebugExportLocalstore", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_DebugExportLocalstore_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugExportLocalstoreRequest)) *MockClientCommandsServer_DebugExportLocalstore_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcDebugExportLocalstoreRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_DebugExportLocalstore_Call) Return(_a0 *pb.RpcDebugExportLocalstoreResponse) *MockClientCommandsServer_DebugExportLocalstore_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_DebugExportLocalstore_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugExportLocalstoreRequest) *pb.RpcDebugExportLocalstoreResponse) *MockClientCommandsServer_DebugExportLocalstore_Call { - _c.Call.Return(run) - return _c -} - -// DebugExportLog provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) DebugExportLog(_a0 context.Context, _a1 *pb.RpcDebugExportLogRequest) *pb.RpcDebugExportLogResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for DebugExportLog") - } - - var r0 *pb.RpcDebugExportLogResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugExportLogRequest) *pb.RpcDebugExportLogResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcDebugExportLogResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_DebugExportLog_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugExportLog' -type MockClientCommandsServer_DebugExportLog_Call struct { - *mock.Call -} - -// DebugExportLog is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcDebugExportLogRequest -func (_e *MockClientCommandsServer_Expecter) DebugExportLog(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugExportLog_Call { - return &MockClientCommandsServer_DebugExportLog_Call{Call: _e.mock.On("DebugExportLog", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_DebugExportLog_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugExportLogRequest)) *MockClientCommandsServer_DebugExportLog_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcDebugExportLogRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_DebugExportLog_Call) Return(_a0 *pb.RpcDebugExportLogResponse) *MockClientCommandsServer_DebugExportLog_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_DebugExportLog_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugExportLogRequest) *pb.RpcDebugExportLogResponse) *MockClientCommandsServer_DebugExportLog_Call { - _c.Call.Return(run) - return _c -} - -// DebugNetCheck provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) DebugNetCheck(_a0 context.Context, _a1 *pb.RpcDebugNetCheckRequest) *pb.RpcDebugNetCheckResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for DebugNetCheck") - } - - var r0 *pb.RpcDebugNetCheckResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugNetCheckRequest) *pb.RpcDebugNetCheckResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcDebugNetCheckResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_DebugNetCheck_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugNetCheck' -type MockClientCommandsServer_DebugNetCheck_Call struct { - *mock.Call -} - -// DebugNetCheck is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcDebugNetCheckRequest -func (_e *MockClientCommandsServer_Expecter) DebugNetCheck(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugNetCheck_Call { - return &MockClientCommandsServer_DebugNetCheck_Call{Call: _e.mock.On("DebugNetCheck", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_DebugNetCheck_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugNetCheckRequest)) *MockClientCommandsServer_DebugNetCheck_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcDebugNetCheckRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_DebugNetCheck_Call) Return(_a0 *pb.RpcDebugNetCheckResponse) *MockClientCommandsServer_DebugNetCheck_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_DebugNetCheck_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugNetCheckRequest) *pb.RpcDebugNetCheckResponse) *MockClientCommandsServer_DebugNetCheck_Call { - _c.Call.Return(run) - return _c -} - -// DebugOpenedObjects provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) DebugOpenedObjects(_a0 context.Context, _a1 *pb.RpcDebugOpenedObjectsRequest) *pb.RpcDebugOpenedObjectsResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for DebugOpenedObjects") - } - - var r0 *pb.RpcDebugOpenedObjectsResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugOpenedObjectsRequest) *pb.RpcDebugOpenedObjectsResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcDebugOpenedObjectsResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_DebugOpenedObjects_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugOpenedObjects' -type MockClientCommandsServer_DebugOpenedObjects_Call struct { - *mock.Call -} - -// DebugOpenedObjects is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcDebugOpenedObjectsRequest -func (_e *MockClientCommandsServer_Expecter) DebugOpenedObjects(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugOpenedObjects_Call { - return &MockClientCommandsServer_DebugOpenedObjects_Call{Call: _e.mock.On("DebugOpenedObjects", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_DebugOpenedObjects_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugOpenedObjectsRequest)) *MockClientCommandsServer_DebugOpenedObjects_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcDebugOpenedObjectsRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_DebugOpenedObjects_Call) Return(_a0 *pb.RpcDebugOpenedObjectsResponse) *MockClientCommandsServer_DebugOpenedObjects_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_DebugOpenedObjects_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugOpenedObjectsRequest) *pb.RpcDebugOpenedObjectsResponse) *MockClientCommandsServer_DebugOpenedObjects_Call { - _c.Call.Return(run) - return _c -} - -// DebugPing provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) DebugPing(_a0 context.Context, _a1 *pb.RpcDebugPingRequest) *pb.RpcDebugPingResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for DebugPing") - } - - var r0 *pb.RpcDebugPingResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugPingRequest) *pb.RpcDebugPingResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcDebugPingResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_DebugPing_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugPing' -type MockClientCommandsServer_DebugPing_Call struct { - *mock.Call -} - -// DebugPing is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcDebugPingRequest -func (_e *MockClientCommandsServer_Expecter) DebugPing(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugPing_Call { - return &MockClientCommandsServer_DebugPing_Call{Call: _e.mock.On("DebugPing", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_DebugPing_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugPingRequest)) *MockClientCommandsServer_DebugPing_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcDebugPingRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_DebugPing_Call) Return(_a0 *pb.RpcDebugPingResponse) *MockClientCommandsServer_DebugPing_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_DebugPing_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugPingRequest) *pb.RpcDebugPingResponse) *MockClientCommandsServer_DebugPing_Call { - _c.Call.Return(run) - return _c -} - -// DebugRunProfiler provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) DebugRunProfiler(_a0 context.Context, _a1 *pb.RpcDebugRunProfilerRequest) *pb.RpcDebugRunProfilerResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for DebugRunProfiler") - } - - var r0 *pb.RpcDebugRunProfilerResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugRunProfilerRequest) *pb.RpcDebugRunProfilerResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcDebugRunProfilerResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_DebugRunProfiler_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugRunProfiler' -type MockClientCommandsServer_DebugRunProfiler_Call struct { - *mock.Call -} - -// DebugRunProfiler is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcDebugRunProfilerRequest -func (_e *MockClientCommandsServer_Expecter) DebugRunProfiler(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugRunProfiler_Call { - return &MockClientCommandsServer_DebugRunProfiler_Call{Call: _e.mock.On("DebugRunProfiler", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_DebugRunProfiler_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugRunProfilerRequest)) *MockClientCommandsServer_DebugRunProfiler_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcDebugRunProfilerRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_DebugRunProfiler_Call) Return(_a0 *pb.RpcDebugRunProfilerResponse) *MockClientCommandsServer_DebugRunProfiler_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_DebugRunProfiler_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugRunProfilerRequest) *pb.RpcDebugRunProfilerResponse) *MockClientCommandsServer_DebugRunProfiler_Call { - _c.Call.Return(run) - return _c -} - -// DebugSpaceSummary provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) DebugSpaceSummary(_a0 context.Context, _a1 *pb.RpcDebugSpaceSummaryRequest) *pb.RpcDebugSpaceSummaryResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for DebugSpaceSummary") - } - - var r0 *pb.RpcDebugSpaceSummaryResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugSpaceSummaryRequest) *pb.RpcDebugSpaceSummaryResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcDebugSpaceSummaryResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_DebugSpaceSummary_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugSpaceSummary' -type MockClientCommandsServer_DebugSpaceSummary_Call struct { - *mock.Call -} - -// DebugSpaceSummary is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcDebugSpaceSummaryRequest -func (_e *MockClientCommandsServer_Expecter) DebugSpaceSummary(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugSpaceSummary_Call { - return &MockClientCommandsServer_DebugSpaceSummary_Call{Call: _e.mock.On("DebugSpaceSummary", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_DebugSpaceSummary_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugSpaceSummaryRequest)) *MockClientCommandsServer_DebugSpaceSummary_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcDebugSpaceSummaryRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_DebugSpaceSummary_Call) Return(_a0 *pb.RpcDebugSpaceSummaryResponse) *MockClientCommandsServer_DebugSpaceSummary_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_DebugSpaceSummary_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugSpaceSummaryRequest) *pb.RpcDebugSpaceSummaryResponse) *MockClientCommandsServer_DebugSpaceSummary_Call { - _c.Call.Return(run) - return _c -} - -// DebugStackGoroutines provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) DebugStackGoroutines(_a0 context.Context, _a1 *pb.RpcDebugStackGoroutinesRequest) *pb.RpcDebugStackGoroutinesResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for DebugStackGoroutines") - } - - var r0 *pb.RpcDebugStackGoroutinesResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugStackGoroutinesRequest) *pb.RpcDebugStackGoroutinesResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcDebugStackGoroutinesResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_DebugStackGoroutines_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugStackGoroutines' -type MockClientCommandsServer_DebugStackGoroutines_Call struct { - *mock.Call -} - -// DebugStackGoroutines is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcDebugStackGoroutinesRequest -func (_e *MockClientCommandsServer_Expecter) DebugStackGoroutines(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugStackGoroutines_Call { - return &MockClientCommandsServer_DebugStackGoroutines_Call{Call: _e.mock.On("DebugStackGoroutines", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_DebugStackGoroutines_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugStackGoroutinesRequest)) *MockClientCommandsServer_DebugStackGoroutines_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcDebugStackGoroutinesRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_DebugStackGoroutines_Call) Return(_a0 *pb.RpcDebugStackGoroutinesResponse) *MockClientCommandsServer_DebugStackGoroutines_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_DebugStackGoroutines_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugStackGoroutinesRequest) *pb.RpcDebugStackGoroutinesResponse) *MockClientCommandsServer_DebugStackGoroutines_Call { - _c.Call.Return(run) - return _c -} - -// DebugStat provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) DebugStat(_a0 context.Context, _a1 *pb.RpcDebugStatRequest) *pb.RpcDebugStatResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for DebugStat") - } - - var r0 *pb.RpcDebugStatResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugStatRequest) *pb.RpcDebugStatResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcDebugStatResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_DebugStat_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugStat' -type MockClientCommandsServer_DebugStat_Call struct { - *mock.Call -} - -// DebugStat is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcDebugStatRequest -func (_e *MockClientCommandsServer_Expecter) DebugStat(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugStat_Call { - return &MockClientCommandsServer_DebugStat_Call{Call: _e.mock.On("DebugStat", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_DebugStat_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugStatRequest)) *MockClientCommandsServer_DebugStat_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcDebugStatRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_DebugStat_Call) Return(_a0 *pb.RpcDebugStatResponse) *MockClientCommandsServer_DebugStat_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_DebugStat_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugStatRequest) *pb.RpcDebugStatResponse) *MockClientCommandsServer_DebugStat_Call { - _c.Call.Return(run) - return _c -} - -// DebugSubscriptions provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) DebugSubscriptions(_a0 context.Context, _a1 *pb.RpcDebugSubscriptionsRequest) *pb.RpcDebugSubscriptionsResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for DebugSubscriptions") - } - - var r0 *pb.RpcDebugSubscriptionsResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugSubscriptionsRequest) *pb.RpcDebugSubscriptionsResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcDebugSubscriptionsResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_DebugSubscriptions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugSubscriptions' -type MockClientCommandsServer_DebugSubscriptions_Call struct { - *mock.Call -} - -// DebugSubscriptions is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcDebugSubscriptionsRequest -func (_e *MockClientCommandsServer_Expecter) DebugSubscriptions(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugSubscriptions_Call { - return &MockClientCommandsServer_DebugSubscriptions_Call{Call: _e.mock.On("DebugSubscriptions", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_DebugSubscriptions_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugSubscriptionsRequest)) *MockClientCommandsServer_DebugSubscriptions_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcDebugSubscriptionsRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_DebugSubscriptions_Call) Return(_a0 *pb.RpcDebugSubscriptionsResponse) *MockClientCommandsServer_DebugSubscriptions_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_DebugSubscriptions_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugSubscriptionsRequest) *pb.RpcDebugSubscriptionsResponse) *MockClientCommandsServer_DebugSubscriptions_Call { - _c.Call.Return(run) - return _c -} - -// DebugTree provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) DebugTree(_a0 context.Context, _a1 *pb.RpcDebugTreeRequest) *pb.RpcDebugTreeResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for DebugTree") - } - - var r0 *pb.RpcDebugTreeResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugTreeRequest) *pb.RpcDebugTreeResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcDebugTreeResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_DebugTree_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugTree' -type MockClientCommandsServer_DebugTree_Call struct { - *mock.Call -} - -// DebugTree is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcDebugTreeRequest -func (_e *MockClientCommandsServer_Expecter) DebugTree(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugTree_Call { - return &MockClientCommandsServer_DebugTree_Call{Call: _e.mock.On("DebugTree", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_DebugTree_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugTreeRequest)) *MockClientCommandsServer_DebugTree_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcDebugTreeRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_DebugTree_Call) Return(_a0 *pb.RpcDebugTreeResponse) *MockClientCommandsServer_DebugTree_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_DebugTree_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugTreeRequest) *pb.RpcDebugTreeResponse) *MockClientCommandsServer_DebugTree_Call { - _c.Call.Return(run) - return _c -} - -// DebugTreeHeads provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) DebugTreeHeads(_a0 context.Context, _a1 *pb.RpcDebugTreeHeadsRequest) *pb.RpcDebugTreeHeadsResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for DebugTreeHeads") - } - - var r0 *pb.RpcDebugTreeHeadsResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugTreeHeadsRequest) *pb.RpcDebugTreeHeadsResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcDebugTreeHeadsResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_DebugTreeHeads_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugTreeHeads' -type MockClientCommandsServer_DebugTreeHeads_Call struct { - *mock.Call -} - -// DebugTreeHeads is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcDebugTreeHeadsRequest -func (_e *MockClientCommandsServer_Expecter) DebugTreeHeads(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugTreeHeads_Call { - return &MockClientCommandsServer_DebugTreeHeads_Call{Call: _e.mock.On("DebugTreeHeads", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_DebugTreeHeads_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugTreeHeadsRequest)) *MockClientCommandsServer_DebugTreeHeads_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcDebugTreeHeadsRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_DebugTreeHeads_Call) Return(_a0 *pb.RpcDebugTreeHeadsResponse) *MockClientCommandsServer_DebugTreeHeads_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_DebugTreeHeads_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugTreeHeadsRequest) *pb.RpcDebugTreeHeadsResponse) *MockClientCommandsServer_DebugTreeHeads_Call { - _c.Call.Return(run) - return _c -} - -// DeviceList provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) DeviceList(_a0 context.Context, _a1 *pb.RpcDeviceListRequest) *pb.RpcDeviceListResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for DeviceList") - } - - var r0 *pb.RpcDeviceListResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDeviceListRequest) *pb.RpcDeviceListResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcDeviceListResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_DeviceList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeviceList' -type MockClientCommandsServer_DeviceList_Call struct { - *mock.Call -} - -// DeviceList is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcDeviceListRequest -func (_e *MockClientCommandsServer_Expecter) DeviceList(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DeviceList_Call { - return &MockClientCommandsServer_DeviceList_Call{Call: _e.mock.On("DeviceList", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_DeviceList_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDeviceListRequest)) *MockClientCommandsServer_DeviceList_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcDeviceListRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_DeviceList_Call) Return(_a0 *pb.RpcDeviceListResponse) *MockClientCommandsServer_DeviceList_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_DeviceList_Call) RunAndReturn(run func(context.Context, *pb.RpcDeviceListRequest) *pb.RpcDeviceListResponse) *MockClientCommandsServer_DeviceList_Call { - _c.Call.Return(run) - return _c -} - -// DeviceNetworkStateSet provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) DeviceNetworkStateSet(_a0 context.Context, _a1 *pb.RpcDeviceNetworkStateSetRequest) *pb.RpcDeviceNetworkStateSetResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for DeviceNetworkStateSet") - } - - var r0 *pb.RpcDeviceNetworkStateSetResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDeviceNetworkStateSetRequest) *pb.RpcDeviceNetworkStateSetResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcDeviceNetworkStateSetResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_DeviceNetworkStateSet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeviceNetworkStateSet' -type MockClientCommandsServer_DeviceNetworkStateSet_Call struct { - *mock.Call -} - -// DeviceNetworkStateSet is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcDeviceNetworkStateSetRequest -func (_e *MockClientCommandsServer_Expecter) DeviceNetworkStateSet(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DeviceNetworkStateSet_Call { - return &MockClientCommandsServer_DeviceNetworkStateSet_Call{Call: _e.mock.On("DeviceNetworkStateSet", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_DeviceNetworkStateSet_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDeviceNetworkStateSetRequest)) *MockClientCommandsServer_DeviceNetworkStateSet_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcDeviceNetworkStateSetRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_DeviceNetworkStateSet_Call) Return(_a0 *pb.RpcDeviceNetworkStateSetResponse) *MockClientCommandsServer_DeviceNetworkStateSet_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_DeviceNetworkStateSet_Call) RunAndReturn(run func(context.Context, *pb.RpcDeviceNetworkStateSetRequest) *pb.RpcDeviceNetworkStateSetResponse) *MockClientCommandsServer_DeviceNetworkStateSet_Call { - _c.Call.Return(run) - return _c -} - -// DeviceSetName provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) DeviceSetName(_a0 context.Context, _a1 *pb.RpcDeviceSetNameRequest) *pb.RpcDeviceSetNameResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for DeviceSetName") - } - - var r0 *pb.RpcDeviceSetNameResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDeviceSetNameRequest) *pb.RpcDeviceSetNameResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcDeviceSetNameResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_DeviceSetName_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeviceSetName' -type MockClientCommandsServer_DeviceSetName_Call struct { - *mock.Call -} - -// DeviceSetName is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcDeviceSetNameRequest -func (_e *MockClientCommandsServer_Expecter) DeviceSetName(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DeviceSetName_Call { - return &MockClientCommandsServer_DeviceSetName_Call{Call: _e.mock.On("DeviceSetName", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_DeviceSetName_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDeviceSetNameRequest)) *MockClientCommandsServer_DeviceSetName_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcDeviceSetNameRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_DeviceSetName_Call) Return(_a0 *pb.RpcDeviceSetNameResponse) *MockClientCommandsServer_DeviceSetName_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_DeviceSetName_Call) RunAndReturn(run func(context.Context, *pb.RpcDeviceSetNameRequest) *pb.RpcDeviceSetNameResponse) *MockClientCommandsServer_DeviceSetName_Call { - _c.Call.Return(run) - return _c -} - -// FileDownload provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) FileDownload(_a0 context.Context, _a1 *pb.RpcFileDownloadRequest) *pb.RpcFileDownloadResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for FileDownload") - } - - var r0 *pb.RpcFileDownloadResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcFileDownloadRequest) *pb.RpcFileDownloadResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcFileDownloadResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_FileDownload_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FileDownload' -type MockClientCommandsServer_FileDownload_Call struct { - *mock.Call -} - -// FileDownload is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcFileDownloadRequest -func (_e *MockClientCommandsServer_Expecter) FileDownload(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_FileDownload_Call { - return &MockClientCommandsServer_FileDownload_Call{Call: _e.mock.On("FileDownload", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_FileDownload_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcFileDownloadRequest)) *MockClientCommandsServer_FileDownload_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcFileDownloadRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_FileDownload_Call) Return(_a0 *pb.RpcFileDownloadResponse) *MockClientCommandsServer_FileDownload_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_FileDownload_Call) RunAndReturn(run func(context.Context, *pb.RpcFileDownloadRequest) *pb.RpcFileDownloadResponse) *MockClientCommandsServer_FileDownload_Call { - _c.Call.Return(run) - return _c -} - -// FileDrop provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) FileDrop(_a0 context.Context, _a1 *pb.RpcFileDropRequest) *pb.RpcFileDropResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for FileDrop") - } - - var r0 *pb.RpcFileDropResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcFileDropRequest) *pb.RpcFileDropResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcFileDropResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_FileDrop_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FileDrop' -type MockClientCommandsServer_FileDrop_Call struct { - *mock.Call -} - -// FileDrop is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcFileDropRequest -func (_e *MockClientCommandsServer_Expecter) FileDrop(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_FileDrop_Call { - return &MockClientCommandsServer_FileDrop_Call{Call: _e.mock.On("FileDrop", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_FileDrop_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcFileDropRequest)) *MockClientCommandsServer_FileDrop_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcFileDropRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_FileDrop_Call) Return(_a0 *pb.RpcFileDropResponse) *MockClientCommandsServer_FileDrop_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_FileDrop_Call) RunAndReturn(run func(context.Context, *pb.RpcFileDropRequest) *pb.RpcFileDropResponse) *MockClientCommandsServer_FileDrop_Call { - _c.Call.Return(run) - return _c -} - -// FileListOffload provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) FileListOffload(_a0 context.Context, _a1 *pb.RpcFileListOffloadRequest) *pb.RpcFileListOffloadResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for FileListOffload") - } - - var r0 *pb.RpcFileListOffloadResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcFileListOffloadRequest) *pb.RpcFileListOffloadResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcFileListOffloadResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_FileListOffload_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FileListOffload' -type MockClientCommandsServer_FileListOffload_Call struct { - *mock.Call -} - -// FileListOffload is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcFileListOffloadRequest -func (_e *MockClientCommandsServer_Expecter) FileListOffload(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_FileListOffload_Call { - return &MockClientCommandsServer_FileListOffload_Call{Call: _e.mock.On("FileListOffload", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_FileListOffload_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcFileListOffloadRequest)) *MockClientCommandsServer_FileListOffload_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcFileListOffloadRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_FileListOffload_Call) Return(_a0 *pb.RpcFileListOffloadResponse) *MockClientCommandsServer_FileListOffload_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_FileListOffload_Call) RunAndReturn(run func(context.Context, *pb.RpcFileListOffloadRequest) *pb.RpcFileListOffloadResponse) *MockClientCommandsServer_FileListOffload_Call { - _c.Call.Return(run) - return _c -} - -// FileNodeUsage provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) FileNodeUsage(_a0 context.Context, _a1 *pb.RpcFileNodeUsageRequest) *pb.RpcFileNodeUsageResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for FileNodeUsage") - } - - var r0 *pb.RpcFileNodeUsageResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcFileNodeUsageRequest) *pb.RpcFileNodeUsageResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcFileNodeUsageResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_FileNodeUsage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FileNodeUsage' -type MockClientCommandsServer_FileNodeUsage_Call struct { - *mock.Call -} - -// FileNodeUsage is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcFileNodeUsageRequest -func (_e *MockClientCommandsServer_Expecter) FileNodeUsage(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_FileNodeUsage_Call { - return &MockClientCommandsServer_FileNodeUsage_Call{Call: _e.mock.On("FileNodeUsage", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_FileNodeUsage_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcFileNodeUsageRequest)) *MockClientCommandsServer_FileNodeUsage_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcFileNodeUsageRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_FileNodeUsage_Call) Return(_a0 *pb.RpcFileNodeUsageResponse) *MockClientCommandsServer_FileNodeUsage_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_FileNodeUsage_Call) RunAndReturn(run func(context.Context, *pb.RpcFileNodeUsageRequest) *pb.RpcFileNodeUsageResponse) *MockClientCommandsServer_FileNodeUsage_Call { - _c.Call.Return(run) - return _c -} - -// FileReconcile provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) FileReconcile(_a0 context.Context, _a1 *pb.RpcFileReconcileRequest) *pb.RpcFileReconcileResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for FileReconcile") - } - - var r0 *pb.RpcFileReconcileResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcFileReconcileRequest) *pb.RpcFileReconcileResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcFileReconcileResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_FileReconcile_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FileReconcile' -type MockClientCommandsServer_FileReconcile_Call struct { - *mock.Call -} - -// FileReconcile is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcFileReconcileRequest -func (_e *MockClientCommandsServer_Expecter) FileReconcile(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_FileReconcile_Call { - return &MockClientCommandsServer_FileReconcile_Call{Call: _e.mock.On("FileReconcile", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_FileReconcile_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcFileReconcileRequest)) *MockClientCommandsServer_FileReconcile_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcFileReconcileRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_FileReconcile_Call) Return(_a0 *pb.RpcFileReconcileResponse) *MockClientCommandsServer_FileReconcile_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_FileReconcile_Call) RunAndReturn(run func(context.Context, *pb.RpcFileReconcileRequest) *pb.RpcFileReconcileResponse) *MockClientCommandsServer_FileReconcile_Call { - _c.Call.Return(run) - return _c -} - -// FileSpaceOffload provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) FileSpaceOffload(_a0 context.Context, _a1 *pb.RpcFileSpaceOffloadRequest) *pb.RpcFileSpaceOffloadResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for FileSpaceOffload") - } - - var r0 *pb.RpcFileSpaceOffloadResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcFileSpaceOffloadRequest) *pb.RpcFileSpaceOffloadResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcFileSpaceOffloadResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_FileSpaceOffload_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FileSpaceOffload' -type MockClientCommandsServer_FileSpaceOffload_Call struct { - *mock.Call -} - -// FileSpaceOffload is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcFileSpaceOffloadRequest -func (_e *MockClientCommandsServer_Expecter) FileSpaceOffload(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_FileSpaceOffload_Call { - return &MockClientCommandsServer_FileSpaceOffload_Call{Call: _e.mock.On("FileSpaceOffload", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_FileSpaceOffload_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcFileSpaceOffloadRequest)) *MockClientCommandsServer_FileSpaceOffload_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcFileSpaceOffloadRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_FileSpaceOffload_Call) Return(_a0 *pb.RpcFileSpaceOffloadResponse) *MockClientCommandsServer_FileSpaceOffload_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_FileSpaceOffload_Call) RunAndReturn(run func(context.Context, *pb.RpcFileSpaceOffloadRequest) *pb.RpcFileSpaceOffloadResponse) *MockClientCommandsServer_FileSpaceOffload_Call { - _c.Call.Return(run) - return _c -} - -// FileSpaceUsage provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) FileSpaceUsage(_a0 context.Context, _a1 *pb.RpcFileSpaceUsageRequest) *pb.RpcFileSpaceUsageResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for FileSpaceUsage") - } - - var r0 *pb.RpcFileSpaceUsageResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcFileSpaceUsageRequest) *pb.RpcFileSpaceUsageResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcFileSpaceUsageResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_FileSpaceUsage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FileSpaceUsage' -type MockClientCommandsServer_FileSpaceUsage_Call struct { - *mock.Call -} - -// FileSpaceUsage is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcFileSpaceUsageRequest -func (_e *MockClientCommandsServer_Expecter) FileSpaceUsage(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_FileSpaceUsage_Call { - return &MockClientCommandsServer_FileSpaceUsage_Call{Call: _e.mock.On("FileSpaceUsage", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_FileSpaceUsage_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcFileSpaceUsageRequest)) *MockClientCommandsServer_FileSpaceUsage_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcFileSpaceUsageRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_FileSpaceUsage_Call) Return(_a0 *pb.RpcFileSpaceUsageResponse) *MockClientCommandsServer_FileSpaceUsage_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_FileSpaceUsage_Call) RunAndReturn(run func(context.Context, *pb.RpcFileSpaceUsageRequest) *pb.RpcFileSpaceUsageResponse) *MockClientCommandsServer_FileSpaceUsage_Call { - _c.Call.Return(run) - return _c -} - -// FileUpload provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) FileUpload(_a0 context.Context, _a1 *pb.RpcFileUploadRequest) *pb.RpcFileUploadResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for FileUpload") - } - - var r0 *pb.RpcFileUploadResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcFileUploadRequest) *pb.RpcFileUploadResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcFileUploadResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_FileUpload_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FileUpload' -type MockClientCommandsServer_FileUpload_Call struct { - *mock.Call -} - -// FileUpload is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcFileUploadRequest -func (_e *MockClientCommandsServer_Expecter) FileUpload(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_FileUpload_Call { - return &MockClientCommandsServer_FileUpload_Call{Call: _e.mock.On("FileUpload", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_FileUpload_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcFileUploadRequest)) *MockClientCommandsServer_FileUpload_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcFileUploadRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_FileUpload_Call) Return(_a0 *pb.RpcFileUploadResponse) *MockClientCommandsServer_FileUpload_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_FileUpload_Call) RunAndReturn(run func(context.Context, *pb.RpcFileUploadRequest) *pb.RpcFileUploadResponse) *MockClientCommandsServer_FileUpload_Call { - _c.Call.Return(run) - return _c -} - -// GalleryDownloadIndex provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) GalleryDownloadIndex(_a0 context.Context, _a1 *pb.RpcGalleryDownloadIndexRequest) *pb.RpcGalleryDownloadIndexResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for GalleryDownloadIndex") - } - - var r0 *pb.RpcGalleryDownloadIndexResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcGalleryDownloadIndexRequest) *pb.RpcGalleryDownloadIndexResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcGalleryDownloadIndexResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_GalleryDownloadIndex_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GalleryDownloadIndex' -type MockClientCommandsServer_GalleryDownloadIndex_Call struct { - *mock.Call -} - -// GalleryDownloadIndex is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcGalleryDownloadIndexRequest -func (_e *MockClientCommandsServer_Expecter) GalleryDownloadIndex(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_GalleryDownloadIndex_Call { - return &MockClientCommandsServer_GalleryDownloadIndex_Call{Call: _e.mock.On("GalleryDownloadIndex", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_GalleryDownloadIndex_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcGalleryDownloadIndexRequest)) *MockClientCommandsServer_GalleryDownloadIndex_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcGalleryDownloadIndexRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_GalleryDownloadIndex_Call) Return(_a0 *pb.RpcGalleryDownloadIndexResponse) *MockClientCommandsServer_GalleryDownloadIndex_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_GalleryDownloadIndex_Call) RunAndReturn(run func(context.Context, *pb.RpcGalleryDownloadIndexRequest) *pb.RpcGalleryDownloadIndexResponse) *MockClientCommandsServer_GalleryDownloadIndex_Call { - _c.Call.Return(run) - return _c -} - -// GalleryDownloadManifest provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) GalleryDownloadManifest(_a0 context.Context, _a1 *pb.RpcGalleryDownloadManifestRequest) *pb.RpcGalleryDownloadManifestResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for GalleryDownloadManifest") - } - - var r0 *pb.RpcGalleryDownloadManifestResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcGalleryDownloadManifestRequest) *pb.RpcGalleryDownloadManifestResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcGalleryDownloadManifestResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_GalleryDownloadManifest_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GalleryDownloadManifest' -type MockClientCommandsServer_GalleryDownloadManifest_Call struct { - *mock.Call -} - -// GalleryDownloadManifest is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcGalleryDownloadManifestRequest -func (_e *MockClientCommandsServer_Expecter) GalleryDownloadManifest(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_GalleryDownloadManifest_Call { - return &MockClientCommandsServer_GalleryDownloadManifest_Call{Call: _e.mock.On("GalleryDownloadManifest", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_GalleryDownloadManifest_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcGalleryDownloadManifestRequest)) *MockClientCommandsServer_GalleryDownloadManifest_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcGalleryDownloadManifestRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_GalleryDownloadManifest_Call) Return(_a0 *pb.RpcGalleryDownloadManifestResponse) *MockClientCommandsServer_GalleryDownloadManifest_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_GalleryDownloadManifest_Call) RunAndReturn(run func(context.Context, *pb.RpcGalleryDownloadManifestRequest) *pb.RpcGalleryDownloadManifestResponse) *MockClientCommandsServer_GalleryDownloadManifest_Call { - _c.Call.Return(run) - return _c -} - -// HistoryDiffVersions provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) HistoryDiffVersions(_a0 context.Context, _a1 *pb.RpcHistoryDiffVersionsRequest) *pb.RpcHistoryDiffVersionsResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for HistoryDiffVersions") - } - - var r0 *pb.RpcHistoryDiffVersionsResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcHistoryDiffVersionsRequest) *pb.RpcHistoryDiffVersionsResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcHistoryDiffVersionsResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_HistoryDiffVersions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HistoryDiffVersions' -type MockClientCommandsServer_HistoryDiffVersions_Call struct { - *mock.Call -} - -// HistoryDiffVersions is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcHistoryDiffVersionsRequest -func (_e *MockClientCommandsServer_Expecter) HistoryDiffVersions(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_HistoryDiffVersions_Call { - return &MockClientCommandsServer_HistoryDiffVersions_Call{Call: _e.mock.On("HistoryDiffVersions", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_HistoryDiffVersions_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcHistoryDiffVersionsRequest)) *MockClientCommandsServer_HistoryDiffVersions_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcHistoryDiffVersionsRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_HistoryDiffVersions_Call) Return(_a0 *pb.RpcHistoryDiffVersionsResponse) *MockClientCommandsServer_HistoryDiffVersions_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_HistoryDiffVersions_Call) RunAndReturn(run func(context.Context, *pb.RpcHistoryDiffVersionsRequest) *pb.RpcHistoryDiffVersionsResponse) *MockClientCommandsServer_HistoryDiffVersions_Call { - _c.Call.Return(run) - return _c -} - -// HistoryGetVersions provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) HistoryGetVersions(_a0 context.Context, _a1 *pb.RpcHistoryGetVersionsRequest) *pb.RpcHistoryGetVersionsResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for HistoryGetVersions") - } - - var r0 *pb.RpcHistoryGetVersionsResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcHistoryGetVersionsRequest) *pb.RpcHistoryGetVersionsResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcHistoryGetVersionsResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_HistoryGetVersions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HistoryGetVersions' -type MockClientCommandsServer_HistoryGetVersions_Call struct { - *mock.Call -} - -// HistoryGetVersions is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcHistoryGetVersionsRequest -func (_e *MockClientCommandsServer_Expecter) HistoryGetVersions(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_HistoryGetVersions_Call { - return &MockClientCommandsServer_HistoryGetVersions_Call{Call: _e.mock.On("HistoryGetVersions", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_HistoryGetVersions_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcHistoryGetVersionsRequest)) *MockClientCommandsServer_HistoryGetVersions_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcHistoryGetVersionsRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_HistoryGetVersions_Call) Return(_a0 *pb.RpcHistoryGetVersionsResponse) *MockClientCommandsServer_HistoryGetVersions_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_HistoryGetVersions_Call) RunAndReturn(run func(context.Context, *pb.RpcHistoryGetVersionsRequest) *pb.RpcHistoryGetVersionsResponse) *MockClientCommandsServer_HistoryGetVersions_Call { - _c.Call.Return(run) - return _c -} - -// HistorySetVersion provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) HistorySetVersion(_a0 context.Context, _a1 *pb.RpcHistorySetVersionRequest) *pb.RpcHistorySetVersionResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for HistorySetVersion") - } - - var r0 *pb.RpcHistorySetVersionResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcHistorySetVersionRequest) *pb.RpcHistorySetVersionResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcHistorySetVersionResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_HistorySetVersion_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HistorySetVersion' -type MockClientCommandsServer_HistorySetVersion_Call struct { - *mock.Call -} - -// HistorySetVersion is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcHistorySetVersionRequest -func (_e *MockClientCommandsServer_Expecter) HistorySetVersion(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_HistorySetVersion_Call { - return &MockClientCommandsServer_HistorySetVersion_Call{Call: _e.mock.On("HistorySetVersion", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_HistorySetVersion_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcHistorySetVersionRequest)) *MockClientCommandsServer_HistorySetVersion_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcHistorySetVersionRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_HistorySetVersion_Call) Return(_a0 *pb.RpcHistorySetVersionResponse) *MockClientCommandsServer_HistorySetVersion_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_HistorySetVersion_Call) RunAndReturn(run func(context.Context, *pb.RpcHistorySetVersionRequest) *pb.RpcHistorySetVersionResponse) *MockClientCommandsServer_HistorySetVersion_Call { - _c.Call.Return(run) - return _c -} - -// HistoryShowVersion provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) HistoryShowVersion(_a0 context.Context, _a1 *pb.RpcHistoryShowVersionRequest) *pb.RpcHistoryShowVersionResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for HistoryShowVersion") - } - - var r0 *pb.RpcHistoryShowVersionResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcHistoryShowVersionRequest) *pb.RpcHistoryShowVersionResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcHistoryShowVersionResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_HistoryShowVersion_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HistoryShowVersion' -type MockClientCommandsServer_HistoryShowVersion_Call struct { - *mock.Call -} - -// HistoryShowVersion is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcHistoryShowVersionRequest -func (_e *MockClientCommandsServer_Expecter) HistoryShowVersion(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_HistoryShowVersion_Call { - return &MockClientCommandsServer_HistoryShowVersion_Call{Call: _e.mock.On("HistoryShowVersion", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_HistoryShowVersion_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcHistoryShowVersionRequest)) *MockClientCommandsServer_HistoryShowVersion_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcHistoryShowVersionRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_HistoryShowVersion_Call) Return(_a0 *pb.RpcHistoryShowVersionResponse) *MockClientCommandsServer_HistoryShowVersion_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_HistoryShowVersion_Call) RunAndReturn(run func(context.Context, *pb.RpcHistoryShowVersionRequest) *pb.RpcHistoryShowVersionResponse) *MockClientCommandsServer_HistoryShowVersion_Call { - _c.Call.Return(run) - return _c -} - -// InitialSetParameters provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) InitialSetParameters(_a0 context.Context, _a1 *pb.RpcInitialSetParametersRequest) *pb.RpcInitialSetParametersResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for InitialSetParameters") - } - - var r0 *pb.RpcInitialSetParametersResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcInitialSetParametersRequest) *pb.RpcInitialSetParametersResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcInitialSetParametersResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_InitialSetParameters_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'InitialSetParameters' -type MockClientCommandsServer_InitialSetParameters_Call struct { - *mock.Call -} - -// InitialSetParameters is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcInitialSetParametersRequest -func (_e *MockClientCommandsServer_Expecter) InitialSetParameters(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_InitialSetParameters_Call { - return &MockClientCommandsServer_InitialSetParameters_Call{Call: _e.mock.On("InitialSetParameters", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_InitialSetParameters_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcInitialSetParametersRequest)) *MockClientCommandsServer_InitialSetParameters_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcInitialSetParametersRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_InitialSetParameters_Call) Return(_a0 *pb.RpcInitialSetParametersResponse) *MockClientCommandsServer_InitialSetParameters_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_InitialSetParameters_Call) RunAndReturn(run func(context.Context, *pb.RpcInitialSetParametersRequest) *pb.RpcInitialSetParametersResponse) *MockClientCommandsServer_InitialSetParameters_Call { - _c.Call.Return(run) - return _c -} - -// LinkPreview provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) LinkPreview(_a0 context.Context, _a1 *pb.RpcLinkPreviewRequest) *pb.RpcLinkPreviewResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for LinkPreview") - } - - var r0 *pb.RpcLinkPreviewResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcLinkPreviewRequest) *pb.RpcLinkPreviewResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcLinkPreviewResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_LinkPreview_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LinkPreview' -type MockClientCommandsServer_LinkPreview_Call struct { - *mock.Call -} - -// LinkPreview is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcLinkPreviewRequest -func (_e *MockClientCommandsServer_Expecter) LinkPreview(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_LinkPreview_Call { - return &MockClientCommandsServer_LinkPreview_Call{Call: _e.mock.On("LinkPreview", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_LinkPreview_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcLinkPreviewRequest)) *MockClientCommandsServer_LinkPreview_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcLinkPreviewRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_LinkPreview_Call) Return(_a0 *pb.RpcLinkPreviewResponse) *MockClientCommandsServer_LinkPreview_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_LinkPreview_Call) RunAndReturn(run func(context.Context, *pb.RpcLinkPreviewRequest) *pb.RpcLinkPreviewResponse) *MockClientCommandsServer_LinkPreview_Call { - _c.Call.Return(run) - return _c -} - -// ListenSessionEvents provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ListenSessionEvents(_a0 *pb.StreamRequest, _a1 service.ClientCommands_ListenSessionEventsServer) { - _m.Called(_a0, _a1) -} - -// MockClientCommandsServer_ListenSessionEvents_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListenSessionEvents' -type MockClientCommandsServer_ListenSessionEvents_Call struct { - *mock.Call -} - -// ListenSessionEvents is a helper method to define mock.On call -// - _a0 *pb.StreamRequest -// - _a1 service.ClientCommands_ListenSessionEventsServer -func (_e *MockClientCommandsServer_Expecter) ListenSessionEvents(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ListenSessionEvents_Call { - return &MockClientCommandsServer_ListenSessionEvents_Call{Call: _e.mock.On("ListenSessionEvents", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ListenSessionEvents_Call) Run(run func(_a0 *pb.StreamRequest, _a1 service.ClientCommands_ListenSessionEventsServer)) *MockClientCommandsServer_ListenSessionEvents_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*pb.StreamRequest), args[1].(service.ClientCommands_ListenSessionEventsServer)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ListenSessionEvents_Call) Return() *MockClientCommandsServer_ListenSessionEvents_Call { - _c.Call.Return() - return _c -} - -func (_c *MockClientCommandsServer_ListenSessionEvents_Call) RunAndReturn(run func(*pb.StreamRequest, service.ClientCommands_ListenSessionEventsServer)) *MockClientCommandsServer_ListenSessionEvents_Call { - _c.Call.Return(run) - return _c -} - -// LogSend provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) LogSend(_a0 context.Context, _a1 *pb.RpcLogSendRequest) *pb.RpcLogSendResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for LogSend") - } - - var r0 *pb.RpcLogSendResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcLogSendRequest) *pb.RpcLogSendResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcLogSendResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_LogSend_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LogSend' -type MockClientCommandsServer_LogSend_Call struct { - *mock.Call -} - -// LogSend is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcLogSendRequest -func (_e *MockClientCommandsServer_Expecter) LogSend(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_LogSend_Call { - return &MockClientCommandsServer_LogSend_Call{Call: _e.mock.On("LogSend", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_LogSend_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcLogSendRequest)) *MockClientCommandsServer_LogSend_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcLogSendRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_LogSend_Call) Return(_a0 *pb.RpcLogSendResponse) *MockClientCommandsServer_LogSend_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_LogSend_Call) RunAndReturn(run func(context.Context, *pb.RpcLogSendRequest) *pb.RpcLogSendResponse) *MockClientCommandsServer_LogSend_Call { - _c.Call.Return(run) - return _c -} - -// MembershipFinalize provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) MembershipFinalize(_a0 context.Context, _a1 *pb.RpcMembershipFinalizeRequest) *pb.RpcMembershipFinalizeResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for MembershipFinalize") - } - - var r0 *pb.RpcMembershipFinalizeResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcMembershipFinalizeRequest) *pb.RpcMembershipFinalizeResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcMembershipFinalizeResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_MembershipFinalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MembershipFinalize' -type MockClientCommandsServer_MembershipFinalize_Call struct { - *mock.Call -} - -// MembershipFinalize is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcMembershipFinalizeRequest -func (_e *MockClientCommandsServer_Expecter) MembershipFinalize(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_MembershipFinalize_Call { - return &MockClientCommandsServer_MembershipFinalize_Call{Call: _e.mock.On("MembershipFinalize", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_MembershipFinalize_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcMembershipFinalizeRequest)) *MockClientCommandsServer_MembershipFinalize_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcMembershipFinalizeRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_MembershipFinalize_Call) Return(_a0 *pb.RpcMembershipFinalizeResponse) *MockClientCommandsServer_MembershipFinalize_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_MembershipFinalize_Call) RunAndReturn(run func(context.Context, *pb.RpcMembershipFinalizeRequest) *pb.RpcMembershipFinalizeResponse) *MockClientCommandsServer_MembershipFinalize_Call { - _c.Call.Return(run) - return _c -} - -// MembershipGetPortalLinkUrl provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) MembershipGetPortalLinkUrl(_a0 context.Context, _a1 *pb.RpcMembershipGetPortalLinkUrlRequest) *pb.RpcMembershipGetPortalLinkUrlResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for MembershipGetPortalLinkUrl") - } - - var r0 *pb.RpcMembershipGetPortalLinkUrlResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcMembershipGetPortalLinkUrlRequest) *pb.RpcMembershipGetPortalLinkUrlResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcMembershipGetPortalLinkUrlResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_MembershipGetPortalLinkUrl_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MembershipGetPortalLinkUrl' -type MockClientCommandsServer_MembershipGetPortalLinkUrl_Call struct { - *mock.Call -} - -// MembershipGetPortalLinkUrl is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcMembershipGetPortalLinkUrlRequest -func (_e *MockClientCommandsServer_Expecter) MembershipGetPortalLinkUrl(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_MembershipGetPortalLinkUrl_Call { - return &MockClientCommandsServer_MembershipGetPortalLinkUrl_Call{Call: _e.mock.On("MembershipGetPortalLinkUrl", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_MembershipGetPortalLinkUrl_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcMembershipGetPortalLinkUrlRequest)) *MockClientCommandsServer_MembershipGetPortalLinkUrl_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcMembershipGetPortalLinkUrlRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_MembershipGetPortalLinkUrl_Call) Return(_a0 *pb.RpcMembershipGetPortalLinkUrlResponse) *MockClientCommandsServer_MembershipGetPortalLinkUrl_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_MembershipGetPortalLinkUrl_Call) RunAndReturn(run func(context.Context, *pb.RpcMembershipGetPortalLinkUrlRequest) *pb.RpcMembershipGetPortalLinkUrlResponse) *MockClientCommandsServer_MembershipGetPortalLinkUrl_Call { - _c.Call.Return(run) - return _c -} - -// MembershipGetStatus provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) MembershipGetStatus(_a0 context.Context, _a1 *pb.RpcMembershipGetStatusRequest) *pb.RpcMembershipGetStatusResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for MembershipGetStatus") - } - - var r0 *pb.RpcMembershipGetStatusResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcMembershipGetStatusRequest) *pb.RpcMembershipGetStatusResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcMembershipGetStatusResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_MembershipGetStatus_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MembershipGetStatus' -type MockClientCommandsServer_MembershipGetStatus_Call struct { - *mock.Call -} - -// MembershipGetStatus is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcMembershipGetStatusRequest -func (_e *MockClientCommandsServer_Expecter) MembershipGetStatus(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_MembershipGetStatus_Call { - return &MockClientCommandsServer_MembershipGetStatus_Call{Call: _e.mock.On("MembershipGetStatus", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_MembershipGetStatus_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcMembershipGetStatusRequest)) *MockClientCommandsServer_MembershipGetStatus_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcMembershipGetStatusRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_MembershipGetStatus_Call) Return(_a0 *pb.RpcMembershipGetStatusResponse) *MockClientCommandsServer_MembershipGetStatus_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_MembershipGetStatus_Call) RunAndReturn(run func(context.Context, *pb.RpcMembershipGetStatusRequest) *pb.RpcMembershipGetStatusResponse) *MockClientCommandsServer_MembershipGetStatus_Call { - _c.Call.Return(run) - return _c -} - -// MembershipGetTiers provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) MembershipGetTiers(_a0 context.Context, _a1 *pb.RpcMembershipGetTiersRequest) *pb.RpcMembershipGetTiersResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for MembershipGetTiers") - } - - var r0 *pb.RpcMembershipGetTiersResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcMembershipGetTiersRequest) *pb.RpcMembershipGetTiersResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcMembershipGetTiersResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_MembershipGetTiers_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MembershipGetTiers' -type MockClientCommandsServer_MembershipGetTiers_Call struct { - *mock.Call -} - -// MembershipGetTiers is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcMembershipGetTiersRequest -func (_e *MockClientCommandsServer_Expecter) MembershipGetTiers(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_MembershipGetTiers_Call { - return &MockClientCommandsServer_MembershipGetTiers_Call{Call: _e.mock.On("MembershipGetTiers", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_MembershipGetTiers_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcMembershipGetTiersRequest)) *MockClientCommandsServer_MembershipGetTiers_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcMembershipGetTiersRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_MembershipGetTiers_Call) Return(_a0 *pb.RpcMembershipGetTiersResponse) *MockClientCommandsServer_MembershipGetTiers_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_MembershipGetTiers_Call) RunAndReturn(run func(context.Context, *pb.RpcMembershipGetTiersRequest) *pb.RpcMembershipGetTiersResponse) *MockClientCommandsServer_MembershipGetTiers_Call { - _c.Call.Return(run) - return _c -} - -// MembershipGetVerificationEmail provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) MembershipGetVerificationEmail(_a0 context.Context, _a1 *pb.RpcMembershipGetVerificationEmailRequest) *pb.RpcMembershipGetVerificationEmailResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for MembershipGetVerificationEmail") - } - - var r0 *pb.RpcMembershipGetVerificationEmailResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcMembershipGetVerificationEmailRequest) *pb.RpcMembershipGetVerificationEmailResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcMembershipGetVerificationEmailResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_MembershipGetVerificationEmail_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MembershipGetVerificationEmail' -type MockClientCommandsServer_MembershipGetVerificationEmail_Call struct { - *mock.Call -} - -// MembershipGetVerificationEmail is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcMembershipGetVerificationEmailRequest -func (_e *MockClientCommandsServer_Expecter) MembershipGetVerificationEmail(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_MembershipGetVerificationEmail_Call { - return &MockClientCommandsServer_MembershipGetVerificationEmail_Call{Call: _e.mock.On("MembershipGetVerificationEmail", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_MembershipGetVerificationEmail_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcMembershipGetVerificationEmailRequest)) *MockClientCommandsServer_MembershipGetVerificationEmail_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcMembershipGetVerificationEmailRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_MembershipGetVerificationEmail_Call) Return(_a0 *pb.RpcMembershipGetVerificationEmailResponse) *MockClientCommandsServer_MembershipGetVerificationEmail_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_MembershipGetVerificationEmail_Call) RunAndReturn(run func(context.Context, *pb.RpcMembershipGetVerificationEmailRequest) *pb.RpcMembershipGetVerificationEmailResponse) *MockClientCommandsServer_MembershipGetVerificationEmail_Call { - _c.Call.Return(run) - return _c -} - -// MembershipGetVerificationEmailStatus provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) MembershipGetVerificationEmailStatus(_a0 context.Context, _a1 *pb.RpcMembershipGetVerificationEmailStatusRequest) *pb.RpcMembershipGetVerificationEmailStatusResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for MembershipGetVerificationEmailStatus") - } - - var r0 *pb.RpcMembershipGetVerificationEmailStatusResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcMembershipGetVerificationEmailStatusRequest) *pb.RpcMembershipGetVerificationEmailStatusResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcMembershipGetVerificationEmailStatusResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_MembershipGetVerificationEmailStatus_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MembershipGetVerificationEmailStatus' -type MockClientCommandsServer_MembershipGetVerificationEmailStatus_Call struct { - *mock.Call -} - -// MembershipGetVerificationEmailStatus is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcMembershipGetVerificationEmailStatusRequest -func (_e *MockClientCommandsServer_Expecter) MembershipGetVerificationEmailStatus(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_MembershipGetVerificationEmailStatus_Call { - return &MockClientCommandsServer_MembershipGetVerificationEmailStatus_Call{Call: _e.mock.On("MembershipGetVerificationEmailStatus", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_MembershipGetVerificationEmailStatus_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcMembershipGetVerificationEmailStatusRequest)) *MockClientCommandsServer_MembershipGetVerificationEmailStatus_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcMembershipGetVerificationEmailStatusRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_MembershipGetVerificationEmailStatus_Call) Return(_a0 *pb.RpcMembershipGetVerificationEmailStatusResponse) *MockClientCommandsServer_MembershipGetVerificationEmailStatus_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_MembershipGetVerificationEmailStatus_Call) RunAndReturn(run func(context.Context, *pb.RpcMembershipGetVerificationEmailStatusRequest) *pb.RpcMembershipGetVerificationEmailStatusResponse) *MockClientCommandsServer_MembershipGetVerificationEmailStatus_Call { - _c.Call.Return(run) - return _c -} - -// MembershipIsNameValid provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) MembershipIsNameValid(_a0 context.Context, _a1 *pb.RpcMembershipIsNameValidRequest) *pb.RpcMembershipIsNameValidResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for MembershipIsNameValid") - } - - var r0 *pb.RpcMembershipIsNameValidResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcMembershipIsNameValidRequest) *pb.RpcMembershipIsNameValidResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcMembershipIsNameValidResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_MembershipIsNameValid_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MembershipIsNameValid' -type MockClientCommandsServer_MembershipIsNameValid_Call struct { - *mock.Call -} - -// MembershipIsNameValid is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcMembershipIsNameValidRequest -func (_e *MockClientCommandsServer_Expecter) MembershipIsNameValid(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_MembershipIsNameValid_Call { - return &MockClientCommandsServer_MembershipIsNameValid_Call{Call: _e.mock.On("MembershipIsNameValid", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_MembershipIsNameValid_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcMembershipIsNameValidRequest)) *MockClientCommandsServer_MembershipIsNameValid_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcMembershipIsNameValidRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_MembershipIsNameValid_Call) Return(_a0 *pb.RpcMembershipIsNameValidResponse) *MockClientCommandsServer_MembershipIsNameValid_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_MembershipIsNameValid_Call) RunAndReturn(run func(context.Context, *pb.RpcMembershipIsNameValidRequest) *pb.RpcMembershipIsNameValidResponse) *MockClientCommandsServer_MembershipIsNameValid_Call { - _c.Call.Return(run) - return _c -} - -// MembershipRegisterPaymentRequest provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) MembershipRegisterPaymentRequest(_a0 context.Context, _a1 *pb.RpcMembershipRegisterPaymentRequestRequest) *pb.RpcMembershipRegisterPaymentRequestResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for MembershipRegisterPaymentRequest") - } - - var r0 *pb.RpcMembershipRegisterPaymentRequestResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcMembershipRegisterPaymentRequestRequest) *pb.RpcMembershipRegisterPaymentRequestResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcMembershipRegisterPaymentRequestResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_MembershipRegisterPaymentRequest_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MembershipRegisterPaymentRequest' -type MockClientCommandsServer_MembershipRegisterPaymentRequest_Call struct { - *mock.Call -} - -// MembershipRegisterPaymentRequest is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcMembershipRegisterPaymentRequestRequest -func (_e *MockClientCommandsServer_Expecter) MembershipRegisterPaymentRequest(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_MembershipRegisterPaymentRequest_Call { - return &MockClientCommandsServer_MembershipRegisterPaymentRequest_Call{Call: _e.mock.On("MembershipRegisterPaymentRequest", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_MembershipRegisterPaymentRequest_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcMembershipRegisterPaymentRequestRequest)) *MockClientCommandsServer_MembershipRegisterPaymentRequest_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcMembershipRegisterPaymentRequestRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_MembershipRegisterPaymentRequest_Call) Return(_a0 *pb.RpcMembershipRegisterPaymentRequestResponse) *MockClientCommandsServer_MembershipRegisterPaymentRequest_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_MembershipRegisterPaymentRequest_Call) RunAndReturn(run func(context.Context, *pb.RpcMembershipRegisterPaymentRequestRequest) *pb.RpcMembershipRegisterPaymentRequestResponse) *MockClientCommandsServer_MembershipRegisterPaymentRequest_Call { - _c.Call.Return(run) - return _c -} - -// MembershipVerifyAppStoreReceipt provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) MembershipVerifyAppStoreReceipt(_a0 context.Context, _a1 *pb.RpcMembershipVerifyAppStoreReceiptRequest) *pb.RpcMembershipVerifyAppStoreReceiptResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for MembershipVerifyAppStoreReceipt") - } - - var r0 *pb.RpcMembershipVerifyAppStoreReceiptResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcMembershipVerifyAppStoreReceiptRequest) *pb.RpcMembershipVerifyAppStoreReceiptResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcMembershipVerifyAppStoreReceiptResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_MembershipVerifyAppStoreReceipt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MembershipVerifyAppStoreReceipt' -type MockClientCommandsServer_MembershipVerifyAppStoreReceipt_Call struct { - *mock.Call -} - -// MembershipVerifyAppStoreReceipt is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcMembershipVerifyAppStoreReceiptRequest -func (_e *MockClientCommandsServer_Expecter) MembershipVerifyAppStoreReceipt(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_MembershipVerifyAppStoreReceipt_Call { - return &MockClientCommandsServer_MembershipVerifyAppStoreReceipt_Call{Call: _e.mock.On("MembershipVerifyAppStoreReceipt", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_MembershipVerifyAppStoreReceipt_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcMembershipVerifyAppStoreReceiptRequest)) *MockClientCommandsServer_MembershipVerifyAppStoreReceipt_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcMembershipVerifyAppStoreReceiptRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_MembershipVerifyAppStoreReceipt_Call) Return(_a0 *pb.RpcMembershipVerifyAppStoreReceiptResponse) *MockClientCommandsServer_MembershipVerifyAppStoreReceipt_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_MembershipVerifyAppStoreReceipt_Call) RunAndReturn(run func(context.Context, *pb.RpcMembershipVerifyAppStoreReceiptRequest) *pb.RpcMembershipVerifyAppStoreReceiptResponse) *MockClientCommandsServer_MembershipVerifyAppStoreReceipt_Call { - _c.Call.Return(run) - return _c -} - -// MembershipVerifyEmailCode provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) MembershipVerifyEmailCode(_a0 context.Context, _a1 *pb.RpcMembershipVerifyEmailCodeRequest) *pb.RpcMembershipVerifyEmailCodeResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for MembershipVerifyEmailCode") - } - - var r0 *pb.RpcMembershipVerifyEmailCodeResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcMembershipVerifyEmailCodeRequest) *pb.RpcMembershipVerifyEmailCodeResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcMembershipVerifyEmailCodeResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_MembershipVerifyEmailCode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MembershipVerifyEmailCode' -type MockClientCommandsServer_MembershipVerifyEmailCode_Call struct { - *mock.Call -} - -// MembershipVerifyEmailCode is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcMembershipVerifyEmailCodeRequest -func (_e *MockClientCommandsServer_Expecter) MembershipVerifyEmailCode(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_MembershipVerifyEmailCode_Call { - return &MockClientCommandsServer_MembershipVerifyEmailCode_Call{Call: _e.mock.On("MembershipVerifyEmailCode", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_MembershipVerifyEmailCode_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcMembershipVerifyEmailCodeRequest)) *MockClientCommandsServer_MembershipVerifyEmailCode_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcMembershipVerifyEmailCodeRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_MembershipVerifyEmailCode_Call) Return(_a0 *pb.RpcMembershipVerifyEmailCodeResponse) *MockClientCommandsServer_MembershipVerifyEmailCode_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_MembershipVerifyEmailCode_Call) RunAndReturn(run func(context.Context, *pb.RpcMembershipVerifyEmailCodeRequest) *pb.RpcMembershipVerifyEmailCodeResponse) *MockClientCommandsServer_MembershipVerifyEmailCode_Call { - _c.Call.Return(run) - return _c -} - -// NameServiceResolveAnyId provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) NameServiceResolveAnyId(_a0 context.Context, _a1 *pb.RpcNameServiceResolveAnyIdRequest) *pb.RpcNameServiceResolveAnyIdResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for NameServiceResolveAnyId") - } - - var r0 *pb.RpcNameServiceResolveAnyIdResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcNameServiceResolveAnyIdRequest) *pb.RpcNameServiceResolveAnyIdResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcNameServiceResolveAnyIdResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_NameServiceResolveAnyId_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NameServiceResolveAnyId' -type MockClientCommandsServer_NameServiceResolveAnyId_Call struct { - *mock.Call -} - -// NameServiceResolveAnyId is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcNameServiceResolveAnyIdRequest -func (_e *MockClientCommandsServer_Expecter) NameServiceResolveAnyId(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_NameServiceResolveAnyId_Call { - return &MockClientCommandsServer_NameServiceResolveAnyId_Call{Call: _e.mock.On("NameServiceResolveAnyId", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_NameServiceResolveAnyId_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcNameServiceResolveAnyIdRequest)) *MockClientCommandsServer_NameServiceResolveAnyId_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcNameServiceResolveAnyIdRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_NameServiceResolveAnyId_Call) Return(_a0 *pb.RpcNameServiceResolveAnyIdResponse) *MockClientCommandsServer_NameServiceResolveAnyId_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_NameServiceResolveAnyId_Call) RunAndReturn(run func(context.Context, *pb.RpcNameServiceResolveAnyIdRequest) *pb.RpcNameServiceResolveAnyIdResponse) *MockClientCommandsServer_NameServiceResolveAnyId_Call { - _c.Call.Return(run) - return _c -} - -// NameServiceResolveName provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) NameServiceResolveName(_a0 context.Context, _a1 *pb.RpcNameServiceResolveNameRequest) *pb.RpcNameServiceResolveNameResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for NameServiceResolveName") - } - - var r0 *pb.RpcNameServiceResolveNameResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcNameServiceResolveNameRequest) *pb.RpcNameServiceResolveNameResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcNameServiceResolveNameResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_NameServiceResolveName_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NameServiceResolveName' -type MockClientCommandsServer_NameServiceResolveName_Call struct { - *mock.Call -} - -// NameServiceResolveName is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcNameServiceResolveNameRequest -func (_e *MockClientCommandsServer_Expecter) NameServiceResolveName(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_NameServiceResolveName_Call { - return &MockClientCommandsServer_NameServiceResolveName_Call{Call: _e.mock.On("NameServiceResolveName", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_NameServiceResolveName_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcNameServiceResolveNameRequest)) *MockClientCommandsServer_NameServiceResolveName_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcNameServiceResolveNameRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_NameServiceResolveName_Call) Return(_a0 *pb.RpcNameServiceResolveNameResponse) *MockClientCommandsServer_NameServiceResolveName_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_NameServiceResolveName_Call) RunAndReturn(run func(context.Context, *pb.RpcNameServiceResolveNameRequest) *pb.RpcNameServiceResolveNameResponse) *MockClientCommandsServer_NameServiceResolveName_Call { - _c.Call.Return(run) - return _c -} - -// NameServiceUserAccountGet provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) NameServiceUserAccountGet(_a0 context.Context, _a1 *pb.RpcNameServiceUserAccountGetRequest) *pb.RpcNameServiceUserAccountGetResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for NameServiceUserAccountGet") - } - - var r0 *pb.RpcNameServiceUserAccountGetResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcNameServiceUserAccountGetRequest) *pb.RpcNameServiceUserAccountGetResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcNameServiceUserAccountGetResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_NameServiceUserAccountGet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NameServiceUserAccountGet' -type MockClientCommandsServer_NameServiceUserAccountGet_Call struct { - *mock.Call -} - -// NameServiceUserAccountGet is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcNameServiceUserAccountGetRequest -func (_e *MockClientCommandsServer_Expecter) NameServiceUserAccountGet(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_NameServiceUserAccountGet_Call { - return &MockClientCommandsServer_NameServiceUserAccountGet_Call{Call: _e.mock.On("NameServiceUserAccountGet", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_NameServiceUserAccountGet_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcNameServiceUserAccountGetRequest)) *MockClientCommandsServer_NameServiceUserAccountGet_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcNameServiceUserAccountGetRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_NameServiceUserAccountGet_Call) Return(_a0 *pb.RpcNameServiceUserAccountGetResponse) *MockClientCommandsServer_NameServiceUserAccountGet_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_NameServiceUserAccountGet_Call) RunAndReturn(run func(context.Context, *pb.RpcNameServiceUserAccountGetRequest) *pb.RpcNameServiceUserAccountGetResponse) *MockClientCommandsServer_NameServiceUserAccountGet_Call { - _c.Call.Return(run) - return _c -} - -// NavigationGetObjectInfoWithLinks provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) NavigationGetObjectInfoWithLinks(_a0 context.Context, _a1 *pb.RpcNavigationGetObjectInfoWithLinksRequest) *pb.RpcNavigationGetObjectInfoWithLinksResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for NavigationGetObjectInfoWithLinks") - } - - var r0 *pb.RpcNavigationGetObjectInfoWithLinksResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcNavigationGetObjectInfoWithLinksRequest) *pb.RpcNavigationGetObjectInfoWithLinksResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcNavigationGetObjectInfoWithLinksResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_NavigationGetObjectInfoWithLinks_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NavigationGetObjectInfoWithLinks' -type MockClientCommandsServer_NavigationGetObjectInfoWithLinks_Call struct { - *mock.Call -} - -// NavigationGetObjectInfoWithLinks is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcNavigationGetObjectInfoWithLinksRequest -func (_e *MockClientCommandsServer_Expecter) NavigationGetObjectInfoWithLinks(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_NavigationGetObjectInfoWithLinks_Call { - return &MockClientCommandsServer_NavigationGetObjectInfoWithLinks_Call{Call: _e.mock.On("NavigationGetObjectInfoWithLinks", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_NavigationGetObjectInfoWithLinks_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcNavigationGetObjectInfoWithLinksRequest)) *MockClientCommandsServer_NavigationGetObjectInfoWithLinks_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcNavigationGetObjectInfoWithLinksRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_NavigationGetObjectInfoWithLinks_Call) Return(_a0 *pb.RpcNavigationGetObjectInfoWithLinksResponse) *MockClientCommandsServer_NavigationGetObjectInfoWithLinks_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_NavigationGetObjectInfoWithLinks_Call) RunAndReturn(run func(context.Context, *pb.RpcNavigationGetObjectInfoWithLinksRequest) *pb.RpcNavigationGetObjectInfoWithLinksResponse) *MockClientCommandsServer_NavigationGetObjectInfoWithLinks_Call { - _c.Call.Return(run) - return _c -} - -// NavigationListObjects provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) NavigationListObjects(_a0 context.Context, _a1 *pb.RpcNavigationListObjectsRequest) *pb.RpcNavigationListObjectsResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for NavigationListObjects") - } - - var r0 *pb.RpcNavigationListObjectsResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcNavigationListObjectsRequest) *pb.RpcNavigationListObjectsResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcNavigationListObjectsResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_NavigationListObjects_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NavigationListObjects' -type MockClientCommandsServer_NavigationListObjects_Call struct { - *mock.Call -} - -// NavigationListObjects is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcNavigationListObjectsRequest -func (_e *MockClientCommandsServer_Expecter) NavigationListObjects(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_NavigationListObjects_Call { - return &MockClientCommandsServer_NavigationListObjects_Call{Call: _e.mock.On("NavigationListObjects", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_NavigationListObjects_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcNavigationListObjectsRequest)) *MockClientCommandsServer_NavigationListObjects_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcNavigationListObjectsRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_NavigationListObjects_Call) Return(_a0 *pb.RpcNavigationListObjectsResponse) *MockClientCommandsServer_NavigationListObjects_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_NavigationListObjects_Call) RunAndReturn(run func(context.Context, *pb.RpcNavigationListObjectsRequest) *pb.RpcNavigationListObjectsResponse) *MockClientCommandsServer_NavigationListObjects_Call { - _c.Call.Return(run) - return _c -} - -// NotificationList provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) NotificationList(_a0 context.Context, _a1 *pb.RpcNotificationListRequest) *pb.RpcNotificationListResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for NotificationList") - } - - var r0 *pb.RpcNotificationListResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcNotificationListRequest) *pb.RpcNotificationListResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcNotificationListResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_NotificationList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NotificationList' -type MockClientCommandsServer_NotificationList_Call struct { - *mock.Call -} - -// NotificationList is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcNotificationListRequest -func (_e *MockClientCommandsServer_Expecter) NotificationList(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_NotificationList_Call { - return &MockClientCommandsServer_NotificationList_Call{Call: _e.mock.On("NotificationList", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_NotificationList_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcNotificationListRequest)) *MockClientCommandsServer_NotificationList_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcNotificationListRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_NotificationList_Call) Return(_a0 *pb.RpcNotificationListResponse) *MockClientCommandsServer_NotificationList_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_NotificationList_Call) RunAndReturn(run func(context.Context, *pb.RpcNotificationListRequest) *pb.RpcNotificationListResponse) *MockClientCommandsServer_NotificationList_Call { - _c.Call.Return(run) - return _c -} - -// NotificationReply provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) NotificationReply(_a0 context.Context, _a1 *pb.RpcNotificationReplyRequest) *pb.RpcNotificationReplyResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for NotificationReply") - } - - var r0 *pb.RpcNotificationReplyResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcNotificationReplyRequest) *pb.RpcNotificationReplyResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcNotificationReplyResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_NotificationReply_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NotificationReply' -type MockClientCommandsServer_NotificationReply_Call struct { - *mock.Call -} - -// NotificationReply is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcNotificationReplyRequest -func (_e *MockClientCommandsServer_Expecter) NotificationReply(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_NotificationReply_Call { - return &MockClientCommandsServer_NotificationReply_Call{Call: _e.mock.On("NotificationReply", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_NotificationReply_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcNotificationReplyRequest)) *MockClientCommandsServer_NotificationReply_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcNotificationReplyRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_NotificationReply_Call) Return(_a0 *pb.RpcNotificationReplyResponse) *MockClientCommandsServer_NotificationReply_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_NotificationReply_Call) RunAndReturn(run func(context.Context, *pb.RpcNotificationReplyRequest) *pb.RpcNotificationReplyResponse) *MockClientCommandsServer_NotificationReply_Call { - _c.Call.Return(run) - return _c -} - -// NotificationTest provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) NotificationTest(_a0 context.Context, _a1 *pb.RpcNotificationTestRequest) *pb.RpcNotificationTestResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for NotificationTest") - } - - var r0 *pb.RpcNotificationTestResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcNotificationTestRequest) *pb.RpcNotificationTestResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcNotificationTestResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_NotificationTest_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NotificationTest' -type MockClientCommandsServer_NotificationTest_Call struct { - *mock.Call -} - -// NotificationTest is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcNotificationTestRequest -func (_e *MockClientCommandsServer_Expecter) NotificationTest(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_NotificationTest_Call { - return &MockClientCommandsServer_NotificationTest_Call{Call: _e.mock.On("NotificationTest", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_NotificationTest_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcNotificationTestRequest)) *MockClientCommandsServer_NotificationTest_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcNotificationTestRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_NotificationTest_Call) Return(_a0 *pb.RpcNotificationTestResponse) *MockClientCommandsServer_NotificationTest_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_NotificationTest_Call) RunAndReturn(run func(context.Context, *pb.RpcNotificationTestRequest) *pb.RpcNotificationTestResponse) *MockClientCommandsServer_NotificationTest_Call { - _c.Call.Return(run) - return _c -} - -// ObjectApplyTemplate provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectApplyTemplate(_a0 context.Context, _a1 *pb.RpcObjectApplyTemplateRequest) *pb.RpcObjectApplyTemplateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectApplyTemplate") - } - - var r0 *pb.RpcObjectApplyTemplateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectApplyTemplateRequest) *pb.RpcObjectApplyTemplateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectApplyTemplateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectApplyTemplate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectApplyTemplate' -type MockClientCommandsServer_ObjectApplyTemplate_Call struct { - *mock.Call -} - -// ObjectApplyTemplate is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectApplyTemplateRequest -func (_e *MockClientCommandsServer_Expecter) ObjectApplyTemplate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectApplyTemplate_Call { - return &MockClientCommandsServer_ObjectApplyTemplate_Call{Call: _e.mock.On("ObjectApplyTemplate", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectApplyTemplate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectApplyTemplateRequest)) *MockClientCommandsServer_ObjectApplyTemplate_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectApplyTemplateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectApplyTemplate_Call) Return(_a0 *pb.RpcObjectApplyTemplateResponse) *MockClientCommandsServer_ObjectApplyTemplate_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectApplyTemplate_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectApplyTemplateRequest) *pb.RpcObjectApplyTemplateResponse) *MockClientCommandsServer_ObjectApplyTemplate_Call { - _c.Call.Return(run) - return _c -} - -// ObjectBookmarkFetch provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectBookmarkFetch(_a0 context.Context, _a1 *pb.RpcObjectBookmarkFetchRequest) *pb.RpcObjectBookmarkFetchResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectBookmarkFetch") - } - - var r0 *pb.RpcObjectBookmarkFetchResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectBookmarkFetchRequest) *pb.RpcObjectBookmarkFetchResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectBookmarkFetchResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectBookmarkFetch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectBookmarkFetch' -type MockClientCommandsServer_ObjectBookmarkFetch_Call struct { - *mock.Call -} - -// ObjectBookmarkFetch is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectBookmarkFetchRequest -func (_e *MockClientCommandsServer_Expecter) ObjectBookmarkFetch(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectBookmarkFetch_Call { - return &MockClientCommandsServer_ObjectBookmarkFetch_Call{Call: _e.mock.On("ObjectBookmarkFetch", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectBookmarkFetch_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectBookmarkFetchRequest)) *MockClientCommandsServer_ObjectBookmarkFetch_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectBookmarkFetchRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectBookmarkFetch_Call) Return(_a0 *pb.RpcObjectBookmarkFetchResponse) *MockClientCommandsServer_ObjectBookmarkFetch_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectBookmarkFetch_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectBookmarkFetchRequest) *pb.RpcObjectBookmarkFetchResponse) *MockClientCommandsServer_ObjectBookmarkFetch_Call { - _c.Call.Return(run) - return _c -} - -// ObjectChatAdd provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectChatAdd(_a0 context.Context, _a1 *pb.RpcObjectChatAddRequest) *pb.RpcObjectChatAddResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectChatAdd") - } - - var r0 *pb.RpcObjectChatAddResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectChatAddRequest) *pb.RpcObjectChatAddResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectChatAddResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectChatAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectChatAdd' -type MockClientCommandsServer_ObjectChatAdd_Call struct { - *mock.Call -} - -// ObjectChatAdd is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectChatAddRequest -func (_e *MockClientCommandsServer_Expecter) ObjectChatAdd(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectChatAdd_Call { - return &MockClientCommandsServer_ObjectChatAdd_Call{Call: _e.mock.On("ObjectChatAdd", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectChatAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectChatAddRequest)) *MockClientCommandsServer_ObjectChatAdd_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectChatAddRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectChatAdd_Call) Return(_a0 *pb.RpcObjectChatAddResponse) *MockClientCommandsServer_ObjectChatAdd_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectChatAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectChatAddRequest) *pb.RpcObjectChatAddResponse) *MockClientCommandsServer_ObjectChatAdd_Call { - _c.Call.Return(run) - return _c -} - -// ObjectClose provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectClose(_a0 context.Context, _a1 *pb.RpcObjectCloseRequest) *pb.RpcObjectCloseResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectClose") - } - - var r0 *pb.RpcObjectCloseResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCloseRequest) *pb.RpcObjectCloseResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectCloseResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectClose_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectClose' -type MockClientCommandsServer_ObjectClose_Call struct { - *mock.Call -} - -// ObjectClose is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectCloseRequest -func (_e *MockClientCommandsServer_Expecter) ObjectClose(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectClose_Call { - return &MockClientCommandsServer_ObjectClose_Call{Call: _e.mock.On("ObjectClose", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectClose_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCloseRequest)) *MockClientCommandsServer_ObjectClose_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectCloseRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectClose_Call) Return(_a0 *pb.RpcObjectCloseResponse) *MockClientCommandsServer_ObjectClose_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectClose_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCloseRequest) *pb.RpcObjectCloseResponse) *MockClientCommandsServer_ObjectClose_Call { - _c.Call.Return(run) - return _c -} - -// ObjectCollectionAdd provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectCollectionAdd(_a0 context.Context, _a1 *pb.RpcObjectCollectionAddRequest) *pb.RpcObjectCollectionAddResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectCollectionAdd") - } - - var r0 *pb.RpcObjectCollectionAddResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCollectionAddRequest) *pb.RpcObjectCollectionAddResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectCollectionAddResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectCollectionAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCollectionAdd' -type MockClientCommandsServer_ObjectCollectionAdd_Call struct { - *mock.Call -} - -// ObjectCollectionAdd is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectCollectionAddRequest -func (_e *MockClientCommandsServer_Expecter) ObjectCollectionAdd(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCollectionAdd_Call { - return &MockClientCommandsServer_ObjectCollectionAdd_Call{Call: _e.mock.On("ObjectCollectionAdd", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectCollectionAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCollectionAddRequest)) *MockClientCommandsServer_ObjectCollectionAdd_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectCollectionAddRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCollectionAdd_Call) Return(_a0 *pb.RpcObjectCollectionAddResponse) *MockClientCommandsServer_ObjectCollectionAdd_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCollectionAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCollectionAddRequest) *pb.RpcObjectCollectionAddResponse) *MockClientCommandsServer_ObjectCollectionAdd_Call { - _c.Call.Return(run) - return _c -} - -// ObjectCollectionRemove provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectCollectionRemove(_a0 context.Context, _a1 *pb.RpcObjectCollectionRemoveRequest) *pb.RpcObjectCollectionRemoveResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectCollectionRemove") - } - - var r0 *pb.RpcObjectCollectionRemoveResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCollectionRemoveRequest) *pb.RpcObjectCollectionRemoveResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectCollectionRemoveResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectCollectionRemove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCollectionRemove' -type MockClientCommandsServer_ObjectCollectionRemove_Call struct { - *mock.Call -} - -// ObjectCollectionRemove is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectCollectionRemoveRequest -func (_e *MockClientCommandsServer_Expecter) ObjectCollectionRemove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCollectionRemove_Call { - return &MockClientCommandsServer_ObjectCollectionRemove_Call{Call: _e.mock.On("ObjectCollectionRemove", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectCollectionRemove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCollectionRemoveRequest)) *MockClientCommandsServer_ObjectCollectionRemove_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectCollectionRemoveRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCollectionRemove_Call) Return(_a0 *pb.RpcObjectCollectionRemoveResponse) *MockClientCommandsServer_ObjectCollectionRemove_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCollectionRemove_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCollectionRemoveRequest) *pb.RpcObjectCollectionRemoveResponse) *MockClientCommandsServer_ObjectCollectionRemove_Call { - _c.Call.Return(run) - return _c -} - -// ObjectCollectionSort provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectCollectionSort(_a0 context.Context, _a1 *pb.RpcObjectCollectionSortRequest) *pb.RpcObjectCollectionSortResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectCollectionSort") - } - - var r0 *pb.RpcObjectCollectionSortResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCollectionSortRequest) *pb.RpcObjectCollectionSortResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectCollectionSortResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectCollectionSort_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCollectionSort' -type MockClientCommandsServer_ObjectCollectionSort_Call struct { - *mock.Call -} - -// ObjectCollectionSort is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectCollectionSortRequest -func (_e *MockClientCommandsServer_Expecter) ObjectCollectionSort(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCollectionSort_Call { - return &MockClientCommandsServer_ObjectCollectionSort_Call{Call: _e.mock.On("ObjectCollectionSort", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectCollectionSort_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCollectionSortRequest)) *MockClientCommandsServer_ObjectCollectionSort_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectCollectionSortRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCollectionSort_Call) Return(_a0 *pb.RpcObjectCollectionSortResponse) *MockClientCommandsServer_ObjectCollectionSort_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCollectionSort_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCollectionSortRequest) *pb.RpcObjectCollectionSortResponse) *MockClientCommandsServer_ObjectCollectionSort_Call { - _c.Call.Return(run) - return _c -} - -// ObjectCreate provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectCreate(_a0 context.Context, _a1 *pb.RpcObjectCreateRequest) *pb.RpcObjectCreateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectCreate") - } - - var r0 *pb.RpcObjectCreateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCreateRequest) *pb.RpcObjectCreateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectCreateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCreate' -type MockClientCommandsServer_ObjectCreate_Call struct { - *mock.Call -} - -// ObjectCreate is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectCreateRequest -func (_e *MockClientCommandsServer_Expecter) ObjectCreate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCreate_Call { - return &MockClientCommandsServer_ObjectCreate_Call{Call: _e.mock.On("ObjectCreate", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCreateRequest)) *MockClientCommandsServer_ObjectCreate_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectCreateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCreate_Call) Return(_a0 *pb.RpcObjectCreateResponse) *MockClientCommandsServer_ObjectCreate_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCreateRequest) *pb.RpcObjectCreateResponse) *MockClientCommandsServer_ObjectCreate_Call { - _c.Call.Return(run) - return _c -} - -// ObjectCreateBookmark provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectCreateBookmark(_a0 context.Context, _a1 *pb.RpcObjectCreateBookmarkRequest) *pb.RpcObjectCreateBookmarkResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectCreateBookmark") - } - - var r0 *pb.RpcObjectCreateBookmarkResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCreateBookmarkRequest) *pb.RpcObjectCreateBookmarkResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectCreateBookmarkResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectCreateBookmark_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCreateBookmark' -type MockClientCommandsServer_ObjectCreateBookmark_Call struct { - *mock.Call -} - -// ObjectCreateBookmark is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectCreateBookmarkRequest -func (_e *MockClientCommandsServer_Expecter) ObjectCreateBookmark(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCreateBookmark_Call { - return &MockClientCommandsServer_ObjectCreateBookmark_Call{Call: _e.mock.On("ObjectCreateBookmark", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectCreateBookmark_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCreateBookmarkRequest)) *MockClientCommandsServer_ObjectCreateBookmark_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectCreateBookmarkRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCreateBookmark_Call) Return(_a0 *pb.RpcObjectCreateBookmarkResponse) *MockClientCommandsServer_ObjectCreateBookmark_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCreateBookmark_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCreateBookmarkRequest) *pb.RpcObjectCreateBookmarkResponse) *MockClientCommandsServer_ObjectCreateBookmark_Call { - _c.Call.Return(run) - return _c -} - -// ObjectCreateFromUrl provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectCreateFromUrl(_a0 context.Context, _a1 *pb.RpcObjectCreateFromUrlRequest) *pb.RpcObjectCreateFromUrlResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectCreateFromUrl") - } - - var r0 *pb.RpcObjectCreateFromUrlResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCreateFromUrlRequest) *pb.RpcObjectCreateFromUrlResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectCreateFromUrlResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectCreateFromUrl_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCreateFromUrl' -type MockClientCommandsServer_ObjectCreateFromUrl_Call struct { - *mock.Call -} - -// ObjectCreateFromUrl is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectCreateFromUrlRequest -func (_e *MockClientCommandsServer_Expecter) ObjectCreateFromUrl(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCreateFromUrl_Call { - return &MockClientCommandsServer_ObjectCreateFromUrl_Call{Call: _e.mock.On("ObjectCreateFromUrl", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectCreateFromUrl_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCreateFromUrlRequest)) *MockClientCommandsServer_ObjectCreateFromUrl_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectCreateFromUrlRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCreateFromUrl_Call) Return(_a0 *pb.RpcObjectCreateFromUrlResponse) *MockClientCommandsServer_ObjectCreateFromUrl_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCreateFromUrl_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCreateFromUrlRequest) *pb.RpcObjectCreateFromUrlResponse) *MockClientCommandsServer_ObjectCreateFromUrl_Call { - _c.Call.Return(run) - return _c -} - -// ObjectCreateObjectType provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectCreateObjectType(_a0 context.Context, _a1 *pb.RpcObjectCreateObjectTypeRequest) *pb.RpcObjectCreateObjectTypeResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectCreateObjectType") - } - - var r0 *pb.RpcObjectCreateObjectTypeResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCreateObjectTypeRequest) *pb.RpcObjectCreateObjectTypeResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectCreateObjectTypeResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectCreateObjectType_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCreateObjectType' -type MockClientCommandsServer_ObjectCreateObjectType_Call struct { - *mock.Call -} - -// ObjectCreateObjectType is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectCreateObjectTypeRequest -func (_e *MockClientCommandsServer_Expecter) ObjectCreateObjectType(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCreateObjectType_Call { - return &MockClientCommandsServer_ObjectCreateObjectType_Call{Call: _e.mock.On("ObjectCreateObjectType", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectCreateObjectType_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCreateObjectTypeRequest)) *MockClientCommandsServer_ObjectCreateObjectType_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectCreateObjectTypeRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCreateObjectType_Call) Return(_a0 *pb.RpcObjectCreateObjectTypeResponse) *MockClientCommandsServer_ObjectCreateObjectType_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCreateObjectType_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCreateObjectTypeRequest) *pb.RpcObjectCreateObjectTypeResponse) *MockClientCommandsServer_ObjectCreateObjectType_Call { - _c.Call.Return(run) - return _c -} - -// ObjectCreateRelation provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectCreateRelation(_a0 context.Context, _a1 *pb.RpcObjectCreateRelationRequest) *pb.RpcObjectCreateRelationResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectCreateRelation") - } - - var r0 *pb.RpcObjectCreateRelationResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCreateRelationRequest) *pb.RpcObjectCreateRelationResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectCreateRelationResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectCreateRelation_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCreateRelation' -type MockClientCommandsServer_ObjectCreateRelation_Call struct { - *mock.Call -} - -// ObjectCreateRelation is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectCreateRelationRequest -func (_e *MockClientCommandsServer_Expecter) ObjectCreateRelation(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCreateRelation_Call { - return &MockClientCommandsServer_ObjectCreateRelation_Call{Call: _e.mock.On("ObjectCreateRelation", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectCreateRelation_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCreateRelationRequest)) *MockClientCommandsServer_ObjectCreateRelation_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectCreateRelationRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCreateRelation_Call) Return(_a0 *pb.RpcObjectCreateRelationResponse) *MockClientCommandsServer_ObjectCreateRelation_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCreateRelation_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCreateRelationRequest) *pb.RpcObjectCreateRelationResponse) *MockClientCommandsServer_ObjectCreateRelation_Call { - _c.Call.Return(run) - return _c -} - -// ObjectCreateRelationOption provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectCreateRelationOption(_a0 context.Context, _a1 *pb.RpcObjectCreateRelationOptionRequest) *pb.RpcObjectCreateRelationOptionResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectCreateRelationOption") - } - - var r0 *pb.RpcObjectCreateRelationOptionResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCreateRelationOptionRequest) *pb.RpcObjectCreateRelationOptionResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectCreateRelationOptionResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectCreateRelationOption_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCreateRelationOption' -type MockClientCommandsServer_ObjectCreateRelationOption_Call struct { - *mock.Call -} - -// ObjectCreateRelationOption is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectCreateRelationOptionRequest -func (_e *MockClientCommandsServer_Expecter) ObjectCreateRelationOption(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCreateRelationOption_Call { - return &MockClientCommandsServer_ObjectCreateRelationOption_Call{Call: _e.mock.On("ObjectCreateRelationOption", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectCreateRelationOption_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCreateRelationOptionRequest)) *MockClientCommandsServer_ObjectCreateRelationOption_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectCreateRelationOptionRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCreateRelationOption_Call) Return(_a0 *pb.RpcObjectCreateRelationOptionResponse) *MockClientCommandsServer_ObjectCreateRelationOption_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCreateRelationOption_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCreateRelationOptionRequest) *pb.RpcObjectCreateRelationOptionResponse) *MockClientCommandsServer_ObjectCreateRelationOption_Call { - _c.Call.Return(run) - return _c -} - -// ObjectCreateSet provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectCreateSet(_a0 context.Context, _a1 *pb.RpcObjectCreateSetRequest) *pb.RpcObjectCreateSetResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectCreateSet") - } - - var r0 *pb.RpcObjectCreateSetResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCreateSetRequest) *pb.RpcObjectCreateSetResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectCreateSetResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectCreateSet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCreateSet' -type MockClientCommandsServer_ObjectCreateSet_Call struct { - *mock.Call -} - -// ObjectCreateSet is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectCreateSetRequest -func (_e *MockClientCommandsServer_Expecter) ObjectCreateSet(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCreateSet_Call { - return &MockClientCommandsServer_ObjectCreateSet_Call{Call: _e.mock.On("ObjectCreateSet", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectCreateSet_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCreateSetRequest)) *MockClientCommandsServer_ObjectCreateSet_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectCreateSetRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCreateSet_Call) Return(_a0 *pb.RpcObjectCreateSetResponse) *MockClientCommandsServer_ObjectCreateSet_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCreateSet_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCreateSetRequest) *pb.RpcObjectCreateSetResponse) *MockClientCommandsServer_ObjectCreateSet_Call { - _c.Call.Return(run) - return _c -} - -// ObjectCrossSpaceSearchSubscribe provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectCrossSpaceSearchSubscribe(_a0 context.Context, _a1 *pb.RpcObjectCrossSpaceSearchSubscribeRequest) *pb.RpcObjectCrossSpaceSearchSubscribeResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectCrossSpaceSearchSubscribe") - } - - var r0 *pb.RpcObjectCrossSpaceSearchSubscribeResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCrossSpaceSearchSubscribeRequest) *pb.RpcObjectCrossSpaceSearchSubscribeResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectCrossSpaceSearchSubscribeResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectCrossSpaceSearchSubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCrossSpaceSearchSubscribe' -type MockClientCommandsServer_ObjectCrossSpaceSearchSubscribe_Call struct { - *mock.Call -} - -// ObjectCrossSpaceSearchSubscribe is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectCrossSpaceSearchSubscribeRequest -func (_e *MockClientCommandsServer_Expecter) ObjectCrossSpaceSearchSubscribe(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCrossSpaceSearchSubscribe_Call { - return &MockClientCommandsServer_ObjectCrossSpaceSearchSubscribe_Call{Call: _e.mock.On("ObjectCrossSpaceSearchSubscribe", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectCrossSpaceSearchSubscribe_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCrossSpaceSearchSubscribeRequest)) *MockClientCommandsServer_ObjectCrossSpaceSearchSubscribe_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectCrossSpaceSearchSubscribeRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCrossSpaceSearchSubscribe_Call) Return(_a0 *pb.RpcObjectCrossSpaceSearchSubscribeResponse) *MockClientCommandsServer_ObjectCrossSpaceSearchSubscribe_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCrossSpaceSearchSubscribe_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCrossSpaceSearchSubscribeRequest) *pb.RpcObjectCrossSpaceSearchSubscribeResponse) *MockClientCommandsServer_ObjectCrossSpaceSearchSubscribe_Call { - _c.Call.Return(run) - return _c -} - -// ObjectCrossSpaceSearchUnsubscribe provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectCrossSpaceSearchUnsubscribe(_a0 context.Context, _a1 *pb.RpcObjectCrossSpaceSearchUnsubscribeRequest) *pb.RpcObjectCrossSpaceSearchUnsubscribeResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectCrossSpaceSearchUnsubscribe") - } - - var r0 *pb.RpcObjectCrossSpaceSearchUnsubscribeResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCrossSpaceSearchUnsubscribeRequest) *pb.RpcObjectCrossSpaceSearchUnsubscribeResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectCrossSpaceSearchUnsubscribeResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectCrossSpaceSearchUnsubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCrossSpaceSearchUnsubscribe' -type MockClientCommandsServer_ObjectCrossSpaceSearchUnsubscribe_Call struct { - *mock.Call -} - -// ObjectCrossSpaceSearchUnsubscribe is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectCrossSpaceSearchUnsubscribeRequest -func (_e *MockClientCommandsServer_Expecter) ObjectCrossSpaceSearchUnsubscribe(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCrossSpaceSearchUnsubscribe_Call { - return &MockClientCommandsServer_ObjectCrossSpaceSearchUnsubscribe_Call{Call: _e.mock.On("ObjectCrossSpaceSearchUnsubscribe", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectCrossSpaceSearchUnsubscribe_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCrossSpaceSearchUnsubscribeRequest)) *MockClientCommandsServer_ObjectCrossSpaceSearchUnsubscribe_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectCrossSpaceSearchUnsubscribeRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCrossSpaceSearchUnsubscribe_Call) Return(_a0 *pb.RpcObjectCrossSpaceSearchUnsubscribeResponse) *MockClientCommandsServer_ObjectCrossSpaceSearchUnsubscribe_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectCrossSpaceSearchUnsubscribe_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCrossSpaceSearchUnsubscribeRequest) *pb.RpcObjectCrossSpaceSearchUnsubscribeResponse) *MockClientCommandsServer_ObjectCrossSpaceSearchUnsubscribe_Call { - _c.Call.Return(run) - return _c -} - -// ObjectDateByTimestamp provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectDateByTimestamp(_a0 context.Context, _a1 *pb.RpcObjectDateByTimestampRequest) *pb.RpcObjectDateByTimestampResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectDateByTimestamp") - } - - var r0 *pb.RpcObjectDateByTimestampResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectDateByTimestampRequest) *pb.RpcObjectDateByTimestampResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectDateByTimestampResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectDateByTimestamp_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectDateByTimestamp' -type MockClientCommandsServer_ObjectDateByTimestamp_Call struct { - *mock.Call -} - -// ObjectDateByTimestamp is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectDateByTimestampRequest -func (_e *MockClientCommandsServer_Expecter) ObjectDateByTimestamp(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectDateByTimestamp_Call { - return &MockClientCommandsServer_ObjectDateByTimestamp_Call{Call: _e.mock.On("ObjectDateByTimestamp", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectDateByTimestamp_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectDateByTimestampRequest)) *MockClientCommandsServer_ObjectDateByTimestamp_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectDateByTimestampRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectDateByTimestamp_Call) Return(_a0 *pb.RpcObjectDateByTimestampResponse) *MockClientCommandsServer_ObjectDateByTimestamp_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectDateByTimestamp_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectDateByTimestampRequest) *pb.RpcObjectDateByTimestampResponse) *MockClientCommandsServer_ObjectDateByTimestamp_Call { - _c.Call.Return(run) - return _c -} - -// ObjectDuplicate provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectDuplicate(_a0 context.Context, _a1 *pb.RpcObjectDuplicateRequest) *pb.RpcObjectDuplicateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectDuplicate") - } - - var r0 *pb.RpcObjectDuplicateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectDuplicateRequest) *pb.RpcObjectDuplicateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectDuplicateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectDuplicate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectDuplicate' -type MockClientCommandsServer_ObjectDuplicate_Call struct { - *mock.Call -} - -// ObjectDuplicate is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectDuplicateRequest -func (_e *MockClientCommandsServer_Expecter) ObjectDuplicate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectDuplicate_Call { - return &MockClientCommandsServer_ObjectDuplicate_Call{Call: _e.mock.On("ObjectDuplicate", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectDuplicate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectDuplicateRequest)) *MockClientCommandsServer_ObjectDuplicate_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectDuplicateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectDuplicate_Call) Return(_a0 *pb.RpcObjectDuplicateResponse) *MockClientCommandsServer_ObjectDuplicate_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectDuplicate_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectDuplicateRequest) *pb.RpcObjectDuplicateResponse) *MockClientCommandsServer_ObjectDuplicate_Call { - _c.Call.Return(run) - return _c -} - -// ObjectGraph provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectGraph(_a0 context.Context, _a1 *pb.RpcObjectGraphRequest) *pb.RpcObjectGraphResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectGraph") - } - - var r0 *pb.RpcObjectGraphResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectGraphRequest) *pb.RpcObjectGraphResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectGraphResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectGraph_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectGraph' -type MockClientCommandsServer_ObjectGraph_Call struct { - *mock.Call -} - -// ObjectGraph is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectGraphRequest -func (_e *MockClientCommandsServer_Expecter) ObjectGraph(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectGraph_Call { - return &MockClientCommandsServer_ObjectGraph_Call{Call: _e.mock.On("ObjectGraph", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectGraph_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectGraphRequest)) *MockClientCommandsServer_ObjectGraph_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectGraphRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectGraph_Call) Return(_a0 *pb.RpcObjectGraphResponse) *MockClientCommandsServer_ObjectGraph_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectGraph_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectGraphRequest) *pb.RpcObjectGraphResponse) *MockClientCommandsServer_ObjectGraph_Call { - _c.Call.Return(run) - return _c -} - -// ObjectGroupsSubscribe provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectGroupsSubscribe(_a0 context.Context, _a1 *pb.RpcObjectGroupsSubscribeRequest) *pb.RpcObjectGroupsSubscribeResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectGroupsSubscribe") - } - - var r0 *pb.RpcObjectGroupsSubscribeResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectGroupsSubscribeRequest) *pb.RpcObjectGroupsSubscribeResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectGroupsSubscribeResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectGroupsSubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectGroupsSubscribe' -type MockClientCommandsServer_ObjectGroupsSubscribe_Call struct { - *mock.Call -} - -// ObjectGroupsSubscribe is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectGroupsSubscribeRequest -func (_e *MockClientCommandsServer_Expecter) ObjectGroupsSubscribe(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectGroupsSubscribe_Call { - return &MockClientCommandsServer_ObjectGroupsSubscribe_Call{Call: _e.mock.On("ObjectGroupsSubscribe", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectGroupsSubscribe_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectGroupsSubscribeRequest)) *MockClientCommandsServer_ObjectGroupsSubscribe_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectGroupsSubscribeRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectGroupsSubscribe_Call) Return(_a0 *pb.RpcObjectGroupsSubscribeResponse) *MockClientCommandsServer_ObjectGroupsSubscribe_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectGroupsSubscribe_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectGroupsSubscribeRequest) *pb.RpcObjectGroupsSubscribeResponse) *MockClientCommandsServer_ObjectGroupsSubscribe_Call { - _c.Call.Return(run) - return _c -} - -// ObjectImport provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectImport(_a0 context.Context, _a1 *pb.RpcObjectImportRequest) *pb.RpcObjectImportResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectImport") - } - - var r0 *pb.RpcObjectImportResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectImportRequest) *pb.RpcObjectImportResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectImportResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectImport_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectImport' -type MockClientCommandsServer_ObjectImport_Call struct { - *mock.Call -} - -// ObjectImport is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectImportRequest -func (_e *MockClientCommandsServer_Expecter) ObjectImport(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectImport_Call { - return &MockClientCommandsServer_ObjectImport_Call{Call: _e.mock.On("ObjectImport", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectImport_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectImportRequest)) *MockClientCommandsServer_ObjectImport_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectImportRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectImport_Call) Return(_a0 *pb.RpcObjectImportResponse) *MockClientCommandsServer_ObjectImport_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectImport_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectImportRequest) *pb.RpcObjectImportResponse) *MockClientCommandsServer_ObjectImport_Call { - _c.Call.Return(run) - return _c -} - -// ObjectImportExperience provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectImportExperience(_a0 context.Context, _a1 *pb.RpcObjectImportExperienceRequest) *pb.RpcObjectImportExperienceResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectImportExperience") - } - - var r0 *pb.RpcObjectImportExperienceResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectImportExperienceRequest) *pb.RpcObjectImportExperienceResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectImportExperienceResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectImportExperience_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectImportExperience' -type MockClientCommandsServer_ObjectImportExperience_Call struct { - *mock.Call -} - -// ObjectImportExperience is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectImportExperienceRequest -func (_e *MockClientCommandsServer_Expecter) ObjectImportExperience(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectImportExperience_Call { - return &MockClientCommandsServer_ObjectImportExperience_Call{Call: _e.mock.On("ObjectImportExperience", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectImportExperience_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectImportExperienceRequest)) *MockClientCommandsServer_ObjectImportExperience_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectImportExperienceRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectImportExperience_Call) Return(_a0 *pb.RpcObjectImportExperienceResponse) *MockClientCommandsServer_ObjectImportExperience_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectImportExperience_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectImportExperienceRequest) *pb.RpcObjectImportExperienceResponse) *MockClientCommandsServer_ObjectImportExperience_Call { - _c.Call.Return(run) - return _c -} - -// ObjectImportList provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectImportList(_a0 context.Context, _a1 *pb.RpcObjectImportListRequest) *pb.RpcObjectImportListResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectImportList") - } - - var r0 *pb.RpcObjectImportListResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectImportListRequest) *pb.RpcObjectImportListResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectImportListResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectImportList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectImportList' -type MockClientCommandsServer_ObjectImportList_Call struct { - *mock.Call -} - -// ObjectImportList is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectImportListRequest -func (_e *MockClientCommandsServer_Expecter) ObjectImportList(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectImportList_Call { - return &MockClientCommandsServer_ObjectImportList_Call{Call: _e.mock.On("ObjectImportList", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectImportList_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectImportListRequest)) *MockClientCommandsServer_ObjectImportList_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectImportListRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectImportList_Call) Return(_a0 *pb.RpcObjectImportListResponse) *MockClientCommandsServer_ObjectImportList_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectImportList_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectImportListRequest) *pb.RpcObjectImportListResponse) *MockClientCommandsServer_ObjectImportList_Call { - _c.Call.Return(run) - return _c -} - -// ObjectImportNotionValidateToken provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectImportNotionValidateToken(_a0 context.Context, _a1 *pb.RpcObjectImportNotionValidateTokenRequest) *pb.RpcObjectImportNotionValidateTokenResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectImportNotionValidateToken") - } - - var r0 *pb.RpcObjectImportNotionValidateTokenResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectImportNotionValidateTokenRequest) *pb.RpcObjectImportNotionValidateTokenResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectImportNotionValidateTokenResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectImportNotionValidateToken_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectImportNotionValidateToken' -type MockClientCommandsServer_ObjectImportNotionValidateToken_Call struct { - *mock.Call -} - -// ObjectImportNotionValidateToken is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectImportNotionValidateTokenRequest -func (_e *MockClientCommandsServer_Expecter) ObjectImportNotionValidateToken(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectImportNotionValidateToken_Call { - return &MockClientCommandsServer_ObjectImportNotionValidateToken_Call{Call: _e.mock.On("ObjectImportNotionValidateToken", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectImportNotionValidateToken_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectImportNotionValidateTokenRequest)) *MockClientCommandsServer_ObjectImportNotionValidateToken_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectImportNotionValidateTokenRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectImportNotionValidateToken_Call) Return(_a0 *pb.RpcObjectImportNotionValidateTokenResponse) *MockClientCommandsServer_ObjectImportNotionValidateToken_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectImportNotionValidateToken_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectImportNotionValidateTokenRequest) *pb.RpcObjectImportNotionValidateTokenResponse) *MockClientCommandsServer_ObjectImportNotionValidateToken_Call { - _c.Call.Return(run) - return _c -} - -// ObjectImportUseCase provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectImportUseCase(_a0 context.Context, _a1 *pb.RpcObjectImportUseCaseRequest) *pb.RpcObjectImportUseCaseResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectImportUseCase") - } - - var r0 *pb.RpcObjectImportUseCaseResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectImportUseCaseRequest) *pb.RpcObjectImportUseCaseResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectImportUseCaseResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectImportUseCase_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectImportUseCase' -type MockClientCommandsServer_ObjectImportUseCase_Call struct { - *mock.Call -} - -// ObjectImportUseCase is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectImportUseCaseRequest -func (_e *MockClientCommandsServer_Expecter) ObjectImportUseCase(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectImportUseCase_Call { - return &MockClientCommandsServer_ObjectImportUseCase_Call{Call: _e.mock.On("ObjectImportUseCase", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectImportUseCase_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectImportUseCaseRequest)) *MockClientCommandsServer_ObjectImportUseCase_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectImportUseCaseRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectImportUseCase_Call) Return(_a0 *pb.RpcObjectImportUseCaseResponse) *MockClientCommandsServer_ObjectImportUseCase_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectImportUseCase_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectImportUseCaseRequest) *pb.RpcObjectImportUseCaseResponse) *MockClientCommandsServer_ObjectImportUseCase_Call { - _c.Call.Return(run) - return _c -} - -// ObjectListDelete provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectListDelete(_a0 context.Context, _a1 *pb.RpcObjectListDeleteRequest) *pb.RpcObjectListDeleteResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectListDelete") - } - - var r0 *pb.RpcObjectListDeleteResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectListDeleteRequest) *pb.RpcObjectListDeleteResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectListDeleteResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectListDelete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectListDelete' -type MockClientCommandsServer_ObjectListDelete_Call struct { - *mock.Call -} - -// ObjectListDelete is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectListDeleteRequest -func (_e *MockClientCommandsServer_Expecter) ObjectListDelete(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectListDelete_Call { - return &MockClientCommandsServer_ObjectListDelete_Call{Call: _e.mock.On("ObjectListDelete", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectListDelete_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectListDeleteRequest)) *MockClientCommandsServer_ObjectListDelete_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectListDeleteRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectListDelete_Call) Return(_a0 *pb.RpcObjectListDeleteResponse) *MockClientCommandsServer_ObjectListDelete_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectListDelete_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectListDeleteRequest) *pb.RpcObjectListDeleteResponse) *MockClientCommandsServer_ObjectListDelete_Call { - _c.Call.Return(run) - return _c -} - -// ObjectListDuplicate provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectListDuplicate(_a0 context.Context, _a1 *pb.RpcObjectListDuplicateRequest) *pb.RpcObjectListDuplicateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectListDuplicate") - } - - var r0 *pb.RpcObjectListDuplicateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectListDuplicateRequest) *pb.RpcObjectListDuplicateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectListDuplicateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectListDuplicate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectListDuplicate' -type MockClientCommandsServer_ObjectListDuplicate_Call struct { - *mock.Call -} - -// ObjectListDuplicate is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectListDuplicateRequest -func (_e *MockClientCommandsServer_Expecter) ObjectListDuplicate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectListDuplicate_Call { - return &MockClientCommandsServer_ObjectListDuplicate_Call{Call: _e.mock.On("ObjectListDuplicate", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectListDuplicate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectListDuplicateRequest)) *MockClientCommandsServer_ObjectListDuplicate_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectListDuplicateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectListDuplicate_Call) Return(_a0 *pb.RpcObjectListDuplicateResponse) *MockClientCommandsServer_ObjectListDuplicate_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectListDuplicate_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectListDuplicateRequest) *pb.RpcObjectListDuplicateResponse) *MockClientCommandsServer_ObjectListDuplicate_Call { - _c.Call.Return(run) - return _c -} - -// ObjectListExport provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectListExport(_a0 context.Context, _a1 *pb.RpcObjectListExportRequest) *pb.RpcObjectListExportResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectListExport") - } - - var r0 *pb.RpcObjectListExportResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectListExportRequest) *pb.RpcObjectListExportResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectListExportResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectListExport_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectListExport' -type MockClientCommandsServer_ObjectListExport_Call struct { - *mock.Call -} - -// ObjectListExport is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectListExportRequest -func (_e *MockClientCommandsServer_Expecter) ObjectListExport(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectListExport_Call { - return &MockClientCommandsServer_ObjectListExport_Call{Call: _e.mock.On("ObjectListExport", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectListExport_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectListExportRequest)) *MockClientCommandsServer_ObjectListExport_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectListExportRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectListExport_Call) Return(_a0 *pb.RpcObjectListExportResponse) *MockClientCommandsServer_ObjectListExport_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectListExport_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectListExportRequest) *pb.RpcObjectListExportResponse) *MockClientCommandsServer_ObjectListExport_Call { - _c.Call.Return(run) - return _c -} - -// ObjectListModifyDetailValues provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectListModifyDetailValues(_a0 context.Context, _a1 *pb.RpcObjectListModifyDetailValuesRequest) *pb.RpcObjectListModifyDetailValuesResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectListModifyDetailValues") - } - - var r0 *pb.RpcObjectListModifyDetailValuesResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectListModifyDetailValuesRequest) *pb.RpcObjectListModifyDetailValuesResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectListModifyDetailValuesResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectListModifyDetailValues_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectListModifyDetailValues' -type MockClientCommandsServer_ObjectListModifyDetailValues_Call struct { - *mock.Call -} - -// ObjectListModifyDetailValues is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectListModifyDetailValuesRequest -func (_e *MockClientCommandsServer_Expecter) ObjectListModifyDetailValues(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectListModifyDetailValues_Call { - return &MockClientCommandsServer_ObjectListModifyDetailValues_Call{Call: _e.mock.On("ObjectListModifyDetailValues", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectListModifyDetailValues_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectListModifyDetailValuesRequest)) *MockClientCommandsServer_ObjectListModifyDetailValues_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectListModifyDetailValuesRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectListModifyDetailValues_Call) Return(_a0 *pb.RpcObjectListModifyDetailValuesResponse) *MockClientCommandsServer_ObjectListModifyDetailValues_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectListModifyDetailValues_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectListModifyDetailValuesRequest) *pb.RpcObjectListModifyDetailValuesResponse) *MockClientCommandsServer_ObjectListModifyDetailValues_Call { - _c.Call.Return(run) - return _c -} - -// ObjectListSetDetails provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectListSetDetails(_a0 context.Context, _a1 *pb.RpcObjectListSetDetailsRequest) *pb.RpcObjectListSetDetailsResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectListSetDetails") - } - - var r0 *pb.RpcObjectListSetDetailsResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectListSetDetailsRequest) *pb.RpcObjectListSetDetailsResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectListSetDetailsResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectListSetDetails_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectListSetDetails' -type MockClientCommandsServer_ObjectListSetDetails_Call struct { - *mock.Call -} - -// ObjectListSetDetails is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectListSetDetailsRequest -func (_e *MockClientCommandsServer_Expecter) ObjectListSetDetails(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectListSetDetails_Call { - return &MockClientCommandsServer_ObjectListSetDetails_Call{Call: _e.mock.On("ObjectListSetDetails", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectListSetDetails_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectListSetDetailsRequest)) *MockClientCommandsServer_ObjectListSetDetails_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectListSetDetailsRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectListSetDetails_Call) Return(_a0 *pb.RpcObjectListSetDetailsResponse) *MockClientCommandsServer_ObjectListSetDetails_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectListSetDetails_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectListSetDetailsRequest) *pb.RpcObjectListSetDetailsResponse) *MockClientCommandsServer_ObjectListSetDetails_Call { - _c.Call.Return(run) - return _c -} - -// ObjectListSetIsArchived provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectListSetIsArchived(_a0 context.Context, _a1 *pb.RpcObjectListSetIsArchivedRequest) *pb.RpcObjectListSetIsArchivedResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectListSetIsArchived") - } - - var r0 *pb.RpcObjectListSetIsArchivedResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectListSetIsArchivedRequest) *pb.RpcObjectListSetIsArchivedResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectListSetIsArchivedResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectListSetIsArchived_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectListSetIsArchived' -type MockClientCommandsServer_ObjectListSetIsArchived_Call struct { - *mock.Call -} - -// ObjectListSetIsArchived is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectListSetIsArchivedRequest -func (_e *MockClientCommandsServer_Expecter) ObjectListSetIsArchived(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectListSetIsArchived_Call { - return &MockClientCommandsServer_ObjectListSetIsArchived_Call{Call: _e.mock.On("ObjectListSetIsArchived", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectListSetIsArchived_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectListSetIsArchivedRequest)) *MockClientCommandsServer_ObjectListSetIsArchived_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectListSetIsArchivedRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectListSetIsArchived_Call) Return(_a0 *pb.RpcObjectListSetIsArchivedResponse) *MockClientCommandsServer_ObjectListSetIsArchived_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectListSetIsArchived_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectListSetIsArchivedRequest) *pb.RpcObjectListSetIsArchivedResponse) *MockClientCommandsServer_ObjectListSetIsArchived_Call { - _c.Call.Return(run) - return _c -} - -// ObjectListSetIsFavorite provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectListSetIsFavorite(_a0 context.Context, _a1 *pb.RpcObjectListSetIsFavoriteRequest) *pb.RpcObjectListSetIsFavoriteResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectListSetIsFavorite") - } - - var r0 *pb.RpcObjectListSetIsFavoriteResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectListSetIsFavoriteRequest) *pb.RpcObjectListSetIsFavoriteResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectListSetIsFavoriteResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectListSetIsFavorite_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectListSetIsFavorite' -type MockClientCommandsServer_ObjectListSetIsFavorite_Call struct { - *mock.Call -} - -// ObjectListSetIsFavorite is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectListSetIsFavoriteRequest -func (_e *MockClientCommandsServer_Expecter) ObjectListSetIsFavorite(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectListSetIsFavorite_Call { - return &MockClientCommandsServer_ObjectListSetIsFavorite_Call{Call: _e.mock.On("ObjectListSetIsFavorite", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectListSetIsFavorite_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectListSetIsFavoriteRequest)) *MockClientCommandsServer_ObjectListSetIsFavorite_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectListSetIsFavoriteRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectListSetIsFavorite_Call) Return(_a0 *pb.RpcObjectListSetIsFavoriteResponse) *MockClientCommandsServer_ObjectListSetIsFavorite_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectListSetIsFavorite_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectListSetIsFavoriteRequest) *pb.RpcObjectListSetIsFavoriteResponse) *MockClientCommandsServer_ObjectListSetIsFavorite_Call { - _c.Call.Return(run) - return _c -} - -// ObjectListSetObjectType provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectListSetObjectType(_a0 context.Context, _a1 *pb.RpcObjectListSetObjectTypeRequest) *pb.RpcObjectListSetObjectTypeResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectListSetObjectType") - } - - var r0 *pb.RpcObjectListSetObjectTypeResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectListSetObjectTypeRequest) *pb.RpcObjectListSetObjectTypeResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectListSetObjectTypeResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectListSetObjectType_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectListSetObjectType' -type MockClientCommandsServer_ObjectListSetObjectType_Call struct { - *mock.Call -} - -// ObjectListSetObjectType is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectListSetObjectTypeRequest -func (_e *MockClientCommandsServer_Expecter) ObjectListSetObjectType(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectListSetObjectType_Call { - return &MockClientCommandsServer_ObjectListSetObjectType_Call{Call: _e.mock.On("ObjectListSetObjectType", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectListSetObjectType_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectListSetObjectTypeRequest)) *MockClientCommandsServer_ObjectListSetObjectType_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectListSetObjectTypeRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectListSetObjectType_Call) Return(_a0 *pb.RpcObjectListSetObjectTypeResponse) *MockClientCommandsServer_ObjectListSetObjectType_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectListSetObjectType_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectListSetObjectTypeRequest) *pb.RpcObjectListSetObjectTypeResponse) *MockClientCommandsServer_ObjectListSetObjectType_Call { - _c.Call.Return(run) - return _c -} - -// ObjectOpen provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectOpen(_a0 context.Context, _a1 *pb.RpcObjectOpenRequest) *pb.RpcObjectOpenResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectOpen") - } - - var r0 *pb.RpcObjectOpenResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectOpenRequest) *pb.RpcObjectOpenResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectOpenResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectOpen_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectOpen' -type MockClientCommandsServer_ObjectOpen_Call struct { - *mock.Call -} - -// ObjectOpen is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectOpenRequest -func (_e *MockClientCommandsServer_Expecter) ObjectOpen(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectOpen_Call { - return &MockClientCommandsServer_ObjectOpen_Call{Call: _e.mock.On("ObjectOpen", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectOpen_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectOpenRequest)) *MockClientCommandsServer_ObjectOpen_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectOpenRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectOpen_Call) Return(_a0 *pb.RpcObjectOpenResponse) *MockClientCommandsServer_ObjectOpen_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectOpen_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectOpenRequest) *pb.RpcObjectOpenResponse) *MockClientCommandsServer_ObjectOpen_Call { - _c.Call.Return(run) - return _c -} - -// ObjectRedo provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectRedo(_a0 context.Context, _a1 *pb.RpcObjectRedoRequest) *pb.RpcObjectRedoResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectRedo") - } - - var r0 *pb.RpcObjectRedoResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectRedoRequest) *pb.RpcObjectRedoResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectRedoResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectRedo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectRedo' -type MockClientCommandsServer_ObjectRedo_Call struct { - *mock.Call -} - -// ObjectRedo is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectRedoRequest -func (_e *MockClientCommandsServer_Expecter) ObjectRedo(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectRedo_Call { - return &MockClientCommandsServer_ObjectRedo_Call{Call: _e.mock.On("ObjectRedo", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectRedo_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectRedoRequest)) *MockClientCommandsServer_ObjectRedo_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectRedoRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectRedo_Call) Return(_a0 *pb.RpcObjectRedoResponse) *MockClientCommandsServer_ObjectRedo_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectRedo_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectRedoRequest) *pb.RpcObjectRedoResponse) *MockClientCommandsServer_ObjectRedo_Call { - _c.Call.Return(run) - return _c -} - -// ObjectRelationAdd provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectRelationAdd(_a0 context.Context, _a1 *pb.RpcObjectRelationAddRequest) *pb.RpcObjectRelationAddResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectRelationAdd") - } - - var r0 *pb.RpcObjectRelationAddResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectRelationAddRequest) *pb.RpcObjectRelationAddResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectRelationAddResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectRelationAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectRelationAdd' -type MockClientCommandsServer_ObjectRelationAdd_Call struct { - *mock.Call -} - -// ObjectRelationAdd is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectRelationAddRequest -func (_e *MockClientCommandsServer_Expecter) ObjectRelationAdd(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectRelationAdd_Call { - return &MockClientCommandsServer_ObjectRelationAdd_Call{Call: _e.mock.On("ObjectRelationAdd", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectRelationAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectRelationAddRequest)) *MockClientCommandsServer_ObjectRelationAdd_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectRelationAddRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectRelationAdd_Call) Return(_a0 *pb.RpcObjectRelationAddResponse) *MockClientCommandsServer_ObjectRelationAdd_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectRelationAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectRelationAddRequest) *pb.RpcObjectRelationAddResponse) *MockClientCommandsServer_ObjectRelationAdd_Call { - _c.Call.Return(run) - return _c -} - -// ObjectRelationAddFeatured provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectRelationAddFeatured(_a0 context.Context, _a1 *pb.RpcObjectRelationAddFeaturedRequest) *pb.RpcObjectRelationAddFeaturedResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectRelationAddFeatured") - } - - var r0 *pb.RpcObjectRelationAddFeaturedResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectRelationAddFeaturedRequest) *pb.RpcObjectRelationAddFeaturedResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectRelationAddFeaturedResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectRelationAddFeatured_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectRelationAddFeatured' -type MockClientCommandsServer_ObjectRelationAddFeatured_Call struct { - *mock.Call -} - -// ObjectRelationAddFeatured is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectRelationAddFeaturedRequest -func (_e *MockClientCommandsServer_Expecter) ObjectRelationAddFeatured(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectRelationAddFeatured_Call { - return &MockClientCommandsServer_ObjectRelationAddFeatured_Call{Call: _e.mock.On("ObjectRelationAddFeatured", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectRelationAddFeatured_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectRelationAddFeaturedRequest)) *MockClientCommandsServer_ObjectRelationAddFeatured_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectRelationAddFeaturedRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectRelationAddFeatured_Call) Return(_a0 *pb.RpcObjectRelationAddFeaturedResponse) *MockClientCommandsServer_ObjectRelationAddFeatured_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectRelationAddFeatured_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectRelationAddFeaturedRequest) *pb.RpcObjectRelationAddFeaturedResponse) *MockClientCommandsServer_ObjectRelationAddFeatured_Call { - _c.Call.Return(run) - return _c -} - -// ObjectRelationDelete provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectRelationDelete(_a0 context.Context, _a1 *pb.RpcObjectRelationDeleteRequest) *pb.RpcObjectRelationDeleteResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectRelationDelete") - } - - var r0 *pb.RpcObjectRelationDeleteResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectRelationDeleteRequest) *pb.RpcObjectRelationDeleteResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectRelationDeleteResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectRelationDelete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectRelationDelete' -type MockClientCommandsServer_ObjectRelationDelete_Call struct { - *mock.Call -} - -// ObjectRelationDelete is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectRelationDeleteRequest -func (_e *MockClientCommandsServer_Expecter) ObjectRelationDelete(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectRelationDelete_Call { - return &MockClientCommandsServer_ObjectRelationDelete_Call{Call: _e.mock.On("ObjectRelationDelete", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectRelationDelete_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectRelationDeleteRequest)) *MockClientCommandsServer_ObjectRelationDelete_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectRelationDeleteRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectRelationDelete_Call) Return(_a0 *pb.RpcObjectRelationDeleteResponse) *MockClientCommandsServer_ObjectRelationDelete_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectRelationDelete_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectRelationDeleteRequest) *pb.RpcObjectRelationDeleteResponse) *MockClientCommandsServer_ObjectRelationDelete_Call { - _c.Call.Return(run) - return _c -} - -// ObjectRelationListAvailable provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectRelationListAvailable(_a0 context.Context, _a1 *pb.RpcObjectRelationListAvailableRequest) *pb.RpcObjectRelationListAvailableResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectRelationListAvailable") - } - - var r0 *pb.RpcObjectRelationListAvailableResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectRelationListAvailableRequest) *pb.RpcObjectRelationListAvailableResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectRelationListAvailableResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectRelationListAvailable_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectRelationListAvailable' -type MockClientCommandsServer_ObjectRelationListAvailable_Call struct { - *mock.Call -} - -// ObjectRelationListAvailable is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectRelationListAvailableRequest -func (_e *MockClientCommandsServer_Expecter) ObjectRelationListAvailable(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectRelationListAvailable_Call { - return &MockClientCommandsServer_ObjectRelationListAvailable_Call{Call: _e.mock.On("ObjectRelationListAvailable", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectRelationListAvailable_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectRelationListAvailableRequest)) *MockClientCommandsServer_ObjectRelationListAvailable_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectRelationListAvailableRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectRelationListAvailable_Call) Return(_a0 *pb.RpcObjectRelationListAvailableResponse) *MockClientCommandsServer_ObjectRelationListAvailable_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectRelationListAvailable_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectRelationListAvailableRequest) *pb.RpcObjectRelationListAvailableResponse) *MockClientCommandsServer_ObjectRelationListAvailable_Call { - _c.Call.Return(run) - return _c -} - -// ObjectRelationRemoveFeatured provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectRelationRemoveFeatured(_a0 context.Context, _a1 *pb.RpcObjectRelationRemoveFeaturedRequest) *pb.RpcObjectRelationRemoveFeaturedResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectRelationRemoveFeatured") - } - - var r0 *pb.RpcObjectRelationRemoveFeaturedResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectRelationRemoveFeaturedRequest) *pb.RpcObjectRelationRemoveFeaturedResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectRelationRemoveFeaturedResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectRelationRemoveFeatured_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectRelationRemoveFeatured' -type MockClientCommandsServer_ObjectRelationRemoveFeatured_Call struct { - *mock.Call -} - -// ObjectRelationRemoveFeatured is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectRelationRemoveFeaturedRequest -func (_e *MockClientCommandsServer_Expecter) ObjectRelationRemoveFeatured(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectRelationRemoveFeatured_Call { - return &MockClientCommandsServer_ObjectRelationRemoveFeatured_Call{Call: _e.mock.On("ObjectRelationRemoveFeatured", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectRelationRemoveFeatured_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectRelationRemoveFeaturedRequest)) *MockClientCommandsServer_ObjectRelationRemoveFeatured_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectRelationRemoveFeaturedRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectRelationRemoveFeatured_Call) Return(_a0 *pb.RpcObjectRelationRemoveFeaturedResponse) *MockClientCommandsServer_ObjectRelationRemoveFeatured_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectRelationRemoveFeatured_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectRelationRemoveFeaturedRequest) *pb.RpcObjectRelationRemoveFeaturedResponse) *MockClientCommandsServer_ObjectRelationRemoveFeatured_Call { - _c.Call.Return(run) - return _c -} - -// ObjectSearch provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectSearch(_a0 context.Context, _a1 *pb.RpcObjectSearchRequest) *pb.RpcObjectSearchResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectSearch") - } - - var r0 *pb.RpcObjectSearchResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSearchRequest) *pb.RpcObjectSearchResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectSearchResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectSearch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSearch' -type MockClientCommandsServer_ObjectSearch_Call struct { - *mock.Call -} - -// ObjectSearch is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectSearchRequest -func (_e *MockClientCommandsServer_Expecter) ObjectSearch(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSearch_Call { - return &MockClientCommandsServer_ObjectSearch_Call{Call: _e.mock.On("ObjectSearch", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectSearch_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSearchRequest)) *MockClientCommandsServer_ObjectSearch_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectSearchRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSearch_Call) Return(_a0 *pb.RpcObjectSearchResponse) *MockClientCommandsServer_ObjectSearch_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSearch_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSearchRequest) *pb.RpcObjectSearchResponse) *MockClientCommandsServer_ObjectSearch_Call { - _c.Call.Return(run) - return _c -} - -// ObjectSearchSubscribe provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectSearchSubscribe(_a0 context.Context, _a1 *pb.RpcObjectSearchSubscribeRequest) *pb.RpcObjectSearchSubscribeResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectSearchSubscribe") - } - - var r0 *pb.RpcObjectSearchSubscribeResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSearchSubscribeRequest) *pb.RpcObjectSearchSubscribeResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectSearchSubscribeResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectSearchSubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSearchSubscribe' -type MockClientCommandsServer_ObjectSearchSubscribe_Call struct { - *mock.Call -} - -// ObjectSearchSubscribe is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectSearchSubscribeRequest -func (_e *MockClientCommandsServer_Expecter) ObjectSearchSubscribe(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSearchSubscribe_Call { - return &MockClientCommandsServer_ObjectSearchSubscribe_Call{Call: _e.mock.On("ObjectSearchSubscribe", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectSearchSubscribe_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSearchSubscribeRequest)) *MockClientCommandsServer_ObjectSearchSubscribe_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectSearchSubscribeRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSearchSubscribe_Call) Return(_a0 *pb.RpcObjectSearchSubscribeResponse) *MockClientCommandsServer_ObjectSearchSubscribe_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSearchSubscribe_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSearchSubscribeRequest) *pb.RpcObjectSearchSubscribeResponse) *MockClientCommandsServer_ObjectSearchSubscribe_Call { - _c.Call.Return(run) - return _c -} - -// ObjectSearchUnsubscribe provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectSearchUnsubscribe(_a0 context.Context, _a1 *pb.RpcObjectSearchUnsubscribeRequest) *pb.RpcObjectSearchUnsubscribeResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectSearchUnsubscribe") - } - - var r0 *pb.RpcObjectSearchUnsubscribeResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSearchUnsubscribeRequest) *pb.RpcObjectSearchUnsubscribeResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectSearchUnsubscribeResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectSearchUnsubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSearchUnsubscribe' -type MockClientCommandsServer_ObjectSearchUnsubscribe_Call struct { - *mock.Call -} - -// ObjectSearchUnsubscribe is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectSearchUnsubscribeRequest -func (_e *MockClientCommandsServer_Expecter) ObjectSearchUnsubscribe(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSearchUnsubscribe_Call { - return &MockClientCommandsServer_ObjectSearchUnsubscribe_Call{Call: _e.mock.On("ObjectSearchUnsubscribe", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectSearchUnsubscribe_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSearchUnsubscribeRequest)) *MockClientCommandsServer_ObjectSearchUnsubscribe_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectSearchUnsubscribeRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSearchUnsubscribe_Call) Return(_a0 *pb.RpcObjectSearchUnsubscribeResponse) *MockClientCommandsServer_ObjectSearchUnsubscribe_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSearchUnsubscribe_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSearchUnsubscribeRequest) *pb.RpcObjectSearchUnsubscribeResponse) *MockClientCommandsServer_ObjectSearchUnsubscribe_Call { - _c.Call.Return(run) - return _c -} - -// ObjectSearchWithMeta provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectSearchWithMeta(_a0 context.Context, _a1 *pb.RpcObjectSearchWithMetaRequest) *pb.RpcObjectSearchWithMetaResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectSearchWithMeta") - } - - var r0 *pb.RpcObjectSearchWithMetaResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSearchWithMetaRequest) *pb.RpcObjectSearchWithMetaResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectSearchWithMetaResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectSearchWithMeta_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSearchWithMeta' -type MockClientCommandsServer_ObjectSearchWithMeta_Call struct { - *mock.Call -} - -// ObjectSearchWithMeta is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectSearchWithMetaRequest -func (_e *MockClientCommandsServer_Expecter) ObjectSearchWithMeta(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSearchWithMeta_Call { - return &MockClientCommandsServer_ObjectSearchWithMeta_Call{Call: _e.mock.On("ObjectSearchWithMeta", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectSearchWithMeta_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSearchWithMetaRequest)) *MockClientCommandsServer_ObjectSearchWithMeta_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectSearchWithMetaRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSearchWithMeta_Call) Return(_a0 *pb.RpcObjectSearchWithMetaResponse) *MockClientCommandsServer_ObjectSearchWithMeta_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSearchWithMeta_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSearchWithMetaRequest) *pb.RpcObjectSearchWithMetaResponse) *MockClientCommandsServer_ObjectSearchWithMeta_Call { - _c.Call.Return(run) - return _c -} - -// ObjectSetDetails provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectSetDetails(_a0 context.Context, _a1 *pb.RpcObjectSetDetailsRequest) *pb.RpcObjectSetDetailsResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectSetDetails") - } - - var r0 *pb.RpcObjectSetDetailsResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSetDetailsRequest) *pb.RpcObjectSetDetailsResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectSetDetailsResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectSetDetails_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSetDetails' -type MockClientCommandsServer_ObjectSetDetails_Call struct { - *mock.Call -} - -// ObjectSetDetails is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectSetDetailsRequest -func (_e *MockClientCommandsServer_Expecter) ObjectSetDetails(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSetDetails_Call { - return &MockClientCommandsServer_ObjectSetDetails_Call{Call: _e.mock.On("ObjectSetDetails", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectSetDetails_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSetDetailsRequest)) *MockClientCommandsServer_ObjectSetDetails_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectSetDetailsRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSetDetails_Call) Return(_a0 *pb.RpcObjectSetDetailsResponse) *MockClientCommandsServer_ObjectSetDetails_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSetDetails_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSetDetailsRequest) *pb.RpcObjectSetDetailsResponse) *MockClientCommandsServer_ObjectSetDetails_Call { - _c.Call.Return(run) - return _c -} - -// ObjectSetInternalFlags provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectSetInternalFlags(_a0 context.Context, _a1 *pb.RpcObjectSetInternalFlagsRequest) *pb.RpcObjectSetInternalFlagsResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectSetInternalFlags") - } - - var r0 *pb.RpcObjectSetInternalFlagsResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSetInternalFlagsRequest) *pb.RpcObjectSetInternalFlagsResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectSetInternalFlagsResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectSetInternalFlags_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSetInternalFlags' -type MockClientCommandsServer_ObjectSetInternalFlags_Call struct { - *mock.Call -} - -// ObjectSetInternalFlags is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectSetInternalFlagsRequest -func (_e *MockClientCommandsServer_Expecter) ObjectSetInternalFlags(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSetInternalFlags_Call { - return &MockClientCommandsServer_ObjectSetInternalFlags_Call{Call: _e.mock.On("ObjectSetInternalFlags", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectSetInternalFlags_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSetInternalFlagsRequest)) *MockClientCommandsServer_ObjectSetInternalFlags_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectSetInternalFlagsRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSetInternalFlags_Call) Return(_a0 *pb.RpcObjectSetInternalFlagsResponse) *MockClientCommandsServer_ObjectSetInternalFlags_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSetInternalFlags_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSetInternalFlagsRequest) *pb.RpcObjectSetInternalFlagsResponse) *MockClientCommandsServer_ObjectSetInternalFlags_Call { - _c.Call.Return(run) - return _c -} - -// ObjectSetIsArchived provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectSetIsArchived(_a0 context.Context, _a1 *pb.RpcObjectSetIsArchivedRequest) *pb.RpcObjectSetIsArchivedResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectSetIsArchived") - } - - var r0 *pb.RpcObjectSetIsArchivedResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSetIsArchivedRequest) *pb.RpcObjectSetIsArchivedResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectSetIsArchivedResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectSetIsArchived_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSetIsArchived' -type MockClientCommandsServer_ObjectSetIsArchived_Call struct { - *mock.Call -} - -// ObjectSetIsArchived is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectSetIsArchivedRequest -func (_e *MockClientCommandsServer_Expecter) ObjectSetIsArchived(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSetIsArchived_Call { - return &MockClientCommandsServer_ObjectSetIsArchived_Call{Call: _e.mock.On("ObjectSetIsArchived", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectSetIsArchived_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSetIsArchivedRequest)) *MockClientCommandsServer_ObjectSetIsArchived_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectSetIsArchivedRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSetIsArchived_Call) Return(_a0 *pb.RpcObjectSetIsArchivedResponse) *MockClientCommandsServer_ObjectSetIsArchived_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSetIsArchived_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSetIsArchivedRequest) *pb.RpcObjectSetIsArchivedResponse) *MockClientCommandsServer_ObjectSetIsArchived_Call { - _c.Call.Return(run) - return _c -} - -// ObjectSetIsFavorite provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectSetIsFavorite(_a0 context.Context, _a1 *pb.RpcObjectSetIsFavoriteRequest) *pb.RpcObjectSetIsFavoriteResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectSetIsFavorite") - } - - var r0 *pb.RpcObjectSetIsFavoriteResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSetIsFavoriteRequest) *pb.RpcObjectSetIsFavoriteResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectSetIsFavoriteResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectSetIsFavorite_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSetIsFavorite' -type MockClientCommandsServer_ObjectSetIsFavorite_Call struct { - *mock.Call -} - -// ObjectSetIsFavorite is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectSetIsFavoriteRequest -func (_e *MockClientCommandsServer_Expecter) ObjectSetIsFavorite(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSetIsFavorite_Call { - return &MockClientCommandsServer_ObjectSetIsFavorite_Call{Call: _e.mock.On("ObjectSetIsFavorite", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectSetIsFavorite_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSetIsFavoriteRequest)) *MockClientCommandsServer_ObjectSetIsFavorite_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectSetIsFavoriteRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSetIsFavorite_Call) Return(_a0 *pb.RpcObjectSetIsFavoriteResponse) *MockClientCommandsServer_ObjectSetIsFavorite_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSetIsFavorite_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSetIsFavoriteRequest) *pb.RpcObjectSetIsFavoriteResponse) *MockClientCommandsServer_ObjectSetIsFavorite_Call { - _c.Call.Return(run) - return _c -} - -// ObjectSetLayout provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectSetLayout(_a0 context.Context, _a1 *pb.RpcObjectSetLayoutRequest) *pb.RpcObjectSetLayoutResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectSetLayout") - } - - var r0 *pb.RpcObjectSetLayoutResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSetLayoutRequest) *pb.RpcObjectSetLayoutResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectSetLayoutResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectSetLayout_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSetLayout' -type MockClientCommandsServer_ObjectSetLayout_Call struct { - *mock.Call -} - -// ObjectSetLayout is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectSetLayoutRequest -func (_e *MockClientCommandsServer_Expecter) ObjectSetLayout(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSetLayout_Call { - return &MockClientCommandsServer_ObjectSetLayout_Call{Call: _e.mock.On("ObjectSetLayout", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectSetLayout_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSetLayoutRequest)) *MockClientCommandsServer_ObjectSetLayout_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectSetLayoutRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSetLayout_Call) Return(_a0 *pb.RpcObjectSetLayoutResponse) *MockClientCommandsServer_ObjectSetLayout_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSetLayout_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSetLayoutRequest) *pb.RpcObjectSetLayoutResponse) *MockClientCommandsServer_ObjectSetLayout_Call { - _c.Call.Return(run) - return _c -} - -// ObjectSetObjectType provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectSetObjectType(_a0 context.Context, _a1 *pb.RpcObjectSetObjectTypeRequest) *pb.RpcObjectSetObjectTypeResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectSetObjectType") - } - - var r0 *pb.RpcObjectSetObjectTypeResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSetObjectTypeRequest) *pb.RpcObjectSetObjectTypeResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectSetObjectTypeResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectSetObjectType_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSetObjectType' -type MockClientCommandsServer_ObjectSetObjectType_Call struct { - *mock.Call -} - -// ObjectSetObjectType is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectSetObjectTypeRequest -func (_e *MockClientCommandsServer_Expecter) ObjectSetObjectType(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSetObjectType_Call { - return &MockClientCommandsServer_ObjectSetObjectType_Call{Call: _e.mock.On("ObjectSetObjectType", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectSetObjectType_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSetObjectTypeRequest)) *MockClientCommandsServer_ObjectSetObjectType_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectSetObjectTypeRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSetObjectType_Call) Return(_a0 *pb.RpcObjectSetObjectTypeResponse) *MockClientCommandsServer_ObjectSetObjectType_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSetObjectType_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSetObjectTypeRequest) *pb.RpcObjectSetObjectTypeResponse) *MockClientCommandsServer_ObjectSetObjectType_Call { - _c.Call.Return(run) - return _c -} - -// ObjectSetSource provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectSetSource(_a0 context.Context, _a1 *pb.RpcObjectSetSourceRequest) *pb.RpcObjectSetSourceResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectSetSource") - } - - var r0 *pb.RpcObjectSetSourceResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSetSourceRequest) *pb.RpcObjectSetSourceResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectSetSourceResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectSetSource_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSetSource' -type MockClientCommandsServer_ObjectSetSource_Call struct { - *mock.Call -} - -// ObjectSetSource is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectSetSourceRequest -func (_e *MockClientCommandsServer_Expecter) ObjectSetSource(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSetSource_Call { - return &MockClientCommandsServer_ObjectSetSource_Call{Call: _e.mock.On("ObjectSetSource", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectSetSource_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSetSourceRequest)) *MockClientCommandsServer_ObjectSetSource_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectSetSourceRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSetSource_Call) Return(_a0 *pb.RpcObjectSetSourceResponse) *MockClientCommandsServer_ObjectSetSource_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSetSource_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSetSourceRequest) *pb.RpcObjectSetSourceResponse) *MockClientCommandsServer_ObjectSetSource_Call { - _c.Call.Return(run) - return _c -} - -// ObjectShareByLink provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectShareByLink(_a0 context.Context, _a1 *pb.RpcObjectShareByLinkRequest) *pb.RpcObjectShareByLinkResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectShareByLink") - } - - var r0 *pb.RpcObjectShareByLinkResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectShareByLinkRequest) *pb.RpcObjectShareByLinkResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectShareByLinkResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectShareByLink_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectShareByLink' -type MockClientCommandsServer_ObjectShareByLink_Call struct { - *mock.Call -} - -// ObjectShareByLink is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectShareByLinkRequest -func (_e *MockClientCommandsServer_Expecter) ObjectShareByLink(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectShareByLink_Call { - return &MockClientCommandsServer_ObjectShareByLink_Call{Call: _e.mock.On("ObjectShareByLink", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectShareByLink_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectShareByLinkRequest)) *MockClientCommandsServer_ObjectShareByLink_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectShareByLinkRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectShareByLink_Call) Return(_a0 *pb.RpcObjectShareByLinkResponse) *MockClientCommandsServer_ObjectShareByLink_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectShareByLink_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectShareByLinkRequest) *pb.RpcObjectShareByLinkResponse) *MockClientCommandsServer_ObjectShareByLink_Call { - _c.Call.Return(run) - return _c -} - -// ObjectShow provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectShow(_a0 context.Context, _a1 *pb.RpcObjectShowRequest) *pb.RpcObjectShowResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectShow") - } - - var r0 *pb.RpcObjectShowResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectShowRequest) *pb.RpcObjectShowResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectShowResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectShow_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectShow' -type MockClientCommandsServer_ObjectShow_Call struct { - *mock.Call -} - -// ObjectShow is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectShowRequest -func (_e *MockClientCommandsServer_Expecter) ObjectShow(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectShow_Call { - return &MockClientCommandsServer_ObjectShow_Call{Call: _e.mock.On("ObjectShow", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectShow_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectShowRequest)) *MockClientCommandsServer_ObjectShow_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectShowRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectShow_Call) Return(_a0 *pb.RpcObjectShowResponse) *MockClientCommandsServer_ObjectShow_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectShow_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectShowRequest) *pb.RpcObjectShowResponse) *MockClientCommandsServer_ObjectShow_Call { - _c.Call.Return(run) - return _c -} - -// ObjectSubscribeIds provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectSubscribeIds(_a0 context.Context, _a1 *pb.RpcObjectSubscribeIdsRequest) *pb.RpcObjectSubscribeIdsResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectSubscribeIds") - } - - var r0 *pb.RpcObjectSubscribeIdsResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSubscribeIdsRequest) *pb.RpcObjectSubscribeIdsResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectSubscribeIdsResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectSubscribeIds_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSubscribeIds' -type MockClientCommandsServer_ObjectSubscribeIds_Call struct { - *mock.Call -} - -// ObjectSubscribeIds is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectSubscribeIdsRequest -func (_e *MockClientCommandsServer_Expecter) ObjectSubscribeIds(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSubscribeIds_Call { - return &MockClientCommandsServer_ObjectSubscribeIds_Call{Call: _e.mock.On("ObjectSubscribeIds", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectSubscribeIds_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSubscribeIdsRequest)) *MockClientCommandsServer_ObjectSubscribeIds_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectSubscribeIdsRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSubscribeIds_Call) Return(_a0 *pb.RpcObjectSubscribeIdsResponse) *MockClientCommandsServer_ObjectSubscribeIds_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectSubscribeIds_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSubscribeIdsRequest) *pb.RpcObjectSubscribeIdsResponse) *MockClientCommandsServer_ObjectSubscribeIds_Call { - _c.Call.Return(run) - return _c -} - -// ObjectToBookmark provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectToBookmark(_a0 context.Context, _a1 *pb.RpcObjectToBookmarkRequest) *pb.RpcObjectToBookmarkResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectToBookmark") - } - - var r0 *pb.RpcObjectToBookmarkResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectToBookmarkRequest) *pb.RpcObjectToBookmarkResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectToBookmarkResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectToBookmark_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectToBookmark' -type MockClientCommandsServer_ObjectToBookmark_Call struct { - *mock.Call -} - -// ObjectToBookmark is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectToBookmarkRequest -func (_e *MockClientCommandsServer_Expecter) ObjectToBookmark(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectToBookmark_Call { - return &MockClientCommandsServer_ObjectToBookmark_Call{Call: _e.mock.On("ObjectToBookmark", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectToBookmark_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectToBookmarkRequest)) *MockClientCommandsServer_ObjectToBookmark_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectToBookmarkRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectToBookmark_Call) Return(_a0 *pb.RpcObjectToBookmarkResponse) *MockClientCommandsServer_ObjectToBookmark_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectToBookmark_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectToBookmarkRequest) *pb.RpcObjectToBookmarkResponse) *MockClientCommandsServer_ObjectToBookmark_Call { - _c.Call.Return(run) - return _c -} - -// ObjectToCollection provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectToCollection(_a0 context.Context, _a1 *pb.RpcObjectToCollectionRequest) *pb.RpcObjectToCollectionResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectToCollection") - } - - var r0 *pb.RpcObjectToCollectionResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectToCollectionRequest) *pb.RpcObjectToCollectionResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectToCollectionResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectToCollection_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectToCollection' -type MockClientCommandsServer_ObjectToCollection_Call struct { - *mock.Call -} - -// ObjectToCollection is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectToCollectionRequest -func (_e *MockClientCommandsServer_Expecter) ObjectToCollection(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectToCollection_Call { - return &MockClientCommandsServer_ObjectToCollection_Call{Call: _e.mock.On("ObjectToCollection", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectToCollection_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectToCollectionRequest)) *MockClientCommandsServer_ObjectToCollection_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectToCollectionRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectToCollection_Call) Return(_a0 *pb.RpcObjectToCollectionResponse) *MockClientCommandsServer_ObjectToCollection_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectToCollection_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectToCollectionRequest) *pb.RpcObjectToCollectionResponse) *MockClientCommandsServer_ObjectToCollection_Call { - _c.Call.Return(run) - return _c -} - -// ObjectToSet provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectToSet(_a0 context.Context, _a1 *pb.RpcObjectToSetRequest) *pb.RpcObjectToSetResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectToSet") - } - - var r0 *pb.RpcObjectToSetResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectToSetRequest) *pb.RpcObjectToSetResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectToSetResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectToSet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectToSet' -type MockClientCommandsServer_ObjectToSet_Call struct { - *mock.Call -} - -// ObjectToSet is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectToSetRequest -func (_e *MockClientCommandsServer_Expecter) ObjectToSet(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectToSet_Call { - return &MockClientCommandsServer_ObjectToSet_Call{Call: _e.mock.On("ObjectToSet", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectToSet_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectToSetRequest)) *MockClientCommandsServer_ObjectToSet_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectToSetRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectToSet_Call) Return(_a0 *pb.RpcObjectToSetResponse) *MockClientCommandsServer_ObjectToSet_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectToSet_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectToSetRequest) *pb.RpcObjectToSetResponse) *MockClientCommandsServer_ObjectToSet_Call { - _c.Call.Return(run) - return _c -} - -// ObjectTypeListConflictingRelations provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectTypeListConflictingRelations(_a0 context.Context, _a1 *pb.RpcObjectTypeListConflictingRelationsRequest) *pb.RpcObjectTypeListConflictingRelationsResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectTypeListConflictingRelations") - } - - var r0 *pb.RpcObjectTypeListConflictingRelationsResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectTypeListConflictingRelationsRequest) *pb.RpcObjectTypeListConflictingRelationsResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectTypeListConflictingRelationsResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectTypeListConflictingRelations_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectTypeListConflictingRelations' -type MockClientCommandsServer_ObjectTypeListConflictingRelations_Call struct { - *mock.Call -} - -// ObjectTypeListConflictingRelations is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectTypeListConflictingRelationsRequest -func (_e *MockClientCommandsServer_Expecter) ObjectTypeListConflictingRelations(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectTypeListConflictingRelations_Call { - return &MockClientCommandsServer_ObjectTypeListConflictingRelations_Call{Call: _e.mock.On("ObjectTypeListConflictingRelations", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectTypeListConflictingRelations_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectTypeListConflictingRelationsRequest)) *MockClientCommandsServer_ObjectTypeListConflictingRelations_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectTypeListConflictingRelationsRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectTypeListConflictingRelations_Call) Return(_a0 *pb.RpcObjectTypeListConflictingRelationsResponse) *MockClientCommandsServer_ObjectTypeListConflictingRelations_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectTypeListConflictingRelations_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectTypeListConflictingRelationsRequest) *pb.RpcObjectTypeListConflictingRelationsResponse) *MockClientCommandsServer_ObjectTypeListConflictingRelations_Call { - _c.Call.Return(run) - return _c -} - -// ObjectTypeRecommendedFeaturedRelationsSet provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectTypeRecommendedFeaturedRelationsSet(_a0 context.Context, _a1 *pb.RpcObjectTypeRecommendedFeaturedRelationsSetRequest) *pb.RpcObjectTypeRecommendedFeaturedRelationsSetResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectTypeRecommendedFeaturedRelationsSet") - } - - var r0 *pb.RpcObjectTypeRecommendedFeaturedRelationsSetResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectTypeRecommendedFeaturedRelationsSetRequest) *pb.RpcObjectTypeRecommendedFeaturedRelationsSetResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectTypeRecommendedFeaturedRelationsSetResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectTypeRecommendedFeaturedRelationsSet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectTypeRecommendedFeaturedRelationsSet' -type MockClientCommandsServer_ObjectTypeRecommendedFeaturedRelationsSet_Call struct { - *mock.Call -} - -// ObjectTypeRecommendedFeaturedRelationsSet is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectTypeRecommendedFeaturedRelationsSetRequest -func (_e *MockClientCommandsServer_Expecter) ObjectTypeRecommendedFeaturedRelationsSet(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectTypeRecommendedFeaturedRelationsSet_Call { - return &MockClientCommandsServer_ObjectTypeRecommendedFeaturedRelationsSet_Call{Call: _e.mock.On("ObjectTypeRecommendedFeaturedRelationsSet", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectTypeRecommendedFeaturedRelationsSet_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectTypeRecommendedFeaturedRelationsSetRequest)) *MockClientCommandsServer_ObjectTypeRecommendedFeaturedRelationsSet_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectTypeRecommendedFeaturedRelationsSetRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectTypeRecommendedFeaturedRelationsSet_Call) Return(_a0 *pb.RpcObjectTypeRecommendedFeaturedRelationsSetResponse) *MockClientCommandsServer_ObjectTypeRecommendedFeaturedRelationsSet_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectTypeRecommendedFeaturedRelationsSet_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectTypeRecommendedFeaturedRelationsSetRequest) *pb.RpcObjectTypeRecommendedFeaturedRelationsSetResponse) *MockClientCommandsServer_ObjectTypeRecommendedFeaturedRelationsSet_Call { - _c.Call.Return(run) - return _c -} - -// ObjectTypeRecommendedRelationsSet provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectTypeRecommendedRelationsSet(_a0 context.Context, _a1 *pb.RpcObjectTypeRecommendedRelationsSetRequest) *pb.RpcObjectTypeRecommendedRelationsSetResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectTypeRecommendedRelationsSet") - } - - var r0 *pb.RpcObjectTypeRecommendedRelationsSetResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectTypeRecommendedRelationsSetRequest) *pb.RpcObjectTypeRecommendedRelationsSetResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectTypeRecommendedRelationsSetResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectTypeRecommendedRelationsSet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectTypeRecommendedRelationsSet' -type MockClientCommandsServer_ObjectTypeRecommendedRelationsSet_Call struct { - *mock.Call -} - -// ObjectTypeRecommendedRelationsSet is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectTypeRecommendedRelationsSetRequest -func (_e *MockClientCommandsServer_Expecter) ObjectTypeRecommendedRelationsSet(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectTypeRecommendedRelationsSet_Call { - return &MockClientCommandsServer_ObjectTypeRecommendedRelationsSet_Call{Call: _e.mock.On("ObjectTypeRecommendedRelationsSet", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectTypeRecommendedRelationsSet_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectTypeRecommendedRelationsSetRequest)) *MockClientCommandsServer_ObjectTypeRecommendedRelationsSet_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectTypeRecommendedRelationsSetRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectTypeRecommendedRelationsSet_Call) Return(_a0 *pb.RpcObjectTypeRecommendedRelationsSetResponse) *MockClientCommandsServer_ObjectTypeRecommendedRelationsSet_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectTypeRecommendedRelationsSet_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectTypeRecommendedRelationsSetRequest) *pb.RpcObjectTypeRecommendedRelationsSetResponse) *MockClientCommandsServer_ObjectTypeRecommendedRelationsSet_Call { - _c.Call.Return(run) - return _c -} - -// ObjectTypeRelationAdd provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectTypeRelationAdd(_a0 context.Context, _a1 *pb.RpcObjectTypeRelationAddRequest) *pb.RpcObjectTypeRelationAddResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectTypeRelationAdd") - } - - var r0 *pb.RpcObjectTypeRelationAddResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectTypeRelationAddRequest) *pb.RpcObjectTypeRelationAddResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectTypeRelationAddResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectTypeRelationAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectTypeRelationAdd' -type MockClientCommandsServer_ObjectTypeRelationAdd_Call struct { - *mock.Call -} - -// ObjectTypeRelationAdd is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectTypeRelationAddRequest -func (_e *MockClientCommandsServer_Expecter) ObjectTypeRelationAdd(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectTypeRelationAdd_Call { - return &MockClientCommandsServer_ObjectTypeRelationAdd_Call{Call: _e.mock.On("ObjectTypeRelationAdd", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectTypeRelationAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectTypeRelationAddRequest)) *MockClientCommandsServer_ObjectTypeRelationAdd_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectTypeRelationAddRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectTypeRelationAdd_Call) Return(_a0 *pb.RpcObjectTypeRelationAddResponse) *MockClientCommandsServer_ObjectTypeRelationAdd_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectTypeRelationAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectTypeRelationAddRequest) *pb.RpcObjectTypeRelationAddResponse) *MockClientCommandsServer_ObjectTypeRelationAdd_Call { - _c.Call.Return(run) - return _c -} - -// ObjectTypeRelationRemove provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectTypeRelationRemove(_a0 context.Context, _a1 *pb.RpcObjectTypeRelationRemoveRequest) *pb.RpcObjectTypeRelationRemoveResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectTypeRelationRemove") - } - - var r0 *pb.RpcObjectTypeRelationRemoveResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectTypeRelationRemoveRequest) *pb.RpcObjectTypeRelationRemoveResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectTypeRelationRemoveResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectTypeRelationRemove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectTypeRelationRemove' -type MockClientCommandsServer_ObjectTypeRelationRemove_Call struct { - *mock.Call -} - -// ObjectTypeRelationRemove is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectTypeRelationRemoveRequest -func (_e *MockClientCommandsServer_Expecter) ObjectTypeRelationRemove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectTypeRelationRemove_Call { - return &MockClientCommandsServer_ObjectTypeRelationRemove_Call{Call: _e.mock.On("ObjectTypeRelationRemove", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectTypeRelationRemove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectTypeRelationRemoveRequest)) *MockClientCommandsServer_ObjectTypeRelationRemove_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectTypeRelationRemoveRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectTypeRelationRemove_Call) Return(_a0 *pb.RpcObjectTypeRelationRemoveResponse) *MockClientCommandsServer_ObjectTypeRelationRemove_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectTypeRelationRemove_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectTypeRelationRemoveRequest) *pb.RpcObjectTypeRelationRemoveResponse) *MockClientCommandsServer_ObjectTypeRelationRemove_Call { - _c.Call.Return(run) - return _c -} - -// ObjectUndo provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectUndo(_a0 context.Context, _a1 *pb.RpcObjectUndoRequest) *pb.RpcObjectUndoResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectUndo") - } - - var r0 *pb.RpcObjectUndoResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectUndoRequest) *pb.RpcObjectUndoResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectUndoResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectUndo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectUndo' -type MockClientCommandsServer_ObjectUndo_Call struct { - *mock.Call -} - -// ObjectUndo is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectUndoRequest -func (_e *MockClientCommandsServer_Expecter) ObjectUndo(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectUndo_Call { - return &MockClientCommandsServer_ObjectUndo_Call{Call: _e.mock.On("ObjectUndo", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectUndo_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectUndoRequest)) *MockClientCommandsServer_ObjectUndo_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectUndoRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectUndo_Call) Return(_a0 *pb.RpcObjectUndoResponse) *MockClientCommandsServer_ObjectUndo_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectUndo_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectUndoRequest) *pb.RpcObjectUndoResponse) *MockClientCommandsServer_ObjectUndo_Call { - _c.Call.Return(run) - return _c -} - -// ObjectWorkspaceSetDashboard provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ObjectWorkspaceSetDashboard(_a0 context.Context, _a1 *pb.RpcObjectWorkspaceSetDashboardRequest) *pb.RpcObjectWorkspaceSetDashboardResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ObjectWorkspaceSetDashboard") - } - - var r0 *pb.RpcObjectWorkspaceSetDashboardResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectWorkspaceSetDashboardRequest) *pb.RpcObjectWorkspaceSetDashboardResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcObjectWorkspaceSetDashboardResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ObjectWorkspaceSetDashboard_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectWorkspaceSetDashboard' -type MockClientCommandsServer_ObjectWorkspaceSetDashboard_Call struct { - *mock.Call -} - -// ObjectWorkspaceSetDashboard is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcObjectWorkspaceSetDashboardRequest -func (_e *MockClientCommandsServer_Expecter) ObjectWorkspaceSetDashboard(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectWorkspaceSetDashboard_Call { - return &MockClientCommandsServer_ObjectWorkspaceSetDashboard_Call{Call: _e.mock.On("ObjectWorkspaceSetDashboard", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ObjectWorkspaceSetDashboard_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectWorkspaceSetDashboardRequest)) *MockClientCommandsServer_ObjectWorkspaceSetDashboard_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcObjectWorkspaceSetDashboardRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ObjectWorkspaceSetDashboard_Call) Return(_a0 *pb.RpcObjectWorkspaceSetDashboardResponse) *MockClientCommandsServer_ObjectWorkspaceSetDashboard_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ObjectWorkspaceSetDashboard_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectWorkspaceSetDashboardRequest) *pb.RpcObjectWorkspaceSetDashboardResponse) *MockClientCommandsServer_ObjectWorkspaceSetDashboard_Call { - _c.Call.Return(run) - return _c -} - -// ProcessCancel provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ProcessCancel(_a0 context.Context, _a1 *pb.RpcProcessCancelRequest) *pb.RpcProcessCancelResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ProcessCancel") - } - - var r0 *pb.RpcProcessCancelResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcProcessCancelRequest) *pb.RpcProcessCancelResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcProcessCancelResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ProcessCancel_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ProcessCancel' -type MockClientCommandsServer_ProcessCancel_Call struct { - *mock.Call -} - -// ProcessCancel is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcProcessCancelRequest -func (_e *MockClientCommandsServer_Expecter) ProcessCancel(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ProcessCancel_Call { - return &MockClientCommandsServer_ProcessCancel_Call{Call: _e.mock.On("ProcessCancel", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ProcessCancel_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcProcessCancelRequest)) *MockClientCommandsServer_ProcessCancel_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcProcessCancelRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ProcessCancel_Call) Return(_a0 *pb.RpcProcessCancelResponse) *MockClientCommandsServer_ProcessCancel_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ProcessCancel_Call) RunAndReturn(run func(context.Context, *pb.RpcProcessCancelRequest) *pb.RpcProcessCancelResponse) *MockClientCommandsServer_ProcessCancel_Call { - _c.Call.Return(run) - return _c -} - -// ProcessSubscribe provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ProcessSubscribe(_a0 context.Context, _a1 *pb.RpcProcessSubscribeRequest) *pb.RpcProcessSubscribeResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ProcessSubscribe") - } - - var r0 *pb.RpcProcessSubscribeResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcProcessSubscribeRequest) *pb.RpcProcessSubscribeResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcProcessSubscribeResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ProcessSubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ProcessSubscribe' -type MockClientCommandsServer_ProcessSubscribe_Call struct { - *mock.Call -} - -// ProcessSubscribe is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcProcessSubscribeRequest -func (_e *MockClientCommandsServer_Expecter) ProcessSubscribe(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ProcessSubscribe_Call { - return &MockClientCommandsServer_ProcessSubscribe_Call{Call: _e.mock.On("ProcessSubscribe", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ProcessSubscribe_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcProcessSubscribeRequest)) *MockClientCommandsServer_ProcessSubscribe_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcProcessSubscribeRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ProcessSubscribe_Call) Return(_a0 *pb.RpcProcessSubscribeResponse) *MockClientCommandsServer_ProcessSubscribe_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ProcessSubscribe_Call) RunAndReturn(run func(context.Context, *pb.RpcProcessSubscribeRequest) *pb.RpcProcessSubscribeResponse) *MockClientCommandsServer_ProcessSubscribe_Call { - _c.Call.Return(run) - return _c -} - -// ProcessUnsubscribe provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ProcessUnsubscribe(_a0 context.Context, _a1 *pb.RpcProcessUnsubscribeRequest) *pb.RpcProcessUnsubscribeResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ProcessUnsubscribe") - } - - var r0 *pb.RpcProcessUnsubscribeResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcProcessUnsubscribeRequest) *pb.RpcProcessUnsubscribeResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcProcessUnsubscribeResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ProcessUnsubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ProcessUnsubscribe' -type MockClientCommandsServer_ProcessUnsubscribe_Call struct { - *mock.Call -} - -// ProcessUnsubscribe is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcProcessUnsubscribeRequest -func (_e *MockClientCommandsServer_Expecter) ProcessUnsubscribe(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ProcessUnsubscribe_Call { - return &MockClientCommandsServer_ProcessUnsubscribe_Call{Call: _e.mock.On("ProcessUnsubscribe", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ProcessUnsubscribe_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcProcessUnsubscribeRequest)) *MockClientCommandsServer_ProcessUnsubscribe_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcProcessUnsubscribeRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ProcessUnsubscribe_Call) Return(_a0 *pb.RpcProcessUnsubscribeResponse) *MockClientCommandsServer_ProcessUnsubscribe_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ProcessUnsubscribe_Call) RunAndReturn(run func(context.Context, *pb.RpcProcessUnsubscribeRequest) *pb.RpcProcessUnsubscribeResponse) *MockClientCommandsServer_ProcessUnsubscribe_Call { - _c.Call.Return(run) - return _c -} - -// PublishingCreate provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) PublishingCreate(_a0 context.Context, _a1 *pb.RpcPublishingCreateRequest) *pb.RpcPublishingCreateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for PublishingCreate") - } - - var r0 *pb.RpcPublishingCreateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcPublishingCreateRequest) *pb.RpcPublishingCreateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcPublishingCreateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_PublishingCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PublishingCreate' -type MockClientCommandsServer_PublishingCreate_Call struct { - *mock.Call -} - -// PublishingCreate is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcPublishingCreateRequest -func (_e *MockClientCommandsServer_Expecter) PublishingCreate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_PublishingCreate_Call { - return &MockClientCommandsServer_PublishingCreate_Call{Call: _e.mock.On("PublishingCreate", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_PublishingCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcPublishingCreateRequest)) *MockClientCommandsServer_PublishingCreate_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcPublishingCreateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_PublishingCreate_Call) Return(_a0 *pb.RpcPublishingCreateResponse) *MockClientCommandsServer_PublishingCreate_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_PublishingCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcPublishingCreateRequest) *pb.RpcPublishingCreateResponse) *MockClientCommandsServer_PublishingCreate_Call { - _c.Call.Return(run) - return _c -} - -// PublishingGetStatus provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) PublishingGetStatus(_a0 context.Context, _a1 *pb.RpcPublishingGetStatusRequest) *pb.RpcPublishingGetStatusResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for PublishingGetStatus") - } - - var r0 *pb.RpcPublishingGetStatusResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcPublishingGetStatusRequest) *pb.RpcPublishingGetStatusResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcPublishingGetStatusResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_PublishingGetStatus_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PublishingGetStatus' -type MockClientCommandsServer_PublishingGetStatus_Call struct { - *mock.Call -} - -// PublishingGetStatus is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcPublishingGetStatusRequest -func (_e *MockClientCommandsServer_Expecter) PublishingGetStatus(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_PublishingGetStatus_Call { - return &MockClientCommandsServer_PublishingGetStatus_Call{Call: _e.mock.On("PublishingGetStatus", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_PublishingGetStatus_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcPublishingGetStatusRequest)) *MockClientCommandsServer_PublishingGetStatus_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcPublishingGetStatusRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_PublishingGetStatus_Call) Return(_a0 *pb.RpcPublishingGetStatusResponse) *MockClientCommandsServer_PublishingGetStatus_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_PublishingGetStatus_Call) RunAndReturn(run func(context.Context, *pb.RpcPublishingGetStatusRequest) *pb.RpcPublishingGetStatusResponse) *MockClientCommandsServer_PublishingGetStatus_Call { - _c.Call.Return(run) - return _c -} - -// PublishingList provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) PublishingList(_a0 context.Context, _a1 *pb.RpcPublishingListRequest) *pb.RpcPublishingListResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for PublishingList") - } - - var r0 *pb.RpcPublishingListResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcPublishingListRequest) *pb.RpcPublishingListResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcPublishingListResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_PublishingList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PublishingList' -type MockClientCommandsServer_PublishingList_Call struct { - *mock.Call -} - -// PublishingList is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcPublishingListRequest -func (_e *MockClientCommandsServer_Expecter) PublishingList(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_PublishingList_Call { - return &MockClientCommandsServer_PublishingList_Call{Call: _e.mock.On("PublishingList", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_PublishingList_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcPublishingListRequest)) *MockClientCommandsServer_PublishingList_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcPublishingListRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_PublishingList_Call) Return(_a0 *pb.RpcPublishingListResponse) *MockClientCommandsServer_PublishingList_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_PublishingList_Call) RunAndReturn(run func(context.Context, *pb.RpcPublishingListRequest) *pb.RpcPublishingListResponse) *MockClientCommandsServer_PublishingList_Call { - _c.Call.Return(run) - return _c -} - -// PublishingRemove provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) PublishingRemove(_a0 context.Context, _a1 *pb.RpcPublishingRemoveRequest) *pb.RpcPublishingRemoveResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for PublishingRemove") - } - - var r0 *pb.RpcPublishingRemoveResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcPublishingRemoveRequest) *pb.RpcPublishingRemoveResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcPublishingRemoveResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_PublishingRemove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PublishingRemove' -type MockClientCommandsServer_PublishingRemove_Call struct { - *mock.Call -} - -// PublishingRemove is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcPublishingRemoveRequest -func (_e *MockClientCommandsServer_Expecter) PublishingRemove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_PublishingRemove_Call { - return &MockClientCommandsServer_PublishingRemove_Call{Call: _e.mock.On("PublishingRemove", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_PublishingRemove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcPublishingRemoveRequest)) *MockClientCommandsServer_PublishingRemove_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcPublishingRemoveRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_PublishingRemove_Call) Return(_a0 *pb.RpcPublishingRemoveResponse) *MockClientCommandsServer_PublishingRemove_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_PublishingRemove_Call) RunAndReturn(run func(context.Context, *pb.RpcPublishingRemoveRequest) *pb.RpcPublishingRemoveResponse) *MockClientCommandsServer_PublishingRemove_Call { - _c.Call.Return(run) - return _c -} - -// PublishingResolveUri provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) PublishingResolveUri(_a0 context.Context, _a1 *pb.RpcPublishingResolveUriRequest) *pb.RpcPublishingResolveUriResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for PublishingResolveUri") - } - - var r0 *pb.RpcPublishingResolveUriResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcPublishingResolveUriRequest) *pb.RpcPublishingResolveUriResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcPublishingResolveUriResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_PublishingResolveUri_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PublishingResolveUri' -type MockClientCommandsServer_PublishingResolveUri_Call struct { - *mock.Call -} - -// PublishingResolveUri is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcPublishingResolveUriRequest -func (_e *MockClientCommandsServer_Expecter) PublishingResolveUri(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_PublishingResolveUri_Call { - return &MockClientCommandsServer_PublishingResolveUri_Call{Call: _e.mock.On("PublishingResolveUri", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_PublishingResolveUri_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcPublishingResolveUriRequest)) *MockClientCommandsServer_PublishingResolveUri_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcPublishingResolveUriRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_PublishingResolveUri_Call) Return(_a0 *pb.RpcPublishingResolveUriResponse) *MockClientCommandsServer_PublishingResolveUri_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_PublishingResolveUri_Call) RunAndReturn(run func(context.Context, *pb.RpcPublishingResolveUriRequest) *pb.RpcPublishingResolveUriResponse) *MockClientCommandsServer_PublishingResolveUri_Call { - _c.Call.Return(run) - return _c -} - -// RelationListRemoveOption provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) RelationListRemoveOption(_a0 context.Context, _a1 *pb.RpcRelationListRemoveOptionRequest) *pb.RpcRelationListRemoveOptionResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for RelationListRemoveOption") - } - - var r0 *pb.RpcRelationListRemoveOptionResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcRelationListRemoveOptionRequest) *pb.RpcRelationListRemoveOptionResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcRelationListRemoveOptionResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_RelationListRemoveOption_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RelationListRemoveOption' -type MockClientCommandsServer_RelationListRemoveOption_Call struct { - *mock.Call -} - -// RelationListRemoveOption is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcRelationListRemoveOptionRequest -func (_e *MockClientCommandsServer_Expecter) RelationListRemoveOption(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_RelationListRemoveOption_Call { - return &MockClientCommandsServer_RelationListRemoveOption_Call{Call: _e.mock.On("RelationListRemoveOption", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_RelationListRemoveOption_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcRelationListRemoveOptionRequest)) *MockClientCommandsServer_RelationListRemoveOption_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcRelationListRemoveOptionRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_RelationListRemoveOption_Call) Return(_a0 *pb.RpcRelationListRemoveOptionResponse) *MockClientCommandsServer_RelationListRemoveOption_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_RelationListRemoveOption_Call) RunAndReturn(run func(context.Context, *pb.RpcRelationListRemoveOptionRequest) *pb.RpcRelationListRemoveOptionResponse) *MockClientCommandsServer_RelationListRemoveOption_Call { - _c.Call.Return(run) - return _c -} - -// RelationListWithValue provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) RelationListWithValue(_a0 context.Context, _a1 *pb.RpcRelationListWithValueRequest) *pb.RpcRelationListWithValueResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for RelationListWithValue") - } - - var r0 *pb.RpcRelationListWithValueResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcRelationListWithValueRequest) *pb.RpcRelationListWithValueResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcRelationListWithValueResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_RelationListWithValue_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RelationListWithValue' -type MockClientCommandsServer_RelationListWithValue_Call struct { - *mock.Call -} - -// RelationListWithValue is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcRelationListWithValueRequest -func (_e *MockClientCommandsServer_Expecter) RelationListWithValue(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_RelationListWithValue_Call { - return &MockClientCommandsServer_RelationListWithValue_Call{Call: _e.mock.On("RelationListWithValue", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_RelationListWithValue_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcRelationListWithValueRequest)) *MockClientCommandsServer_RelationListWithValue_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcRelationListWithValueRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_RelationListWithValue_Call) Return(_a0 *pb.RpcRelationListWithValueResponse) *MockClientCommandsServer_RelationListWithValue_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_RelationListWithValue_Call) RunAndReturn(run func(context.Context, *pb.RpcRelationListWithValueRequest) *pb.RpcRelationListWithValueResponse) *MockClientCommandsServer_RelationListWithValue_Call { - _c.Call.Return(run) - return _c -} - -// RelationOptions provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) RelationOptions(_a0 context.Context, _a1 *pb.RpcRelationOptionsRequest) *pb.RpcRelationOptionsResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for RelationOptions") - } - - var r0 *pb.RpcRelationOptionsResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcRelationOptionsRequest) *pb.RpcRelationOptionsResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcRelationOptionsResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_RelationOptions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RelationOptions' -type MockClientCommandsServer_RelationOptions_Call struct { - *mock.Call -} - -// RelationOptions is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcRelationOptionsRequest -func (_e *MockClientCommandsServer_Expecter) RelationOptions(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_RelationOptions_Call { - return &MockClientCommandsServer_RelationOptions_Call{Call: _e.mock.On("RelationOptions", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_RelationOptions_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcRelationOptionsRequest)) *MockClientCommandsServer_RelationOptions_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcRelationOptionsRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_RelationOptions_Call) Return(_a0 *pb.RpcRelationOptionsResponse) *MockClientCommandsServer_RelationOptions_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_RelationOptions_Call) RunAndReturn(run func(context.Context, *pb.RpcRelationOptionsRequest) *pb.RpcRelationOptionsResponse) *MockClientCommandsServer_RelationOptions_Call { - _c.Call.Return(run) - return _c -} - -// SpaceDelete provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) SpaceDelete(_a0 context.Context, _a1 *pb.RpcSpaceDeleteRequest) *pb.RpcSpaceDeleteResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for SpaceDelete") - } - - var r0 *pb.RpcSpaceDeleteResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceDeleteRequest) *pb.RpcSpaceDeleteResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcSpaceDeleteResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_SpaceDelete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceDelete' -type MockClientCommandsServer_SpaceDelete_Call struct { - *mock.Call -} - -// SpaceDelete is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcSpaceDeleteRequest -func (_e *MockClientCommandsServer_Expecter) SpaceDelete(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceDelete_Call { - return &MockClientCommandsServer_SpaceDelete_Call{Call: _e.mock.On("SpaceDelete", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_SpaceDelete_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceDeleteRequest)) *MockClientCommandsServer_SpaceDelete_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcSpaceDeleteRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_SpaceDelete_Call) Return(_a0 *pb.RpcSpaceDeleteResponse) *MockClientCommandsServer_SpaceDelete_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_SpaceDelete_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceDeleteRequest) *pb.RpcSpaceDeleteResponse) *MockClientCommandsServer_SpaceDelete_Call { - _c.Call.Return(run) - return _c -} - -// SpaceInviteGenerate provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) SpaceInviteGenerate(_a0 context.Context, _a1 *pb.RpcSpaceInviteGenerateRequest) *pb.RpcSpaceInviteGenerateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for SpaceInviteGenerate") - } - - var r0 *pb.RpcSpaceInviteGenerateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceInviteGenerateRequest) *pb.RpcSpaceInviteGenerateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcSpaceInviteGenerateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_SpaceInviteGenerate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceInviteGenerate' -type MockClientCommandsServer_SpaceInviteGenerate_Call struct { - *mock.Call -} - -// SpaceInviteGenerate is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcSpaceInviteGenerateRequest -func (_e *MockClientCommandsServer_Expecter) SpaceInviteGenerate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceInviteGenerate_Call { - return &MockClientCommandsServer_SpaceInviteGenerate_Call{Call: _e.mock.On("SpaceInviteGenerate", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_SpaceInviteGenerate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceInviteGenerateRequest)) *MockClientCommandsServer_SpaceInviteGenerate_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcSpaceInviteGenerateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_SpaceInviteGenerate_Call) Return(_a0 *pb.RpcSpaceInviteGenerateResponse) *MockClientCommandsServer_SpaceInviteGenerate_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_SpaceInviteGenerate_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceInviteGenerateRequest) *pb.RpcSpaceInviteGenerateResponse) *MockClientCommandsServer_SpaceInviteGenerate_Call { - _c.Call.Return(run) - return _c -} - -// SpaceInviteGetCurrent provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) SpaceInviteGetCurrent(_a0 context.Context, _a1 *pb.RpcSpaceInviteGetCurrentRequest) *pb.RpcSpaceInviteGetCurrentResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for SpaceInviteGetCurrent") - } - - var r0 *pb.RpcSpaceInviteGetCurrentResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceInviteGetCurrentRequest) *pb.RpcSpaceInviteGetCurrentResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcSpaceInviteGetCurrentResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_SpaceInviteGetCurrent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceInviteGetCurrent' -type MockClientCommandsServer_SpaceInviteGetCurrent_Call struct { - *mock.Call -} - -// SpaceInviteGetCurrent is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcSpaceInviteGetCurrentRequest -func (_e *MockClientCommandsServer_Expecter) SpaceInviteGetCurrent(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceInviteGetCurrent_Call { - return &MockClientCommandsServer_SpaceInviteGetCurrent_Call{Call: _e.mock.On("SpaceInviteGetCurrent", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_SpaceInviteGetCurrent_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceInviteGetCurrentRequest)) *MockClientCommandsServer_SpaceInviteGetCurrent_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcSpaceInviteGetCurrentRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_SpaceInviteGetCurrent_Call) Return(_a0 *pb.RpcSpaceInviteGetCurrentResponse) *MockClientCommandsServer_SpaceInviteGetCurrent_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_SpaceInviteGetCurrent_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceInviteGetCurrentRequest) *pb.RpcSpaceInviteGetCurrentResponse) *MockClientCommandsServer_SpaceInviteGetCurrent_Call { - _c.Call.Return(run) - return _c -} - -// SpaceInviteGetGuest provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) SpaceInviteGetGuest(_a0 context.Context, _a1 *pb.RpcSpaceInviteGetGuestRequest) *pb.RpcSpaceInviteGetGuestResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for SpaceInviteGetGuest") - } - - var r0 *pb.RpcSpaceInviteGetGuestResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceInviteGetGuestRequest) *pb.RpcSpaceInviteGetGuestResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcSpaceInviteGetGuestResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_SpaceInviteGetGuest_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceInviteGetGuest' -type MockClientCommandsServer_SpaceInviteGetGuest_Call struct { - *mock.Call -} - -// SpaceInviteGetGuest is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcSpaceInviteGetGuestRequest -func (_e *MockClientCommandsServer_Expecter) SpaceInviteGetGuest(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceInviteGetGuest_Call { - return &MockClientCommandsServer_SpaceInviteGetGuest_Call{Call: _e.mock.On("SpaceInviteGetGuest", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_SpaceInviteGetGuest_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceInviteGetGuestRequest)) *MockClientCommandsServer_SpaceInviteGetGuest_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcSpaceInviteGetGuestRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_SpaceInviteGetGuest_Call) Return(_a0 *pb.RpcSpaceInviteGetGuestResponse) *MockClientCommandsServer_SpaceInviteGetGuest_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_SpaceInviteGetGuest_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceInviteGetGuestRequest) *pb.RpcSpaceInviteGetGuestResponse) *MockClientCommandsServer_SpaceInviteGetGuest_Call { - _c.Call.Return(run) - return _c -} - -// SpaceInviteRevoke provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) SpaceInviteRevoke(_a0 context.Context, _a1 *pb.RpcSpaceInviteRevokeRequest) *pb.RpcSpaceInviteRevokeResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for SpaceInviteRevoke") - } - - var r0 *pb.RpcSpaceInviteRevokeResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceInviteRevokeRequest) *pb.RpcSpaceInviteRevokeResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcSpaceInviteRevokeResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_SpaceInviteRevoke_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceInviteRevoke' -type MockClientCommandsServer_SpaceInviteRevoke_Call struct { - *mock.Call -} - -// SpaceInviteRevoke is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcSpaceInviteRevokeRequest -func (_e *MockClientCommandsServer_Expecter) SpaceInviteRevoke(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceInviteRevoke_Call { - return &MockClientCommandsServer_SpaceInviteRevoke_Call{Call: _e.mock.On("SpaceInviteRevoke", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_SpaceInviteRevoke_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceInviteRevokeRequest)) *MockClientCommandsServer_SpaceInviteRevoke_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcSpaceInviteRevokeRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_SpaceInviteRevoke_Call) Return(_a0 *pb.RpcSpaceInviteRevokeResponse) *MockClientCommandsServer_SpaceInviteRevoke_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_SpaceInviteRevoke_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceInviteRevokeRequest) *pb.RpcSpaceInviteRevokeResponse) *MockClientCommandsServer_SpaceInviteRevoke_Call { - _c.Call.Return(run) - return _c -} - -// SpaceInviteView provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) SpaceInviteView(_a0 context.Context, _a1 *pb.RpcSpaceInviteViewRequest) *pb.RpcSpaceInviteViewResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for SpaceInviteView") - } - - var r0 *pb.RpcSpaceInviteViewResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceInviteViewRequest) *pb.RpcSpaceInviteViewResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcSpaceInviteViewResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_SpaceInviteView_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceInviteView' -type MockClientCommandsServer_SpaceInviteView_Call struct { - *mock.Call -} - -// SpaceInviteView is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcSpaceInviteViewRequest -func (_e *MockClientCommandsServer_Expecter) SpaceInviteView(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceInviteView_Call { - return &MockClientCommandsServer_SpaceInviteView_Call{Call: _e.mock.On("SpaceInviteView", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_SpaceInviteView_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceInviteViewRequest)) *MockClientCommandsServer_SpaceInviteView_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcSpaceInviteViewRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_SpaceInviteView_Call) Return(_a0 *pb.RpcSpaceInviteViewResponse) *MockClientCommandsServer_SpaceInviteView_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_SpaceInviteView_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceInviteViewRequest) *pb.RpcSpaceInviteViewResponse) *MockClientCommandsServer_SpaceInviteView_Call { - _c.Call.Return(run) - return _c -} - -// SpaceJoin provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) SpaceJoin(_a0 context.Context, _a1 *pb.RpcSpaceJoinRequest) *pb.RpcSpaceJoinResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for SpaceJoin") - } - - var r0 *pb.RpcSpaceJoinResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceJoinRequest) *pb.RpcSpaceJoinResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcSpaceJoinResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_SpaceJoin_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceJoin' -type MockClientCommandsServer_SpaceJoin_Call struct { - *mock.Call -} - -// SpaceJoin is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcSpaceJoinRequest -func (_e *MockClientCommandsServer_Expecter) SpaceJoin(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceJoin_Call { - return &MockClientCommandsServer_SpaceJoin_Call{Call: _e.mock.On("SpaceJoin", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_SpaceJoin_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceJoinRequest)) *MockClientCommandsServer_SpaceJoin_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcSpaceJoinRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_SpaceJoin_Call) Return(_a0 *pb.RpcSpaceJoinResponse) *MockClientCommandsServer_SpaceJoin_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_SpaceJoin_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceJoinRequest) *pb.RpcSpaceJoinResponse) *MockClientCommandsServer_SpaceJoin_Call { - _c.Call.Return(run) - return _c -} - -// SpaceJoinCancel provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) SpaceJoinCancel(_a0 context.Context, _a1 *pb.RpcSpaceJoinCancelRequest) *pb.RpcSpaceJoinCancelResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for SpaceJoinCancel") - } - - var r0 *pb.RpcSpaceJoinCancelResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceJoinCancelRequest) *pb.RpcSpaceJoinCancelResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcSpaceJoinCancelResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_SpaceJoinCancel_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceJoinCancel' -type MockClientCommandsServer_SpaceJoinCancel_Call struct { - *mock.Call -} - -// SpaceJoinCancel is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcSpaceJoinCancelRequest -func (_e *MockClientCommandsServer_Expecter) SpaceJoinCancel(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceJoinCancel_Call { - return &MockClientCommandsServer_SpaceJoinCancel_Call{Call: _e.mock.On("SpaceJoinCancel", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_SpaceJoinCancel_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceJoinCancelRequest)) *MockClientCommandsServer_SpaceJoinCancel_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcSpaceJoinCancelRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_SpaceJoinCancel_Call) Return(_a0 *pb.RpcSpaceJoinCancelResponse) *MockClientCommandsServer_SpaceJoinCancel_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_SpaceJoinCancel_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceJoinCancelRequest) *pb.RpcSpaceJoinCancelResponse) *MockClientCommandsServer_SpaceJoinCancel_Call { - _c.Call.Return(run) - return _c -} - -// SpaceLeaveApprove provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) SpaceLeaveApprove(_a0 context.Context, _a1 *pb.RpcSpaceLeaveApproveRequest) *pb.RpcSpaceLeaveApproveResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for SpaceLeaveApprove") - } - - var r0 *pb.RpcSpaceLeaveApproveResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceLeaveApproveRequest) *pb.RpcSpaceLeaveApproveResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcSpaceLeaveApproveResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_SpaceLeaveApprove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceLeaveApprove' -type MockClientCommandsServer_SpaceLeaveApprove_Call struct { - *mock.Call -} - -// SpaceLeaveApprove is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcSpaceLeaveApproveRequest -func (_e *MockClientCommandsServer_Expecter) SpaceLeaveApprove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceLeaveApprove_Call { - return &MockClientCommandsServer_SpaceLeaveApprove_Call{Call: _e.mock.On("SpaceLeaveApprove", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_SpaceLeaveApprove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceLeaveApproveRequest)) *MockClientCommandsServer_SpaceLeaveApprove_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcSpaceLeaveApproveRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_SpaceLeaveApprove_Call) Return(_a0 *pb.RpcSpaceLeaveApproveResponse) *MockClientCommandsServer_SpaceLeaveApprove_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_SpaceLeaveApprove_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceLeaveApproveRequest) *pb.RpcSpaceLeaveApproveResponse) *MockClientCommandsServer_SpaceLeaveApprove_Call { - _c.Call.Return(run) - return _c -} - -// SpaceMakeShareable provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) SpaceMakeShareable(_a0 context.Context, _a1 *pb.RpcSpaceMakeShareableRequest) *pb.RpcSpaceMakeShareableResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for SpaceMakeShareable") - } - - var r0 *pb.RpcSpaceMakeShareableResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceMakeShareableRequest) *pb.RpcSpaceMakeShareableResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcSpaceMakeShareableResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_SpaceMakeShareable_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceMakeShareable' -type MockClientCommandsServer_SpaceMakeShareable_Call struct { - *mock.Call -} - -// SpaceMakeShareable is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcSpaceMakeShareableRequest -func (_e *MockClientCommandsServer_Expecter) SpaceMakeShareable(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceMakeShareable_Call { - return &MockClientCommandsServer_SpaceMakeShareable_Call{Call: _e.mock.On("SpaceMakeShareable", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_SpaceMakeShareable_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceMakeShareableRequest)) *MockClientCommandsServer_SpaceMakeShareable_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcSpaceMakeShareableRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_SpaceMakeShareable_Call) Return(_a0 *pb.RpcSpaceMakeShareableResponse) *MockClientCommandsServer_SpaceMakeShareable_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_SpaceMakeShareable_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceMakeShareableRequest) *pb.RpcSpaceMakeShareableResponse) *MockClientCommandsServer_SpaceMakeShareable_Call { - _c.Call.Return(run) - return _c -} - -// SpaceParticipantPermissionsChange provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) SpaceParticipantPermissionsChange(_a0 context.Context, _a1 *pb.RpcSpaceParticipantPermissionsChangeRequest) *pb.RpcSpaceParticipantPermissionsChangeResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for SpaceParticipantPermissionsChange") - } - - var r0 *pb.RpcSpaceParticipantPermissionsChangeResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceParticipantPermissionsChangeRequest) *pb.RpcSpaceParticipantPermissionsChangeResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcSpaceParticipantPermissionsChangeResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_SpaceParticipantPermissionsChange_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceParticipantPermissionsChange' -type MockClientCommandsServer_SpaceParticipantPermissionsChange_Call struct { - *mock.Call -} - -// SpaceParticipantPermissionsChange is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcSpaceParticipantPermissionsChangeRequest -func (_e *MockClientCommandsServer_Expecter) SpaceParticipantPermissionsChange(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceParticipantPermissionsChange_Call { - return &MockClientCommandsServer_SpaceParticipantPermissionsChange_Call{Call: _e.mock.On("SpaceParticipantPermissionsChange", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_SpaceParticipantPermissionsChange_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceParticipantPermissionsChangeRequest)) *MockClientCommandsServer_SpaceParticipantPermissionsChange_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcSpaceParticipantPermissionsChangeRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_SpaceParticipantPermissionsChange_Call) Return(_a0 *pb.RpcSpaceParticipantPermissionsChangeResponse) *MockClientCommandsServer_SpaceParticipantPermissionsChange_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_SpaceParticipantPermissionsChange_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceParticipantPermissionsChangeRequest) *pb.RpcSpaceParticipantPermissionsChangeResponse) *MockClientCommandsServer_SpaceParticipantPermissionsChange_Call { - _c.Call.Return(run) - return _c -} - -// SpaceParticipantRemove provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) SpaceParticipantRemove(_a0 context.Context, _a1 *pb.RpcSpaceParticipantRemoveRequest) *pb.RpcSpaceParticipantRemoveResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for SpaceParticipantRemove") - } - - var r0 *pb.RpcSpaceParticipantRemoveResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceParticipantRemoveRequest) *pb.RpcSpaceParticipantRemoveResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcSpaceParticipantRemoveResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_SpaceParticipantRemove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceParticipantRemove' -type MockClientCommandsServer_SpaceParticipantRemove_Call struct { - *mock.Call -} - -// SpaceParticipantRemove is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcSpaceParticipantRemoveRequest -func (_e *MockClientCommandsServer_Expecter) SpaceParticipantRemove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceParticipantRemove_Call { - return &MockClientCommandsServer_SpaceParticipantRemove_Call{Call: _e.mock.On("SpaceParticipantRemove", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_SpaceParticipantRemove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceParticipantRemoveRequest)) *MockClientCommandsServer_SpaceParticipantRemove_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcSpaceParticipantRemoveRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_SpaceParticipantRemove_Call) Return(_a0 *pb.RpcSpaceParticipantRemoveResponse) *MockClientCommandsServer_SpaceParticipantRemove_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_SpaceParticipantRemove_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceParticipantRemoveRequest) *pb.RpcSpaceParticipantRemoveResponse) *MockClientCommandsServer_SpaceParticipantRemove_Call { - _c.Call.Return(run) - return _c -} - -// SpaceRequestApprove provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) SpaceRequestApprove(_a0 context.Context, _a1 *pb.RpcSpaceRequestApproveRequest) *pb.RpcSpaceRequestApproveResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for SpaceRequestApprove") - } - - var r0 *pb.RpcSpaceRequestApproveResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceRequestApproveRequest) *pb.RpcSpaceRequestApproveResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcSpaceRequestApproveResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_SpaceRequestApprove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceRequestApprove' -type MockClientCommandsServer_SpaceRequestApprove_Call struct { - *mock.Call -} - -// SpaceRequestApprove is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcSpaceRequestApproveRequest -func (_e *MockClientCommandsServer_Expecter) SpaceRequestApprove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceRequestApprove_Call { - return &MockClientCommandsServer_SpaceRequestApprove_Call{Call: _e.mock.On("SpaceRequestApprove", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_SpaceRequestApprove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceRequestApproveRequest)) *MockClientCommandsServer_SpaceRequestApprove_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcSpaceRequestApproveRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_SpaceRequestApprove_Call) Return(_a0 *pb.RpcSpaceRequestApproveResponse) *MockClientCommandsServer_SpaceRequestApprove_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_SpaceRequestApprove_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceRequestApproveRequest) *pb.RpcSpaceRequestApproveResponse) *MockClientCommandsServer_SpaceRequestApprove_Call { - _c.Call.Return(run) - return _c -} - -// SpaceRequestDecline provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) SpaceRequestDecline(_a0 context.Context, _a1 *pb.RpcSpaceRequestDeclineRequest) *pb.RpcSpaceRequestDeclineResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for SpaceRequestDecline") - } - - var r0 *pb.RpcSpaceRequestDeclineResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceRequestDeclineRequest) *pb.RpcSpaceRequestDeclineResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcSpaceRequestDeclineResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_SpaceRequestDecline_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceRequestDecline' -type MockClientCommandsServer_SpaceRequestDecline_Call struct { - *mock.Call -} - -// SpaceRequestDecline is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcSpaceRequestDeclineRequest -func (_e *MockClientCommandsServer_Expecter) SpaceRequestDecline(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceRequestDecline_Call { - return &MockClientCommandsServer_SpaceRequestDecline_Call{Call: _e.mock.On("SpaceRequestDecline", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_SpaceRequestDecline_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceRequestDeclineRequest)) *MockClientCommandsServer_SpaceRequestDecline_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcSpaceRequestDeclineRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_SpaceRequestDecline_Call) Return(_a0 *pb.RpcSpaceRequestDeclineResponse) *MockClientCommandsServer_SpaceRequestDecline_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_SpaceRequestDecline_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceRequestDeclineRequest) *pb.RpcSpaceRequestDeclineResponse) *MockClientCommandsServer_SpaceRequestDecline_Call { - _c.Call.Return(run) - return _c -} - -// SpaceSetOrder provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) SpaceSetOrder(_a0 context.Context, _a1 *pb.RpcSpaceSetOrderRequest) *pb.RpcSpaceSetOrderResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for SpaceSetOrder") - } - - var r0 *pb.RpcSpaceSetOrderResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceSetOrderRequest) *pb.RpcSpaceSetOrderResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcSpaceSetOrderResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_SpaceSetOrder_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceSetOrder' -type MockClientCommandsServer_SpaceSetOrder_Call struct { - *mock.Call -} - -// SpaceSetOrder is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcSpaceSetOrderRequest -func (_e *MockClientCommandsServer_Expecter) SpaceSetOrder(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceSetOrder_Call { - return &MockClientCommandsServer_SpaceSetOrder_Call{Call: _e.mock.On("SpaceSetOrder", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_SpaceSetOrder_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceSetOrderRequest)) *MockClientCommandsServer_SpaceSetOrder_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcSpaceSetOrderRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_SpaceSetOrder_Call) Return(_a0 *pb.RpcSpaceSetOrderResponse) *MockClientCommandsServer_SpaceSetOrder_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_SpaceSetOrder_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceSetOrderRequest) *pb.RpcSpaceSetOrderResponse) *MockClientCommandsServer_SpaceSetOrder_Call { - _c.Call.Return(run) - return _c -} - -// SpaceStopSharing provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) SpaceStopSharing(_a0 context.Context, _a1 *pb.RpcSpaceStopSharingRequest) *pb.RpcSpaceStopSharingResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for SpaceStopSharing") - } - - var r0 *pb.RpcSpaceStopSharingResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceStopSharingRequest) *pb.RpcSpaceStopSharingResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcSpaceStopSharingResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_SpaceStopSharing_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceStopSharing' -type MockClientCommandsServer_SpaceStopSharing_Call struct { - *mock.Call -} - -// SpaceStopSharing is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcSpaceStopSharingRequest -func (_e *MockClientCommandsServer_Expecter) SpaceStopSharing(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceStopSharing_Call { - return &MockClientCommandsServer_SpaceStopSharing_Call{Call: _e.mock.On("SpaceStopSharing", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_SpaceStopSharing_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceStopSharingRequest)) *MockClientCommandsServer_SpaceStopSharing_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcSpaceStopSharingRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_SpaceStopSharing_Call) Return(_a0 *pb.RpcSpaceStopSharingResponse) *MockClientCommandsServer_SpaceStopSharing_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_SpaceStopSharing_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceStopSharingRequest) *pb.RpcSpaceStopSharingResponse) *MockClientCommandsServer_SpaceStopSharing_Call { - _c.Call.Return(run) - return _c -} - -// SpaceUnsetOrder provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) SpaceUnsetOrder(_a0 context.Context, _a1 *pb.RpcSpaceUnsetOrderRequest) *pb.RpcSpaceUnsetOrderResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for SpaceUnsetOrder") - } - - var r0 *pb.RpcSpaceUnsetOrderResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceUnsetOrderRequest) *pb.RpcSpaceUnsetOrderResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcSpaceUnsetOrderResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_SpaceUnsetOrder_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceUnsetOrder' -type MockClientCommandsServer_SpaceUnsetOrder_Call struct { - *mock.Call -} - -// SpaceUnsetOrder is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcSpaceUnsetOrderRequest -func (_e *MockClientCommandsServer_Expecter) SpaceUnsetOrder(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceUnsetOrder_Call { - return &MockClientCommandsServer_SpaceUnsetOrder_Call{Call: _e.mock.On("SpaceUnsetOrder", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_SpaceUnsetOrder_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceUnsetOrderRequest)) *MockClientCommandsServer_SpaceUnsetOrder_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcSpaceUnsetOrderRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_SpaceUnsetOrder_Call) Return(_a0 *pb.RpcSpaceUnsetOrderResponse) *MockClientCommandsServer_SpaceUnsetOrder_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_SpaceUnsetOrder_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceUnsetOrderRequest) *pb.RpcSpaceUnsetOrderResponse) *MockClientCommandsServer_SpaceUnsetOrder_Call { - _c.Call.Return(run) - return _c -} - -// TemplateClone provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) TemplateClone(_a0 context.Context, _a1 *pb.RpcTemplateCloneRequest) *pb.RpcTemplateCloneResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for TemplateClone") - } - - var r0 *pb.RpcTemplateCloneResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcTemplateCloneRequest) *pb.RpcTemplateCloneResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcTemplateCloneResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_TemplateClone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TemplateClone' -type MockClientCommandsServer_TemplateClone_Call struct { - *mock.Call -} - -// TemplateClone is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcTemplateCloneRequest -func (_e *MockClientCommandsServer_Expecter) TemplateClone(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_TemplateClone_Call { - return &MockClientCommandsServer_TemplateClone_Call{Call: _e.mock.On("TemplateClone", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_TemplateClone_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcTemplateCloneRequest)) *MockClientCommandsServer_TemplateClone_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcTemplateCloneRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_TemplateClone_Call) Return(_a0 *pb.RpcTemplateCloneResponse) *MockClientCommandsServer_TemplateClone_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_TemplateClone_Call) RunAndReturn(run func(context.Context, *pb.RpcTemplateCloneRequest) *pb.RpcTemplateCloneResponse) *MockClientCommandsServer_TemplateClone_Call { - _c.Call.Return(run) - return _c -} - -// TemplateCreateFromObject provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) TemplateCreateFromObject(_a0 context.Context, _a1 *pb.RpcTemplateCreateFromObjectRequest) *pb.RpcTemplateCreateFromObjectResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for TemplateCreateFromObject") - } - - var r0 *pb.RpcTemplateCreateFromObjectResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcTemplateCreateFromObjectRequest) *pb.RpcTemplateCreateFromObjectResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcTemplateCreateFromObjectResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_TemplateCreateFromObject_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TemplateCreateFromObject' -type MockClientCommandsServer_TemplateCreateFromObject_Call struct { - *mock.Call -} - -// TemplateCreateFromObject is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcTemplateCreateFromObjectRequest -func (_e *MockClientCommandsServer_Expecter) TemplateCreateFromObject(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_TemplateCreateFromObject_Call { - return &MockClientCommandsServer_TemplateCreateFromObject_Call{Call: _e.mock.On("TemplateCreateFromObject", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_TemplateCreateFromObject_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcTemplateCreateFromObjectRequest)) *MockClientCommandsServer_TemplateCreateFromObject_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcTemplateCreateFromObjectRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_TemplateCreateFromObject_Call) Return(_a0 *pb.RpcTemplateCreateFromObjectResponse) *MockClientCommandsServer_TemplateCreateFromObject_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_TemplateCreateFromObject_Call) RunAndReturn(run func(context.Context, *pb.RpcTemplateCreateFromObjectRequest) *pb.RpcTemplateCreateFromObjectResponse) *MockClientCommandsServer_TemplateCreateFromObject_Call { - _c.Call.Return(run) - return _c -} - -// TemplateExportAll provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) TemplateExportAll(_a0 context.Context, _a1 *pb.RpcTemplateExportAllRequest) *pb.RpcTemplateExportAllResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for TemplateExportAll") - } - - var r0 *pb.RpcTemplateExportAllResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcTemplateExportAllRequest) *pb.RpcTemplateExportAllResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcTemplateExportAllResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_TemplateExportAll_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TemplateExportAll' -type MockClientCommandsServer_TemplateExportAll_Call struct { - *mock.Call -} - -// TemplateExportAll is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcTemplateExportAllRequest -func (_e *MockClientCommandsServer_Expecter) TemplateExportAll(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_TemplateExportAll_Call { - return &MockClientCommandsServer_TemplateExportAll_Call{Call: _e.mock.On("TemplateExportAll", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_TemplateExportAll_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcTemplateExportAllRequest)) *MockClientCommandsServer_TemplateExportAll_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcTemplateExportAllRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_TemplateExportAll_Call) Return(_a0 *pb.RpcTemplateExportAllResponse) *MockClientCommandsServer_TemplateExportAll_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_TemplateExportAll_Call) RunAndReturn(run func(context.Context, *pb.RpcTemplateExportAllRequest) *pb.RpcTemplateExportAllResponse) *MockClientCommandsServer_TemplateExportAll_Call { - _c.Call.Return(run) - return _c -} - -// UnsplashDownload provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) UnsplashDownload(_a0 context.Context, _a1 *pb.RpcUnsplashDownloadRequest) *pb.RpcUnsplashDownloadResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for UnsplashDownload") - } - - var r0 *pb.RpcUnsplashDownloadResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcUnsplashDownloadRequest) *pb.RpcUnsplashDownloadResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcUnsplashDownloadResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_UnsplashDownload_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UnsplashDownload' -type MockClientCommandsServer_UnsplashDownload_Call struct { - *mock.Call -} - -// UnsplashDownload is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcUnsplashDownloadRequest -func (_e *MockClientCommandsServer_Expecter) UnsplashDownload(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_UnsplashDownload_Call { - return &MockClientCommandsServer_UnsplashDownload_Call{Call: _e.mock.On("UnsplashDownload", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_UnsplashDownload_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcUnsplashDownloadRequest)) *MockClientCommandsServer_UnsplashDownload_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcUnsplashDownloadRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_UnsplashDownload_Call) Return(_a0 *pb.RpcUnsplashDownloadResponse) *MockClientCommandsServer_UnsplashDownload_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_UnsplashDownload_Call) RunAndReturn(run func(context.Context, *pb.RpcUnsplashDownloadRequest) *pb.RpcUnsplashDownloadResponse) *MockClientCommandsServer_UnsplashDownload_Call { - _c.Call.Return(run) - return _c -} - -// UnsplashSearch provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) UnsplashSearch(_a0 context.Context, _a1 *pb.RpcUnsplashSearchRequest) *pb.RpcUnsplashSearchResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for UnsplashSearch") - } - - var r0 *pb.RpcUnsplashSearchResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcUnsplashSearchRequest) *pb.RpcUnsplashSearchResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcUnsplashSearchResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_UnsplashSearch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UnsplashSearch' -type MockClientCommandsServer_UnsplashSearch_Call struct { - *mock.Call -} - -// UnsplashSearch is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcUnsplashSearchRequest -func (_e *MockClientCommandsServer_Expecter) UnsplashSearch(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_UnsplashSearch_Call { - return &MockClientCommandsServer_UnsplashSearch_Call{Call: _e.mock.On("UnsplashSearch", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_UnsplashSearch_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcUnsplashSearchRequest)) *MockClientCommandsServer_UnsplashSearch_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcUnsplashSearchRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_UnsplashSearch_Call) Return(_a0 *pb.RpcUnsplashSearchResponse) *MockClientCommandsServer_UnsplashSearch_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_UnsplashSearch_Call) RunAndReturn(run func(context.Context, *pb.RpcUnsplashSearchRequest) *pb.RpcUnsplashSearchResponse) *MockClientCommandsServer_UnsplashSearch_Call { - _c.Call.Return(run) - return _c -} - -// WalletCloseSession provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) WalletCloseSession(_a0 context.Context, _a1 *pb.RpcWalletCloseSessionRequest) *pb.RpcWalletCloseSessionResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for WalletCloseSession") - } - - var r0 *pb.RpcWalletCloseSessionResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWalletCloseSessionRequest) *pb.RpcWalletCloseSessionResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcWalletCloseSessionResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_WalletCloseSession_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WalletCloseSession' -type MockClientCommandsServer_WalletCloseSession_Call struct { - *mock.Call -} - -// WalletCloseSession is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcWalletCloseSessionRequest -func (_e *MockClientCommandsServer_Expecter) WalletCloseSession(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WalletCloseSession_Call { - return &MockClientCommandsServer_WalletCloseSession_Call{Call: _e.mock.On("WalletCloseSession", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_WalletCloseSession_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWalletCloseSessionRequest)) *MockClientCommandsServer_WalletCloseSession_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcWalletCloseSessionRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_WalletCloseSession_Call) Return(_a0 *pb.RpcWalletCloseSessionResponse) *MockClientCommandsServer_WalletCloseSession_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_WalletCloseSession_Call) RunAndReturn(run func(context.Context, *pb.RpcWalletCloseSessionRequest) *pb.RpcWalletCloseSessionResponse) *MockClientCommandsServer_WalletCloseSession_Call { - _c.Call.Return(run) - return _c -} - -// WalletConvert provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) WalletConvert(_a0 context.Context, _a1 *pb.RpcWalletConvertRequest) *pb.RpcWalletConvertResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for WalletConvert") - } - - var r0 *pb.RpcWalletConvertResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWalletConvertRequest) *pb.RpcWalletConvertResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcWalletConvertResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_WalletConvert_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WalletConvert' -type MockClientCommandsServer_WalletConvert_Call struct { - *mock.Call -} - -// WalletConvert is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcWalletConvertRequest -func (_e *MockClientCommandsServer_Expecter) WalletConvert(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WalletConvert_Call { - return &MockClientCommandsServer_WalletConvert_Call{Call: _e.mock.On("WalletConvert", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_WalletConvert_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWalletConvertRequest)) *MockClientCommandsServer_WalletConvert_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcWalletConvertRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_WalletConvert_Call) Return(_a0 *pb.RpcWalletConvertResponse) *MockClientCommandsServer_WalletConvert_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_WalletConvert_Call) RunAndReturn(run func(context.Context, *pb.RpcWalletConvertRequest) *pb.RpcWalletConvertResponse) *MockClientCommandsServer_WalletConvert_Call { - _c.Call.Return(run) - return _c -} - -// WalletCreate provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) WalletCreate(_a0 context.Context, _a1 *pb.RpcWalletCreateRequest) *pb.RpcWalletCreateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for WalletCreate") - } - - var r0 *pb.RpcWalletCreateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWalletCreateRequest) *pb.RpcWalletCreateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcWalletCreateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_WalletCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WalletCreate' -type MockClientCommandsServer_WalletCreate_Call struct { - *mock.Call -} - -// WalletCreate is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcWalletCreateRequest -func (_e *MockClientCommandsServer_Expecter) WalletCreate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WalletCreate_Call { - return &MockClientCommandsServer_WalletCreate_Call{Call: _e.mock.On("WalletCreate", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_WalletCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWalletCreateRequest)) *MockClientCommandsServer_WalletCreate_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcWalletCreateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_WalletCreate_Call) Return(_a0 *pb.RpcWalletCreateResponse) *MockClientCommandsServer_WalletCreate_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_WalletCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcWalletCreateRequest) *pb.RpcWalletCreateResponse) *MockClientCommandsServer_WalletCreate_Call { - _c.Call.Return(run) - return _c -} - -// WalletCreateSession provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) WalletCreateSession(_a0 context.Context, _a1 *pb.RpcWalletCreateSessionRequest) *pb.RpcWalletCreateSessionResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for WalletCreateSession") - } - - var r0 *pb.RpcWalletCreateSessionResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWalletCreateSessionRequest) *pb.RpcWalletCreateSessionResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcWalletCreateSessionResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_WalletCreateSession_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WalletCreateSession' -type MockClientCommandsServer_WalletCreateSession_Call struct { - *mock.Call -} - -// WalletCreateSession is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcWalletCreateSessionRequest -func (_e *MockClientCommandsServer_Expecter) WalletCreateSession(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WalletCreateSession_Call { - return &MockClientCommandsServer_WalletCreateSession_Call{Call: _e.mock.On("WalletCreateSession", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_WalletCreateSession_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWalletCreateSessionRequest)) *MockClientCommandsServer_WalletCreateSession_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcWalletCreateSessionRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_WalletCreateSession_Call) Return(_a0 *pb.RpcWalletCreateSessionResponse) *MockClientCommandsServer_WalletCreateSession_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_WalletCreateSession_Call) RunAndReturn(run func(context.Context, *pb.RpcWalletCreateSessionRequest) *pb.RpcWalletCreateSessionResponse) *MockClientCommandsServer_WalletCreateSession_Call { - _c.Call.Return(run) - return _c -} - -// WalletRecover provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) WalletRecover(_a0 context.Context, _a1 *pb.RpcWalletRecoverRequest) *pb.RpcWalletRecoverResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for WalletRecover") - } - - var r0 *pb.RpcWalletRecoverResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWalletRecoverRequest) *pb.RpcWalletRecoverResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcWalletRecoverResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_WalletRecover_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WalletRecover' -type MockClientCommandsServer_WalletRecover_Call struct { - *mock.Call -} - -// WalletRecover is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcWalletRecoverRequest -func (_e *MockClientCommandsServer_Expecter) WalletRecover(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WalletRecover_Call { - return &MockClientCommandsServer_WalletRecover_Call{Call: _e.mock.On("WalletRecover", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_WalletRecover_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWalletRecoverRequest)) *MockClientCommandsServer_WalletRecover_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcWalletRecoverRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_WalletRecover_Call) Return(_a0 *pb.RpcWalletRecoverResponse) *MockClientCommandsServer_WalletRecover_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_WalletRecover_Call) RunAndReturn(run func(context.Context, *pb.RpcWalletRecoverRequest) *pb.RpcWalletRecoverResponse) *MockClientCommandsServer_WalletRecover_Call { - _c.Call.Return(run) - return _c -} - -// WorkspaceCreate provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) WorkspaceCreate(_a0 context.Context, _a1 *pb.RpcWorkspaceCreateRequest) *pb.RpcWorkspaceCreateResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for WorkspaceCreate") - } - - var r0 *pb.RpcWorkspaceCreateResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceCreateRequest) *pb.RpcWorkspaceCreateResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcWorkspaceCreateResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_WorkspaceCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceCreate' -type MockClientCommandsServer_WorkspaceCreate_Call struct { - *mock.Call -} - -// WorkspaceCreate is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcWorkspaceCreateRequest -func (_e *MockClientCommandsServer_Expecter) WorkspaceCreate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WorkspaceCreate_Call { - return &MockClientCommandsServer_WorkspaceCreate_Call{Call: _e.mock.On("WorkspaceCreate", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_WorkspaceCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceCreateRequest)) *MockClientCommandsServer_WorkspaceCreate_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceCreateRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_WorkspaceCreate_Call) Return(_a0 *pb.RpcWorkspaceCreateResponse) *MockClientCommandsServer_WorkspaceCreate_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_WorkspaceCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceCreateRequest) *pb.RpcWorkspaceCreateResponse) *MockClientCommandsServer_WorkspaceCreate_Call { - _c.Call.Return(run) - return _c -} - -// WorkspaceExport provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) WorkspaceExport(_a0 context.Context, _a1 *pb.RpcWorkspaceExportRequest) *pb.RpcWorkspaceExportResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for WorkspaceExport") - } - - var r0 *pb.RpcWorkspaceExportResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceExportRequest) *pb.RpcWorkspaceExportResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcWorkspaceExportResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_WorkspaceExport_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceExport' -type MockClientCommandsServer_WorkspaceExport_Call struct { - *mock.Call -} - -// WorkspaceExport is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcWorkspaceExportRequest -func (_e *MockClientCommandsServer_Expecter) WorkspaceExport(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WorkspaceExport_Call { - return &MockClientCommandsServer_WorkspaceExport_Call{Call: _e.mock.On("WorkspaceExport", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_WorkspaceExport_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceExportRequest)) *MockClientCommandsServer_WorkspaceExport_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceExportRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_WorkspaceExport_Call) Return(_a0 *pb.RpcWorkspaceExportResponse) *MockClientCommandsServer_WorkspaceExport_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_WorkspaceExport_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceExportRequest) *pb.RpcWorkspaceExportResponse) *MockClientCommandsServer_WorkspaceExport_Call { - _c.Call.Return(run) - return _c -} - -// WorkspaceGetAll provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) WorkspaceGetAll(_a0 context.Context, _a1 *pb.RpcWorkspaceGetAllRequest) *pb.RpcWorkspaceGetAllResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for WorkspaceGetAll") - } - - var r0 *pb.RpcWorkspaceGetAllResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceGetAllRequest) *pb.RpcWorkspaceGetAllResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcWorkspaceGetAllResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_WorkspaceGetAll_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceGetAll' -type MockClientCommandsServer_WorkspaceGetAll_Call struct { - *mock.Call -} - -// WorkspaceGetAll is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcWorkspaceGetAllRequest -func (_e *MockClientCommandsServer_Expecter) WorkspaceGetAll(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WorkspaceGetAll_Call { - return &MockClientCommandsServer_WorkspaceGetAll_Call{Call: _e.mock.On("WorkspaceGetAll", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_WorkspaceGetAll_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceGetAllRequest)) *MockClientCommandsServer_WorkspaceGetAll_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceGetAllRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_WorkspaceGetAll_Call) Return(_a0 *pb.RpcWorkspaceGetAllResponse) *MockClientCommandsServer_WorkspaceGetAll_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_WorkspaceGetAll_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceGetAllRequest) *pb.RpcWorkspaceGetAllResponse) *MockClientCommandsServer_WorkspaceGetAll_Call { - _c.Call.Return(run) - return _c -} - -// WorkspaceGetCurrent provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) WorkspaceGetCurrent(_a0 context.Context, _a1 *pb.RpcWorkspaceGetCurrentRequest) *pb.RpcWorkspaceGetCurrentResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for WorkspaceGetCurrent") - } - - var r0 *pb.RpcWorkspaceGetCurrentResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceGetCurrentRequest) *pb.RpcWorkspaceGetCurrentResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcWorkspaceGetCurrentResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_WorkspaceGetCurrent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceGetCurrent' -type MockClientCommandsServer_WorkspaceGetCurrent_Call struct { - *mock.Call -} - -// WorkspaceGetCurrent is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcWorkspaceGetCurrentRequest -func (_e *MockClientCommandsServer_Expecter) WorkspaceGetCurrent(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WorkspaceGetCurrent_Call { - return &MockClientCommandsServer_WorkspaceGetCurrent_Call{Call: _e.mock.On("WorkspaceGetCurrent", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_WorkspaceGetCurrent_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceGetCurrentRequest)) *MockClientCommandsServer_WorkspaceGetCurrent_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceGetCurrentRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_WorkspaceGetCurrent_Call) Return(_a0 *pb.RpcWorkspaceGetCurrentResponse) *MockClientCommandsServer_WorkspaceGetCurrent_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_WorkspaceGetCurrent_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceGetCurrentRequest) *pb.RpcWorkspaceGetCurrentResponse) *MockClientCommandsServer_WorkspaceGetCurrent_Call { - _c.Call.Return(run) - return _c -} - -// WorkspaceObjectAdd provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) WorkspaceObjectAdd(_a0 context.Context, _a1 *pb.RpcWorkspaceObjectAddRequest) *pb.RpcWorkspaceObjectAddResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for WorkspaceObjectAdd") - } - - var r0 *pb.RpcWorkspaceObjectAddResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceObjectAddRequest) *pb.RpcWorkspaceObjectAddResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcWorkspaceObjectAddResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_WorkspaceObjectAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceObjectAdd' -type MockClientCommandsServer_WorkspaceObjectAdd_Call struct { - *mock.Call -} - -// WorkspaceObjectAdd is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcWorkspaceObjectAddRequest -func (_e *MockClientCommandsServer_Expecter) WorkspaceObjectAdd(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WorkspaceObjectAdd_Call { - return &MockClientCommandsServer_WorkspaceObjectAdd_Call{Call: _e.mock.On("WorkspaceObjectAdd", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_WorkspaceObjectAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceObjectAddRequest)) *MockClientCommandsServer_WorkspaceObjectAdd_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceObjectAddRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_WorkspaceObjectAdd_Call) Return(_a0 *pb.RpcWorkspaceObjectAddResponse) *MockClientCommandsServer_WorkspaceObjectAdd_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_WorkspaceObjectAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceObjectAddRequest) *pb.RpcWorkspaceObjectAddResponse) *MockClientCommandsServer_WorkspaceObjectAdd_Call { - _c.Call.Return(run) - return _c -} - -// WorkspaceObjectListAdd provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) WorkspaceObjectListAdd(_a0 context.Context, _a1 *pb.RpcWorkspaceObjectListAddRequest) *pb.RpcWorkspaceObjectListAddResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for WorkspaceObjectListAdd") - } - - var r0 *pb.RpcWorkspaceObjectListAddResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceObjectListAddRequest) *pb.RpcWorkspaceObjectListAddResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcWorkspaceObjectListAddResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_WorkspaceObjectListAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceObjectListAdd' -type MockClientCommandsServer_WorkspaceObjectListAdd_Call struct { - *mock.Call -} - -// WorkspaceObjectListAdd is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcWorkspaceObjectListAddRequest -func (_e *MockClientCommandsServer_Expecter) WorkspaceObjectListAdd(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WorkspaceObjectListAdd_Call { - return &MockClientCommandsServer_WorkspaceObjectListAdd_Call{Call: _e.mock.On("WorkspaceObjectListAdd", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_WorkspaceObjectListAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceObjectListAddRequest)) *MockClientCommandsServer_WorkspaceObjectListAdd_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceObjectListAddRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_WorkspaceObjectListAdd_Call) Return(_a0 *pb.RpcWorkspaceObjectListAddResponse) *MockClientCommandsServer_WorkspaceObjectListAdd_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_WorkspaceObjectListAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceObjectListAddRequest) *pb.RpcWorkspaceObjectListAddResponse) *MockClientCommandsServer_WorkspaceObjectListAdd_Call { - _c.Call.Return(run) - return _c -} - -// WorkspaceObjectListRemove provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) WorkspaceObjectListRemove(_a0 context.Context, _a1 *pb.RpcWorkspaceObjectListRemoveRequest) *pb.RpcWorkspaceObjectListRemoveResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for WorkspaceObjectListRemove") - } - - var r0 *pb.RpcWorkspaceObjectListRemoveResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceObjectListRemoveRequest) *pb.RpcWorkspaceObjectListRemoveResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcWorkspaceObjectListRemoveResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_WorkspaceObjectListRemove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceObjectListRemove' -type MockClientCommandsServer_WorkspaceObjectListRemove_Call struct { - *mock.Call -} - -// WorkspaceObjectListRemove is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcWorkspaceObjectListRemoveRequest -func (_e *MockClientCommandsServer_Expecter) WorkspaceObjectListRemove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WorkspaceObjectListRemove_Call { - return &MockClientCommandsServer_WorkspaceObjectListRemove_Call{Call: _e.mock.On("WorkspaceObjectListRemove", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_WorkspaceObjectListRemove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceObjectListRemoveRequest)) *MockClientCommandsServer_WorkspaceObjectListRemove_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceObjectListRemoveRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_WorkspaceObjectListRemove_Call) Return(_a0 *pb.RpcWorkspaceObjectListRemoveResponse) *MockClientCommandsServer_WorkspaceObjectListRemove_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_WorkspaceObjectListRemove_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceObjectListRemoveRequest) *pb.RpcWorkspaceObjectListRemoveResponse) *MockClientCommandsServer_WorkspaceObjectListRemove_Call { - _c.Call.Return(run) - return _c -} - -// WorkspaceOpen provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) WorkspaceOpen(_a0 context.Context, _a1 *pb.RpcWorkspaceOpenRequest) *pb.RpcWorkspaceOpenResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for WorkspaceOpen") - } - - var r0 *pb.RpcWorkspaceOpenResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceOpenRequest) *pb.RpcWorkspaceOpenResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcWorkspaceOpenResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_WorkspaceOpen_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceOpen' -type MockClientCommandsServer_WorkspaceOpen_Call struct { - *mock.Call -} - -// WorkspaceOpen is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcWorkspaceOpenRequest -func (_e *MockClientCommandsServer_Expecter) WorkspaceOpen(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WorkspaceOpen_Call { - return &MockClientCommandsServer_WorkspaceOpen_Call{Call: _e.mock.On("WorkspaceOpen", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_WorkspaceOpen_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceOpenRequest)) *MockClientCommandsServer_WorkspaceOpen_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceOpenRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_WorkspaceOpen_Call) Return(_a0 *pb.RpcWorkspaceOpenResponse) *MockClientCommandsServer_WorkspaceOpen_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_WorkspaceOpen_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceOpenRequest) *pb.RpcWorkspaceOpenResponse) *MockClientCommandsServer_WorkspaceOpen_Call { - _c.Call.Return(run) - return _c -} - -// WorkspaceSelect provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) WorkspaceSelect(_a0 context.Context, _a1 *pb.RpcWorkspaceSelectRequest) *pb.RpcWorkspaceSelectResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for WorkspaceSelect") - } - - var r0 *pb.RpcWorkspaceSelectResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceSelectRequest) *pb.RpcWorkspaceSelectResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcWorkspaceSelectResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_WorkspaceSelect_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceSelect' -type MockClientCommandsServer_WorkspaceSelect_Call struct { - *mock.Call -} - -// WorkspaceSelect is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcWorkspaceSelectRequest -func (_e *MockClientCommandsServer_Expecter) WorkspaceSelect(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WorkspaceSelect_Call { - return &MockClientCommandsServer_WorkspaceSelect_Call{Call: _e.mock.On("WorkspaceSelect", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_WorkspaceSelect_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceSelectRequest)) *MockClientCommandsServer_WorkspaceSelect_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceSelectRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_WorkspaceSelect_Call) Return(_a0 *pb.RpcWorkspaceSelectResponse) *MockClientCommandsServer_WorkspaceSelect_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_WorkspaceSelect_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceSelectRequest) *pb.RpcWorkspaceSelectResponse) *MockClientCommandsServer_WorkspaceSelect_Call { - _c.Call.Return(run) - return _c -} - -// WorkspaceSetInfo provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) WorkspaceSetInfo(_a0 context.Context, _a1 *pb.RpcWorkspaceSetInfoRequest) *pb.RpcWorkspaceSetInfoResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for WorkspaceSetInfo") - } - - var r0 *pb.RpcWorkspaceSetInfoResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceSetInfoRequest) *pb.RpcWorkspaceSetInfoResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcWorkspaceSetInfoResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_WorkspaceSetInfo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceSetInfo' -type MockClientCommandsServer_WorkspaceSetInfo_Call struct { - *mock.Call -} - -// WorkspaceSetInfo is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcWorkspaceSetInfoRequest -func (_e *MockClientCommandsServer_Expecter) WorkspaceSetInfo(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WorkspaceSetInfo_Call { - return &MockClientCommandsServer_WorkspaceSetInfo_Call{Call: _e.mock.On("WorkspaceSetInfo", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_WorkspaceSetInfo_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceSetInfoRequest)) *MockClientCommandsServer_WorkspaceSetInfo_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceSetInfoRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_WorkspaceSetInfo_Call) Return(_a0 *pb.RpcWorkspaceSetInfoResponse) *MockClientCommandsServer_WorkspaceSetInfo_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_WorkspaceSetInfo_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceSetInfoRequest) *pb.RpcWorkspaceSetInfoResponse) *MockClientCommandsServer_WorkspaceSetInfo_Call { - _c.Call.Return(run) - return _c -} - -// NewMockClientCommandsServer creates a new instance of MockClientCommandsServer. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewMockClientCommandsServer(t interface { - mock.TestingT - Cleanup(func()) -}) *MockClientCommandsServer { - mock := &MockClientCommandsServer{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} From 7b9773df9b6acdb788a43a143283b55daf291761 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 28 Mar 2025 08:22:47 +0100 Subject: [PATCH 100/132] GO-4459: Change remaining apicore interfaces --- core/api/server/middleware_test.go | 2 +- core/api/server/server_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/api/server/middleware_test.go b/core/api/server/middleware_test.go index a0d283551..a51f50dfc 100644 --- a/core/api/server/middleware_test.go +++ b/core/api/server/middleware_test.go @@ -12,9 +12,9 @@ import ( "github.com/stretchr/testify/require" "github.com/anyproto/anytype-heart/core/anytype/account/mock_account" + "github.com/anyproto/anytype-heart/core/api/apicore/mock_apicore" "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pb/service/mock_service" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) diff --git a/core/api/server/server_test.go b/core/api/server/server_test.go index ef56a56b5..dd3535ffd 100644 --- a/core/api/server/server_test.go +++ b/core/api/server/server_test.go @@ -7,7 +7,7 @@ import ( "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/anytype/account/mock_account" - "github.com/anyproto/anytype-heart/pb/service/mock_service" + "github.com/anyproto/anytype-heart/core/api/apicore/mock_apicore" ) type fixture struct { From 07976b52abe4c54b8abf847cdf2b7d71a12d07bf Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 28 Mar 2025 09:10:53 +0100 Subject: [PATCH 101/132] GO-4459: Add tests for update member --- core/api/internal/space/service_test.go | 628 ++++++++++++++++++++++++ 1 file changed, 628 insertions(+) diff --git a/core/api/internal/space/service_test.go b/core/api/internal/space/service_test.go index add83ca27..2d05cc454 100644 --- a/core/api/internal/space/service_test.go +++ b/core/api/internal/space/service_test.go @@ -1,6 +1,7 @@ package space import ( + "context" "regexp" "testing" @@ -771,3 +772,630 @@ func TestSpaceService_GetMember(t *testing.T) { require.Equal(t, "editor", member.Role) }) } + +func TestSpaceService_UpdateMember(t *testing.T) { + t.Run("successful approval for joining member", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + // First GetMember call returns a member with status "joining" + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: "space-id", + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyIdentity.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("member-1"), + }, + }, + Keys: []string{ + bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + bundle.RelationKeyParticipantStatus.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String("member-1"), + bundle.RelationKeyName.String(): pbtypes.String("Joining Member"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(""), + bundle.RelationKeyIconImage.String(): pbtypes.String("icon.png"), + bundle.RelationKeyIdentity.String(): pbtypes.String("member-1"), + bundle.RelationKeyGlobalName.String(): pbtypes.String("joining.any"), + bundle.RelationKeyParticipantPermissions.String(): pbtypes.Int64(int64(model.ParticipantPermissions_Reader)), + bundle.RelationKeyParticipantStatus.String(): pbtypes.Int64(int64(model.ParticipantStatus_Joining)), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }, nil).Once() + + // Expect approval call (for a joining member, role 'viewer' maps to ParticipantPermissions_Reader) + fx.mwMock.On("SpaceRequestApprove", mock.Anything, &pb.RpcSpaceRequestApproveRequest{ + SpaceId: "space-id", + Identity: "member-1", + Permissions: model.ParticipantPermissions_Reader, + }).Return(&pb.RpcSpaceRequestApproveResponse{ + Error: &pb.RpcSpaceRequestApproveResponseError{Code: pb.RpcSpaceRequestApproveResponseError_NULL}, + }, nil).Once() + + // Second GetMember call returns the updated member with status "active" + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: "space-id", + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyIdentity.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("member-1"), + }, + }, + Keys: []string{ + bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + bundle.RelationKeyParticipantStatus.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String("member-1"), + bundle.RelationKeyName.String(): pbtypes.String("Joining Member"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(""), + bundle.RelationKeyIconImage.String(): pbtypes.String("icon.png"), + bundle.RelationKeyIdentity.String(): pbtypes.String("member-1"), + bundle.RelationKeyGlobalName.String(): pbtypes.String("joining.any"), + bundle.RelationKeyParticipantPermissions.String(): pbtypes.Int64(int64(model.ParticipantPermissions_Reader)), + bundle.RelationKeyParticipantStatus.String(): pbtypes.Int64(int64(model.ParticipantStatus_Active)), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }, nil).Once() + + // when + member, err := fx.UpdateMember(ctx, "space-id", "member-1", UpdateMemberRequest{ + Status: "active", + Role: "viewer", + }) + + // then + require.NoError(t, err) + require.Equal(t, "active", member.Status) + require.Equal(t, "viewer", member.Role) + }) + + t.Run("successful role update for active member", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + // First GetMember call returns a member with status "active" and role "viewer" + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: "space-id", + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyIdentity.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("member-2"), + }, + }, + Keys: []string{ + bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + bundle.RelationKeyParticipantStatus.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String("member-2"), + bundle.RelationKeyName.String(): pbtypes.String("Active Member"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("👤"), + bundle.RelationKeyIconImage.String(): pbtypes.String(""), + bundle.RelationKeyIdentity.String(): pbtypes.String("member-2"), + bundle.RelationKeyGlobalName.String(): pbtypes.String("active.any"), + bundle.RelationKeyParticipantPermissions.String(): pbtypes.Int64(int64(model.ParticipantPermissions_Reader)), + bundle.RelationKeyParticipantStatus.String(): pbtypes.Int64(int64(model.ParticipantStatus_Active)), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }, nil).Once() + + // Expect role update call (for an active member, updating role to 'editor' maps to ParticipantPermissions_Writer) + fx.mwMock.On("SpaceParticipantPermissionsChange", mock.Anything, &pb.RpcSpaceParticipantPermissionsChangeRequest{ + SpaceId: "space-id", + Changes: []*model.ParticipantPermissionChange{ + { + Identity: "member-2", + Perms: model.ParticipantPermissions_Writer, + }, + }, + }).Return(&pb.RpcSpaceParticipantPermissionsChangeResponse{ + Error: &pb.RpcSpaceParticipantPermissionsChangeResponseError{Code: pb.RpcSpaceParticipantPermissionsChangeResponseError_NULL}, + }, nil).Once() + + // Second GetMember call returns the updated member with role "editor" + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: "space-id", + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyIdentity.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("member-2"), + }, + }, + Keys: []string{ + bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + bundle.RelationKeyParticipantStatus.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String("member-2"), + bundle.RelationKeyName.String(): pbtypes.String("Active Member"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("👤"), + bundle.RelationKeyIconImage.String(): pbtypes.String(""), + bundle.RelationKeyIdentity.String(): pbtypes.String("member-2"), + bundle.RelationKeyGlobalName.String(): pbtypes.String("active.any"), + bundle.RelationKeyParticipantPermissions.String(): pbtypes.Int64(int64(model.ParticipantPermissions_Writer)), + bundle.RelationKeyParticipantStatus.String(): pbtypes.Int64(int64(model.ParticipantStatus_Active)), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }, nil).Once() + + // when + member, err := fx.UpdateMember(ctx, "space-id", "member-2", UpdateMemberRequest{ + Status: "active", + Role: "editor", + }) + + // then + require.NoError(t, err) + require.Equal(t, "active", member.Status) + require.Equal(t, "editor", member.Role) + }) + + t.Run("successful decline of member", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + // First GetMember call returns a member record + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: "space-id", + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyIdentity.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("member-3"), + }, + }, + Keys: []string{ + bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + bundle.RelationKeyParticipantStatus.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String("member-3"), + bundle.RelationKeyName.String(): pbtypes.String("Member To Decline"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(""), + bundle.RelationKeyIconImage.String(): pbtypes.String("icon.png"), + bundle.RelationKeyIdentity.String(): pbtypes.String("member-3"), + bundle.RelationKeyGlobalName.String(): pbtypes.String("decline.any"), + bundle.RelationKeyParticipantPermissions.String(): pbtypes.Int64(int64(model.ParticipantPermissions_Reader)), + bundle.RelationKeyParticipantStatus.String(): pbtypes.Int64(int64(model.ParticipantStatus_Joining)), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }, nil).Once() + + // Expect decline call + fx.mwMock.On("SpaceRequestDecline", mock.Anything, &pb.RpcSpaceRequestDeclineRequest{ + SpaceId: "space-id", + Identity: "member-3", + }).Return(&pb.RpcSpaceRequestDeclineResponse{ + Error: &pb.RpcSpaceRequestDeclineResponseError{Code: pb.RpcSpaceRequestDeclineResponseError_NULL}, + }, nil).Once() + + // Second GetMember call returns the member with status "declined" + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: "space-id", + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyIdentity.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("member-3"), + }, + }, + Keys: []string{ + bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + bundle.RelationKeyParticipantStatus.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String("member-3"), + bundle.RelationKeyName.String(): pbtypes.String("Member To Decline"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(""), + bundle.RelationKeyIconImage.String(): pbtypes.String("icon.png"), + bundle.RelationKeyIdentity.String(): pbtypes.String("member-3"), + bundle.RelationKeyGlobalName.String(): pbtypes.String("decline.any"), + bundle.RelationKeyParticipantPermissions.String(): pbtypes.Int64(int64(model.ParticipantPermissions_Reader)), + bundle.RelationKeyParticipantStatus.String(): pbtypes.Int64(int64(model.ParticipantStatus_Declined)), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }, nil).Once() + + // when + member, err := fx.UpdateMember(ctx, "space-id", "member-3", UpdateMemberRequest{ + Status: "declined", + }) + + // then + require.NoError(t, err) + require.Equal(t, "declined", member.Status) + }) + + t.Run("successful removal of member", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + // First GetMember call returns a member with status "active" + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: "space-id", + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyIdentity.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("member-4"), + }, + }, + Keys: []string{ + bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + bundle.RelationKeyParticipantStatus.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String("member-4"), + bundle.RelationKeyName.String(): pbtypes.String("Member To Remove"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("👤"), + bundle.RelationKeyIconImage.String(): pbtypes.String(""), + bundle.RelationKeyIdentity.String(): pbtypes.String("member-4"), + bundle.RelationKeyGlobalName.String(): pbtypes.String("remove.any"), + bundle.RelationKeyParticipantPermissions.String(): pbtypes.Int64(int64(model.ParticipantPermissions_Writer)), + bundle.RelationKeyParticipantStatus.String(): pbtypes.Int64(int64(model.ParticipantStatus_Active)), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }, nil).Once() + + // Expect removal call + fx.mwMock.On("SpaceParticipantRemove", mock.Anything, &pb.RpcSpaceParticipantRemoveRequest{ + SpaceId: "space-id", + Identities: []string{"member-4"}, + }).Return(&pb.RpcSpaceParticipantRemoveResponse{ + Error: &pb.RpcSpaceParticipantRemoveResponseError{Code: pb.RpcSpaceParticipantRemoveResponseError_NULL}, + }, nil).Once() + + // Second GetMember call returns the member with status "removed" + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: "space-id", + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyIdentity.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("member-4"), + }, + }, + Keys: []string{ + bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + bundle.RelationKeyParticipantStatus.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String("member-4"), + bundle.RelationKeyName.String(): pbtypes.String("Member To Remove"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("👤"), + bundle.RelationKeyIconImage.String(): pbtypes.String(""), + bundle.RelationKeyIdentity.String(): pbtypes.String("member-4"), + bundle.RelationKeyGlobalName.String(): pbtypes.String("remove.any"), + bundle.RelationKeyParticipantPermissions.String(): pbtypes.Int64(int64(model.ParticipantPermissions_Writer)), + bundle.RelationKeyParticipantStatus.String(): pbtypes.Int64(int64(model.ParticipantStatus_Removed)), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }, nil).Once() + + // when + member, err := fx.UpdateMember(ctx, "space-id", "member-4", UpdateMemberRequest{ + Status: "removed", + }) + + // then + require.NoError(t, err) + require.Equal(t, "removed", member.Status) + }) + + t.Run("invalid status returns error", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + // First GetMember call returns a member record + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: "space-id", + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyIdentity.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("member-5"), + }, + }, + Keys: []string{ + bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + bundle.RelationKeyParticipantStatus.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String("member-5"), + bundle.RelationKeyName.String(): pbtypes.String("Member Invalid Status"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(""), + bundle.RelationKeyIconImage.String(): pbtypes.String(""), + bundle.RelationKeyIdentity.String(): pbtypes.String("member-5"), + bundle.RelationKeyGlobalName.String(): pbtypes.String("invalid.any"), + bundle.RelationKeyParticipantPermissions.String(): pbtypes.Int64(int64(model.ParticipantPermissions_Reader)), + bundle.RelationKeyParticipantStatus.String(): pbtypes.Int64(int64(model.ParticipantStatus_Active)), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }, nil).Once() + + // when + _, err := fx.UpdateMember(ctx, "space-id", "member-5", UpdateMemberRequest{ + Status: "invalid", + Role: "viewer", + }) + + // then + require.ErrorIs(t, err, ErrInvalidApproveMemberStatus) + }) + + t.Run("invalid role for active update returns error", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + // First GetMember call returns a member with status "joining" + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: "space-id", + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyIdentity.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("member-6"), + }, + }, + Keys: []string{ + bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + bundle.RelationKeyParticipantStatus.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String("member-6"), + bundle.RelationKeyName.String(): pbtypes.String("Member Invalid Role"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(""), + bundle.RelationKeyIconImage.String(): pbtypes.String(""), + bundle.RelationKeyIdentity.String(): pbtypes.String("member-6"), + bundle.RelationKeyGlobalName.String(): pbtypes.String("invalidrole.any"), + bundle.RelationKeyParticipantPermissions.String(): pbtypes.Int64(int64(model.ParticipantPermissions_Reader)), + bundle.RelationKeyParticipantStatus.String(): pbtypes.Int64(int64(model.ParticipantStatus_Joining)), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }, nil).Once() + + // when + _, err := fx.UpdateMember(ctx, "space-id", "member-6", UpdateMemberRequest{ + Status: "active", + Role: "invalid", + }) + + // then + require.ErrorIs(t, err, ErrInvalidApproveMemberRole) + }) + + t.Run("failure in update operation returns error", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + // First GetMember call returns a member with status "joining" + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: "space-id", + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyIdentity.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("member-7"), + }, + }, + Keys: []string{ + bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + bundle.RelationKeyParticipantStatus.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String("member-7"), + bundle.RelationKeyName.String(): pbtypes.String("Member Approval Fail"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(""), + bundle.RelationKeyIconImage.String(): pbtypes.String(""), + bundle.RelationKeyIdentity.String(): pbtypes.String("member-7"), + bundle.RelationKeyGlobalName.String(): pbtypes.String("fail.any"), + bundle.RelationKeyParticipantPermissions.String(): pbtypes.Int64(int64(model.ParticipantPermissions_Reader)), + bundle.RelationKeyParticipantStatus.String(): pbtypes.Int64(int64(model.ParticipantStatus_Joining)), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }, nil).Once() + + // Expect approval call fails + fx.mwMock.On("SpaceRequestApprove", mock.Anything, &pb.RpcSpaceRequestApproveRequest{ + SpaceId: "space-id", + Identity: "member-7", + Permissions: model.ParticipantPermissions_Reader, + }).Return(&pb.RpcSpaceRequestApproveResponse{ + Error: &pb.RpcSpaceRequestApproveResponseError{Code: pb.RpcSpaceRequestApproveResponseError_UNKNOWN_ERROR}, + }, nil).Once() + + // when + _, err := fx.UpdateMember(ctx, "space-id", "member-7", UpdateMemberRequest{ + Status: "active", + Role: "viewer", + }) + + // then + require.ErrorIs(t, err, ErrFailedUpdateMember) + }) + + t.Run("failed to get member returns error", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: "space-id", + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyIdentity.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("member-8"), + }, + }, + Keys: []string{ + bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + bundle.RelationKeyParticipantStatus.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{}, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }, nil).Once() + + // when + _, err := fx.UpdateMember(ctx, "space-id", "member-8", UpdateMemberRequest{ + Status: "active", + Role: "viewer", + }) + + // then + require.ErrorIs(t, err, ErrMemberNotFound) + }) +} From e3a6096d8ee26d58c579db4fb5cc3007005aeb4c Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 28 Mar 2025 10:38:49 +0100 Subject: [PATCH 102/132] GO-4459: Add description field to space model and update related services --- core/api/docs/docs.go | 2 +- core/api/docs/swagger.json | 2 +- core/api/docs/swagger.yaml | 8 + core/api/internal/search/service_test.go | 25 ++- core/api/internal/space/handler.go | 5 + core/api/internal/space/model.go | 16 +- core/api/internal/space/service.go | 71 +++++--- core/api/internal/space/service_test.go | 209 ++++++++++++++--------- 8 files changed, 223 insertions(+), 115 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 003f06a7f..2489e0057 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -6,7 +6,7 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects associated with a specific list (query or collection) within a space. When a view ID is provided, the objects are filtered and sorted according to the view's configuration. If no view ID is specified, all list objects are returned without filtering and sorting. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. The member_id path parameter can be provided as either the member's ID (starting with ` + "`" + `_participant` + "`" + `) or the member's identity. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index a0d504929..b42a9f279 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,5 +1,5 @@ { - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects associated with a specific list (query or collection) within a space. When a view ID is provided, the objects are filtered and sorted according to the view's configuration. If no view ID is specified, all list objects are returned without filtering and sorting. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. The member_id path parameter can be provided as either the member's ID (starting with `_participant`) or the member's identity. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index f4bbab887..0cf6ef1ff 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -591,6 +591,10 @@ components: - Name space.CreateSpaceRequest: properties: + description: + description: The description of the space + example: The local-first wiki + type: string name: description: The name of the space example: New Space @@ -650,6 +654,10 @@ components: space.Space: description: The space properties: + description: + description: The description of the space + example: The local-first wiki + type: string gateway_url: description: The gateway url to serve files and media example: http://127.0.0.1:31006 diff --git a/core/api/internal/search/service_test.go b/core/api/internal/search/service_test.go index 1277e1fbf..e56f6d508 100644 --- a/core/api/internal/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -93,7 +93,7 @@ func TestSearchService_GlobalSearch(t *testing.T) { EmptyPlacement: model.BlockContentDataviewSort_End, }, }, - Keys: []string{bundle.RelationKeyTargetSpaceId.String(), bundle.RelationKeyName.String(), bundle.RelationKeyIconEmoji.String(), bundle.RelationKeyIconImage.String()}, + Keys: []string{bundle.RelationKeyTargetSpaceId.String()}, }).Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{ { @@ -107,15 +107,32 @@ func TestSearchService_GlobalSearch(t *testing.T) { // Mock workspace opening fx.mwMock.On("WorkspaceOpen", mock.Anything, &pb.RpcWorkspaceOpenRequest{ - SpaceId: mockedSpaceId, - WithChat: true, + SpaceId: mockedSpaceId, }).Return(&pb.RpcWorkspaceOpenResponse{ Info: &model.AccountInfo{ - TechSpaceId: mockedSpaceId, + WorkspaceObjectId: "workspace-object-id", }, Error: &pb.RpcWorkspaceOpenResponseError{Code: pb.RpcWorkspaceOpenResponseError_NULL}, }).Once() + // Mock object show of workspace + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: "workspace-object-id", + }).Return(&pb.RpcObjectShowResponse{ + ObjectView: &model.ObjectView{ + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyName.String(): pbtypes.String("Space Name"), + }, + }, + }, + }, + }, + }, nil).Once() + // Mock objects in space fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ SpaceId: mockedSpaceId, diff --git a/core/api/internal/space/handler.go b/core/api/internal/space/handler.go index ab4107fc6..5cd3f5606 100644 --- a/core/api/internal/space/handler.go +++ b/core/api/internal/space/handler.go @@ -31,6 +31,7 @@ func GetSpacesHandler(s *SpaceService) gin.HandlerFunc { code := util.MapErrorCode(err, util.ErrToCode(ErrFailedListSpaces, http.StatusInternalServerError), util.ErrToCode(ErrFailedOpenWorkspace, http.StatusInternalServerError), + util.ErrToCode(ErrFailedOpenSpace, http.StatusInternalServerError), ) if code != http.StatusOK { @@ -64,6 +65,7 @@ func GetSpaceHandler(s *SpaceService) gin.HandlerFunc { code := util.MapErrorCode(err, util.ErrToCode(ErrWorkspaceNotFound, http.StatusNotFound), util.ErrToCode(ErrFailedOpenWorkspace, http.StatusInternalServerError), + util.ErrToCode(ErrFailedOpenSpace, http.StatusInternalServerError), ) if code != http.StatusOK { @@ -103,6 +105,9 @@ func CreateSpaceHandler(s *SpaceService) gin.HandlerFunc { space, err := s.CreateSpace(c.Request.Context(), req) code := util.MapErrorCode(err, util.ErrToCode(ErrFailedCreateSpace, http.StatusInternalServerError), + util.ErrToCode(ErrFailedSetSpaceInfo, http.StatusInternalServerError), + util.ErrToCode(ErrFailedOpenWorkspace, http.StatusInternalServerError), + util.ErrToCode(ErrFailedOpenSpace, http.StatusInternalServerError), ) if code != http.StatusOK { diff --git a/core/api/internal/space/model.go b/core/api/internal/space/model.go index 146e65ffb..7bdb09494 100644 --- a/core/api/internal/space/model.go +++ b/core/api/internal/space/model.go @@ -9,16 +9,18 @@ type SpaceResponse struct { } type CreateSpaceRequest struct { - Name string `json:"name" example:"New Space"` // The name of the space + Name string `json:"name" example:"New Space"` // The name of the space + Description string `json:"description" example:"The local-first wiki"` // The description of the space } type Space struct { - Object string `json:"object" example:"space"` // The data model of the object - Id string `json:"id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` // The id of the space - Name string `json:"name" example:"My Space"` // The name of the space - Icon util.Icon `json:"icon"` // The icon of the space - GatewayUrl string `json:"gateway_url" example:"http://127.0.0.1:31006"` // The gateway url to serve files and media - NetworkId string `json:"network_id" example:"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU"` // The network id of the space + Object string `json:"object" example:"space"` // The data model of the object + Id string `json:"id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` // The id of the space + Name string `json:"name" example:"My Space"` // The name of the space + Icon util.Icon `json:"icon"` // The icon of the space + Description string `json:"description" example:"The local-first wiki"` // The description of the space + GatewayUrl string `json:"gateway_url" example:"http://127.0.0.1:31006"` // The gateway url to serve files and media + NetworkId string `json:"network_id" example:"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU"` // The network id of the space } type MemberResponse struct { diff --git a/core/api/internal/space/service.go b/core/api/internal/space/service.go index 9362ff577..2c566264a 100644 --- a/core/api/internal/space/service.go +++ b/core/api/internal/space/service.go @@ -22,9 +22,11 @@ import ( var ( ErrFailedListSpaces = errors.New("failed to retrieve list of spaces") ErrFailedOpenWorkspace = errors.New("failed to open workspace") + ErrFailedOpenSpace = errors.New("failed to open space") ErrWorkspaceNotFound = errors.New("workspace not found") ErrFailedGenerateRandomIcon = errors.New("failed to generate random icon") ErrFailedCreateSpace = errors.New("failed to create space") + ErrFailedSetSpaceInfo = errors.New("failed to set space info") ErrFailedListMembers = errors.New("failed to retrieve list of members") ErrFailedGetMember = errors.New("failed to retrieve member") ErrMemberNotFound = errors.New("member not found") @@ -77,7 +79,7 @@ func (s *SpaceService) ListSpaces(ctx context.Context, offset int, limit int) (s EmptyPlacement: model.BlockContentDataviewSort_End, }, }, - Keys: []string{bundle.RelationKeyTargetSpaceId.String(), bundle.RelationKeyName.String(), bundle.RelationKeyIconEmoji.String(), bundle.RelationKeyIconImage.String()}, + Keys: []string{bundle.RelationKeyTargetSpaceId.String()}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -89,10 +91,7 @@ func (s *SpaceService) ListSpaces(ctx context.Context, offset int, limit int) (s spaces = make([]Space, 0, len(paginatedRecords)) for _, record := range paginatedRecords { - name := record.Fields[bundle.RelationKeyName.String()].GetStringValue() - icon := util.GetIcon(s.AccountInfo, record.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), record.Fields[bundle.RelationKeyIconImage.String()].GetStringValue(), "", 0) - - workspace, err := s.getWorkspaceInfo(record.Fields[bundle.RelationKeyTargetSpaceId.String()].GetStringValue(), name, icon) + workspace, err := s.getSpaceInfo(record.Fields[bundle.RelationKeyTargetSpaceId.String()].GetStringValue()) if err != nil { return nil, 0, false, err } @@ -122,7 +121,7 @@ func (s *SpaceService) GetSpace(ctx context.Context, spaceId string) (Space, err Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), }, }, - Keys: []string{bundle.RelationKeyTargetSpaceId.String(), bundle.RelationKeyName.String(), bundle.RelationKeyIconEmoji.String(), bundle.RelationKeyIconImage.String()}, + Keys: []string{bundle.RelationKeyTargetSpaceId.String()}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -133,9 +132,7 @@ func (s *SpaceService) GetSpace(ctx context.Context, spaceId string) (Space, err return Space{}, ErrWorkspaceNotFound } - name := resp.Records[0].Fields[bundle.RelationKeyName.String()].GetStringValue() - icon := util.GetIcon(s.AccountInfo, resp.Records[0].Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), resp.Records[0].Fields[bundle.RelationKeyIconImage.String()].GetStringValue(), "", 0) - return s.getWorkspaceInfo(spaceId, name, icon) + return s.getSpaceInfo(spaceId) } // CreateSpace creates a new space with the given name and returns the space info. @@ -146,7 +143,6 @@ func (s *SpaceService) CreateSpace(ctx context.Context, request CreateSpaceReque return Space{}, ErrFailedGenerateRandomIcon } - // Create new workspace with a random icon and import default use case resp := s.mw.WorkspaceCreate(ctx, &pb.RpcWorkspaceCreateRequest{ Details: &types.Struct{ Fields: map[string]*types.Value{ @@ -159,11 +155,27 @@ func (s *SpaceService) CreateSpace(ctx context.Context, request CreateSpaceReque WithChat: true, }) - if resp.Error.Code != pb.RpcWorkspaceCreateResponseError_NULL { + if resp.Error != nil && resp.Error.Code != pb.RpcWorkspaceCreateResponseError_NULL { return Space{}, ErrFailedCreateSpace } - return s.getWorkspaceInfo(resp.SpaceId, name, util.Icon{}) + description := request.Description + if description != "" { + infoResp := s.mw.WorkspaceSetInfo(ctx, &pb.RpcWorkspaceSetInfoRequest{ + SpaceId: resp.SpaceId, + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyDescription.String(): pbtypes.String(description), + }, + }, + }) + + if infoResp.Error != nil && infoResp.Error.Code != pb.RpcWorkspaceSetInfoResponseError_NULL { + return Space{}, ErrFailedSetSpaceInfo + } + } + + return s.getSpaceInfo(resp.SpaceId) } // ListMembers returns a paginated list of members in the space with the given ID. @@ -364,24 +376,37 @@ func (s *SpaceService) UpdateMember(ctx context.Context, spaceId string, memberI return member, nil } -// getWorkspaceInfo returns the workspace info for the space with the given ID. -func (s *SpaceService) getWorkspaceInfo(spaceId string, name string, icon util.Icon) (space Space, err error) { +// getSpaceInfo returns the workspace info for the space with the given ID. +func (s *SpaceService) getSpaceInfo(spaceId string) (space Space, err error) { workspaceResponse := s.mw.WorkspaceOpen(context.Background(), &pb.RpcWorkspaceOpenRequest{ - SpaceId: spaceId, - WithChat: true, + SpaceId: spaceId, }) - if workspaceResponse.Error.Code != pb.RpcWorkspaceOpenResponseError_NULL { + if workspaceResponse.Error != nil && workspaceResponse.Error.Code != pb.RpcWorkspaceOpenResponseError_NULL { return Space{}, ErrFailedOpenWorkspace } + spaceResp := s.mw.ObjectShow(context.Background(), &pb.RpcObjectShowRequest{ + SpaceId: spaceId, + ObjectId: workspaceResponse.Info.WorkspaceObjectId, + }) + + if spaceResp.Error != nil && spaceResp.Error.Code != pb.RpcObjectShowResponseError_NULL { + return Space{}, ErrFailedOpenSpace + } + + name := spaceResp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue() + icon := util.GetIcon(s.AccountInfo, spaceResp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), spaceResp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconImage.String()].GetStringValue(), "", 0) + description := spaceResp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyDescription.String()].GetStringValue() + return Space{ - Object: "space", - Id: spaceId, - Name: name, - Icon: icon, - GatewayUrl: workspaceResponse.Info.GatewayUrl, - NetworkId: workspaceResponse.Info.NetworkId, + Object: "space", + Id: spaceId, + Name: name, + Icon: icon, + Description: description, + GatewayUrl: workspaceResponse.Info.GatewayUrl, + NetworkId: workspaceResponse.Info.NetworkId, }, nil } diff --git a/core/api/internal/space/service_test.go b/core/api/internal/space/service_test.go index 2d05cc454..31a85b3fb 100644 --- a/core/api/internal/space/service_test.go +++ b/core/api/internal/space/service_test.go @@ -74,23 +74,17 @@ func TestSpaceService_ListSpaces(t *testing.T) { EmptyPlacement: model.BlockContentDataviewSort_End, }, }, - Keys: []string{"targetSpaceId", "name", "iconEmoji", "iconImage"}, + Keys: []string{bundle.RelationKeyTargetSpaceId.String()}, }).Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{ { Fields: map[string]*types.Value{ - bundle.RelationKeyName.String(): pbtypes.String("Another Workspace"), bundle.RelationKeyTargetSpaceId.String(): pbtypes.String("another-space-id"), - bundle.RelationKeyIconEmoji.String(): pbtypes.String(""), - bundle.RelationKeyIconImage.String(): pbtypes.String(iconImage), }, }, { Fields: map[string]*types.Value{ - bundle.RelationKeyName.String(): pbtypes.String("My Workspace"), bundle.RelationKeyTargetSpaceId.String(): pbtypes.String("my-space-id"), - bundle.RelationKeyIconEmoji.String(): pbtypes.String("🚀"), - bundle.RelationKeyIconImage.String(): pbtypes.String(""), }, }, }, @@ -100,23 +94,62 @@ func TestSpaceService_ListSpaces(t *testing.T) { fx.mwMock.On("WorkspaceOpen", mock.Anything, mock.Anything).Return(&pb.RpcWorkspaceOpenResponse{ Error: &pb.RpcWorkspaceOpenResponseError{Code: pb.RpcWorkspaceOpenResponseError_NULL}, Info: &model.AccountInfo{ - HomeObjectId: "home-object-id", - ArchiveObjectId: "archive-object-id", - ProfileObjectId: "profile-object-id", - MarketplaceWorkspaceId: "marketplace-workspace-id", - WorkspaceObjectId: "workspace-object-id", - DeviceId: "device-id", - AccountSpaceId: "account-space-id", - WidgetsId: "widgets-id", - SpaceViewId: "space-view-id", - TechSpaceId: "tech-space-id", - GatewayUrl: "gateway-url", - LocalStoragePath: "local-storage-path", - TimeZone: "time-zone", - AnalyticsId: "analytics-id", - NetworkId: "network-id", + WorkspaceObjectId: "workspace-object-id-1", + GatewayUrl: "gateway-url-1", + NetworkId: "network-id-1", }, - }, nil).Twice() + }, nil).Once() + + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: "another-space-id", + ObjectId: "workspace-object-id-1", + }).Return(&pb.RpcObjectShowResponse{ + ObjectView: &model.ObjectView{ + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyName.String(): pbtypes.String("Another Workspace"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(""), + bundle.RelationKeyIconImage.String(): pbtypes.String(iconImage), + bundle.RelationKeyDescription.String(): pbtypes.String("desc1"), + }, + }, + }, + }, + }, + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + }, nil).Once() + + fx.mwMock.On("WorkspaceOpen", mock.Anything, mock.Anything).Return(&pb.RpcWorkspaceOpenResponse{ + Error: &pb.RpcWorkspaceOpenResponseError{Code: pb.RpcWorkspaceOpenResponseError_NULL}, + Info: &model.AccountInfo{ + WorkspaceObjectId: "workspace-object-id-2", + GatewayUrl: "gateway-url-2", + NetworkId: "network-id-2", + }, + }, nil).Once() + + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: "my-space-id", + ObjectId: "workspace-object-id-2", + }).Return(&pb.RpcObjectShowResponse{ + ObjectView: &model.ObjectView{ + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyName.String(): pbtypes.String("My Workspace"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("🚀"), + bundle.RelationKeyIconImage.String(): pbtypes.String(""), + bundle.RelationKeyDescription.String(): pbtypes.String("desc2"), + }, + }, + }, + }, + }, + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + }, nil).Once() // when spaces, total, hasMore, err := fx.ListSpaces(nil, offset, limit) @@ -124,12 +157,20 @@ func TestSpaceService_ListSpaces(t *testing.T) { // then require.NoError(t, err) require.Len(t, spaces, 2) + require.Equal(t, "Another Workspace", spaces[0].Name) require.Equal(t, "another-space-id", spaces[0].Id) - require.Regexpf(t, regexp.MustCompile(gatewayUrl+`/image/`+iconImage), *spaces[0].Icon.File, "Icon URL does not match") + require.Equal(t, "desc1", spaces[0].Description) + require.Equal(t, "gateway-url-1", spaces[0].GatewayUrl) + require.Equal(t, "network-id-1", spaces[0].NetworkId) + require.Equal(t, "My Workspace", spaces[1].Name) require.Equal(t, "my-space-id", spaces[1].Id) + require.Equal(t, "desc2", spaces[1].Description) require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr("🚀")}, spaces[1].Icon) + require.Equal(t, "gateway-url-2", spaces[1].GatewayUrl) + require.Equal(t, "network-id-2", spaces[1].NetworkId) + require.Equal(t, 2, total) require.False(t, hasMore) }) @@ -163,10 +204,7 @@ func TestSpaceService_ListSpaces(t *testing.T) { Records: []*types.Struct{ { Fields: map[string]*types.Value{ - bundle.RelationKeyName.String(): pbtypes.String("My Workspace"), bundle.RelationKeyTargetSpaceId.String(): pbtypes.String("my-space-id"), - bundle.RelationKeyIconEmoji.String(): pbtypes.String("🚀"), - bundle.RelationKeyIconImage.String(): pbtypes.String(""), }, }, }, @@ -212,18 +250,12 @@ func TestSpaceService_GetSpace(t *testing.T) { }, Keys: []string{ bundle.RelationKeyTargetSpaceId.String(), - bundle.RelationKeyName.String(), - bundle.RelationKeyIconEmoji.String(), - bundle.RelationKeyIconImage.String(), }, }).Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{ { Fields: map[string]*types.Value{ - bundle.RelationKeyName.String(): pbtypes.String("My Workspace"), bundle.RelationKeyTargetSpaceId.String(): pbtypes.String("space-id"), - bundle.RelationKeyIconEmoji.String(): pbtypes.String("🚀"), - bundle.RelationKeyIconImage.String(): pbtypes.String(""), }, }, }, @@ -233,24 +265,34 @@ func TestSpaceService_GetSpace(t *testing.T) { fx.mwMock.On("WorkspaceOpen", mock.Anything, mock.Anything).Return(&pb.RpcWorkspaceOpenResponse{ Error: &pb.RpcWorkspaceOpenResponseError{Code: pb.RpcWorkspaceOpenResponseError_NULL}, Info: &model.AccountInfo{ - HomeObjectId: "home-object-id", - ArchiveObjectId: "archive-object-id", - ProfileObjectId: "profile-object-id", - MarketplaceWorkspaceId: "marketplace-workspace-id", - WorkspaceObjectId: "workspace-object-id", - DeviceId: "device-id", - AccountSpaceId: "account-space-id", - WidgetsId: "widgets-id", - SpaceViewId: "space-view-id", - TechSpaceId: "tech-space-id", - GatewayUrl: "gateway-url", - LocalStoragePath: "local-storage-path", - TimeZone: "time-zone", - AnalyticsId: "analytics-id", - NetworkId: "network-id", + WorkspaceObjectId: "workspace-object-id", + GatewayUrl: "gateway-url", + NetworkId: "network-id", }, }, nil).Once() + // Expect ObjectShow call to return space details. + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: "space-id", + ObjectId: "workspace-object-id", + }).Return(&pb.RpcObjectShowResponse{ + ObjectView: &model.ObjectView{ + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyName.String(): pbtypes.String("My Workspace"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("🚀"), + bundle.RelationKeyIconImage.String(): pbtypes.String(""), + bundle.RelationKeyDescription.String(): pbtypes.String("A description"), + }, + }, + }, + }, + }, + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + }, nil).Once() + // when space, err := fx.GetSpace(nil, "space-id") @@ -283,12 +325,7 @@ func TestSpaceService_GetSpace(t *testing.T) { Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), }, }, - Keys: []string{ - bundle.RelationKeyTargetSpaceId.String(), - bundle.RelationKeyName.String(), - bundle.RelationKeyIconEmoji.String(), - bundle.RelationKeyIconImage.String(), - }, + Keys: []string{bundle.RelationKeyTargetSpaceId.String()}, }).Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{}, Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, @@ -322,20 +359,12 @@ func TestSpaceService_GetSpace(t *testing.T) { Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), }, }, - Keys: []string{ - bundle.RelationKeyTargetSpaceId.String(), - bundle.RelationKeyName.String(), - bundle.RelationKeyIconEmoji.String(), - bundle.RelationKeyIconImage.String(), - }, + Keys: []string{bundle.RelationKeyTargetSpaceId.String()}, }).Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{ { Fields: map[string]*types.Value{ - bundle.RelationKeyName.String(): pbtypes.String("My Workspace"), bundle.RelationKeyTargetSpaceId.String(): pbtypes.String("space-id"), - bundle.RelationKeyIconEmoji.String(): pbtypes.String("🚀"), - bundle.RelationKeyIconImage.String(): pbtypes.String(""), }, }, }, @@ -366,33 +395,55 @@ func TestSpaceService_CreateSpace(t *testing.T) { SpaceId: "new-space-id", }).Once() + fx.mwMock.On("WorkspaceSetInfo", mock.Anything, &pb.RpcWorkspaceSetInfoRequest{ + SpaceId: "new-space-id", + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyDescription.String(): pbtypes.String("A new space"), + }, + }, + }).Return(&pb.RpcWorkspaceSetInfoResponse{ + Error: &pb.RpcWorkspaceSetInfoResponseError{Code: pb.RpcWorkspaceSetInfoResponseError_NULL}, + }, nil).Once() + fx.mwMock.On("WorkspaceOpen", mock.Anything, mock.Anything).Return(&pb.RpcWorkspaceOpenResponse{ Error: &pb.RpcWorkspaceOpenResponseError{Code: pb.RpcWorkspaceOpenResponseError_NULL}, Info: &model.AccountInfo{ - HomeObjectId: "home-object-id", - ArchiveObjectId: "archive-object-id", - ProfileObjectId: "profile-object-id", - MarketplaceWorkspaceId: "marketplace-workspace-id", - WorkspaceObjectId: "workspace-object-id", - DeviceId: "device-id", - AccountSpaceId: "account-space-id", - WidgetsId: "widgets-id", - SpaceViewId: "space-view-id", - TechSpaceId: "tech-space-id", - GatewayUrl: "gateway-url", - LocalStoragePath: "local-storage-path", - TimeZone: "time-zone", - AnalyticsId: "analytics-id", - NetworkId: "network-id", + WorkspaceObjectId: "workspace-object-id", + GatewayUrl: "gateway-url", + NetworkId: "network-id", + }, + }, nil).Once() + + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: "new-space-id", + ObjectId: "workspace-object-id", + }).Return(&pb.RpcObjectShowResponse{ + ObjectView: &model.ObjectView{ + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyName.String(): pbtypes.String("New Space"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("🚀"), + bundle.RelationKeyIconImage.String(): pbtypes.String(""), + bundle.RelationKeyDescription.String(): pbtypes.String("A new space"), + }, + }, + }, + }, }, }, nil).Once() // when - space, err := fx.CreateSpace(nil, CreateSpaceRequest{Name: "New Space"}) + space, err := fx.CreateSpace(nil, CreateSpaceRequest{Name: "New Space", Description: "A new space"}) // then require.NoError(t, err) require.Equal(t, "new-space-id", space.Id) + require.Equal(t, "New Space", space.Name) + require.Equal(t, "A new space", space.Description) + require.Equal(t, util.Icon{Format: "emoji", Emoji: util.StringPtr("🚀")}, space.Icon) }) t.Run("failed workspace creation", func(t *testing.T) { From 4c8ebaa420a442393640f587279626e944f64ea6 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 28 Mar 2025 12:04:39 +0100 Subject: [PATCH 103/132] GO-4459: Make protos --- clientlibrary/service/service.pb.go | 969 ++++++++++++++++++---------- pb/service/service.pb.go | 963 +++++++++++++++++---------- 2 files changed, 1232 insertions(+), 700 deletions(-) diff --git a/clientlibrary/service/service.pb.go b/clientlibrary/service/service.pb.go index 344ce49f7..2f10a678c 100644 --- a/clientlibrary/service/service.pb.go +++ b/clientlibrary/service/service.pb.go @@ -25,356 +25,365 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package func init() { proto.RegisterFile("pb/protos/service/service.proto", fileDescriptor_93a29dc403579097) } var fileDescriptor_93a29dc403579097 = []byte{ - // 5583 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x9d, 0x5b, 0x8f, 0x1c, 0x49, - 0x56, 0xf8, 0xa7, 0x5e, 0xfe, 0xf3, 0x27, 0x97, 0x1d, 0xa0, 0x06, 0x86, 0xd9, 0x61, 0xd7, 0xf6, - 0x78, 0xec, 0x6e, 0xdb, 0xed, 0xae, 0xf6, 0xd8, 0x73, 0x63, 0x17, 0x09, 0xca, 0xdd, 0x76, 0x4f, - 0xef, 0x76, 0xf7, 0x34, 0x5d, 0xd5, 0xb6, 0x18, 0x09, 0x89, 0xec, 0xca, 0xe8, 0xea, 0xa4, 0xb3, - 0x32, 0x72, 0x33, 0xa3, 0xca, 0xae, 0x45, 0x20, 0x10, 0x08, 0x04, 0x02, 0xb1, 0xe2, 0x26, 0x78, - 0x42, 0xe2, 0x13, 0xf0, 0x31, 0x78, 0x41, 0xda, 0x47, 0x1e, 0xd1, 0xcc, 0x87, 0xe0, 0x15, 0x65, - 0x44, 0x64, 0x5c, 0x4e, 0x9e, 0x13, 0x99, 0x3d, 0x3c, 0xd9, 0xea, 0xf3, 0x3b, 0xe7, 0xc4, 0xe5, - 0x44, 0xc4, 0x89, 0xc8, 0xc8, 0xac, 0xe8, 0x66, 0x71, 0xbe, 0x53, 0x94, 0x5c, 0xf0, 0x6a, 0xa7, - 0x62, 0xe5, 0x2a, 0x9d, 0xb1, 0xe6, 0xdf, 0x91, 0xfc, 0xf3, 0xf0, 0xcd, 0x38, 0x5f, 0x8b, 0x75, - 0xc1, 0xde, 0x7b, 0xd7, 0x92, 0x33, 0xbe, 0x58, 0xc4, 0x79, 0x52, 0x29, 0xe4, 0xbd, 0x77, 0xac, - 0x84, 0xad, 0x58, 0x2e, 0xf4, 0xdf, 0x1f, 0xff, 0xe7, 0xff, 0x0c, 0xa2, 0xb7, 0x76, 0xb3, 0x94, - 0xe5, 0x62, 0x57, 0x6b, 0x0c, 0xbf, 0x8c, 0xbe, 0x3d, 0x2e, 0x8a, 0x7d, 0x26, 0x5e, 0xb0, 0xb2, - 0x4a, 0x79, 0x3e, 0xfc, 0x60, 0xa4, 0x1d, 0x8c, 0x4e, 0x8b, 0xd9, 0x68, 0x5c, 0x14, 0x23, 0x2b, - 0x1c, 0x9d, 0xb2, 0x1f, 0x2f, 0x59, 0x25, 0xde, 0xbb, 0x13, 0x86, 0xaa, 0x82, 0xe7, 0x15, 0x1b, - 0x5e, 0x44, 0xbf, 0x34, 0x2e, 0x8a, 0x09, 0x13, 0x7b, 0xac, 0xae, 0xc0, 0x44, 0xc4, 0x82, 0x0d, - 0x37, 0x5b, 0xaa, 0x3e, 0x60, 0x7c, 0xdc, 0xeb, 0x06, 0xb5, 0x9f, 0x69, 0xf4, 0xad, 0xda, 0xcf, - 0xe5, 0x52, 0x24, 0xfc, 0x55, 0x3e, 0x7c, 0xbf, 0xad, 0xa8, 0x45, 0xc6, 0xf6, 0xed, 0x10, 0xa2, - 0xad, 0xbe, 0x8c, 0x7e, 0xfe, 0x65, 0x9c, 0x65, 0x4c, 0xec, 0x96, 0xac, 0x2e, 0xb8, 0xaf, 0xa3, - 0x44, 0x23, 0x25, 0x33, 0x76, 0x3f, 0x08, 0x32, 0xda, 0xf0, 0x97, 0xd1, 0xb7, 0x95, 0xe4, 0x94, - 0xcd, 0xf8, 0x8a, 0x95, 0x43, 0x54, 0x4b, 0x0b, 0x89, 0x26, 0x6f, 0x41, 0xd0, 0xf6, 0x2e, 0xcf, - 0x57, 0xac, 0x14, 0xb8, 0x6d, 0x2d, 0x0c, 0xdb, 0xb6, 0x90, 0xb6, 0xfd, 0x97, 0x83, 0xe8, 0xbb, - 0xe3, 0xd9, 0x8c, 0x2f, 0x73, 0x71, 0xc8, 0x67, 0x71, 0x76, 0x98, 0xe6, 0x57, 0xc7, 0xec, 0xd5, - 0xee, 0x65, 0xcd, 0xe7, 0x73, 0x36, 0x7c, 0xe2, 0xb7, 0xaa, 0x42, 0x47, 0x86, 0x1d, 0xb9, 0xb0, - 0xf1, 0xfd, 0xd1, 0xf5, 0x94, 0x74, 0x59, 0xfe, 0x76, 0x10, 0xdd, 0x80, 0x65, 0x99, 0xf0, 0x6c, - 0xc5, 0x6c, 0x69, 0x3e, 0xee, 0x30, 0xec, 0xe3, 0xa6, 0x3c, 0x9f, 0x5c, 0x57, 0x4d, 0x97, 0x28, - 0x8b, 0xde, 0x76, 0xc3, 0x65, 0xc2, 0x2a, 0x39, 0x9c, 0xee, 0xd3, 0x11, 0xa1, 0x11, 0xe3, 0xf9, - 0x41, 0x1f, 0x54, 0x7b, 0x4b, 0xa3, 0xa1, 0xf6, 0x96, 0xf1, 0xca, 0x38, 0xbb, 0x87, 0x5a, 0x70, - 0x08, 0xe3, 0xeb, 0x7e, 0x0f, 0x52, 0xbb, 0xfa, 0xbd, 0xe8, 0x17, 0x5e, 0xf2, 0xf2, 0xaa, 0x2a, - 0xe2, 0x19, 0xd3, 0x43, 0xe1, 0xae, 0xaf, 0xdd, 0x48, 0xe1, 0x68, 0xd8, 0xe8, 0xc2, 0x9c, 0xa0, - 0x6d, 0x84, 0x5f, 0x14, 0x0c, 0xce, 0x41, 0x56, 0xb1, 0x16, 0x52, 0x41, 0x0b, 0x21, 0x6d, 0xfb, - 0x2a, 0x1a, 0x5a, 0xdb, 0xe7, 0xbf, 0xcf, 0x66, 0x62, 0x9c, 0x24, 0xb0, 0x57, 0xac, 0xae, 0x24, - 0x46, 0xe3, 0x24, 0xa1, 0x7a, 0x05, 0x47, 0xb5, 0xb3, 0x57, 0xd1, 0x3b, 0xc0, 0xd9, 0x61, 0x5a, - 0x49, 0x87, 0xdb, 0x61, 0x2b, 0x1a, 0x33, 0x4e, 0x47, 0x7d, 0x71, 0xed, 0xf8, 0x8f, 0x07, 0xd1, - 0x77, 0x10, 0xcf, 0xa7, 0x6c, 0xc1, 0x57, 0x6c, 0xf8, 0xa8, 0xdb, 0x9a, 0x22, 0x8d, 0xff, 0x0f, - 0xaf, 0xa1, 0x81, 0x84, 0xc9, 0x84, 0x65, 0x6c, 0x26, 0xc8, 0x30, 0x51, 0xe2, 0xce, 0x30, 0x31, - 0x98, 0x33, 0xc2, 0x1a, 0xe1, 0x3e, 0x13, 0xbb, 0xcb, 0xb2, 0x64, 0xb9, 0x20, 0xfb, 0xd2, 0x22, - 0x9d, 0x7d, 0xe9, 0xa1, 0x48, 0x7d, 0xf6, 0x99, 0x18, 0x67, 0x19, 0x59, 0x1f, 0x25, 0xee, 0xac, - 0x8f, 0xc1, 0xb4, 0x87, 0x59, 0xf4, 0x8b, 0x4e, 0x8b, 0x89, 0x83, 0xfc, 0x82, 0x0f, 0xe9, 0xb6, - 0x90, 0x72, 0xe3, 0x63, 0xb3, 0x93, 0x43, 0xaa, 0xf1, 0xec, 0x75, 0xc1, 0x4b, 0xba, 0x5b, 0x94, - 0xb8, 0xb3, 0x1a, 0x06, 0xd3, 0x1e, 0x7e, 0x37, 0x7a, 0x4b, 0xcf, 0x92, 0xcd, 0x7a, 0x76, 0x07, - 0x9d, 0x42, 0xe1, 0x82, 0x76, 0xb7, 0x83, 0x6a, 0x99, 0x3f, 0x4a, 0xe7, 0x65, 0x3d, 0xfb, 0xe0, - 0xe6, 0xb5, 0xb4, 0xc3, 0xbc, 0xa5, 0xb4, 0x79, 0x1e, 0xfd, 0xb2, 0x6f, 0x7e, 0x37, 0xce, 0x67, - 0x2c, 0x1b, 0x3e, 0x08, 0xa9, 0x2b, 0xc6, 0xb8, 0xda, 0xea, 0xc5, 0xda, 0xc9, 0x4e, 0x13, 0x7a, - 0x32, 0xfd, 0x00, 0xd5, 0x06, 0x53, 0xe9, 0x9d, 0x30, 0xd4, 0xb2, 0xbd, 0xc7, 0x32, 0x46, 0xda, - 0x56, 0xc2, 0x0e, 0xdb, 0x06, 0xd2, 0xb6, 0xcb, 0xe8, 0x57, 0x4c, 0x37, 0xd7, 0x79, 0x81, 0x94, - 0xd7, 0x8b, 0xce, 0x16, 0xd1, 0x8f, 0x2e, 0x64, 0x7c, 0x3d, 0xec, 0x07, 0xb7, 0xea, 0xa3, 0x67, - 0x14, 0xbc, 0x3e, 0x60, 0x3e, 0xb9, 0x13, 0x86, 0xb4, 0xed, 0xbf, 0x1a, 0x44, 0xdf, 0xd3, 0xb2, - 0x67, 0x79, 0x7c, 0x9e, 0x31, 0xb9, 0xc4, 0x1f, 0x33, 0xf1, 0x8a, 0x97, 0x57, 0x93, 0x75, 0x3e, - 0x23, 0xd2, 0x19, 0x1c, 0xee, 0x48, 0x67, 0x48, 0x25, 0x5d, 0x98, 0x3f, 0x88, 0xde, 0x6d, 0x82, - 0xe2, 0x32, 0xce, 0xe7, 0xec, 0x87, 0x15, 0xcf, 0xc7, 0x45, 0x3a, 0x4e, 0x92, 0x72, 0x38, 0xc2, - 0xbb, 0x1e, 0x72, 0xa6, 0x04, 0x3b, 0xbd, 0x79, 0x27, 0x7d, 0xd6, 0xad, 0x2c, 0x78, 0x01, 0xd3, - 0xe7, 0xa6, 0xf9, 0x04, 0x2f, 0xa8, 0xf4, 0xd9, 0x47, 0x5a, 0x56, 0x8f, 0xea, 0x35, 0x08, 0xb7, - 0x7a, 0xe4, 0x2e, 0x3a, 0xb7, 0x43, 0x88, 0x5d, 0x03, 0x9a, 0x86, 0xe2, 0xf9, 0x45, 0x3a, 0x3f, - 0x2b, 0x92, 0x7a, 0x0c, 0xdd, 0xc7, 0xeb, 0xec, 0x20, 0xc4, 0x1a, 0x40, 0xa0, 0xda, 0xdb, 0xdf, - 0xd8, 0x2c, 0x53, 0xcf, 0x4b, 0xcf, 0x4b, 0xbe, 0x38, 0x64, 0xf3, 0x78, 0xb6, 0xd6, 0x93, 0xe9, - 0x47, 0xa1, 0x59, 0x0c, 0xd2, 0xa6, 0x10, 0x1f, 0x5f, 0x53, 0x4b, 0x97, 0xe7, 0x5f, 0x07, 0xd1, - 0x1d, 0x2f, 0x4e, 0x74, 0x30, 0xa9, 0xd2, 0x8f, 0xf3, 0xe4, 0x94, 0x55, 0x22, 0x2e, 0xc5, 0xf0, - 0xfb, 0x81, 0x18, 0x20, 0x74, 0x4c, 0xd9, 0x7e, 0xf0, 0x8d, 0x74, 0x6d, 0xaf, 0x4f, 0xea, 0x55, - 0x42, 0xcf, 0x3f, 0x7e, 0xaf, 0x4b, 0x09, 0x9c, 0x7d, 0x6e, 0x87, 0x10, 0xdb, 0xeb, 0x52, 0x70, - 0x90, 0xaf, 0x52, 0xc1, 0xf6, 0x59, 0xce, 0xca, 0x76, 0xaf, 0x2b, 0x55, 0x1f, 0x21, 0x7a, 0x9d, - 0x40, 0xed, 0x4c, 0xe7, 0x79, 0x33, 0x99, 0xc6, 0x56, 0xc0, 0x48, 0x2b, 0xd7, 0x78, 0xd8, 0x0f, - 0xb6, 0x5b, 0x65, 0xc7, 0xe7, 0x29, 0x5b, 0xf1, 0x2b, 0xb8, 0x55, 0x76, 0x4d, 0x28, 0x80, 0xd8, - 0x2a, 0xa3, 0xa0, 0x4d, 0x07, 0x1c, 0x3f, 0x2f, 0x52, 0xf6, 0x0a, 0xa4, 0x03, 0xae, 0x72, 0x2d, - 0x26, 0xd2, 0x01, 0x04, 0xd3, 0x1e, 0x8e, 0xa3, 0x9f, 0x93, 0xc2, 0x1f, 0xf2, 0x34, 0x1f, 0xde, - 0x44, 0x94, 0x6a, 0x81, 0xb1, 0x7a, 0x8b, 0x06, 0x40, 0x89, 0xeb, 0xbf, 0xea, 0xb5, 0xf9, 0x2e, - 0xa1, 0x04, 0x96, 0xe5, 0x8d, 0x2e, 0xcc, 0xe6, 0x61, 0x52, 0x58, 0xcf, 0x5f, 0x93, 0xcb, 0xb8, - 0x4c, 0xf3, 0xf9, 0x10, 0xd3, 0x75, 0xe4, 0x44, 0x1e, 0x86, 0x71, 0x20, 0x84, 0xb5, 0xe2, 0xb8, - 0x28, 0xca, 0x7a, 0x5a, 0xc4, 0x42, 0xd8, 0x47, 0x82, 0x21, 0xdc, 0x42, 0x71, 0x6f, 0x7b, 0x6c, - 0x96, 0xa5, 0x79, 0xd0, 0x9b, 0x46, 0xfa, 0x78, 0xb3, 0x28, 0x08, 0xde, 0x43, 0x16, 0xaf, 0x58, - 0x53, 0x33, 0xac, 0x65, 0x5c, 0x20, 0x18, 0xbc, 0x00, 0xb4, 0x9b, 0x5e, 0x29, 0x3e, 0x8a, 0xaf, - 0x58, 0xdd, 0xc0, 0xac, 0x5e, 0x54, 0x87, 0x98, 0xbe, 0x47, 0x10, 0x9b, 0x5e, 0x9c, 0xd4, 0xae, - 0x96, 0xd1, 0x3b, 0x52, 0x7e, 0x12, 0x97, 0x22, 0x9d, 0xa5, 0x45, 0x9c, 0x37, 0x9b, 0x29, 0x6c, - 0x5c, 0xb7, 0x28, 0xe3, 0x72, 0xbb, 0x27, 0xad, 0xdd, 0xfe, 0xd3, 0x20, 0x7a, 0x1f, 0xfa, 0x3d, - 0x61, 0xe5, 0x22, 0x95, 0x7b, 0xf2, 0x4a, 0x4d, 0xc2, 0xc3, 0x4f, 0xc3, 0x46, 0x5b, 0x0a, 0xa6, - 0x34, 0x9f, 0x5d, 0x5f, 0xd1, 0x66, 0x62, 0x13, 0xbd, 0x4f, 0xf9, 0xa2, 0x4c, 0x5a, 0x67, 0x56, - 0x93, 0x66, 0xf3, 0x21, 0x85, 0x44, 0x26, 0xd6, 0x82, 0xc0, 0x08, 0x3f, 0xcb, 0xab, 0xc6, 0x3a, - 0x36, 0xc2, 0xad, 0x38, 0x38, 0xc2, 0x3d, 0xcc, 0x8e, 0xf0, 0x93, 0xe5, 0x79, 0x96, 0x56, 0x97, - 0x69, 0x3e, 0xd7, 0x69, 0xb7, 0xaf, 0x6b, 0xc5, 0x30, 0xf3, 0xde, 0xec, 0xe4, 0x30, 0x27, 0x3a, - 0x58, 0x48, 0x27, 0x20, 0x4c, 0x36, 0x3b, 0x39, 0xbb, 0x1b, 0xb2, 0xd2, 0x7a, 0x1b, 0x0e, 0x76, - 0x43, 0x8e, 0x6a, 0x2d, 0x25, 0x76, 0x43, 0x6d, 0xca, 0xee, 0x86, 0xdc, 0x3a, 0x54, 0x3c, 0x5b, - 0xb1, 0xb3, 0x32, 0x05, 0xbb, 0x21, 0xaf, 0x7c, 0x0d, 0x43, 0xec, 0x86, 0x28, 0xd6, 0x4e, 0x54, - 0x96, 0xd8, 0x67, 0x62, 0x22, 0x62, 0xb1, 0xac, 0xc0, 0x44, 0xe5, 0xd8, 0x30, 0x08, 0x31, 0x51, - 0x11, 0xa8, 0xf6, 0xf6, 0xdb, 0x51, 0xa4, 0x4e, 0x30, 0xe4, 0x29, 0x93, 0xbf, 0xf6, 0xe8, 0xa3, - 0x0d, 0xef, 0x88, 0xe9, 0xfd, 0x00, 0x61, 0x13, 0x1e, 0xf5, 0x77, 0x79, 0x78, 0x36, 0x44, 0x35, - 0xa4, 0x88, 0x48, 0x78, 0x00, 0x02, 0x0b, 0x3a, 0xb9, 0xe4, 0xaf, 0xf0, 0x82, 0xd6, 0x92, 0x70, - 0x41, 0x35, 0x61, 0x8f, 0xb3, 0x75, 0x41, 0xb1, 0xe3, 0xec, 0xa6, 0x18, 0xa1, 0xe3, 0x6c, 0xc8, - 0xd8, 0x98, 0x71, 0x0d, 0x3f, 0xe5, 0xfc, 0x6a, 0x11, 0x97, 0x57, 0x20, 0x66, 0x3c, 0xe5, 0x86, - 0x21, 0x62, 0x86, 0x62, 0x6d, 0xcc, 0xb8, 0x0e, 0xeb, 0x74, 0xf9, 0xac, 0xcc, 0x40, 0xcc, 0x78, - 0x36, 0x34, 0x42, 0xc4, 0x0c, 0x81, 0xda, 0xd9, 0xc9, 0xf5, 0x36, 0x61, 0xf0, 0x00, 0xc5, 0x53, - 0x9f, 0x30, 0xea, 0x00, 0x05, 0xc1, 0x60, 0x08, 0xed, 0x97, 0x71, 0x71, 0x89, 0x87, 0x90, 0x14, - 0x85, 0x43, 0xa8, 0x41, 0x60, 0x7f, 0x4f, 0x58, 0x5c, 0xce, 0x2e, 0xf1, 0xfe, 0x56, 0xb2, 0x70, - 0x7f, 0x1b, 0x06, 0xf6, 0xb7, 0x12, 0xbc, 0x4c, 0xc5, 0xe5, 0x11, 0x13, 0x31, 0xde, 0xdf, 0x3e, - 0x13, 0xee, 0xef, 0x16, 0x6b, 0xf3, 0x71, 0xd7, 0xe1, 0x64, 0x79, 0x5e, 0xcd, 0xca, 0xf4, 0x9c, - 0x0d, 0x03, 0x56, 0x0c, 0x44, 0xe4, 0xe3, 0x24, 0xac, 0x7d, 0xfe, 0x74, 0x10, 0xdd, 0x6c, 0xba, - 0x9d, 0x57, 0x95, 0x5e, 0xfb, 0x7c, 0xf7, 0x1f, 0xe3, 0xfd, 0x4b, 0xe0, 0xc4, 0x03, 0x86, 0x1e, - 0x6a, 0x4e, 0x6e, 0x80, 0x17, 0xe9, 0x2c, 0xaf, 0x4c, 0xa1, 0x3e, 0xed, 0x63, 0xdd, 0x51, 0x20, - 0x72, 0x83, 0x5e, 0x8a, 0x36, 0x2d, 0xd3, 0xfd, 0xd3, 0xc8, 0x0e, 0x92, 0x0a, 0xa4, 0x65, 0x4d, - 0x7b, 0x3b, 0x04, 0x91, 0x96, 0xe1, 0x24, 0x0c, 0x85, 0xfd, 0x92, 0x2f, 0x8b, 0xaa, 0x23, 0x14, - 0x00, 0x14, 0x0e, 0x85, 0x36, 0xac, 0x7d, 0xbe, 0x8e, 0x7e, 0xd5, 0x0d, 0x3f, 0xb7, 0xb1, 0xb7, - 0xe9, 0x98, 0xc2, 0x9a, 0x78, 0xd4, 0x17, 0xb7, 0x19, 0x45, 0xe3, 0x59, 0xec, 0x31, 0x11, 0xa7, - 0x59, 0x35, 0xdc, 0xc0, 0x6d, 0x34, 0x72, 0x22, 0xa3, 0xc0, 0x38, 0x38, 0xbf, 0xed, 0x2d, 0x8b, - 0x2c, 0x9d, 0xb5, 0x1f, 0xef, 0x68, 0x5d, 0x23, 0x0e, 0xcf, 0x6f, 0x2e, 0x06, 0xe7, 0xeb, 0x3a, - 0xf5, 0x93, 0xff, 0x99, 0xae, 0x0b, 0x86, 0xcf, 0xd7, 0x1e, 0x12, 0x9e, 0xaf, 0x21, 0x0a, 0xeb, - 0x33, 0x61, 0xe2, 0x30, 0x5e, 0xf3, 0x25, 0x31, 0x5f, 0x1b, 0x71, 0xb8, 0x3e, 0x2e, 0x66, 0xf7, - 0x06, 0xc6, 0xc3, 0x41, 0x2e, 0x58, 0x99, 0xc7, 0xd9, 0xf3, 0x2c, 0x9e, 0x57, 0x43, 0x62, 0x8e, - 0xf1, 0x29, 0x62, 0x6f, 0x40, 0xd3, 0x48, 0x33, 0x1e, 0x54, 0xcf, 0xe3, 0x15, 0x2f, 0x53, 0x41, - 0x37, 0xa3, 0x45, 0x3a, 0x9b, 0xd1, 0x43, 0x51, 0x6f, 0xe3, 0x72, 0x76, 0x99, 0xae, 0x58, 0x12, - 0xf0, 0xd6, 0x20, 0x3d, 0xbc, 0x39, 0x28, 0xd2, 0x69, 0x13, 0xbe, 0x2c, 0x67, 0x8c, 0xec, 0x34, - 0x25, 0xee, 0xec, 0x34, 0x83, 0x69, 0x0f, 0x7f, 0x36, 0x88, 0x7e, 0x4d, 0x49, 0xdd, 0x67, 0x2e, - 0x7b, 0x71, 0x75, 0x79, 0xce, 0xe3, 0x32, 0x19, 0x7e, 0x88, 0xd9, 0x41, 0x51, 0xe3, 0xfa, 0xf1, - 0x75, 0x54, 0x60, 0xb3, 0xd6, 0x79, 0xb7, 0x1d, 0x71, 0x68, 0xb3, 0x7a, 0x48, 0xb8, 0x59, 0x21, - 0x0a, 0x27, 0x10, 0x29, 0x57, 0x47, 0x72, 0x1b, 0xa4, 0xbe, 0x7f, 0x2e, 0xb7, 0xd9, 0xc9, 0xc1, - 0xf9, 0xb1, 0x16, 0xfa, 0xd1, 0xb2, 0x4d, 0xd9, 0xc0, 0x23, 0x66, 0xd4, 0x17, 0x27, 0x3d, 0x9b, - 0x51, 0x11, 0xf6, 0xdc, 0x1a, 0x19, 0xa3, 0xbe, 0x38, 0xe1, 0xd9, 0x99, 0xd6, 0x42, 0x9e, 0x91, - 0xa9, 0x6d, 0xd4, 0x17, 0x87, 0xd9, 0x97, 0x66, 0x9a, 0x75, 0xe1, 0x41, 0xc0, 0x0e, 0x5c, 0x1b, - 0xb6, 0x7a, 0xb1, 0xda, 0xe1, 0x5f, 0x0c, 0xa2, 0xef, 0x5a, 0x8f, 0x47, 0x3c, 0x49, 0x2f, 0xd6, - 0x0a, 0x7a, 0x11, 0x67, 0x4b, 0x56, 0x0d, 0x1f, 0x53, 0xd6, 0xda, 0xac, 0x29, 0xc1, 0x93, 0x6b, - 0xe9, 0xc0, 0xb1, 0x33, 0x2e, 0x8a, 0x6c, 0x3d, 0x65, 0x8b, 0x22, 0x23, 0xc7, 0x8e, 0x87, 0x84, - 0xc7, 0x0e, 0x44, 0x61, 0x56, 0x3e, 0xe5, 0x75, 0xce, 0x8f, 0x66, 0xe5, 0x52, 0x14, 0xce, 0xca, - 0x1b, 0x04, 0xe6, 0x4a, 0x53, 0xbe, 0xcb, 0xb3, 0x8c, 0xcd, 0x44, 0xfb, 0xde, 0x86, 0xd1, 0xb4, - 0x44, 0x38, 0x57, 0x02, 0xa4, 0x3d, 0x95, 0x6b, 0xf6, 0x90, 0x71, 0xc9, 0x9e, 0xae, 0x0f, 0xd3, - 0xfc, 0x6a, 0x88, 0xa7, 0x05, 0x16, 0x20, 0x4e, 0xe5, 0x50, 0x10, 0xee, 0x55, 0xcf, 0xf2, 0x84, - 0xe3, 0x7b, 0xd5, 0x5a, 0x12, 0xde, 0xab, 0x6a, 0x02, 0x9a, 0x3c, 0x65, 0x94, 0xc9, 0x5a, 0x12, - 0x36, 0xa9, 0x09, 0x6c, 0x2a, 0xd4, 0xcf, 0x6e, 0xc8, 0xa9, 0x10, 0x3c, 0xad, 0xd9, 0xec, 0xe4, - 0xe0, 0x9e, 0x4b, 0x3b, 0x40, 0x23, 0x02, 0x18, 0xff, 0x20, 0xc8, 0xc0, 0xd0, 0x6f, 0x76, 0xc3, - 0xcf, 0x99, 0x98, 0x5d, 0xe2, 0xa1, 0xef, 0x21, 0xe1, 0xd0, 0x87, 0x28, 0x6c, 0xab, 0x29, 0x37, - 0xbb, 0xf9, 0x0d, 0x3c, 0xf0, 0x5a, 0x3b, 0xf9, 0xcd, 0x4e, 0x0e, 0xb6, 0xd5, 0xc1, 0x82, 0x6e, - 0x2b, 0x25, 0x0b, 0xb7, 0x95, 0x61, 0x60, 0xe9, 0x95, 0x40, 0x1e, 0x92, 0x6d, 0xd0, 0x8a, 0xde, - 0x31, 0xd9, 0x66, 0x27, 0xa7, 0x9d, 0xfc, 0x83, 0xd9, 0x1f, 0x2a, 0xe9, 0x31, 0xaf, 0x07, 0xdf, - 0x8b, 0x38, 0x4b, 0x93, 0x58, 0xb0, 0x29, 0xbf, 0x62, 0x39, 0xbe, 0x15, 0xd3, 0xa5, 0x55, 0xfc, - 0xc8, 0x53, 0x08, 0x6f, 0xc5, 0xc2, 0x8a, 0x30, 0x4e, 0x14, 0x7d, 0x56, 0xb1, 0xdd, 0xb8, 0x22, - 0xa6, 0x48, 0x0f, 0x09, 0xc7, 0x09, 0x44, 0x61, 0x22, 0xac, 0xe4, 0xcf, 0x5e, 0x17, 0xac, 0x4c, - 0x59, 0x3e, 0x63, 0x78, 0x22, 0x0c, 0xa9, 0x70, 0x22, 0x8c, 0xd0, 0x70, 0x13, 0xb8, 0x17, 0x0b, - 0xf6, 0x74, 0x3d, 0x4d, 0x17, 0xac, 0x12, 0xf1, 0xa2, 0xc0, 0x37, 0x81, 0x00, 0x0a, 0x6f, 0x02, - 0xdb, 0x70, 0xeb, 0xcc, 0xc9, 0xcc, 0xb4, 0xed, 0x7b, 0x64, 0x90, 0x08, 0xdc, 0x23, 0x23, 0x50, - 0xd8, 0xb0, 0x16, 0x40, 0x9f, 0x3e, 0xb4, 0xac, 0x04, 0x9f, 0x3e, 0xd0, 0x74, 0xeb, 0x24, 0xcf, - 0x30, 0x93, 0x7a, 0x68, 0x76, 0x14, 0x7d, 0xe2, 0x0e, 0xd1, 0xad, 0x5e, 0x2c, 0x7e, 0x74, 0x78, - 0xca, 0xb2, 0x58, 0xae, 0x87, 0x81, 0xf3, 0xb9, 0x86, 0xe9, 0x73, 0x74, 0xe8, 0xb0, 0xda, 0xe1, - 0x9f, 0x0c, 0xa2, 0xf7, 0x30, 0x8f, 0x5f, 0x14, 0xd2, 0xef, 0xa3, 0x6e, 0x5b, 0x8a, 0x24, 0x2e, - 0xca, 0x85, 0x35, 0xec, 0x5d, 0x8f, 0x46, 0x64, 0xef, 0xd1, 0xe9, 0x02, 0xf8, 0xd9, 0xa0, 0x29, - 0x3f, 0xe4, 0x88, 0xbb, 0x1e, 0x21, 0xde, 0x6e, 0xb4, 0xfc, 0x72, 0x55, 0x60, 0xa3, 0x65, 0x6c, - 0x68, 0x31, 0xb1, 0xd1, 0x42, 0x30, 0x3b, 0x3a, 0xdd, 0xea, 0xbd, 0x4c, 0xc5, 0xa5, 0x4c, 0xe4, - 0xc0, 0xe8, 0xf4, 0xca, 0x6a, 0x20, 0x62, 0x74, 0x92, 0x30, 0x4c, 0x75, 0x1a, 0xb0, 0x1e, 0x9b, - 0xd8, 0x5c, 0x6e, 0x0c, 0xb9, 0x23, 0xf3, 0x5e, 0x37, 0x08, 0xe3, 0xb5, 0x11, 0xeb, 0x3d, 0xd5, - 0x83, 0x90, 0x05, 0xb0, 0xaf, 0xda, 0xea, 0xc5, 0x6a, 0x87, 0x7f, 0x14, 0x7d, 0xa7, 0x55, 0xb1, - 0xe7, 0x2c, 0x16, 0xcb, 0x92, 0x25, 0xc3, 0x9d, 0x8e, 0x72, 0x37, 0xa0, 0x71, 0xfd, 0xa8, 0xbf, - 0x42, 0x2b, 0xf9, 0x6f, 0x38, 0x15, 0x56, 0xa6, 0x0c, 0x8f, 0x43, 0x26, 0x7d, 0x36, 0x98, 0xfc, - 0xd3, 0x3a, 0xad, 0xfd, 0xbb, 0x1b, 0x5d, 0xe3, 0x55, 0x9c, 0x66, 0xf2, 0x29, 0xf0, 0x87, 0x21, - 0xa3, 0x1e, 0x1a, 0xdc, 0xbf, 0x93, 0x2a, 0xad, 0x99, 0x59, 0x8e, 0x71, 0x67, 0xdf, 0xf7, 0x90, - 0x9e, 0x09, 0x90, 0x6d, 0xdf, 0x76, 0x4f, 0x5a, 0xbb, 0x15, 0xcd, 0x92, 0x57, 0xff, 0xd9, 0x0d, - 0x72, 0xcc, 0xab, 0x56, 0x45, 0x22, 0x7d, 0xbb, 0x27, 0xad, 0xbd, 0xfe, 0x61, 0xf4, 0x6e, 0xdb, - 0xab, 0x5e, 0x88, 0x76, 0x3a, 0x4d, 0x81, 0xb5, 0xe8, 0x51, 0x7f, 0x05, 0xed, 0xfe, 0x9f, 0xcd, - 0x81, 0xb7, 0xf2, 0x3f, 0xe3, 0x8b, 0x05, 0xcb, 0x13, 0x96, 0x34, 0x1a, 0x55, 0xbd, 0x31, 0xfb, - 0x8c, 0xb6, 0x6b, 0x14, 0x46, 0xae, 0x86, 0x29, 0xd1, 0xaf, 0x7f, 0x03, 0x4d, 0x5d, 0xb4, 0x7f, - 0x1f, 0x44, 0xf7, 0xd1, 0xa2, 0x35, 0x81, 0xeb, 0x15, 0xf1, 0xb7, 0xfa, 0x38, 0xc2, 0x34, 0x4d, - 0x51, 0xc7, 0xff, 0x07, 0x0b, 0xba, 0xc8, 0xff, 0x32, 0x88, 0x6e, 0x5b, 0xc5, 0x3a, 0xbc, 0x77, - 0x79, 0x7e, 0x91, 0xa5, 0x33, 0x21, 0x1f, 0xf5, 0x6a, 0x15, 0xba, 0x39, 0x29, 0x8d, 0xee, 0xe6, - 0x0c, 0x68, 0xda, 0x5d, 0xf1, 0xe7, 0x69, 0x25, 0x78, 0xb9, 0x9e, 0x5c, 0xf2, 0x57, 0xcd, 0x9b, - 0x48, 0xfe, 0xbc, 0xac, 0x81, 0x91, 0x43, 0x10, 0xbb, 0x62, 0x9c, 0x6c, 0xb9, 0xb2, 0x6f, 0x2c, - 0x55, 0x84, 0x2b, 0x87, 0xe8, 0x70, 0xe5, 0x93, 0x76, 0x55, 0x6a, 0x6a, 0x65, 0x5f, 0xaf, 0xda, - 0xc4, 0x8b, 0xda, 0x7e, 0xc5, 0xea, 0x5e, 0x37, 0x68, 0x73, 0x53, 0x2d, 0xde, 0x4b, 0x2f, 0x2e, - 0x4c, 0x9d, 0xf0, 0x92, 0xba, 0x08, 0x91, 0x9b, 0x12, 0xa8, 0xdd, 0x5e, 0x3d, 0x4f, 0x33, 0x26, - 0x1f, 0x0a, 0x7d, 0x71, 0x71, 0x91, 0xf1, 0x38, 0x01, 0xdb, 0xab, 0x5a, 0x3c, 0x72, 0xe5, 0xc4, - 0xf6, 0x0a, 0xe3, 0xec, 0x75, 0x93, 0x5a, 0x5a, 0x47, 0x77, 0x3e, 0x4b, 0x33, 0x78, 0x91, 0x59, - 0x6a, 0x1a, 0x21, 0x71, 0xdd, 0xa4, 0x05, 0xd9, 0x14, 0xa8, 0x16, 0xd5, 0x51, 0xd9, 0x94, 0xff, - 0x6e, 0x5b, 0xd1, 0x11, 0x13, 0x29, 0x10, 0x82, 0xd9, 0xe3, 0x8b, 0x5a, 0x78, 0x56, 0x48, 0xe3, - 0xb7, 0xda, 0x5a, 0x4a, 0x42, 0x1c, 0x5f, 0xf8, 0x84, 0xdd, 0x2d, 0xd7, 0x7f, 0xdf, 0xe3, 0xaf, - 0x72, 0x69, 0xf4, 0x76, 0x5b, 0xa5, 0x91, 0x11, 0xbb, 0x65, 0xc8, 0x68, 0xc3, 0x3f, 0x8a, 0xfe, - 0xbf, 0x34, 0x5c, 0xf2, 0x62, 0x78, 0x03, 0x51, 0x28, 0x9d, 0x6b, 0xbf, 0x37, 0x49, 0xb9, 0xbd, - 0x9d, 0x62, 0x62, 0xe3, 0xac, 0x8a, 0xe7, 0xf0, 0xae, 0xbe, 0xed, 0x71, 0x29, 0x25, 0x6e, 0xa7, - 0xb4, 0x29, 0x3f, 0x2a, 0x8e, 0x79, 0xa2, 0xad, 0x23, 0x35, 0x34, 0xc2, 0x50, 0x54, 0xb8, 0x90, - 0x4d, 0x5b, 0x8f, 0xe3, 0x55, 0x3a, 0x37, 0xa9, 0x85, 0x9a, 0xc0, 0x2a, 0x90, 0xb6, 0x5a, 0x66, - 0xe4, 0x40, 0x44, 0xda, 0x4a, 0xc2, 0xda, 0xe7, 0xdf, 0x0f, 0xa2, 0x5b, 0x96, 0xd9, 0x6f, 0x0e, - 0x7c, 0x0f, 0xf2, 0x0b, 0x5e, 0x27, 0xb9, 0x87, 0x69, 0x7e, 0x55, 0x0d, 0x3f, 0xa1, 0x4c, 0xe2, - 0xbc, 0x29, 0xca, 0xa7, 0xd7, 0xd6, 0xb3, 0xfb, 0x93, 0xe6, 0x34, 0xd4, 0x5e, 0x89, 0x50, 0x1a, - 0x60, 0x7f, 0x62, 0x0e, 0x4d, 0x21, 0x47, 0xec, 0x4f, 0x42, 0xbc, 0xed, 0x62, 0xe3, 0x3c, 0xe3, - 0x39, 0xec, 0x62, 0x6b, 0xa1, 0x16, 0x12, 0x5d, 0xdc, 0x82, 0xec, 0x7c, 0xdc, 0x88, 0xd4, 0xf9, - 0xda, 0x38, 0xcb, 0xc0, 0x7c, 0x6c, 0x54, 0x0d, 0x40, 0xcc, 0xc7, 0x28, 0xa8, 0xfd, 0x9c, 0x46, - 0xdf, 0xaa, 0x9b, 0xf4, 0xa4, 0x64, 0xab, 0x94, 0xc1, 0xdb, 0x3b, 0x8e, 0x84, 0x18, 0xff, 0x3e, - 0x61, 0x47, 0xd6, 0x59, 0x5e, 0x15, 0x59, 0x5c, 0x5d, 0xea, 0xfb, 0x1c, 0x7e, 0x9d, 0x1b, 0x21, - 0xbc, 0xd1, 0x71, 0xb7, 0x83, 0xb2, 0x93, 0x7a, 0x23, 0x33, 0x53, 0xcc, 0x06, 0xae, 0xda, 0x9a, - 0x66, 0x36, 0x3b, 0x39, 0xfb, 0xd0, 0x64, 0x3f, 0xce, 0x32, 0x56, 0xae, 0x1b, 0xd9, 0x51, 0x9c, - 0xa7, 0x17, 0xac, 0x12, 0xe0, 0xa1, 0x89, 0xa6, 0x46, 0x10, 0x23, 0x1e, 0x9a, 0x04, 0x70, 0xbb, - 0x6f, 0x03, 0x9e, 0x0f, 0xf2, 0x84, 0xbd, 0x06, 0xfb, 0x36, 0x68, 0x47, 0x32, 0xc4, 0xbe, 0x8d, - 0x62, 0xed, 0xc3, 0x83, 0xa7, 0x19, 0x9f, 0x5d, 0xe9, 0x25, 0xc0, 0xef, 0x60, 0x29, 0x81, 0x6b, - 0xc0, 0xed, 0x10, 0x62, 0x17, 0x01, 0x29, 0x38, 0x65, 0x45, 0x16, 0xcf, 0xe0, 0x15, 0x2e, 0xa5, - 0xa3, 0x65, 0xc4, 0x22, 0x00, 0x19, 0x50, 0x5c, 0x7d, 0x35, 0x0c, 0x2b, 0x2e, 0xb8, 0x19, 0x76, - 0x3b, 0x84, 0xd8, 0x65, 0x50, 0x0a, 0x26, 0x45, 0x96, 0x0a, 0x30, 0x0c, 0x94, 0x86, 0x94, 0x10, - 0xc3, 0xc0, 0x27, 0x80, 0xc9, 0x23, 0x56, 0xce, 0x19, 0x6a, 0x52, 0x4a, 0x82, 0x26, 0x1b, 0xc2, - 0xde, 0x57, 0x57, 0x75, 0xe7, 0xc5, 0x1a, 0xdc, 0x57, 0xd7, 0xd5, 0xe2, 0xc5, 0x9a, 0xb8, 0xaf, - 0xee, 0x01, 0xa0, 0x88, 0x27, 0x71, 0x25, 0xf0, 0x22, 0x4a, 0x49, 0xb0, 0x88, 0x0d, 0x61, 0xd7, - 0x68, 0x55, 0xc4, 0xa5, 0x00, 0x6b, 0xb4, 0x2e, 0x80, 0x73, 0x89, 0xe1, 0x26, 0x29, 0xb7, 0x33, - 0x89, 0xea, 0x15, 0x26, 0x9e, 0xa7, 0x2c, 0x4b, 0x2a, 0x30, 0x93, 0xe8, 0x76, 0x6f, 0xa4, 0xc4, - 0x4c, 0xd2, 0xa6, 0x40, 0x28, 0xe9, 0x27, 0x20, 0x58, 0xed, 0xc0, 0x03, 0x90, 0xdb, 0x21, 0xc4, - 0xce, 0x4f, 0x4d, 0xa1, 0x77, 0xe3, 0xb2, 0x4c, 0xeb, 0xc5, 0x7f, 0x03, 0x2f, 0x50, 0x23, 0x27, - 0xe6, 0x27, 0x8c, 0x03, 0xc3, 0xab, 0x99, 0xb8, 0xb1, 0x82, 0xc1, 0xa9, 0xfb, 0x83, 0x20, 0x63, - 0x33, 0x4e, 0x29, 0x71, 0x9e, 0xc2, 0x63, 0xad, 0x89, 0x3c, 0x84, 0xdf, 0xe8, 0xc2, 0x9c, 0x97, - 0xd9, 0x8c, 0x8b, 0x23, 0xbe, 0x62, 0x53, 0xfe, 0xec, 0x75, 0x5a, 0xd5, 0xdb, 0x2d, 0xbd, 0x72, - 0x3f, 0x21, 0x2c, 0x61, 0x30, 0xf1, 0x32, 0x5b, 0xa7, 0x92, 0x4d, 0x20, 0x40, 0x59, 0x8e, 0xd9, - 0x2b, 0x34, 0x81, 0x80, 0x16, 0x0d, 0x47, 0x24, 0x10, 0x21, 0xde, 0x9e, 0x98, 0x19, 0xe7, 0xfa, - 0x0b, 0x06, 0x53, 0xde, 0xe4, 0x72, 0x94, 0x35, 0x08, 0x12, 0x87, 0x16, 0x41, 0x05, 0xbb, 0xbf, - 0x34, 0xfe, 0xed, 0x10, 0xbb, 0x47, 0xd8, 0x69, 0x0f, 0xb3, 0xfb, 0x3d, 0x48, 0xc4, 0x95, 0xbd, - 0x4a, 0x42, 0xb9, 0x6a, 0xdf, 0x24, 0xb9, 0xdf, 0x83, 0x74, 0x4e, 0xdf, 0xdc, 0x6a, 0x3d, 0x8d, - 0x67, 0x57, 0xf3, 0x92, 0x2f, 0xf3, 0x64, 0x97, 0x67, 0xbc, 0x04, 0xa7, 0x6f, 0x5e, 0xa9, 0x01, - 0x4a, 0x9c, 0xbe, 0x75, 0xa8, 0xd8, 0x0c, 0xce, 0x2d, 0xc5, 0x38, 0x4b, 0xe7, 0x70, 0x47, 0xed, - 0x19, 0x92, 0x00, 0x91, 0xc1, 0xa1, 0x20, 0x12, 0x44, 0x6a, 0xc7, 0x2d, 0xd2, 0x59, 0x9c, 0x29, - 0x7f, 0x3b, 0xb4, 0x19, 0x0f, 0xec, 0x0c, 0x22, 0x44, 0x01, 0xa9, 0xe7, 0x74, 0x59, 0xe6, 0x07, - 0xb9, 0xe0, 0x64, 0x3d, 0x1b, 0xa0, 0xb3, 0x9e, 0x0e, 0x08, 0xa6, 0xd5, 0x29, 0x7b, 0x5d, 0x97, - 0xa6, 0xfe, 0x07, 0x9b, 0x56, 0xeb, 0xbf, 0x8f, 0xb4, 0x3c, 0x34, 0xad, 0x02, 0x0e, 0x54, 0x46, - 0x3b, 0x51, 0x01, 0x13, 0xd0, 0xf6, 0xc3, 0xe4, 0x5e, 0x37, 0x88, 0xfb, 0x99, 0x88, 0x75, 0xc6, - 0x42, 0x7e, 0x24, 0xd0, 0xc7, 0x4f, 0x03, 0xda, 0xe3, 0x16, 0xaf, 0x3e, 0x97, 0x6c, 0x76, 0xd5, - 0xba, 0x19, 0xe7, 0x17, 0x54, 0x21, 0xc4, 0x71, 0x0b, 0x81, 0xe2, 0x5d, 0x74, 0x30, 0xe3, 0x79, - 0xa8, 0x8b, 0x6a, 0x79, 0x9f, 0x2e, 0xd2, 0x9c, 0xdd, 0xfc, 0x1a, 0xa9, 0x8e, 0x4c, 0xd5, 0x4d, - 0x5b, 0x84, 0x05, 0x17, 0x22, 0x36, 0xbf, 0x24, 0x6c, 0x73, 0x72, 0xe8, 0xf3, 0xa8, 0xfd, 0xda, - 0x40, 0xcb, 0xca, 0x11, 0xfd, 0xda, 0x00, 0xc5, 0xd2, 0x95, 0x54, 0x31, 0xd2, 0x61, 0xc5, 0x8f, - 0x93, 0x87, 0xfd, 0x60, 0xbb, 0xe5, 0xf1, 0x7c, 0xee, 0x66, 0x2c, 0x2e, 0x95, 0xd7, 0xed, 0x80, - 0x21, 0x8b, 0x11, 0x5b, 0x9e, 0x00, 0x0e, 0xa6, 0x30, 0xcf, 0xf3, 0x2e, 0xcf, 0x05, 0xcb, 0x05, - 0x36, 0x85, 0xf9, 0xc6, 0x34, 0x18, 0x9a, 0xc2, 0x28, 0x05, 0x10, 0xb7, 0xf2, 0x3c, 0x88, 0x89, - 0xe3, 0x78, 0x81, 0x66, 0x6c, 0xea, 0xac, 0x47, 0xc9, 0x43, 0x71, 0x0b, 0x38, 0xe7, 0x71, 0xae, - 0xeb, 0x65, 0x1a, 0x97, 0x73, 0x73, 0xba, 0x91, 0x0c, 0x1f, 0xd1, 0x76, 0x7c, 0x92, 0x78, 0x9c, - 0x1b, 0xd6, 0x00, 0xd3, 0xce, 0xc1, 0x22, 0x9e, 0x9b, 0x9a, 0x22, 0x35, 0x90, 0xf2, 0x56, 0x55, - 0xef, 0x75, 0x83, 0xc0, 0xcf, 0x8b, 0x34, 0x61, 0x3c, 0xe0, 0x47, 0xca, 0xfb, 0xf8, 0x81, 0x20, - 0xc8, 0xde, 0xea, 0x7a, 0xab, 0x1d, 0xdd, 0x38, 0x4f, 0xf4, 0x3e, 0x76, 0x44, 0x34, 0x0f, 0xe0, - 0x42, 0xd9, 0x1b, 0xc1, 0x83, 0x31, 0xda, 0x1c, 0xd0, 0x86, 0xc6, 0xa8, 0x39, 0x7f, 0xed, 0x33, - 0x46, 0x31, 0x58, 0xfb, 0xfc, 0x89, 0x1e, 0xa3, 0x7b, 0xb1, 0x88, 0xeb, 0xbc, 0xfd, 0x45, 0xca, - 0x5e, 0xe9, 0x8d, 0x30, 0x52, 0xdf, 0x86, 0x1a, 0xc9, 0xb7, 0x9e, 0xc1, 0xae, 0x78, 0xa7, 0x37, - 0x1f, 0xf0, 0xad, 0x77, 0x08, 0x9d, 0xbe, 0xc1, 0x56, 0x61, 0xa7, 0x37, 0x1f, 0xf0, 0xad, 0x3f, - 0xa7, 0xd0, 0xe9, 0x1b, 0x7c, 0x53, 0x61, 0xa7, 0x37, 0xaf, 0x7d, 0xff, 0x69, 0x33, 0x70, 0x5d, - 0xe7, 0x75, 0x1e, 0x36, 0x13, 0xe9, 0x8a, 0x61, 0xe9, 0xa4, 0x6f, 0xcf, 0xa0, 0xa1, 0x74, 0x92, - 0x56, 0x71, 0x3e, 0x68, 0x86, 0x95, 0xe2, 0x84, 0x57, 0xa9, 0xbc, 0x8e, 0xf1, 0xa4, 0x87, 0xd1, - 0x06, 0x0e, 0x6d, 0x9a, 0x42, 0x4a, 0xf6, 0xc1, 0xb2, 0x87, 0xda, 0x8b, 0xf0, 0x0f, 0x03, 0xf6, - 0xda, 0xf7, 0xe1, 0xb7, 0x7b, 0xd2, 0xf6, 0x11, 0xaf, 0xc7, 0xb8, 0xcf, 0x96, 0x43, 0xbd, 0x8a, - 0x3e, 0x5e, 0x7e, 0xd4, 0x5f, 0x41, 0xbb, 0xff, 0xf3, 0x66, 0x5f, 0x01, 0xfd, 0xeb, 0x41, 0xf0, - 0xb8, 0x8f, 0x45, 0x30, 0x10, 0x9e, 0x5c, 0x4b, 0x47, 0x17, 0xe4, 0xaf, 0x9b, 0x0d, 0x74, 0x83, - 0xca, 0xd7, 0x81, 0xe4, 0x6b, 0xc4, 0x7a, 0x4c, 0x84, 0xba, 0xd5, 0xc2, 0x70, 0x64, 0x7c, 0x7c, - 0x4d, 0x2d, 0xe7, 0xf3, 0x76, 0x1e, 0xac, 0x5f, 0x5b, 0x75, 0xca, 0x13, 0xb2, 0xec, 0xd0, 0xb0, - 0x40, 0x9f, 0x5c, 0x57, 0x8d, 0x1a, 0x2b, 0x0e, 0x2c, 0x3f, 0xf0, 0xf2, 0xa4, 0xa7, 0x61, 0xef, - 0x93, 0x2f, 0x1f, 0x5d, 0x4f, 0x49, 0x97, 0xe5, 0xdf, 0x06, 0xd1, 0x5d, 0x8f, 0xb5, 0xcf, 0x13, - 0xc0, 0xa9, 0xc7, 0x0f, 0x02, 0xf6, 0x29, 0x25, 0x53, 0xb8, 0xdf, 0xf8, 0x66, 0xca, 0xf6, 0x5b, - 0x70, 0x9e, 0xca, 0xf3, 0x34, 0x13, 0xac, 0x6c, 0x7f, 0x0b, 0xce, 0xb7, 0xab, 0xa8, 0x11, 0xfd, - 0x2d, 0xb8, 0x00, 0xee, 0x7c, 0x0b, 0x0e, 0xf1, 0x8c, 0x7e, 0x0b, 0x0e, 0xb5, 0x16, 0xfc, 0x16, - 0x5c, 0x58, 0x83, 0x9a, 0xde, 0x9b, 0x22, 0xa8, 0x73, 0xeb, 0x5e, 0x16, 0xfd, 0x63, 0xec, 0xc7, - 0xd7, 0x51, 0x21, 0x16, 0x38, 0xc5, 0xc9, 0x1b, 0x8d, 0x3d, 0xda, 0xd4, 0xbb, 0xd5, 0xb8, 0xd3, - 0x9b, 0xd7, 0xbe, 0x7f, 0xac, 0x77, 0x37, 0x66, 0x3a, 0xe7, 0xa5, 0xfc, 0x0e, 0xe0, 0x56, 0x68, - 0x7a, 0xae, 0x2d, 0xb8, 0x3d, 0xff, 0xb0, 0x1f, 0x4c, 0x54, 0xb7, 0x26, 0x74, 0xa7, 0x8f, 0xba, - 0x0c, 0x81, 0x2e, 0xdf, 0xe9, 0xcd, 0x13, 0xcb, 0x88, 0xf2, 0xad, 0x7a, 0xbb, 0x87, 0x31, 0xbf, - 0xaf, 0x1f, 0xf5, 0x57, 0xd0, 0xee, 0x57, 0x3a, 0x6d, 0x74, 0xdd, 0xcb, 0x7e, 0xde, 0xee, 0x32, - 0x35, 0xf1, 0xba, 0x79, 0xd4, 0x17, 0x0f, 0x25, 0x10, 0xee, 0x12, 0xda, 0x95, 0x40, 0xa0, 0xcb, - 0xe8, 0x47, 0xd7, 0x53, 0xd2, 0x65, 0xf9, 0xbb, 0x41, 0x74, 0x93, 0x2c, 0x8b, 0x8e, 0x83, 0x4f, - 0xfa, 0x5a, 0x06, 0xf1, 0xf0, 0xe9, 0xb5, 0xf5, 0x74, 0xa1, 0xfe, 0x71, 0x10, 0xdd, 0x0a, 0x14, - 0x4a, 0x05, 0xc8, 0x35, 0xac, 0xfb, 0x81, 0xf2, 0xd9, 0xf5, 0x15, 0xa9, 0xe5, 0xde, 0xc5, 0x27, - 0xed, 0xef, 0x7a, 0x05, 0x6c, 0x4f, 0xe8, 0xef, 0x7a, 0x75, 0x6b, 0xc1, 0x43, 0x9e, 0xf8, 0xbc, - 0xd9, 0x74, 0xa1, 0x87, 0x3c, 0xf2, 0x2e, 0x62, 0xf0, 0xfb, 0x24, 0x18, 0x87, 0x39, 0x79, 0xf6, - 0xba, 0x88, 0xf3, 0x84, 0x76, 0xa2, 0xe4, 0xdd, 0x4e, 0x0c, 0x07, 0x0f, 0xc7, 0x6a, 0xe9, 0x29, - 0x6f, 0x36, 0x52, 0xf7, 0x29, 0x7d, 0x83, 0x04, 0x0f, 0xc7, 0x5a, 0x28, 0xe1, 0x4d, 0x67, 0x8d, - 0x21, 0x6f, 0x20, 0x59, 0x7c, 0xd0, 0x07, 0x05, 0x29, 0xba, 0xf1, 0x66, 0xce, 0xdc, 0x1f, 0x86, - 0xac, 0xb4, 0xce, 0xdd, 0xb7, 0x7b, 0xd2, 0x84, 0xdb, 0x09, 0x13, 0x9f, 0xb3, 0x38, 0x61, 0x65, - 0xd0, 0xad, 0xa1, 0x7a, 0xb9, 0x75, 0x69, 0xcc, 0xed, 0x2e, 0xcf, 0x96, 0x8b, 0x5c, 0x77, 0x26, - 0xe9, 0xd6, 0xa5, 0xba, 0xdd, 0x02, 0x1a, 0x1e, 0x0b, 0x5a, 0xb7, 0x32, 0xbd, 0x7c, 0x10, 0x36, - 0xe3, 0x65, 0x95, 0x5b, 0xbd, 0x58, 0xba, 0x9e, 0x3a, 0x8c, 0x3a, 0xea, 0x09, 0x22, 0x69, 0xbb, - 0x27, 0x0d, 0xcf, 0xe7, 0x1c, 0xb7, 0x26, 0x9e, 0x76, 0x3a, 0x6c, 0xb5, 0x42, 0xea, 0x51, 0x7f, - 0x05, 0x78, 0x1a, 0xaa, 0xa3, 0xea, 0x30, 0xad, 0xc4, 0xf3, 0x34, 0xcb, 0x86, 0x5b, 0x81, 0x30, - 0x69, 0xa0, 0xe0, 0x69, 0x28, 0x02, 0x13, 0x91, 0xdc, 0x9c, 0x1e, 0xe6, 0xc3, 0x2e, 0x3b, 0x92, - 0xea, 0x15, 0xc9, 0x2e, 0x0d, 0x4e, 0xb4, 0x9c, 0xa6, 0x36, 0xb5, 0x1d, 0x85, 0x1b, 0xae, 0x55, - 0xe1, 0x9d, 0xde, 0x3c, 0x78, 0xdc, 0x2e, 0x29, 0xb9, 0xb2, 0xdc, 0xa1, 0x4c, 0x78, 0x2b, 0xc9, - 0xdd, 0x0e, 0x0a, 0x9c, 0x0a, 0xaa, 0x61, 0xf4, 0x32, 0x4d, 0xe6, 0x4c, 0xa0, 0x4f, 0x8a, 0x5c, - 0x20, 0xf8, 0xa4, 0x08, 0x80, 0xa0, 0xeb, 0xd4, 0xdf, 0xcd, 0x71, 0xe8, 0x41, 0x82, 0x75, 0x9d, - 0x56, 0x76, 0xa8, 0x50, 0xd7, 0xa1, 0x34, 0x98, 0x0d, 0x8c, 0x5b, 0xfd, 0x45, 0x87, 0x07, 0x21, - 0x33, 0xe0, 0xb3, 0x0e, 0x5b, 0xbd, 0x58, 0xb0, 0xa2, 0x58, 0x87, 0xe9, 0x22, 0x15, 0xd8, 0x8a, - 0xe2, 0xd8, 0xa8, 0x91, 0xd0, 0x8a, 0xd2, 0x46, 0xa9, 0xea, 0xd5, 0x39, 0xc2, 0x41, 0x12, 0xae, - 0x9e, 0x62, 0xfa, 0x55, 0xcf, 0xb0, 0xad, 0x07, 0x9b, 0xb9, 0x09, 0x19, 0x71, 0xa9, 0x37, 0xcb, - 0x48, 0x6c, 0xcb, 0x37, 0x7d, 0x21, 0x18, 0x9a, 0x75, 0x28, 0x05, 0x78, 0x60, 0x5f, 0x73, 0xcd, - 0xb3, 0xd7, 0xa2, 0x60, 0x71, 0x19, 0xe7, 0x33, 0x74, 0x73, 0x2a, 0x0d, 0xb6, 0xc8, 0xd0, 0xe6, - 0x94, 0xd4, 0x00, 0x8f, 0xcd, 0xfd, 0x57, 0x69, 0x91, 0xa1, 0x60, 0xde, 0x59, 0xf5, 0xdf, 0xa4, - 0xbd, 0xdf, 0x83, 0x84, 0x8f, 0xcd, 0x1b, 0xc0, 0x1c, 0x7c, 0x2b, 0xa7, 0x1f, 0x06, 0x4c, 0xf9, - 0x68, 0x68, 0x23, 0x4c, 0xab, 0x80, 0xa0, 0x36, 0x09, 0x2e, 0x13, 0x3f, 0x62, 0x6b, 0x2c, 0xa8, - 0x6d, 0x7e, 0x2a, 0x91, 0x50, 0x50, 0xb7, 0x51, 0x90, 0x67, 0xba, 0xfb, 0xa0, 0x8d, 0x80, 0xbe, - 0xbb, 0xf5, 0xd9, 0xec, 0xe4, 0xc0, 0xc8, 0xd9, 0x4b, 0x57, 0xde, 0x73, 0x02, 0xa4, 0xa0, 0x7b, - 0xe9, 0x0a, 0x7f, 0x4c, 0xb0, 0xd5, 0x8b, 0x85, 0x8f, 0xe4, 0x63, 0xc1, 0x5e, 0x37, 0xcf, 0xca, - 0x91, 0xe2, 0x4a, 0x79, 0xeb, 0x61, 0xf9, 0xbd, 0x6e, 0xd0, 0x5e, 0x80, 0x3d, 0x29, 0xf9, 0x8c, - 0x55, 0x95, 0xfe, 0xd8, 0xa9, 0x7f, 0xc3, 0x48, 0xcb, 0x46, 0xe0, 0x53, 0xa7, 0x77, 0xc2, 0x90, - 0xf3, 0x85, 0x42, 0x25, 0xb2, 0x1f, 0x4e, 0xda, 0x40, 0x35, 0xdb, 0xdf, 0x4c, 0xda, 0xec, 0xe4, - 0xec, 0xf0, 0xd2, 0x52, 0xf7, 0x4b, 0x49, 0xf7, 0x50, 0x75, 0xec, 0x23, 0x49, 0xf7, 0x7b, 0x90, - 0xda, 0xd5, 0xe7, 0xd1, 0x9b, 0x87, 0x7c, 0x3e, 0x61, 0x79, 0x32, 0xfc, 0x9e, 0x7f, 0x85, 0x96, - 0xcf, 0x47, 0xf5, 0x9f, 0x8d, 0xd1, 0x1b, 0x94, 0xd8, 0x5e, 0x02, 0xdc, 0x63, 0xe7, 0xcb, 0xf9, - 0x44, 0xc4, 0x02, 0x5c, 0x02, 0x94, 0x7f, 0x1f, 0xd5, 0x02, 0xe2, 0x12, 0xa0, 0x07, 0x00, 0x7b, - 0xd3, 0x92, 0x31, 0xd4, 0x5e, 0x2d, 0x08, 0xda, 0xd3, 0x80, 0xcd, 0x22, 0x8c, 0xbd, 0x3a, 0x51, - 0x87, 0x97, 0xf6, 0xac, 0x8e, 0x94, 0x12, 0x59, 0x44, 0x9b, 0xb2, 0xc1, 0xad, 0xaa, 0x2f, 0x3f, - 0x5c, 0xb3, 0x5c, 0x2c, 0xe2, 0x72, 0x0d, 0x82, 0x5b, 0xd7, 0xd2, 0x01, 0x88, 0xe0, 0x46, 0x41, - 0x3b, 0x6a, 0x9b, 0x66, 0x9e, 0x5d, 0xed, 0xf3, 0x92, 0x2f, 0x45, 0x9a, 0x33, 0xf8, 0xf1, 0x12, - 0xd3, 0xa0, 0x2e, 0x43, 0x8c, 0x5a, 0x8a, 0xb5, 0x59, 0xae, 0x24, 0xd4, 0x7d, 0x42, 0xf9, 0xfd, - 0xf5, 0x4a, 0xf0, 0x12, 0x3e, 0x4f, 0x54, 0x56, 0x20, 0x44, 0x64, 0xb9, 0x24, 0x0c, 0xfa, 0xfe, - 0x24, 0xcd, 0xe7, 0x68, 0xdf, 0x9f, 0xb8, 0x1f, 0x10, 0xbe, 0x45, 0x03, 0x76, 0x40, 0xa9, 0x46, - 0x53, 0x03, 0x40, 0xbf, 0xb5, 0x8b, 0x36, 0xba, 0x4b, 0x10, 0x03, 0x0a, 0x27, 0x81, 0xab, 0x2f, - 0x0a, 0x96, 0xb3, 0xa4, 0xb9, 0x35, 0x87, 0xb9, 0xf2, 0x88, 0xa0, 0x2b, 0x48, 0xda, 0xb9, 0x48, - 0xca, 0x4f, 0x97, 0xf9, 0x49, 0xc9, 0x2f, 0xd2, 0x8c, 0x95, 0x60, 0x2e, 0x52, 0xea, 0x8e, 0x9c, - 0x98, 0x8b, 0x30, 0xce, 0x5e, 0xbf, 0x90, 0x52, 0xef, 0x47, 0x04, 0xa6, 0x65, 0x3c, 0x83, 0xd7, - 0x2f, 0x94, 0x8d, 0x36, 0x46, 0x9c, 0x0c, 0x06, 0x70, 0x27, 0xd1, 0x51, 0xae, 0xf3, 0xb5, 0x8c, - 0x0f, 0xfd, 0xd6, 0xa8, 0xfc, 0xac, 0x6e, 0x05, 0x12, 0x1d, 0x6d, 0x0e, 0x23, 0x89, 0x44, 0x27, - 0xac, 0x61, 0x97, 0x12, 0xc9, 0x1d, 0xeb, 0x6b, 0x45, 0x60, 0x29, 0x51, 0x36, 0x1a, 0x21, 0xb1, - 0x94, 0xb4, 0x20, 0x30, 0x21, 0x35, 0xc3, 0x60, 0x8e, 0x4e, 0x48, 0x46, 0x1a, 0x9c, 0x90, 0x5c, - 0xca, 0x4e, 0x14, 0x07, 0x79, 0x2a, 0xd2, 0x38, 0x9b, 0x30, 0x71, 0x12, 0x97, 0xf1, 0x82, 0x09, - 0x56, 0xc2, 0x89, 0x42, 0x23, 0x23, 0x8f, 0x21, 0x26, 0x0a, 0x8a, 0xd5, 0x0e, 0x7f, 0x33, 0x7a, - 0xbb, 0x5e, 0xf7, 0x59, 0xae, 0x7f, 0xfe, 0xe8, 0x99, 0xfc, 0xdd, 0xb4, 0xe1, 0x3b, 0xc6, 0xc6, - 0x44, 0x94, 0x2c, 0x5e, 0x34, 0xb6, 0xdf, 0x32, 0x7f, 0x97, 0xe0, 0xa3, 0x41, 0x1d, 0xcf, 0xc7, - 0x5c, 0xa4, 0x17, 0xf5, 0x36, 0x5b, 0xbf, 0x41, 0x04, 0xe2, 0xd9, 0x15, 0x8f, 0x02, 0x5f, 0x1d, - 0xc1, 0x38, 0x3b, 0x4f, 0xbb, 0xd2, 0x53, 0x56, 0x64, 0x70, 0x9e, 0xf6, 0xb4, 0x25, 0x40, 0xcc, - 0xd3, 0x28, 0x68, 0x07, 0xa7, 0x2b, 0x9e, 0xb2, 0x70, 0x65, 0xa6, 0xac, 0x5f, 0x65, 0xa6, 0xde, - 0x4b, 0x19, 0x59, 0xf4, 0xf6, 0x11, 0x5b, 0x9c, 0xb3, 0xb2, 0xba, 0x4c, 0x0b, 0xea, 0xd3, 0xbf, - 0x96, 0xe8, 0xfc, 0xf4, 0x2f, 0x81, 0xda, 0x95, 0xc0, 0x02, 0x07, 0xd5, 0x71, 0xbc, 0x60, 0xf2, - 0x1b, 0x2a, 0x60, 0x25, 0x70, 0x8c, 0x38, 0x10, 0xb1, 0x12, 0x90, 0xb0, 0xf3, 0x7e, 0x97, 0x65, - 0x4e, 0xd9, 0xbc, 0x8e, 0xb0, 0xf2, 0x24, 0x5e, 0x2f, 0x58, 0x2e, 0xb4, 0x49, 0x70, 0x26, 0xef, - 0x98, 0xc4, 0x79, 0xe2, 0x4c, 0xbe, 0x8f, 0x9e, 0x33, 0x35, 0x79, 0x0d, 0x7f, 0xc2, 0x4b, 0xa1, - 0x7e, 0xdc, 0xec, 0xac, 0xcc, 0xc0, 0xd4, 0xe4, 0x37, 0xaa, 0x47, 0x12, 0x53, 0x53, 0x58, 0xc3, - 0xf9, 0x21, 0x0b, 0xaf, 0x0c, 0x2f, 0x58, 0x69, 0xe2, 0xe4, 0xd9, 0x22, 0x4e, 0x33, 0x1d, 0x0d, - 0xdf, 0x0f, 0xd8, 0x26, 0x74, 0x88, 0x1f, 0xb2, 0xe8, 0xab, 0xeb, 0xfc, 0xf4, 0x47, 0xb8, 0x84, - 0xe0, 0x11, 0x41, 0x87, 0x7d, 0xe2, 0x11, 0x41, 0xb7, 0x96, 0xdd, 0xb9, 0x5b, 0x56, 0x72, 0x6b, - 0x49, 0xec, 0xf2, 0x04, 0x9e, 0x17, 0x3a, 0x36, 0x01, 0x48, 0xec, 0xdc, 0x83, 0x0a, 0x36, 0x35, - 0xb0, 0xd8, 0xf3, 0x34, 0x8f, 0xb3, 0xf4, 0x27, 0x30, 0xad, 0x77, 0xec, 0x34, 0x04, 0x91, 0x1a, - 0xe0, 0x24, 0xe6, 0x6a, 0x9f, 0x89, 0x69, 0x5a, 0x4f, 0xfd, 0xf7, 0x02, 0xed, 0x26, 0x89, 0x6e, - 0x57, 0x0e, 0xe9, 0x7c, 0xe6, 0x17, 0x36, 0xeb, 0xb8, 0x28, 0x26, 0xf5, 0xaa, 0x7a, 0xca, 0x66, - 0x2c, 0x2d, 0xc4, 0xf0, 0xe3, 0x70, 0x5b, 0x01, 0x9c, 0xb8, 0x68, 0xd1, 0x43, 0xcd, 0x79, 0x7c, - 0x5f, 0xcf, 0x25, 0x13, 0xf5, 0xab, 0x9f, 0x67, 0x15, 0x2b, 0x75, 0xa2, 0xb1, 0xcf, 0x04, 0x18, - 0x9d, 0x0e, 0x37, 0x72, 0xc0, 0xba, 0xa2, 0xc4, 0xe8, 0x0c, 0x6b, 0xd8, 0xc3, 0x3e, 0x87, 0xd3, - 0x9f, 0x6d, 0x97, 0xf7, 0x0d, 0x1f, 0x92, 0xc6, 0x1c, 0x8a, 0x38, 0xec, 0xa3, 0x69, 0x9b, 0xad, - 0xb5, 0xdd, 0x8e, 0xf3, 0xf5, 0x01, 0xbc, 0x32, 0x81, 0x58, 0x92, 0x18, 0x91, 0xad, 0x05, 0x70, - 0xe7, 0x30, 0xbc, 0xe4, 0x71, 0x32, 0x8b, 0x2b, 0x71, 0x12, 0xaf, 0x33, 0x1e, 0x27, 0x72, 0x5d, - 0x87, 0x87, 0xe1, 0x0d, 0x33, 0x72, 0x21, 0xea, 0x30, 0x9c, 0x82, 0xdd, 0xec, 0x4c, 0xfe, 0x98, - 0xa9, 0xbe, 0xcb, 0x09, 0xb3, 0x33, 0x59, 0x5e, 0x78, 0x8f, 0xf3, 0x4e, 0x18, 0xb2, 0xef, 0xa0, - 0x29, 0x91, 0x4c, 0x43, 0x6e, 0x61, 0x3a, 0x5e, 0x02, 0xf2, 0x7e, 0x80, 0xb0, 0x5f, 0x20, 0x51, - 0x7f, 0x6f, 0x7e, 0xbf, 0x4a, 0xe8, 0x8f, 0xa1, 0x3f, 0xc4, 0x74, 0x5d, 0x68, 0xe4, 0x7e, 0xc8, - 0x62, 0xbb, 0x27, 0x6d, 0xd3, 0xcc, 0xdd, 0xcb, 0x58, 0x8c, 0x93, 0xe4, 0x88, 0x55, 0xc8, 0x0b, - 0xe5, 0xb5, 0x70, 0x64, 0xa5, 0x44, 0x9a, 0xd9, 0xa6, 0x6c, 0xa0, 0xd7, 0xb2, 0x67, 0x49, 0x2a, - 0xb4, 0xac, 0xb9, 0x21, 0xfd, 0xb0, 0x6d, 0xa0, 0x4d, 0x11, 0xb5, 0xa2, 0x69, 0x3b, 0x97, 0xd7, - 0xcc, 0x94, 0xcf, 0xe7, 0x19, 0xd3, 0xd0, 0x29, 0x8b, 0xd5, 0xb7, 0x20, 0x77, 0xda, 0xb6, 0x50, - 0x90, 0x98, 0xcb, 0x83, 0x0a, 0x36, 0x8d, 0xac, 0x31, 0xf5, 0x48, 0xaa, 0x69, 0xd8, 0xcd, 0xb6, - 0x19, 0x0f, 0x20, 0xd2, 0x48, 0x14, 0xb4, 0xef, 0xbd, 0xd5, 0xe2, 0x7d, 0xd6, 0xb4, 0x04, 0xfc, - 0xd8, 0x94, 0x54, 0x76, 0xc4, 0xc4, 0x7b, 0x6f, 0x08, 0x66, 0xf7, 0x09, 0xc0, 0xc3, 0xd3, 0xf5, - 0x41, 0x02, 0xf7, 0x09, 0x50, 0x5f, 0x32, 0xc4, 0x3e, 0x81, 0x62, 0xfd, 0xae, 0x33, 0xe7, 0x5e, - 0x87, 0x71, 0x65, 0x2b, 0x87, 0x74, 0x1d, 0x0a, 0x86, 0xba, 0x8e, 0x52, 0xf0, 0x9b, 0xd4, 0x3d, - 0x5a, 0x43, 0x9a, 0x14, 0x3b, 0x57, 0xdb, 0xe8, 0xc2, 0x6c, 0xee, 0x5f, 0x0b, 0x4f, 0x59, 0x9c, - 0x98, 0x8a, 0x21, 0xba, 0xae, 0x9c, 0xc8, 0xfd, 0x31, 0x4e, 0x3b, 0xf9, 0x9d, 0x68, 0xa8, 0xaa, - 0x51, 0xba, 0x6e, 0x6e, 0x61, 0x45, 0xac, 0x09, 0x62, 0xa2, 0xf2, 0x09, 0x27, 0x71, 0xf3, 0xba, - 0x68, 0xca, 0xb5, 0x03, 0xfd, 0x5e, 0x66, 0x05, 0x12, 0x37, 0xbf, 0xd9, 0x5b, 0x34, 0x91, 0xb8, - 0x75, 0x6b, 0xd9, 0x79, 0xde, 0xec, 0xcf, 0xe5, 0x15, 0x30, 0xfc, 0x47, 0x35, 0x94, 0x90, 0x98, - 0xe7, 0x5b, 0x90, 0xb2, 0xfd, 0xf4, 0xfd, 0xff, 0xf8, 0xea, 0xc6, 0xe0, 0x67, 0x5f, 0xdd, 0x18, - 0xfc, 0xf7, 0x57, 0x37, 0x06, 0x3f, 0xfd, 0xfa, 0xc6, 0x1b, 0x3f, 0xfb, 0xfa, 0xc6, 0x1b, 0xff, - 0xf5, 0xf5, 0x8d, 0x37, 0xbe, 0x7c, 0x53, 0xff, 0x68, 0xf8, 0xf9, 0xff, 0x93, 0x3f, 0xfd, 0xfd, - 0xe4, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x14, 0xc2, 0x04, 0x4c, 0x58, 0x7c, 0x00, 0x00, + // 5713 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x9d, 0xdd, 0x6f, 0x24, 0x49, + 0x52, 0xc0, 0xd7, 0x2f, 0x2c, 0xd4, 0x71, 0x0b, 0xf4, 0xc2, 0xb2, 0xb7, 0xdc, 0xcd, 0xcc, 0xce, + 0x87, 0x3d, 0x33, 0x1e, 0xb7, 0x67, 0x67, 0xf6, 0x8b, 0x3b, 0x24, 0xe8, 0xb1, 0xc7, 0xde, 0xbe, + 0xb5, 0xbd, 0xc6, 0xdd, 0x9e, 0x11, 0x2b, 0x21, 0x51, 0xee, 0x4a, 0xb7, 0x0b, 0x57, 0x57, 0xd6, + 0x55, 0x65, 0x7b, 0xa6, 0x0f, 0x81, 0x40, 0x20, 0x10, 0x08, 0xc4, 0x89, 0x2f, 0xc1, 0x13, 0x12, + 0x7f, 0x01, 0x7f, 0x06, 0x8f, 0xf7, 0x78, 0x8f, 0x68, 0xf7, 0xef, 0x40, 0x42, 0x95, 0x95, 0x9f, + 0x51, 0x11, 0x59, 0xe5, 0xbd, 0xa7, 0x19, 0x39, 0x7e, 0x11, 0x91, 0x1f, 0x91, 0x99, 0x91, 0x59, + 0x59, 0xd5, 0xd1, 0xcd, 0xe2, 0x6c, 0xbb, 0x28, 0xb9, 0xe0, 0xd5, 0x76, 0xc5, 0xca, 0xab, 0x74, + 0xc6, 0xf4, 0xbf, 0x43, 0xf9, 0xe7, 0xc1, 0x9b, 0x71, 0xbe, 0x12, 0xab, 0x82, 0xbd, 0xf7, 0xae, + 0x25, 0x67, 0x7c, 0xb1, 0x88, 0xf3, 0xa4, 0x6a, 0x90, 0xf7, 0xde, 0xb1, 0x12, 0x76, 0xc5, 0x72, + 0xa1, 0xfe, 0xfe, 0xe4, 0x67, 0xff, 0xb7, 0x16, 0xbd, 0xb5, 0x93, 0xa5, 0x2c, 0x17, 0x3b, 0x4a, + 0x63, 0xf0, 0x65, 0xf4, 0xed, 0x51, 0x51, 0xec, 0x33, 0xf1, 0x82, 0x95, 0x55, 0xca, 0xf3, 0xc1, + 0x9d, 0xa1, 0x72, 0x30, 0x3c, 0x29, 0x66, 0xc3, 0x51, 0x51, 0x0c, 0xad, 0x70, 0x78, 0xc2, 0x7e, + 0xb4, 0x64, 0x95, 0x78, 0xef, 0x6e, 0x18, 0xaa, 0x0a, 0x9e, 0x57, 0x6c, 0x70, 0x1e, 0xfd, 0xda, + 0xa8, 0x28, 0x26, 0x4c, 0xec, 0xb2, 0xba, 0x02, 0x13, 0x11, 0x0b, 0x36, 0xd8, 0x68, 0xa9, 0xfa, + 0x80, 0xf1, 0x71, 0xbf, 0x1b, 0x54, 0x7e, 0xa6, 0xd1, 0xb7, 0x6a, 0x3f, 0x17, 0x4b, 0x91, 0xf0, + 0x57, 0xf9, 0xe0, 0xfd, 0xb6, 0xa2, 0x12, 0x19, 0xdb, 0xb7, 0x43, 0x88, 0xb2, 0xfa, 0x32, 0xfa, + 0xe5, 0x97, 0x71, 0x96, 0x31, 0xb1, 0x53, 0xb2, 0xba, 0xe0, 0xbe, 0x4e, 0x23, 0x1a, 0x36, 0x32, + 0x63, 0xf7, 0x4e, 0x90, 0x51, 0x86, 0xbf, 0x8c, 0xbe, 0xdd, 0x48, 0x4e, 0xd8, 0x8c, 0x5f, 0xb1, + 0x72, 0x80, 0x6a, 0x29, 0x21, 0xd1, 0xe4, 0x2d, 0x08, 0xda, 0xde, 0xe1, 0xf9, 0x15, 0x2b, 0x05, + 0x6e, 0x5b, 0x09, 0xc3, 0xb6, 0x2d, 0xa4, 0x6c, 0xff, 0xed, 0x5a, 0xf4, 0xdd, 0xd1, 0x6c, 0xc6, + 0x97, 0xb9, 0x38, 0xe0, 0xb3, 0x38, 0x3b, 0x48, 0xf3, 0xcb, 0x23, 0xf6, 0x6a, 0xe7, 0xa2, 0xe6, + 0xf3, 0x39, 0x1b, 0x3c, 0xf5, 0x5b, 0xb5, 0x41, 0x87, 0x86, 0x1d, 0xba, 0xb0, 0xf1, 0xfd, 0xe1, + 0xf5, 0x94, 0x54, 0x59, 0xfe, 0x71, 0x2d, 0xba, 0x01, 0xcb, 0x32, 0xe1, 0xd9, 0x15, 0xb3, 0xa5, + 0xf9, 0xa8, 0xc3, 0xb0, 0x8f, 0x9b, 0xf2, 0x7c, 0x7c, 0x5d, 0x35, 0x55, 0xa2, 0x2c, 0x7a, 0xdb, + 0x0d, 0x97, 0x09, 0xab, 0xe4, 0x70, 0x7a, 0x40, 0x47, 0x84, 0x42, 0x8c, 0xe7, 0x87, 0x7d, 0x50, + 0xe5, 0x2d, 0x8d, 0x06, 0xca, 0x5b, 0xc6, 0x2b, 0xe3, 0xec, 0x3e, 0x6a, 0xc1, 0x21, 0x8c, 0xaf, + 0x07, 0x3d, 0x48, 0xe5, 0xea, 0x8f, 0xa2, 0x5f, 0x79, 0xc9, 0xcb, 0xcb, 0xaa, 0x88, 0x67, 0x4c, + 0x0d, 0x85, 0x7b, 0xbe, 0xb6, 0x96, 0xc2, 0xd1, 0xb0, 0xde, 0x85, 0x39, 0x41, 0xab, 0x85, 0x5f, + 0x14, 0x0c, 0xce, 0x41, 0x56, 0xb1, 0x16, 0x52, 0x41, 0x0b, 0x21, 0x65, 0xfb, 0x32, 0x1a, 0x58, + 0xdb, 0x67, 0x7f, 0xcc, 0x66, 0x62, 0x94, 0x24, 0xb0, 0x57, 0xac, 0xae, 0x24, 0x86, 0xa3, 0x24, + 0xa1, 0x7a, 0x05, 0x47, 0x95, 0xb3, 0x57, 0xd1, 0x3b, 0xc0, 0xd9, 0x41, 0x5a, 0x49, 0x87, 0x5b, + 0x61, 0x2b, 0x0a, 0x33, 0x4e, 0x87, 0x7d, 0x71, 0xe5, 0xf8, 0xcf, 0xd7, 0xa2, 0xef, 0x20, 0x9e, + 0x4f, 0xd8, 0x82, 0x5f, 0xb1, 0xc1, 0xe3, 0x6e, 0x6b, 0x0d, 0x69, 0xfc, 0x7f, 0x70, 0x0d, 0x0d, + 0x24, 0x4c, 0x26, 0x2c, 0x63, 0x33, 0x41, 0x86, 0x49, 0x23, 0xee, 0x0c, 0x13, 0x83, 0x39, 0x23, + 0x4c, 0x0b, 0xf7, 0x99, 0xd8, 0x59, 0x96, 0x25, 0xcb, 0x05, 0xd9, 0x97, 0x16, 0xe9, 0xec, 0x4b, + 0x0f, 0x45, 0xea, 0xb3, 0xcf, 0xc4, 0x28, 0xcb, 0xc8, 0xfa, 0x34, 0xe2, 0xce, 0xfa, 0x18, 0x4c, + 0x79, 0x98, 0x45, 0xbf, 0xea, 0xb4, 0x98, 0x18, 0xe7, 0xe7, 0x7c, 0x40, 0xb7, 0x85, 0x94, 0x1b, + 0x1f, 0x1b, 0x9d, 0x1c, 0x52, 0x8d, 0xe7, 0xaf, 0x0b, 0x5e, 0xd2, 0xdd, 0xd2, 0x88, 0x3b, 0xab, + 0x61, 0x30, 0xe5, 0xe1, 0x0f, 0xa3, 0xb7, 0xd4, 0x2c, 0xa9, 0xd7, 0xb3, 0xbb, 0xe8, 0x14, 0x0a, + 0x17, 0xb4, 0x7b, 0x1d, 0x54, 0xcb, 0xfc, 0x61, 0x3a, 0x2f, 0xeb, 0xd9, 0x07, 0x37, 0xaf, 0xa4, + 0x1d, 0xe6, 0x2d, 0xa5, 0xcc, 0xf3, 0xe8, 0xd7, 0x7d, 0xf3, 0x3b, 0x71, 0x3e, 0x63, 0xd9, 0xe0, + 0x61, 0x48, 0xbd, 0x61, 0x8c, 0xab, 0xcd, 0x5e, 0xac, 0x9d, 0xec, 0x14, 0xa1, 0x26, 0xd3, 0x3b, + 0xa8, 0x36, 0x98, 0x4a, 0xef, 0x86, 0xa1, 0x96, 0xed, 0x5d, 0x96, 0x31, 0xd2, 0x76, 0x23, 0xec, + 0xb0, 0x6d, 0x20, 0x65, 0xbb, 0x8c, 0x7e, 0xc3, 0x74, 0x73, 0x9d, 0x17, 0x48, 0x79, 0xbd, 0xe8, + 0x6c, 0x12, 0xfd, 0xe8, 0x42, 0xc6, 0xd7, 0xa3, 0x7e, 0x70, 0xab, 0x3e, 0x6a, 0x46, 0xc1, 0xeb, + 0x03, 0xe6, 0x93, 0xbb, 0x61, 0x48, 0xd9, 0xfe, 0xbb, 0xb5, 0xe8, 0x7b, 0x4a, 0xf6, 0x3c, 0x8f, + 0xcf, 0x32, 0x26, 0x97, 0xf8, 0x23, 0x26, 0x5e, 0xf1, 0xf2, 0x72, 0xb2, 0xca, 0x67, 0x44, 0x3a, + 0x83, 0xc3, 0x1d, 0xe9, 0x0c, 0xa9, 0xa4, 0x0a, 0xf3, 0x27, 0xd1, 0xbb, 0x3a, 0x28, 0x2e, 0xe2, + 0x7c, 0xce, 0x7e, 0x58, 0xf1, 0x7c, 0x54, 0xa4, 0xa3, 0x24, 0x29, 0x07, 0x43, 0xbc, 0xeb, 0x21, + 0x67, 0x4a, 0xb0, 0xdd, 0x9b, 0x77, 0xd2, 0x67, 0xd5, 0xca, 0x82, 0x17, 0x30, 0x7d, 0xd6, 0xcd, + 0x27, 0x78, 0x41, 0xa5, 0xcf, 0x3e, 0xd2, 0xb2, 0x7a, 0x58, 0xaf, 0x41, 0xb8, 0xd5, 0x43, 0x77, + 0xd1, 0xb9, 0x1d, 0x42, 0xec, 0x1a, 0xa0, 0x1b, 0x8a, 0xe7, 0xe7, 0xe9, 0xfc, 0xb4, 0x48, 0xea, + 0x31, 0xf4, 0x00, 0xaf, 0xb3, 0x83, 0x10, 0x6b, 0x00, 0x81, 0x2a, 0x6f, 0xff, 0x60, 0xb3, 0x4c, + 0x35, 0x2f, 0xed, 0x95, 0x7c, 0x71, 0xc0, 0xe6, 0xf1, 0x6c, 0xa5, 0x26, 0xd3, 0x0f, 0x43, 0xb3, + 0x18, 0xa4, 0x4d, 0x21, 0x3e, 0xba, 0xa6, 0x96, 0x2a, 0xcf, 0x7f, 0xae, 0x45, 0x77, 0xbd, 0x38, + 0x51, 0xc1, 0xd4, 0x94, 0x7e, 0x94, 0x27, 0x27, 0xac, 0x12, 0x71, 0x29, 0x06, 0xdf, 0x0f, 0xc4, + 0x00, 0xa1, 0x63, 0xca, 0xf6, 0x83, 0x6f, 0xa4, 0x6b, 0x7b, 0x7d, 0x52, 0xaf, 0x12, 0x6a, 0xfe, + 0xf1, 0x7b, 0x5d, 0x4a, 0xe0, 0xec, 0x73, 0x3b, 0x84, 0xd8, 0x5e, 0x97, 0x82, 0x71, 0x7e, 0x95, + 0x0a, 0xb6, 0xcf, 0x72, 0x56, 0xb6, 0x7b, 0xbd, 0x51, 0xf5, 0x11, 0xa2, 0xd7, 0x09, 0xd4, 0xce, + 0x74, 0x9e, 0x37, 0x93, 0x69, 0x6c, 0x06, 0x8c, 0xb4, 0x72, 0x8d, 0x47, 0xfd, 0x60, 0xa2, 0x86, + 0x62, 0xbf, 0x36, 0x12, 0xac, 0x61, 0x83, 0xf4, 0xaa, 0xa1, 0x41, 0xed, 0xc6, 0xdc, 0xf1, 0x76, + 0xc2, 0xae, 0xf8, 0x25, 0xdc, 0x98, 0xbb, 0x06, 0x1a, 0x80, 0xd8, 0x98, 0xa3, 0xa0, 0x4d, 0x3e, + 0x1c, 0x3f, 0x2f, 0x52, 0xf6, 0x0a, 0x24, 0x1f, 0xae, 0x72, 0x2d, 0x26, 0x92, 0x0f, 0x04, 0x53, + 0x1e, 0x8e, 0xa2, 0x5f, 0x92, 0xc2, 0x1f, 0xf2, 0x34, 0x1f, 0xdc, 0x44, 0x94, 0x6a, 0x81, 0xb1, + 0x7a, 0x8b, 0x06, 0x40, 0x89, 0xeb, 0xbf, 0xaa, 0x4c, 0xe0, 0x1e, 0xa1, 0x04, 0x92, 0x80, 0xf5, + 0x2e, 0xcc, 0x66, 0x7d, 0x52, 0x58, 0xcf, 0x96, 0x93, 0x8b, 0xb8, 0x4c, 0xf3, 0xf9, 0x00, 0xd3, + 0x75, 0xe4, 0x44, 0xd6, 0x87, 0x71, 0x20, 0x9c, 0x94, 0xe2, 0xa8, 0x28, 0xca, 0x7a, 0x12, 0xc6, + 0xc2, 0xc9, 0x47, 0x82, 0xe1, 0xd4, 0x42, 0x71, 0x6f, 0xbb, 0x6c, 0x96, 0xa5, 0x79, 0xd0, 0x9b, + 0x42, 0xfa, 0x78, 0xb3, 0x28, 0x08, 0xde, 0x03, 0x16, 0x5f, 0x31, 0x5d, 0x33, 0xac, 0x65, 0x5c, + 0x20, 0x18, 0xbc, 0x00, 0xb4, 0x5b, 0x6c, 0x29, 0x3e, 0x8c, 0x2f, 0x59, 0xdd, 0xc0, 0xac, 0x5e, + 0xc2, 0x07, 0x98, 0xbe, 0x47, 0x10, 0x5b, 0x6c, 0x9c, 0x54, 0xae, 0x96, 0xd1, 0x3b, 0x52, 0x7e, + 0x1c, 0x97, 0x22, 0x9d, 0xa5, 0x45, 0x9c, 0xeb, 0xad, 0x1b, 0x36, 0x8b, 0xb4, 0x28, 0xe3, 0x72, + 0xab, 0x27, 0xad, 0xdc, 0xfe, 0xdb, 0x5a, 0xf4, 0x3e, 0xf4, 0x7b, 0xcc, 0xca, 0x45, 0x2a, 0x4f, + 0x00, 0xaa, 0x66, 0xca, 0x1f, 0x7c, 0x12, 0x36, 0xda, 0x52, 0x30, 0xa5, 0xf9, 0xf4, 0xfa, 0x8a, + 0x36, 0xef, 0x9b, 0xa8, 0x5d, 0xd1, 0x17, 0x65, 0xd2, 0x3a, 0x21, 0x9b, 0xe8, 0xad, 0x8e, 0x14, + 0x12, 0x79, 0x5f, 0x0b, 0x02, 0x23, 0xfc, 0x34, 0xaf, 0xb4, 0x75, 0x6c, 0x84, 0x5b, 0x71, 0x70, + 0x84, 0x7b, 0x98, 0x1d, 0xe1, 0xc7, 0xcb, 0xb3, 0x2c, 0xad, 0x2e, 0xd2, 0x7c, 0xae, 0x92, 0x7c, + 0x5f, 0xd7, 0x8a, 0x61, 0x9e, 0xbf, 0xd1, 0xc9, 0x61, 0x4e, 0x54, 0xb0, 0x90, 0x4e, 0x40, 0x98, + 0x6c, 0x74, 0x72, 0x76, 0xef, 0x65, 0xa5, 0xf5, 0xa6, 0x1f, 0xec, 0xbd, 0x1c, 0xd5, 0x5a, 0x4a, + 0xec, 0xbd, 0xda, 0x94, 0xdd, 0x7b, 0xb9, 0x75, 0xa8, 0x78, 0x76, 0xc5, 0x4e, 0xcb, 0x14, 0xec, + 0xbd, 0xbc, 0xf2, 0x69, 0x86, 0xd8, 0x7b, 0x51, 0xac, 0x9d, 0xa8, 0x2c, 0xb1, 0xcf, 0xc4, 0x44, + 0xc4, 0x62, 0x59, 0x81, 0x89, 0xca, 0xb1, 0x61, 0x10, 0x62, 0xa2, 0x22, 0x50, 0xe5, 0xed, 0xf7, + 0xa3, 0xa8, 0x39, 0x2f, 0x91, 0x67, 0x5a, 0xfe, 0xda, 0xa3, 0x0e, 0x52, 0xbc, 0x03, 0xad, 0xf7, + 0x03, 0x84, 0x4d, 0xaf, 0x9a, 0xbf, 0xcb, 0xa3, 0xba, 0x01, 0xaa, 0x21, 0x45, 0x44, 0x7a, 0x05, + 0x10, 0x58, 0xd0, 0xc9, 0x05, 0x7f, 0x85, 0x17, 0xb4, 0x96, 0x84, 0x0b, 0xaa, 0x08, 0x7b, 0x78, + 0xae, 0x0a, 0x8a, 0x1d, 0x9e, 0xeb, 0x62, 0x84, 0x0e, 0xcf, 0x21, 0x63, 0x63, 0xc6, 0x35, 0xfc, + 0x8c, 0xf3, 0xcb, 0x45, 0x5c, 0x5e, 0x82, 0x98, 0xf1, 0x94, 0x35, 0x43, 0xc4, 0x0c, 0xc5, 0xda, + 0x98, 0x71, 0x1d, 0xd6, 0xc9, 0xf9, 0x69, 0x99, 0x81, 0x98, 0xf1, 0x6c, 0x28, 0x84, 0x88, 0x19, + 0x02, 0xb5, 0xb3, 0x93, 0xeb, 0x6d, 0xc2, 0xe0, 0x71, 0x8d, 0xa7, 0x3e, 0x61, 0xd4, 0x71, 0x0d, + 0x82, 0xc1, 0x10, 0xda, 0x2f, 0xe3, 0xe2, 0x02, 0x0f, 0x21, 0x29, 0x0a, 0x87, 0x90, 0x46, 0x60, + 0x7f, 0x4f, 0x58, 0x5c, 0xce, 0x2e, 0xf0, 0xfe, 0x6e, 0x64, 0xe1, 0xfe, 0x36, 0x0c, 0xec, 0xef, + 0x46, 0xf0, 0x32, 0x15, 0x17, 0x87, 0x4c, 0xc4, 0x78, 0x7f, 0xfb, 0x4c, 0xb8, 0xbf, 0x5b, 0xac, + 0xcd, 0xfe, 0x5d, 0x87, 0x93, 0xe5, 0x59, 0x35, 0x2b, 0xd3, 0x33, 0x36, 0x08, 0x58, 0x31, 0x10, + 0x91, 0xfd, 0x93, 0xb0, 0xf2, 0xf9, 0x93, 0xb5, 0xe8, 0xa6, 0xee, 0x76, 0x5e, 0x55, 0x6a, 0xed, + 0xf3, 0xdd, 0x7f, 0x84, 0xf7, 0x2f, 0x81, 0x13, 0x8f, 0x33, 0x7a, 0xa8, 0x39, 0xb9, 0x01, 0x5e, + 0xa4, 0xd3, 0xbc, 0x32, 0x85, 0xfa, 0xa4, 0x8f, 0x75, 0x47, 0x81, 0xc8, 0x0d, 0x7a, 0x29, 0xda, + 0xb4, 0x4c, 0xf5, 0x8f, 0x96, 0x8d, 0x93, 0x0a, 0xa4, 0x65, 0xba, 0xbd, 0x1d, 0x82, 0x48, 0xcb, + 0x70, 0x12, 0x86, 0xc2, 0x7e, 0xc9, 0x97, 0x45, 0xd5, 0x11, 0x0a, 0x00, 0x0a, 0x87, 0x42, 0x1b, + 0x56, 0x3e, 0x5f, 0x47, 0xbf, 0xe9, 0x86, 0x9f, 0xdb, 0xd8, 0x5b, 0x74, 0x4c, 0x61, 0x4d, 0x3c, + 0xec, 0x8b, 0xdb, 0x8c, 0x42, 0x7b, 0x16, 0xbb, 0x4c, 0xc4, 0x69, 0x56, 0x0d, 0xd6, 0x71, 0x1b, + 0x5a, 0x4e, 0x64, 0x14, 0x18, 0x07, 0xe7, 0xb7, 0xdd, 0x65, 0x91, 0xa5, 0xb3, 0xf6, 0xc3, 0x24, + 0xa5, 0x6b, 0xc4, 0xe1, 0xf9, 0xcd, 0xc5, 0xe0, 0x7c, 0x5d, 0xa7, 0x7e, 0xf2, 0x3f, 0xd3, 0x55, + 0xc1, 0xf0, 0xf9, 0xda, 0x43, 0xc2, 0xf3, 0x35, 0x44, 0x61, 0x7d, 0x26, 0x4c, 0x1c, 0xc4, 0x2b, + 0xbe, 0x24, 0xe6, 0x6b, 0x23, 0x0e, 0xd7, 0xc7, 0xc5, 0xec, 0xde, 0xc0, 0x78, 0x18, 0xe7, 0x82, + 0x95, 0x79, 0x9c, 0xed, 0x65, 0xf1, 0xbc, 0x1a, 0x10, 0x73, 0x8c, 0x4f, 0x11, 0x7b, 0x03, 0x9a, + 0x46, 0x9a, 0x71, 0x5c, 0xed, 0xc5, 0x57, 0xbc, 0x4c, 0x05, 0xdd, 0x8c, 0x16, 0xe9, 0x6c, 0x46, + 0x0f, 0x45, 0xbd, 0x8d, 0xca, 0xd9, 0x45, 0x7a, 0xc5, 0x92, 0x80, 0x37, 0x8d, 0xf4, 0xf0, 0xe6, + 0xa0, 0x48, 0xa7, 0x4d, 0xf8, 0xb2, 0x9c, 0x31, 0xb2, 0xd3, 0x1a, 0x71, 0x67, 0xa7, 0x19, 0x4c, + 0x79, 0xf8, 0xab, 0xb5, 0xe8, 0xb7, 0x1a, 0xa9, 0xfb, 0x84, 0x67, 0x37, 0xae, 0x2e, 0xce, 0x78, + 0x5c, 0x26, 0x83, 0x0f, 0x30, 0x3b, 0x28, 0x6a, 0x5c, 0x3f, 0xb9, 0x8e, 0x0a, 0x6c, 0xd6, 0x3a, + 0xef, 0xb6, 0x23, 0x0e, 0x6d, 0x56, 0x0f, 0x09, 0x37, 0x2b, 0x44, 0xe1, 0x04, 0x22, 0xe5, 0xcd, + 0x01, 0xe0, 0x3a, 0xa9, 0xef, 0x9f, 0x02, 0x6e, 0x74, 0x72, 0x70, 0x7e, 0xac, 0x85, 0x7e, 0xb4, + 0x6c, 0x51, 0x36, 0xf0, 0x88, 0x19, 0xf6, 0xc5, 0x49, 0xcf, 0x66, 0x54, 0x84, 0x3d, 0xb7, 0x46, + 0xc6, 0xb0, 0x2f, 0x4e, 0x78, 0x76, 0xa6, 0xb5, 0x90, 0x67, 0x64, 0x6a, 0x1b, 0xf6, 0xc5, 0x61, + 0xf6, 0xa5, 0x18, 0xbd, 0x2e, 0x3c, 0x0c, 0xd8, 0x81, 0x6b, 0xc3, 0x66, 0x2f, 0x56, 0x39, 0xfc, + 0x9b, 0xb5, 0xe8, 0xbb, 0xd6, 0xe3, 0x21, 0x4f, 0xd2, 0xf3, 0x55, 0x03, 0xbd, 0x88, 0xb3, 0x25, + 0xab, 0x06, 0x4f, 0x28, 0x6b, 0x6d, 0xd6, 0x94, 0xe0, 0xe9, 0xb5, 0x74, 0xe0, 0xd8, 0x19, 0x15, + 0x45, 0xb6, 0x9a, 0xb2, 0x45, 0x91, 0x91, 0x63, 0xc7, 0x43, 0xc2, 0x63, 0x07, 0xa2, 0x30, 0x2b, + 0x9f, 0xf2, 0x3a, 0xe7, 0x47, 0xb3, 0x72, 0x29, 0x0a, 0x67, 0xe5, 0x1a, 0x81, 0xb9, 0xd2, 0x94, + 0xef, 0xf0, 0x2c, 0x63, 0x33, 0xd1, 0xbe, 0x25, 0x62, 0x34, 0x2d, 0x11, 0xce, 0x95, 0x00, 0x69, + 0x4f, 0xe5, 0xf4, 0x1e, 0x32, 0x2e, 0xd9, 0xb3, 0xd5, 0x41, 0x9a, 0x5f, 0x0e, 0xf0, 0xb4, 0xc0, + 0x02, 0xc4, 0xa9, 0x1c, 0x0a, 0xc2, 0xbd, 0xea, 0x69, 0x9e, 0x70, 0x7c, 0xaf, 0x5a, 0x4b, 0xc2, + 0x7b, 0x55, 0x45, 0x40, 0x93, 0x27, 0x8c, 0x32, 0x59, 0x4b, 0xc2, 0x26, 0x15, 0x81, 0x4d, 0x85, + 0xea, 0x49, 0x11, 0x39, 0x15, 0x82, 0x67, 0x43, 0x1b, 0x9d, 0x1c, 0xdc, 0x73, 0x29, 0x07, 0x68, + 0x44, 0x00, 0xe3, 0x77, 0x82, 0x0c, 0x0c, 0x7d, 0xbd, 0x1b, 0xde, 0x63, 0x62, 0x76, 0x81, 0x87, + 0xbe, 0x87, 0x84, 0x43, 0x1f, 0xa2, 0xb0, 0xad, 0xa6, 0xdc, 0xec, 0xe6, 0xd7, 0xf1, 0xc0, 0x6b, + 0xed, 0xe4, 0x37, 0x3a, 0x39, 0xd8, 0x56, 0xe3, 0x05, 0xdd, 0x56, 0x8d, 0x2c, 0xdc, 0x56, 0x86, + 0x81, 0xa5, 0x6f, 0x04, 0xf2, 0x90, 0x6c, 0x9d, 0x56, 0xf4, 0x8e, 0xc9, 0x36, 0x3a, 0x39, 0xe5, + 0xe4, 0x5f, 0xcc, 0xfe, 0xb0, 0x91, 0x1e, 0xf1, 0x7a, 0xf0, 0xbd, 0x88, 0xb3, 0x34, 0x89, 0x05, + 0x9b, 0xf2, 0x4b, 0x96, 0xe3, 0x5b, 0x31, 0x55, 0xda, 0x86, 0x1f, 0x7a, 0x0a, 0xe1, 0xad, 0x58, + 0x58, 0x11, 0xc6, 0x49, 0x43, 0x9f, 0x56, 0x6c, 0x27, 0xae, 0x88, 0x29, 0xd2, 0x43, 0xc2, 0x71, + 0x02, 0x51, 0x98, 0x08, 0x37, 0xf2, 0xe7, 0xaf, 0x0b, 0x56, 0xa6, 0x2c, 0x9f, 0x31, 0x3c, 0x11, + 0x86, 0x54, 0x38, 0x11, 0x46, 0x68, 0xb8, 0x09, 0xdc, 0x8d, 0x05, 0x7b, 0xb6, 0x9a, 0xa6, 0x0b, + 0x56, 0x89, 0x78, 0x51, 0xe0, 0x9b, 0x40, 0x00, 0x85, 0x37, 0x81, 0x6d, 0xb8, 0x75, 0xe6, 0x64, + 0x66, 0xda, 0xf6, 0xad, 0x35, 0x48, 0x04, 0x6e, 0xad, 0x11, 0x28, 0x6c, 0x58, 0x0b, 0xa0, 0x4f, + 0x1f, 0x5a, 0x56, 0x82, 0x4f, 0x1f, 0x68, 0xba, 0x75, 0x92, 0x67, 0x98, 0x49, 0x3d, 0x34, 0x3b, + 0x8a, 0x3e, 0x71, 0x87, 0xe8, 0x66, 0x2f, 0x16, 0x3f, 0x3a, 0x3c, 0x61, 0x59, 0x2c, 0xd7, 0xc3, + 0xc0, 0xf9, 0x9c, 0x66, 0xfa, 0x1c, 0x1d, 0x3a, 0xac, 0x72, 0xf8, 0x17, 0x6b, 0xd1, 0x7b, 0x98, + 0xc7, 0x2f, 0x0a, 0xe9, 0xf7, 0x71, 0xb7, 0xad, 0x86, 0x24, 0xae, 0xe5, 0x85, 0x35, 0xec, 0xcd, + 0x12, 0x2d, 0xb2, 0xb7, 0xf6, 0x54, 0x01, 0xfc, 0x6c, 0xd0, 0x94, 0x1f, 0x72, 0xc4, 0xcd, 0x92, + 0x10, 0x6f, 0x37, 0x5a, 0x7e, 0xb9, 0x2a, 0xb0, 0xd1, 0x32, 0x36, 0x94, 0x98, 0xd8, 0x68, 0x21, + 0x98, 0x1d, 0x9d, 0x6e, 0xf5, 0x5e, 0xa6, 0xe2, 0x42, 0x26, 0x72, 0x60, 0x74, 0x7a, 0x65, 0x35, + 0x10, 0x31, 0x3a, 0x49, 0x18, 0xa6, 0x3a, 0x1a, 0xac, 0xc7, 0x26, 0x36, 0x97, 0x1b, 0x43, 0xee, + 0xc8, 0xbc, 0xdf, 0x0d, 0xc2, 0x78, 0xd5, 0x62, 0xb5, 0xa7, 0x7a, 0x18, 0xb2, 0x00, 0xf6, 0x55, + 0x9b, 0xbd, 0x58, 0xe5, 0xf0, 0xcf, 0xa2, 0xef, 0xb4, 0x2a, 0xb6, 0xc7, 0x62, 0xb1, 0x2c, 0x59, + 0x32, 0xd8, 0xee, 0x28, 0xb7, 0x06, 0x8d, 0xeb, 0xc7, 0xfd, 0x15, 0x5a, 0xc9, 0xbf, 0xe6, 0x9a, + 0xb0, 0x32, 0x65, 0x78, 0x12, 0x32, 0xe9, 0xb3, 0xc1, 0xe4, 0x9f, 0xd6, 0x69, 0xed, 0xdf, 0xdd, + 0xe8, 0x1a, 0x5d, 0xc5, 0x69, 0x26, 0x9f, 0x02, 0x7f, 0x10, 0x32, 0xea, 0xa1, 0xc1, 0xfd, 0x3b, + 0xa9, 0xd2, 0x9a, 0x99, 0xe5, 0x18, 0x77, 0xf6, 0x7d, 0x8f, 0xe8, 0x99, 0x00, 0xd9, 0xf6, 0x6d, + 0xf5, 0xa4, 0x95, 0x5b, 0xa1, 0x97, 0xbc, 0xfa, 0xcf, 0x6e, 0x90, 0x63, 0x5e, 0x95, 0x2a, 0x12, + 0xe9, 0x5b, 0x3d, 0x69, 0xe5, 0xf5, 0x4f, 0xa3, 0x77, 0xdb, 0x5e, 0xd5, 0x42, 0xb4, 0xdd, 0x69, + 0x0a, 0xac, 0x45, 0x8f, 0xfb, 0x2b, 0x28, 0xf7, 0xff, 0x6e, 0x0e, 0xbc, 0x1b, 0xff, 0x33, 0xbe, + 0x58, 0xb0, 0x3c, 0x61, 0x89, 0xd6, 0xa8, 0xea, 0x8d, 0xd9, 0xa7, 0xb4, 0x5d, 0xa3, 0x30, 0x74, + 0x35, 0x4c, 0x89, 0x7e, 0xfb, 0x1b, 0x68, 0xaa, 0xa2, 0xfd, 0xf7, 0x5a, 0xf4, 0x00, 0x2d, 0x9a, + 0x0e, 0x5c, 0xaf, 0x88, 0xbf, 0xd7, 0xc7, 0x11, 0xa6, 0x69, 0x8a, 0x3a, 0xfa, 0x39, 0x2c, 0xa8, + 0x22, 0xff, 0xc7, 0x5a, 0x74, 0xdb, 0x2a, 0xd6, 0xe1, 0xbd, 0xc3, 0xf3, 0xf3, 0x2c, 0x9d, 0x09, + 0xf9, 0xa8, 0x57, 0xa9, 0xd0, 0xcd, 0x49, 0x69, 0x74, 0x37, 0x67, 0x40, 0xd3, 0xee, 0x8a, 0x3f, + 0x4b, 0x2b, 0xc1, 0xcb, 0xd5, 0xe4, 0x82, 0xbf, 0xd2, 0xef, 0x3d, 0xf9, 0xf3, 0xb2, 0x02, 0x86, + 0x0e, 0x41, 0xec, 0x8a, 0x71, 0xb2, 0xe5, 0xca, 0xbe, 0x1f, 0x55, 0x11, 0xae, 0x1c, 0xa2, 0xc3, + 0x95, 0x4f, 0xda, 0x55, 0x49, 0xd7, 0xca, 0xbe, 0xcc, 0xb5, 0x81, 0x17, 0xb5, 0xfd, 0x42, 0xd7, + 0xfd, 0x6e, 0xd0, 0xe6, 0xa6, 0x4a, 0xbc, 0x9b, 0x9e, 0x9f, 0x9b, 0x3a, 0xe1, 0x25, 0x75, 0x11, + 0x22, 0x37, 0x25, 0x50, 0xbb, 0xbd, 0xda, 0x4b, 0x33, 0x26, 0x1f, 0x0a, 0x7d, 0x71, 0x7e, 0x9e, + 0xf1, 0x38, 0x01, 0xdb, 0xab, 0x5a, 0x3c, 0x74, 0xe5, 0xc4, 0xf6, 0x0a, 0xe3, 0xec, 0x75, 0x93, + 0x5a, 0x5a, 0x47, 0x77, 0x3e, 0x4b, 0x33, 0x78, 0x6d, 0x5a, 0x6a, 0x1a, 0x21, 0x71, 0xdd, 0xa4, + 0x05, 0xd9, 0x14, 0xa8, 0x16, 0xd5, 0x51, 0xa9, 0xcb, 0x7f, 0xaf, 0xad, 0xe8, 0x88, 0x89, 0x14, + 0x08, 0xc1, 0xec, 0xf1, 0x45, 0x2d, 0x3c, 0x2d, 0xa4, 0xf1, 0x5b, 0x6d, 0xad, 0x46, 0x42, 0x1c, + 0x5f, 0xf8, 0x84, 0xdd, 0x2d, 0xd7, 0x7f, 0xdf, 0xe5, 0xaf, 0x72, 0x69, 0xf4, 0x76, 0x5b, 0x45, + 0xcb, 0x88, 0xdd, 0x32, 0x64, 0x94, 0xe1, 0xcf, 0xa3, 0x5f, 0x94, 0x86, 0x4b, 0x5e, 0x0c, 0x6e, + 0x20, 0x0a, 0xa5, 0x73, 0xc9, 0xf8, 0x26, 0x29, 0xb7, 0xb7, 0x53, 0x4c, 0x6c, 0x9c, 0x56, 0xf1, + 0x1c, 0xbe, 0x19, 0x60, 0x7b, 0x5c, 0x4a, 0x89, 0xdb, 0x29, 0x6d, 0xca, 0x8f, 0x8a, 0x23, 0x9e, + 0x28, 0xeb, 0x48, 0x0d, 0x8d, 0x30, 0x14, 0x15, 0x2e, 0x64, 0xd3, 0xd6, 0xa3, 0xf8, 0x2a, 0x9d, + 0x9b, 0xd4, 0xa2, 0x99, 0xc0, 0x2a, 0x90, 0xb6, 0x5a, 0x66, 0xe8, 0x40, 0x44, 0xda, 0x4a, 0xc2, + 0xca, 0xe7, 0x3f, 0xaf, 0x45, 0xb7, 0x2c, 0xb3, 0xaf, 0x0f, 0x7c, 0xc7, 0xf9, 0x39, 0xaf, 0x93, + 0xdc, 0x83, 0x34, 0xbf, 0xac, 0x06, 0x1f, 0x53, 0x26, 0x71, 0xde, 0x14, 0xe5, 0x93, 0x6b, 0xeb, + 0xd9, 0xfd, 0x89, 0x3e, 0x0d, 0xb5, 0x57, 0x22, 0x1a, 0x0d, 0xb0, 0x3f, 0x31, 0x87, 0xa6, 0x90, + 0x23, 0xf6, 0x27, 0x21, 0xde, 0x76, 0xb1, 0x71, 0x9e, 0xf1, 0x1c, 0x76, 0xb1, 0xb5, 0x50, 0x0b, + 0x89, 0x2e, 0x6e, 0x41, 0x76, 0x3e, 0xd6, 0xa2, 0xe6, 0x7c, 0x6d, 0x94, 0x65, 0x60, 0x3e, 0x36, + 0xaa, 0x06, 0x20, 0xe6, 0x63, 0x14, 0x54, 0x7e, 0x4e, 0xa2, 0x6f, 0xd5, 0x4d, 0x7a, 0x5c, 0xb2, + 0xab, 0x94, 0xc1, 0xdb, 0x3b, 0x8e, 0x84, 0x18, 0xff, 0x3e, 0x61, 0x47, 0xd6, 0x69, 0x5e, 0x15, + 0x59, 0x5c, 0x5d, 0xa8, 0xfb, 0x1c, 0x7e, 0x9d, 0xb5, 0x10, 0xde, 0xe8, 0xb8, 0xd7, 0x41, 0xd9, + 0x49, 0x5d, 0xcb, 0xcc, 0x14, 0xb3, 0x8e, 0xab, 0xb6, 0xa6, 0x99, 0x8d, 0x4e, 0xce, 0x3e, 0x34, + 0xd9, 0x8f, 0xb3, 0x8c, 0x95, 0x2b, 0x2d, 0x3b, 0x8c, 0xf3, 0xf4, 0x9c, 0x55, 0x02, 0x3c, 0x34, + 0x51, 0xd4, 0x10, 0x62, 0xc4, 0x43, 0x93, 0x00, 0x6e, 0xf7, 0x6d, 0xc0, 0xf3, 0x38, 0x4f, 0xd8, + 0x6b, 0xb0, 0x6f, 0x83, 0x76, 0x24, 0x43, 0xec, 0xdb, 0x28, 0xd6, 0x3e, 0x3c, 0x78, 0x96, 0xf1, + 0xd9, 0xa5, 0x5a, 0x02, 0xfc, 0x0e, 0x96, 0x12, 0xb8, 0x06, 0xdc, 0x0e, 0x21, 0x76, 0x11, 0x90, + 0x82, 0x13, 0x56, 0x64, 0xf1, 0x0c, 0x5e, 0xe1, 0x6a, 0x74, 0x94, 0x8c, 0x58, 0x04, 0x20, 0x03, + 0x8a, 0xab, 0xae, 0x86, 0x61, 0xc5, 0x05, 0x37, 0xc3, 0x6e, 0x87, 0x10, 0xbb, 0x0c, 0x4a, 0xc1, + 0xa4, 0xc8, 0x52, 0x01, 0x86, 0x41, 0xa3, 0x21, 0x25, 0xc4, 0x30, 0xf0, 0x09, 0x60, 0xf2, 0x90, + 0x95, 0x73, 0x86, 0x9a, 0x94, 0x92, 0xa0, 0x49, 0x4d, 0xd8, 0xfb, 0xea, 0x4d, 0xdd, 0x79, 0xb1, + 0x02, 0xf7, 0xd5, 0x55, 0xb5, 0x78, 0xb1, 0x22, 0xee, 0xab, 0x7b, 0x00, 0x28, 0xe2, 0x71, 0x5c, + 0x09, 0xbc, 0x88, 0x52, 0x12, 0x2c, 0xa2, 0x26, 0xec, 0x1a, 0xdd, 0x14, 0x71, 0x29, 0xc0, 0x1a, + 0xad, 0x0a, 0xe0, 0x5c, 0x62, 0xb8, 0x49, 0xca, 0xed, 0x4c, 0xd2, 0xf4, 0x0a, 0x13, 0x7b, 0x29, + 0xcb, 0x92, 0x0a, 0xcc, 0x24, 0xaa, 0xdd, 0xb5, 0x94, 0x98, 0x49, 0xda, 0x14, 0x08, 0x25, 0xf5, + 0x04, 0x04, 0xab, 0x1d, 0x78, 0x00, 0x72, 0x3b, 0x84, 0xd8, 0xf9, 0x49, 0x17, 0x7a, 0x27, 0x2e, + 0xcb, 0xb4, 0x5e, 0xfc, 0xd7, 0xf1, 0x02, 0x69, 0x39, 0x31, 0x3f, 0x61, 0x1c, 0x18, 0x5e, 0x7a, + 0xe2, 0xc6, 0x0a, 0x06, 0xa7, 0xee, 0x3b, 0x41, 0xc6, 0x66, 0x9c, 0x52, 0xe2, 0x3c, 0x85, 0xc7, + 0x5a, 0x13, 0x79, 0x08, 0xbf, 0xde, 0x85, 0x39, 0xaf, 0xce, 0x19, 0x17, 0x87, 0xfc, 0x8a, 0x4d, + 0xf9, 0xf3, 0xd7, 0x69, 0x55, 0x6f, 0xb7, 0xd4, 0xca, 0xfd, 0x94, 0xb0, 0x84, 0xc1, 0xc4, 0xab, + 0x73, 0x9d, 0x4a, 0x36, 0x81, 0x00, 0x65, 0x39, 0x62, 0xaf, 0xd0, 0x04, 0x02, 0x5a, 0x34, 0x1c, + 0x91, 0x40, 0x84, 0x78, 0x7b, 0x62, 0x66, 0x9c, 0xab, 0xef, 0x25, 0x4c, 0xb9, 0xce, 0xe5, 0x28, + 0x6b, 0x10, 0x24, 0x0e, 0x2d, 0x82, 0x0a, 0x76, 0x7f, 0x69, 0xfc, 0xdb, 0x21, 0x76, 0x9f, 0xb0, + 0xd3, 0x1e, 0x66, 0x0f, 0x7a, 0x90, 0x88, 0x2b, 0x7b, 0x95, 0x84, 0x72, 0xd5, 0xbe, 0x49, 0xf2, + 0xa0, 0x07, 0xe9, 0x9c, 0xbe, 0xb9, 0xd5, 0x7a, 0x16, 0xcf, 0x2e, 0xe7, 0x25, 0x5f, 0xe6, 0xc9, + 0x0e, 0xcf, 0x78, 0x09, 0x4e, 0xdf, 0xbc, 0x52, 0x03, 0x94, 0x38, 0x7d, 0xeb, 0x50, 0xb1, 0x19, + 0x9c, 0x5b, 0x8a, 0x51, 0x96, 0xce, 0xe1, 0x8e, 0xda, 0x33, 0x24, 0x01, 0x22, 0x83, 0x43, 0x41, + 0x24, 0x88, 0x9a, 0x1d, 0xb7, 0x48, 0x67, 0x71, 0xd6, 0xf8, 0xdb, 0xa6, 0xcd, 0x78, 0x60, 0x67, + 0x10, 0x21, 0x0a, 0x48, 0x3d, 0xa7, 0xcb, 0x32, 0x1f, 0xe7, 0x82, 0x93, 0xf5, 0xd4, 0x40, 0x67, + 0x3d, 0x1d, 0x10, 0x4c, 0xab, 0x53, 0xf6, 0xba, 0x2e, 0x4d, 0xfd, 0x0f, 0x36, 0xad, 0xd6, 0x7f, + 0x1f, 0x2a, 0x79, 0x68, 0x5a, 0x05, 0x1c, 0xa8, 0x8c, 0x72, 0xd2, 0x04, 0x4c, 0x40, 0xdb, 0x0f, + 0x93, 0xfb, 0xdd, 0x20, 0xee, 0x67, 0x22, 0x56, 0x19, 0x0b, 0xf9, 0x91, 0x40, 0x1f, 0x3f, 0x1a, + 0xb4, 0xc7, 0x2d, 0x5e, 0x7d, 0x2e, 0xd8, 0xec, 0xb2, 0x75, 0x33, 0xce, 0x2f, 0x68, 0x83, 0x10, + 0xc7, 0x2d, 0x04, 0x8a, 0x77, 0xd1, 0x78, 0xc6, 0xf3, 0x50, 0x17, 0xd5, 0xf2, 0x3e, 0x5d, 0xa4, + 0x38, 0xbb, 0xf9, 0x35, 0x52, 0x15, 0x99, 0x4d, 0x37, 0x6d, 0x12, 0x16, 0x5c, 0x88, 0xd8, 0xfc, + 0x92, 0xb0, 0xcd, 0xc9, 0xa1, 0xcf, 0xc3, 0xf6, 0x6b, 0x03, 0x2d, 0x2b, 0x87, 0xf4, 0x6b, 0x03, + 0x14, 0x4b, 0x57, 0xb2, 0x89, 0x91, 0x0e, 0x2b, 0x7e, 0x9c, 0x3c, 0xea, 0x07, 0xdb, 0x2d, 0x8f, + 0xe7, 0x73, 0x27, 0x63, 0x71, 0xd9, 0x78, 0xdd, 0x0a, 0x18, 0xb2, 0x18, 0xb1, 0xe5, 0x09, 0xe0, + 0x60, 0x0a, 0xf3, 0x3c, 0xef, 0xf0, 0x5c, 0xb0, 0x5c, 0x60, 0x53, 0x98, 0x6f, 0x4c, 0x81, 0xa1, + 0x29, 0x8c, 0x52, 0x00, 0x71, 0x2b, 0xcf, 0x83, 0x98, 0x38, 0x8a, 0x17, 0x68, 0xc6, 0xd6, 0x9c, + 0xf5, 0x34, 0xf2, 0x50, 0xdc, 0x02, 0xce, 0x79, 0x9c, 0xeb, 0x7a, 0x99, 0xc6, 0xe5, 0xdc, 0x9c, + 0x6e, 0x24, 0x83, 0xc7, 0xb4, 0x1d, 0x9f, 0x24, 0x1e, 0xe7, 0x86, 0x35, 0xc0, 0xb4, 0x33, 0x5e, + 0xc4, 0x73, 0x53, 0x53, 0xa4, 0x06, 0x52, 0xde, 0xaa, 0xea, 0xfd, 0x6e, 0x10, 0xf8, 0x79, 0x91, + 0x26, 0x8c, 0x07, 0xfc, 0x48, 0x79, 0x1f, 0x3f, 0x10, 0x04, 0xd9, 0x5b, 0x5d, 0xef, 0x66, 0x47, + 0x37, 0xca, 0x13, 0xb5, 0x8f, 0x1d, 0x12, 0xcd, 0x03, 0xb8, 0x50, 0xf6, 0x46, 0xf0, 0x60, 0x8c, + 0xea, 0x03, 0xda, 0xd0, 0x18, 0x35, 0xe7, 0xaf, 0x7d, 0xc6, 0x28, 0x06, 0x2b, 0x9f, 0x3f, 0x56, + 0x63, 0x74, 0x37, 0x16, 0x71, 0x9d, 0xb7, 0xbf, 0x48, 0xd9, 0x2b, 0xb5, 0x11, 0x46, 0xea, 0xab, + 0xa9, 0xa1, 0x7c, 0xeb, 0x19, 0xec, 0x8a, 0xb7, 0x7b, 0xf3, 0x01, 0xdf, 0x6a, 0x87, 0xd0, 0xe9, + 0x1b, 0x6c, 0x15, 0xb6, 0x7b, 0xf3, 0x01, 0xdf, 0xea, 0xe3, 0x0d, 0x9d, 0xbe, 0xc1, 0x17, 0x1c, + 0xb6, 0x7b, 0xf3, 0xca, 0xf7, 0x5f, 0xea, 0x81, 0xeb, 0x3a, 0xaf, 0xf3, 0xb0, 0x99, 0x48, 0xaf, + 0x18, 0x96, 0x4e, 0xfa, 0xf6, 0x0c, 0x1a, 0x4a, 0x27, 0x69, 0x15, 0xe7, 0xf3, 0x69, 0x58, 0x29, + 0x8e, 0x79, 0x95, 0xca, 0xeb, 0x18, 0x4f, 0x7b, 0x18, 0xd5, 0x70, 0x68, 0xd3, 0x14, 0x52, 0xb2, + 0x0f, 0x96, 0x3d, 0xd4, 0x5e, 0x84, 0x7f, 0x14, 0xb0, 0xd7, 0xbe, 0x0f, 0xbf, 0xd5, 0x93, 0xb6, + 0x8f, 0x78, 0x3d, 0x46, 0x3f, 0x9c, 0x9b, 0x30, 0x74, 0x95, 0x30, 0xa6, 0xcc, 0x43, 0x5b, 0xf7, + 0x29, 0xe5, 0xe3, 0xfe, 0x0a, 0x1d, 0xee, 0x47, 0x49, 0xd2, 0xcf, 0xbd, 0xfb, 0x74, 0xfb, 0x71, + 0x7f, 0x05, 0xe5, 0xfe, 0xaf, 0xf5, 0xb6, 0x06, 0xfa, 0x57, 0x63, 0xf0, 0x49, 0x1f, 0x8b, 0x60, + 0x1c, 0x3e, 0xbd, 0x96, 0x8e, 0x2a, 0xc8, 0xdf, 0xeb, 0xfd, 0xbb, 0x46, 0xe5, 0xdb, 0x48, 0xf2, + 0x2d, 0x66, 0x35, 0x24, 0x43, 0x51, 0x65, 0x61, 0x38, 0x30, 0x3f, 0xba, 0xa6, 0x96, 0xf3, 0x2d, + 0x3f, 0x0f, 0x56, 0x6f, 0xcd, 0x3a, 0xe5, 0x09, 0x59, 0x76, 0x68, 0x58, 0xa0, 0x8f, 0xaf, 0xab, + 0x46, 0x0d, 0x55, 0x07, 0x96, 0x5f, 0xb3, 0x79, 0xda, 0xd3, 0xb0, 0xf7, 0x7d, 0x9b, 0x0f, 0xaf, + 0xa7, 0xa4, 0xca, 0xf2, 0x5f, 0x6b, 0xd1, 0x3d, 0x8f, 0xb5, 0x8f, 0x33, 0xc0, 0xa1, 0xcb, 0x0f, + 0x02, 0xf6, 0x29, 0x25, 0x53, 0xb8, 0xdf, 0xf9, 0x66, 0xca, 0xf6, 0xc3, 0x77, 0x9e, 0xca, 0x5e, + 0x9a, 0x09, 0x56, 0xb6, 0x3f, 0x7c, 0xe7, 0xdb, 0x6d, 0xa8, 0x21, 0xfd, 0xe1, 0xbb, 0x00, 0xee, + 0x7c, 0xf8, 0x0e, 0xf1, 0x8c, 0x7e, 0xf8, 0x0e, 0xb5, 0x16, 0xfc, 0xf0, 0x5d, 0x58, 0x83, 0x5a, + 0x5d, 0x74, 0x11, 0x9a, 0x63, 0xf3, 0x5e, 0x16, 0xfd, 0x53, 0xf4, 0x27, 0xd7, 0x51, 0x21, 0xd6, + 0xd7, 0x86, 0x93, 0x17, 0x2a, 0x7b, 0xb4, 0xa9, 0x77, 0xa9, 0x72, 0xbb, 0x37, 0xaf, 0x7c, 0xff, + 0x48, 0x6d, 0xae, 0xcc, 0x6a, 0xc2, 0x4b, 0xf9, 0xd1, 0xc3, 0xcd, 0xd0, 0xea, 0x50, 0x5b, 0x70, + 0x7b, 0xfe, 0x51, 0x3f, 0x98, 0xa8, 0x6e, 0x4d, 0xa8, 0x4e, 0x1f, 0x76, 0x19, 0x02, 0x5d, 0xbe, + 0xdd, 0x9b, 0x27, 0x96, 0x91, 0xc6, 0x77, 0xd3, 0xdb, 0x3d, 0x8c, 0xf9, 0x7d, 0xfd, 0xb8, 0xbf, + 0x82, 0x72, 0x7f, 0xa5, 0xb2, 0x56, 0xd7, 0xbd, 0xec, 0xe7, 0xad, 0x2e, 0x53, 0x13, 0xaf, 0x9b, + 0x87, 0x7d, 0xf1, 0x50, 0xfe, 0xe2, 0x2e, 0xa1, 0x5d, 0xf9, 0x0b, 0xba, 0x8c, 0x7e, 0x78, 0x3d, + 0x25, 0x55, 0x96, 0x7f, 0x5a, 0x8b, 0x6e, 0x92, 0x65, 0x51, 0x71, 0xf0, 0x71, 0x5f, 0xcb, 0x20, + 0x1e, 0x3e, 0xb9, 0xb6, 0x9e, 0x2a, 0xd4, 0xbf, 0xae, 0x45, 0xb7, 0x02, 0x85, 0x6a, 0x02, 0xe4, + 0x1a, 0xd6, 0xfd, 0x40, 0xf9, 0xf4, 0xfa, 0x8a, 0xd4, 0x72, 0xef, 0xe2, 0x93, 0xf6, 0x47, 0xcc, + 0x02, 0xb6, 0x27, 0xf4, 0x47, 0xcc, 0xba, 0xb5, 0xe0, 0x19, 0x53, 0x7c, 0xa6, 0xf7, 0x7c, 0xe8, + 0x19, 0x93, 0xbc, 0x0a, 0x19, 0xfc, 0x3c, 0x0a, 0xc6, 0x61, 0x4e, 0x9e, 0xbf, 0x2e, 0xe2, 0x3c, + 0xa1, 0x9d, 0x34, 0xf2, 0x6e, 0x27, 0x86, 0x83, 0x67, 0x73, 0xb5, 0xf4, 0x84, 0xeb, 0x7d, 0xdc, + 0x03, 0x4a, 0xdf, 0x20, 0xc1, 0xb3, 0xb9, 0x16, 0x4a, 0x78, 0x53, 0x59, 0x63, 0xc8, 0x1b, 0x48, + 0x16, 0x1f, 0xf6, 0x41, 0xc1, 0x0e, 0xc1, 0x78, 0x33, 0x47, 0xfe, 0x8f, 0x42, 0x56, 0x5a, 0xc7, + 0xfe, 0x5b, 0x3d, 0x69, 0xc2, 0xed, 0x84, 0x89, 0xcf, 0x58, 0x9c, 0xb0, 0x32, 0xe8, 0xd6, 0x50, + 0xbd, 0xdc, 0xba, 0x34, 0xe6, 0x76, 0x87, 0x67, 0xcb, 0x45, 0xae, 0x3a, 0x93, 0x74, 0xeb, 0x52, + 0xdd, 0x6e, 0x01, 0x0d, 0x4f, 0x25, 0xad, 0x5b, 0x99, 0x5e, 0x3e, 0x0c, 0x9b, 0xf1, 0xb2, 0xca, + 0xcd, 0x5e, 0x2c, 0x5d, 0x4f, 0x15, 0x46, 0x1d, 0xf5, 0x04, 0x91, 0xb4, 0xd5, 0x93, 0x86, 0xc7, + 0x83, 0x8e, 0x5b, 0x13, 0x4f, 0xdb, 0x1d, 0xb6, 0x5a, 0x21, 0xf5, 0xb8, 0xbf, 0x02, 0x3c, 0x8c, + 0x55, 0x51, 0x75, 0x90, 0x56, 0x62, 0x2f, 0xcd, 0xb2, 0xc1, 0x66, 0x20, 0x4c, 0x34, 0x14, 0x3c, + 0x8c, 0x45, 0x60, 0x22, 0x92, 0xf5, 0xe1, 0x65, 0x3e, 0xe8, 0xb2, 0x23, 0xa9, 0x5e, 0x91, 0xec, + 0xd2, 0xe0, 0x40, 0xcd, 0x69, 0x6a, 0x53, 0xdb, 0x61, 0xb8, 0xe1, 0x5a, 0x15, 0xde, 0xee, 0xcd, + 0x83, 0xa7, 0xfd, 0x92, 0x92, 0x2b, 0xcb, 0x5d, 0xca, 0x84, 0xb7, 0x92, 0xdc, 0xeb, 0xa0, 0xc0, + 0xa1, 0x64, 0x33, 0x8c, 0x5e, 0xa6, 0xc9, 0x9c, 0x09, 0xf4, 0x41, 0x95, 0x0b, 0x04, 0x1f, 0x54, + 0x01, 0x10, 0x74, 0x5d, 0xf3, 0x77, 0x73, 0x1a, 0x3b, 0x4e, 0xb0, 0xae, 0x53, 0xca, 0x0e, 0x15, + 0xea, 0x3a, 0x94, 0x06, 0xb3, 0x81, 0x71, 0xab, 0x3e, 0x28, 0xf1, 0x30, 0x64, 0x06, 0x7c, 0x55, + 0x62, 0xb3, 0x17, 0x0b, 0x56, 0x14, 0xeb, 0x30, 0x5d, 0xa4, 0x02, 0x5b, 0x51, 0x1c, 0x1b, 0x35, + 0x12, 0x5a, 0x51, 0xda, 0x28, 0x55, 0xbd, 0x3a, 0x47, 0x18, 0x27, 0xe1, 0xea, 0x35, 0x4c, 0xbf, + 0xea, 0x19, 0xb6, 0xf5, 0x5c, 0x35, 0x37, 0x21, 0x23, 0x2e, 0xd4, 0x66, 0x19, 0x89, 0x6d, 0xf9, + 0xa2, 0x31, 0x04, 0x43, 0xb3, 0x0e, 0xa5, 0x00, 0x9f, 0x17, 0xd4, 0x9c, 0x7e, 0xf4, 0x5b, 0x14, + 0x2c, 0x2e, 0xe3, 0x7c, 0x86, 0x6e, 0x4e, 0xa5, 0xc1, 0x16, 0x19, 0xda, 0x9c, 0x92, 0x1a, 0xe0, + 0xa9, 0xbd, 0xff, 0x26, 0x2f, 0x32, 0x14, 0xcc, 0x2b, 0xb3, 0xfe, 0x8b, 0xbc, 0x0f, 0x7a, 0x90, + 0xf0, 0xa9, 0xbd, 0x06, 0xcc, 0xb9, 0x7b, 0xe3, 0xf4, 0x83, 0x80, 0x29, 0x1f, 0x0d, 0x6d, 0x84, + 0x69, 0x15, 0x10, 0xd4, 0xce, 0xd9, 0xe2, 0xe7, 0x6c, 0x85, 0x05, 0xb5, 0x7b, 0x48, 0xf8, 0x39, + 0x5b, 0x85, 0x82, 0xba, 0x8d, 0x82, 0x3c, 0xd3, 0xdd, 0x07, 0xad, 0x07, 0xf4, 0xdd, 0xad, 0xcf, + 0x46, 0x27, 0x07, 0x46, 0xce, 0x6e, 0x7a, 0xe5, 0x3d, 0xa6, 0x40, 0x0a, 0xba, 0x9b, 0x5e, 0xe1, + 0x4f, 0x29, 0x36, 0x7b, 0xb1, 0xf0, 0x46, 0x40, 0x2c, 0xd8, 0x6b, 0xfd, 0xa8, 0x1e, 0x29, 0xae, + 0x94, 0xb7, 0x9e, 0xd5, 0xdf, 0xef, 0x06, 0xed, 0xfd, 0xdb, 0xe3, 0x92, 0xcf, 0x58, 0x55, 0xa9, + 0x6f, 0xad, 0xfa, 0x17, 0x9c, 0x94, 0x6c, 0x08, 0xbe, 0xb4, 0x7a, 0x37, 0x0c, 0x39, 0x1f, 0x48, + 0x6c, 0x44, 0xf6, 0xbb, 0x4d, 0xeb, 0xa8, 0x66, 0xfb, 0x93, 0x4d, 0x1b, 0x9d, 0x9c, 0x1d, 0x5e, + 0x4a, 0xea, 0x7e, 0xa8, 0xe9, 0x3e, 0xaa, 0x8e, 0x7d, 0xa3, 0xe9, 0x41, 0x0f, 0x52, 0xb9, 0xfa, + 0x2c, 0x7a, 0xf3, 0x80, 0xcf, 0x27, 0x2c, 0x4f, 0x06, 0xdf, 0xf3, 0x6f, 0xf0, 0xf2, 0xf9, 0xb0, + 0xfe, 0xb3, 0x31, 0x7a, 0x83, 0x12, 0xdb, 0x3b, 0x88, 0xbb, 0xec, 0x6c, 0x39, 0x9f, 0x88, 0x58, + 0x80, 0x3b, 0x88, 0xf2, 0xef, 0xc3, 0x5a, 0x40, 0xdc, 0x41, 0xf4, 0x00, 0x60, 0x6f, 0x5a, 0x32, + 0x86, 0xda, 0xab, 0x05, 0x41, 0x7b, 0x0a, 0xb0, 0x59, 0x84, 0xb1, 0x57, 0x27, 0xea, 0xf0, 0xce, + 0xa0, 0xd5, 0x91, 0x52, 0x22, 0x8b, 0x68, 0x53, 0x36, 0xb8, 0x9b, 0xea, 0xcb, 0xef, 0xe6, 0x2c, + 0x17, 0x8b, 0xb8, 0x5c, 0x81, 0xe0, 0x56, 0xb5, 0x74, 0x00, 0x22, 0xb8, 0x51, 0xd0, 0x8e, 0x5a, + 0xdd, 0xcc, 0xb3, 0xcb, 0x7d, 0x5e, 0xf2, 0xa5, 0x48, 0x73, 0x06, 0xbf, 0x9d, 0x62, 0x1a, 0xd4, + 0x65, 0x88, 0x51, 0x4b, 0xb1, 0x36, 0xcb, 0x95, 0x44, 0x73, 0x9d, 0x51, 0x7e, 0x6c, 0xbe, 0x12, + 0xbc, 0x84, 0x8f, 0x33, 0x1b, 0x2b, 0x10, 0x22, 0xb2, 0x5c, 0x12, 0x06, 0x7d, 0x7f, 0x9c, 0xe6, + 0x73, 0xb4, 0xef, 0x8f, 0xdd, 0xef, 0x17, 0xdf, 0xa2, 0x01, 0x3b, 0xa0, 0x9a, 0x46, 0x6b, 0x06, + 0x80, 0x7a, 0x69, 0x18, 0x6d, 0x74, 0x97, 0x20, 0x06, 0x14, 0x4e, 0x02, 0x57, 0x5f, 0x14, 0x2c, + 0x67, 0x89, 0xbe, 0xb4, 0x87, 0xb9, 0xf2, 0x88, 0xa0, 0x2b, 0x48, 0xda, 0xb9, 0x48, 0xca, 0x4f, + 0x96, 0xf9, 0x71, 0xc9, 0xcf, 0xd3, 0x8c, 0x95, 0x60, 0x2e, 0x6a, 0xd4, 0x1d, 0x39, 0x31, 0x17, + 0x61, 0x9c, 0xbd, 0xfd, 0x21, 0xa5, 0xde, 0x2f, 0x26, 0x4c, 0xcb, 0x78, 0x06, 0x6f, 0x7f, 0x34, + 0x36, 0xda, 0x18, 0x71, 0x32, 0x18, 0xc0, 0x9d, 0x44, 0xa7, 0x71, 0x9d, 0xaf, 0x64, 0x7c, 0xa8, + 0x97, 0x56, 0xe5, 0x57, 0x7d, 0x2b, 0x90, 0xe8, 0x28, 0x73, 0x18, 0x49, 0x24, 0x3a, 0x61, 0x0d, + 0xbb, 0x94, 0x48, 0xee, 0x48, 0xdd, 0x6a, 0x02, 0x4b, 0x49, 0x63, 0x43, 0x0b, 0x89, 0xa5, 0xa4, + 0x05, 0x81, 0x09, 0x49, 0x0f, 0x83, 0x39, 0x3a, 0x21, 0x19, 0x69, 0x70, 0x42, 0x72, 0x29, 0x3b, + 0x51, 0x8c, 0xf3, 0x54, 0xa4, 0x71, 0x36, 0x61, 0xe2, 0x38, 0x2e, 0xe3, 0x05, 0x13, 0xac, 0x84, + 0x13, 0x85, 0x42, 0x86, 0x1e, 0x43, 0x4c, 0x14, 0x14, 0xab, 0x1c, 0xfe, 0x6e, 0xf4, 0x76, 0xbd, + 0xee, 0xb3, 0x5c, 0xfd, 0xd6, 0xd3, 0x73, 0xf9, 0x23, 0x71, 0x83, 0x77, 0x8c, 0x8d, 0x89, 0x28, + 0x59, 0xbc, 0xd0, 0xb6, 0xdf, 0x32, 0x7f, 0x97, 0xe0, 0xe3, 0xb5, 0x3a, 0x9e, 0x8f, 0xb8, 0x48, + 0xcf, 0xeb, 0x6d, 0xb6, 0x7a, 0x81, 0x09, 0xc4, 0xb3, 0x2b, 0x1e, 0x06, 0x3e, 0x7a, 0x82, 0x71, + 0x76, 0x9e, 0x76, 0xa5, 0x27, 0xac, 0xc8, 0xe0, 0x3c, 0xed, 0x69, 0x4b, 0x80, 0x98, 0xa7, 0x51, + 0xd0, 0x0e, 0x4e, 0x57, 0x3c, 0x65, 0xe1, 0xca, 0x4c, 0x59, 0xbf, 0xca, 0x4c, 0xbd, 0x77, 0x42, + 0xb2, 0xe8, 0xed, 0x43, 0xb6, 0x38, 0x63, 0x65, 0x75, 0x91, 0x16, 0xd4, 0x97, 0x87, 0x2d, 0xd1, + 0xf9, 0xe5, 0x61, 0x02, 0xb5, 0x2b, 0x81, 0x05, 0xc6, 0xd5, 0x51, 0xbc, 0x60, 0xf2, 0x13, 0x2e, + 0x60, 0x25, 0x70, 0x8c, 0x38, 0x10, 0xb1, 0x12, 0x90, 0xb0, 0xf3, 0x7a, 0x99, 0x65, 0x4e, 0xd8, + 0xbc, 0x8e, 0xb0, 0xf2, 0x38, 0x5e, 0x2d, 0x58, 0x2e, 0x94, 0x49, 0x70, 0x26, 0xef, 0x98, 0xc4, + 0x79, 0xe2, 0x4c, 0xbe, 0x8f, 0x9e, 0x33, 0x35, 0x79, 0x0d, 0x7f, 0xcc, 0x4b, 0xd1, 0xfc, 0x92, + 0xdb, 0x69, 0x99, 0x81, 0xa9, 0xc9, 0x6f, 0x54, 0x8f, 0x24, 0xa6, 0xa6, 0xb0, 0x86, 0xf3, 0xab, + 0x1d, 0x5e, 0x19, 0x5e, 0xb0, 0xd2, 0xc4, 0xc9, 0xf3, 0x45, 0x9c, 0x66, 0x2a, 0x1a, 0xbe, 0x1f, + 0xb0, 0x4d, 0xe8, 0x10, 0xbf, 0xda, 0xd1, 0x57, 0xd7, 0xf9, 0x9d, 0x93, 0x70, 0x09, 0xc1, 0x23, + 0x82, 0x0e, 0xfb, 0xc4, 0x23, 0x82, 0x6e, 0x2d, 0xbb, 0x73, 0xb7, 0xac, 0xe4, 0x56, 0x92, 0xd8, + 0xe1, 0x09, 0x3c, 0x2f, 0x74, 0x6c, 0x02, 0x90, 0xd8, 0xb9, 0x07, 0x15, 0x6c, 0x6a, 0x60, 0xb1, + 0xbd, 0x34, 0x8f, 0xb3, 0xf4, 0xc7, 0x30, 0xad, 0x77, 0xec, 0x68, 0x82, 0x48, 0x0d, 0x70, 0x12, + 0x73, 0xb5, 0xcf, 0xc4, 0x34, 0xad, 0xa7, 0xfe, 0xfb, 0x81, 0x76, 0x93, 0x44, 0xb7, 0x2b, 0x87, + 0x74, 0xbe, 0x32, 0x0c, 0x9b, 0x75, 0x54, 0x14, 0x93, 0x7a, 0x55, 0x3d, 0x61, 0x33, 0x96, 0x16, + 0x62, 0xf0, 0x51, 0xb8, 0xad, 0x00, 0x4e, 0x5c, 0xb4, 0xe8, 0xa1, 0xe6, 0x3c, 0xbe, 0xaf, 0xe7, + 0x92, 0x49, 0xf3, 0x13, 0xa7, 0xa7, 0x15, 0x2b, 0x55, 0xa2, 0xb1, 0xcf, 0x04, 0x18, 0x9d, 0x0e, + 0x37, 0x74, 0xc0, 0xba, 0xa2, 0xc4, 0xe8, 0x0c, 0x6b, 0xd8, 0xc3, 0x3e, 0x87, 0x53, 0x5f, 0x8d, + 0x97, 0xd7, 0x1d, 0x1f, 0x91, 0xc6, 0x1c, 0x8a, 0x38, 0xec, 0xa3, 0x69, 0x9b, 0xad, 0xb5, 0xdd, + 0x8e, 0xf2, 0xd5, 0x18, 0x5e, 0x99, 0x40, 0x2c, 0x49, 0x8c, 0xc8, 0xd6, 0x02, 0xb8, 0x73, 0x18, + 0x5e, 0xf2, 0x38, 0x99, 0xc5, 0x95, 0x38, 0x8e, 0x57, 0x19, 0x8f, 0x13, 0xb9, 0xae, 0xc3, 0xc3, + 0x70, 0xcd, 0x0c, 0x5d, 0x88, 0x3a, 0x0c, 0xa7, 0x60, 0x37, 0x3b, 0x93, 0xbf, 0xdc, 0xaa, 0xae, + 0x92, 0xc2, 0xec, 0x4c, 0x96, 0x17, 0x5e, 0x23, 0xbd, 0x1b, 0x86, 0xec, 0x2b, 0x70, 0x8d, 0x48, + 0xa6, 0x21, 0xb7, 0x30, 0x1d, 0x2f, 0x01, 0x79, 0x3f, 0x40, 0xd8, 0x0f, 0xa0, 0x34, 0x7f, 0xd7, + 0x3f, 0xd6, 0x25, 0xd4, 0xb7, 0xd8, 0x1f, 0x61, 0xba, 0x2e, 0xe4, 0xdd, 0x50, 0xdb, 0xea, 0x49, + 0xdb, 0x34, 0x73, 0xe7, 0x22, 0x16, 0xa3, 0x24, 0x39, 0x64, 0x15, 0xf2, 0x3e, 0x7b, 0x2d, 0x1c, + 0x5a, 0x29, 0x91, 0x66, 0xb6, 0x29, 0x1b, 0xe8, 0xb5, 0xec, 0x79, 0x92, 0x0a, 0x25, 0xd3, 0x17, + 0xb4, 0x1f, 0xb5, 0x0d, 0xb4, 0x29, 0xa2, 0x56, 0x34, 0x6d, 0xe7, 0xf2, 0x9a, 0x99, 0xf2, 0xf9, + 0x3c, 0x63, 0x0a, 0x3a, 0x61, 0x71, 0xf3, 0x29, 0xca, 0xed, 0xb6, 0x2d, 0x14, 0x24, 0xe6, 0xf2, + 0xa0, 0x82, 0x4d, 0x23, 0x6b, 0xac, 0x79, 0x24, 0xa5, 0x1b, 0x76, 0xa3, 0x6d, 0xc6, 0x03, 0x88, + 0x34, 0x12, 0x05, 0xed, 0x6b, 0x77, 0xb5, 0x78, 0x9f, 0xe9, 0x96, 0x80, 0xdf, 0xba, 0x92, 0xca, + 0x8e, 0x98, 0x78, 0xed, 0x0e, 0xc1, 0xec, 0x3e, 0x01, 0x78, 0x78, 0xb6, 0x1a, 0x27, 0x70, 0x9f, + 0x00, 0xf5, 0x25, 0x43, 0xec, 0x13, 0x28, 0xd6, 0xef, 0x3a, 0x73, 0xee, 0x75, 0x10, 0x57, 0xb6, + 0x72, 0x48, 0xd7, 0xa1, 0x60, 0xa8, 0xeb, 0x28, 0x05, 0xbf, 0x49, 0xdd, 0xa3, 0x35, 0xa4, 0x49, + 0xb1, 0x73, 0xb5, 0xf5, 0x2e, 0xcc, 0xe6, 0xfe, 0xb5, 0xf0, 0x84, 0xc5, 0x89, 0xa9, 0x18, 0xa2, + 0xeb, 0xca, 0x89, 0xdc, 0x1f, 0xe3, 0x94, 0x93, 0x3f, 0x88, 0x06, 0x4d, 0x35, 0x4a, 0xd7, 0xcd, + 0x2d, 0xac, 0x88, 0x35, 0x41, 0x4c, 0x54, 0x3e, 0xe1, 0x24, 0x6e, 0x5e, 0x17, 0x4d, 0xb9, 0x72, + 0xa0, 0x5e, 0x0b, 0xad, 0x40, 0xe2, 0xe6, 0x37, 0x7b, 0x8b, 0x26, 0x12, 0xb7, 0x6e, 0x2d, 0xe7, + 0xb3, 0x3f, 0xa0, 0xcb, 0xf6, 0x4a, 0xbe, 0x80, 0x65, 0xfa, 0x34, 0xd8, 0x3d, 0x88, 0x06, 0xf1, + 0xd9, 0x9f, 0x7e, 0x9a, 0x76, 0x0d, 0x32, 0x67, 0x07, 0xf2, 0x7a, 0x1a, 0xfe, 0x7b, 0x23, 0x8d, + 0x90, 0x58, 0x83, 0x5a, 0x90, 0xf3, 0x23, 0xa5, 0xe3, 0x97, 0x65, 0x2a, 0xd2, 0x7c, 0x3e, 0xe5, + 0x3c, 0x83, 0x47, 0x96, 0xa3, 0xf1, 0xd0, 0x95, 0x52, 0x3f, 0x52, 0xda, 0xa2, 0xec, 0x12, 0x37, + 0x1a, 0x8f, 0x96, 0x82, 0x9f, 0xa7, 0x59, 0x06, 0x22, 0x67, 0x34, 0x1e, 0x6a, 0x09, 0x11, 0x39, + 0x3e, 0xe1, 0xfc, 0xb4, 0xe6, 0x58, 0x9e, 0xfe, 0xab, 0x13, 0xd0, 0x3b, 0x50, 0xc7, 0x11, 0x52, + 0x3f, 0xad, 0x09, 0x21, 0xe7, 0xa7, 0x42, 0xc7, 0xd8, 0x8f, 0xa6, 0x6c, 0x42, 0x75, 0x04, 0xa2, + 0x7e, 0x2a, 0x94, 0x82, 0x1b, 0x9f, 0xcf, 0xde, 0xff, 0x9f, 0xaf, 0x6e, 0xac, 0xfd, 0xf4, 0xab, + 0x1b, 0x6b, 0xff, 0xfb, 0xd5, 0x8d, 0xb5, 0x9f, 0x7c, 0x7d, 0xe3, 0x8d, 0x9f, 0x7e, 0x7d, 0xe3, + 0x8d, 0x9f, 0x7d, 0x7d, 0xe3, 0x8d, 0x2f, 0xdf, 0x54, 0xbf, 0x9f, 0x7f, 0xf6, 0x0b, 0xf2, 0x57, + 0xf0, 0x9f, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x64, 0x71, 0xe6, 0xb7, 0x63, 0x7f, 0x00, + 0x00, } // This is a compile-time assertion to ensure that this generated file @@ -429,6 +438,7 @@ type ClientCommandsHandler interface { SpaceDelete(context.Context, *pb.RpcSpaceDeleteRequest) *pb.RpcSpaceDeleteResponse SpaceInviteGenerate(context.Context, *pb.RpcSpaceInviteGenerateRequest) *pb.RpcSpaceInviteGenerateResponse SpaceInviteGetCurrent(context.Context, *pb.RpcSpaceInviteGetCurrentRequest) *pb.RpcSpaceInviteGetCurrentResponse + SpaceInviteGetGuest(context.Context, *pb.RpcSpaceInviteGetGuestRequest) *pb.RpcSpaceInviteGetGuestResponse SpaceInviteRevoke(context.Context, *pb.RpcSpaceInviteRevokeRequest) *pb.RpcSpaceInviteRevokeResponse SpaceInviteView(context.Context, *pb.RpcSpaceInviteViewRequest) *pb.RpcSpaceInviteViewResponse SpaceJoin(context.Context, *pb.RpcSpaceJoinRequest) *pb.RpcSpaceJoinResponse @@ -608,6 +618,7 @@ type ClientCommandsHandler interface { BlockDataviewViewSetActive(context.Context, *pb.RpcBlockDataviewViewSetActiveRequest) *pb.RpcBlockDataviewViewSetActiveResponse BlockDataviewViewSetPosition(context.Context, *pb.RpcBlockDataviewViewSetPositionRequest) *pb.RpcBlockDataviewViewSetPositionResponse BlockDataviewSetSource(context.Context, *pb.RpcBlockDataviewSetSourceRequest) *pb.RpcBlockDataviewSetSourceResponse + BlockDataviewRelationSet(context.Context, *pb.RpcBlockDataviewRelationSetRequest) *pb.RpcBlockDataviewRelationSetResponse BlockDataviewRelationAdd(context.Context, *pb.RpcBlockDataviewRelationAddRequest) *pb.RpcBlockDataviewRelationAddResponse BlockDataviewRelationDelete(context.Context, *pb.RpcBlockDataviewRelationDeleteRequest) *pb.RpcBlockDataviewRelationDeleteResponse BlockDataviewGroupOrderUpdate(context.Context, *pb.RpcBlockDataviewGroupOrderUpdateRequest) *pb.RpcBlockDataviewGroupOrderUpdateResponse @@ -731,7 +742,13 @@ type ClientCommandsHandler interface { ChatReadMessages(context.Context, *pb.RpcChatReadMessagesRequest) *pb.RpcChatReadMessagesResponse ChatUnreadMessages(context.Context, *pb.RpcChatUnreadRequest) *pb.RpcChatUnreadResponse ChatSubscribeToMessagePreviews(context.Context, *pb.RpcChatSubscribeToMessagePreviewsRequest) *pb.RpcChatSubscribeToMessagePreviewsResponse + ChatUnsubscribeFromMessagePreviews(context.Context, *pb.RpcChatUnsubscribeFromMessagePreviewsRequest) *pb.RpcChatUnsubscribeFromMessagePreviewsResponse ObjectChatAdd(context.Context, *pb.RpcObjectChatAddRequest) *pb.RpcObjectChatAddResponse + // mock AI RPCs for compatibility between branches. Not implemented in main + AIWritingTools(context.Context, *pb.RpcAIWritingToolsRequest) *pb.RpcAIWritingToolsResponse + AIAutofill(context.Context, *pb.RpcAIAutofillRequest) *pb.RpcAIAutofillResponse + AIListSummary(context.Context, *pb.RpcAIListSummaryRequest) *pb.RpcAIListSummaryResponse + AIObjectCreateFromUrl(context.Context, *pb.RpcAIObjectCreateFromUrlRequest) *pb.RpcAIObjectCreateFromUrlResponse } func registerClientCommandsHandler(srv ClientCommandsHandler) { @@ -1478,6 +1495,26 @@ func SpaceInviteGetCurrent(b []byte) (resp []byte) { return resp } +func SpaceInviteGetGuest(b []byte) (resp []byte) { + defer func() { + if PanicHandler != nil { + if r := recover(); r != nil { + resp, _ = (&pb.RpcSpaceInviteGetGuestResponse{Error: &pb.RpcSpaceInviteGetGuestResponseError{Code: pb.RpcSpaceInviteGetGuestResponseError_UNKNOWN_ERROR, Description: "panic recovered"}}).Marshal() + PanicHandler(r) + } + } + }() + + in := new(pb.RpcSpaceInviteGetGuestRequest) + if err := in.Unmarshal(b); err != nil { + resp, _ = (&pb.RpcSpaceInviteGetGuestResponse{Error: &pb.RpcSpaceInviteGetGuestResponseError{Code: pb.RpcSpaceInviteGetGuestResponseError_BAD_INPUT, Description: err.Error()}}).Marshal() + return resp + } + + resp, _ = clientCommandsHandler.SpaceInviteGetGuest(context.Background(), in).Marshal() + return resp +} + func SpaceInviteRevoke(b []byte) (resp []byte) { defer func() { if PanicHandler != nil { @@ -4498,6 +4535,26 @@ func BlockDataviewSetSource(b []byte) (resp []byte) { return resp } +func BlockDataviewRelationSet(b []byte) (resp []byte) { + defer func() { + if PanicHandler != nil { + if r := recover(); r != nil { + resp, _ = (&pb.RpcBlockDataviewRelationSetResponse{Error: &pb.RpcBlockDataviewRelationSetResponseError{Code: pb.RpcBlockDataviewRelationSetResponseError_UNKNOWN_ERROR, Description: "panic recovered"}}).Marshal() + PanicHandler(r) + } + } + }() + + in := new(pb.RpcBlockDataviewRelationSetRequest) + if err := in.Unmarshal(b); err != nil { + resp, _ = (&pb.RpcBlockDataviewRelationSetResponse{Error: &pb.RpcBlockDataviewRelationSetResponseError{Code: pb.RpcBlockDataviewRelationSetResponseError_BAD_INPUT, Description: err.Error()}}).Marshal() + return resp + } + + resp, _ = clientCommandsHandler.BlockDataviewRelationSet(context.Background(), in).Marshal() + return resp +} + func BlockDataviewRelationAdd(b []byte) (resp []byte) { defer func() { if PanicHandler != nil { @@ -6398,6 +6455,26 @@ func ChatSubscribeToMessagePreviews(b []byte) (resp []byte) { return resp } +func ChatUnsubscribeFromMessagePreviews(b []byte) (resp []byte) { + defer func() { + if PanicHandler != nil { + if r := recover(); r != nil { + resp, _ = (&pb.RpcChatUnsubscribeFromMessagePreviewsResponse{Error: &pb.RpcChatUnsubscribeFromMessagePreviewsResponseError{Code: pb.RpcChatUnsubscribeFromMessagePreviewsResponseError_UNKNOWN_ERROR, Description: "panic recovered"}}).Marshal() + PanicHandler(r) + } + } + }() + + in := new(pb.RpcChatUnsubscribeFromMessagePreviewsRequest) + if err := in.Unmarshal(b); err != nil { + resp, _ = (&pb.RpcChatUnsubscribeFromMessagePreviewsResponse{Error: &pb.RpcChatUnsubscribeFromMessagePreviewsResponseError{Code: pb.RpcChatUnsubscribeFromMessagePreviewsResponseError_BAD_INPUT, Description: err.Error()}}).Marshal() + return resp + } + + resp, _ = clientCommandsHandler.ChatUnsubscribeFromMessagePreviews(context.Background(), in).Marshal() + return resp +} + func ObjectChatAdd(b []byte) (resp []byte) { defer func() { if PanicHandler != nil { @@ -6418,6 +6495,86 @@ func ObjectChatAdd(b []byte) (resp []byte) { return resp } +func AIWritingTools(b []byte) (resp []byte) { + defer func() { + if PanicHandler != nil { + if r := recover(); r != nil { + resp, _ = (&pb.RpcAIWritingToolsResponse{Error: &pb.RpcAIWritingToolsResponseError{Code: pb.RpcAIWritingToolsResponseError_UNKNOWN_ERROR, Description: "panic recovered"}}).Marshal() + PanicHandler(r) + } + } + }() + + in := new(pb.RpcAIWritingToolsRequest) + if err := in.Unmarshal(b); err != nil { + resp, _ = (&pb.RpcAIWritingToolsResponse{Error: &pb.RpcAIWritingToolsResponseError{Code: pb.RpcAIWritingToolsResponseError_BAD_INPUT, Description: err.Error()}}).Marshal() + return resp + } + + resp, _ = clientCommandsHandler.AIWritingTools(context.Background(), in).Marshal() + return resp +} + +func AIAutofill(b []byte) (resp []byte) { + defer func() { + if PanicHandler != nil { + if r := recover(); r != nil { + resp, _ = (&pb.RpcAIAutofillResponse{Error: &pb.RpcAIAutofillResponseError{Code: pb.RpcAIAutofillResponseError_UNKNOWN_ERROR, Description: "panic recovered"}}).Marshal() + PanicHandler(r) + } + } + }() + + in := new(pb.RpcAIAutofillRequest) + if err := in.Unmarshal(b); err != nil { + resp, _ = (&pb.RpcAIAutofillResponse{Error: &pb.RpcAIAutofillResponseError{Code: pb.RpcAIAutofillResponseError_BAD_INPUT, Description: err.Error()}}).Marshal() + return resp + } + + resp, _ = clientCommandsHandler.AIAutofill(context.Background(), in).Marshal() + return resp +} + +func AIListSummary(b []byte) (resp []byte) { + defer func() { + if PanicHandler != nil { + if r := recover(); r != nil { + resp, _ = (&pb.RpcAIListSummaryResponse{Error: &pb.RpcAIListSummaryResponseError{Code: pb.RpcAIListSummaryResponseError_UNKNOWN_ERROR, Description: "panic recovered"}}).Marshal() + PanicHandler(r) + } + } + }() + + in := new(pb.RpcAIListSummaryRequest) + if err := in.Unmarshal(b); err != nil { + resp, _ = (&pb.RpcAIListSummaryResponse{Error: &pb.RpcAIListSummaryResponseError{Code: pb.RpcAIListSummaryResponseError_BAD_INPUT, Description: err.Error()}}).Marshal() + return resp + } + + resp, _ = clientCommandsHandler.AIListSummary(context.Background(), in).Marshal() + return resp +} + +func AIObjectCreateFromUrl(b []byte) (resp []byte) { + defer func() { + if PanicHandler != nil { + if r := recover(); r != nil { + resp, _ = (&pb.RpcAIObjectCreateFromUrlResponse{Error: &pb.RpcAIObjectCreateFromUrlResponseError{Code: pb.RpcAIObjectCreateFromUrlResponseError_UNKNOWN_ERROR, Description: "panic recovered"}}).Marshal() + PanicHandler(r) + } + } + }() + + in := new(pb.RpcAIObjectCreateFromUrlRequest) + if err := in.Unmarshal(b); err != nil { + resp, _ = (&pb.RpcAIObjectCreateFromUrlResponse{Error: &pb.RpcAIObjectCreateFromUrlResponseError{Code: pb.RpcAIObjectCreateFromUrlResponseError_BAD_INPUT, Description: err.Error()}}).Marshal() + return resp + } + + resp, _ = clientCommandsHandler.AIObjectCreateFromUrl(context.Background(), in).Marshal() + return resp +} + var PanicHandler func(v interface{}) func CommandAsync(cmd string, data []byte, callback func(data []byte)) { @@ -6498,6 +6655,8 @@ func CommandAsync(cmd string, data []byte, callback func(data []byte)) { cd = SpaceInviteGenerate(data) case "SpaceInviteGetCurrent": cd = SpaceInviteGetCurrent(data) + case "SpaceInviteGetGuest": + cd = SpaceInviteGetGuest(data) case "SpaceInviteRevoke": cd = SpaceInviteRevoke(data) case "SpaceInviteView": @@ -6800,6 +6959,8 @@ func CommandAsync(cmd string, data []byte, callback func(data []byte)) { cd = BlockDataviewViewSetPosition(data) case "BlockDataviewSetSource": cd = BlockDataviewSetSource(data) + case "BlockDataviewRelationSet": + cd = BlockDataviewRelationSet(data) case "BlockDataviewRelationAdd": cd = BlockDataviewRelationAdd(data) case "BlockDataviewRelationDelete": @@ -6990,8 +7151,18 @@ func CommandAsync(cmd string, data []byte, callback func(data []byte)) { cd = ChatUnreadMessages(data) case "ChatSubscribeToMessagePreviews": cd = ChatSubscribeToMessagePreviews(data) + case "ChatUnsubscribeFromMessagePreviews": + cd = ChatUnsubscribeFromMessagePreviews(data) case "ObjectChatAdd": cd = ObjectChatAdd(data) + case "AIWritingTools": + cd = AIWritingTools(data) + case "AIAutofill": + cd = AIAutofill(data) + case "AIListSummary": + cd = AIListSummary(data) + case "AIObjectCreateFromUrl": + cd = AIObjectCreateFromUrl(data) default: log.Errorf("unknown command type: %s\n", cmd) } @@ -7532,6 +7703,20 @@ func (h *ClientCommandsHandlerProxy) SpaceInviteGetCurrent(ctx context.Context, call, _ := actualCall(ctx, req) return call.(*pb.RpcSpaceInviteGetCurrentResponse) } +func (h *ClientCommandsHandlerProxy) SpaceInviteGetGuest(ctx context.Context, req *pb.RpcSpaceInviteGetGuestRequest) *pb.RpcSpaceInviteGetGuestResponse { + actualCall := func(ctx context.Context, req any) (any, error) { + return h.client.SpaceInviteGetGuest(ctx, req.(*pb.RpcSpaceInviteGetGuestRequest)), nil + } + for _, interceptor := range h.interceptors { + toCall := actualCall + currentInterceptor := interceptor + actualCall = func(ctx context.Context, req any) (any, error) { + return currentInterceptor(ctx, req, "SpaceInviteGetGuest", toCall) + } + } + call, _ := actualCall(ctx, req) + return call.(*pb.RpcSpaceInviteGetGuestResponse) +} func (h *ClientCommandsHandlerProxy) SpaceInviteRevoke(ctx context.Context, req *pb.RpcSpaceInviteRevokeRequest) *pb.RpcSpaceInviteRevokeResponse { actualCall := func(ctx context.Context, req any) (any, error) { return h.client.SpaceInviteRevoke(ctx, req.(*pb.RpcSpaceInviteRevokeRequest)), nil @@ -9646,6 +9831,20 @@ func (h *ClientCommandsHandlerProxy) BlockDataviewSetSource(ctx context.Context, call, _ := actualCall(ctx, req) return call.(*pb.RpcBlockDataviewSetSourceResponse) } +func (h *ClientCommandsHandlerProxy) BlockDataviewRelationSet(ctx context.Context, req *pb.RpcBlockDataviewRelationSetRequest) *pb.RpcBlockDataviewRelationSetResponse { + actualCall := func(ctx context.Context, req any) (any, error) { + return h.client.BlockDataviewRelationSet(ctx, req.(*pb.RpcBlockDataviewRelationSetRequest)), nil + } + for _, interceptor := range h.interceptors { + toCall := actualCall + currentInterceptor := interceptor + actualCall = func(ctx context.Context, req any) (any, error) { + return currentInterceptor(ctx, req, "BlockDataviewRelationSet", toCall) + } + } + call, _ := actualCall(ctx, req) + return call.(*pb.RpcBlockDataviewRelationSetResponse) +} func (h *ClientCommandsHandlerProxy) BlockDataviewRelationAdd(ctx context.Context, req *pb.RpcBlockDataviewRelationAddRequest) *pb.RpcBlockDataviewRelationAddResponse { actualCall := func(ctx context.Context, req any) (any, error) { return h.client.BlockDataviewRelationAdd(ctx, req.(*pb.RpcBlockDataviewRelationAddRequest)), nil @@ -10976,6 +11175,20 @@ func (h *ClientCommandsHandlerProxy) ChatSubscribeToMessagePreviews(ctx context. call, _ := actualCall(ctx, req) return call.(*pb.RpcChatSubscribeToMessagePreviewsResponse) } +func (h *ClientCommandsHandlerProxy) ChatUnsubscribeFromMessagePreviews(ctx context.Context, req *pb.RpcChatUnsubscribeFromMessagePreviewsRequest) *pb.RpcChatUnsubscribeFromMessagePreviewsResponse { + actualCall := func(ctx context.Context, req any) (any, error) { + return h.client.ChatUnsubscribeFromMessagePreviews(ctx, req.(*pb.RpcChatUnsubscribeFromMessagePreviewsRequest)), nil + } + for _, interceptor := range h.interceptors { + toCall := actualCall + currentInterceptor := interceptor + actualCall = func(ctx context.Context, req any) (any, error) { + return currentInterceptor(ctx, req, "ChatUnsubscribeFromMessagePreviews", toCall) + } + } + call, _ := actualCall(ctx, req) + return call.(*pb.RpcChatUnsubscribeFromMessagePreviewsResponse) +} func (h *ClientCommandsHandlerProxy) ObjectChatAdd(ctx context.Context, req *pb.RpcObjectChatAddRequest) *pb.RpcObjectChatAddResponse { actualCall := func(ctx context.Context, req any) (any, error) { return h.client.ObjectChatAdd(ctx, req.(*pb.RpcObjectChatAddRequest)), nil @@ -10990,3 +11203,59 @@ func (h *ClientCommandsHandlerProxy) ObjectChatAdd(ctx context.Context, req *pb. call, _ := actualCall(ctx, req) return call.(*pb.RpcObjectChatAddResponse) } +func (h *ClientCommandsHandlerProxy) AIWritingTools(ctx context.Context, req *pb.RpcAIWritingToolsRequest) *pb.RpcAIWritingToolsResponse { + actualCall := func(ctx context.Context, req any) (any, error) { + return h.client.AIWritingTools(ctx, req.(*pb.RpcAIWritingToolsRequest)), nil + } + for _, interceptor := range h.interceptors { + toCall := actualCall + currentInterceptor := interceptor + actualCall = func(ctx context.Context, req any) (any, error) { + return currentInterceptor(ctx, req, "AIWritingTools", toCall) + } + } + call, _ := actualCall(ctx, req) + return call.(*pb.RpcAIWritingToolsResponse) +} +func (h *ClientCommandsHandlerProxy) AIAutofill(ctx context.Context, req *pb.RpcAIAutofillRequest) *pb.RpcAIAutofillResponse { + actualCall := func(ctx context.Context, req any) (any, error) { + return h.client.AIAutofill(ctx, req.(*pb.RpcAIAutofillRequest)), nil + } + for _, interceptor := range h.interceptors { + toCall := actualCall + currentInterceptor := interceptor + actualCall = func(ctx context.Context, req any) (any, error) { + return currentInterceptor(ctx, req, "AIAutofill", toCall) + } + } + call, _ := actualCall(ctx, req) + return call.(*pb.RpcAIAutofillResponse) +} +func (h *ClientCommandsHandlerProxy) AIListSummary(ctx context.Context, req *pb.RpcAIListSummaryRequest) *pb.RpcAIListSummaryResponse { + actualCall := func(ctx context.Context, req any) (any, error) { + return h.client.AIListSummary(ctx, req.(*pb.RpcAIListSummaryRequest)), nil + } + for _, interceptor := range h.interceptors { + toCall := actualCall + currentInterceptor := interceptor + actualCall = func(ctx context.Context, req any) (any, error) { + return currentInterceptor(ctx, req, "AIListSummary", toCall) + } + } + call, _ := actualCall(ctx, req) + return call.(*pb.RpcAIListSummaryResponse) +} +func (h *ClientCommandsHandlerProxy) AIObjectCreateFromUrl(ctx context.Context, req *pb.RpcAIObjectCreateFromUrlRequest) *pb.RpcAIObjectCreateFromUrlResponse { + actualCall := func(ctx context.Context, req any) (any, error) { + return h.client.AIObjectCreateFromUrl(ctx, req.(*pb.RpcAIObjectCreateFromUrlRequest)), nil + } + for _, interceptor := range h.interceptors { + toCall := actualCall + currentInterceptor := interceptor + actualCall = func(ctx context.Context, req any) (any, error) { + return currentInterceptor(ctx, req, "AIObjectCreateFromUrl", toCall) + } + } + call, _ := actualCall(ctx, req) + return call.(*pb.RpcAIObjectCreateFromUrlResponse) +} diff --git a/pb/service/service.pb.go b/pb/service/service.pb.go index de05a45aa..1727ae8d0 100644 --- a/pb/service/service.pb.go +++ b/pb/service/service.pb.go @@ -26,356 +26,365 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package func init() { proto.RegisterFile("pb/protos/service/service.proto", fileDescriptor_93a29dc403579097) } var fileDescriptor_93a29dc403579097 = []byte{ - // 5583 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x9d, 0x5b, 0x8f, 0x1c, 0x49, - 0x56, 0xf8, 0xa7, 0x5e, 0xfe, 0xf3, 0x27, 0x97, 0x1d, 0xa0, 0x06, 0x86, 0xd9, 0x61, 0xd7, 0xf6, - 0x78, 0xec, 0x6e, 0xdb, 0xed, 0xae, 0xf6, 0xd8, 0x73, 0x63, 0x17, 0x09, 0xca, 0xdd, 0x76, 0x4f, - 0xef, 0x76, 0xf7, 0x34, 0x5d, 0xd5, 0xb6, 0x18, 0x09, 0x89, 0xec, 0xca, 0xe8, 0xea, 0xa4, 0xb3, - 0x32, 0x72, 0x33, 0xa3, 0xca, 0xae, 0x45, 0x20, 0x10, 0x08, 0x04, 0x02, 0xb1, 0xe2, 0x26, 0x78, - 0x42, 0xe2, 0x13, 0xf0, 0x31, 0x78, 0x41, 0xda, 0x47, 0x1e, 0xd1, 0xcc, 0x87, 0xe0, 0x15, 0x65, - 0x44, 0x64, 0x5c, 0x4e, 0x9e, 0x13, 0x99, 0x3d, 0x3c, 0xd9, 0xea, 0xf3, 0x3b, 0xe7, 0xc4, 0xe5, - 0x44, 0xc4, 0x89, 0xc8, 0xc8, 0xac, 0xe8, 0x66, 0x71, 0xbe, 0x53, 0x94, 0x5c, 0xf0, 0x6a, 0xa7, - 0x62, 0xe5, 0x2a, 0x9d, 0xb1, 0xe6, 0xdf, 0x91, 0xfc, 0xf3, 0xf0, 0xcd, 0x38, 0x5f, 0x8b, 0x75, - 0xc1, 0xde, 0x7b, 0xd7, 0x92, 0x33, 0xbe, 0x58, 0xc4, 0x79, 0x52, 0x29, 0xe4, 0xbd, 0x77, 0xac, - 0x84, 0xad, 0x58, 0x2e, 0xf4, 0xdf, 0x1f, 0xff, 0xe7, 0xff, 0x0c, 0xa2, 0xb7, 0x76, 0xb3, 0x94, - 0xe5, 0x62, 0x57, 0x6b, 0x0c, 0xbf, 0x8c, 0xbe, 0x3d, 0x2e, 0x8a, 0x7d, 0x26, 0x5e, 0xb0, 0xb2, - 0x4a, 0x79, 0x3e, 0xfc, 0x60, 0xa4, 0x1d, 0x8c, 0x4e, 0x8b, 0xd9, 0x68, 0x5c, 0x14, 0x23, 0x2b, - 0x1c, 0x9d, 0xb2, 0x1f, 0x2f, 0x59, 0x25, 0xde, 0xbb, 0x13, 0x86, 0xaa, 0x82, 0xe7, 0x15, 0x1b, - 0x5e, 0x44, 0xbf, 0x34, 0x2e, 0x8a, 0x09, 0x13, 0x7b, 0xac, 0xae, 0xc0, 0x44, 0xc4, 0x82, 0x0d, - 0x37, 0x5b, 0xaa, 0x3e, 0x60, 0x7c, 0xdc, 0xeb, 0x06, 0xb5, 0x9f, 0x69, 0xf4, 0xad, 0xda, 0xcf, - 0xe5, 0x52, 0x24, 0xfc, 0x55, 0x3e, 0x7c, 0xbf, 0xad, 0xa8, 0x45, 0xc6, 0xf6, 0xed, 0x10, 0xa2, - 0xad, 0xbe, 0x8c, 0x7e, 0xfe, 0x65, 0x9c, 0x65, 0x4c, 0xec, 0x96, 0xac, 0x2e, 0xb8, 0xaf, 0xa3, - 0x44, 0x23, 0x25, 0x33, 0x76, 0x3f, 0x08, 0x32, 0xda, 0xf0, 0x97, 0xd1, 0xb7, 0x95, 0xe4, 0x94, - 0xcd, 0xf8, 0x8a, 0x95, 0x43, 0x54, 0x4b, 0x0b, 0x89, 0x26, 0x6f, 0x41, 0xd0, 0xf6, 0x2e, 0xcf, - 0x57, 0xac, 0x14, 0xb8, 0x6d, 0x2d, 0x0c, 0xdb, 0xb6, 0x90, 0xb6, 0xfd, 0x97, 0x83, 0xe8, 0xbb, - 0xe3, 0xd9, 0x8c, 0x2f, 0x73, 0x71, 0xc8, 0x67, 0x71, 0x76, 0x98, 0xe6, 0x57, 0xc7, 0xec, 0xd5, - 0xee, 0x65, 0xcd, 0xe7, 0x73, 0x36, 0x7c, 0xe2, 0xb7, 0xaa, 0x42, 0x47, 0x86, 0x1d, 0xb9, 0xb0, - 0xf1, 0xfd, 0xd1, 0xf5, 0x94, 0x74, 0x59, 0xfe, 0x76, 0x10, 0xdd, 0x80, 0x65, 0x99, 0xf0, 0x6c, - 0xc5, 0x6c, 0x69, 0x3e, 0xee, 0x30, 0xec, 0xe3, 0xa6, 0x3c, 0x9f, 0x5c, 0x57, 0x4d, 0x97, 0x28, - 0x8b, 0xde, 0x76, 0xc3, 0x65, 0xc2, 0x2a, 0x39, 0x9c, 0xee, 0xd3, 0x11, 0xa1, 0x11, 0xe3, 0xf9, - 0x41, 0x1f, 0x54, 0x7b, 0x4b, 0xa3, 0xa1, 0xf6, 0x96, 0xf1, 0xca, 0x38, 0xbb, 0x87, 0x5a, 0x70, - 0x08, 0xe3, 0xeb, 0x7e, 0x0f, 0x52, 0xbb, 0xfa, 0xbd, 0xe8, 0x17, 0x5e, 0xf2, 0xf2, 0xaa, 0x2a, - 0xe2, 0x19, 0xd3, 0x43, 0xe1, 0xae, 0xaf, 0xdd, 0x48, 0xe1, 0x68, 0xd8, 0xe8, 0xc2, 0x9c, 0xa0, - 0x6d, 0x84, 0x5f, 0x14, 0x0c, 0xce, 0x41, 0x56, 0xb1, 0x16, 0x52, 0x41, 0x0b, 0x21, 0x6d, 0xfb, - 0x2a, 0x1a, 0x5a, 0xdb, 0xe7, 0xbf, 0xcf, 0x66, 0x62, 0x9c, 0x24, 0xb0, 0x57, 0xac, 0xae, 0x24, - 0x46, 0xe3, 0x24, 0xa1, 0x7a, 0x05, 0x47, 0xb5, 0xb3, 0x57, 0xd1, 0x3b, 0xc0, 0xd9, 0x61, 0x5a, - 0x49, 0x87, 0xdb, 0x61, 0x2b, 0x1a, 0x33, 0x4e, 0x47, 0x7d, 0x71, 0xed, 0xf8, 0x8f, 0x07, 0xd1, - 0x77, 0x10, 0xcf, 0xa7, 0x6c, 0xc1, 0x57, 0x6c, 0xf8, 0xa8, 0xdb, 0x9a, 0x22, 0x8d, 0xff, 0x0f, - 0xaf, 0xa1, 0x81, 0x84, 0xc9, 0x84, 0x65, 0x6c, 0x26, 0xc8, 0x30, 0x51, 0xe2, 0xce, 0x30, 0x31, - 0x98, 0x33, 0xc2, 0x1a, 0xe1, 0x3e, 0x13, 0xbb, 0xcb, 0xb2, 0x64, 0xb9, 0x20, 0xfb, 0xd2, 0x22, - 0x9d, 0x7d, 0xe9, 0xa1, 0x48, 0x7d, 0xf6, 0x99, 0x18, 0x67, 0x19, 0x59, 0x1f, 0x25, 0xee, 0xac, - 0x8f, 0xc1, 0xb4, 0x87, 0x59, 0xf4, 0x8b, 0x4e, 0x8b, 0x89, 0x83, 0xfc, 0x82, 0x0f, 0xe9, 0xb6, - 0x90, 0x72, 0xe3, 0x63, 0xb3, 0x93, 0x43, 0xaa, 0xf1, 0xec, 0x75, 0xc1, 0x4b, 0xba, 0x5b, 0x94, - 0xb8, 0xb3, 0x1a, 0x06, 0xd3, 0x1e, 0x7e, 0x37, 0x7a, 0x4b, 0xcf, 0x92, 0xcd, 0x7a, 0x76, 0x07, - 0x9d, 0x42, 0xe1, 0x82, 0x76, 0xb7, 0x83, 0x6a, 0x99, 0x3f, 0x4a, 0xe7, 0x65, 0x3d, 0xfb, 0xe0, - 0xe6, 0xb5, 0xb4, 0xc3, 0xbc, 0xa5, 0xb4, 0x79, 0x1e, 0xfd, 0xb2, 0x6f, 0x7e, 0x37, 0xce, 0x67, - 0x2c, 0x1b, 0x3e, 0x08, 0xa9, 0x2b, 0xc6, 0xb8, 0xda, 0xea, 0xc5, 0xda, 0xc9, 0x4e, 0x13, 0x7a, - 0x32, 0xfd, 0x00, 0xd5, 0x06, 0x53, 0xe9, 0x9d, 0x30, 0xd4, 0xb2, 0xbd, 0xc7, 0x32, 0x46, 0xda, - 0x56, 0xc2, 0x0e, 0xdb, 0x06, 0xd2, 0xb6, 0xcb, 0xe8, 0x57, 0x4c, 0x37, 0xd7, 0x79, 0x81, 0x94, - 0xd7, 0x8b, 0xce, 0x16, 0xd1, 0x8f, 0x2e, 0x64, 0x7c, 0x3d, 0xec, 0x07, 0xb7, 0xea, 0xa3, 0x67, - 0x14, 0xbc, 0x3e, 0x60, 0x3e, 0xb9, 0x13, 0x86, 0xb4, 0xed, 0xbf, 0x1a, 0x44, 0xdf, 0xd3, 0xb2, - 0x67, 0x79, 0x7c, 0x9e, 0x31, 0xb9, 0xc4, 0x1f, 0x33, 0xf1, 0x8a, 0x97, 0x57, 0x93, 0x75, 0x3e, - 0x23, 0xd2, 0x19, 0x1c, 0xee, 0x48, 0x67, 0x48, 0x25, 0x5d, 0x98, 0x3f, 0x88, 0xde, 0x6d, 0x82, - 0xe2, 0x32, 0xce, 0xe7, 0xec, 0x87, 0x15, 0xcf, 0xc7, 0x45, 0x3a, 0x4e, 0x92, 0x72, 0x38, 0xc2, - 0xbb, 0x1e, 0x72, 0xa6, 0x04, 0x3b, 0xbd, 0x79, 0x27, 0x7d, 0xd6, 0xad, 0x2c, 0x78, 0x01, 0xd3, - 0xe7, 0xa6, 0xf9, 0x04, 0x2f, 0xa8, 0xf4, 0xd9, 0x47, 0x5a, 0x56, 0x8f, 0xea, 0x35, 0x08, 0xb7, - 0x7a, 0xe4, 0x2e, 0x3a, 0xb7, 0x43, 0x88, 0x5d, 0x03, 0x9a, 0x86, 0xe2, 0xf9, 0x45, 0x3a, 0x3f, - 0x2b, 0x92, 0x7a, 0x0c, 0xdd, 0xc7, 0xeb, 0xec, 0x20, 0xc4, 0x1a, 0x40, 0xa0, 0xda, 0xdb, 0xdf, - 0xd8, 0x2c, 0x53, 0xcf, 0x4b, 0xcf, 0x4b, 0xbe, 0x38, 0x64, 0xf3, 0x78, 0xb6, 0xd6, 0x93, 0xe9, - 0x47, 0xa1, 0x59, 0x0c, 0xd2, 0xa6, 0x10, 0x1f, 0x5f, 0x53, 0x4b, 0x97, 0xe7, 0x5f, 0x07, 0xd1, - 0x1d, 0x2f, 0x4e, 0x74, 0x30, 0xa9, 0xd2, 0x8f, 0xf3, 0xe4, 0x94, 0x55, 0x22, 0x2e, 0xc5, 0xf0, - 0xfb, 0x81, 0x18, 0x20, 0x74, 0x4c, 0xd9, 0x7e, 0xf0, 0x8d, 0x74, 0x6d, 0xaf, 0x4f, 0xea, 0x55, - 0x42, 0xcf, 0x3f, 0x7e, 0xaf, 0x4b, 0x09, 0x9c, 0x7d, 0x6e, 0x87, 0x10, 0xdb, 0xeb, 0x52, 0x70, - 0x90, 0xaf, 0x52, 0xc1, 0xf6, 0x59, 0xce, 0xca, 0x76, 0xaf, 0x2b, 0x55, 0x1f, 0x21, 0x7a, 0x9d, - 0x40, 0xed, 0x4c, 0xe7, 0x79, 0x33, 0x99, 0xc6, 0x56, 0xc0, 0x48, 0x2b, 0xd7, 0x78, 0xd8, 0x0f, - 0xb6, 0x5b, 0x65, 0xc7, 0xe7, 0x29, 0x5b, 0xf1, 0x2b, 0xb8, 0x55, 0x76, 0x4d, 0x28, 0x80, 0xd8, - 0x2a, 0xa3, 0xa0, 0x4d, 0x07, 0x1c, 0x3f, 0x2f, 0x52, 0xf6, 0x0a, 0xa4, 0x03, 0xae, 0x72, 0x2d, - 0x26, 0xd2, 0x01, 0x04, 0xd3, 0x1e, 0x8e, 0xa3, 0x9f, 0x93, 0xc2, 0x1f, 0xf2, 0x34, 0x1f, 0xde, - 0x44, 0x94, 0x6a, 0x81, 0xb1, 0x7a, 0x8b, 0x06, 0x40, 0x89, 0xeb, 0xbf, 0xea, 0xb5, 0xf9, 0x2e, - 0xa1, 0x04, 0x96, 0xe5, 0x8d, 0x2e, 0xcc, 0xe6, 0x61, 0x52, 0x58, 0xcf, 0x5f, 0x93, 0xcb, 0xb8, - 0x4c, 0xf3, 0xf9, 0x10, 0xd3, 0x75, 0xe4, 0x44, 0x1e, 0x86, 0x71, 0x20, 0x84, 0xb5, 0xe2, 0xb8, - 0x28, 0xca, 0x7a, 0x5a, 0xc4, 0x42, 0xd8, 0x47, 0x82, 0x21, 0xdc, 0x42, 0x71, 0x6f, 0x7b, 0x6c, - 0x96, 0xa5, 0x79, 0xd0, 0x9b, 0x46, 0xfa, 0x78, 0xb3, 0x28, 0x08, 0xde, 0x43, 0x16, 0xaf, 0x58, - 0x53, 0x33, 0xac, 0x65, 0x5c, 0x20, 0x18, 0xbc, 0x00, 0xb4, 0x9b, 0x5e, 0x29, 0x3e, 0x8a, 0xaf, - 0x58, 0xdd, 0xc0, 0xac, 0x5e, 0x54, 0x87, 0x98, 0xbe, 0x47, 0x10, 0x9b, 0x5e, 0x9c, 0xd4, 0xae, - 0x96, 0xd1, 0x3b, 0x52, 0x7e, 0x12, 0x97, 0x22, 0x9d, 0xa5, 0x45, 0x9c, 0x37, 0x9b, 0x29, 0x6c, - 0x5c, 0xb7, 0x28, 0xe3, 0x72, 0xbb, 0x27, 0xad, 0xdd, 0xfe, 0xd3, 0x20, 0x7a, 0x1f, 0xfa, 0x3d, - 0x61, 0xe5, 0x22, 0x95, 0x7b, 0xf2, 0x4a, 0x4d, 0xc2, 0xc3, 0x4f, 0xc3, 0x46, 0x5b, 0x0a, 0xa6, - 0x34, 0x9f, 0x5d, 0x5f, 0xd1, 0x66, 0x62, 0x13, 0xbd, 0x4f, 0xf9, 0xa2, 0x4c, 0x5a, 0x67, 0x56, - 0x93, 0x66, 0xf3, 0x21, 0x85, 0x44, 0x26, 0xd6, 0x82, 0xc0, 0x08, 0x3f, 0xcb, 0xab, 0xc6, 0x3a, - 0x36, 0xc2, 0xad, 0x38, 0x38, 0xc2, 0x3d, 0xcc, 0x8e, 0xf0, 0x93, 0xe5, 0x79, 0x96, 0x56, 0x97, - 0x69, 0x3e, 0xd7, 0x69, 0xb7, 0xaf, 0x6b, 0xc5, 0x30, 0xf3, 0xde, 0xec, 0xe4, 0x30, 0x27, 0x3a, - 0x58, 0x48, 0x27, 0x20, 0x4c, 0x36, 0x3b, 0x39, 0xbb, 0x1b, 0xb2, 0xd2, 0x7a, 0x1b, 0x0e, 0x76, - 0x43, 0x8e, 0x6a, 0x2d, 0x25, 0x76, 0x43, 0x6d, 0xca, 0xee, 0x86, 0xdc, 0x3a, 0x54, 0x3c, 0x5b, - 0xb1, 0xb3, 0x32, 0x05, 0xbb, 0x21, 0xaf, 0x7c, 0x0d, 0x43, 0xec, 0x86, 0x28, 0xd6, 0x4e, 0x54, - 0x96, 0xd8, 0x67, 0x62, 0x22, 0x62, 0xb1, 0xac, 0xc0, 0x44, 0xe5, 0xd8, 0x30, 0x08, 0x31, 0x51, - 0x11, 0xa8, 0xf6, 0xf6, 0xdb, 0x51, 0xa4, 0x4e, 0x30, 0xe4, 0x29, 0x93, 0xbf, 0xf6, 0xe8, 0xa3, - 0x0d, 0xef, 0x88, 0xe9, 0xfd, 0x00, 0x61, 0x13, 0x1e, 0xf5, 0x77, 0x79, 0x78, 0x36, 0x44, 0x35, - 0xa4, 0x88, 0x48, 0x78, 0x00, 0x02, 0x0b, 0x3a, 0xb9, 0xe4, 0xaf, 0xf0, 0x82, 0xd6, 0x92, 0x70, - 0x41, 0x35, 0x61, 0x8f, 0xb3, 0x75, 0x41, 0xb1, 0xe3, 0xec, 0xa6, 0x18, 0xa1, 0xe3, 0x6c, 0xc8, - 0xd8, 0x98, 0x71, 0x0d, 0x3f, 0xe5, 0xfc, 0x6a, 0x11, 0x97, 0x57, 0x20, 0x66, 0x3c, 0xe5, 0x86, - 0x21, 0x62, 0x86, 0x62, 0x6d, 0xcc, 0xb8, 0x0e, 0xeb, 0x74, 0xf9, 0xac, 0xcc, 0x40, 0xcc, 0x78, - 0x36, 0x34, 0x42, 0xc4, 0x0c, 0x81, 0xda, 0xd9, 0xc9, 0xf5, 0x36, 0x61, 0xf0, 0x00, 0xc5, 0x53, - 0x9f, 0x30, 0xea, 0x00, 0x05, 0xc1, 0x60, 0x08, 0xed, 0x97, 0x71, 0x71, 0x89, 0x87, 0x90, 0x14, - 0x85, 0x43, 0xa8, 0x41, 0x60, 0x7f, 0x4f, 0x58, 0x5c, 0xce, 0x2e, 0xf1, 0xfe, 0x56, 0xb2, 0x70, - 0x7f, 0x1b, 0x06, 0xf6, 0xb7, 0x12, 0xbc, 0x4c, 0xc5, 0xe5, 0x11, 0x13, 0x31, 0xde, 0xdf, 0x3e, - 0x13, 0xee, 0xef, 0x16, 0x6b, 0xf3, 0x71, 0xd7, 0xe1, 0x64, 0x79, 0x5e, 0xcd, 0xca, 0xf4, 0x9c, - 0x0d, 0x03, 0x56, 0x0c, 0x44, 0xe4, 0xe3, 0x24, 0xac, 0x7d, 0xfe, 0x74, 0x10, 0xdd, 0x6c, 0xba, - 0x9d, 0x57, 0x95, 0x5e, 0xfb, 0x7c, 0xf7, 0x1f, 0xe3, 0xfd, 0x4b, 0xe0, 0xc4, 0x03, 0x86, 0x1e, - 0x6a, 0x4e, 0x6e, 0x80, 0x17, 0xe9, 0x2c, 0xaf, 0x4c, 0xa1, 0x3e, 0xed, 0x63, 0xdd, 0x51, 0x20, - 0x72, 0x83, 0x5e, 0x8a, 0x36, 0x2d, 0xd3, 0xfd, 0xd3, 0xc8, 0x0e, 0x92, 0x0a, 0xa4, 0x65, 0x4d, - 0x7b, 0x3b, 0x04, 0x91, 0x96, 0xe1, 0x24, 0x0c, 0x85, 0xfd, 0x92, 0x2f, 0x8b, 0xaa, 0x23, 0x14, - 0x00, 0x14, 0x0e, 0x85, 0x36, 0xac, 0x7d, 0xbe, 0x8e, 0x7e, 0xd5, 0x0d, 0x3f, 0xb7, 0xb1, 0xb7, - 0xe9, 0x98, 0xc2, 0x9a, 0x78, 0xd4, 0x17, 0xb7, 0x19, 0x45, 0xe3, 0x59, 0xec, 0x31, 0x11, 0xa7, - 0x59, 0x35, 0xdc, 0xc0, 0x6d, 0x34, 0x72, 0x22, 0xa3, 0xc0, 0x38, 0x38, 0xbf, 0xed, 0x2d, 0x8b, - 0x2c, 0x9d, 0xb5, 0x1f, 0xef, 0x68, 0x5d, 0x23, 0x0e, 0xcf, 0x6f, 0x2e, 0x06, 0xe7, 0xeb, 0x3a, - 0xf5, 0x93, 0xff, 0x99, 0xae, 0x0b, 0x86, 0xcf, 0xd7, 0x1e, 0x12, 0x9e, 0xaf, 0x21, 0x0a, 0xeb, - 0x33, 0x61, 0xe2, 0x30, 0x5e, 0xf3, 0x25, 0x31, 0x5f, 0x1b, 0x71, 0xb8, 0x3e, 0x2e, 0x66, 0xf7, - 0x06, 0xc6, 0xc3, 0x41, 0x2e, 0x58, 0x99, 0xc7, 0xd9, 0xf3, 0x2c, 0x9e, 0x57, 0x43, 0x62, 0x8e, - 0xf1, 0x29, 0x62, 0x6f, 0x40, 0xd3, 0x48, 0x33, 0x1e, 0x54, 0xcf, 0xe3, 0x15, 0x2f, 0x53, 0x41, - 0x37, 0xa3, 0x45, 0x3a, 0x9b, 0xd1, 0x43, 0x51, 0x6f, 0xe3, 0x72, 0x76, 0x99, 0xae, 0x58, 0x12, - 0xf0, 0xd6, 0x20, 0x3d, 0xbc, 0x39, 0x28, 0xd2, 0x69, 0x13, 0xbe, 0x2c, 0x67, 0x8c, 0xec, 0x34, - 0x25, 0xee, 0xec, 0x34, 0x83, 0x69, 0x0f, 0x7f, 0x36, 0x88, 0x7e, 0x4d, 0x49, 0xdd, 0x67, 0x2e, - 0x7b, 0x71, 0x75, 0x79, 0xce, 0xe3, 0x32, 0x19, 0x7e, 0x88, 0xd9, 0x41, 0x51, 0xe3, 0xfa, 0xf1, - 0x75, 0x54, 0x60, 0xb3, 0xd6, 0x79, 0xb7, 0x1d, 0x71, 0x68, 0xb3, 0x7a, 0x48, 0xb8, 0x59, 0x21, - 0x0a, 0x27, 0x10, 0x29, 0x57, 0x47, 0x72, 0x1b, 0xa4, 0xbe, 0x7f, 0x2e, 0xb7, 0xd9, 0xc9, 0xc1, - 0xf9, 0xb1, 0x16, 0xfa, 0xd1, 0xb2, 0x4d, 0xd9, 0xc0, 0x23, 0x66, 0xd4, 0x17, 0x27, 0x3d, 0x9b, - 0x51, 0x11, 0xf6, 0xdc, 0x1a, 0x19, 0xa3, 0xbe, 0x38, 0xe1, 0xd9, 0x99, 0xd6, 0x42, 0x9e, 0x91, - 0xa9, 0x6d, 0xd4, 0x17, 0x87, 0xd9, 0x97, 0x66, 0x9a, 0x75, 0xe1, 0x41, 0xc0, 0x0e, 0x5c, 0x1b, - 0xb6, 0x7a, 0xb1, 0xda, 0xe1, 0x5f, 0x0c, 0xa2, 0xef, 0x5a, 0x8f, 0x47, 0x3c, 0x49, 0x2f, 0xd6, - 0x0a, 0x7a, 0x11, 0x67, 0x4b, 0x56, 0x0d, 0x1f, 0x53, 0xd6, 0xda, 0xac, 0x29, 0xc1, 0x93, 0x6b, - 0xe9, 0xc0, 0xb1, 0x33, 0x2e, 0x8a, 0x6c, 0x3d, 0x65, 0x8b, 0x22, 0x23, 0xc7, 0x8e, 0x87, 0x84, - 0xc7, 0x0e, 0x44, 0x61, 0x56, 0x3e, 0xe5, 0x75, 0xce, 0x8f, 0x66, 0xe5, 0x52, 0x14, 0xce, 0xca, - 0x1b, 0x04, 0xe6, 0x4a, 0x53, 0xbe, 0xcb, 0xb3, 0x8c, 0xcd, 0x44, 0xfb, 0xde, 0x86, 0xd1, 0xb4, - 0x44, 0x38, 0x57, 0x02, 0xa4, 0x3d, 0x95, 0x6b, 0xf6, 0x90, 0x71, 0xc9, 0x9e, 0xae, 0x0f, 0xd3, - 0xfc, 0x6a, 0x88, 0xa7, 0x05, 0x16, 0x20, 0x4e, 0xe5, 0x50, 0x10, 0xee, 0x55, 0xcf, 0xf2, 0x84, - 0xe3, 0x7b, 0xd5, 0x5a, 0x12, 0xde, 0xab, 0x6a, 0x02, 0x9a, 0x3c, 0x65, 0x94, 0xc9, 0x5a, 0x12, - 0x36, 0xa9, 0x09, 0x6c, 0x2a, 0xd4, 0xcf, 0x6e, 0xc8, 0xa9, 0x10, 0x3c, 0xad, 0xd9, 0xec, 0xe4, - 0xe0, 0x9e, 0x4b, 0x3b, 0x40, 0x23, 0x02, 0x18, 0xff, 0x20, 0xc8, 0xc0, 0xd0, 0x6f, 0x76, 0xc3, - 0xcf, 0x99, 0x98, 0x5d, 0xe2, 0xa1, 0xef, 0x21, 0xe1, 0xd0, 0x87, 0x28, 0x6c, 0xab, 0x29, 0x37, - 0xbb, 0xf9, 0x0d, 0x3c, 0xf0, 0x5a, 0x3b, 0xf9, 0xcd, 0x4e, 0x0e, 0xb6, 0xd5, 0xc1, 0x82, 0x6e, - 0x2b, 0x25, 0x0b, 0xb7, 0x95, 0x61, 0x60, 0xe9, 0x95, 0x40, 0x1e, 0x92, 0x6d, 0xd0, 0x8a, 0xde, - 0x31, 0xd9, 0x66, 0x27, 0xa7, 0x9d, 0xfc, 0x83, 0xd9, 0x1f, 0x2a, 0xe9, 0x31, 0xaf, 0x07, 0xdf, - 0x8b, 0x38, 0x4b, 0x93, 0x58, 0xb0, 0x29, 0xbf, 0x62, 0x39, 0xbe, 0x15, 0xd3, 0xa5, 0x55, 0xfc, - 0xc8, 0x53, 0x08, 0x6f, 0xc5, 0xc2, 0x8a, 0x30, 0x4e, 0x14, 0x7d, 0x56, 0xb1, 0xdd, 0xb8, 0x22, - 0xa6, 0x48, 0x0f, 0x09, 0xc7, 0x09, 0x44, 0x61, 0x22, 0xac, 0xe4, 0xcf, 0x5e, 0x17, 0xac, 0x4c, - 0x59, 0x3e, 0x63, 0x78, 0x22, 0x0c, 0xa9, 0x70, 0x22, 0x8c, 0xd0, 0x70, 0x13, 0xb8, 0x17, 0x0b, - 0xf6, 0x74, 0x3d, 0x4d, 0x17, 0xac, 0x12, 0xf1, 0xa2, 0xc0, 0x37, 0x81, 0x00, 0x0a, 0x6f, 0x02, - 0xdb, 0x70, 0xeb, 0xcc, 0xc9, 0xcc, 0xb4, 0xed, 0x7b, 0x64, 0x90, 0x08, 0xdc, 0x23, 0x23, 0x50, - 0xd8, 0xb0, 0x16, 0x40, 0x9f, 0x3e, 0xb4, 0xac, 0x04, 0x9f, 0x3e, 0xd0, 0x74, 0xeb, 0x24, 0xcf, - 0x30, 0x93, 0x7a, 0x68, 0x76, 0x14, 0x7d, 0xe2, 0x0e, 0xd1, 0xad, 0x5e, 0x2c, 0x7e, 0x74, 0x78, - 0xca, 0xb2, 0x58, 0xae, 0x87, 0x81, 0xf3, 0xb9, 0x86, 0xe9, 0x73, 0x74, 0xe8, 0xb0, 0xda, 0xe1, - 0x9f, 0x0c, 0xa2, 0xf7, 0x30, 0x8f, 0x5f, 0x14, 0xd2, 0xef, 0xa3, 0x6e, 0x5b, 0x8a, 0x24, 0x2e, - 0xca, 0x85, 0x35, 0xec, 0x5d, 0x8f, 0x46, 0x64, 0xef, 0xd1, 0xe9, 0x02, 0xf8, 0xd9, 0xa0, 0x29, - 0x3f, 0xe4, 0x88, 0xbb, 0x1e, 0x21, 0xde, 0x6e, 0xb4, 0xfc, 0x72, 0x55, 0x60, 0xa3, 0x65, 0x6c, - 0x68, 0x31, 0xb1, 0xd1, 0x42, 0x30, 0x3b, 0x3a, 0xdd, 0xea, 0xbd, 0x4c, 0xc5, 0xa5, 0x4c, 0xe4, - 0xc0, 0xe8, 0xf4, 0xca, 0x6a, 0x20, 0x62, 0x74, 0x92, 0x30, 0x4c, 0x75, 0x1a, 0xb0, 0x1e, 0x9b, - 0xd8, 0x5c, 0x6e, 0x0c, 0xb9, 0x23, 0xf3, 0x5e, 0x37, 0x08, 0xe3, 0xb5, 0x11, 0xeb, 0x3d, 0xd5, - 0x83, 0x90, 0x05, 0xb0, 0xaf, 0xda, 0xea, 0xc5, 0x6a, 0x87, 0x7f, 0x14, 0x7d, 0xa7, 0x55, 0xb1, - 0xe7, 0x2c, 0x16, 0xcb, 0x92, 0x25, 0xc3, 0x9d, 0x8e, 0x72, 0x37, 0xa0, 0x71, 0xfd, 0xa8, 0xbf, - 0x42, 0x2b, 0xf9, 0x6f, 0x38, 0x15, 0x56, 0xa6, 0x0c, 0x8f, 0x43, 0x26, 0x7d, 0x36, 0x98, 0xfc, - 0xd3, 0x3a, 0xad, 0xfd, 0xbb, 0x1b, 0x5d, 0xe3, 0x55, 0x9c, 0x66, 0xf2, 0x29, 0xf0, 0x87, 0x21, - 0xa3, 0x1e, 0x1a, 0xdc, 0xbf, 0x93, 0x2a, 0xad, 0x99, 0x59, 0x8e, 0x71, 0x67, 0xdf, 0xf7, 0x90, - 0x9e, 0x09, 0x90, 0x6d, 0xdf, 0x76, 0x4f, 0x5a, 0xbb, 0x15, 0xcd, 0x92, 0x57, 0xff, 0xd9, 0x0d, - 0x72, 0xcc, 0xab, 0x56, 0x45, 0x22, 0x7d, 0xbb, 0x27, 0xad, 0xbd, 0xfe, 0x61, 0xf4, 0x6e, 0xdb, - 0xab, 0x5e, 0x88, 0x76, 0x3a, 0x4d, 0x81, 0xb5, 0xe8, 0x51, 0x7f, 0x05, 0xed, 0xfe, 0x9f, 0xcd, - 0x81, 0xb7, 0xf2, 0x3f, 0xe3, 0x8b, 0x05, 0xcb, 0x13, 0x96, 0x34, 0x1a, 0x55, 0xbd, 0x31, 0xfb, - 0x8c, 0xb6, 0x6b, 0x14, 0x46, 0xae, 0x86, 0x29, 0xd1, 0xaf, 0x7f, 0x03, 0x4d, 0x5d, 0xb4, 0x7f, - 0x1f, 0x44, 0xf7, 0xd1, 0xa2, 0x35, 0x81, 0xeb, 0x15, 0xf1, 0xb7, 0xfa, 0x38, 0xc2, 0x34, 0x4d, - 0x51, 0xc7, 0xff, 0x07, 0x0b, 0xba, 0xc8, 0xff, 0x32, 0x88, 0x6e, 0x5b, 0xc5, 0x3a, 0xbc, 0x77, - 0x79, 0x7e, 0x91, 0xa5, 0x33, 0x21, 0x1f, 0xf5, 0x6a, 0x15, 0xba, 0x39, 0x29, 0x8d, 0xee, 0xe6, - 0x0c, 0x68, 0xda, 0x5d, 0xf1, 0xe7, 0x69, 0x25, 0x78, 0xb9, 0x9e, 0x5c, 0xf2, 0x57, 0xcd, 0x9b, - 0x48, 0xfe, 0xbc, 0xac, 0x81, 0x91, 0x43, 0x10, 0xbb, 0x62, 0x9c, 0x6c, 0xb9, 0xb2, 0x6f, 0x2c, - 0x55, 0x84, 0x2b, 0x87, 0xe8, 0x70, 0xe5, 0x93, 0x76, 0x55, 0x6a, 0x6a, 0x65, 0x5f, 0xaf, 0xda, - 0xc4, 0x8b, 0xda, 0x7e, 0xc5, 0xea, 0x5e, 0x37, 0x68, 0x73, 0x53, 0x2d, 0xde, 0x4b, 0x2f, 0x2e, - 0x4c, 0x9d, 0xf0, 0x92, 0xba, 0x08, 0x91, 0x9b, 0x12, 0xa8, 0xdd, 0x5e, 0x3d, 0x4f, 0x33, 0x26, - 0x1f, 0x0a, 0x7d, 0x71, 0x71, 0x91, 0xf1, 0x38, 0x01, 0xdb, 0xab, 0x5a, 0x3c, 0x72, 0xe5, 0xc4, - 0xf6, 0x0a, 0xe3, 0xec, 0x75, 0x93, 0x5a, 0x5a, 0x47, 0x77, 0x3e, 0x4b, 0x33, 0x78, 0x91, 0x59, - 0x6a, 0x1a, 0x21, 0x71, 0xdd, 0xa4, 0x05, 0xd9, 0x14, 0xa8, 0x16, 0xd5, 0x51, 0xd9, 0x94, 0xff, - 0x6e, 0x5b, 0xd1, 0x11, 0x13, 0x29, 0x10, 0x82, 0xd9, 0xe3, 0x8b, 0x5a, 0x78, 0x56, 0x48, 0xe3, - 0xb7, 0xda, 0x5a, 0x4a, 0x42, 0x1c, 0x5f, 0xf8, 0x84, 0xdd, 0x2d, 0xd7, 0x7f, 0xdf, 0xe3, 0xaf, - 0x72, 0x69, 0xf4, 0x76, 0x5b, 0xa5, 0x91, 0x11, 0xbb, 0x65, 0xc8, 0x68, 0xc3, 0x3f, 0x8a, 0xfe, - 0xbf, 0x34, 0x5c, 0xf2, 0x62, 0x78, 0x03, 0x51, 0x28, 0x9d, 0x6b, 0xbf, 0x37, 0x49, 0xb9, 0xbd, - 0x9d, 0x62, 0x62, 0xe3, 0xac, 0x8a, 0xe7, 0xf0, 0xae, 0xbe, 0xed, 0x71, 0x29, 0x25, 0x6e, 0xa7, - 0xb4, 0x29, 0x3f, 0x2a, 0x8e, 0x79, 0xa2, 0xad, 0x23, 0x35, 0x34, 0xc2, 0x50, 0x54, 0xb8, 0x90, - 0x4d, 0x5b, 0x8f, 0xe3, 0x55, 0x3a, 0x37, 0xa9, 0x85, 0x9a, 0xc0, 0x2a, 0x90, 0xb6, 0x5a, 0x66, - 0xe4, 0x40, 0x44, 0xda, 0x4a, 0xc2, 0xda, 0xe7, 0xdf, 0x0f, 0xa2, 0x5b, 0x96, 0xd9, 0x6f, 0x0e, - 0x7c, 0x0f, 0xf2, 0x0b, 0x5e, 0x27, 0xb9, 0x87, 0x69, 0x7e, 0x55, 0x0d, 0x3f, 0xa1, 0x4c, 0xe2, - 0xbc, 0x29, 0xca, 0xa7, 0xd7, 0xd6, 0xb3, 0xfb, 0x93, 0xe6, 0x34, 0xd4, 0x5e, 0x89, 0x50, 0x1a, - 0x60, 0x7f, 0x62, 0x0e, 0x4d, 0x21, 0x47, 0xec, 0x4f, 0x42, 0xbc, 0xed, 0x62, 0xe3, 0x3c, 0xe3, - 0x39, 0xec, 0x62, 0x6b, 0xa1, 0x16, 0x12, 0x5d, 0xdc, 0x82, 0xec, 0x7c, 0xdc, 0x88, 0xd4, 0xf9, - 0xda, 0x38, 0xcb, 0xc0, 0x7c, 0x6c, 0x54, 0x0d, 0x40, 0xcc, 0xc7, 0x28, 0xa8, 0xfd, 0x9c, 0x46, - 0xdf, 0xaa, 0x9b, 0xf4, 0xa4, 0x64, 0xab, 0x94, 0xc1, 0xdb, 0x3b, 0x8e, 0x84, 0x18, 0xff, 0x3e, - 0x61, 0x47, 0xd6, 0x59, 0x5e, 0x15, 0x59, 0x5c, 0x5d, 0xea, 0xfb, 0x1c, 0x7e, 0x9d, 0x1b, 0x21, - 0xbc, 0xd1, 0x71, 0xb7, 0x83, 0xb2, 0x93, 0x7a, 0x23, 0x33, 0x53, 0xcc, 0x06, 0xae, 0xda, 0x9a, - 0x66, 0x36, 0x3b, 0x39, 0xfb, 0xd0, 0x64, 0x3f, 0xce, 0x32, 0x56, 0xae, 0x1b, 0xd9, 0x51, 0x9c, - 0xa7, 0x17, 0xac, 0x12, 0xe0, 0xa1, 0x89, 0xa6, 0x46, 0x10, 0x23, 0x1e, 0x9a, 0x04, 0x70, 0xbb, - 0x6f, 0x03, 0x9e, 0x0f, 0xf2, 0x84, 0xbd, 0x06, 0xfb, 0x36, 0x68, 0x47, 0x32, 0xc4, 0xbe, 0x8d, - 0x62, 0xed, 0xc3, 0x83, 0xa7, 0x19, 0x9f, 0x5d, 0xe9, 0x25, 0xc0, 0xef, 0x60, 0x29, 0x81, 0x6b, - 0xc0, 0xed, 0x10, 0x62, 0x17, 0x01, 0x29, 0x38, 0x65, 0x45, 0x16, 0xcf, 0xe0, 0x15, 0x2e, 0xa5, - 0xa3, 0x65, 0xc4, 0x22, 0x00, 0x19, 0x50, 0x5c, 0x7d, 0x35, 0x0c, 0x2b, 0x2e, 0xb8, 0x19, 0x76, - 0x3b, 0x84, 0xd8, 0x65, 0x50, 0x0a, 0x26, 0x45, 0x96, 0x0a, 0x30, 0x0c, 0x94, 0x86, 0x94, 0x10, - 0xc3, 0xc0, 0x27, 0x80, 0xc9, 0x23, 0x56, 0xce, 0x19, 0x6a, 0x52, 0x4a, 0x82, 0x26, 0x1b, 0xc2, - 0xde, 0x57, 0x57, 0x75, 0xe7, 0xc5, 0x1a, 0xdc, 0x57, 0xd7, 0xd5, 0xe2, 0xc5, 0x9a, 0xb8, 0xaf, - 0xee, 0x01, 0xa0, 0x88, 0x27, 0x71, 0x25, 0xf0, 0x22, 0x4a, 0x49, 0xb0, 0x88, 0x0d, 0x61, 0xd7, - 0x68, 0x55, 0xc4, 0xa5, 0x00, 0x6b, 0xb4, 0x2e, 0x80, 0x73, 0x89, 0xe1, 0x26, 0x29, 0xb7, 0x33, - 0x89, 0xea, 0x15, 0x26, 0x9e, 0xa7, 0x2c, 0x4b, 0x2a, 0x30, 0x93, 0xe8, 0x76, 0x6f, 0xa4, 0xc4, - 0x4c, 0xd2, 0xa6, 0x40, 0x28, 0xe9, 0x27, 0x20, 0x58, 0xed, 0xc0, 0x03, 0x90, 0xdb, 0x21, 0xc4, - 0xce, 0x4f, 0x4d, 0xa1, 0x77, 0xe3, 0xb2, 0x4c, 0xeb, 0xc5, 0x7f, 0x03, 0x2f, 0x50, 0x23, 0x27, - 0xe6, 0x27, 0x8c, 0x03, 0xc3, 0xab, 0x99, 0xb8, 0xb1, 0x82, 0xc1, 0xa9, 0xfb, 0x83, 0x20, 0x63, - 0x33, 0x4e, 0x29, 0x71, 0x9e, 0xc2, 0x63, 0xad, 0x89, 0x3c, 0x84, 0xdf, 0xe8, 0xc2, 0x9c, 0x97, - 0xd9, 0x8c, 0x8b, 0x23, 0xbe, 0x62, 0x53, 0xfe, 0xec, 0x75, 0x5a, 0xd5, 0xdb, 0x2d, 0xbd, 0x72, - 0x3f, 0x21, 0x2c, 0x61, 0x30, 0xf1, 0x32, 0x5b, 0xa7, 0x92, 0x4d, 0x20, 0x40, 0x59, 0x8e, 0xd9, - 0x2b, 0x34, 0x81, 0x80, 0x16, 0x0d, 0x47, 0x24, 0x10, 0x21, 0xde, 0x9e, 0x98, 0x19, 0xe7, 0xfa, - 0x0b, 0x06, 0x53, 0xde, 0xe4, 0x72, 0x94, 0x35, 0x08, 0x12, 0x87, 0x16, 0x41, 0x05, 0xbb, 0xbf, - 0x34, 0xfe, 0xed, 0x10, 0xbb, 0x47, 0xd8, 0x69, 0x0f, 0xb3, 0xfb, 0x3d, 0x48, 0xc4, 0x95, 0xbd, - 0x4a, 0x42, 0xb9, 0x6a, 0xdf, 0x24, 0xb9, 0xdf, 0x83, 0x74, 0x4e, 0xdf, 0xdc, 0x6a, 0x3d, 0x8d, - 0x67, 0x57, 0xf3, 0x92, 0x2f, 0xf3, 0x64, 0x97, 0x67, 0xbc, 0x04, 0xa7, 0x6f, 0x5e, 0xa9, 0x01, - 0x4a, 0x9c, 0xbe, 0x75, 0xa8, 0xd8, 0x0c, 0xce, 0x2d, 0xc5, 0x38, 0x4b, 0xe7, 0x70, 0x47, 0xed, - 0x19, 0x92, 0x00, 0x91, 0xc1, 0xa1, 0x20, 0x12, 0x44, 0x6a, 0xc7, 0x2d, 0xd2, 0x59, 0x9c, 0x29, - 0x7f, 0x3b, 0xb4, 0x19, 0x0f, 0xec, 0x0c, 0x22, 0x44, 0x01, 0xa9, 0xe7, 0x74, 0x59, 0xe6, 0x07, - 0xb9, 0xe0, 0x64, 0x3d, 0x1b, 0xa0, 0xb3, 0x9e, 0x0e, 0x08, 0xa6, 0xd5, 0x29, 0x7b, 0x5d, 0x97, - 0xa6, 0xfe, 0x07, 0x9b, 0x56, 0xeb, 0xbf, 0x8f, 0xb4, 0x3c, 0x34, 0xad, 0x02, 0x0e, 0x54, 0x46, - 0x3b, 0x51, 0x01, 0x13, 0xd0, 0xf6, 0xc3, 0xe4, 0x5e, 0x37, 0x88, 0xfb, 0x99, 0x88, 0x75, 0xc6, - 0x42, 0x7e, 0x24, 0xd0, 0xc7, 0x4f, 0x03, 0xda, 0xe3, 0x16, 0xaf, 0x3e, 0x97, 0x6c, 0x76, 0xd5, - 0xba, 0x19, 0xe7, 0x17, 0x54, 0x21, 0xc4, 0x71, 0x0b, 0x81, 0xe2, 0x5d, 0x74, 0x30, 0xe3, 0x79, - 0xa8, 0x8b, 0x6a, 0x79, 0x9f, 0x2e, 0xd2, 0x9c, 0xdd, 0xfc, 0x1a, 0xa9, 0x8e, 0x4c, 0xd5, 0x4d, - 0x5b, 0x84, 0x05, 0x17, 0x22, 0x36, 0xbf, 0x24, 0x6c, 0x73, 0x72, 0xe8, 0xf3, 0xa8, 0xfd, 0xda, - 0x40, 0xcb, 0xca, 0x11, 0xfd, 0xda, 0x00, 0xc5, 0xd2, 0x95, 0x54, 0x31, 0xd2, 0x61, 0xc5, 0x8f, - 0x93, 0x87, 0xfd, 0x60, 0xbb, 0xe5, 0xf1, 0x7c, 0xee, 0x66, 0x2c, 0x2e, 0x95, 0xd7, 0xed, 0x80, - 0x21, 0x8b, 0x11, 0x5b, 0x9e, 0x00, 0x0e, 0xa6, 0x30, 0xcf, 0xf3, 0x2e, 0xcf, 0x05, 0xcb, 0x05, - 0x36, 0x85, 0xf9, 0xc6, 0x34, 0x18, 0x9a, 0xc2, 0x28, 0x05, 0x10, 0xb7, 0xf2, 0x3c, 0x88, 0x89, - 0xe3, 0x78, 0x81, 0x66, 0x6c, 0xea, 0xac, 0x47, 0xc9, 0x43, 0x71, 0x0b, 0x38, 0xe7, 0x71, 0xae, - 0xeb, 0x65, 0x1a, 0x97, 0x73, 0x73, 0xba, 0x91, 0x0c, 0x1f, 0xd1, 0x76, 0x7c, 0x92, 0x78, 0x9c, - 0x1b, 0xd6, 0x00, 0xd3, 0xce, 0xc1, 0x22, 0x9e, 0x9b, 0x9a, 0x22, 0x35, 0x90, 0xf2, 0x56, 0x55, - 0xef, 0x75, 0x83, 0xc0, 0xcf, 0x8b, 0x34, 0x61, 0x3c, 0xe0, 0x47, 0xca, 0xfb, 0xf8, 0x81, 0x20, - 0xc8, 0xde, 0xea, 0x7a, 0xab, 0x1d, 0xdd, 0x38, 0x4f, 0xf4, 0x3e, 0x76, 0x44, 0x34, 0x0f, 0xe0, - 0x42, 0xd9, 0x1b, 0xc1, 0x83, 0x31, 0xda, 0x1c, 0xd0, 0x86, 0xc6, 0xa8, 0x39, 0x7f, 0xed, 0x33, - 0x46, 0x31, 0x58, 0xfb, 0xfc, 0x89, 0x1e, 0xa3, 0x7b, 0xb1, 0x88, 0xeb, 0xbc, 0xfd, 0x45, 0xca, - 0x5e, 0xe9, 0x8d, 0x30, 0x52, 0xdf, 0x86, 0x1a, 0xc9, 0xb7, 0x9e, 0xc1, 0xae, 0x78, 0xa7, 0x37, - 0x1f, 0xf0, 0xad, 0x77, 0x08, 0x9d, 0xbe, 0xc1, 0x56, 0x61, 0xa7, 0x37, 0x1f, 0xf0, 0xad, 0x3f, - 0xa7, 0xd0, 0xe9, 0x1b, 0x7c, 0x53, 0x61, 0xa7, 0x37, 0xaf, 0x7d, 0xff, 0x69, 0x33, 0x70, 0x5d, - 0xe7, 0x75, 0x1e, 0x36, 0x13, 0xe9, 0x8a, 0x61, 0xe9, 0xa4, 0x6f, 0xcf, 0xa0, 0xa1, 0x74, 0x92, - 0x56, 0x71, 0x3e, 0x68, 0x86, 0x95, 0xe2, 0x84, 0x57, 0xa9, 0xbc, 0x8e, 0xf1, 0xa4, 0x87, 0xd1, - 0x06, 0x0e, 0x6d, 0x9a, 0x42, 0x4a, 0xf6, 0xc1, 0xb2, 0x87, 0xda, 0x8b, 0xf0, 0x0f, 0x03, 0xf6, - 0xda, 0xf7, 0xe1, 0xb7, 0x7b, 0xd2, 0xf6, 0x11, 0xaf, 0xc7, 0xb8, 0xcf, 0x96, 0x43, 0xbd, 0x8a, - 0x3e, 0x5e, 0x7e, 0xd4, 0x5f, 0x41, 0xbb, 0xff, 0xf3, 0x66, 0x5f, 0x01, 0xfd, 0xeb, 0x41, 0xf0, - 0xb8, 0x8f, 0x45, 0x30, 0x10, 0x9e, 0x5c, 0x4b, 0x47, 0x17, 0xe4, 0xaf, 0x9b, 0x0d, 0x74, 0x83, - 0xca, 0xd7, 0x81, 0xe4, 0x6b, 0xc4, 0x7a, 0x4c, 0x84, 0xba, 0xd5, 0xc2, 0x70, 0x64, 0x7c, 0x7c, - 0x4d, 0x2d, 0xe7, 0xf3, 0x76, 0x1e, 0xac, 0x5f, 0x5b, 0x75, 0xca, 0x13, 0xb2, 0xec, 0xd0, 0xb0, - 0x40, 0x9f, 0x5c, 0x57, 0x8d, 0x1a, 0x2b, 0x0e, 0x2c, 0x3f, 0xf0, 0xf2, 0xa4, 0xa7, 0x61, 0xef, - 0x93, 0x2f, 0x1f, 0x5d, 0x4f, 0x49, 0x97, 0xe5, 0xdf, 0x06, 0xd1, 0x5d, 0x8f, 0xb5, 0xcf, 0x13, - 0xc0, 0xa9, 0xc7, 0x0f, 0x02, 0xf6, 0x29, 0x25, 0x53, 0xb8, 0xdf, 0xf8, 0x66, 0xca, 0xf6, 0x5b, - 0x70, 0x9e, 0xca, 0xf3, 0x34, 0x13, 0xac, 0x6c, 0x7f, 0x0b, 0xce, 0xb7, 0xab, 0xa8, 0x11, 0xfd, - 0x2d, 0xb8, 0x00, 0xee, 0x7c, 0x0b, 0x0e, 0xf1, 0x8c, 0x7e, 0x0b, 0x0e, 0xb5, 0x16, 0xfc, 0x16, - 0x5c, 0x58, 0x83, 0x9a, 0xde, 0x9b, 0x22, 0xa8, 0x73, 0xeb, 0x5e, 0x16, 0xfd, 0x63, 0xec, 0xc7, - 0xd7, 0x51, 0x21, 0x16, 0x38, 0xc5, 0xc9, 0x1b, 0x8d, 0x3d, 0xda, 0xd4, 0xbb, 0xd5, 0xb8, 0xd3, - 0x9b, 0xd7, 0xbe, 0x7f, 0xac, 0x77, 0x37, 0x66, 0x3a, 0xe7, 0xa5, 0xfc, 0x0e, 0xe0, 0x56, 0x68, - 0x7a, 0xae, 0x2d, 0xb8, 0x3d, 0xff, 0xb0, 0x1f, 0x4c, 0x54, 0xb7, 0x26, 0x74, 0xa7, 0x8f, 0xba, - 0x0c, 0x81, 0x2e, 0xdf, 0xe9, 0xcd, 0x13, 0xcb, 0x88, 0xf2, 0xad, 0x7a, 0xbb, 0x87, 0x31, 0xbf, - 0xaf, 0x1f, 0xf5, 0x57, 0xd0, 0xee, 0x57, 0x3a, 0x6d, 0x74, 0xdd, 0xcb, 0x7e, 0xde, 0xee, 0x32, - 0x35, 0xf1, 0xba, 0x79, 0xd4, 0x17, 0x0f, 0x25, 0x10, 0xee, 0x12, 0xda, 0x95, 0x40, 0xa0, 0xcb, - 0xe8, 0x47, 0xd7, 0x53, 0xd2, 0x65, 0xf9, 0xbb, 0x41, 0x74, 0x93, 0x2c, 0x8b, 0x8e, 0x83, 0x4f, - 0xfa, 0x5a, 0x06, 0xf1, 0xf0, 0xe9, 0xb5, 0xf5, 0x74, 0xa1, 0xfe, 0x71, 0x10, 0xdd, 0x0a, 0x14, - 0x4a, 0x05, 0xc8, 0x35, 0xac, 0xfb, 0x81, 0xf2, 0xd9, 0xf5, 0x15, 0xa9, 0xe5, 0xde, 0xc5, 0x27, - 0xed, 0xef, 0x7a, 0x05, 0x6c, 0x4f, 0xe8, 0xef, 0x7a, 0x75, 0x6b, 0xc1, 0x43, 0x9e, 0xf8, 0xbc, - 0xd9, 0x74, 0xa1, 0x87, 0x3c, 0xf2, 0x2e, 0x62, 0xf0, 0xfb, 0x24, 0x18, 0x87, 0x39, 0x79, 0xf6, - 0xba, 0x88, 0xf3, 0x84, 0x76, 0xa2, 0xe4, 0xdd, 0x4e, 0x0c, 0x07, 0x0f, 0xc7, 0x6a, 0xe9, 0x29, - 0x6f, 0x36, 0x52, 0xf7, 0x29, 0x7d, 0x83, 0x04, 0x0f, 0xc7, 0x5a, 0x28, 0xe1, 0x4d, 0x67, 0x8d, - 0x21, 0x6f, 0x20, 0x59, 0x7c, 0xd0, 0x07, 0x05, 0x29, 0xba, 0xf1, 0x66, 0xce, 0xdc, 0x1f, 0x86, - 0xac, 0xb4, 0xce, 0xdd, 0xb7, 0x7b, 0xd2, 0x84, 0xdb, 0x09, 0x13, 0x9f, 0xb3, 0x38, 0x61, 0x65, - 0xd0, 0xad, 0xa1, 0x7a, 0xb9, 0x75, 0x69, 0xcc, 0xed, 0x2e, 0xcf, 0x96, 0x8b, 0x5c, 0x77, 0x26, - 0xe9, 0xd6, 0xa5, 0xba, 0xdd, 0x02, 0x1a, 0x1e, 0x0b, 0x5a, 0xb7, 0x32, 0xbd, 0x7c, 0x10, 0x36, - 0xe3, 0x65, 0x95, 0x5b, 0xbd, 0x58, 0xba, 0x9e, 0x3a, 0x8c, 0x3a, 0xea, 0x09, 0x22, 0x69, 0xbb, - 0x27, 0x0d, 0xcf, 0xe7, 0x1c, 0xb7, 0x26, 0x9e, 0x76, 0x3a, 0x6c, 0xb5, 0x42, 0xea, 0x51, 0x7f, - 0x05, 0x78, 0x1a, 0xaa, 0xa3, 0xea, 0x30, 0xad, 0xc4, 0xf3, 0x34, 0xcb, 0x86, 0x5b, 0x81, 0x30, - 0x69, 0xa0, 0xe0, 0x69, 0x28, 0x02, 0x13, 0x91, 0xdc, 0x9c, 0x1e, 0xe6, 0xc3, 0x2e, 0x3b, 0x92, - 0xea, 0x15, 0xc9, 0x2e, 0x0d, 0x4e, 0xb4, 0x9c, 0xa6, 0x36, 0xb5, 0x1d, 0x85, 0x1b, 0xae, 0x55, - 0xe1, 0x9d, 0xde, 0x3c, 0x78, 0xdc, 0x2e, 0x29, 0xb9, 0xb2, 0xdc, 0xa1, 0x4c, 0x78, 0x2b, 0xc9, - 0xdd, 0x0e, 0x0a, 0x9c, 0x0a, 0xaa, 0x61, 0xf4, 0x32, 0x4d, 0xe6, 0x4c, 0xa0, 0x4f, 0x8a, 0x5c, - 0x20, 0xf8, 0xa4, 0x08, 0x80, 0xa0, 0xeb, 0xd4, 0xdf, 0xcd, 0x71, 0xe8, 0x41, 0x82, 0x75, 0x9d, - 0x56, 0x76, 0xa8, 0x50, 0xd7, 0xa1, 0x34, 0x98, 0x0d, 0x8c, 0x5b, 0xfd, 0x45, 0x87, 0x07, 0x21, - 0x33, 0xe0, 0xb3, 0x0e, 0x5b, 0xbd, 0x58, 0xb0, 0xa2, 0x58, 0x87, 0xe9, 0x22, 0x15, 0xd8, 0x8a, - 0xe2, 0xd8, 0xa8, 0x91, 0xd0, 0x8a, 0xd2, 0x46, 0xa9, 0xea, 0xd5, 0x39, 0xc2, 0x41, 0x12, 0xae, - 0x9e, 0x62, 0xfa, 0x55, 0xcf, 0xb0, 0xad, 0x07, 0x9b, 0xb9, 0x09, 0x19, 0x71, 0xa9, 0x37, 0xcb, - 0x48, 0x6c, 0xcb, 0x37, 0x7d, 0x21, 0x18, 0x9a, 0x75, 0x28, 0x05, 0x78, 0x60, 0x5f, 0x73, 0xcd, - 0xb3, 0xd7, 0xa2, 0x60, 0x71, 0x19, 0xe7, 0x33, 0x74, 0x73, 0x2a, 0x0d, 0xb6, 0xc8, 0xd0, 0xe6, - 0x94, 0xd4, 0x00, 0x8f, 0xcd, 0xfd, 0x57, 0x69, 0x91, 0xa1, 0x60, 0xde, 0x59, 0xf5, 0xdf, 0xa4, - 0xbd, 0xdf, 0x83, 0x84, 0x8f, 0xcd, 0x1b, 0xc0, 0x1c, 0x7c, 0x2b, 0xa7, 0x1f, 0x06, 0x4c, 0xf9, - 0x68, 0x68, 0x23, 0x4c, 0xab, 0x80, 0xa0, 0x36, 0x09, 0x2e, 0x13, 0x3f, 0x62, 0x6b, 0x2c, 0xa8, - 0x6d, 0x7e, 0x2a, 0x91, 0x50, 0x50, 0xb7, 0x51, 0x90, 0x67, 0xba, 0xfb, 0xa0, 0x8d, 0x80, 0xbe, - 0xbb, 0xf5, 0xd9, 0xec, 0xe4, 0xc0, 0xc8, 0xd9, 0x4b, 0x57, 0xde, 0x73, 0x02, 0xa4, 0xa0, 0x7b, - 0xe9, 0x0a, 0x7f, 0x4c, 0xb0, 0xd5, 0x8b, 0x85, 0x8f, 0xe4, 0x63, 0xc1, 0x5e, 0x37, 0xcf, 0xca, - 0x91, 0xe2, 0x4a, 0x79, 0xeb, 0x61, 0xf9, 0xbd, 0x6e, 0xd0, 0x5e, 0x80, 0x3d, 0x29, 0xf9, 0x8c, - 0x55, 0x95, 0xfe, 0xd8, 0xa9, 0x7f, 0xc3, 0x48, 0xcb, 0x46, 0xe0, 0x53, 0xa7, 0x77, 0xc2, 0x90, - 0xf3, 0x85, 0x42, 0x25, 0xb2, 0x1f, 0x4e, 0xda, 0x40, 0x35, 0xdb, 0xdf, 0x4c, 0xda, 0xec, 0xe4, - 0xec, 0xf0, 0xd2, 0x52, 0xf7, 0x4b, 0x49, 0xf7, 0x50, 0x75, 0xec, 0x23, 0x49, 0xf7, 0x7b, 0x90, - 0xda, 0xd5, 0xe7, 0xd1, 0x9b, 0x87, 0x7c, 0x3e, 0x61, 0x79, 0x32, 0xfc, 0x9e, 0x7f, 0x85, 0x96, - 0xcf, 0x47, 0xf5, 0x9f, 0x8d, 0xd1, 0x1b, 0x94, 0xd8, 0x5e, 0x02, 0xdc, 0x63, 0xe7, 0xcb, 0xf9, - 0x44, 0xc4, 0x02, 0x5c, 0x02, 0x94, 0x7f, 0x1f, 0xd5, 0x02, 0xe2, 0x12, 0xa0, 0x07, 0x00, 0x7b, - 0xd3, 0x92, 0x31, 0xd4, 0x5e, 0x2d, 0x08, 0xda, 0xd3, 0x80, 0xcd, 0x22, 0x8c, 0xbd, 0x3a, 0x51, - 0x87, 0x97, 0xf6, 0xac, 0x8e, 0x94, 0x12, 0x59, 0x44, 0x9b, 0xb2, 0xc1, 0xad, 0xaa, 0x2f, 0x3f, - 0x5c, 0xb3, 0x5c, 0x2c, 0xe2, 0x72, 0x0d, 0x82, 0x5b, 0xd7, 0xd2, 0x01, 0x88, 0xe0, 0x46, 0x41, - 0x3b, 0x6a, 0x9b, 0x66, 0x9e, 0x5d, 0xed, 0xf3, 0x92, 0x2f, 0x45, 0x9a, 0x33, 0xf8, 0xf1, 0x12, - 0xd3, 0xa0, 0x2e, 0x43, 0x8c, 0x5a, 0x8a, 0xb5, 0x59, 0xae, 0x24, 0xd4, 0x7d, 0x42, 0xf9, 0xfd, - 0xf5, 0x4a, 0xf0, 0x12, 0x3e, 0x4f, 0x54, 0x56, 0x20, 0x44, 0x64, 0xb9, 0x24, 0x0c, 0xfa, 0xfe, - 0x24, 0xcd, 0xe7, 0x68, 0xdf, 0x9f, 0xb8, 0x1f, 0x10, 0xbe, 0x45, 0x03, 0x76, 0x40, 0xa9, 0x46, - 0x53, 0x03, 0x40, 0xbf, 0xb5, 0x8b, 0x36, 0xba, 0x4b, 0x10, 0x03, 0x0a, 0x27, 0x81, 0xab, 0x2f, - 0x0a, 0x96, 0xb3, 0xa4, 0xb9, 0x35, 0x87, 0xb9, 0xf2, 0x88, 0xa0, 0x2b, 0x48, 0xda, 0xb9, 0x48, - 0xca, 0x4f, 0x97, 0xf9, 0x49, 0xc9, 0x2f, 0xd2, 0x8c, 0x95, 0x60, 0x2e, 0x52, 0xea, 0x8e, 0x9c, - 0x98, 0x8b, 0x30, 0xce, 0x5e, 0xbf, 0x90, 0x52, 0xef, 0x47, 0x04, 0xa6, 0x65, 0x3c, 0x83, 0xd7, - 0x2f, 0x94, 0x8d, 0x36, 0x46, 0x9c, 0x0c, 0x06, 0x70, 0x27, 0xd1, 0x51, 0xae, 0xf3, 0xb5, 0x8c, - 0x0f, 0xfd, 0xd6, 0xa8, 0xfc, 0xac, 0x6e, 0x05, 0x12, 0x1d, 0x6d, 0x0e, 0x23, 0x89, 0x44, 0x27, - 0xac, 0x61, 0x97, 0x12, 0xc9, 0x1d, 0xeb, 0x6b, 0x45, 0x60, 0x29, 0x51, 0x36, 0x1a, 0x21, 0xb1, - 0x94, 0xb4, 0x20, 0x30, 0x21, 0x35, 0xc3, 0x60, 0x8e, 0x4e, 0x48, 0x46, 0x1a, 0x9c, 0x90, 0x5c, - 0xca, 0x4e, 0x14, 0x07, 0x79, 0x2a, 0xd2, 0x38, 0x9b, 0x30, 0x71, 0x12, 0x97, 0xf1, 0x82, 0x09, - 0x56, 0xc2, 0x89, 0x42, 0x23, 0x23, 0x8f, 0x21, 0x26, 0x0a, 0x8a, 0xd5, 0x0e, 0x7f, 0x33, 0x7a, - 0xbb, 0x5e, 0xf7, 0x59, 0xae, 0x7f, 0xfe, 0xe8, 0x99, 0xfc, 0xdd, 0xb4, 0xe1, 0x3b, 0xc6, 0xc6, - 0x44, 0x94, 0x2c, 0x5e, 0x34, 0xb6, 0xdf, 0x32, 0x7f, 0x97, 0xe0, 0xa3, 0x41, 0x1d, 0xcf, 0xc7, - 0x5c, 0xa4, 0x17, 0xf5, 0x36, 0x5b, 0xbf, 0x41, 0x04, 0xe2, 0xd9, 0x15, 0x8f, 0x02, 0x5f, 0x1d, - 0xc1, 0x38, 0x3b, 0x4f, 0xbb, 0xd2, 0x53, 0x56, 0x64, 0x70, 0x9e, 0xf6, 0xb4, 0x25, 0x40, 0xcc, - 0xd3, 0x28, 0x68, 0x07, 0xa7, 0x2b, 0x9e, 0xb2, 0x70, 0x65, 0xa6, 0xac, 0x5f, 0x65, 0xa6, 0xde, - 0x4b, 0x19, 0x59, 0xf4, 0xf6, 0x11, 0x5b, 0x9c, 0xb3, 0xb2, 0xba, 0x4c, 0x0b, 0xea, 0xd3, 0xbf, - 0x96, 0xe8, 0xfc, 0xf4, 0x2f, 0x81, 0xda, 0x95, 0xc0, 0x02, 0x07, 0xd5, 0x71, 0xbc, 0x60, 0xf2, - 0x1b, 0x2a, 0x60, 0x25, 0x70, 0x8c, 0x38, 0x10, 0xb1, 0x12, 0x90, 0xb0, 0xf3, 0x7e, 0x97, 0x65, - 0x4e, 0xd9, 0xbc, 0x8e, 0xb0, 0xf2, 0x24, 0x5e, 0x2f, 0x58, 0x2e, 0xb4, 0x49, 0x70, 0x26, 0xef, - 0x98, 0xc4, 0x79, 0xe2, 0x4c, 0xbe, 0x8f, 0x9e, 0x33, 0x35, 0x79, 0x0d, 0x7f, 0xc2, 0x4b, 0xa1, - 0x7e, 0xdc, 0xec, 0xac, 0xcc, 0xc0, 0xd4, 0xe4, 0x37, 0xaa, 0x47, 0x12, 0x53, 0x53, 0x58, 0xc3, - 0xf9, 0x21, 0x0b, 0xaf, 0x0c, 0x2f, 0x58, 0x69, 0xe2, 0xe4, 0xd9, 0x22, 0x4e, 0x33, 0x1d, 0x0d, - 0xdf, 0x0f, 0xd8, 0x26, 0x74, 0x88, 0x1f, 0xb2, 0xe8, 0xab, 0xeb, 0xfc, 0xf4, 0x47, 0xb8, 0x84, - 0xe0, 0x11, 0x41, 0x87, 0x7d, 0xe2, 0x11, 0x41, 0xb7, 0x96, 0xdd, 0xb9, 0x5b, 0x56, 0x72, 0x6b, - 0x49, 0xec, 0xf2, 0x04, 0x9e, 0x17, 0x3a, 0x36, 0x01, 0x48, 0xec, 0xdc, 0x83, 0x0a, 0x36, 0x35, - 0xb0, 0xd8, 0xf3, 0x34, 0x8f, 0xb3, 0xf4, 0x27, 0x30, 0xad, 0x77, 0xec, 0x34, 0x04, 0x91, 0x1a, - 0xe0, 0x24, 0xe6, 0x6a, 0x9f, 0x89, 0x69, 0x5a, 0x4f, 0xfd, 0xf7, 0x02, 0xed, 0x26, 0x89, 0x6e, - 0x57, 0x0e, 0xe9, 0x7c, 0xe6, 0x17, 0x36, 0xeb, 0xb8, 0x28, 0x26, 0xf5, 0xaa, 0x7a, 0xca, 0x66, - 0x2c, 0x2d, 0xc4, 0xf0, 0xe3, 0x70, 0x5b, 0x01, 0x9c, 0xb8, 0x68, 0xd1, 0x43, 0xcd, 0x79, 0x7c, - 0x5f, 0xcf, 0x25, 0x13, 0xf5, 0xab, 0x9f, 0x67, 0x15, 0x2b, 0x75, 0xa2, 0xb1, 0xcf, 0x04, 0x18, - 0x9d, 0x0e, 0x37, 0x72, 0xc0, 0xba, 0xa2, 0xc4, 0xe8, 0x0c, 0x6b, 0xd8, 0xc3, 0x3e, 0x87, 0xd3, - 0x9f, 0x6d, 0x97, 0xf7, 0x0d, 0x1f, 0x92, 0xc6, 0x1c, 0x8a, 0x38, 0xec, 0xa3, 0x69, 0x9b, 0xad, - 0xb5, 0xdd, 0x8e, 0xf3, 0xf5, 0x01, 0xbc, 0x32, 0x81, 0x58, 0x92, 0x18, 0x91, 0xad, 0x05, 0x70, - 0xe7, 0x30, 0xbc, 0xe4, 0x71, 0x32, 0x8b, 0x2b, 0x71, 0x12, 0xaf, 0x33, 0x1e, 0x27, 0x72, 0x5d, - 0x87, 0x87, 0xe1, 0x0d, 0x33, 0x72, 0x21, 0xea, 0x30, 0x9c, 0x82, 0xdd, 0xec, 0x4c, 0xfe, 0x98, - 0xa9, 0xbe, 0xcb, 0x09, 0xb3, 0x33, 0x59, 0x5e, 0x78, 0x8f, 0xf3, 0x4e, 0x18, 0xb2, 0xef, 0xa0, - 0x29, 0x91, 0x4c, 0x43, 0x6e, 0x61, 0x3a, 0x5e, 0x02, 0xf2, 0x7e, 0x80, 0xb0, 0x5f, 0x20, 0x51, - 0x7f, 0x6f, 0x7e, 0xbf, 0x4a, 0xe8, 0x8f, 0xa1, 0x3f, 0xc4, 0x74, 0x5d, 0x68, 0xe4, 0x7e, 0xc8, - 0x62, 0xbb, 0x27, 0x6d, 0xd3, 0xcc, 0xdd, 0xcb, 0x58, 0x8c, 0x93, 0xe4, 0x88, 0x55, 0xc8, 0x0b, - 0xe5, 0xb5, 0x70, 0x64, 0xa5, 0x44, 0x9a, 0xd9, 0xa6, 0x6c, 0xa0, 0xd7, 0xb2, 0x67, 0x49, 0x2a, - 0xb4, 0xac, 0xb9, 0x21, 0xfd, 0xb0, 0x6d, 0xa0, 0x4d, 0x11, 0xb5, 0xa2, 0x69, 0x3b, 0x97, 0xd7, - 0xcc, 0x94, 0xcf, 0xe7, 0x19, 0xd3, 0xd0, 0x29, 0x8b, 0xd5, 0xb7, 0x20, 0x77, 0xda, 0xb6, 0x50, - 0x90, 0x98, 0xcb, 0x83, 0x0a, 0x36, 0x8d, 0xac, 0x31, 0xf5, 0x48, 0xaa, 0x69, 0xd8, 0xcd, 0xb6, - 0x19, 0x0f, 0x20, 0xd2, 0x48, 0x14, 0xb4, 0xef, 0xbd, 0xd5, 0xe2, 0x7d, 0xd6, 0xb4, 0x04, 0xfc, - 0xd8, 0x94, 0x54, 0x76, 0xc4, 0xc4, 0x7b, 0x6f, 0x08, 0x66, 0xf7, 0x09, 0xc0, 0xc3, 0xd3, 0xf5, - 0x41, 0x02, 0xf7, 0x09, 0x50, 0x5f, 0x32, 0xc4, 0x3e, 0x81, 0x62, 0xfd, 0xae, 0x33, 0xe7, 0x5e, - 0x87, 0x71, 0x65, 0x2b, 0x87, 0x74, 0x1d, 0x0a, 0x86, 0xba, 0x8e, 0x52, 0xf0, 0x9b, 0xd4, 0x3d, - 0x5a, 0x43, 0x9a, 0x14, 0x3b, 0x57, 0xdb, 0xe8, 0xc2, 0x6c, 0xee, 0x5f, 0x0b, 0x4f, 0x59, 0x9c, - 0x98, 0x8a, 0x21, 0xba, 0xae, 0x9c, 0xc8, 0xfd, 0x31, 0x4e, 0x3b, 0xf9, 0x9d, 0x68, 0xa8, 0xaa, - 0x51, 0xba, 0x6e, 0x6e, 0x61, 0x45, 0xac, 0x09, 0x62, 0xa2, 0xf2, 0x09, 0x27, 0x71, 0xf3, 0xba, - 0x68, 0xca, 0xb5, 0x03, 0xfd, 0x5e, 0x66, 0x05, 0x12, 0x37, 0xbf, 0xd9, 0x5b, 0x34, 0x91, 0xb8, - 0x75, 0x6b, 0xd9, 0x79, 0xde, 0xec, 0xcf, 0xe5, 0x15, 0x30, 0xfc, 0x47, 0x35, 0x94, 0x90, 0x98, - 0xe7, 0x5b, 0x90, 0xb2, 0xfd, 0xf4, 0xfd, 0xff, 0xf8, 0xea, 0xc6, 0xe0, 0x67, 0x5f, 0xdd, 0x18, - 0xfc, 0xf7, 0x57, 0x37, 0x06, 0x3f, 0xfd, 0xfa, 0xc6, 0x1b, 0x3f, 0xfb, 0xfa, 0xc6, 0x1b, 0xff, - 0xf5, 0xf5, 0x8d, 0x37, 0xbe, 0x7c, 0x53, 0xff, 0x68, 0xf8, 0xf9, 0xff, 0x93, 0x3f, 0xfd, 0xfd, - 0xe4, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x14, 0xc2, 0x04, 0x4c, 0x58, 0x7c, 0x00, 0x00, + // 5713 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x9d, 0xdd, 0x6f, 0x24, 0x49, + 0x52, 0xc0, 0xd7, 0x2f, 0x2c, 0xd4, 0x71, 0x0b, 0xf4, 0xc2, 0xb2, 0xb7, 0xdc, 0xcd, 0xcc, 0xce, + 0x87, 0x3d, 0x33, 0x1e, 0xb7, 0x67, 0x67, 0xf6, 0x8b, 0x3b, 0x24, 0xe8, 0xb1, 0xc7, 0xde, 0xbe, + 0xb5, 0xbd, 0xc6, 0xdd, 0x9e, 0x11, 0x2b, 0x21, 0x51, 0xee, 0x4a, 0xb7, 0x0b, 0x57, 0x57, 0xd6, + 0x55, 0x65, 0x7b, 0xa6, 0x0f, 0x81, 0x40, 0x20, 0x10, 0x08, 0xc4, 0x89, 0x2f, 0xc1, 0x13, 0x12, + 0x7f, 0x01, 0x7f, 0x06, 0x8f, 0xf7, 0x78, 0x8f, 0x68, 0xf7, 0xef, 0x40, 0x42, 0x95, 0x95, 0x9f, + 0x51, 0x11, 0x59, 0xe5, 0xbd, 0xa7, 0x19, 0x39, 0x7e, 0x11, 0x91, 0x1f, 0x91, 0x99, 0x91, 0x59, + 0x59, 0xd5, 0xd1, 0xcd, 0xe2, 0x6c, 0xbb, 0x28, 0xb9, 0xe0, 0xd5, 0x76, 0xc5, 0xca, 0xab, 0x74, + 0xc6, 0xf4, 0xbf, 0x43, 0xf9, 0xe7, 0xc1, 0x9b, 0x71, 0xbe, 0x12, 0xab, 0x82, 0xbd, 0xf7, 0xae, + 0x25, 0x67, 0x7c, 0xb1, 0x88, 0xf3, 0xa4, 0x6a, 0x90, 0xf7, 0xde, 0xb1, 0x12, 0x76, 0xc5, 0x72, + 0xa1, 0xfe, 0xfe, 0xe4, 0x67, 0xff, 0xb7, 0x16, 0xbd, 0xb5, 0x93, 0xa5, 0x2c, 0x17, 0x3b, 0x4a, + 0x63, 0xf0, 0x65, 0xf4, 0xed, 0x51, 0x51, 0xec, 0x33, 0xf1, 0x82, 0x95, 0x55, 0xca, 0xf3, 0xc1, + 0x9d, 0xa1, 0x72, 0x30, 0x3c, 0x29, 0x66, 0xc3, 0x51, 0x51, 0x0c, 0xad, 0x70, 0x78, 0xc2, 0x7e, + 0xb4, 0x64, 0x95, 0x78, 0xef, 0x6e, 0x18, 0xaa, 0x0a, 0x9e, 0x57, 0x6c, 0x70, 0x1e, 0xfd, 0xda, + 0xa8, 0x28, 0x26, 0x4c, 0xec, 0xb2, 0xba, 0x02, 0x13, 0x11, 0x0b, 0x36, 0xd8, 0x68, 0xa9, 0xfa, + 0x80, 0xf1, 0x71, 0xbf, 0x1b, 0x54, 0x7e, 0xa6, 0xd1, 0xb7, 0x6a, 0x3f, 0x17, 0x4b, 0x91, 0xf0, + 0x57, 0xf9, 0xe0, 0xfd, 0xb6, 0xa2, 0x12, 0x19, 0xdb, 0xb7, 0x43, 0x88, 0xb2, 0xfa, 0x32, 0xfa, + 0xe5, 0x97, 0x71, 0x96, 0x31, 0xb1, 0x53, 0xb2, 0xba, 0xe0, 0xbe, 0x4e, 0x23, 0x1a, 0x36, 0x32, + 0x63, 0xf7, 0x4e, 0x90, 0x51, 0x86, 0xbf, 0x8c, 0xbe, 0xdd, 0x48, 0x4e, 0xd8, 0x8c, 0x5f, 0xb1, + 0x72, 0x80, 0x6a, 0x29, 0x21, 0xd1, 0xe4, 0x2d, 0x08, 0xda, 0xde, 0xe1, 0xf9, 0x15, 0x2b, 0x05, + 0x6e, 0x5b, 0x09, 0xc3, 0xb6, 0x2d, 0xa4, 0x6c, 0xff, 0xed, 0x5a, 0xf4, 0xdd, 0xd1, 0x6c, 0xc6, + 0x97, 0xb9, 0x38, 0xe0, 0xb3, 0x38, 0x3b, 0x48, 0xf3, 0xcb, 0x23, 0xf6, 0x6a, 0xe7, 0xa2, 0xe6, + 0xf3, 0x39, 0x1b, 0x3c, 0xf5, 0x5b, 0xb5, 0x41, 0x87, 0x86, 0x1d, 0xba, 0xb0, 0xf1, 0xfd, 0xe1, + 0xf5, 0x94, 0x54, 0x59, 0xfe, 0x71, 0x2d, 0xba, 0x01, 0xcb, 0x32, 0xe1, 0xd9, 0x15, 0xb3, 0xa5, + 0xf9, 0xa8, 0xc3, 0xb0, 0x8f, 0x9b, 0xf2, 0x7c, 0x7c, 0x5d, 0x35, 0x55, 0xa2, 0x2c, 0x7a, 0xdb, + 0x0d, 0x97, 0x09, 0xab, 0xe4, 0x70, 0x7a, 0x40, 0x47, 0x84, 0x42, 0x8c, 0xe7, 0x87, 0x7d, 0x50, + 0xe5, 0x2d, 0x8d, 0x06, 0xca, 0x5b, 0xc6, 0x2b, 0xe3, 0xec, 0x3e, 0x6a, 0xc1, 0x21, 0x8c, 0xaf, + 0x07, 0x3d, 0x48, 0xe5, 0xea, 0x8f, 0xa2, 0x5f, 0x79, 0xc9, 0xcb, 0xcb, 0xaa, 0x88, 0x67, 0x4c, + 0x0d, 0x85, 0x7b, 0xbe, 0xb6, 0x96, 0xc2, 0xd1, 0xb0, 0xde, 0x85, 0x39, 0x41, 0xab, 0x85, 0x5f, + 0x14, 0x0c, 0xce, 0x41, 0x56, 0xb1, 0x16, 0x52, 0x41, 0x0b, 0x21, 0x65, 0xfb, 0x32, 0x1a, 0x58, + 0xdb, 0x67, 0x7f, 0xcc, 0x66, 0x62, 0x94, 0x24, 0xb0, 0x57, 0xac, 0xae, 0x24, 0x86, 0xa3, 0x24, + 0xa1, 0x7a, 0x05, 0x47, 0x95, 0xb3, 0x57, 0xd1, 0x3b, 0xc0, 0xd9, 0x41, 0x5a, 0x49, 0x87, 0x5b, + 0x61, 0x2b, 0x0a, 0x33, 0x4e, 0x87, 0x7d, 0x71, 0xe5, 0xf8, 0xcf, 0xd7, 0xa2, 0xef, 0x20, 0x9e, + 0x4f, 0xd8, 0x82, 0x5f, 0xb1, 0xc1, 0xe3, 0x6e, 0x6b, 0x0d, 0x69, 0xfc, 0x7f, 0x70, 0x0d, 0x0d, + 0x24, 0x4c, 0x26, 0x2c, 0x63, 0x33, 0x41, 0x86, 0x49, 0x23, 0xee, 0x0c, 0x13, 0x83, 0x39, 0x23, + 0x4c, 0x0b, 0xf7, 0x99, 0xd8, 0x59, 0x96, 0x25, 0xcb, 0x05, 0xd9, 0x97, 0x16, 0xe9, 0xec, 0x4b, + 0x0f, 0x45, 0xea, 0xb3, 0xcf, 0xc4, 0x28, 0xcb, 0xc8, 0xfa, 0x34, 0xe2, 0xce, 0xfa, 0x18, 0x4c, + 0x79, 0x98, 0x45, 0xbf, 0xea, 0xb4, 0x98, 0x18, 0xe7, 0xe7, 0x7c, 0x40, 0xb7, 0x85, 0x94, 0x1b, + 0x1f, 0x1b, 0x9d, 0x1c, 0x52, 0x8d, 0xe7, 0xaf, 0x0b, 0x5e, 0xd2, 0xdd, 0xd2, 0x88, 0x3b, 0xab, + 0x61, 0x30, 0xe5, 0xe1, 0x0f, 0xa3, 0xb7, 0xd4, 0x2c, 0xa9, 0xd7, 0xb3, 0xbb, 0xe8, 0x14, 0x0a, + 0x17, 0xb4, 0x7b, 0x1d, 0x54, 0xcb, 0xfc, 0x61, 0x3a, 0x2f, 0xeb, 0xd9, 0x07, 0x37, 0xaf, 0xa4, + 0x1d, 0xe6, 0x2d, 0xa5, 0xcc, 0xf3, 0xe8, 0xd7, 0x7d, 0xf3, 0x3b, 0x71, 0x3e, 0x63, 0xd9, 0xe0, + 0x61, 0x48, 0xbd, 0x61, 0x8c, 0xab, 0xcd, 0x5e, 0xac, 0x9d, 0xec, 0x14, 0xa1, 0x26, 0xd3, 0x3b, + 0xa8, 0x36, 0x98, 0x4a, 0xef, 0x86, 0xa1, 0x96, 0xed, 0x5d, 0x96, 0x31, 0xd2, 0x76, 0x23, 0xec, + 0xb0, 0x6d, 0x20, 0x65, 0xbb, 0x8c, 0x7e, 0xc3, 0x74, 0x73, 0x9d, 0x17, 0x48, 0x79, 0xbd, 0xe8, + 0x6c, 0x12, 0xfd, 0xe8, 0x42, 0xc6, 0xd7, 0xa3, 0x7e, 0x70, 0xab, 0x3e, 0x6a, 0x46, 0xc1, 0xeb, + 0x03, 0xe6, 0x93, 0xbb, 0x61, 0x48, 0xd9, 0xfe, 0xbb, 0xb5, 0xe8, 0x7b, 0x4a, 0xf6, 0x3c, 0x8f, + 0xcf, 0x32, 0x26, 0x97, 0xf8, 0x23, 0x26, 0x5e, 0xf1, 0xf2, 0x72, 0xb2, 0xca, 0x67, 0x44, 0x3a, + 0x83, 0xc3, 0x1d, 0xe9, 0x0c, 0xa9, 0xa4, 0x0a, 0xf3, 0x27, 0xd1, 0xbb, 0x3a, 0x28, 0x2e, 0xe2, + 0x7c, 0xce, 0x7e, 0x58, 0xf1, 0x7c, 0x54, 0xa4, 0xa3, 0x24, 0x29, 0x07, 0x43, 0xbc, 0xeb, 0x21, + 0x67, 0x4a, 0xb0, 0xdd, 0x9b, 0x77, 0xd2, 0x67, 0xd5, 0xca, 0x82, 0x17, 0x30, 0x7d, 0xd6, 0xcd, + 0x27, 0x78, 0x41, 0xa5, 0xcf, 0x3e, 0xd2, 0xb2, 0x7a, 0x58, 0xaf, 0x41, 0xb8, 0xd5, 0x43, 0x77, + 0xd1, 0xb9, 0x1d, 0x42, 0xec, 0x1a, 0xa0, 0x1b, 0x8a, 0xe7, 0xe7, 0xe9, 0xfc, 0xb4, 0x48, 0xea, + 0x31, 0xf4, 0x00, 0xaf, 0xb3, 0x83, 0x10, 0x6b, 0x00, 0x81, 0x2a, 0x6f, 0xff, 0x60, 0xb3, 0x4c, + 0x35, 0x2f, 0xed, 0x95, 0x7c, 0x71, 0xc0, 0xe6, 0xf1, 0x6c, 0xa5, 0x26, 0xd3, 0x0f, 0x43, 0xb3, + 0x18, 0xa4, 0x4d, 0x21, 0x3e, 0xba, 0xa6, 0x96, 0x2a, 0xcf, 0x7f, 0xae, 0x45, 0x77, 0xbd, 0x38, + 0x51, 0xc1, 0xd4, 0x94, 0x7e, 0x94, 0x27, 0x27, 0xac, 0x12, 0x71, 0x29, 0x06, 0xdf, 0x0f, 0xc4, + 0x00, 0xa1, 0x63, 0xca, 0xf6, 0x83, 0x6f, 0xa4, 0x6b, 0x7b, 0x7d, 0x52, 0xaf, 0x12, 0x6a, 0xfe, + 0xf1, 0x7b, 0x5d, 0x4a, 0xe0, 0xec, 0x73, 0x3b, 0x84, 0xd8, 0x5e, 0x97, 0x82, 0x71, 0x7e, 0x95, + 0x0a, 0xb6, 0xcf, 0x72, 0x56, 0xb6, 0x7b, 0xbd, 0x51, 0xf5, 0x11, 0xa2, 0xd7, 0x09, 0xd4, 0xce, + 0x74, 0x9e, 0x37, 0x93, 0x69, 0x6c, 0x06, 0x8c, 0xb4, 0x72, 0x8d, 0x47, 0xfd, 0x60, 0xa2, 0x86, + 0x62, 0xbf, 0x36, 0x12, 0xac, 0x61, 0x83, 0xf4, 0xaa, 0xa1, 0x41, 0xed, 0xc6, 0xdc, 0xf1, 0x76, + 0xc2, 0xae, 0xf8, 0x25, 0xdc, 0x98, 0xbb, 0x06, 0x1a, 0x80, 0xd8, 0x98, 0xa3, 0xa0, 0x4d, 0x3e, + 0x1c, 0x3f, 0x2f, 0x52, 0xf6, 0x0a, 0x24, 0x1f, 0xae, 0x72, 0x2d, 0x26, 0x92, 0x0f, 0x04, 0x53, + 0x1e, 0x8e, 0xa2, 0x5f, 0x92, 0xc2, 0x1f, 0xf2, 0x34, 0x1f, 0xdc, 0x44, 0x94, 0x6a, 0x81, 0xb1, + 0x7a, 0x8b, 0x06, 0x40, 0x89, 0xeb, 0xbf, 0xaa, 0x4c, 0xe0, 0x1e, 0xa1, 0x04, 0x92, 0x80, 0xf5, + 0x2e, 0xcc, 0x66, 0x7d, 0x52, 0x58, 0xcf, 0x96, 0x93, 0x8b, 0xb8, 0x4c, 0xf3, 0xf9, 0x00, 0xd3, + 0x75, 0xe4, 0x44, 0xd6, 0x87, 0x71, 0x20, 0x9c, 0x94, 0xe2, 0xa8, 0x28, 0xca, 0x7a, 0x12, 0xc6, + 0xc2, 0xc9, 0x47, 0x82, 0xe1, 0xd4, 0x42, 0x71, 0x6f, 0xbb, 0x6c, 0x96, 0xa5, 0x79, 0xd0, 0x9b, + 0x42, 0xfa, 0x78, 0xb3, 0x28, 0x08, 0xde, 0x03, 0x16, 0x5f, 0x31, 0x5d, 0x33, 0xac, 0x65, 0x5c, + 0x20, 0x18, 0xbc, 0x00, 0xb4, 0x5b, 0x6c, 0x29, 0x3e, 0x8c, 0x2f, 0x59, 0xdd, 0xc0, 0xac, 0x5e, + 0xc2, 0x07, 0x98, 0xbe, 0x47, 0x10, 0x5b, 0x6c, 0x9c, 0x54, 0xae, 0x96, 0xd1, 0x3b, 0x52, 0x7e, + 0x1c, 0x97, 0x22, 0x9d, 0xa5, 0x45, 0x9c, 0xeb, 0xad, 0x1b, 0x36, 0x8b, 0xb4, 0x28, 0xe3, 0x72, + 0xab, 0x27, 0xad, 0xdc, 0xfe, 0xdb, 0x5a, 0xf4, 0x3e, 0xf4, 0x7b, 0xcc, 0xca, 0x45, 0x2a, 0x4f, + 0x00, 0xaa, 0x66, 0xca, 0x1f, 0x7c, 0x12, 0x36, 0xda, 0x52, 0x30, 0xa5, 0xf9, 0xf4, 0xfa, 0x8a, + 0x36, 0xef, 0x9b, 0xa8, 0x5d, 0xd1, 0x17, 0x65, 0xd2, 0x3a, 0x21, 0x9b, 0xe8, 0xad, 0x8e, 0x14, + 0x12, 0x79, 0x5f, 0x0b, 0x02, 0x23, 0xfc, 0x34, 0xaf, 0xb4, 0x75, 0x6c, 0x84, 0x5b, 0x71, 0x70, + 0x84, 0x7b, 0x98, 0x1d, 0xe1, 0xc7, 0xcb, 0xb3, 0x2c, 0xad, 0x2e, 0xd2, 0x7c, 0xae, 0x92, 0x7c, + 0x5f, 0xd7, 0x8a, 0x61, 0x9e, 0xbf, 0xd1, 0xc9, 0x61, 0x4e, 0x54, 0xb0, 0x90, 0x4e, 0x40, 0x98, + 0x6c, 0x74, 0x72, 0x76, 0xef, 0x65, 0xa5, 0xf5, 0xa6, 0x1f, 0xec, 0xbd, 0x1c, 0xd5, 0x5a, 0x4a, + 0xec, 0xbd, 0xda, 0x94, 0xdd, 0x7b, 0xb9, 0x75, 0xa8, 0x78, 0x76, 0xc5, 0x4e, 0xcb, 0x14, 0xec, + 0xbd, 0xbc, 0xf2, 0x69, 0x86, 0xd8, 0x7b, 0x51, 0xac, 0x9d, 0xa8, 0x2c, 0xb1, 0xcf, 0xc4, 0x44, + 0xc4, 0x62, 0x59, 0x81, 0x89, 0xca, 0xb1, 0x61, 0x10, 0x62, 0xa2, 0x22, 0x50, 0xe5, 0xed, 0xf7, + 0xa3, 0xa8, 0x39, 0x2f, 0x91, 0x67, 0x5a, 0xfe, 0xda, 0xa3, 0x0e, 0x52, 0xbc, 0x03, 0xad, 0xf7, + 0x03, 0x84, 0x4d, 0xaf, 0x9a, 0xbf, 0xcb, 0xa3, 0xba, 0x01, 0xaa, 0x21, 0x45, 0x44, 0x7a, 0x05, + 0x10, 0x58, 0xd0, 0xc9, 0x05, 0x7f, 0x85, 0x17, 0xb4, 0x96, 0x84, 0x0b, 0xaa, 0x08, 0x7b, 0x78, + 0xae, 0x0a, 0x8a, 0x1d, 0x9e, 0xeb, 0x62, 0x84, 0x0e, 0xcf, 0x21, 0x63, 0x63, 0xc6, 0x35, 0xfc, + 0x8c, 0xf3, 0xcb, 0x45, 0x5c, 0x5e, 0x82, 0x98, 0xf1, 0x94, 0x35, 0x43, 0xc4, 0x0c, 0xc5, 0xda, + 0x98, 0x71, 0x1d, 0xd6, 0xc9, 0xf9, 0x69, 0x99, 0x81, 0x98, 0xf1, 0x6c, 0x28, 0x84, 0x88, 0x19, + 0x02, 0xb5, 0xb3, 0x93, 0xeb, 0x6d, 0xc2, 0xe0, 0x71, 0x8d, 0xa7, 0x3e, 0x61, 0xd4, 0x71, 0x0d, + 0x82, 0xc1, 0x10, 0xda, 0x2f, 0xe3, 0xe2, 0x02, 0x0f, 0x21, 0x29, 0x0a, 0x87, 0x90, 0x46, 0x60, + 0x7f, 0x4f, 0x58, 0x5c, 0xce, 0x2e, 0xf0, 0xfe, 0x6e, 0x64, 0xe1, 0xfe, 0x36, 0x0c, 0xec, 0xef, + 0x46, 0xf0, 0x32, 0x15, 0x17, 0x87, 0x4c, 0xc4, 0x78, 0x7f, 0xfb, 0x4c, 0xb8, 0xbf, 0x5b, 0xac, + 0xcd, 0xfe, 0x5d, 0x87, 0x93, 0xe5, 0x59, 0x35, 0x2b, 0xd3, 0x33, 0x36, 0x08, 0x58, 0x31, 0x10, + 0x91, 0xfd, 0x93, 0xb0, 0xf2, 0xf9, 0x93, 0xb5, 0xe8, 0xa6, 0xee, 0x76, 0x5e, 0x55, 0x6a, 0xed, + 0xf3, 0xdd, 0x7f, 0x84, 0xf7, 0x2f, 0x81, 0x13, 0x8f, 0x33, 0x7a, 0xa8, 0x39, 0xb9, 0x01, 0x5e, + 0xa4, 0xd3, 0xbc, 0x32, 0x85, 0xfa, 0xa4, 0x8f, 0x75, 0x47, 0x81, 0xc8, 0x0d, 0x7a, 0x29, 0xda, + 0xb4, 0x4c, 0xf5, 0x8f, 0x96, 0x8d, 0x93, 0x0a, 0xa4, 0x65, 0xba, 0xbd, 0x1d, 0x82, 0x48, 0xcb, + 0x70, 0x12, 0x86, 0xc2, 0x7e, 0xc9, 0x97, 0x45, 0xd5, 0x11, 0x0a, 0x00, 0x0a, 0x87, 0x42, 0x1b, + 0x56, 0x3e, 0x5f, 0x47, 0xbf, 0xe9, 0x86, 0x9f, 0xdb, 0xd8, 0x5b, 0x74, 0x4c, 0x61, 0x4d, 0x3c, + 0xec, 0x8b, 0xdb, 0x8c, 0x42, 0x7b, 0x16, 0xbb, 0x4c, 0xc4, 0x69, 0x56, 0x0d, 0xd6, 0x71, 0x1b, + 0x5a, 0x4e, 0x64, 0x14, 0x18, 0x07, 0xe7, 0xb7, 0xdd, 0x65, 0x91, 0xa5, 0xb3, 0xf6, 0xc3, 0x24, + 0xa5, 0x6b, 0xc4, 0xe1, 0xf9, 0xcd, 0xc5, 0xe0, 0x7c, 0x5d, 0xa7, 0x7e, 0xf2, 0x3f, 0xd3, 0x55, + 0xc1, 0xf0, 0xf9, 0xda, 0x43, 0xc2, 0xf3, 0x35, 0x44, 0x61, 0x7d, 0x26, 0x4c, 0x1c, 0xc4, 0x2b, + 0xbe, 0x24, 0xe6, 0x6b, 0x23, 0x0e, 0xd7, 0xc7, 0xc5, 0xec, 0xde, 0xc0, 0x78, 0x18, 0xe7, 0x82, + 0x95, 0x79, 0x9c, 0xed, 0x65, 0xf1, 0xbc, 0x1a, 0x10, 0x73, 0x8c, 0x4f, 0x11, 0x7b, 0x03, 0x9a, + 0x46, 0x9a, 0x71, 0x5c, 0xed, 0xc5, 0x57, 0xbc, 0x4c, 0x05, 0xdd, 0x8c, 0x16, 0xe9, 0x6c, 0x46, + 0x0f, 0x45, 0xbd, 0x8d, 0xca, 0xd9, 0x45, 0x7a, 0xc5, 0x92, 0x80, 0x37, 0x8d, 0xf4, 0xf0, 0xe6, + 0xa0, 0x48, 0xa7, 0x4d, 0xf8, 0xb2, 0x9c, 0x31, 0xb2, 0xd3, 0x1a, 0x71, 0x67, 0xa7, 0x19, 0x4c, + 0x79, 0xf8, 0xab, 0xb5, 0xe8, 0xb7, 0x1a, 0xa9, 0xfb, 0x84, 0x67, 0x37, 0xae, 0x2e, 0xce, 0x78, + 0x5c, 0x26, 0x83, 0x0f, 0x30, 0x3b, 0x28, 0x6a, 0x5c, 0x3f, 0xb9, 0x8e, 0x0a, 0x6c, 0xd6, 0x3a, + 0xef, 0xb6, 0x23, 0x0e, 0x6d, 0x56, 0x0f, 0x09, 0x37, 0x2b, 0x44, 0xe1, 0x04, 0x22, 0xe5, 0xcd, + 0x01, 0xe0, 0x3a, 0xa9, 0xef, 0x9f, 0x02, 0x6e, 0x74, 0x72, 0x70, 0x7e, 0xac, 0x85, 0x7e, 0xb4, + 0x6c, 0x51, 0x36, 0xf0, 0x88, 0x19, 0xf6, 0xc5, 0x49, 0xcf, 0x66, 0x54, 0x84, 0x3d, 0xb7, 0x46, + 0xc6, 0xb0, 0x2f, 0x4e, 0x78, 0x76, 0xa6, 0xb5, 0x90, 0x67, 0x64, 0x6a, 0x1b, 0xf6, 0xc5, 0x61, + 0xf6, 0xa5, 0x18, 0xbd, 0x2e, 0x3c, 0x0c, 0xd8, 0x81, 0x6b, 0xc3, 0x66, 0x2f, 0x56, 0x39, 0xfc, + 0x9b, 0xb5, 0xe8, 0xbb, 0xd6, 0xe3, 0x21, 0x4f, 0xd2, 0xf3, 0x55, 0x03, 0xbd, 0x88, 0xb3, 0x25, + 0xab, 0x06, 0x4f, 0x28, 0x6b, 0x6d, 0xd6, 0x94, 0xe0, 0xe9, 0xb5, 0x74, 0xe0, 0xd8, 0x19, 0x15, + 0x45, 0xb6, 0x9a, 0xb2, 0x45, 0x91, 0x91, 0x63, 0xc7, 0x43, 0xc2, 0x63, 0x07, 0xa2, 0x30, 0x2b, + 0x9f, 0xf2, 0x3a, 0xe7, 0x47, 0xb3, 0x72, 0x29, 0x0a, 0x67, 0xe5, 0x1a, 0x81, 0xb9, 0xd2, 0x94, + 0xef, 0xf0, 0x2c, 0x63, 0x33, 0xd1, 0xbe, 0x25, 0x62, 0x34, 0x2d, 0x11, 0xce, 0x95, 0x00, 0x69, + 0x4f, 0xe5, 0xf4, 0x1e, 0x32, 0x2e, 0xd9, 0xb3, 0xd5, 0x41, 0x9a, 0x5f, 0x0e, 0xf0, 0xb4, 0xc0, + 0x02, 0xc4, 0xa9, 0x1c, 0x0a, 0xc2, 0xbd, 0xea, 0x69, 0x9e, 0x70, 0x7c, 0xaf, 0x5a, 0x4b, 0xc2, + 0x7b, 0x55, 0x45, 0x40, 0x93, 0x27, 0x8c, 0x32, 0x59, 0x4b, 0xc2, 0x26, 0x15, 0x81, 0x4d, 0x85, + 0xea, 0x49, 0x11, 0x39, 0x15, 0x82, 0x67, 0x43, 0x1b, 0x9d, 0x1c, 0xdc, 0x73, 0x29, 0x07, 0x68, + 0x44, 0x00, 0xe3, 0x77, 0x82, 0x0c, 0x0c, 0x7d, 0xbd, 0x1b, 0xde, 0x63, 0x62, 0x76, 0x81, 0x87, + 0xbe, 0x87, 0x84, 0x43, 0x1f, 0xa2, 0xb0, 0xad, 0xa6, 0xdc, 0xec, 0xe6, 0xd7, 0xf1, 0xc0, 0x6b, + 0xed, 0xe4, 0x37, 0x3a, 0x39, 0xd8, 0x56, 0xe3, 0x05, 0xdd, 0x56, 0x8d, 0x2c, 0xdc, 0x56, 0x86, + 0x81, 0xa5, 0x6f, 0x04, 0xf2, 0x90, 0x6c, 0x9d, 0x56, 0xf4, 0x8e, 0xc9, 0x36, 0x3a, 0x39, 0xe5, + 0xe4, 0x5f, 0xcc, 0xfe, 0xb0, 0x91, 0x1e, 0xf1, 0x7a, 0xf0, 0xbd, 0x88, 0xb3, 0x34, 0x89, 0x05, + 0x9b, 0xf2, 0x4b, 0x96, 0xe3, 0x5b, 0x31, 0x55, 0xda, 0x86, 0x1f, 0x7a, 0x0a, 0xe1, 0xad, 0x58, + 0x58, 0x11, 0xc6, 0x49, 0x43, 0x9f, 0x56, 0x6c, 0x27, 0xae, 0x88, 0x29, 0xd2, 0x43, 0xc2, 0x71, + 0x02, 0x51, 0x98, 0x08, 0x37, 0xf2, 0xe7, 0xaf, 0x0b, 0x56, 0xa6, 0x2c, 0x9f, 0x31, 0x3c, 0x11, + 0x86, 0x54, 0x38, 0x11, 0x46, 0x68, 0xb8, 0x09, 0xdc, 0x8d, 0x05, 0x7b, 0xb6, 0x9a, 0xa6, 0x0b, + 0x56, 0x89, 0x78, 0x51, 0xe0, 0x9b, 0x40, 0x00, 0x85, 0x37, 0x81, 0x6d, 0xb8, 0x75, 0xe6, 0x64, + 0x66, 0xda, 0xf6, 0xad, 0x35, 0x48, 0x04, 0x6e, 0xad, 0x11, 0x28, 0x6c, 0x58, 0x0b, 0xa0, 0x4f, + 0x1f, 0x5a, 0x56, 0x82, 0x4f, 0x1f, 0x68, 0xba, 0x75, 0x92, 0x67, 0x98, 0x49, 0x3d, 0x34, 0x3b, + 0x8a, 0x3e, 0x71, 0x87, 0xe8, 0x66, 0x2f, 0x16, 0x3f, 0x3a, 0x3c, 0x61, 0x59, 0x2c, 0xd7, 0xc3, + 0xc0, 0xf9, 0x9c, 0x66, 0xfa, 0x1c, 0x1d, 0x3a, 0xac, 0x72, 0xf8, 0x17, 0x6b, 0xd1, 0x7b, 0x98, + 0xc7, 0x2f, 0x0a, 0xe9, 0xf7, 0x71, 0xb7, 0xad, 0x86, 0x24, 0xae, 0xe5, 0x85, 0x35, 0xec, 0xcd, + 0x12, 0x2d, 0xb2, 0xb7, 0xf6, 0x54, 0x01, 0xfc, 0x6c, 0xd0, 0x94, 0x1f, 0x72, 0xc4, 0xcd, 0x92, + 0x10, 0x6f, 0x37, 0x5a, 0x7e, 0xb9, 0x2a, 0xb0, 0xd1, 0x32, 0x36, 0x94, 0x98, 0xd8, 0x68, 0x21, + 0x98, 0x1d, 0x9d, 0x6e, 0xf5, 0x5e, 0xa6, 0xe2, 0x42, 0x26, 0x72, 0x60, 0x74, 0x7a, 0x65, 0x35, + 0x10, 0x31, 0x3a, 0x49, 0x18, 0xa6, 0x3a, 0x1a, 0xac, 0xc7, 0x26, 0x36, 0x97, 0x1b, 0x43, 0xee, + 0xc8, 0xbc, 0xdf, 0x0d, 0xc2, 0x78, 0xd5, 0x62, 0xb5, 0xa7, 0x7a, 0x18, 0xb2, 0x00, 0xf6, 0x55, + 0x9b, 0xbd, 0x58, 0xe5, 0xf0, 0xcf, 0xa2, 0xef, 0xb4, 0x2a, 0xb6, 0xc7, 0x62, 0xb1, 0x2c, 0x59, + 0x32, 0xd8, 0xee, 0x28, 0xb7, 0x06, 0x8d, 0xeb, 0xc7, 0xfd, 0x15, 0x5a, 0xc9, 0xbf, 0xe6, 0x9a, + 0xb0, 0x32, 0x65, 0x78, 0x12, 0x32, 0xe9, 0xb3, 0xc1, 0xe4, 0x9f, 0xd6, 0x69, 0xed, 0xdf, 0xdd, + 0xe8, 0x1a, 0x5d, 0xc5, 0x69, 0x26, 0x9f, 0x02, 0x7f, 0x10, 0x32, 0xea, 0xa1, 0xc1, 0xfd, 0x3b, + 0xa9, 0xd2, 0x9a, 0x99, 0xe5, 0x18, 0x77, 0xf6, 0x7d, 0x8f, 0xe8, 0x99, 0x00, 0xd9, 0xf6, 0x6d, + 0xf5, 0xa4, 0x95, 0x5b, 0xa1, 0x97, 0xbc, 0xfa, 0xcf, 0x6e, 0x90, 0x63, 0x5e, 0x95, 0x2a, 0x12, + 0xe9, 0x5b, 0x3d, 0x69, 0xe5, 0xf5, 0x4f, 0xa3, 0x77, 0xdb, 0x5e, 0xd5, 0x42, 0xb4, 0xdd, 0x69, + 0x0a, 0xac, 0x45, 0x8f, 0xfb, 0x2b, 0x28, 0xf7, 0xff, 0x6e, 0x0e, 0xbc, 0x1b, 0xff, 0x33, 0xbe, + 0x58, 0xb0, 0x3c, 0x61, 0x89, 0xd6, 0xa8, 0xea, 0x8d, 0xd9, 0xa7, 0xb4, 0x5d, 0xa3, 0x30, 0x74, + 0x35, 0x4c, 0x89, 0x7e, 0xfb, 0x1b, 0x68, 0xaa, 0xa2, 0xfd, 0xf7, 0x5a, 0xf4, 0x00, 0x2d, 0x9a, + 0x0e, 0x5c, 0xaf, 0x88, 0xbf, 0xd7, 0xc7, 0x11, 0xa6, 0x69, 0x8a, 0x3a, 0xfa, 0x39, 0x2c, 0xa8, + 0x22, 0xff, 0xc7, 0x5a, 0x74, 0xdb, 0x2a, 0xd6, 0xe1, 0xbd, 0xc3, 0xf3, 0xf3, 0x2c, 0x9d, 0x09, + 0xf9, 0xa8, 0x57, 0xa9, 0xd0, 0xcd, 0x49, 0x69, 0x74, 0x37, 0x67, 0x40, 0xd3, 0xee, 0x8a, 0x3f, + 0x4b, 0x2b, 0xc1, 0xcb, 0xd5, 0xe4, 0x82, 0xbf, 0xd2, 0xef, 0x3d, 0xf9, 0xf3, 0xb2, 0x02, 0x86, + 0x0e, 0x41, 0xec, 0x8a, 0x71, 0xb2, 0xe5, 0xca, 0xbe, 0x1f, 0x55, 0x11, 0xae, 0x1c, 0xa2, 0xc3, + 0x95, 0x4f, 0xda, 0x55, 0x49, 0xd7, 0xca, 0xbe, 0xcc, 0xb5, 0x81, 0x17, 0xb5, 0xfd, 0x42, 0xd7, + 0xfd, 0x6e, 0xd0, 0xe6, 0xa6, 0x4a, 0xbc, 0x9b, 0x9e, 0x9f, 0x9b, 0x3a, 0xe1, 0x25, 0x75, 0x11, + 0x22, 0x37, 0x25, 0x50, 0xbb, 0xbd, 0xda, 0x4b, 0x33, 0x26, 0x1f, 0x0a, 0x7d, 0x71, 0x7e, 0x9e, + 0xf1, 0x38, 0x01, 0xdb, 0xab, 0x5a, 0x3c, 0x74, 0xe5, 0xc4, 0xf6, 0x0a, 0xe3, 0xec, 0x75, 0x93, + 0x5a, 0x5a, 0x47, 0x77, 0x3e, 0x4b, 0x33, 0x78, 0x6d, 0x5a, 0x6a, 0x1a, 0x21, 0x71, 0xdd, 0xa4, + 0x05, 0xd9, 0x14, 0xa8, 0x16, 0xd5, 0x51, 0xa9, 0xcb, 0x7f, 0xaf, 0xad, 0xe8, 0x88, 0x89, 0x14, + 0x08, 0xc1, 0xec, 0xf1, 0x45, 0x2d, 0x3c, 0x2d, 0xa4, 0xf1, 0x5b, 0x6d, 0xad, 0x46, 0x42, 0x1c, + 0x5f, 0xf8, 0x84, 0xdd, 0x2d, 0xd7, 0x7f, 0xdf, 0xe5, 0xaf, 0x72, 0x69, 0xf4, 0x76, 0x5b, 0x45, + 0xcb, 0x88, 0xdd, 0x32, 0x64, 0x94, 0xe1, 0xcf, 0xa3, 0x5f, 0x94, 0x86, 0x4b, 0x5e, 0x0c, 0x6e, + 0x20, 0x0a, 0xa5, 0x73, 0xc9, 0xf8, 0x26, 0x29, 0xb7, 0xb7, 0x53, 0x4c, 0x6c, 0x9c, 0x56, 0xf1, + 0x1c, 0xbe, 0x19, 0x60, 0x7b, 0x5c, 0x4a, 0x89, 0xdb, 0x29, 0x6d, 0xca, 0x8f, 0x8a, 0x23, 0x9e, + 0x28, 0xeb, 0x48, 0x0d, 0x8d, 0x30, 0x14, 0x15, 0x2e, 0x64, 0xd3, 0xd6, 0xa3, 0xf8, 0x2a, 0x9d, + 0x9b, 0xd4, 0xa2, 0x99, 0xc0, 0x2a, 0x90, 0xb6, 0x5a, 0x66, 0xe8, 0x40, 0x44, 0xda, 0x4a, 0xc2, + 0xca, 0xe7, 0x3f, 0xaf, 0x45, 0xb7, 0x2c, 0xb3, 0xaf, 0x0f, 0x7c, 0xc7, 0xf9, 0x39, 0xaf, 0x93, + 0xdc, 0x83, 0x34, 0xbf, 0xac, 0x06, 0x1f, 0x53, 0x26, 0x71, 0xde, 0x14, 0xe5, 0x93, 0x6b, 0xeb, + 0xd9, 0xfd, 0x89, 0x3e, 0x0d, 0xb5, 0x57, 0x22, 0x1a, 0x0d, 0xb0, 0x3f, 0x31, 0x87, 0xa6, 0x90, + 0x23, 0xf6, 0x27, 0x21, 0xde, 0x76, 0xb1, 0x71, 0x9e, 0xf1, 0x1c, 0x76, 0xb1, 0xb5, 0x50, 0x0b, + 0x89, 0x2e, 0x6e, 0x41, 0x76, 0x3e, 0xd6, 0xa2, 0xe6, 0x7c, 0x6d, 0x94, 0x65, 0x60, 0x3e, 0x36, + 0xaa, 0x06, 0x20, 0xe6, 0x63, 0x14, 0x54, 0x7e, 0x4e, 0xa2, 0x6f, 0xd5, 0x4d, 0x7a, 0x5c, 0xb2, + 0xab, 0x94, 0xc1, 0xdb, 0x3b, 0x8e, 0x84, 0x18, 0xff, 0x3e, 0x61, 0x47, 0xd6, 0x69, 0x5e, 0x15, + 0x59, 0x5c, 0x5d, 0xa8, 0xfb, 0x1c, 0x7e, 0x9d, 0xb5, 0x10, 0xde, 0xe8, 0xb8, 0xd7, 0x41, 0xd9, + 0x49, 0x5d, 0xcb, 0xcc, 0x14, 0xb3, 0x8e, 0xab, 0xb6, 0xa6, 0x99, 0x8d, 0x4e, 0xce, 0x3e, 0x34, + 0xd9, 0x8f, 0xb3, 0x8c, 0x95, 0x2b, 0x2d, 0x3b, 0x8c, 0xf3, 0xf4, 0x9c, 0x55, 0x02, 0x3c, 0x34, + 0x51, 0xd4, 0x10, 0x62, 0xc4, 0x43, 0x93, 0x00, 0x6e, 0xf7, 0x6d, 0xc0, 0xf3, 0x38, 0x4f, 0xd8, + 0x6b, 0xb0, 0x6f, 0x83, 0x76, 0x24, 0x43, 0xec, 0xdb, 0x28, 0xd6, 0x3e, 0x3c, 0x78, 0x96, 0xf1, + 0xd9, 0xa5, 0x5a, 0x02, 0xfc, 0x0e, 0x96, 0x12, 0xb8, 0x06, 0xdc, 0x0e, 0x21, 0x76, 0x11, 0x90, + 0x82, 0x13, 0x56, 0x64, 0xf1, 0x0c, 0x5e, 0xe1, 0x6a, 0x74, 0x94, 0x8c, 0x58, 0x04, 0x20, 0x03, + 0x8a, 0xab, 0xae, 0x86, 0x61, 0xc5, 0x05, 0x37, 0xc3, 0x6e, 0x87, 0x10, 0xbb, 0x0c, 0x4a, 0xc1, + 0xa4, 0xc8, 0x52, 0x01, 0x86, 0x41, 0xa3, 0x21, 0x25, 0xc4, 0x30, 0xf0, 0x09, 0x60, 0xf2, 0x90, + 0x95, 0x73, 0x86, 0x9a, 0x94, 0x92, 0xa0, 0x49, 0x4d, 0xd8, 0xfb, 0xea, 0x4d, 0xdd, 0x79, 0xb1, + 0x02, 0xf7, 0xd5, 0x55, 0xb5, 0x78, 0xb1, 0x22, 0xee, 0xab, 0x7b, 0x00, 0x28, 0xe2, 0x71, 0x5c, + 0x09, 0xbc, 0x88, 0x52, 0x12, 0x2c, 0xa2, 0x26, 0xec, 0x1a, 0xdd, 0x14, 0x71, 0x29, 0xc0, 0x1a, + 0xad, 0x0a, 0xe0, 0x5c, 0x62, 0xb8, 0x49, 0xca, 0xed, 0x4c, 0xd2, 0xf4, 0x0a, 0x13, 0x7b, 0x29, + 0xcb, 0x92, 0x0a, 0xcc, 0x24, 0xaa, 0xdd, 0xb5, 0x94, 0x98, 0x49, 0xda, 0x14, 0x08, 0x25, 0xf5, + 0x04, 0x04, 0xab, 0x1d, 0x78, 0x00, 0x72, 0x3b, 0x84, 0xd8, 0xf9, 0x49, 0x17, 0x7a, 0x27, 0x2e, + 0xcb, 0xb4, 0x5e, 0xfc, 0xd7, 0xf1, 0x02, 0x69, 0x39, 0x31, 0x3f, 0x61, 0x1c, 0x18, 0x5e, 0x7a, + 0xe2, 0xc6, 0x0a, 0x06, 0xa7, 0xee, 0x3b, 0x41, 0xc6, 0x66, 0x9c, 0x52, 0xe2, 0x3c, 0x85, 0xc7, + 0x5a, 0x13, 0x79, 0x08, 0xbf, 0xde, 0x85, 0x39, 0xaf, 0xce, 0x19, 0x17, 0x87, 0xfc, 0x8a, 0x4d, + 0xf9, 0xf3, 0xd7, 0x69, 0x55, 0x6f, 0xb7, 0xd4, 0xca, 0xfd, 0x94, 0xb0, 0x84, 0xc1, 0xc4, 0xab, + 0x73, 0x9d, 0x4a, 0x36, 0x81, 0x00, 0x65, 0x39, 0x62, 0xaf, 0xd0, 0x04, 0x02, 0x5a, 0x34, 0x1c, + 0x91, 0x40, 0x84, 0x78, 0x7b, 0x62, 0x66, 0x9c, 0xab, 0xef, 0x25, 0x4c, 0xb9, 0xce, 0xe5, 0x28, + 0x6b, 0x10, 0x24, 0x0e, 0x2d, 0x82, 0x0a, 0x76, 0x7f, 0x69, 0xfc, 0xdb, 0x21, 0x76, 0x9f, 0xb0, + 0xd3, 0x1e, 0x66, 0x0f, 0x7a, 0x90, 0x88, 0x2b, 0x7b, 0x95, 0x84, 0x72, 0xd5, 0xbe, 0x49, 0xf2, + 0xa0, 0x07, 0xe9, 0x9c, 0xbe, 0xb9, 0xd5, 0x7a, 0x16, 0xcf, 0x2e, 0xe7, 0x25, 0x5f, 0xe6, 0xc9, + 0x0e, 0xcf, 0x78, 0x09, 0x4e, 0xdf, 0xbc, 0x52, 0x03, 0x94, 0x38, 0x7d, 0xeb, 0x50, 0xb1, 0x19, + 0x9c, 0x5b, 0x8a, 0x51, 0x96, 0xce, 0xe1, 0x8e, 0xda, 0x33, 0x24, 0x01, 0x22, 0x83, 0x43, 0x41, + 0x24, 0x88, 0x9a, 0x1d, 0xb7, 0x48, 0x67, 0x71, 0xd6, 0xf8, 0xdb, 0xa6, 0xcd, 0x78, 0x60, 0x67, + 0x10, 0x21, 0x0a, 0x48, 0x3d, 0xa7, 0xcb, 0x32, 0x1f, 0xe7, 0x82, 0x93, 0xf5, 0xd4, 0x40, 0x67, + 0x3d, 0x1d, 0x10, 0x4c, 0xab, 0x53, 0xf6, 0xba, 0x2e, 0x4d, 0xfd, 0x0f, 0x36, 0xad, 0xd6, 0x7f, + 0x1f, 0x2a, 0x79, 0x68, 0x5a, 0x05, 0x1c, 0xa8, 0x8c, 0x72, 0xd2, 0x04, 0x4c, 0x40, 0xdb, 0x0f, + 0x93, 0xfb, 0xdd, 0x20, 0xee, 0x67, 0x22, 0x56, 0x19, 0x0b, 0xf9, 0x91, 0x40, 0x1f, 0x3f, 0x1a, + 0xb4, 0xc7, 0x2d, 0x5e, 0x7d, 0x2e, 0xd8, 0xec, 0xb2, 0x75, 0x33, 0xce, 0x2f, 0x68, 0x83, 0x10, + 0xc7, 0x2d, 0x04, 0x8a, 0x77, 0xd1, 0x78, 0xc6, 0xf3, 0x50, 0x17, 0xd5, 0xf2, 0x3e, 0x5d, 0xa4, + 0x38, 0xbb, 0xf9, 0x35, 0x52, 0x15, 0x99, 0x4d, 0x37, 0x6d, 0x12, 0x16, 0x5c, 0x88, 0xd8, 0xfc, + 0x92, 0xb0, 0xcd, 0xc9, 0xa1, 0xcf, 0xc3, 0xf6, 0x6b, 0x03, 0x2d, 0x2b, 0x87, 0xf4, 0x6b, 0x03, + 0x14, 0x4b, 0x57, 0xb2, 0x89, 0x91, 0x0e, 0x2b, 0x7e, 0x9c, 0x3c, 0xea, 0x07, 0xdb, 0x2d, 0x8f, + 0xe7, 0x73, 0x27, 0x63, 0x71, 0xd9, 0x78, 0xdd, 0x0a, 0x18, 0xb2, 0x18, 0xb1, 0xe5, 0x09, 0xe0, + 0x60, 0x0a, 0xf3, 0x3c, 0xef, 0xf0, 0x5c, 0xb0, 0x5c, 0x60, 0x53, 0x98, 0x6f, 0x4c, 0x81, 0xa1, + 0x29, 0x8c, 0x52, 0x00, 0x71, 0x2b, 0xcf, 0x83, 0x98, 0x38, 0x8a, 0x17, 0x68, 0xc6, 0xd6, 0x9c, + 0xf5, 0x34, 0xf2, 0x50, 0xdc, 0x02, 0xce, 0x79, 0x9c, 0xeb, 0x7a, 0x99, 0xc6, 0xe5, 0xdc, 0x9c, + 0x6e, 0x24, 0x83, 0xc7, 0xb4, 0x1d, 0x9f, 0x24, 0x1e, 0xe7, 0x86, 0x35, 0xc0, 0xb4, 0x33, 0x5e, + 0xc4, 0x73, 0x53, 0x53, 0xa4, 0x06, 0x52, 0xde, 0xaa, 0xea, 0xfd, 0x6e, 0x10, 0xf8, 0x79, 0x91, + 0x26, 0x8c, 0x07, 0xfc, 0x48, 0x79, 0x1f, 0x3f, 0x10, 0x04, 0xd9, 0x5b, 0x5d, 0xef, 0x66, 0x47, + 0x37, 0xca, 0x13, 0xb5, 0x8f, 0x1d, 0x12, 0xcd, 0x03, 0xb8, 0x50, 0xf6, 0x46, 0xf0, 0x60, 0x8c, + 0xea, 0x03, 0xda, 0xd0, 0x18, 0x35, 0xe7, 0xaf, 0x7d, 0xc6, 0x28, 0x06, 0x2b, 0x9f, 0x3f, 0x56, + 0x63, 0x74, 0x37, 0x16, 0x71, 0x9d, 0xb7, 0xbf, 0x48, 0xd9, 0x2b, 0xb5, 0x11, 0x46, 0xea, 0xab, + 0xa9, 0xa1, 0x7c, 0xeb, 0x19, 0xec, 0x8a, 0xb7, 0x7b, 0xf3, 0x01, 0xdf, 0x6a, 0x87, 0xd0, 0xe9, + 0x1b, 0x6c, 0x15, 0xb6, 0x7b, 0xf3, 0x01, 0xdf, 0xea, 0xe3, 0x0d, 0x9d, 0xbe, 0xc1, 0x17, 0x1c, + 0xb6, 0x7b, 0xf3, 0xca, 0xf7, 0x5f, 0xea, 0x81, 0xeb, 0x3a, 0xaf, 0xf3, 0xb0, 0x99, 0x48, 0xaf, + 0x18, 0x96, 0x4e, 0xfa, 0xf6, 0x0c, 0x1a, 0x4a, 0x27, 0x69, 0x15, 0xe7, 0xf3, 0x69, 0x58, 0x29, + 0x8e, 0x79, 0x95, 0xca, 0xeb, 0x18, 0x4f, 0x7b, 0x18, 0xd5, 0x70, 0x68, 0xd3, 0x14, 0x52, 0xb2, + 0x0f, 0x96, 0x3d, 0xd4, 0x5e, 0x84, 0x7f, 0x14, 0xb0, 0xd7, 0xbe, 0x0f, 0xbf, 0xd5, 0x93, 0xb6, + 0x8f, 0x78, 0x3d, 0x46, 0x3f, 0x9c, 0x9b, 0x30, 0x74, 0x95, 0x30, 0xa6, 0xcc, 0x43, 0x5b, 0xf7, + 0x29, 0xe5, 0xe3, 0xfe, 0x0a, 0x1d, 0xee, 0x47, 0x49, 0xd2, 0xcf, 0xbd, 0xfb, 0x74, 0xfb, 0x71, + 0x7f, 0x05, 0xe5, 0xfe, 0xaf, 0xf5, 0xb6, 0x06, 0xfa, 0x57, 0x63, 0xf0, 0x49, 0x1f, 0x8b, 0x60, + 0x1c, 0x3e, 0xbd, 0x96, 0x8e, 0x2a, 0xc8, 0xdf, 0xeb, 0xfd, 0xbb, 0x46, 0xe5, 0xdb, 0x48, 0xf2, + 0x2d, 0x66, 0x35, 0x24, 0x43, 0x51, 0x65, 0x61, 0x38, 0x30, 0x3f, 0xba, 0xa6, 0x96, 0xf3, 0x2d, + 0x3f, 0x0f, 0x56, 0x6f, 0xcd, 0x3a, 0xe5, 0x09, 0x59, 0x76, 0x68, 0x58, 0xa0, 0x8f, 0xaf, 0xab, + 0x46, 0x0d, 0x55, 0x07, 0x96, 0x5f, 0xb3, 0x79, 0xda, 0xd3, 0xb0, 0xf7, 0x7d, 0x9b, 0x0f, 0xaf, + 0xa7, 0xa4, 0xca, 0xf2, 0x5f, 0x6b, 0xd1, 0x3d, 0x8f, 0xb5, 0x8f, 0x33, 0xc0, 0xa1, 0xcb, 0x0f, + 0x02, 0xf6, 0x29, 0x25, 0x53, 0xb8, 0xdf, 0xf9, 0x66, 0xca, 0xf6, 0xc3, 0x77, 0x9e, 0xca, 0x5e, + 0x9a, 0x09, 0x56, 0xb6, 0x3f, 0x7c, 0xe7, 0xdb, 0x6d, 0xa8, 0x21, 0xfd, 0xe1, 0xbb, 0x00, 0xee, + 0x7c, 0xf8, 0x0e, 0xf1, 0x8c, 0x7e, 0xf8, 0x0e, 0xb5, 0x16, 0xfc, 0xf0, 0x5d, 0x58, 0x83, 0x5a, + 0x5d, 0x74, 0x11, 0x9a, 0x63, 0xf3, 0x5e, 0x16, 0xfd, 0x53, 0xf4, 0x27, 0xd7, 0x51, 0x21, 0xd6, + 0xd7, 0x86, 0x93, 0x17, 0x2a, 0x7b, 0xb4, 0xa9, 0x77, 0xa9, 0x72, 0xbb, 0x37, 0xaf, 0x7c, 0xff, + 0x48, 0x6d, 0xae, 0xcc, 0x6a, 0xc2, 0x4b, 0xf9, 0xd1, 0xc3, 0xcd, 0xd0, 0xea, 0x50, 0x5b, 0x70, + 0x7b, 0xfe, 0x51, 0x3f, 0x98, 0xa8, 0x6e, 0x4d, 0xa8, 0x4e, 0x1f, 0x76, 0x19, 0x02, 0x5d, 0xbe, + 0xdd, 0x9b, 0x27, 0x96, 0x91, 0xc6, 0x77, 0xd3, 0xdb, 0x3d, 0x8c, 0xf9, 0x7d, 0xfd, 0xb8, 0xbf, + 0x82, 0x72, 0x7f, 0xa5, 0xb2, 0x56, 0xd7, 0xbd, 0xec, 0xe7, 0xad, 0x2e, 0x53, 0x13, 0xaf, 0x9b, + 0x87, 0x7d, 0xf1, 0x50, 0xfe, 0xe2, 0x2e, 0xa1, 0x5d, 0xf9, 0x0b, 0xba, 0x8c, 0x7e, 0x78, 0x3d, + 0x25, 0x55, 0x96, 0x7f, 0x5a, 0x8b, 0x6e, 0x92, 0x65, 0x51, 0x71, 0xf0, 0x71, 0x5f, 0xcb, 0x20, + 0x1e, 0x3e, 0xb9, 0xb6, 0x9e, 0x2a, 0xd4, 0xbf, 0xae, 0x45, 0xb7, 0x02, 0x85, 0x6a, 0x02, 0xe4, + 0x1a, 0xd6, 0xfd, 0x40, 0xf9, 0xf4, 0xfa, 0x8a, 0xd4, 0x72, 0xef, 0xe2, 0x93, 0xf6, 0x47, 0xcc, + 0x02, 0xb6, 0x27, 0xf4, 0x47, 0xcc, 0xba, 0xb5, 0xe0, 0x19, 0x53, 0x7c, 0xa6, 0xf7, 0x7c, 0xe8, + 0x19, 0x93, 0xbc, 0x0a, 0x19, 0xfc, 0x3c, 0x0a, 0xc6, 0x61, 0x4e, 0x9e, 0xbf, 0x2e, 0xe2, 0x3c, + 0xa1, 0x9d, 0x34, 0xf2, 0x6e, 0x27, 0x86, 0x83, 0x67, 0x73, 0xb5, 0xf4, 0x84, 0xeb, 0x7d, 0xdc, + 0x03, 0x4a, 0xdf, 0x20, 0xc1, 0xb3, 0xb9, 0x16, 0x4a, 0x78, 0x53, 0x59, 0x63, 0xc8, 0x1b, 0x48, + 0x16, 0x1f, 0xf6, 0x41, 0xc1, 0x0e, 0xc1, 0x78, 0x33, 0x47, 0xfe, 0x8f, 0x42, 0x56, 0x5a, 0xc7, + 0xfe, 0x5b, 0x3d, 0x69, 0xc2, 0xed, 0x84, 0x89, 0xcf, 0x58, 0x9c, 0xb0, 0x32, 0xe8, 0xd6, 0x50, + 0xbd, 0xdc, 0xba, 0x34, 0xe6, 0x76, 0x87, 0x67, 0xcb, 0x45, 0xae, 0x3a, 0x93, 0x74, 0xeb, 0x52, + 0xdd, 0x6e, 0x01, 0x0d, 0x4f, 0x25, 0xad, 0x5b, 0x99, 0x5e, 0x3e, 0x0c, 0x9b, 0xf1, 0xb2, 0xca, + 0xcd, 0x5e, 0x2c, 0x5d, 0x4f, 0x15, 0x46, 0x1d, 0xf5, 0x04, 0x91, 0xb4, 0xd5, 0x93, 0x86, 0xc7, + 0x83, 0x8e, 0x5b, 0x13, 0x4f, 0xdb, 0x1d, 0xb6, 0x5a, 0x21, 0xf5, 0xb8, 0xbf, 0x02, 0x3c, 0x8c, + 0x55, 0x51, 0x75, 0x90, 0x56, 0x62, 0x2f, 0xcd, 0xb2, 0xc1, 0x66, 0x20, 0x4c, 0x34, 0x14, 0x3c, + 0x8c, 0x45, 0x60, 0x22, 0x92, 0xf5, 0xe1, 0x65, 0x3e, 0xe8, 0xb2, 0x23, 0xa9, 0x5e, 0x91, 0xec, + 0xd2, 0xe0, 0x40, 0xcd, 0x69, 0x6a, 0x53, 0xdb, 0x61, 0xb8, 0xe1, 0x5a, 0x15, 0xde, 0xee, 0xcd, + 0x83, 0xa7, 0xfd, 0x92, 0x92, 0x2b, 0xcb, 0x5d, 0xca, 0x84, 0xb7, 0x92, 0xdc, 0xeb, 0xa0, 0xc0, + 0xa1, 0x64, 0x33, 0x8c, 0x5e, 0xa6, 0xc9, 0x9c, 0x09, 0xf4, 0x41, 0x95, 0x0b, 0x04, 0x1f, 0x54, + 0x01, 0x10, 0x74, 0x5d, 0xf3, 0x77, 0x73, 0x1a, 0x3b, 0x4e, 0xb0, 0xae, 0x53, 0xca, 0x0e, 0x15, + 0xea, 0x3a, 0x94, 0x06, 0xb3, 0x81, 0x71, 0xab, 0x3e, 0x28, 0xf1, 0x30, 0x64, 0x06, 0x7c, 0x55, + 0x62, 0xb3, 0x17, 0x0b, 0x56, 0x14, 0xeb, 0x30, 0x5d, 0xa4, 0x02, 0x5b, 0x51, 0x1c, 0x1b, 0x35, + 0x12, 0x5a, 0x51, 0xda, 0x28, 0x55, 0xbd, 0x3a, 0x47, 0x18, 0x27, 0xe1, 0xea, 0x35, 0x4c, 0xbf, + 0xea, 0x19, 0xb6, 0xf5, 0x5c, 0x35, 0x37, 0x21, 0x23, 0x2e, 0xd4, 0x66, 0x19, 0x89, 0x6d, 0xf9, + 0xa2, 0x31, 0x04, 0x43, 0xb3, 0x0e, 0xa5, 0x00, 0x9f, 0x17, 0xd4, 0x9c, 0x7e, 0xf4, 0x5b, 0x14, + 0x2c, 0x2e, 0xe3, 0x7c, 0x86, 0x6e, 0x4e, 0xa5, 0xc1, 0x16, 0x19, 0xda, 0x9c, 0x92, 0x1a, 0xe0, + 0xa9, 0xbd, 0xff, 0x26, 0x2f, 0x32, 0x14, 0xcc, 0x2b, 0xb3, 0xfe, 0x8b, 0xbc, 0x0f, 0x7a, 0x90, + 0xf0, 0xa9, 0xbd, 0x06, 0xcc, 0xb9, 0x7b, 0xe3, 0xf4, 0x83, 0x80, 0x29, 0x1f, 0x0d, 0x6d, 0x84, + 0x69, 0x15, 0x10, 0xd4, 0xce, 0xd9, 0xe2, 0xe7, 0x6c, 0x85, 0x05, 0xb5, 0x7b, 0x48, 0xf8, 0x39, + 0x5b, 0x85, 0x82, 0xba, 0x8d, 0x82, 0x3c, 0xd3, 0xdd, 0x07, 0xad, 0x07, 0xf4, 0xdd, 0xad, 0xcf, + 0x46, 0x27, 0x07, 0x46, 0xce, 0x6e, 0x7a, 0xe5, 0x3d, 0xa6, 0x40, 0x0a, 0xba, 0x9b, 0x5e, 0xe1, + 0x4f, 0x29, 0x36, 0x7b, 0xb1, 0xf0, 0x46, 0x40, 0x2c, 0xd8, 0x6b, 0xfd, 0xa8, 0x1e, 0x29, 0xae, + 0x94, 0xb7, 0x9e, 0xd5, 0xdf, 0xef, 0x06, 0xed, 0xfd, 0xdb, 0xe3, 0x92, 0xcf, 0x58, 0x55, 0xa9, + 0x6f, 0xad, 0xfa, 0x17, 0x9c, 0x94, 0x6c, 0x08, 0xbe, 0xb4, 0x7a, 0x37, 0x0c, 0x39, 0x1f, 0x48, + 0x6c, 0x44, 0xf6, 0xbb, 0x4d, 0xeb, 0xa8, 0x66, 0xfb, 0x93, 0x4d, 0x1b, 0x9d, 0x9c, 0x1d, 0x5e, + 0x4a, 0xea, 0x7e, 0xa8, 0xe9, 0x3e, 0xaa, 0x8e, 0x7d, 0xa3, 0xe9, 0x41, 0x0f, 0x52, 0xb9, 0xfa, + 0x2c, 0x7a, 0xf3, 0x80, 0xcf, 0x27, 0x2c, 0x4f, 0x06, 0xdf, 0xf3, 0x6f, 0xf0, 0xf2, 0xf9, 0xb0, + 0xfe, 0xb3, 0x31, 0x7a, 0x83, 0x12, 0xdb, 0x3b, 0x88, 0xbb, 0xec, 0x6c, 0x39, 0x9f, 0x88, 0x58, + 0x80, 0x3b, 0x88, 0xf2, 0xef, 0xc3, 0x5a, 0x40, 0xdc, 0x41, 0xf4, 0x00, 0x60, 0x6f, 0x5a, 0x32, + 0x86, 0xda, 0xab, 0x05, 0x41, 0x7b, 0x0a, 0xb0, 0x59, 0x84, 0xb1, 0x57, 0x27, 0xea, 0xf0, 0xce, + 0xa0, 0xd5, 0x91, 0x52, 0x22, 0x8b, 0x68, 0x53, 0x36, 0xb8, 0x9b, 0xea, 0xcb, 0xef, 0xe6, 0x2c, + 0x17, 0x8b, 0xb8, 0x5c, 0x81, 0xe0, 0x56, 0xb5, 0x74, 0x00, 0x22, 0xb8, 0x51, 0xd0, 0x8e, 0x5a, + 0xdd, 0xcc, 0xb3, 0xcb, 0x7d, 0x5e, 0xf2, 0xa5, 0x48, 0x73, 0x06, 0xbf, 0x9d, 0x62, 0x1a, 0xd4, + 0x65, 0x88, 0x51, 0x4b, 0xb1, 0x36, 0xcb, 0x95, 0x44, 0x73, 0x9d, 0x51, 0x7e, 0x6c, 0xbe, 0x12, + 0xbc, 0x84, 0x8f, 0x33, 0x1b, 0x2b, 0x10, 0x22, 0xb2, 0x5c, 0x12, 0x06, 0x7d, 0x7f, 0x9c, 0xe6, + 0x73, 0xb4, 0xef, 0x8f, 0xdd, 0xef, 0x17, 0xdf, 0xa2, 0x01, 0x3b, 0xa0, 0x9a, 0x46, 0x6b, 0x06, + 0x80, 0x7a, 0x69, 0x18, 0x6d, 0x74, 0x97, 0x20, 0x06, 0x14, 0x4e, 0x02, 0x57, 0x5f, 0x14, 0x2c, + 0x67, 0x89, 0xbe, 0xb4, 0x87, 0xb9, 0xf2, 0x88, 0xa0, 0x2b, 0x48, 0xda, 0xb9, 0x48, 0xca, 0x4f, + 0x96, 0xf9, 0x71, 0xc9, 0xcf, 0xd3, 0x8c, 0x95, 0x60, 0x2e, 0x6a, 0xd4, 0x1d, 0x39, 0x31, 0x17, + 0x61, 0x9c, 0xbd, 0xfd, 0x21, 0xa5, 0xde, 0x2f, 0x26, 0x4c, 0xcb, 0x78, 0x06, 0x6f, 0x7f, 0x34, + 0x36, 0xda, 0x18, 0x71, 0x32, 0x18, 0xc0, 0x9d, 0x44, 0xa7, 0x71, 0x9d, 0xaf, 0x64, 0x7c, 0xa8, + 0x97, 0x56, 0xe5, 0x57, 0x7d, 0x2b, 0x90, 0xe8, 0x28, 0x73, 0x18, 0x49, 0x24, 0x3a, 0x61, 0x0d, + 0xbb, 0x94, 0x48, 0xee, 0x48, 0xdd, 0x6a, 0x02, 0x4b, 0x49, 0x63, 0x43, 0x0b, 0x89, 0xa5, 0xa4, + 0x05, 0x81, 0x09, 0x49, 0x0f, 0x83, 0x39, 0x3a, 0x21, 0x19, 0x69, 0x70, 0x42, 0x72, 0x29, 0x3b, + 0x51, 0x8c, 0xf3, 0x54, 0xa4, 0x71, 0x36, 0x61, 0xe2, 0x38, 0x2e, 0xe3, 0x05, 0x13, 0xac, 0x84, + 0x13, 0x85, 0x42, 0x86, 0x1e, 0x43, 0x4c, 0x14, 0x14, 0xab, 0x1c, 0xfe, 0x6e, 0xf4, 0x76, 0xbd, + 0xee, 0xb3, 0x5c, 0xfd, 0xd6, 0xd3, 0x73, 0xf9, 0x23, 0x71, 0x83, 0x77, 0x8c, 0x8d, 0x89, 0x28, + 0x59, 0xbc, 0xd0, 0xb6, 0xdf, 0x32, 0x7f, 0x97, 0xe0, 0xe3, 0xb5, 0x3a, 0x9e, 0x8f, 0xb8, 0x48, + 0xcf, 0xeb, 0x6d, 0xb6, 0x7a, 0x81, 0x09, 0xc4, 0xb3, 0x2b, 0x1e, 0x06, 0x3e, 0x7a, 0x82, 0x71, + 0x76, 0x9e, 0x76, 0xa5, 0x27, 0xac, 0xc8, 0xe0, 0x3c, 0xed, 0x69, 0x4b, 0x80, 0x98, 0xa7, 0x51, + 0xd0, 0x0e, 0x4e, 0x57, 0x3c, 0x65, 0xe1, 0xca, 0x4c, 0x59, 0xbf, 0xca, 0x4c, 0xbd, 0x77, 0x42, + 0xb2, 0xe8, 0xed, 0x43, 0xb6, 0x38, 0x63, 0x65, 0x75, 0x91, 0x16, 0xd4, 0x97, 0x87, 0x2d, 0xd1, + 0xf9, 0xe5, 0x61, 0x02, 0xb5, 0x2b, 0x81, 0x05, 0xc6, 0xd5, 0x51, 0xbc, 0x60, 0xf2, 0x13, 0x2e, + 0x60, 0x25, 0x70, 0x8c, 0x38, 0x10, 0xb1, 0x12, 0x90, 0xb0, 0xf3, 0x7a, 0x99, 0x65, 0x4e, 0xd8, + 0xbc, 0x8e, 0xb0, 0xf2, 0x38, 0x5e, 0x2d, 0x58, 0x2e, 0x94, 0x49, 0x70, 0x26, 0xef, 0x98, 0xc4, + 0x79, 0xe2, 0x4c, 0xbe, 0x8f, 0x9e, 0x33, 0x35, 0x79, 0x0d, 0x7f, 0xcc, 0x4b, 0xd1, 0xfc, 0x92, + 0xdb, 0x69, 0x99, 0x81, 0xa9, 0xc9, 0x6f, 0x54, 0x8f, 0x24, 0xa6, 0xa6, 0xb0, 0x86, 0xf3, 0xab, + 0x1d, 0x5e, 0x19, 0x5e, 0xb0, 0xd2, 0xc4, 0xc9, 0xf3, 0x45, 0x9c, 0x66, 0x2a, 0x1a, 0xbe, 0x1f, + 0xb0, 0x4d, 0xe8, 0x10, 0xbf, 0xda, 0xd1, 0x57, 0xd7, 0xf9, 0x9d, 0x93, 0x70, 0x09, 0xc1, 0x23, + 0x82, 0x0e, 0xfb, 0xc4, 0x23, 0x82, 0x6e, 0x2d, 0xbb, 0x73, 0xb7, 0xac, 0xe4, 0x56, 0x92, 0xd8, + 0xe1, 0x09, 0x3c, 0x2f, 0x74, 0x6c, 0x02, 0x90, 0xd8, 0xb9, 0x07, 0x15, 0x6c, 0x6a, 0x60, 0xb1, + 0xbd, 0x34, 0x8f, 0xb3, 0xf4, 0xc7, 0x30, 0xad, 0x77, 0xec, 0x68, 0x82, 0x48, 0x0d, 0x70, 0x12, + 0x73, 0xb5, 0xcf, 0xc4, 0x34, 0xad, 0xa7, 0xfe, 0xfb, 0x81, 0x76, 0x93, 0x44, 0xb7, 0x2b, 0x87, + 0x74, 0xbe, 0x32, 0x0c, 0x9b, 0x75, 0x54, 0x14, 0x93, 0x7a, 0x55, 0x3d, 0x61, 0x33, 0x96, 0x16, + 0x62, 0xf0, 0x51, 0xb8, 0xad, 0x00, 0x4e, 0x5c, 0xb4, 0xe8, 0xa1, 0xe6, 0x3c, 0xbe, 0xaf, 0xe7, + 0x92, 0x49, 0xf3, 0x13, 0xa7, 0xa7, 0x15, 0x2b, 0x55, 0xa2, 0xb1, 0xcf, 0x04, 0x18, 0x9d, 0x0e, + 0x37, 0x74, 0xc0, 0xba, 0xa2, 0xc4, 0xe8, 0x0c, 0x6b, 0xd8, 0xc3, 0x3e, 0x87, 0x53, 0x5f, 0x8d, + 0x97, 0xd7, 0x1d, 0x1f, 0x91, 0xc6, 0x1c, 0x8a, 0x38, 0xec, 0xa3, 0x69, 0x9b, 0xad, 0xb5, 0xdd, + 0x8e, 0xf2, 0xd5, 0x18, 0x5e, 0x99, 0x40, 0x2c, 0x49, 0x8c, 0xc8, 0xd6, 0x02, 0xb8, 0x73, 0x18, + 0x5e, 0xf2, 0x38, 0x99, 0xc5, 0x95, 0x38, 0x8e, 0x57, 0x19, 0x8f, 0x13, 0xb9, 0xae, 0xc3, 0xc3, + 0x70, 0xcd, 0x0c, 0x5d, 0x88, 0x3a, 0x0c, 0xa7, 0x60, 0x37, 0x3b, 0x93, 0xbf, 0xdc, 0xaa, 0xae, + 0x92, 0xc2, 0xec, 0x4c, 0x96, 0x17, 0x5e, 0x23, 0xbd, 0x1b, 0x86, 0xec, 0x2b, 0x70, 0x8d, 0x48, + 0xa6, 0x21, 0xb7, 0x30, 0x1d, 0x2f, 0x01, 0x79, 0x3f, 0x40, 0xd8, 0x0f, 0xa0, 0x34, 0x7f, 0xd7, + 0x3f, 0xd6, 0x25, 0xd4, 0xb7, 0xd8, 0x1f, 0x61, 0xba, 0x2e, 0xe4, 0xdd, 0x50, 0xdb, 0xea, 0x49, + 0xdb, 0x34, 0x73, 0xe7, 0x22, 0x16, 0xa3, 0x24, 0x39, 0x64, 0x15, 0xf2, 0x3e, 0x7b, 0x2d, 0x1c, + 0x5a, 0x29, 0x91, 0x66, 0xb6, 0x29, 0x1b, 0xe8, 0xb5, 0xec, 0x79, 0x92, 0x0a, 0x25, 0xd3, 0x17, + 0xb4, 0x1f, 0xb5, 0x0d, 0xb4, 0x29, 0xa2, 0x56, 0x34, 0x6d, 0xe7, 0xf2, 0x9a, 0x99, 0xf2, 0xf9, + 0x3c, 0x63, 0x0a, 0x3a, 0x61, 0x71, 0xf3, 0x29, 0xca, 0xed, 0xb6, 0x2d, 0x14, 0x24, 0xe6, 0xf2, + 0xa0, 0x82, 0x4d, 0x23, 0x6b, 0xac, 0x79, 0x24, 0xa5, 0x1b, 0x76, 0xa3, 0x6d, 0xc6, 0x03, 0x88, + 0x34, 0x12, 0x05, 0xed, 0x6b, 0x77, 0xb5, 0x78, 0x9f, 0xe9, 0x96, 0x80, 0xdf, 0xba, 0x92, 0xca, + 0x8e, 0x98, 0x78, 0xed, 0x0e, 0xc1, 0xec, 0x3e, 0x01, 0x78, 0x78, 0xb6, 0x1a, 0x27, 0x70, 0x9f, + 0x00, 0xf5, 0x25, 0x43, 0xec, 0x13, 0x28, 0xd6, 0xef, 0x3a, 0x73, 0xee, 0x75, 0x10, 0x57, 0xb6, + 0x72, 0x48, 0xd7, 0xa1, 0x60, 0xa8, 0xeb, 0x28, 0x05, 0xbf, 0x49, 0xdd, 0xa3, 0x35, 0xa4, 0x49, + 0xb1, 0x73, 0xb5, 0xf5, 0x2e, 0xcc, 0xe6, 0xfe, 0xb5, 0xf0, 0x84, 0xc5, 0x89, 0xa9, 0x18, 0xa2, + 0xeb, 0xca, 0x89, 0xdc, 0x1f, 0xe3, 0x94, 0x93, 0x3f, 0x88, 0x06, 0x4d, 0x35, 0x4a, 0xd7, 0xcd, + 0x2d, 0xac, 0x88, 0x35, 0x41, 0x4c, 0x54, 0x3e, 0xe1, 0x24, 0x6e, 0x5e, 0x17, 0x4d, 0xb9, 0x72, + 0xa0, 0x5e, 0x0b, 0xad, 0x40, 0xe2, 0xe6, 0x37, 0x7b, 0x8b, 0x26, 0x12, 0xb7, 0x6e, 0x2d, 0xe7, + 0xb3, 0x3f, 0xa0, 0xcb, 0xf6, 0x4a, 0xbe, 0x80, 0x65, 0xfa, 0x34, 0xd8, 0x3d, 0x88, 0x06, 0xf1, + 0xd9, 0x9f, 0x7e, 0x9a, 0x76, 0x0d, 0x32, 0x67, 0x07, 0xf2, 0x7a, 0x1a, 0xfe, 0x7b, 0x23, 0x8d, + 0x90, 0x58, 0x83, 0x5a, 0x90, 0xf3, 0x23, 0xa5, 0xe3, 0x97, 0x65, 0x2a, 0xd2, 0x7c, 0x3e, 0xe5, + 0x3c, 0x83, 0x47, 0x96, 0xa3, 0xf1, 0xd0, 0x95, 0x52, 0x3f, 0x52, 0xda, 0xa2, 0xec, 0x12, 0x37, + 0x1a, 0x8f, 0x96, 0x82, 0x9f, 0xa7, 0x59, 0x06, 0x22, 0x67, 0x34, 0x1e, 0x6a, 0x09, 0x11, 0x39, + 0x3e, 0xe1, 0xfc, 0xb4, 0xe6, 0x58, 0x9e, 0xfe, 0xab, 0x13, 0xd0, 0x3b, 0x50, 0xc7, 0x11, 0x52, + 0x3f, 0xad, 0x09, 0x21, 0xe7, 0xa7, 0x42, 0xc7, 0xd8, 0x8f, 0xa6, 0x6c, 0x42, 0x75, 0x04, 0xa2, + 0x7e, 0x2a, 0x94, 0x82, 0x1b, 0x9f, 0xcf, 0xde, 0xff, 0x9f, 0xaf, 0x6e, 0xac, 0xfd, 0xf4, 0xab, + 0x1b, 0x6b, 0xff, 0xfb, 0xd5, 0x8d, 0xb5, 0x9f, 0x7c, 0x7d, 0xe3, 0x8d, 0x9f, 0x7e, 0x7d, 0xe3, + 0x8d, 0x9f, 0x7d, 0x7d, 0xe3, 0x8d, 0x2f, 0xdf, 0x54, 0xbf, 0x9f, 0x7f, 0xf6, 0x0b, 0xf2, 0x57, + 0xf0, 0x9f, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x64, 0x71, 0xe6, 0xb7, 0x63, 0x7f, 0x00, + 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -435,6 +444,7 @@ type ClientCommandsClient interface { SpaceDelete(ctx context.Context, in *pb.RpcSpaceDeleteRequest, opts ...grpc.CallOption) (*pb.RpcSpaceDeleteResponse, error) SpaceInviteGenerate(ctx context.Context, in *pb.RpcSpaceInviteGenerateRequest, opts ...grpc.CallOption) (*pb.RpcSpaceInviteGenerateResponse, error) SpaceInviteGetCurrent(ctx context.Context, in *pb.RpcSpaceInviteGetCurrentRequest, opts ...grpc.CallOption) (*pb.RpcSpaceInviteGetCurrentResponse, error) + SpaceInviteGetGuest(ctx context.Context, in *pb.RpcSpaceInviteGetGuestRequest, opts ...grpc.CallOption) (*pb.RpcSpaceInviteGetGuestResponse, error) SpaceInviteRevoke(ctx context.Context, in *pb.RpcSpaceInviteRevokeRequest, opts ...grpc.CallOption) (*pb.RpcSpaceInviteRevokeResponse, error) SpaceInviteView(ctx context.Context, in *pb.RpcSpaceInviteViewRequest, opts ...grpc.CallOption) (*pb.RpcSpaceInviteViewResponse, error) SpaceJoin(ctx context.Context, in *pb.RpcSpaceJoinRequest, opts ...grpc.CallOption) (*pb.RpcSpaceJoinResponse, error) @@ -614,6 +624,7 @@ type ClientCommandsClient interface { BlockDataviewViewSetActive(ctx context.Context, in *pb.RpcBlockDataviewViewSetActiveRequest, opts ...grpc.CallOption) (*pb.RpcBlockDataviewViewSetActiveResponse, error) BlockDataviewViewSetPosition(ctx context.Context, in *pb.RpcBlockDataviewViewSetPositionRequest, opts ...grpc.CallOption) (*pb.RpcBlockDataviewViewSetPositionResponse, error) BlockDataviewSetSource(ctx context.Context, in *pb.RpcBlockDataviewSetSourceRequest, opts ...grpc.CallOption) (*pb.RpcBlockDataviewSetSourceResponse, error) + BlockDataviewRelationSet(ctx context.Context, in *pb.RpcBlockDataviewRelationSetRequest, opts ...grpc.CallOption) (*pb.RpcBlockDataviewRelationSetResponse, error) BlockDataviewRelationAdd(ctx context.Context, in *pb.RpcBlockDataviewRelationAddRequest, opts ...grpc.CallOption) (*pb.RpcBlockDataviewRelationAddResponse, error) BlockDataviewRelationDelete(ctx context.Context, in *pb.RpcBlockDataviewRelationDeleteRequest, opts ...grpc.CallOption) (*pb.RpcBlockDataviewRelationDeleteResponse, error) BlockDataviewGroupOrderUpdate(ctx context.Context, in *pb.RpcBlockDataviewGroupOrderUpdateRequest, opts ...grpc.CallOption) (*pb.RpcBlockDataviewGroupOrderUpdateResponse, error) @@ -737,7 +748,13 @@ type ClientCommandsClient interface { ChatReadMessages(ctx context.Context, in *pb.RpcChatReadMessagesRequest, opts ...grpc.CallOption) (*pb.RpcChatReadMessagesResponse, error) ChatUnreadMessages(ctx context.Context, in *pb.RpcChatUnreadRequest, opts ...grpc.CallOption) (*pb.RpcChatUnreadResponse, error) ChatSubscribeToMessagePreviews(ctx context.Context, in *pb.RpcChatSubscribeToMessagePreviewsRequest, opts ...grpc.CallOption) (*pb.RpcChatSubscribeToMessagePreviewsResponse, error) + ChatUnsubscribeFromMessagePreviews(ctx context.Context, in *pb.RpcChatUnsubscribeFromMessagePreviewsRequest, opts ...grpc.CallOption) (*pb.RpcChatUnsubscribeFromMessagePreviewsResponse, error) ObjectChatAdd(ctx context.Context, in *pb.RpcObjectChatAddRequest, opts ...grpc.CallOption) (*pb.RpcObjectChatAddResponse, error) + // mock AI RPCs for compatibility between branches. Not implemented in main + AIWritingTools(ctx context.Context, in *pb.RpcAIWritingToolsRequest, opts ...grpc.CallOption) (*pb.RpcAIWritingToolsResponse, error) + AIAutofill(ctx context.Context, in *pb.RpcAIAutofillRequest, opts ...grpc.CallOption) (*pb.RpcAIAutofillResponse, error) + AIListSummary(ctx context.Context, in *pb.RpcAIListSummaryRequest, opts ...grpc.CallOption) (*pb.RpcAIListSummaryResponse, error) + AIObjectCreateFromUrl(ctx context.Context, in *pb.RpcAIObjectCreateFromUrlRequest, opts ...grpc.CallOption) (*pb.RpcAIObjectCreateFromUrlResponse, error) } type clientCommandsClient struct { @@ -1081,6 +1098,15 @@ func (c *clientCommandsClient) SpaceInviteGetCurrent(ctx context.Context, in *pb return out, nil } +func (c *clientCommandsClient) SpaceInviteGetGuest(ctx context.Context, in *pb.RpcSpaceInviteGetGuestRequest, opts ...grpc.CallOption) (*pb.RpcSpaceInviteGetGuestResponse, error) { + out := new(pb.RpcSpaceInviteGetGuestResponse) + err := c.cc.Invoke(ctx, "/anytype.ClientCommands/SpaceInviteGetGuest", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *clientCommandsClient) SpaceInviteRevoke(ctx context.Context, in *pb.RpcSpaceInviteRevokeRequest, opts ...grpc.CallOption) (*pb.RpcSpaceInviteRevokeResponse, error) { out := new(pb.RpcSpaceInviteRevokeResponse) err := c.cc.Invoke(ctx, "/anytype.ClientCommands/SpaceInviteRevoke", in, out, opts...) @@ -2440,6 +2466,15 @@ func (c *clientCommandsClient) BlockDataviewSetSource(ctx context.Context, in *p return out, nil } +func (c *clientCommandsClient) BlockDataviewRelationSet(ctx context.Context, in *pb.RpcBlockDataviewRelationSetRequest, opts ...grpc.CallOption) (*pb.RpcBlockDataviewRelationSetResponse, error) { + out := new(pb.RpcBlockDataviewRelationSetResponse) + err := c.cc.Invoke(ctx, "/anytype.ClientCommands/BlockDataviewRelationSet", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *clientCommandsClient) BlockDataviewRelationAdd(ctx context.Context, in *pb.RpcBlockDataviewRelationAddRequest, opts ...grpc.CallOption) (*pb.RpcBlockDataviewRelationAddResponse, error) { out := new(pb.RpcBlockDataviewRelationAddResponse) err := c.cc.Invoke(ctx, "/anytype.ClientCommands/BlockDataviewRelationAdd", in, out, opts...) @@ -3327,6 +3362,15 @@ func (c *clientCommandsClient) ChatSubscribeToMessagePreviews(ctx context.Contex return out, nil } +func (c *clientCommandsClient) ChatUnsubscribeFromMessagePreviews(ctx context.Context, in *pb.RpcChatUnsubscribeFromMessagePreviewsRequest, opts ...grpc.CallOption) (*pb.RpcChatUnsubscribeFromMessagePreviewsResponse, error) { + out := new(pb.RpcChatUnsubscribeFromMessagePreviewsResponse) + err := c.cc.Invoke(ctx, "/anytype.ClientCommands/ChatUnsubscribeFromMessagePreviews", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *clientCommandsClient) ObjectChatAdd(ctx context.Context, in *pb.RpcObjectChatAddRequest, opts ...grpc.CallOption) (*pb.RpcObjectChatAddResponse, error) { out := new(pb.RpcObjectChatAddResponse) err := c.cc.Invoke(ctx, "/anytype.ClientCommands/ObjectChatAdd", in, out, opts...) @@ -3336,6 +3380,42 @@ func (c *clientCommandsClient) ObjectChatAdd(ctx context.Context, in *pb.RpcObje return out, nil } +func (c *clientCommandsClient) AIWritingTools(ctx context.Context, in *pb.RpcAIWritingToolsRequest, opts ...grpc.CallOption) (*pb.RpcAIWritingToolsResponse, error) { + out := new(pb.RpcAIWritingToolsResponse) + err := c.cc.Invoke(ctx, "/anytype.ClientCommands/AIWritingTools", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *clientCommandsClient) AIAutofill(ctx context.Context, in *pb.RpcAIAutofillRequest, opts ...grpc.CallOption) (*pb.RpcAIAutofillResponse, error) { + out := new(pb.RpcAIAutofillResponse) + err := c.cc.Invoke(ctx, "/anytype.ClientCommands/AIAutofill", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *clientCommandsClient) AIListSummary(ctx context.Context, in *pb.RpcAIListSummaryRequest, opts ...grpc.CallOption) (*pb.RpcAIListSummaryResponse, error) { + out := new(pb.RpcAIListSummaryResponse) + err := c.cc.Invoke(ctx, "/anytype.ClientCommands/AIListSummary", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *clientCommandsClient) AIObjectCreateFromUrl(ctx context.Context, in *pb.RpcAIObjectCreateFromUrlRequest, opts ...grpc.CallOption) (*pb.RpcAIObjectCreateFromUrlResponse, error) { + out := new(pb.RpcAIObjectCreateFromUrlResponse) + err := c.cc.Invoke(ctx, "/anytype.ClientCommands/AIObjectCreateFromUrl", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ClientCommandsServer is the server API for ClientCommands service. type ClientCommandsServer interface { AppGetVersion(context.Context, *pb.RpcAppGetVersionRequest) *pb.RpcAppGetVersionResponse @@ -3383,6 +3463,7 @@ type ClientCommandsServer interface { SpaceDelete(context.Context, *pb.RpcSpaceDeleteRequest) *pb.RpcSpaceDeleteResponse SpaceInviteGenerate(context.Context, *pb.RpcSpaceInviteGenerateRequest) *pb.RpcSpaceInviteGenerateResponse SpaceInviteGetCurrent(context.Context, *pb.RpcSpaceInviteGetCurrentRequest) *pb.RpcSpaceInviteGetCurrentResponse + SpaceInviteGetGuest(context.Context, *pb.RpcSpaceInviteGetGuestRequest) *pb.RpcSpaceInviteGetGuestResponse SpaceInviteRevoke(context.Context, *pb.RpcSpaceInviteRevokeRequest) *pb.RpcSpaceInviteRevokeResponse SpaceInviteView(context.Context, *pb.RpcSpaceInviteViewRequest) *pb.RpcSpaceInviteViewResponse SpaceJoin(context.Context, *pb.RpcSpaceJoinRequest) *pb.RpcSpaceJoinResponse @@ -3562,6 +3643,7 @@ type ClientCommandsServer interface { BlockDataviewViewSetActive(context.Context, *pb.RpcBlockDataviewViewSetActiveRequest) *pb.RpcBlockDataviewViewSetActiveResponse BlockDataviewViewSetPosition(context.Context, *pb.RpcBlockDataviewViewSetPositionRequest) *pb.RpcBlockDataviewViewSetPositionResponse BlockDataviewSetSource(context.Context, *pb.RpcBlockDataviewSetSourceRequest) *pb.RpcBlockDataviewSetSourceResponse + BlockDataviewRelationSet(context.Context, *pb.RpcBlockDataviewRelationSetRequest) *pb.RpcBlockDataviewRelationSetResponse BlockDataviewRelationAdd(context.Context, *pb.RpcBlockDataviewRelationAddRequest) *pb.RpcBlockDataviewRelationAddResponse BlockDataviewRelationDelete(context.Context, *pb.RpcBlockDataviewRelationDeleteRequest) *pb.RpcBlockDataviewRelationDeleteResponse BlockDataviewGroupOrderUpdate(context.Context, *pb.RpcBlockDataviewGroupOrderUpdateRequest) *pb.RpcBlockDataviewGroupOrderUpdateResponse @@ -3685,7 +3767,13 @@ type ClientCommandsServer interface { ChatReadMessages(context.Context, *pb.RpcChatReadMessagesRequest) *pb.RpcChatReadMessagesResponse ChatUnreadMessages(context.Context, *pb.RpcChatUnreadRequest) *pb.RpcChatUnreadResponse ChatSubscribeToMessagePreviews(context.Context, *pb.RpcChatSubscribeToMessagePreviewsRequest) *pb.RpcChatSubscribeToMessagePreviewsResponse + ChatUnsubscribeFromMessagePreviews(context.Context, *pb.RpcChatUnsubscribeFromMessagePreviewsRequest) *pb.RpcChatUnsubscribeFromMessagePreviewsResponse ObjectChatAdd(context.Context, *pb.RpcObjectChatAddRequest) *pb.RpcObjectChatAddResponse + // mock AI RPCs for compatibility between branches. Not implemented in main + AIWritingTools(context.Context, *pb.RpcAIWritingToolsRequest) *pb.RpcAIWritingToolsResponse + AIAutofill(context.Context, *pb.RpcAIAutofillRequest) *pb.RpcAIAutofillResponse + AIListSummary(context.Context, *pb.RpcAIListSummaryRequest) *pb.RpcAIListSummaryResponse + AIObjectCreateFromUrl(context.Context, *pb.RpcAIObjectCreateFromUrlRequest) *pb.RpcAIObjectCreateFromUrlResponse } // UnimplementedClientCommandsServer can be embedded to have forward compatible implementations. @@ -3803,6 +3891,9 @@ func (*UnimplementedClientCommandsServer) SpaceInviteGenerate(ctx context.Contex func (*UnimplementedClientCommandsServer) SpaceInviteGetCurrent(ctx context.Context, req *pb.RpcSpaceInviteGetCurrentRequest) *pb.RpcSpaceInviteGetCurrentResponse { return nil } +func (*UnimplementedClientCommandsServer) SpaceInviteGetGuest(ctx context.Context, req *pb.RpcSpaceInviteGetGuestRequest) *pb.RpcSpaceInviteGetGuestResponse { + return nil +} func (*UnimplementedClientCommandsServer) SpaceInviteRevoke(ctx context.Context, req *pb.RpcSpaceInviteRevokeRequest) *pb.RpcSpaceInviteRevokeResponse { return nil } @@ -4256,6 +4347,9 @@ func (*UnimplementedClientCommandsServer) BlockDataviewViewSetPosition(ctx conte func (*UnimplementedClientCommandsServer) BlockDataviewSetSource(ctx context.Context, req *pb.RpcBlockDataviewSetSourceRequest) *pb.RpcBlockDataviewSetSourceResponse { return nil } +func (*UnimplementedClientCommandsServer) BlockDataviewRelationSet(ctx context.Context, req *pb.RpcBlockDataviewRelationSetRequest) *pb.RpcBlockDataviewRelationSetResponse { + return nil +} func (*UnimplementedClientCommandsServer) BlockDataviewRelationAdd(ctx context.Context, req *pb.RpcBlockDataviewRelationAddRequest) *pb.RpcBlockDataviewRelationAddResponse { return nil } @@ -4544,9 +4638,24 @@ func (*UnimplementedClientCommandsServer) ChatUnreadMessages(ctx context.Context func (*UnimplementedClientCommandsServer) ChatSubscribeToMessagePreviews(ctx context.Context, req *pb.RpcChatSubscribeToMessagePreviewsRequest) *pb.RpcChatSubscribeToMessagePreviewsResponse { return nil } +func (*UnimplementedClientCommandsServer) ChatUnsubscribeFromMessagePreviews(ctx context.Context, req *pb.RpcChatUnsubscribeFromMessagePreviewsRequest) *pb.RpcChatUnsubscribeFromMessagePreviewsResponse { + return nil +} func (*UnimplementedClientCommandsServer) ObjectChatAdd(ctx context.Context, req *pb.RpcObjectChatAddRequest) *pb.RpcObjectChatAddResponse { return nil } +func (*UnimplementedClientCommandsServer) AIWritingTools(ctx context.Context, req *pb.RpcAIWritingToolsRequest) *pb.RpcAIWritingToolsResponse { + return nil +} +func (*UnimplementedClientCommandsServer) AIAutofill(ctx context.Context, req *pb.RpcAIAutofillRequest) *pb.RpcAIAutofillResponse { + return nil +} +func (*UnimplementedClientCommandsServer) AIListSummary(ctx context.Context, req *pb.RpcAIListSummaryRequest) *pb.RpcAIListSummaryResponse { + return nil +} +func (*UnimplementedClientCommandsServer) AIObjectCreateFromUrl(ctx context.Context, req *pb.RpcAIObjectCreateFromUrlRequest) *pb.RpcAIObjectCreateFromUrlResponse { + return nil +} func RegisterClientCommandsServer(s *grpc.Server, srv ClientCommandsServer) { s.RegisterService(&_ClientCommands_serviceDesc, srv) @@ -5218,6 +5327,24 @@ func _ClientCommands_SpaceInviteGetCurrent_Handler(srv interface{}, ctx context. return interceptor(ctx, in, info, handler) } +func _ClientCommands_SpaceInviteGetGuest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(pb.RpcSpaceInviteGetGuestRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ClientCommandsServer).SpaceInviteGetGuest(ctx, in), nil + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/anytype.ClientCommands/SpaceInviteGetGuest", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ClientCommandsServer).SpaceInviteGetGuest(ctx, req.(*pb.RpcSpaceInviteGetGuestRequest)), nil + } + return interceptor(ctx, in, info, handler) +} + func _ClientCommands_SpaceInviteRevoke_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(pb.RpcSpaceInviteRevokeRequest) if err := dec(in); err != nil { @@ -7936,6 +8063,24 @@ func _ClientCommands_BlockDataviewSetSource_Handler(srv interface{}, ctx context return interceptor(ctx, in, info, handler) } +func _ClientCommands_BlockDataviewRelationSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(pb.RpcBlockDataviewRelationSetRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ClientCommandsServer).BlockDataviewRelationSet(ctx, in), nil + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/anytype.ClientCommands/BlockDataviewRelationSet", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ClientCommandsServer).BlockDataviewRelationSet(ctx, req.(*pb.RpcBlockDataviewRelationSetRequest)), nil + } + return interceptor(ctx, in, info, handler) +} + func _ClientCommands_BlockDataviewRelationAdd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(pb.RpcBlockDataviewRelationAddRequest) if err := dec(in); err != nil { @@ -9668,6 +9813,24 @@ func _ClientCommands_ChatSubscribeToMessagePreviews_Handler(srv interface{}, ctx return interceptor(ctx, in, info, handler) } +func _ClientCommands_ChatUnsubscribeFromMessagePreviews_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(pb.RpcChatUnsubscribeFromMessagePreviewsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ClientCommandsServer).ChatUnsubscribeFromMessagePreviews(ctx, in), nil + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/anytype.ClientCommands/ChatUnsubscribeFromMessagePreviews", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ClientCommandsServer).ChatUnsubscribeFromMessagePreviews(ctx, req.(*pb.RpcChatUnsubscribeFromMessagePreviewsRequest)), nil + } + return interceptor(ctx, in, info, handler) +} + func _ClientCommands_ObjectChatAdd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(pb.RpcObjectChatAddRequest) if err := dec(in); err != nil { @@ -9686,6 +9849,78 @@ func _ClientCommands_ObjectChatAdd_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _ClientCommands_AIWritingTools_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(pb.RpcAIWritingToolsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ClientCommandsServer).AIWritingTools(ctx, in), nil + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/anytype.ClientCommands/AIWritingTools", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ClientCommandsServer).AIWritingTools(ctx, req.(*pb.RpcAIWritingToolsRequest)), nil + } + return interceptor(ctx, in, info, handler) +} + +func _ClientCommands_AIAutofill_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(pb.RpcAIAutofillRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ClientCommandsServer).AIAutofill(ctx, in), nil + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/anytype.ClientCommands/AIAutofill", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ClientCommandsServer).AIAutofill(ctx, req.(*pb.RpcAIAutofillRequest)), nil + } + return interceptor(ctx, in, info, handler) +} + +func _ClientCommands_AIListSummary_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(pb.RpcAIListSummaryRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ClientCommandsServer).AIListSummary(ctx, in), nil + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/anytype.ClientCommands/AIListSummary", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ClientCommandsServer).AIListSummary(ctx, req.(*pb.RpcAIListSummaryRequest)), nil + } + return interceptor(ctx, in, info, handler) +} + +func _ClientCommands_AIObjectCreateFromUrl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(pb.RpcAIObjectCreateFromUrlRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ClientCommandsServer).AIObjectCreateFromUrl(ctx, in), nil + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/anytype.ClientCommands/AIObjectCreateFromUrl", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ClientCommandsServer).AIObjectCreateFromUrl(ctx, req.(*pb.RpcAIObjectCreateFromUrlRequest)), nil + } + return interceptor(ctx, in, info, handler) +} + var _ClientCommands_serviceDesc = grpc.ServiceDesc{ ServiceName: "anytype.ClientCommands", HandlerType: (*ClientCommandsServer)(nil), @@ -9838,6 +10073,10 @@ var _ClientCommands_serviceDesc = grpc.ServiceDesc{ MethodName: "SpaceInviteGetCurrent", Handler: _ClientCommands_SpaceInviteGetCurrent_Handler, }, + { + MethodName: "SpaceInviteGetGuest", + Handler: _ClientCommands_SpaceInviteGetGuest_Handler, + }, { MethodName: "SpaceInviteRevoke", Handler: _ClientCommands_SpaceInviteRevoke_Handler, @@ -10442,6 +10681,10 @@ var _ClientCommands_serviceDesc = grpc.ServiceDesc{ MethodName: "BlockDataviewSetSource", Handler: _ClientCommands_BlockDataviewSetSource_Handler, }, + { + MethodName: "BlockDataviewRelationSet", + Handler: _ClientCommands_BlockDataviewRelationSet_Handler, + }, { MethodName: "BlockDataviewRelationAdd", Handler: _ClientCommands_BlockDataviewRelationAdd_Handler, @@ -10822,10 +11065,30 @@ var _ClientCommands_serviceDesc = grpc.ServiceDesc{ MethodName: "ChatSubscribeToMessagePreviews", Handler: _ClientCommands_ChatSubscribeToMessagePreviews_Handler, }, + { + MethodName: "ChatUnsubscribeFromMessagePreviews", + Handler: _ClientCommands_ChatUnsubscribeFromMessagePreviews_Handler, + }, { MethodName: "ObjectChatAdd", Handler: _ClientCommands_ObjectChatAdd_Handler, }, + { + MethodName: "AIWritingTools", + Handler: _ClientCommands_AIWritingTools_Handler, + }, + { + MethodName: "AIAutofill", + Handler: _ClientCommands_AIAutofill_Handler, + }, + { + MethodName: "AIListSummary", + Handler: _ClientCommands_AIListSummary_Handler, + }, + { + MethodName: "AIObjectCreateFromUrl", + Handler: _ClientCommands_AIObjectCreateFromUrl_Handler, + }, }, Streams: []grpc.StreamDesc{ { From c49e788bc7e7fc46c0193d907b10571064283959 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 28 Mar 2025 12:05:13 +0100 Subject: [PATCH 104/132] GO-4459: Refactor export service and update API for markdown export --- .mockery.yaml | 2 + core/api/apicore/apicore.go | 6 +- .../mock_apicore/mock_AccountService.go | 95 + .../mock_apicore/mock_ExportService.go | 96 + core/api/docs/docs.go | 4 +- core/api/docs/swagger.json | 4 +- core/api/docs/swagger.yaml | 20 +- core/api/internal/export/handler.go | 22 +- core/api/internal/export/model.go | 6 +- core/api/internal/export/service.go | 37 +- core/api/internal/export/service_test.go | 204 +- core/api/server/middleware.go | 2 +- core/api/server/middleware_test.go | 24 +- core/api/server/router.go | 4 +- core/api/server/router_test.go | 15 +- core/api/server/server.go | 6 +- core/api/server/server_test.go | 19 +- core/api/service.go | 7 +- pb/commands.pb.go | 11278 +++++++++++++--- 19 files changed, 9513 insertions(+), 2338 deletions(-) create mode 100644 core/api/apicore/mock_apicore/mock_AccountService.go create mode 100644 core/api/apicore/mock_apicore/mock_ExportService.go diff --git a/.mockery.yaml b/.mockery.yaml index 18ad4e2ea..e73c1de56 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -239,6 +239,8 @@ packages: Service: github.com/anyproto/anytype-heart/core/api/apicore: interfaces: + AccountService: + ExportService: ClientCommands: github.com/anyproto/anytype-heart/core/block/template: interfaces: diff --git a/core/api/apicore/apicore.go b/core/api/apicore/apicore.go index 5c05add4a..288a5e03b 100644 --- a/core/api/apicore/apicore.go +++ b/core/api/apicore/apicore.go @@ -7,10 +7,14 @@ import ( "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) -type AccountInfo interface { +type AccountService interface { GetInfo(ctx context.Context) (*model.AccountInfo, error) } +type ExportService interface { + ExportSingleInMemory(ctx context.Context, spaceId string, objectId string, format model.ExportFormat) (res string, err error) +} + type ClientCommands interface { // Wallet AccountLocalLinkNewChallenge(context.Context, *pb.RpcAccountLocalLinkNewChallengeRequest) *pb.RpcAccountLocalLinkNewChallengeResponse diff --git a/core/api/apicore/mock_apicore/mock_AccountService.go b/core/api/apicore/mock_apicore/mock_AccountService.go new file mode 100644 index 000000000..3470f1d7d --- /dev/null +++ b/core/api/apicore/mock_apicore/mock_AccountService.go @@ -0,0 +1,95 @@ +// Code generated by mockery. DO NOT EDIT. + +package mock_apicore + +import ( + context "context" + + model "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + mock "github.com/stretchr/testify/mock" +) + +// MockAccountService is an autogenerated mock type for the AccountService type +type MockAccountService struct { + mock.Mock +} + +type MockAccountService_Expecter struct { + mock *mock.Mock +} + +func (_m *MockAccountService) EXPECT() *MockAccountService_Expecter { + return &MockAccountService_Expecter{mock: &_m.Mock} +} + +// GetInfo provides a mock function with given fields: ctx +func (_m *MockAccountService) GetInfo(ctx context.Context) (*model.AccountInfo, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for GetInfo") + } + + var r0 *model.AccountInfo + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*model.AccountInfo, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *model.AccountInfo); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*model.AccountInfo) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// MockAccountService_GetInfo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetInfo' +type MockAccountService_GetInfo_Call struct { + *mock.Call +} + +// GetInfo is a helper method to define mock.On call +// - ctx context.Context +func (_e *MockAccountService_Expecter) GetInfo(ctx interface{}) *MockAccountService_GetInfo_Call { + return &MockAccountService_GetInfo_Call{Call: _e.mock.On("GetInfo", ctx)} +} + +func (_c *MockAccountService_GetInfo_Call) Run(run func(ctx context.Context)) *MockAccountService_GetInfo_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *MockAccountService_GetInfo_Call) Return(_a0 *model.AccountInfo, _a1 error) *MockAccountService_GetInfo_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *MockAccountService_GetInfo_Call) RunAndReturn(run func(context.Context) (*model.AccountInfo, error)) *MockAccountService_GetInfo_Call { + _c.Call.Return(run) + return _c +} + +// NewMockAccountService creates a new instance of MockAccountService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockAccountService(t interface { + mock.TestingT + Cleanup(func()) +}) *MockAccountService { + mock := &MockAccountService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/core/api/apicore/mock_apicore/mock_ExportService.go b/core/api/apicore/mock_apicore/mock_ExportService.go new file mode 100644 index 000000000..03c40c5a5 --- /dev/null +++ b/core/api/apicore/mock_apicore/mock_ExportService.go @@ -0,0 +1,96 @@ +// Code generated by mockery. DO NOT EDIT. + +package mock_apicore + +import ( + context "context" + + model "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + mock "github.com/stretchr/testify/mock" +) + +// MockExportService is an autogenerated mock type for the ExportService type +type MockExportService struct { + mock.Mock +} + +type MockExportService_Expecter struct { + mock *mock.Mock +} + +func (_m *MockExportService) EXPECT() *MockExportService_Expecter { + return &MockExportService_Expecter{mock: &_m.Mock} +} + +// ExportSingleInMemory provides a mock function with given fields: ctx, spaceId, objectId, format +func (_m *MockExportService) ExportSingleInMemory(ctx context.Context, spaceId string, objectId string, format model.ExportFormat) (string, error) { + ret := _m.Called(ctx, spaceId, objectId, format) + + if len(ret) == 0 { + panic("no return value specified for ExportSingleInMemory") + } + + var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, model.ExportFormat) (string, error)); ok { + return rf(ctx, spaceId, objectId, format) + } + if rf, ok := ret.Get(0).(func(context.Context, string, string, model.ExportFormat) string); ok { + r0 = rf(ctx, spaceId, objectId, format) + } else { + r0 = ret.Get(0).(string) + } + + if rf, ok := ret.Get(1).(func(context.Context, string, string, model.ExportFormat) error); ok { + r1 = rf(ctx, spaceId, objectId, format) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// MockExportService_ExportSingleInMemory_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ExportSingleInMemory' +type MockExportService_ExportSingleInMemory_Call struct { + *mock.Call +} + +// ExportSingleInMemory is a helper method to define mock.On call +// - ctx context.Context +// - spaceId string +// - objectId string +// - format model.ExportFormat +func (_e *MockExportService_Expecter) ExportSingleInMemory(ctx interface{}, spaceId interface{}, objectId interface{}, format interface{}) *MockExportService_ExportSingleInMemory_Call { + return &MockExportService_ExportSingleInMemory_Call{Call: _e.mock.On("ExportSingleInMemory", ctx, spaceId, objectId, format)} +} + +func (_c *MockExportService_ExportSingleInMemory_Call) Run(run func(ctx context.Context, spaceId string, objectId string, format model.ExportFormat)) *MockExportService_ExportSingleInMemory_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].(string), args[3].(model.ExportFormat)) + }) + return _c +} + +func (_c *MockExportService_ExportSingleInMemory_Call) Return(res string, err error) *MockExportService_ExportSingleInMemory_Call { + _c.Call.Return(res, err) + return _c +} + +func (_c *MockExportService_ExportSingleInMemory_Call) RunAndReturn(run func(context.Context, string, string, model.ExportFormat) (string, error)) *MockExportService_ExportSingleInMemory_Call { + _c.Call.Return(run) + return _c +} + +// NewMockExportService creates a new instance of MockExportService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockExportService(t interface { + mock.TestingT + Cleanup(func()) +}) *MockExportService { + mock := &MockExportService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 2489e0057..9df39a837 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -6,10 +6,10 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"markdown":{"example":"# This is the title\n...","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects associated with a specific list (query or collection) within a space. When a view ID is provided, the objects are filtered and sorted according to the view's configuration. If no view ID is specified, all list objects are returned without filtering and sorting. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. The member_id path parameter can be provided as either the member's ID (starting with ` + "`" + `_participant` + "`" + `) or the member's identity. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects associated with a specific list (query or collection) within a space. When a view ID is provided, the objects are filtered and sorted according to the view's configuration. If no view ID is specified, all list objects are returned without filtering and sorting. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. The member_id path parameter can be provided as either the member's ID (starting with ` + "`" + `_participant` + "`" + `) or the member's identity. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/{format}":{"get":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” only). The endpoint calls the export service which converts the object’s content into the requested format. It is useful for sharing, or displaying the markdown representation of the objecte externally.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index b42a9f279..1e920c083 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,8 +1,8 @@ { - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"path":{"description":"The path the object was exported to","example":"/path/to/export","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"markdown":{"example":"# This is the title\n...","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects associated with a specific list (query or collection) within a space. When a view ID is provided, the objects are filtered and sorted according to the view's configuration. If no view ID is specified, all list objects are returned without filtering and sorting. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. The member_id path parameter can be provided as either the member's ID (starting with `_participant`) or the member's identity. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/export/{format}":{"post":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown","protobuf"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects associated with a specific list (query or collection) within a space. When a view ID is provided, the objects are filtered and sorted according to the view's configuration. If no view ID is specified, all list objects are returned without filtering and sorting. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. The member_id path parameter can be provided as either the member's ID (starting with `_participant`) or the member's identity. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/{format}":{"get":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” only). The endpoint calls the export service which converts the object’s content into the requested format. It is useful for sharing, or displaying the markdown representation of the objecte externally.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 0cf6ef1ff..49af7b2fa 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -21,9 +21,10 @@ components: type: object export.ObjectExportResponse: properties: - path: - description: The path the object was exported to - example: /path/to/export + markdown: + example: |- + # This is the title + ... type: string type: object list.Filter: @@ -1765,15 +1766,13 @@ paths: summary: Get object tags: - objects - /spaces/{space_id}/objects/{object_id}/export/{format}: - post: + /spaces/{space_id}/objects/{object_id}/{format}: + get: description: This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently - supporting “markdown” and “protobuf”), and clients can optionally specify - an export path in the request body. The endpoint calls an export service which - converts the object’s content into the requested format and returns the file - path where the exported data is stored. It is useful for data backup, sharing, - or further processing. + supporting “markdown” only). The endpoint calls the export service which converts + the object’s content into the requested format. It is useful for sharing, + or displaying the markdown representation of the objecte externally. parameters: - description: Space ID in: path @@ -1794,7 +1793,6 @@ paths: schema: enum: - markdown - - protobuf type: string requestBody: content: diff --git a/core/api/internal/export/handler.go b/core/api/internal/export/handler.go index cc4c05813..1808e8af9 100644 --- a/core/api/internal/export/handler.go +++ b/core/api/internal/export/handler.go @@ -11,34 +11,28 @@ import ( // GetObjectExportHandler exports an object in specified format // // @Summary Export object -// @Description This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” and “protobuf”), and clients can optionally specify an export path in the request body. The endpoint calls an export service which converts the object’s content into the requested format and returns the file path where the exported data is stored. It is useful for data backup, sharing, or further processing. +// @Description This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” only). The endpoint calls the export service which converts the object’s content into the requested format. It is useful for sharing, or displaying the markdown representation of the objecte externally. // @Tags export // @Accept json // @Produce json // @Param space_id path string true "Space ID" // @Param object_id path string true "Object ID" -// @Param format path string true "Export format" Enums(markdown,protobuf) +// @Param format path string true "Export format" Enums(markdown) // @Success 200 {object} ObjectExportResponse "Object exported successfully" // @Failure 400 {object} util.ValidationError "Bad request" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 500 {object} util.ServerError "Internal server error" // @Security bearerauth -// @Router /spaces/{space_id}/objects/{object_id}/export/{format} [post] +// @Router /spaces/{space_id}/objects/{object_id}/{format} [get] func GetObjectExportHandler(s *ExportService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") objectId := c.Param("object_id") - format := c.Query("format") + format := c.Param("format") - objectAsRequest := ObjectExportRequest{} - if err := c.ShouldBindJSON(&objectAsRequest); err != nil { - apiErr := util.CodeToAPIError(http.StatusBadRequest, ErrBadInput.Error()) - c.JSON(http.StatusBadRequest, apiErr) - return - } - - outputPath, err := s.GetObjectExport(c.Request.Context(), spaceId, objectId, format, objectAsRequest.Path) - code := util.MapErrorCode(err, util.ErrToCode(ErrFailedExportObjectAsMarkdown, http.StatusInternalServerError)) + markdown, err := s.GetObjectExport(c.Request.Context(), spaceId, objectId, format) + code := util.MapErrorCode(err, + util.ErrToCode(ErrInvalidExportFormat, http.StatusInternalServerError)) if code != http.StatusOK { apiErr := util.CodeToAPIError(code, err.Error()) @@ -46,6 +40,6 @@ func GetObjectExportHandler(s *ExportService) gin.HandlerFunc { return } - c.JSON(http.StatusOK, ObjectExportResponse{Path: outputPath}) + c.JSON(http.StatusOK, ObjectExportResponse{Markdown: markdown}) } } diff --git a/core/api/internal/export/model.go b/core/api/internal/export/model.go index e6541b62b..9288ea039 100644 --- a/core/api/internal/export/model.go +++ b/core/api/internal/export/model.go @@ -1,9 +1,5 @@ package export -type ObjectExportRequest struct { - Path string `json:"path" example:"/path/to/export"` // The path to export the object to -} - type ObjectExportResponse struct { - Path string `json:"path" example:"/path/to/export"` // The path the object was exported to + Markdown string `json:"markdown" example:"# This is the title\n..."` } diff --git a/core/api/internal/export/service.go b/core/api/internal/export/service.go index ce4bb3d46..b66df2c8a 100644 --- a/core/api/internal/export/service.go +++ b/core/api/internal/export/service.go @@ -5,13 +5,11 @@ import ( "errors" "github.com/anyproto/anytype-heart/core/api/apicore" - "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) var ( - ErrFailedExportObjectAsMarkdown = errors.New("failed to export object as markdown") - ErrBadInput = errors.New("bad input") + ErrInvalidExportFormat = errors.New("format is not supported") ) type Service interface { @@ -19,33 +17,26 @@ type Service interface { } type ExportService struct { - mw apicore.ClientCommands + mw apicore.ClientCommands + exportService apicore.ExportService } -func NewService(mw apicore.ClientCommands) *ExportService { - return &ExportService{mw: mw} +func NewService(mw apicore.ClientCommands, exportService apicore.ExportService) *ExportService { + return &ExportService{mw: mw, exportService: exportService} } // GetObjectExport retrieves an object from a space and exports it as a specific format. -func (s *ExportService) GetObjectExport(ctx context.Context, spaceId string, objectId string, format string, path string) (string, error) { - resp := s.mw.ObjectListExport(ctx, &pb.RpcObjectListExportRequest{ - SpaceId: spaceId, - Path: path, - ObjectIds: []string{objectId}, - Format: s.mapStringToFormat(format), - Zip: false, - IncludeNested: false, - IncludeFiles: true, - IsJson: false, - IncludeArchived: false, - NoProgress: true, - }) - - if resp.Error.Code != pb.RpcObjectListExportResponseError_NULL { - return "", ErrFailedExportObjectAsMarkdown +func (s *ExportService) GetObjectExport(ctx context.Context, spaceId string, objectId string, format string) (string, error) { + if format != "markdown" { + return "", ErrInvalidExportFormat } - return resp.Path, nil + result, err := s.exportService.ExportSingleInMemory(ctx, spaceId, objectId, s.mapStringToFormat(format)) + if err != nil { + return "", err + } + + return result, nil } // mapStringToFormat maps a format string to an ExportFormat enum. diff --git a/core/api/internal/export/service_test.go b/core/api/internal/export/service_test.go index 332f7e828..08566a9a9 100644 --- a/core/api/internal/export/service_test.go +++ b/core/api/internal/export/service_test.go @@ -1,15 +1,9 @@ package export import ( - "context" "testing" - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/require" - "github.com/anyproto/anytype-heart/core/api/apicore/mock_apicore" - "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) const ( @@ -22,113 +16,117 @@ const ( type fixture struct { *ExportService - mwMock *mock_apicore.MockClientCommands + exportMock *mock_apicore.MockExportService + mwMock *mock_apicore.MockClientCommands } func newFixture(t *testing.T) *fixture { mwMock := mock_apicore.NewMockClientCommands(t) - exportService := NewService(mwMock) + exportMock := mock_apicore.NewMockExportService(t) + exportService := NewService(mwMock, exportMock) return &fixture{ ExportService: exportService, + exportMock: exportMock, mwMock: mwMock, } } func TestExportService_GetObjectExport(t *testing.T) { - t.Run("successful export to markdown", func(t *testing.T) { - // Given - ctx := context.Background() - fx := newFixture(t) - - // Mock the ObjectListExport call - fx.mwMock. - On("ObjectListExport", mock.Anything, &pb.RpcObjectListExportRequest{ - SpaceId: spaceID, - Path: exportPath, - ObjectIds: []string{objectID}, - Format: model.Export_Markdown, - Zip: false, - IncludeNested: false, - IncludeFiles: true, - IsJson: false, - IncludeArchived: false, - NoProgress: true, - }). - Return(&pb.RpcObjectListExportResponse{ - Path: exportPath, - Error: &pb.RpcObjectListExportResponseError{ - Code: pb.RpcObjectListExportResponseError_NULL, - }, - }). - Once() - - // When - gotPath, err := fx.GetObjectExport(ctx, spaceID, objectID, exportFormat, exportPath) - - // Then - require.NoError(t, err) - require.Equal(t, exportPath, gotPath) - fx.mwMock.AssertExpectations(t) - }) - - t.Run("failed export returns error", func(t *testing.T) { - // Given - ctx := context.Background() - fx := newFixture(t) - - // Mock the ObjectListExport call to return an error code - fx.mwMock. - On("ObjectListExport", mock.Anything, mock.Anything). - Return(&pb.RpcObjectListExportResponse{ - Path: "", - Error: &pb.RpcObjectListExportResponseError{ - Code: pb.RpcObjectListExportResponseError_UNKNOWN_ERROR, - }, - }). - Once() - - // When - gotPath, err := fx.GetObjectExport(ctx, spaceID, objectID, exportFormat, exportPath) - - // Then - require.Error(t, err) - require.Empty(t, gotPath) - require.ErrorIs(t, err, ErrFailedExportObjectAsMarkdown) - fx.mwMock.AssertExpectations(t) - }) - - t.Run("unrecognized format defaults to markdown", func(t *testing.T) { - ctx := context.Background() - fx := newFixture(t) - - fx.mwMock. - On("ObjectListExport", mock.Anything, &pb.RpcObjectListExportRequest{ - SpaceId: spaceID, - Path: exportPath, - ObjectIds: []string{objectID}, - Format: model.Export_Markdown, // fallback - Zip: false, - IncludeNested: false, - IncludeFiles: true, - IsJson: false, - IncludeArchived: false, - NoProgress: true, - }). - Return(&pb.RpcObjectListExportResponse{ - Path: exportPath, - Error: &pb.RpcObjectListExportResponseError{ - Code: pb.RpcObjectListExportResponseError_NULL, - }, - }). - Once() - - // When - gotPath, err := fx.GetObjectExport(ctx, spaceID, objectID, unrecognizedFormat, exportPath) // - - // Then - require.NoError(t, err) - require.Equal(t, exportPath, gotPath) - fx.mwMock.AssertExpectations(t) - }) + // TODO: revive tests once export is finalized + // t.Run("successful export to markdown", func(t *testing.T) { + // // Given + // ctx := context.Background() + // fx := newFixture(t) + // + // // Mock the ObjectListExport call + // fx.mwMock. + // On("ObjectListExport", mock.Anything, &pb.RpcObjectListExportRequest{ + // SpaceId: spaceID, + // Path: exportPath, + // ObjectIds: []string{objectID}, + // Format: model.Export_Markdown, + // Zip: false, + // IncludeNested: false, + // IncludeFiles: true, + // IsJson: false, + // IncludeArchived: false, + // NoProgress: true, + // }). + // Return(&pb.RpcObjectListExportResponse{ + // Path: exportPath, + // Error: &pb.RpcObjectListExportResponseError{ + // Code: pb.RpcObjectListExportResponseError_NULL, + // }, + // }). + // Once() + // + // // When + // gotPath, err := fx.GetObjectExport(ctx, spaceID, objectID, exportFormat) + // + // // Then + // require.NoError(t, err) + // require.Equal(t, exportPath, gotPath) + // fx.mwMock.AssertExpectations(t) + // }) + // + // t.Run("failed export returns error", func(t *testing.T) { + // // Given + // ctx := context.Background() + // fx := newFixture(t) + // + // // Mock the ObjectListExport call to return an error code + // fx.mwMock. + // On("ObjectListExport", mock.Anything, mock.Anything). + // Return(&pb.RpcObjectListExportResponse{ + // Path: "", + // Error: &pb.RpcObjectListExportResponseError{ + // Code: pb.RpcObjectListExportResponseError_UNKNOWN_ERROR, + // }, + // }). + // Once() + // + // // When + // gotPath, err := fx.GetObjectExport(ctx, spaceID, objectID, exportFormat) + // + // // Then + // require.Error(t, err) + // require.Empty(t, gotPath) + // require.ErrorIs(t, err, ErrFailedExportObjectAsMarkdown) + // fx.mwMock.AssertExpectations(t) + // }) + // + // t.Run("unrecognized format defaults to markdown", func(t *testing.T) { + // ctx := context.Background() + // fx := newFixture(t) + // + // fx.mwMock. + // On("ObjectListExport", mock.Anything, &pb.RpcObjectListExportRequest{ + // SpaceId: spaceID, + // Path: exportPath, + // ObjectIds: []string{objectID}, + // Format: model.Export_Markdown, // fallback + // Zip: false, + // IncludeNested: false, + // IncludeFiles: true, + // IsJson: false, + // IncludeArchived: false, + // NoProgress: true, + // }). + // Return(&pb.RpcObjectListExportResponse{ + // Path: exportPath, + // Error: &pb.RpcObjectListExportResponseError{ + // Code: pb.RpcObjectListExportResponseError_NULL, + // }, + // }). + // Once() + // + // // When + // gotPath, err := fx.GetObjectExport(ctx, spaceID, objectID, unrecognizedFormat) + // + // // Then + // require.NoError(t, err) + // require.Equal(t, exportPath, gotPath) + // fx.mwMock.AssertExpectations(t) + // }) } diff --git a/core/api/server/middleware.go b/core/api/server/middleware.go index 1ac02aa98..833177aa4 100644 --- a/core/api/server/middleware.go +++ b/core/api/server/middleware.go @@ -85,7 +85,7 @@ func (s *Server) ensureAuthenticated(mw apicore.ClientCommands) gin.HandlerFunc } // ensureAccountInfo is a middleware that ensures the account info is available in the services. -func (s *Server) ensureAccountInfo(accountService apicore.AccountInfo) gin.HandlerFunc { +func (s *Server) ensureAccountInfo(accountService apicore.AccountService) gin.HandlerFunc { return func(c *gin.Context) { accInfo, err := accountService.GetInfo(context.Background()) if err != nil { diff --git a/core/api/server/middleware_test.go b/core/api/server/middleware_test.go index a51f50dfc..509d5f370 100644 --- a/core/api/server/middleware_test.go +++ b/core/api/server/middleware_test.go @@ -11,25 +11,11 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" - "github.com/anyproto/anytype-heart/core/anytype/account/mock_account" - "github.com/anyproto/anytype-heart/core/api/apicore/mock_apicore" "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) -func newFixture(t *testing.T) *fixture { - mwMock := mock_apicore.NewMockClientCommands(t) - accountService := mock_account.NewMockService(t) - server := NewServer(accountService, mwMock) - - return &fixture{ - Server: server, - accountService: accountService, - mwMock: mwMock, - } -} - func TestEnsureMetadataHeader(t *testing.T) { t.Run("sets correct header", func(t *testing.T) { // given @@ -161,10 +147,10 @@ func TestEnsureAccountInfo(t *testing.T) { expectedInfo := &model.AccountInfo{ GatewayUrl: "http://localhost:31006", } - fx.accountService.(*mock_account.MockService).On("GetInfo", mock.Anything).Return(expectedInfo, nil).Once() + fx.accountService.On("GetInfo", mock.Anything).Return(expectedInfo, nil).Once() // when - middleware := fx.ensureAccountInfo(fx.accountService) + middleware := fx.ensureAccountInfo(&fx.accountService) w := httptest.NewRecorder() c, _ := gin.CreateTestContext(w) @@ -181,11 +167,9 @@ func TestEnsureAccountInfo(t *testing.T) { // given fx := newFixture(t) expectedErr := errors.New("failed to get info") - fx.accountService.(*mock_account.MockService). - On("GetInfo", mock.Anything). - Return(nil, expectedErr).Once() + fx.accountService.On("GetInfo", mock.Anything).Return(nil, expectedErr).Once() - middleware := fx.ensureAccountInfo(fx.accountService) + middleware := fx.ensureAccountInfo(&fx.accountService) w := httptest.NewRecorder() c, _ := gin.CreateTestContext(w) middleware(c) diff --git a/core/api/server/router.go b/core/api/server/router.go index 3cb89298f..a2fcb9616 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -28,7 +28,7 @@ const ( ) // NewRouter builds and returns a *gin.Engine with all routes configured. -func (s *Server) NewRouter(accountService apicore.AccountInfo, mw apicore.ClientCommands) *gin.Engine { +func (s *Server) NewRouter(mw apicore.ClientCommands, accountService apicore.AccountService) *gin.Engine { debug := os.Getenv("ANYTYPE_API_DEBUG") == "1" if !debug { gin.SetMode(gin.ReleaseMode) @@ -65,7 +65,7 @@ func (s *Server) NewRouter(accountService apicore.AccountInfo, mw apicore.Client v1.Use(s.ensureAccountInfo(accountService)) { // Export - v1.POST("/spaces/:space_id/objects/:object_id/export/:format", export.GetObjectExportHandler(s.exportService)) + v1.GET("/spaces/:space_id/objects/:object_id/:format", export.GetObjectExportHandler(s.exportService)) // List v1.GET("/spaces/:space_id/lists/:list_id/views", list.GetListViewsHandler(s.listService)) diff --git a/core/api/server/router_test.go b/core/api/server/router_test.go index 36331b194..cadc1a8c0 100644 --- a/core/api/server/router_test.go +++ b/core/api/server/router_test.go @@ -9,7 +9,6 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" - "github.com/anyproto/anytype-heart/core/anytype/account/mock_account" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) @@ -17,8 +16,8 @@ import ( func TestRouter_Unauthenticated(t *testing.T) { t.Run("GET /v1/spaces without auth returns 401", func(t *testing.T) { // given - fx := newServerFixture(t) - engine := fx.NewRouter(fx.accountService, fx.mwMock) + fx := newFixture(t) + engine := fx.NewRouter(fx.mwMock, &fx.accountService) w := httptest.NewRecorder() req := httptest.NewRequest("GET", "/v1/spaces", nil) @@ -33,8 +32,8 @@ func TestRouter_Unauthenticated(t *testing.T) { func TestRouter_AuthRoute(t *testing.T) { t.Run("POST /v1/auth/token is accessible without auth", func(t *testing.T) { // given - fx := newServerFixture(t) - engine := fx.NewRouter(fx.accountService, fx.mwMock) + fx := newFixture(t) + engine := fx.NewRouter(fx.mwMock, &fx.accountService) w := httptest.NewRecorder() req := httptest.NewRequest("POST", "/v1/auth/token", nil) @@ -49,10 +48,10 @@ func TestRouter_AuthRoute(t *testing.T) { func TestRouter_MetadataHeader(t *testing.T) { t.Run("Response includes Anytype-Version header", func(t *testing.T) { // given - fx := newServerFixture(t) - engine := fx.NewRouter(fx.accountService, fx.mwMock) + fx := newFixture(t) + engine := fx.NewRouter(fx.mwMock, &fx.accountService) fx.KeyToToken = map[string]string{"validKey": "dummyToken"} - fx.accountService.(*mock_account.MockService).On("GetInfo", mock.Anything). + fx.accountService.On("GetInfo", mock.Anything). Return(&model.AccountInfo{ GatewayUrl: "http://localhost:31006", }, nil).Once() diff --git a/core/api/server/server.go b/core/api/server/server.go index 0e9683c39..b27902f5d 100644 --- a/core/api/server/server.go +++ b/core/api/server/server.go @@ -30,17 +30,17 @@ type Server struct { } // NewServer constructs a new Server with default config and sets up the routes. -func NewServer(accountService apicore.AccountInfo, mw apicore.ClientCommands) *Server { +func NewServer(mw apicore.ClientCommands, accountService apicore.AccountService, exportService apicore.ExportService) *Server { s := &Server{ authService: auth.NewService(mw), - exportService: export.NewService(mw), + exportService: export.NewService(mw, exportService), spaceService: space.NewService(mw), } s.objectService = object.NewService(mw, s.spaceService) s.listService = list.NewService(mw, s.objectService) s.searchService = search.NewService(mw, s.spaceService, s.objectService) - s.engine = s.NewRouter(accountService, mw) + s.engine = s.NewRouter(mw, accountService) s.KeyToToken = make(map[string]string) return s diff --git a/core/api/server/server_test.go b/core/api/server/server_test.go index dd3535ffd..c31c118c2 100644 --- a/core/api/server/server_test.go +++ b/core/api/server/server_test.go @@ -5,25 +5,26 @@ import ( "github.com/stretchr/testify/require" - "github.com/anyproto/anytype-heart/core/anytype/account" - "github.com/anyproto/anytype-heart/core/anytype/account/mock_account" "github.com/anyproto/anytype-heart/core/api/apicore/mock_apicore" ) type fixture struct { *Server - accountService account.Service + accountService mock_apicore.MockAccountService + exportService mock_apicore.MockExportService mwMock *mock_apicore.MockClientCommands } -func newServerFixture(t *testing.T) *fixture { +func newFixture(t *testing.T) *fixture { mwMock := mock_apicore.NewMockClientCommands(t) - accountService := mock_account.NewMockService(t) - server := NewServer(accountService, mwMock) + accountService := mock_apicore.NewMockAccountService(t) + exportService := mock_apicore.NewMockExportService(t) + server := NewServer(mwMock, accountService, exportService) return &fixture{ Server: server, - accountService: accountService, + accountService: *accountService, + exportService: *exportService, mwMock: mwMock, } } @@ -31,7 +32,7 @@ func newServerFixture(t *testing.T) *fixture { func TestNewServer(t *testing.T) { t.Run("returns valid server", func(t *testing.T) { // when - s := newServerFixture(t) + s := newFixture(t) // then require.NotNil(t, s) @@ -51,7 +52,7 @@ func TestNewServer(t *testing.T) { func TestServer_Engine(t *testing.T) { t.Run("Engine returns same engine instance", func(t *testing.T) { // given - s := newServerFixture(t) + s := newFixture(t) // when engine := s.Engine() diff --git a/core/api/service.go b/core/api/service.go index eb9b0abc5..893580cb8 100644 --- a/core/api/service.go +++ b/core/api/service.go @@ -14,6 +14,7 @@ import ( "github.com/anyproto/anytype-heart/core/anytype/config" "github.com/anyproto/anytype-heart/core/api/apicore" "github.com/anyproto/anytype-heart/core/api/server" + "github.com/anyproto/anytype-heart/core/block/export" ) const ( @@ -34,7 +35,8 @@ type apiService struct { srv *server.Server httpSrv *http.Server mw apicore.ClientCommands - accountService apicore.AccountInfo + accountService apicore.AccountService + exportService apicore.ExportService listenAddr string lock sync.Mutex } @@ -66,6 +68,7 @@ func (s *apiService) Name() (name string) { func (s *apiService) Init(a *app.App) (err error) { s.listenAddr = a.MustComponent(config.CName).(*config.Config).JsonApiListenAddr s.accountService = a.MustComponent(account.CName).(account.Service) + s.exportService = a.MustComponent(export.CName).(apicore.ExportService) return nil } @@ -86,7 +89,7 @@ func (s *apiService) runServer() { return } - s.srv = server.NewServer(s.accountService, s.mw) + s.srv = server.NewServer(s.mw, s.accountService, s.exportService) s.httpSrv = &http.Server{ Addr: s.listenAddr, Handler: s.srv.Engine(), diff --git a/pb/commands.pb.go b/pb/commands.pb.go index fcd0b71ea..7ebd1bb2c 100644 --- a/pb/commands.pb.go +++ b/pb/commands.pb.go @@ -4,6 +4,7 @@ package pb import ( + encoding_binary "encoding/binary" fmt "fmt" model "github.com/anyproto/anytype-heart/pkg/lib/pb/model" proto "github.com/gogo/protobuf/proto" @@ -220,6 +221,31 @@ func (RpcSpaceMakeShareableResponseErrorCode) EnumDescriptor() ([]byte, []int) { return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 1, 1, 0, 0} } +type RpcSpaceInviteGenerateRequestInviteType int32 + +const ( + RpcSpaceInviteGenerateRequest_Member RpcSpaceInviteGenerateRequestInviteType = 0 + RpcSpaceInviteGenerateRequest_Guest RpcSpaceInviteGenerateRequestInviteType = 1 +) + +var RpcSpaceInviteGenerateRequestInviteType_name = map[int32]string{ + 0: "Member", + 1: "Guest", +} + +var RpcSpaceInviteGenerateRequestInviteType_value = map[string]int32{ + "Member": 0, + "Guest": 1, +} + +func (x RpcSpaceInviteGenerateRequestInviteType) String() string { + return proto.EnumName(RpcSpaceInviteGenerateRequestInviteType_name, int32(x)) +} + +func (RpcSpaceInviteGenerateRequestInviteType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 2, 0, 0} +} + type RpcSpaceInviteGenerateResponseErrorCode int32 const ( @@ -334,6 +360,37 @@ func (RpcSpaceInviteGetCurrentResponseErrorCode) EnumDescriptor() ([]byte, []int return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 4, 1, 0, 0} } +type RpcSpaceInviteGetGuestResponseErrorCode int32 + +const ( + RpcSpaceInviteGetGuestResponseError_NULL RpcSpaceInviteGetGuestResponseErrorCode = 0 + RpcSpaceInviteGetGuestResponseError_UNKNOWN_ERROR RpcSpaceInviteGetGuestResponseErrorCode = 1 + RpcSpaceInviteGetGuestResponseError_BAD_INPUT RpcSpaceInviteGetGuestResponseErrorCode = 2 + RpcSpaceInviteGetGuestResponseError_INVALID_SPACE_TYPE RpcSpaceInviteGetGuestResponseErrorCode = 101 +) + +var RpcSpaceInviteGetGuestResponseErrorCode_name = map[int32]string{ + 0: "NULL", + 1: "UNKNOWN_ERROR", + 2: "BAD_INPUT", + 101: "INVALID_SPACE_TYPE", +} + +var RpcSpaceInviteGetGuestResponseErrorCode_value = map[string]int32{ + "NULL": 0, + "UNKNOWN_ERROR": 1, + "BAD_INPUT": 2, + "INVALID_SPACE_TYPE": 101, +} + +func (x RpcSpaceInviteGetGuestResponseErrorCode) String() string { + return proto.EnumName(RpcSpaceInviteGetGuestResponseErrorCode_name, int32(x)) +} + +func (RpcSpaceInviteGetGuestResponseErrorCode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 5, 1, 0, 0} +} + type RpcSpaceInviteRevokeResponseErrorCode int32 const ( @@ -374,7 +431,7 @@ func (x RpcSpaceInviteRevokeResponseErrorCode) String() string { } func (RpcSpaceInviteRevokeResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 5, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 6, 1, 0, 0} } type RpcSpaceInviteViewResponseErrorCode int32 @@ -411,7 +468,7 @@ func (x RpcSpaceInviteViewResponseErrorCode) String() string { } func (RpcSpaceInviteViewResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 6, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 7, 1, 0, 0} } type RpcSpaceJoinResponseErrorCode int32 @@ -463,7 +520,7 @@ func (x RpcSpaceJoinResponseErrorCode) String() string { } func (RpcSpaceJoinResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 7, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 8, 1, 0, 0} } type RpcSpaceJoinCancelResponseErrorCode int32 @@ -509,7 +566,7 @@ func (x RpcSpaceJoinCancelResponseErrorCode) String() string { } func (RpcSpaceJoinCancelResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 8, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 9, 1, 0, 0} } type RpcSpaceRequestApproveResponseErrorCode int32 @@ -558,7 +615,7 @@ func (x RpcSpaceRequestApproveResponseErrorCode) String() string { } func (RpcSpaceRequestApproveResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 9, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 10, 1, 0, 0} } type RpcSpaceRequestDeclineResponseErrorCode int32 @@ -604,7 +661,7 @@ func (x RpcSpaceRequestDeclineResponseErrorCode) String() string { } func (RpcSpaceRequestDeclineResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 10, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 11, 1, 0, 0} } type RpcSpaceParticipantRemoveResponseErrorCode int32 @@ -650,7 +707,7 @@ func (x RpcSpaceParticipantRemoveResponseErrorCode) String() string { } func (RpcSpaceParticipantRemoveResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 11, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 12, 1, 0, 0} } type RpcSpaceParticipantPermissionsChangeResponseErrorCode int32 @@ -699,7 +756,7 @@ func (x RpcSpaceParticipantPermissionsChangeResponseErrorCode) String() string { } func (RpcSpaceParticipantPermissionsChangeResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 12, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 13, 1, 0, 0} } type RpcSpaceDeleteResponseErrorCode int32 @@ -742,7 +799,7 @@ func (x RpcSpaceDeleteResponseErrorCode) String() string { } func (RpcSpaceDeleteResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 13, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 14, 1, 0, 0} } type RpcSpaceSetOrderResponseErrorCode int32 @@ -770,7 +827,7 @@ func (x RpcSpaceSetOrderResponseErrorCode) String() string { } func (RpcSpaceSetOrderResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 14, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 15, 1, 0, 0} } type RpcSpaceUnsetOrderResponseErrorCode int32 @@ -798,7 +855,7 @@ func (x RpcSpaceUnsetOrderResponseErrorCode) String() string { } func (RpcSpaceUnsetOrderResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 15, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 16, 1, 0, 0} } type RpcWalletCreateResponseErrorCode int32 @@ -3799,18 +3856,21 @@ const ( RpcObjectImportUseCaseRequest_NONE RpcObjectImportUseCaseRequestUseCase = 0 RpcObjectImportUseCaseRequest_GET_STARTED RpcObjectImportUseCaseRequestUseCase = 1 RpcObjectImportUseCaseRequest_EMPTY RpcObjectImportUseCaseRequestUseCase = 2 + RpcObjectImportUseCaseRequest_GUIDE_ONLY RpcObjectImportUseCaseRequestUseCase = 3 ) var RpcObjectImportUseCaseRequestUseCase_name = map[int32]string{ 0: "NONE", 1: "GET_STARTED", 2: "EMPTY", + 3: "GUIDE_ONLY", } var RpcObjectImportUseCaseRequestUseCase_value = map[string]int32{ "NONE": 0, "GET_STARTED": 1, "EMPTY": 2, + "GUIDE_ONLY": 3, } func (x RpcObjectImportUseCaseRequestUseCase) String() string { @@ -5008,6 +5068,335 @@ func (RpcUnsplashDownloadResponseErrorCode) EnumDescriptor() ([]byte, []int) { return fileDescriptor_8261c968b2e6f45c, []int{0, 16, 1, 1, 0, 0} } +type RpcAIProvider int32 + +const ( + RpcAI_OLLAMA RpcAIProvider = 0 + RpcAI_OPENAI RpcAIProvider = 1 + RpcAI_LMSTUDIO RpcAIProvider = 2 + RpcAI_LLAMACPP RpcAIProvider = 3 +) + +var RpcAIProvider_name = map[int32]string{ + 0: "OLLAMA", + 1: "OPENAI", + 2: "LMSTUDIO", + 3: "LLAMACPP", +} + +var RpcAIProvider_value = map[string]int32{ + "OLLAMA": 0, + "OPENAI": 1, + "LMSTUDIO": 2, + "LLAMACPP": 3, +} + +func (x RpcAIProvider) String() string { + return proto.EnumName(RpcAIProvider_name, int32(x)) +} + +func (RpcAIProvider) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 0} +} + +type RpcAIWritingToolsRequestWritingMode int32 + +const ( + RpcAIWritingToolsRequest_DEFAULT RpcAIWritingToolsRequestWritingMode = 0 + RpcAIWritingToolsRequest_SUMMARIZE RpcAIWritingToolsRequestWritingMode = 1 + RpcAIWritingToolsRequest_GRAMMAR RpcAIWritingToolsRequestWritingMode = 2 + RpcAIWritingToolsRequest_SHORTEN RpcAIWritingToolsRequestWritingMode = 3 + RpcAIWritingToolsRequest_EXPAND RpcAIWritingToolsRequestWritingMode = 4 + RpcAIWritingToolsRequest_BULLET RpcAIWritingToolsRequestWritingMode = 5 + RpcAIWritingToolsRequest_TABLE RpcAIWritingToolsRequestWritingMode = 6 + RpcAIWritingToolsRequest_CASUAL RpcAIWritingToolsRequestWritingMode = 7 + RpcAIWritingToolsRequest_FUNNY RpcAIWritingToolsRequestWritingMode = 8 + RpcAIWritingToolsRequest_CONFIDENT RpcAIWritingToolsRequestWritingMode = 9 + RpcAIWritingToolsRequest_STRAIGHTFORWARD RpcAIWritingToolsRequestWritingMode = 10 + RpcAIWritingToolsRequest_PROFESSIONAL RpcAIWritingToolsRequestWritingMode = 11 + RpcAIWritingToolsRequest_TRANSLATE RpcAIWritingToolsRequestWritingMode = 12 +) + +var RpcAIWritingToolsRequestWritingMode_name = map[int32]string{ + 0: "DEFAULT", + 1: "SUMMARIZE", + 2: "GRAMMAR", + 3: "SHORTEN", + 4: "EXPAND", + 5: "BULLET", + 6: "TABLE", + 7: "CASUAL", + 8: "FUNNY", + 9: "CONFIDENT", + 10: "STRAIGHTFORWARD", + 11: "PROFESSIONAL", + 12: "TRANSLATE", +} + +var RpcAIWritingToolsRequestWritingMode_value = map[string]int32{ + "DEFAULT": 0, + "SUMMARIZE": 1, + "GRAMMAR": 2, + "SHORTEN": 3, + "EXPAND": 4, + "BULLET": 5, + "TABLE": 6, + "CASUAL": 7, + "FUNNY": 8, + "CONFIDENT": 9, + "STRAIGHTFORWARD": 10, + "PROFESSIONAL": 11, + "TRANSLATE": 12, +} + +func (x RpcAIWritingToolsRequestWritingMode) String() string { + return proto.EnumName(RpcAIWritingToolsRequestWritingMode_name, int32(x)) +} + +func (RpcAIWritingToolsRequestWritingMode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 0, 0, 0} +} + +type RpcAIWritingToolsRequestLanguage int32 + +const ( + RpcAIWritingToolsRequest_EN RpcAIWritingToolsRequestLanguage = 0 + RpcAIWritingToolsRequest_ES RpcAIWritingToolsRequestLanguage = 1 + RpcAIWritingToolsRequest_FR RpcAIWritingToolsRequestLanguage = 2 + RpcAIWritingToolsRequest_DE RpcAIWritingToolsRequestLanguage = 3 + RpcAIWritingToolsRequest_IT RpcAIWritingToolsRequestLanguage = 4 + RpcAIWritingToolsRequest_PT RpcAIWritingToolsRequestLanguage = 5 + RpcAIWritingToolsRequest_HI RpcAIWritingToolsRequestLanguage = 6 + RpcAIWritingToolsRequest_TH RpcAIWritingToolsRequestLanguage = 7 +) + +var RpcAIWritingToolsRequestLanguage_name = map[int32]string{ + 0: "EN", + 1: "ES", + 2: "FR", + 3: "DE", + 4: "IT", + 5: "PT", + 6: "HI", + 7: "TH", +} + +var RpcAIWritingToolsRequestLanguage_value = map[string]int32{ + "EN": 0, + "ES": 1, + "FR": 2, + "DE": 3, + "IT": 4, + "PT": 5, + "HI": 6, + "TH": 7, +} + +func (x RpcAIWritingToolsRequestLanguage) String() string { + return proto.EnumName(RpcAIWritingToolsRequestLanguage_name, int32(x)) +} + +func (RpcAIWritingToolsRequestLanguage) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 0, 0, 1} +} + +type RpcAIWritingToolsResponseErrorCode int32 + +const ( + RpcAIWritingToolsResponseError_NULL RpcAIWritingToolsResponseErrorCode = 0 + RpcAIWritingToolsResponseError_UNKNOWN_ERROR RpcAIWritingToolsResponseErrorCode = 1 + RpcAIWritingToolsResponseError_BAD_INPUT RpcAIWritingToolsResponseErrorCode = 2 + RpcAIWritingToolsResponseError_RATE_LIMIT_EXCEEDED RpcAIWritingToolsResponseErrorCode = 100 + RpcAIWritingToolsResponseError_ENDPOINT_NOT_REACHABLE RpcAIWritingToolsResponseErrorCode = 101 + RpcAIWritingToolsResponseError_MODEL_NOT_FOUND RpcAIWritingToolsResponseErrorCode = 102 + RpcAIWritingToolsResponseError_AUTH_REQUIRED RpcAIWritingToolsResponseErrorCode = 103 + RpcAIWritingToolsResponseError_LANGUAGE_NOT_SUPPORTED RpcAIWritingToolsResponseErrorCode = 104 +) + +var RpcAIWritingToolsResponseErrorCode_name = map[int32]string{ + 0: "NULL", + 1: "UNKNOWN_ERROR", + 2: "BAD_INPUT", + 100: "RATE_LIMIT_EXCEEDED", + 101: "ENDPOINT_NOT_REACHABLE", + 102: "MODEL_NOT_FOUND", + 103: "AUTH_REQUIRED", + 104: "LANGUAGE_NOT_SUPPORTED", +} + +var RpcAIWritingToolsResponseErrorCode_value = map[string]int32{ + "NULL": 0, + "UNKNOWN_ERROR": 1, + "BAD_INPUT": 2, + "RATE_LIMIT_EXCEEDED": 100, + "ENDPOINT_NOT_REACHABLE": 101, + "MODEL_NOT_FOUND": 102, + "AUTH_REQUIRED": 103, + "LANGUAGE_NOT_SUPPORTED": 104, +} + +func (x RpcAIWritingToolsResponseErrorCode) String() string { + return proto.EnumName(RpcAIWritingToolsResponseErrorCode_name, int32(x)) +} + +func (RpcAIWritingToolsResponseErrorCode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 0, 1, 0, 0} +} + +type RpcAIAutofillRequestAutofillMode int32 + +const ( + RpcAIAutofillRequest_TAG RpcAIAutofillRequestAutofillMode = 0 + RpcAIAutofillRequest_RELATION RpcAIAutofillRequestAutofillMode = 1 + RpcAIAutofillRequest_TYPE RpcAIAutofillRequestAutofillMode = 2 + RpcAIAutofillRequest_TITLE RpcAIAutofillRequestAutofillMode = 3 + RpcAIAutofillRequest_DESCRIPTION RpcAIAutofillRequestAutofillMode = 4 +) + +var RpcAIAutofillRequestAutofillMode_name = map[int32]string{ + 0: "TAG", + 1: "RELATION", + 2: "TYPE", + 3: "TITLE", + 4: "DESCRIPTION", +} + +var RpcAIAutofillRequestAutofillMode_value = map[string]int32{ + "TAG": 0, + "RELATION": 1, + "TYPE": 2, + "TITLE": 3, + "DESCRIPTION": 4, +} + +func (x RpcAIAutofillRequestAutofillMode) String() string { + return proto.EnumName(RpcAIAutofillRequestAutofillMode_name, int32(x)) +} + +func (RpcAIAutofillRequestAutofillMode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 1, 0, 0} +} + +type RpcAIAutofillResponseErrorCode int32 + +const ( + RpcAIAutofillResponseError_NULL RpcAIAutofillResponseErrorCode = 0 + RpcAIAutofillResponseError_UNKNOWN_ERROR RpcAIAutofillResponseErrorCode = 1 + RpcAIAutofillResponseError_BAD_INPUT RpcAIAutofillResponseErrorCode = 2 + RpcAIAutofillResponseError_RATE_LIMIT_EXCEEDED RpcAIAutofillResponseErrorCode = 100 + RpcAIAutofillResponseError_ENDPOINT_NOT_REACHABLE RpcAIAutofillResponseErrorCode = 101 + RpcAIAutofillResponseError_MODEL_NOT_FOUND RpcAIAutofillResponseErrorCode = 102 + RpcAIAutofillResponseError_AUTH_REQUIRED RpcAIAutofillResponseErrorCode = 103 +) + +var RpcAIAutofillResponseErrorCode_name = map[int32]string{ + 0: "NULL", + 1: "UNKNOWN_ERROR", + 2: "BAD_INPUT", + 100: "RATE_LIMIT_EXCEEDED", + 101: "ENDPOINT_NOT_REACHABLE", + 102: "MODEL_NOT_FOUND", + 103: "AUTH_REQUIRED", +} + +var RpcAIAutofillResponseErrorCode_value = map[string]int32{ + "NULL": 0, + "UNKNOWN_ERROR": 1, + "BAD_INPUT": 2, + "RATE_LIMIT_EXCEEDED": 100, + "ENDPOINT_NOT_REACHABLE": 101, + "MODEL_NOT_FOUND": 102, + "AUTH_REQUIRED": 103, +} + +func (x RpcAIAutofillResponseErrorCode) String() string { + return proto.EnumName(RpcAIAutofillResponseErrorCode_name, int32(x)) +} + +func (RpcAIAutofillResponseErrorCode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 1, 1, 0, 0} +} + +type RpcAIListSummaryResponseErrorCode int32 + +const ( + RpcAIListSummaryResponseError_NULL RpcAIListSummaryResponseErrorCode = 0 + RpcAIListSummaryResponseError_UNKNOWN_ERROR RpcAIListSummaryResponseErrorCode = 1 + RpcAIListSummaryResponseError_BAD_INPUT RpcAIListSummaryResponseErrorCode = 2 + RpcAIListSummaryResponseError_RATE_LIMIT_EXCEEDED RpcAIListSummaryResponseErrorCode = 100 + RpcAIListSummaryResponseError_ENDPOINT_NOT_REACHABLE RpcAIListSummaryResponseErrorCode = 101 + RpcAIListSummaryResponseError_MODEL_NOT_FOUND RpcAIListSummaryResponseErrorCode = 102 + RpcAIListSummaryResponseError_AUTH_REQUIRED RpcAIListSummaryResponseErrorCode = 103 +) + +var RpcAIListSummaryResponseErrorCode_name = map[int32]string{ + 0: "NULL", + 1: "UNKNOWN_ERROR", + 2: "BAD_INPUT", + 100: "RATE_LIMIT_EXCEEDED", + 101: "ENDPOINT_NOT_REACHABLE", + 102: "MODEL_NOT_FOUND", + 103: "AUTH_REQUIRED", +} + +var RpcAIListSummaryResponseErrorCode_value = map[string]int32{ + "NULL": 0, + "UNKNOWN_ERROR": 1, + "BAD_INPUT": 2, + "RATE_LIMIT_EXCEEDED": 100, + "ENDPOINT_NOT_REACHABLE": 101, + "MODEL_NOT_FOUND": 102, + "AUTH_REQUIRED": 103, +} + +func (x RpcAIListSummaryResponseErrorCode) String() string { + return proto.EnumName(RpcAIListSummaryResponseErrorCode_name, int32(x)) +} + +func (RpcAIListSummaryResponseErrorCode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 2, 1, 0, 0} +} + +type RpcAIObjectCreateFromUrlResponseErrorCode int32 + +const ( + RpcAIObjectCreateFromUrlResponseError_NULL RpcAIObjectCreateFromUrlResponseErrorCode = 0 + RpcAIObjectCreateFromUrlResponseError_UNKNOWN_ERROR RpcAIObjectCreateFromUrlResponseErrorCode = 1 + RpcAIObjectCreateFromUrlResponseError_BAD_INPUT RpcAIObjectCreateFromUrlResponseErrorCode = 2 + RpcAIObjectCreateFromUrlResponseError_RATE_LIMIT_EXCEEDED RpcAIObjectCreateFromUrlResponseErrorCode = 100 + RpcAIObjectCreateFromUrlResponseError_ENDPOINT_NOT_REACHABLE RpcAIObjectCreateFromUrlResponseErrorCode = 101 + RpcAIObjectCreateFromUrlResponseError_MODEL_NOT_FOUND RpcAIObjectCreateFromUrlResponseErrorCode = 102 + RpcAIObjectCreateFromUrlResponseError_AUTH_REQUIRED RpcAIObjectCreateFromUrlResponseErrorCode = 103 +) + +var RpcAIObjectCreateFromUrlResponseErrorCode_name = map[int32]string{ + 0: "NULL", + 1: "UNKNOWN_ERROR", + 2: "BAD_INPUT", + 100: "RATE_LIMIT_EXCEEDED", + 101: "ENDPOINT_NOT_REACHABLE", + 102: "MODEL_NOT_FOUND", + 103: "AUTH_REQUIRED", +} + +var RpcAIObjectCreateFromUrlResponseErrorCode_value = map[string]int32{ + "NULL": 0, + "UNKNOWN_ERROR": 1, + "BAD_INPUT": 2, + "RATE_LIMIT_EXCEEDED": 100, + "ENDPOINT_NOT_REACHABLE": 101, + "MODEL_NOT_FOUND": 102, + "AUTH_REQUIRED": 103, +} + +func (x RpcAIObjectCreateFromUrlResponseErrorCode) String() string { + return proto.EnumName(RpcAIObjectCreateFromUrlResponseErrorCode_name, int32(x)) +} + +func (RpcAIObjectCreateFromUrlResponseErrorCode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 3, 1, 0, 0} +} + type RpcGalleryDownloadManifestResponseErrorCode int32 const ( @@ -5033,7 +5422,7 @@ func (x RpcGalleryDownloadManifestResponseErrorCode) String() string { } func (RpcGalleryDownloadManifestResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 0, 1, 0, 0} } type RpcGalleryDownloadIndexResponseErrorCode int32 @@ -5067,7 +5456,7 @@ func (x RpcGalleryDownloadIndexResponseErrorCode) String() string { } func (RpcGalleryDownloadIndexResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 1, 1, 0, 0} } type RpcBlockReplaceResponseErrorCode int32 @@ -5095,7 +5484,7 @@ func (x RpcBlockReplaceResponseErrorCode) String() string { } func (RpcBlockReplaceResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 0, 1, 0, 0} } type RpcBlockSplitRequestMode int32 @@ -5130,7 +5519,7 @@ func (x RpcBlockSplitRequestMode) String() string { } func (RpcBlockSplitRequestMode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 1, 0, 0} } type RpcBlockSplitResponseErrorCode int32 @@ -5158,7 +5547,7 @@ func (x RpcBlockSplitResponseErrorCode) String() string { } func (RpcBlockSplitResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 1, 1, 0, 0} } type RpcBlockMergeResponseErrorCode int32 @@ -5186,7 +5575,7 @@ func (x RpcBlockMergeResponseErrorCode) String() string { } func (RpcBlockMergeResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 2, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 2, 1, 0, 0} } type RpcBlockCopyResponseErrorCode int32 @@ -5214,7 +5603,7 @@ func (x RpcBlockCopyResponseErrorCode) String() string { } func (RpcBlockCopyResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 3, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 3, 1, 0, 0} } type RpcBlockPasteResponseErrorCode int32 @@ -5242,7 +5631,7 @@ func (x RpcBlockPasteResponseErrorCode) String() string { } func (RpcBlockPasteResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 4, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 4, 1, 0, 0} } type RpcBlockCutResponseErrorCode int32 @@ -5270,7 +5659,7 @@ func (x RpcBlockCutResponseErrorCode) String() string { } func (RpcBlockCutResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 5, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 5, 1, 0, 0} } type RpcBlockUploadResponseErrorCode int32 @@ -5298,7 +5687,7 @@ func (x RpcBlockUploadResponseErrorCode) String() string { } func (RpcBlockUploadResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 6, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 6, 1, 0, 0} } type RpcBlockDownloadResponseErrorCode int32 @@ -5326,7 +5715,7 @@ func (x RpcBlockDownloadResponseErrorCode) String() string { } func (RpcBlockDownloadResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 7, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 7, 1, 0, 0} } type RpcBlockCreateResponseErrorCode int32 @@ -5354,7 +5743,7 @@ func (x RpcBlockCreateResponseErrorCode) String() string { } func (RpcBlockCreateResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 8, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 8, 1, 0, 0} } type RpcBlockCreateWidgetResponseErrorCode int32 @@ -5382,7 +5771,7 @@ func (x RpcBlockCreateWidgetResponseErrorCode) String() string { } func (RpcBlockCreateWidgetResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 9, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 9, 1, 0, 0} } type RpcBlockListDeleteResponseErrorCode int32 @@ -5410,7 +5799,7 @@ func (x RpcBlockListDeleteResponseErrorCode) String() string { } func (RpcBlockListDeleteResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 10, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 10, 1, 0, 0} } type RpcBlockSetFieldsResponseErrorCode int32 @@ -5438,7 +5827,7 @@ func (x RpcBlockSetFieldsResponseErrorCode) String() string { } func (RpcBlockSetFieldsResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 11, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 11, 1, 0, 0} } type RpcBlockListSetAlignResponseErrorCode int32 @@ -5466,7 +5855,7 @@ func (x RpcBlockListSetAlignResponseErrorCode) String() string { } func (RpcBlockListSetAlignResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 12, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 12, 1, 0, 0} } type RpcBlockListSetVerticalAlignResponseErrorCode int32 @@ -5494,7 +5883,7 @@ func (x RpcBlockListSetVerticalAlignResponseErrorCode) String() string { } func (RpcBlockListSetVerticalAlignResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 13, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 13, 1, 0, 0} } type RpcBlockListSetFieldsResponseErrorCode int32 @@ -5522,7 +5911,7 @@ func (x RpcBlockListSetFieldsResponseErrorCode) String() string { } func (RpcBlockListSetFieldsResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 14, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 14, 1, 0, 0} } type RpcBlockListDuplicateResponseErrorCode int32 @@ -5550,7 +5939,7 @@ func (x RpcBlockListDuplicateResponseErrorCode) String() string { } func (RpcBlockListDuplicateResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 15, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 15, 1, 0, 0} } type RpcBlockListConvertToObjectsResponseErrorCode int32 @@ -5578,7 +5967,7 @@ func (x RpcBlockListConvertToObjectsResponseErrorCode) String() string { } func (RpcBlockListConvertToObjectsResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 17, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 17, 1, 0, 0} } type RpcBlockListMoveToExistingObjectResponseErrorCode int32 @@ -5606,7 +5995,7 @@ func (x RpcBlockListMoveToExistingObjectResponseErrorCode) String() string { } func (RpcBlockListMoveToExistingObjectResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 18, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 18, 1, 0, 0} } type RpcBlockListMoveToNewObjectResponseErrorCode int32 @@ -5634,7 +6023,7 @@ func (x RpcBlockListMoveToNewObjectResponseErrorCode) String() string { } func (RpcBlockListMoveToNewObjectResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 19, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 19, 1, 0, 0} } type RpcBlockListTurnIntoResponseErrorCode int32 @@ -5662,7 +6051,7 @@ func (x RpcBlockListTurnIntoResponseErrorCode) String() string { } func (RpcBlockListTurnIntoResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 20, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 20, 1, 0, 0} } type RpcBlockListSetBackgroundColorResponseErrorCode int32 @@ -5690,7 +6079,7 @@ func (x RpcBlockListSetBackgroundColorResponseErrorCode) String() string { } func (RpcBlockListSetBackgroundColorResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 21, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 21, 1, 0, 0} } type RpcBlockExportResponseErrorCode int32 @@ -5718,7 +6107,7 @@ func (x RpcBlockExportResponseErrorCode) String() string { } func (RpcBlockExportResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 22, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 22, 1, 0, 0} } type RpcBlockSetCarriageResponseErrorCode int32 @@ -5746,7 +6135,7 @@ func (x RpcBlockSetCarriageResponseErrorCode) String() string { } func (RpcBlockSetCarriageResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 23, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 23, 1, 0, 0} } type RpcBlockPreviewResponseErrorCode int32 @@ -5774,7 +6163,7 @@ func (x RpcBlockPreviewResponseErrorCode) String() string { } func (RpcBlockPreviewResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 24, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 24, 1, 0, 0} } type RpcBlockLatexSetTextResponseErrorCode int32 @@ -5802,7 +6191,7 @@ func (x RpcBlockLatexSetTextResponseErrorCode) String() string { } func (RpcBlockLatexSetTextResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 0, 1, 0, 0} } type RpcBlockLatexSetProcessorResponseErrorCode int32 @@ -5830,7 +6219,7 @@ func (x RpcBlockLatexSetProcessorResponseErrorCode) String() string { } func (RpcBlockLatexSetProcessorResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 1, 1, 0, 0} } type RpcBlockTextSetTextResponseErrorCode int32 @@ -5858,7 +6247,7 @@ func (x RpcBlockTextSetTextResponseErrorCode) String() string { } func (RpcBlockTextSetTextResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 0, 1, 0, 0} } type RpcBlockTextSetColorResponseErrorCode int32 @@ -5886,7 +6275,7 @@ func (x RpcBlockTextSetColorResponseErrorCode) String() string { } func (RpcBlockTextSetColorResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 1, 1, 0, 0} } type RpcBlockTextSetMarksGetResponseErrorCode int32 @@ -5914,7 +6303,7 @@ func (x RpcBlockTextSetMarksGetResponseErrorCode) String() string { } func (RpcBlockTextSetMarksGetResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 2, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 2, 0, 1, 0, 0} } type RpcBlockTextSetStyleResponseErrorCode int32 @@ -5942,7 +6331,7 @@ func (x RpcBlockTextSetStyleResponseErrorCode) String() string { } func (RpcBlockTextSetStyleResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 3, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 3, 1, 0, 0} } type RpcBlockTextSetCheckedResponseErrorCode int32 @@ -5970,7 +6359,7 @@ func (x RpcBlockTextSetCheckedResponseErrorCode) String() string { } func (RpcBlockTextSetCheckedResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 4, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 4, 1, 0, 0} } type RpcBlockTextSetIconResponseErrorCode int32 @@ -5998,7 +6387,7 @@ func (x RpcBlockTextSetIconResponseErrorCode) String() string { } func (RpcBlockTextSetIconResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 5, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 5, 1, 0, 0} } type RpcBlockTextListSetStyleResponseErrorCode int32 @@ -6026,7 +6415,7 @@ func (x RpcBlockTextListSetStyleResponseErrorCode) String() string { } func (RpcBlockTextListSetStyleResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 6, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 6, 1, 0, 0} } type RpcBlockTextListSetColorResponseErrorCode int32 @@ -6054,7 +6443,7 @@ func (x RpcBlockTextListSetColorResponseErrorCode) String() string { } func (RpcBlockTextListSetColorResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 7, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 7, 1, 0, 0} } type RpcBlockTextListSetMarkResponseErrorCode int32 @@ -6082,7 +6471,7 @@ func (x RpcBlockTextListSetMarkResponseErrorCode) String() string { } func (RpcBlockTextListSetMarkResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 8, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 8, 1, 0, 0} } type RpcBlockTextListClearStyleResponseErrorCode int32 @@ -6110,7 +6499,7 @@ func (x RpcBlockTextListClearStyleResponseErrorCode) String() string { } func (RpcBlockTextListClearStyleResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 9, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 9, 1, 0, 0} } type RpcBlockTextListClearContentResponseErrorCode int32 @@ -6138,7 +6527,7 @@ func (x RpcBlockTextListClearContentResponseErrorCode) String() string { } func (RpcBlockTextListClearContentResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 10, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 10, 1, 0, 0} } type RpcBlockTableCreateResponseErrorCode int32 @@ -6166,7 +6555,7 @@ func (x RpcBlockTableCreateResponseErrorCode) String() string { } func (RpcBlockTableCreateResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 0, 1, 0, 0} } type RpcBlockTableRowCreateResponseErrorCode int32 @@ -6194,7 +6583,7 @@ func (x RpcBlockTableRowCreateResponseErrorCode) String() string { } func (RpcBlockTableRowCreateResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 1, 1, 0, 0} } type RpcBlockTableRowSetHeaderResponseErrorCode int32 @@ -6222,7 +6611,7 @@ func (x RpcBlockTableRowSetHeaderResponseErrorCode) String() string { } func (RpcBlockTableRowSetHeaderResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 2, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 2, 1, 0, 0} } type RpcBlockTableRowListFillResponseErrorCode int32 @@ -6250,7 +6639,7 @@ func (x RpcBlockTableRowListFillResponseErrorCode) String() string { } func (RpcBlockTableRowListFillResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 3, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 3, 1, 0, 0} } type RpcBlockTableRowListCleanResponseErrorCode int32 @@ -6278,7 +6667,7 @@ func (x RpcBlockTableRowListCleanResponseErrorCode) String() string { } func (RpcBlockTableRowListCleanResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 4, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 4, 1, 0, 0} } type RpcBlockTableColumnListFillResponseErrorCode int32 @@ -6306,7 +6695,7 @@ func (x RpcBlockTableColumnListFillResponseErrorCode) String() string { } func (RpcBlockTableColumnListFillResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 5, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 5, 1, 0, 0} } type RpcBlockTableColumnCreateResponseErrorCode int32 @@ -6334,7 +6723,7 @@ func (x RpcBlockTableColumnCreateResponseErrorCode) String() string { } func (RpcBlockTableColumnCreateResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 6, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 6, 1, 0, 0} } type RpcBlockTableRowDeleteResponseErrorCode int32 @@ -6362,7 +6751,7 @@ func (x RpcBlockTableRowDeleteResponseErrorCode) String() string { } func (RpcBlockTableRowDeleteResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 7, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 7, 1, 0, 0} } type RpcBlockTableColumnDeleteResponseErrorCode int32 @@ -6390,7 +6779,7 @@ func (x RpcBlockTableColumnDeleteResponseErrorCode) String() string { } func (RpcBlockTableColumnDeleteResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 8, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 8, 1, 0, 0} } type RpcBlockTableColumnMoveResponseErrorCode int32 @@ -6418,7 +6807,7 @@ func (x RpcBlockTableColumnMoveResponseErrorCode) String() string { } func (RpcBlockTableColumnMoveResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 9, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 9, 1, 0, 0} } type RpcBlockTableRowDuplicateResponseErrorCode int32 @@ -6446,7 +6835,7 @@ func (x RpcBlockTableRowDuplicateResponseErrorCode) String() string { } func (RpcBlockTableRowDuplicateResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 10, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 10, 1, 0, 0} } type RpcBlockTableColumnDuplicateResponseErrorCode int32 @@ -6474,7 +6863,7 @@ func (x RpcBlockTableColumnDuplicateResponseErrorCode) String() string { } func (RpcBlockTableColumnDuplicateResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 11, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 11, 1, 0, 0} } type RpcBlockTableExpandResponseErrorCode int32 @@ -6502,7 +6891,7 @@ func (x RpcBlockTableExpandResponseErrorCode) String() string { } func (RpcBlockTableExpandResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 12, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 12, 1, 0, 0} } type RpcBlockTableSortResponseErrorCode int32 @@ -6530,7 +6919,7 @@ func (x RpcBlockTableSortResponseErrorCode) String() string { } func (RpcBlockTableSortResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 13, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 13, 1, 0, 0} } type RpcBlockFileSetNameResponseErrorCode int32 @@ -6558,7 +6947,7 @@ func (x RpcBlockFileSetNameResponseErrorCode) String() string { } func (RpcBlockFileSetNameResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 0, 1, 0, 0} } type RpcBlockFileSetTargetObjectIdResponseErrorCode int32 @@ -6586,7 +6975,7 @@ func (x RpcBlockFileSetTargetObjectIdResponseErrorCode) String() string { } func (RpcBlockFileSetTargetObjectIdResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 1, 1, 0, 0} } type RpcBlockFileCreateAndUploadResponseErrorCode int32 @@ -6614,7 +7003,7 @@ func (x RpcBlockFileCreateAndUploadResponseErrorCode) String() string { } func (RpcBlockFileCreateAndUploadResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 2, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 2, 1, 0, 0} } type RpcBlockFileListSetStyleResponseErrorCode int32 @@ -6642,7 +7031,7 @@ func (x RpcBlockFileListSetStyleResponseErrorCode) String() string { } func (RpcBlockFileListSetStyleResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 3, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 3, 1, 0, 0} } type RpcBlockImageSetNameResponseErrorCode int32 @@ -6670,7 +7059,7 @@ func (x RpcBlockImageSetNameResponseErrorCode) String() string { } func (RpcBlockImageSetNameResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 24, 0, 1, 0, 0} } type RpcBlockImageSetWidthResponseErrorCode int32 @@ -6698,7 +7087,7 @@ func (x RpcBlockImageSetWidthResponseErrorCode) String() string { } func (RpcBlockImageSetWidthResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 24, 1, 1, 0, 0} } type RpcBlockVideoSetNameResponseErrorCode int32 @@ -6726,7 +7115,7 @@ func (x RpcBlockVideoSetNameResponseErrorCode) String() string { } func (RpcBlockVideoSetNameResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 24, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 25, 0, 1, 0, 0} } type RpcBlockVideoSetWidthResponseErrorCode int32 @@ -6754,7 +7143,7 @@ func (x RpcBlockVideoSetWidthResponseErrorCode) String() string { } func (RpcBlockVideoSetWidthResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 24, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 25, 1, 1, 0, 0} } type RpcBlockLinkCreateWithObjectResponseErrorCode int32 @@ -6782,7 +7171,7 @@ func (x RpcBlockLinkCreateWithObjectResponseErrorCode) String() string { } func (RpcBlockLinkCreateWithObjectResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 25, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 26, 0, 1, 0, 0} } type RpcBlockLinkListSetAppearanceResponseErrorCode int32 @@ -6810,7 +7199,7 @@ func (x RpcBlockLinkListSetAppearanceResponseErrorCode) String() string { } func (RpcBlockLinkListSetAppearanceResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 25, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 26, 1, 1, 0, 0} } type RpcBlockRelationSetKeyResponseErrorCode int32 @@ -6838,7 +7227,7 @@ func (x RpcBlockRelationSetKeyResponseErrorCode) String() string { } func (RpcBlockRelationSetKeyResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 26, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 27, 0, 1, 0, 0} } type RpcBlockRelationAddResponseErrorCode int32 @@ -6866,7 +7255,7 @@ func (x RpcBlockRelationAddResponseErrorCode) String() string { } func (RpcBlockRelationAddResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 26, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 27, 1, 1, 0, 0} } type RpcBlockBookmarkFetchResponseErrorCode int32 @@ -6894,7 +7283,7 @@ func (x RpcBlockBookmarkFetchResponseErrorCode) String() string { } func (RpcBlockBookmarkFetchResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 27, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 28, 0, 1, 0, 0} } type RpcBlockBookmarkCreateAndFetchResponseErrorCode int32 @@ -6922,7 +7311,7 @@ func (x RpcBlockBookmarkCreateAndFetchResponseErrorCode) String() string { } func (RpcBlockBookmarkCreateAndFetchResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 27, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 28, 1, 1, 0, 0} } type RpcBlockDivListSetStyleResponseErrorCode int32 @@ -6950,7 +7339,7 @@ func (x RpcBlockDivListSetStyleResponseErrorCode) String() string { } func (RpcBlockDivListSetStyleResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 28, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 1, 0, 0} } type RpcBlockDataviewViewCreateResponseErrorCode int32 @@ -6978,7 +7367,7 @@ func (x RpcBlockDataviewViewCreateResponseErrorCode) String() string { } func (RpcBlockDataviewViewCreateResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 0, 1, 0, 0} } type RpcBlockDataviewViewUpdateResponseErrorCode int32 @@ -7006,7 +7395,7 @@ func (x RpcBlockDataviewViewUpdateResponseErrorCode) String() string { } func (RpcBlockDataviewViewUpdateResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 1, 1, 0, 0} } type RpcBlockDataviewViewDeleteResponseErrorCode int32 @@ -7034,7 +7423,7 @@ func (x RpcBlockDataviewViewDeleteResponseErrorCode) String() string { } func (RpcBlockDataviewViewDeleteResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 2, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 2, 1, 0, 0} } type RpcBlockDataviewViewSetPositionResponseErrorCode int32 @@ -7062,7 +7451,7 @@ func (x RpcBlockDataviewViewSetPositionResponseErrorCode) String() string { } func (RpcBlockDataviewViewSetPositionResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 3, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 3, 1, 0, 0} } type RpcBlockDataviewViewSetActiveResponseErrorCode int32 @@ -7090,7 +7479,35 @@ func (x RpcBlockDataviewViewSetActiveResponseErrorCode) String() string { } func (RpcBlockDataviewViewSetActiveResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 4, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 4, 1, 0, 0} +} + +type RpcBlockDataviewRelationSetResponseErrorCode int32 + +const ( + RpcBlockDataviewRelationSetResponseError_NULL RpcBlockDataviewRelationSetResponseErrorCode = 0 + RpcBlockDataviewRelationSetResponseError_UNKNOWN_ERROR RpcBlockDataviewRelationSetResponseErrorCode = 1 + RpcBlockDataviewRelationSetResponseError_BAD_INPUT RpcBlockDataviewRelationSetResponseErrorCode = 2 +) + +var RpcBlockDataviewRelationSetResponseErrorCode_name = map[int32]string{ + 0: "NULL", + 1: "UNKNOWN_ERROR", + 2: "BAD_INPUT", +} + +var RpcBlockDataviewRelationSetResponseErrorCode_value = map[string]int32{ + "NULL": 0, + "UNKNOWN_ERROR": 1, + "BAD_INPUT": 2, +} + +func (x RpcBlockDataviewRelationSetResponseErrorCode) String() string { + return proto.EnumName(RpcBlockDataviewRelationSetResponseErrorCode_name, int32(x)) +} + +func (RpcBlockDataviewRelationSetResponseErrorCode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 1, 0, 1, 0, 0} } type RpcBlockDataviewRelationAddResponseErrorCode int32 @@ -7118,7 +7535,7 @@ func (x RpcBlockDataviewRelationAddResponseErrorCode) String() string { } func (RpcBlockDataviewRelationAddResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 1, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 1, 1, 1, 0, 0} } type RpcBlockDataviewRelationDeleteResponseErrorCode int32 @@ -7146,7 +7563,7 @@ func (x RpcBlockDataviewRelationDeleteResponseErrorCode) String() string { } func (RpcBlockDataviewRelationDeleteResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 1, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 1, 2, 1, 0, 0} } type RpcBlockDataviewSetSourceResponseErrorCode int32 @@ -7174,7 +7591,7 @@ func (x RpcBlockDataviewSetSourceResponseErrorCode) String() string { } func (RpcBlockDataviewSetSourceResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 2, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 2, 1, 0, 0} } type RpcBlockDataviewGroupOrderUpdateResponseErrorCode int32 @@ -7202,7 +7619,7 @@ func (x RpcBlockDataviewGroupOrderUpdateResponseErrorCode) String() string { } func (RpcBlockDataviewGroupOrderUpdateResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 3, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 3, 0, 1, 0, 0} } type RpcBlockDataviewObjectOrderUpdateResponseErrorCode int32 @@ -7230,7 +7647,7 @@ func (x RpcBlockDataviewObjectOrderUpdateResponseErrorCode) String() string { } func (RpcBlockDataviewObjectOrderUpdateResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 4, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 4, 0, 1, 0, 0} } type RpcBlockDataviewObjectOrderMoveResponseErrorCode int32 @@ -7258,7 +7675,7 @@ func (x RpcBlockDataviewObjectOrderMoveResponseErrorCode) String() string { } func (RpcBlockDataviewObjectOrderMoveResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 4, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 4, 1, 1, 0, 0} } type RpcBlockDataviewCreateFromExistingObjectResponseErrorCode int32 @@ -7286,7 +7703,7 @@ func (x RpcBlockDataviewCreateFromExistingObjectResponseErrorCode) String() stri } func (RpcBlockDataviewCreateFromExistingObjectResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 5, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 5, 1, 0, 0} } type RpcBlockDataviewFilterAddResponseErrorCode int32 @@ -7314,7 +7731,7 @@ func (x RpcBlockDataviewFilterAddResponseErrorCode) String() string { } func (RpcBlockDataviewFilterAddResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 6, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 6, 0, 1, 0, 0} } type RpcBlockDataviewFilterRemoveResponseErrorCode int32 @@ -7342,7 +7759,7 @@ func (x RpcBlockDataviewFilterRemoveResponseErrorCode) String() string { } func (RpcBlockDataviewFilterRemoveResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 6, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 6, 1, 1, 0, 0} } type RpcBlockDataviewFilterReplaceResponseErrorCode int32 @@ -7370,7 +7787,7 @@ func (x RpcBlockDataviewFilterReplaceResponseErrorCode) String() string { } func (RpcBlockDataviewFilterReplaceResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 6, 2, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 6, 2, 1, 0, 0} } type RpcBlockDataviewFilterSortResponseErrorCode int32 @@ -7398,7 +7815,7 @@ func (x RpcBlockDataviewFilterSortResponseErrorCode) String() string { } func (RpcBlockDataviewFilterSortResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 6, 3, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 6, 3, 1, 0, 0} } type RpcBlockDataviewSortAddResponseErrorCode int32 @@ -7426,7 +7843,7 @@ func (x RpcBlockDataviewSortAddResponseErrorCode) String() string { } func (RpcBlockDataviewSortAddResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 7, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 7, 0, 1, 0, 0} } type RpcBlockDataviewSortRemoveResponseErrorCode int32 @@ -7454,7 +7871,7 @@ func (x RpcBlockDataviewSortRemoveResponseErrorCode) String() string { } func (RpcBlockDataviewSortRemoveResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 7, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 7, 1, 1, 0, 0} } type RpcBlockDataviewSortReplaceResponseErrorCode int32 @@ -7482,7 +7899,7 @@ func (x RpcBlockDataviewSortReplaceResponseErrorCode) String() string { } func (RpcBlockDataviewSortReplaceResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 7, 2, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 7, 2, 1, 0, 0} } type RpcBlockDataviewSortSSortResponseErrorCode int32 @@ -7510,7 +7927,7 @@ func (x RpcBlockDataviewSortSSortResponseErrorCode) String() string { } func (RpcBlockDataviewSortSSortResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 7, 3, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 7, 3, 1, 0, 0} } type RpcBlockDataviewViewRelationAddResponseErrorCode int32 @@ -7538,7 +7955,7 @@ func (x RpcBlockDataviewViewRelationAddResponseErrorCode) String() string { } func (RpcBlockDataviewViewRelationAddResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 8, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 8, 0, 1, 0, 0} } type RpcBlockDataviewViewRelationRemoveResponseErrorCode int32 @@ -7566,7 +7983,7 @@ func (x RpcBlockDataviewViewRelationRemoveResponseErrorCode) String() string { } func (RpcBlockDataviewViewRelationRemoveResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 8, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 8, 1, 1, 0, 0} } type RpcBlockDataviewViewRelationReplaceResponseErrorCode int32 @@ -7594,7 +8011,7 @@ func (x RpcBlockDataviewViewRelationReplaceResponseErrorCode) String() string { } func (RpcBlockDataviewViewRelationReplaceResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 8, 2, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 8, 2, 1, 0, 0} } type RpcBlockDataviewViewRelationSortResponseErrorCode int32 @@ -7622,7 +8039,7 @@ func (x RpcBlockDataviewViewRelationSortResponseErrorCode) String() string { } func (RpcBlockDataviewViewRelationSortResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 8, 3, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 8, 3, 1, 0, 0} } type RpcBlockWidgetSetTargetIdResponseErrorCode int32 @@ -7650,7 +8067,7 @@ func (x RpcBlockWidgetSetTargetIdResponseErrorCode) String() string { } func (RpcBlockWidgetSetTargetIdResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 0, 1, 0, 0} } type RpcBlockWidgetSetLayoutResponseErrorCode int32 @@ -7678,7 +8095,7 @@ func (x RpcBlockWidgetSetLayoutResponseErrorCode) String() string { } func (RpcBlockWidgetSetLayoutResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 1, 1, 0, 0} } type RpcBlockWidgetSetLimitResponseErrorCode int32 @@ -7706,7 +8123,7 @@ func (x RpcBlockWidgetSetLimitResponseErrorCode) String() string { } func (RpcBlockWidgetSetLimitResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 2, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 2, 1, 0, 0} } type RpcBlockWidgetSetViewIdResponseErrorCode int32 @@ -7734,7 +8151,7 @@ func (x RpcBlockWidgetSetViewIdResponseErrorCode) String() string { } func (RpcBlockWidgetSetViewIdResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 3, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 3, 1, 0, 0} } type RpcDebugStatResponseErrorCode int32 @@ -7762,7 +8179,7 @@ func (x RpcDebugStatResponseErrorCode) String() string { } func (RpcDebugStatResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 1, 1, 0, 0} } type RpcDebugTreeHeadsResponseErrorCode int32 @@ -7790,7 +8207,7 @@ func (x RpcDebugTreeHeadsResponseErrorCode) String() string { } func (RpcDebugTreeHeadsResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 2, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 2, 1, 0, 0} } type RpcDebugTreeResponseErrorCode int32 @@ -7818,7 +8235,7 @@ func (x RpcDebugTreeResponseErrorCode) String() string { } func (RpcDebugTreeResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 3, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 3, 1, 0, 0} } type RpcDebugSpaceSummaryResponseErrorCode int32 @@ -7846,7 +8263,7 @@ func (x RpcDebugSpaceSummaryResponseErrorCode) String() string { } func (RpcDebugSpaceSummaryResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 4, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 4, 1, 0, 0} } type RpcDebugStackGoroutinesResponseErrorCode int32 @@ -7874,7 +8291,7 @@ func (x RpcDebugStackGoroutinesResponseErrorCode) String() string { } func (RpcDebugStackGoroutinesResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 5, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 5, 1, 0, 0} } type RpcDebugExportLocalstoreResponseErrorCode int32 @@ -7902,7 +8319,7 @@ func (x RpcDebugExportLocalstoreResponseErrorCode) String() string { } func (RpcDebugExportLocalstoreResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 6, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 6, 1, 0, 0} } type RpcDebugSubscriptionsResponseErrorCode int32 @@ -7930,7 +8347,7 @@ func (x RpcDebugSubscriptionsResponseErrorCode) String() string { } func (RpcDebugSubscriptionsResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 7, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 7, 1, 0, 0} } type RpcDebugOpenedObjectsResponseErrorCode int32 @@ -7958,7 +8375,7 @@ func (x RpcDebugOpenedObjectsResponseErrorCode) String() string { } func (RpcDebugOpenedObjectsResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 8, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 8, 1, 0, 0} } type RpcDebugRunProfilerResponseErrorCode int32 @@ -7986,7 +8403,7 @@ func (x RpcDebugRunProfilerResponseErrorCode) String() string { } func (RpcDebugRunProfilerResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 9, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 9, 1, 0, 0} } type RpcDebugAccountSelectTraceResponseErrorCode int32 @@ -8014,7 +8431,7 @@ func (x RpcDebugAccountSelectTraceResponseErrorCode) String() string { } func (RpcDebugAccountSelectTraceResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 10, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 10, 1, 0, 0} } type RpcDebugExportLogResponseErrorCode int32 @@ -8045,7 +8462,7 @@ func (x RpcDebugExportLogResponseErrorCode) String() string { } func (RpcDebugExportLogResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 11, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 11, 1, 0, 0} } type RpcDebugPingResponseErrorCode int32 @@ -8073,7 +8490,7 @@ func (x RpcDebugPingResponseErrorCode) String() string { } func (RpcDebugPingResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 12, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 12, 1, 0, 0} } type RpcDebugAnystoreObjectChangesRequestOrderBy int32 @@ -8098,7 +8515,7 @@ func (x RpcDebugAnystoreObjectChangesRequestOrderBy) String() string { } func (RpcDebugAnystoreObjectChangesRequestOrderBy) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 13, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 13, 0, 0} } type RpcDebugAnystoreObjectChangesResponseErrorCode int32 @@ -8126,7 +8543,7 @@ func (x RpcDebugAnystoreObjectChangesResponseErrorCode) String() string { } func (RpcDebugAnystoreObjectChangesResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 13, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 13, 1, 1, 0} } type RpcDebugNetCheckResponseErrorCode int32 @@ -8154,7 +8571,7 @@ func (x RpcDebugNetCheckResponseErrorCode) String() string { } func (RpcDebugNetCheckResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 14, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 14, 1, 0, 0} } type RpcInitialSetParametersResponseErrorCode int32 @@ -8182,7 +8599,7 @@ func (x RpcInitialSetParametersResponseErrorCode) String() string { } func (RpcInitialSetParametersResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 33, 0, 1, 0, 0} } type RpcLogSendRequestLevel int32 @@ -8219,7 +8636,7 @@ func (x RpcLogSendRequestLevel) String() string { } func (RpcLogSendRequestLevel) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 33, 0, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 34, 0, 0, 0} } type RpcLogSendResponseErrorCode int32 @@ -8247,7 +8664,7 @@ func (x RpcLogSendResponseErrorCode) String() string { } func (RpcLogSendResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 33, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 34, 0, 1, 0, 0} } type RpcProcessCancelResponseErrorCode int32 @@ -8275,7 +8692,7 @@ func (x RpcProcessCancelResponseErrorCode) String() string { } func (RpcProcessCancelResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 34, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 35, 0, 1, 0, 0} } type RpcProcessSubscribeResponseErrorCode int32 @@ -8303,7 +8720,7 @@ func (x RpcProcessSubscribeResponseErrorCode) String() string { } func (RpcProcessSubscribeResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 34, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 35, 1, 1, 0, 0} } type RpcProcessUnsubscribeResponseErrorCode int32 @@ -8331,7 +8748,7 @@ func (x RpcProcessUnsubscribeResponseErrorCode) String() string { } func (RpcProcessUnsubscribeResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 34, 2, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 35, 2, 1, 0, 0} } type RpcGenericErrorResponseErrorCode int32 @@ -8359,7 +8776,7 @@ func (x RpcGenericErrorResponseErrorCode) String() string { } func (RpcGenericErrorResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 35, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 36, 0, 0} } type RpcNotificationListResponseErrorCode int32 @@ -8390,7 +8807,7 @@ func (x RpcNotificationListResponseErrorCode) String() string { } func (RpcNotificationListResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 36, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 0, 1, 0, 0} } type RpcNotificationReplyResponseErrorCode int32 @@ -8421,7 +8838,7 @@ func (x RpcNotificationReplyResponseErrorCode) String() string { } func (RpcNotificationReplyResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 36, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 1, 1, 0, 0} } type RpcNotificationTestResponseErrorCode int32 @@ -8452,7 +8869,7 @@ func (x RpcNotificationTestResponseErrorCode) String() string { } func (RpcNotificationTestResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 36, 2, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 2, 1, 0, 0} } type RpcMembershipGetStatusResponseErrorCode int32 @@ -8498,7 +8915,7 @@ func (x RpcMembershipGetStatusResponseErrorCode) String() string { } func (RpcMembershipGetStatusResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 0, 1, 0, 0} } type RpcMembershipIsNameValidResponseErrorCode int32 @@ -8564,7 +8981,7 @@ func (x RpcMembershipIsNameValidResponseErrorCode) String() string { } func (RpcMembershipIsNameValidResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 1, 1, 0, 0} } type RpcMembershipRegisterPaymentRequestResponseErrorCode int32 @@ -8623,7 +9040,7 @@ func (x RpcMembershipRegisterPaymentRequestResponseErrorCode) String() string { } func (RpcMembershipRegisterPaymentRequestResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 2, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 2, 1, 0, 0} } type RpcMembershipGetPortalLinkUrlResponseErrorCode int32 @@ -8663,7 +9080,7 @@ func (x RpcMembershipGetPortalLinkUrlResponseErrorCode) String() string { } func (RpcMembershipGetPortalLinkUrlResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 3, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 3, 1, 0, 0} } type RpcMembershipFinalizeResponseErrorCode int32 @@ -8712,7 +9129,7 @@ func (x RpcMembershipFinalizeResponseErrorCode) String() string { } func (RpcMembershipFinalizeResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 4, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 4, 1, 0, 0} } type RpcMembershipGetVerificationEmailStatusResponseErrorCode int32 @@ -8749,7 +9166,7 @@ func (x RpcMembershipGetVerificationEmailStatusResponseErrorCode) String() strin } func (RpcMembershipGetVerificationEmailStatusResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 5, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 5, 1, 0, 0} } type RpcMembershipGetVerificationEmailResponseErrorCode int32 @@ -8804,7 +9221,7 @@ func (x RpcMembershipGetVerificationEmailResponseErrorCode) String() string { } func (RpcMembershipGetVerificationEmailResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 6, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 6, 1, 0, 0} } type RpcMembershipVerifyEmailCodeResponseErrorCode int32 @@ -8859,7 +9276,7 @@ func (x RpcMembershipVerifyEmailCodeResponseErrorCode) String() string { } func (RpcMembershipVerifyEmailCodeResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 7, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 7, 1, 0, 0} } type RpcMembershipGetTiersResponseErrorCode int32 @@ -8899,7 +9316,7 @@ func (x RpcMembershipGetTiersResponseErrorCode) String() string { } func (RpcMembershipGetTiersResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 8, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 8, 1, 0, 0} } type RpcMembershipVerifyAppStoreReceiptResponseErrorCode int32 @@ -8945,7 +9362,7 @@ func (x RpcMembershipVerifyAppStoreReceiptResponseErrorCode) String() string { } func (RpcMembershipVerifyAppStoreReceiptResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 9, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 9, 1, 0, 0} } type RpcNameServiceResolveNameResponseErrorCode int32 @@ -8976,7 +9393,7 @@ func (x RpcNameServiceResolveNameResponseErrorCode) String() string { } func (RpcNameServiceResolveNameResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 0, 1, 0, 0} } type RpcNameServiceResolveAnyIdResponseErrorCode int32 @@ -9007,7 +9424,7 @@ func (x RpcNameServiceResolveAnyIdResponseErrorCode) String() string { } func (RpcNameServiceResolveAnyIdResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 1, 1, 0, 0} } type RpcNameServiceResolveSpaceIdResponseErrorCode int32 @@ -9038,7 +9455,7 @@ func (x RpcNameServiceResolveSpaceIdResponseErrorCode) String() string { } func (RpcNameServiceResolveSpaceIdResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 2, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 2, 1, 0, 0} } type RpcNameServiceUserAccountGetResponseErrorCode int32 @@ -9075,7 +9492,7 @@ func (x RpcNameServiceUserAccountGetResponseErrorCode) String() string { } func (RpcNameServiceUserAccountGetResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 3, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 3, 0, 1, 0, 0} } type RpcBroadcastPayloadEventResponseErrorCode int32 @@ -9106,7 +9523,7 @@ func (x RpcBroadcastPayloadEventResponseErrorCode) String() string { } func (RpcBroadcastPayloadEventResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 40, 0, 1, 0, 0} } type RpcDeviceSetNameResponseErrorCode int32 @@ -9134,7 +9551,7 @@ func (x RpcDeviceSetNameResponseErrorCode) String() string { } func (RpcDeviceSetNameResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 40, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 0, 1, 0, 0} } type RpcDeviceListResponseErrorCode int32 @@ -9162,7 +9579,7 @@ func (x RpcDeviceListResponseErrorCode) String() string { } func (RpcDeviceListResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 40, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 1, 1, 0, 0} } type RpcDeviceNetworkStateSetResponseErrorCode int32 @@ -9193,7 +9610,7 @@ func (x RpcDeviceNetworkStateSetResponseErrorCode) String() string { } func (RpcDeviceNetworkStateSetResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 40, 2, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 2, 0, 1, 0, 0} } type RpcChatAddMessageResponseErrorCode int32 @@ -9221,7 +9638,7 @@ func (x RpcChatAddMessageResponseErrorCode) String() string { } func (RpcChatAddMessageResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 0, 1, 0, 0} } type RpcChatEditMessageContentResponseErrorCode int32 @@ -9249,7 +9666,7 @@ func (x RpcChatEditMessageContentResponseErrorCode) String() string { } func (RpcChatEditMessageContentResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 1, 1, 0, 0} } type RpcChatToggleMessageReactionResponseErrorCode int32 @@ -9277,7 +9694,7 @@ func (x RpcChatToggleMessageReactionResponseErrorCode) String() string { } func (RpcChatToggleMessageReactionResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 2, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 2, 1, 0, 0} } type RpcChatDeleteMessageResponseErrorCode int32 @@ -9305,7 +9722,7 @@ func (x RpcChatDeleteMessageResponseErrorCode) String() string { } func (RpcChatDeleteMessageResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 3, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 3, 1, 0, 0} } type RpcChatGetMessagesResponseErrorCode int32 @@ -9333,7 +9750,7 @@ func (x RpcChatGetMessagesResponseErrorCode) String() string { } func (RpcChatGetMessagesResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 4, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 4, 1, 0, 0} } type RpcChatGetMessagesByIdsResponseErrorCode int32 @@ -9361,7 +9778,7 @@ func (x RpcChatGetMessagesByIdsResponseErrorCode) String() string { } func (RpcChatGetMessagesByIdsResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 5, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 5, 1, 0, 0} } type RpcChatSubscribeLastMessagesResponseErrorCode int32 @@ -9389,7 +9806,7 @@ func (x RpcChatSubscribeLastMessagesResponseErrorCode) String() string { } func (RpcChatSubscribeLastMessagesResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 6, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 6, 1, 0, 0} } type RpcChatUnsubscribeResponseErrorCode int32 @@ -9417,7 +9834,7 @@ func (x RpcChatUnsubscribeResponseErrorCode) String() string { } func (RpcChatUnsubscribeResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 7, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 7, 1, 0, 0} } type RpcChatSubscribeToMessagePreviewsResponseErrorCode int32 @@ -9445,7 +9862,35 @@ func (x RpcChatSubscribeToMessagePreviewsResponseErrorCode) String() string { } func (RpcChatSubscribeToMessagePreviewsResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 8, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 8, 1, 0, 0} +} + +type RpcChatUnsubscribeFromMessagePreviewsResponseErrorCode int32 + +const ( + RpcChatUnsubscribeFromMessagePreviewsResponseError_NULL RpcChatUnsubscribeFromMessagePreviewsResponseErrorCode = 0 + RpcChatUnsubscribeFromMessagePreviewsResponseError_UNKNOWN_ERROR RpcChatUnsubscribeFromMessagePreviewsResponseErrorCode = 1 + RpcChatUnsubscribeFromMessagePreviewsResponseError_BAD_INPUT RpcChatUnsubscribeFromMessagePreviewsResponseErrorCode = 2 +) + +var RpcChatUnsubscribeFromMessagePreviewsResponseErrorCode_name = map[int32]string{ + 0: "NULL", + 1: "UNKNOWN_ERROR", + 2: "BAD_INPUT", +} + +var RpcChatUnsubscribeFromMessagePreviewsResponseErrorCode_value = map[string]int32{ + "NULL": 0, + "UNKNOWN_ERROR": 1, + "BAD_INPUT": 2, +} + +func (x RpcChatUnsubscribeFromMessagePreviewsResponseErrorCode) String() string { + return proto.EnumName(RpcChatUnsubscribeFromMessagePreviewsResponseErrorCode_name, int32(x)) +} + +func (RpcChatUnsubscribeFromMessagePreviewsResponseErrorCode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 9, 1, 0, 0} } type RpcChatReadMessagesReadType int32 @@ -9470,7 +9915,7 @@ func (x RpcChatReadMessagesReadType) String() string { } func (RpcChatReadMessagesReadType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 9, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 10, 0} } type RpcChatReadMessagesResponseErrorCode int32 @@ -9501,7 +9946,7 @@ func (x RpcChatReadMessagesResponseErrorCode) String() string { } func (RpcChatReadMessagesResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 9, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 10, 1, 0, 0} } type RpcChatUnreadResponseErrorCode int32 @@ -9529,7 +9974,7 @@ func (x RpcChatUnreadResponseErrorCode) String() string { } func (RpcChatUnreadResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 10, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 11, 1, 0, 0} } // Rpc is a namespace, that agregates all of the service commands between client and middleware. @@ -10569,7 +11014,8 @@ func (m *RpcSpaceInviteGenerate) XXX_DiscardUnknown() { var xxx_messageInfo_RpcSpaceInviteGenerate proto.InternalMessageInfo type RpcSpaceInviteGenerateRequest struct { - SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + InviteType RpcSpaceInviteGenerateRequestInviteType `protobuf:"varint,2,opt,name=inviteType,proto3,enum=anytype.RpcSpaceInviteGenerateRequestInviteType" json:"inviteType,omitempty"` } func (m *RpcSpaceInviteGenerateRequest) Reset() { *m = RpcSpaceInviteGenerateRequest{} } @@ -10612,6 +11058,13 @@ func (m *RpcSpaceInviteGenerateRequest) GetSpaceId() string { return "" } +func (m *RpcSpaceInviteGenerateRequest) GetInviteType() RpcSpaceInviteGenerateRequestInviteType { + if m != nil { + return m.InviteType + } + return RpcSpaceInviteGenerateRequest_Member +} + type RpcSpaceInviteGenerateResponse struct { Error *RpcSpaceInviteGenerateResponseError `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` InviteCid string `protobuf:"bytes,2,opt,name=inviteCid,proto3" json:"inviteCid,omitempty"` @@ -11092,6 +11545,198 @@ func (m *RpcSpaceInviteGetCurrentResponseError) GetDescription() string { return "" } +type RpcSpaceInviteGetGuest struct { +} + +func (m *RpcSpaceInviteGetGuest) Reset() { *m = RpcSpaceInviteGetGuest{} } +func (m *RpcSpaceInviteGetGuest) String() string { return proto.CompactTextString(m) } +func (*RpcSpaceInviteGetGuest) ProtoMessage() {} +func (*RpcSpaceInviteGetGuest) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 5} +} +func (m *RpcSpaceInviteGetGuest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcSpaceInviteGetGuest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcSpaceInviteGetGuest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcSpaceInviteGetGuest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcSpaceInviteGetGuest.Merge(m, src) +} +func (m *RpcSpaceInviteGetGuest) XXX_Size() int { + return m.Size() +} +func (m *RpcSpaceInviteGetGuest) XXX_DiscardUnknown() { + xxx_messageInfo_RpcSpaceInviteGetGuest.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcSpaceInviteGetGuest proto.InternalMessageInfo + +type RpcSpaceInviteGetGuestRequest struct { + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` +} + +func (m *RpcSpaceInviteGetGuestRequest) Reset() { *m = RpcSpaceInviteGetGuestRequest{} } +func (m *RpcSpaceInviteGetGuestRequest) String() string { return proto.CompactTextString(m) } +func (*RpcSpaceInviteGetGuestRequest) ProtoMessage() {} +func (*RpcSpaceInviteGetGuestRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 5, 0} +} +func (m *RpcSpaceInviteGetGuestRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcSpaceInviteGetGuestRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcSpaceInviteGetGuestRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcSpaceInviteGetGuestRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcSpaceInviteGetGuestRequest.Merge(m, src) +} +func (m *RpcSpaceInviteGetGuestRequest) XXX_Size() int { + return m.Size() +} +func (m *RpcSpaceInviteGetGuestRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RpcSpaceInviteGetGuestRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcSpaceInviteGetGuestRequest proto.InternalMessageInfo + +func (m *RpcSpaceInviteGetGuestRequest) GetSpaceId() string { + if m != nil { + return m.SpaceId + } + return "" +} + +type RpcSpaceInviteGetGuestResponse struct { + Error *RpcSpaceInviteGetGuestResponseError `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + InviteCid string `protobuf:"bytes,2,opt,name=inviteCid,proto3" json:"inviteCid,omitempty"` + InviteFileKey string `protobuf:"bytes,3,opt,name=inviteFileKey,proto3" json:"inviteFileKey,omitempty"` +} + +func (m *RpcSpaceInviteGetGuestResponse) Reset() { *m = RpcSpaceInviteGetGuestResponse{} } +func (m *RpcSpaceInviteGetGuestResponse) String() string { return proto.CompactTextString(m) } +func (*RpcSpaceInviteGetGuestResponse) ProtoMessage() {} +func (*RpcSpaceInviteGetGuestResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 5, 1} +} +func (m *RpcSpaceInviteGetGuestResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcSpaceInviteGetGuestResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcSpaceInviteGetGuestResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcSpaceInviteGetGuestResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcSpaceInviteGetGuestResponse.Merge(m, src) +} +func (m *RpcSpaceInviteGetGuestResponse) XXX_Size() int { + return m.Size() +} +func (m *RpcSpaceInviteGetGuestResponse) XXX_DiscardUnknown() { + xxx_messageInfo_RpcSpaceInviteGetGuestResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcSpaceInviteGetGuestResponse proto.InternalMessageInfo + +func (m *RpcSpaceInviteGetGuestResponse) GetError() *RpcSpaceInviteGetGuestResponseError { + if m != nil { + return m.Error + } + return nil +} + +func (m *RpcSpaceInviteGetGuestResponse) GetInviteCid() string { + if m != nil { + return m.InviteCid + } + return "" +} + +func (m *RpcSpaceInviteGetGuestResponse) GetInviteFileKey() string { + if m != nil { + return m.InviteFileKey + } + return "" +} + +type RpcSpaceInviteGetGuestResponseError struct { + Code RpcSpaceInviteGetGuestResponseErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.RpcSpaceInviteGetGuestResponseErrorCode" json:"code,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` +} + +func (m *RpcSpaceInviteGetGuestResponseError) Reset() { *m = RpcSpaceInviteGetGuestResponseError{} } +func (m *RpcSpaceInviteGetGuestResponseError) String() string { return proto.CompactTextString(m) } +func (*RpcSpaceInviteGetGuestResponseError) ProtoMessage() {} +func (*RpcSpaceInviteGetGuestResponseError) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 5, 1, 0} +} +func (m *RpcSpaceInviteGetGuestResponseError) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcSpaceInviteGetGuestResponseError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcSpaceInviteGetGuestResponseError.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcSpaceInviteGetGuestResponseError) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcSpaceInviteGetGuestResponseError.Merge(m, src) +} +func (m *RpcSpaceInviteGetGuestResponseError) XXX_Size() int { + return m.Size() +} +func (m *RpcSpaceInviteGetGuestResponseError) XXX_DiscardUnknown() { + xxx_messageInfo_RpcSpaceInviteGetGuestResponseError.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcSpaceInviteGetGuestResponseError proto.InternalMessageInfo + +func (m *RpcSpaceInviteGetGuestResponseError) GetCode() RpcSpaceInviteGetGuestResponseErrorCode { + if m != nil { + return m.Code + } + return RpcSpaceInviteGetGuestResponseError_NULL +} + +func (m *RpcSpaceInviteGetGuestResponseError) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + type RpcSpaceInviteRevoke struct { } @@ -11099,7 +11744,7 @@ func (m *RpcSpaceInviteRevoke) Reset() { *m = RpcSpaceInviteRevoke{} } func (m *RpcSpaceInviteRevoke) String() string { return proto.CompactTextString(m) } func (*RpcSpaceInviteRevoke) ProtoMessage() {} func (*RpcSpaceInviteRevoke) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 5} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 6} } func (m *RpcSpaceInviteRevoke) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11136,7 +11781,7 @@ func (m *RpcSpaceInviteRevokeRequest) Reset() { *m = RpcSpaceInviteRevok func (m *RpcSpaceInviteRevokeRequest) String() string { return proto.CompactTextString(m) } func (*RpcSpaceInviteRevokeRequest) ProtoMessage() {} func (*RpcSpaceInviteRevokeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 5, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 6, 0} } func (m *RpcSpaceInviteRevokeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11180,7 +11825,7 @@ func (m *RpcSpaceInviteRevokeResponse) Reset() { *m = RpcSpaceInviteRevo func (m *RpcSpaceInviteRevokeResponse) String() string { return proto.CompactTextString(m) } func (*RpcSpaceInviteRevokeResponse) ProtoMessage() {} func (*RpcSpaceInviteRevokeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 5, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 6, 1} } func (m *RpcSpaceInviteRevokeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11225,7 +11870,7 @@ func (m *RpcSpaceInviteRevokeResponseError) Reset() { *m = RpcSpaceInvit func (m *RpcSpaceInviteRevokeResponseError) String() string { return proto.CompactTextString(m) } func (*RpcSpaceInviteRevokeResponseError) ProtoMessage() {} func (*RpcSpaceInviteRevokeResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 5, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 6, 1, 0} } func (m *RpcSpaceInviteRevokeResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11275,7 +11920,7 @@ func (m *RpcSpaceInviteView) Reset() { *m = RpcSpaceInviteView{} } func (m *RpcSpaceInviteView) String() string { return proto.CompactTextString(m) } func (*RpcSpaceInviteView) ProtoMessage() {} func (*RpcSpaceInviteView) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 6} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 7} } func (m *RpcSpaceInviteView) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11313,7 +11958,7 @@ func (m *RpcSpaceInviteViewRequest) Reset() { *m = RpcSpaceInviteViewReq func (m *RpcSpaceInviteViewRequest) String() string { return proto.CompactTextString(m) } func (*RpcSpaceInviteViewRequest) ProtoMessage() {} func (*RpcSpaceInviteViewRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 6, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 7, 0} } func (m *RpcSpaceInviteViewRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11357,18 +12002,19 @@ func (m *RpcSpaceInviteViewRequest) GetInviteFileKey() string { } type RpcSpaceInviteViewResponse struct { - Error *RpcSpaceInviteViewResponseError `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - SpaceId string `protobuf:"bytes,2,opt,name=spaceId,proto3" json:"spaceId,omitempty"` - SpaceName string `protobuf:"bytes,3,opt,name=spaceName,proto3" json:"spaceName,omitempty"` - SpaceIconCid string `protobuf:"bytes,4,opt,name=spaceIconCid,proto3" json:"spaceIconCid,omitempty"` - CreatorName string `protobuf:"bytes,5,opt,name=creatorName,proto3" json:"creatorName,omitempty"` + Error *RpcSpaceInviteViewResponseError `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + SpaceId string `protobuf:"bytes,2,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + SpaceName string `protobuf:"bytes,3,opt,name=spaceName,proto3" json:"spaceName,omitempty"` + SpaceIconCid string `protobuf:"bytes,4,opt,name=spaceIconCid,proto3" json:"spaceIconCid,omitempty"` + CreatorName string `protobuf:"bytes,5,opt,name=creatorName,proto3" json:"creatorName,omitempty"` + IsGuestUserInvite bool `protobuf:"varint,6,opt,name=isGuestUserInvite,proto3" json:"isGuestUserInvite,omitempty"` } func (m *RpcSpaceInviteViewResponse) Reset() { *m = RpcSpaceInviteViewResponse{} } func (m *RpcSpaceInviteViewResponse) String() string { return proto.CompactTextString(m) } func (*RpcSpaceInviteViewResponse) ProtoMessage() {} func (*RpcSpaceInviteViewResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 6, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 7, 1} } func (m *RpcSpaceInviteViewResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11432,6 +12078,13 @@ func (m *RpcSpaceInviteViewResponse) GetCreatorName() string { return "" } +func (m *RpcSpaceInviteViewResponse) GetIsGuestUserInvite() bool { + if m != nil { + return m.IsGuestUserInvite + } + return false +} + type RpcSpaceInviteViewResponseError struct { Code RpcSpaceInviteViewResponseErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.RpcSpaceInviteViewResponseErrorCode" json:"code,omitempty"` Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` @@ -11441,7 +12094,7 @@ func (m *RpcSpaceInviteViewResponseError) Reset() { *m = RpcSpaceInviteV func (m *RpcSpaceInviteViewResponseError) String() string { return proto.CompactTextString(m) } func (*RpcSpaceInviteViewResponseError) ProtoMessage() {} func (*RpcSpaceInviteViewResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 6, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 7, 1, 0} } func (m *RpcSpaceInviteViewResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11491,7 +12144,7 @@ func (m *RpcSpaceJoin) Reset() { *m = RpcSpaceJoin{} } func (m *RpcSpaceJoin) String() string { return proto.CompactTextString(m) } func (*RpcSpaceJoin) ProtoMessage() {} func (*RpcSpaceJoin) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 7} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 8} } func (m *RpcSpaceJoin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11531,7 +12184,7 @@ func (m *RpcSpaceJoinRequest) Reset() { *m = RpcSpaceJoinRequest{} } func (m *RpcSpaceJoinRequest) String() string { return proto.CompactTextString(m) } func (*RpcSpaceJoinRequest) ProtoMessage() {} func (*RpcSpaceJoinRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 7, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 8, 0} } func (m *RpcSpaceJoinRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11596,7 +12249,7 @@ func (m *RpcSpaceJoinResponse) Reset() { *m = RpcSpaceJoinResponse{} } func (m *RpcSpaceJoinResponse) String() string { return proto.CompactTextString(m) } func (*RpcSpaceJoinResponse) ProtoMessage() {} func (*RpcSpaceJoinResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 7, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 8, 1} } func (m *RpcSpaceJoinResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11641,7 +12294,7 @@ func (m *RpcSpaceJoinResponseError) Reset() { *m = RpcSpaceJoinResponseE func (m *RpcSpaceJoinResponseError) String() string { return proto.CompactTextString(m) } func (*RpcSpaceJoinResponseError) ProtoMessage() {} func (*RpcSpaceJoinResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 7, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 8, 1, 0} } func (m *RpcSpaceJoinResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11691,7 +12344,7 @@ func (m *RpcSpaceJoinCancel) Reset() { *m = RpcSpaceJoinCancel{} } func (m *RpcSpaceJoinCancel) String() string { return proto.CompactTextString(m) } func (*RpcSpaceJoinCancel) ProtoMessage() {} func (*RpcSpaceJoinCancel) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 8} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 9} } func (m *RpcSpaceJoinCancel) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11728,7 +12381,7 @@ func (m *RpcSpaceJoinCancelRequest) Reset() { *m = RpcSpaceJoinCancelReq func (m *RpcSpaceJoinCancelRequest) String() string { return proto.CompactTextString(m) } func (*RpcSpaceJoinCancelRequest) ProtoMessage() {} func (*RpcSpaceJoinCancelRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 8, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 9, 0} } func (m *RpcSpaceJoinCancelRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11772,7 +12425,7 @@ func (m *RpcSpaceJoinCancelResponse) Reset() { *m = RpcSpaceJoinCancelRe func (m *RpcSpaceJoinCancelResponse) String() string { return proto.CompactTextString(m) } func (*RpcSpaceJoinCancelResponse) ProtoMessage() {} func (*RpcSpaceJoinCancelResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 8, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 9, 1} } func (m *RpcSpaceJoinCancelResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11817,7 +12470,7 @@ func (m *RpcSpaceJoinCancelResponseError) Reset() { *m = RpcSpaceJoinCan func (m *RpcSpaceJoinCancelResponseError) String() string { return proto.CompactTextString(m) } func (*RpcSpaceJoinCancelResponseError) ProtoMessage() {} func (*RpcSpaceJoinCancelResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 8, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 9, 1, 0} } func (m *RpcSpaceJoinCancelResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11867,7 +12520,7 @@ func (m *RpcSpaceRequestApprove) Reset() { *m = RpcSpaceRequestApprove{} func (m *RpcSpaceRequestApprove) String() string { return proto.CompactTextString(m) } func (*RpcSpaceRequestApprove) ProtoMessage() {} func (*RpcSpaceRequestApprove) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 9} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 10} } func (m *RpcSpaceRequestApprove) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11906,7 +12559,7 @@ func (m *RpcSpaceRequestApproveRequest) Reset() { *m = RpcSpaceRequestAp func (m *RpcSpaceRequestApproveRequest) String() string { return proto.CompactTextString(m) } func (*RpcSpaceRequestApproveRequest) ProtoMessage() {} func (*RpcSpaceRequestApproveRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 9, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 10, 0} } func (m *RpcSpaceRequestApproveRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11964,7 +12617,7 @@ func (m *RpcSpaceRequestApproveResponse) Reset() { *m = RpcSpaceRequestA func (m *RpcSpaceRequestApproveResponse) String() string { return proto.CompactTextString(m) } func (*RpcSpaceRequestApproveResponse) ProtoMessage() {} func (*RpcSpaceRequestApproveResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 9, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 10, 1} } func (m *RpcSpaceRequestApproveResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12009,7 +12662,7 @@ func (m *RpcSpaceRequestApproveResponseError) Reset() { *m = RpcSpaceReq func (m *RpcSpaceRequestApproveResponseError) String() string { return proto.CompactTextString(m) } func (*RpcSpaceRequestApproveResponseError) ProtoMessage() {} func (*RpcSpaceRequestApproveResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 9, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 10, 1, 0} } func (m *RpcSpaceRequestApproveResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12059,7 +12712,7 @@ func (m *RpcSpaceRequestDecline) Reset() { *m = RpcSpaceRequestDecline{} func (m *RpcSpaceRequestDecline) String() string { return proto.CompactTextString(m) } func (*RpcSpaceRequestDecline) ProtoMessage() {} func (*RpcSpaceRequestDecline) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 10} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 11} } func (m *RpcSpaceRequestDecline) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12097,7 +12750,7 @@ func (m *RpcSpaceRequestDeclineRequest) Reset() { *m = RpcSpaceRequestDe func (m *RpcSpaceRequestDeclineRequest) String() string { return proto.CompactTextString(m) } func (*RpcSpaceRequestDeclineRequest) ProtoMessage() {} func (*RpcSpaceRequestDeclineRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 10, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 11, 0} } func (m *RpcSpaceRequestDeclineRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12148,7 +12801,7 @@ func (m *RpcSpaceRequestDeclineResponse) Reset() { *m = RpcSpaceRequestD func (m *RpcSpaceRequestDeclineResponse) String() string { return proto.CompactTextString(m) } func (*RpcSpaceRequestDeclineResponse) ProtoMessage() {} func (*RpcSpaceRequestDeclineResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 10, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 11, 1} } func (m *RpcSpaceRequestDeclineResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12193,7 +12846,7 @@ func (m *RpcSpaceRequestDeclineResponseError) Reset() { *m = RpcSpaceReq func (m *RpcSpaceRequestDeclineResponseError) String() string { return proto.CompactTextString(m) } func (*RpcSpaceRequestDeclineResponseError) ProtoMessage() {} func (*RpcSpaceRequestDeclineResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 10, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 11, 1, 0} } func (m *RpcSpaceRequestDeclineResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12243,7 +12896,7 @@ func (m *RpcSpaceParticipantRemove) Reset() { *m = RpcSpaceParticipantRe func (m *RpcSpaceParticipantRemove) String() string { return proto.CompactTextString(m) } func (*RpcSpaceParticipantRemove) ProtoMessage() {} func (*RpcSpaceParticipantRemove) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 11} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 12} } func (m *RpcSpaceParticipantRemove) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12281,7 +12934,7 @@ func (m *RpcSpaceParticipantRemoveRequest) Reset() { *m = RpcSpacePartic func (m *RpcSpaceParticipantRemoveRequest) String() string { return proto.CompactTextString(m) } func (*RpcSpaceParticipantRemoveRequest) ProtoMessage() {} func (*RpcSpaceParticipantRemoveRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 11, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 12, 0} } func (m *RpcSpaceParticipantRemoveRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12332,7 +12985,7 @@ func (m *RpcSpaceParticipantRemoveResponse) Reset() { *m = RpcSpaceParti func (m *RpcSpaceParticipantRemoveResponse) String() string { return proto.CompactTextString(m) } func (*RpcSpaceParticipantRemoveResponse) ProtoMessage() {} func (*RpcSpaceParticipantRemoveResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 11, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 12, 1} } func (m *RpcSpaceParticipantRemoveResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12379,7 +13032,7 @@ func (m *RpcSpaceParticipantRemoveResponseError) Reset() { func (m *RpcSpaceParticipantRemoveResponseError) String() string { return proto.CompactTextString(m) } func (*RpcSpaceParticipantRemoveResponseError) ProtoMessage() {} func (*RpcSpaceParticipantRemoveResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 11, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 12, 1, 0} } func (m *RpcSpaceParticipantRemoveResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12429,7 +13082,7 @@ func (m *RpcSpaceParticipantPermissionsChange) Reset() { *m = RpcSpacePa func (m *RpcSpaceParticipantPermissionsChange) String() string { return proto.CompactTextString(m) } func (*RpcSpaceParticipantPermissionsChange) ProtoMessage() {} func (*RpcSpaceParticipantPermissionsChange) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 12} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 13} } func (m *RpcSpaceParticipantPermissionsChange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12471,7 +13124,7 @@ func (m *RpcSpaceParticipantPermissionsChangeRequest) String() string { } func (*RpcSpaceParticipantPermissionsChangeRequest) ProtoMessage() {} func (*RpcSpaceParticipantPermissionsChangeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 12, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 13, 0} } func (m *RpcSpaceParticipantPermissionsChangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12526,7 +13179,7 @@ func (m *RpcSpaceParticipantPermissionsChangeResponse) String() string { } func (*RpcSpaceParticipantPermissionsChangeResponse) ProtoMessage() {} func (*RpcSpaceParticipantPermissionsChangeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 12, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 13, 1} } func (m *RpcSpaceParticipantPermissionsChangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12575,7 +13228,7 @@ func (m *RpcSpaceParticipantPermissionsChangeResponseError) String() string { } func (*RpcSpaceParticipantPermissionsChangeResponseError) ProtoMessage() {} func (*RpcSpaceParticipantPermissionsChangeResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 12, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 13, 1, 0} } func (m *RpcSpaceParticipantPermissionsChangeResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12625,7 +13278,7 @@ func (m *RpcSpaceDelete) Reset() { *m = RpcSpaceDelete{} } func (m *RpcSpaceDelete) String() string { return proto.CompactTextString(m) } func (*RpcSpaceDelete) ProtoMessage() {} func (*RpcSpaceDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 13} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 14} } func (m *RpcSpaceDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12662,7 +13315,7 @@ func (m *RpcSpaceDeleteRequest) Reset() { *m = RpcSpaceDeleteRequest{} } func (m *RpcSpaceDeleteRequest) String() string { return proto.CompactTextString(m) } func (*RpcSpaceDeleteRequest) ProtoMessage() {} func (*RpcSpaceDeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 13, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 14, 0} } func (m *RpcSpaceDeleteRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12707,7 +13360,7 @@ func (m *RpcSpaceDeleteResponse) Reset() { *m = RpcSpaceDeleteResponse{} func (m *RpcSpaceDeleteResponse) String() string { return proto.CompactTextString(m) } func (*RpcSpaceDeleteResponse) ProtoMessage() {} func (*RpcSpaceDeleteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 13, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 14, 1} } func (m *RpcSpaceDeleteResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12759,7 +13412,7 @@ func (m *RpcSpaceDeleteResponseError) Reset() { *m = RpcSpaceDeleteRespo func (m *RpcSpaceDeleteResponseError) String() string { return proto.CompactTextString(m) } func (*RpcSpaceDeleteResponseError) ProtoMessage() {} func (*RpcSpaceDeleteResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 13, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 14, 1, 0} } func (m *RpcSpaceDeleteResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12809,7 +13462,7 @@ func (m *RpcSpaceSetOrder) Reset() { *m = RpcSpaceSetOrder{} } func (m *RpcSpaceSetOrder) String() string { return proto.CompactTextString(m) } func (*RpcSpaceSetOrder) ProtoMessage() {} func (*RpcSpaceSetOrder) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 14} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 15} } func (m *RpcSpaceSetOrder) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12847,7 +13500,7 @@ func (m *RpcSpaceSetOrderRequest) Reset() { *m = RpcSpaceSetOrderRequest func (m *RpcSpaceSetOrderRequest) String() string { return proto.CompactTextString(m) } func (*RpcSpaceSetOrderRequest) ProtoMessage() {} func (*RpcSpaceSetOrderRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 14, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 15, 0} } func (m *RpcSpaceSetOrderRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12898,7 +13551,7 @@ func (m *RpcSpaceSetOrderResponse) Reset() { *m = RpcSpaceSetOrderRespon func (m *RpcSpaceSetOrderResponse) String() string { return proto.CompactTextString(m) } func (*RpcSpaceSetOrderResponse) ProtoMessage() {} func (*RpcSpaceSetOrderResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 14, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 15, 1} } func (m *RpcSpaceSetOrderResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12943,7 +13596,7 @@ func (m *RpcSpaceSetOrderResponseError) Reset() { *m = RpcSpaceSetOrderR func (m *RpcSpaceSetOrderResponseError) String() string { return proto.CompactTextString(m) } func (*RpcSpaceSetOrderResponseError) ProtoMessage() {} func (*RpcSpaceSetOrderResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 14, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 15, 1, 0} } func (m *RpcSpaceSetOrderResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12993,7 +13646,7 @@ func (m *RpcSpaceUnsetOrder) Reset() { *m = RpcSpaceUnsetOrder{} } func (m *RpcSpaceUnsetOrder) String() string { return proto.CompactTextString(m) } func (*RpcSpaceUnsetOrder) ProtoMessage() {} func (*RpcSpaceUnsetOrder) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 15} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 16} } func (m *RpcSpaceUnsetOrder) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13030,7 +13683,7 @@ func (m *RpcSpaceUnsetOrderRequest) Reset() { *m = RpcSpaceUnsetOrderReq func (m *RpcSpaceUnsetOrderRequest) String() string { return proto.CompactTextString(m) } func (*RpcSpaceUnsetOrderRequest) ProtoMessage() {} func (*RpcSpaceUnsetOrderRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 15, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 16, 0} } func (m *RpcSpaceUnsetOrderRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13074,7 +13727,7 @@ func (m *RpcSpaceUnsetOrderResponse) Reset() { *m = RpcSpaceUnsetOrderRe func (m *RpcSpaceUnsetOrderResponse) String() string { return proto.CompactTextString(m) } func (*RpcSpaceUnsetOrderResponse) ProtoMessage() {} func (*RpcSpaceUnsetOrderResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 15, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 16, 1} } func (m *RpcSpaceUnsetOrderResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13119,7 +13772,7 @@ func (m *RpcSpaceUnsetOrderResponseError) Reset() { *m = RpcSpaceUnsetOr func (m *RpcSpaceUnsetOrderResponseError) String() string { return proto.CompactTextString(m) } func (*RpcSpaceUnsetOrderResponseError) ProtoMessage() {} func (*RpcSpaceUnsetOrderResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 15, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 1, 16, 1, 0} } func (m *RpcSpaceUnsetOrderResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14371,6 +15024,7 @@ type RpcAccountCreateRequest struct { NetworkCustomConfigFilePath string `protobuf:"bytes,7,opt,name=networkCustomConfigFilePath,proto3" json:"networkCustomConfigFilePath,omitempty"` PreferYamuxTransport bool `protobuf:"varint,8,opt,name=preferYamuxTransport,proto3" json:"preferYamuxTransport,omitempty"` JsonApiListenAddr string `protobuf:"bytes,9,opt,name=jsonApiListenAddr,proto3" json:"jsonApiListenAddr,omitempty"` + JoinStreamUrl string `protobuf:"bytes,10,opt,name=joinStreamUrl,proto3" json:"joinStreamUrl,omitempty"` } func (m *RpcAccountCreateRequest) Reset() { *m = RpcAccountCreateRequest{} } @@ -14488,6 +15142,13 @@ func (m *RpcAccountCreateRequest) GetJsonApiListenAddr() string { return "" } +func (m *RpcAccountCreateRequest) GetJoinStreamUrl() string { + if m != nil { + return m.JoinStreamUrl + } + return "" +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*RpcAccountCreateRequest) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -15275,8 +15936,9 @@ func (m *RpcAccountMigrateResponse) GetError() *RpcAccountMigrateResponseError { } type RpcAccountMigrateResponseError struct { - Code RpcAccountMigrateResponseErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.RpcAccountMigrateResponseErrorCode" json:"code,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + Code RpcAccountMigrateResponseErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.RpcAccountMigrateResponseErrorCode" json:"code,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + RequiredSpace int64 `protobuf:"varint,3,opt,name=requiredSpace,proto3" json:"requiredSpace,omitempty"` } func (m *RpcAccountMigrateResponseError) Reset() { *m = RpcAccountMigrateResponseError{} } @@ -15326,6 +15988,13 @@ func (m *RpcAccountMigrateResponseError) GetDescription() string { return "" } +func (m *RpcAccountMigrateResponseError) GetRequiredSpace() int64 { + if m != nil { + return m.RequiredSpace + } + return 0 +} + type RpcAccountMigrateCancel struct { } @@ -15550,6 +16219,7 @@ type RpcAccountSelectRequest struct { PreferYamuxTransport bool `protobuf:"varint,6,opt,name=preferYamuxTransport,proto3" json:"preferYamuxTransport,omitempty"` JsonApiListenAddr string `protobuf:"bytes,7,opt,name=jsonApiListenAddr,proto3" json:"jsonApiListenAddr,omitempty"` FulltextPrimaryLanguage string `protobuf:"bytes,8,opt,name=fulltextPrimaryLanguage,proto3" json:"fulltextPrimaryLanguage,omitempty"` + JoinStreamURL string `protobuf:"bytes,9,opt,name=joinStreamURL,proto3" json:"joinStreamURL,omitempty"` } func (m *RpcAccountSelectRequest) Reset() { *m = RpcAccountSelectRequest{} } @@ -15641,6 +16311,13 @@ func (m *RpcAccountSelectRequest) GetFulltextPrimaryLanguage() string { return "" } +func (m *RpcAccountSelectRequest) GetJoinStreamURL() string { + if m != nil { + return m.JoinStreamURL + } + return "" +} + // * // Middleware-to-front-end response for an account select request, that can contain a NULL error and selected account or a non-NULL error and an empty account type RpcAccountSelectResponse struct { @@ -41005,6 +41682,958 @@ func (m *RpcUnsplashDownloadResponseError) GetDescription() string { return "" } +type RpcAI struct { +} + +func (m *RpcAI) Reset() { *m = RpcAI{} } +func (m *RpcAI) String() string { return proto.CompactTextString(m) } +func (*RpcAI) ProtoMessage() {} +func (*RpcAI) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17} +} +func (m *RpcAI) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAI) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAI.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcAI) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAI.Merge(m, src) +} +func (m *RpcAI) XXX_Size() int { + return m.Size() +} +func (m *RpcAI) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAI.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAI proto.InternalMessageInfo + +type RpcAIWritingTools struct { +} + +func (m *RpcAIWritingTools) Reset() { *m = RpcAIWritingTools{} } +func (m *RpcAIWritingTools) String() string { return proto.CompactTextString(m) } +func (*RpcAIWritingTools) ProtoMessage() {} +func (*RpcAIWritingTools) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 0} +} +func (m *RpcAIWritingTools) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAIWritingTools) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAIWritingTools.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcAIWritingTools) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAIWritingTools.Merge(m, src) +} +func (m *RpcAIWritingTools) XXX_Size() int { + return m.Size() +} +func (m *RpcAIWritingTools) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAIWritingTools.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAIWritingTools proto.InternalMessageInfo + +type RpcAIWritingToolsRequest struct { + Config *RpcAIProviderConfig `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"` + Mode RpcAIWritingToolsRequestWritingMode `protobuf:"varint,2,opt,name=mode,proto3,enum=anytype.RpcAIWritingToolsRequestWritingMode" json:"mode,omitempty"` + Language RpcAIWritingToolsRequestLanguage `protobuf:"varint,3,opt,name=language,proto3,enum=anytype.RpcAIWritingToolsRequestLanguage" json:"language,omitempty"` + Text string `protobuf:"bytes,4,opt,name=text,proto3" json:"text,omitempty"` +} + +func (m *RpcAIWritingToolsRequest) Reset() { *m = RpcAIWritingToolsRequest{} } +func (m *RpcAIWritingToolsRequest) String() string { return proto.CompactTextString(m) } +func (*RpcAIWritingToolsRequest) ProtoMessage() {} +func (*RpcAIWritingToolsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 0, 0} +} +func (m *RpcAIWritingToolsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAIWritingToolsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAIWritingToolsRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcAIWritingToolsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAIWritingToolsRequest.Merge(m, src) +} +func (m *RpcAIWritingToolsRequest) XXX_Size() int { + return m.Size() +} +func (m *RpcAIWritingToolsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAIWritingToolsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAIWritingToolsRequest proto.InternalMessageInfo + +func (m *RpcAIWritingToolsRequest) GetConfig() *RpcAIProviderConfig { + if m != nil { + return m.Config + } + return nil +} + +func (m *RpcAIWritingToolsRequest) GetMode() RpcAIWritingToolsRequestWritingMode { + if m != nil { + return m.Mode + } + return RpcAIWritingToolsRequest_DEFAULT +} + +func (m *RpcAIWritingToolsRequest) GetLanguage() RpcAIWritingToolsRequestLanguage { + if m != nil { + return m.Language + } + return RpcAIWritingToolsRequest_EN +} + +func (m *RpcAIWritingToolsRequest) GetText() string { + if m != nil { + return m.Text + } + return "" +} + +type RpcAIWritingToolsResponse struct { + Error *RpcAIWritingToolsResponseError `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + Text string `protobuf:"bytes,2,opt,name=text,proto3" json:"text,omitempty"` +} + +func (m *RpcAIWritingToolsResponse) Reset() { *m = RpcAIWritingToolsResponse{} } +func (m *RpcAIWritingToolsResponse) String() string { return proto.CompactTextString(m) } +func (*RpcAIWritingToolsResponse) ProtoMessage() {} +func (*RpcAIWritingToolsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 0, 1} +} +func (m *RpcAIWritingToolsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAIWritingToolsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAIWritingToolsResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcAIWritingToolsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAIWritingToolsResponse.Merge(m, src) +} +func (m *RpcAIWritingToolsResponse) XXX_Size() int { + return m.Size() +} +func (m *RpcAIWritingToolsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAIWritingToolsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAIWritingToolsResponse proto.InternalMessageInfo + +func (m *RpcAIWritingToolsResponse) GetError() *RpcAIWritingToolsResponseError { + if m != nil { + return m.Error + } + return nil +} + +func (m *RpcAIWritingToolsResponse) GetText() string { + if m != nil { + return m.Text + } + return "" +} + +type RpcAIWritingToolsResponseError struct { + Code RpcAIWritingToolsResponseErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.RpcAIWritingToolsResponseErrorCode" json:"code,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` +} + +func (m *RpcAIWritingToolsResponseError) Reset() { *m = RpcAIWritingToolsResponseError{} } +func (m *RpcAIWritingToolsResponseError) String() string { return proto.CompactTextString(m) } +func (*RpcAIWritingToolsResponseError) ProtoMessage() {} +func (*RpcAIWritingToolsResponseError) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 0, 1, 0} +} +func (m *RpcAIWritingToolsResponseError) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAIWritingToolsResponseError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAIWritingToolsResponseError.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcAIWritingToolsResponseError) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAIWritingToolsResponseError.Merge(m, src) +} +func (m *RpcAIWritingToolsResponseError) XXX_Size() int { + return m.Size() +} +func (m *RpcAIWritingToolsResponseError) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAIWritingToolsResponseError.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAIWritingToolsResponseError proto.InternalMessageInfo + +func (m *RpcAIWritingToolsResponseError) GetCode() RpcAIWritingToolsResponseErrorCode { + if m != nil { + return m.Code + } + return RpcAIWritingToolsResponseError_NULL +} + +func (m *RpcAIWritingToolsResponseError) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +type RpcAIAutofill struct { +} + +func (m *RpcAIAutofill) Reset() { *m = RpcAIAutofill{} } +func (m *RpcAIAutofill) String() string { return proto.CompactTextString(m) } +func (*RpcAIAutofill) ProtoMessage() {} +func (*RpcAIAutofill) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 1} +} +func (m *RpcAIAutofill) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAIAutofill) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAIAutofill.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcAIAutofill) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAIAutofill.Merge(m, src) +} +func (m *RpcAIAutofill) XXX_Size() int { + return m.Size() +} +func (m *RpcAIAutofill) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAIAutofill.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAIAutofill proto.InternalMessageInfo + +type RpcAIAutofillRequest struct { + Config *RpcAIProviderConfig `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"` + Mode RpcAIAutofillRequestAutofillMode `protobuf:"varint,2,opt,name=mode,proto3,enum=anytype.RpcAIAutofillRequestAutofillMode" json:"mode,omitempty"` + Options []string `protobuf:"bytes,3,rep,name=options,proto3" json:"options,omitempty"` + Context []string `protobuf:"bytes,4,rep,name=context,proto3" json:"context,omitempty"` +} + +func (m *RpcAIAutofillRequest) Reset() { *m = RpcAIAutofillRequest{} } +func (m *RpcAIAutofillRequest) String() string { return proto.CompactTextString(m) } +func (*RpcAIAutofillRequest) ProtoMessage() {} +func (*RpcAIAutofillRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 1, 0} +} +func (m *RpcAIAutofillRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAIAutofillRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAIAutofillRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcAIAutofillRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAIAutofillRequest.Merge(m, src) +} +func (m *RpcAIAutofillRequest) XXX_Size() int { + return m.Size() +} +func (m *RpcAIAutofillRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAIAutofillRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAIAutofillRequest proto.InternalMessageInfo + +func (m *RpcAIAutofillRequest) GetConfig() *RpcAIProviderConfig { + if m != nil { + return m.Config + } + return nil +} + +func (m *RpcAIAutofillRequest) GetMode() RpcAIAutofillRequestAutofillMode { + if m != nil { + return m.Mode + } + return RpcAIAutofillRequest_TAG +} + +func (m *RpcAIAutofillRequest) GetOptions() []string { + if m != nil { + return m.Options + } + return nil +} + +func (m *RpcAIAutofillRequest) GetContext() []string { + if m != nil { + return m.Context + } + return nil +} + +type RpcAIAutofillResponse struct { + Error *RpcAIAutofillResponseError `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + Text string `protobuf:"bytes,2,opt,name=text,proto3" json:"text,omitempty"` +} + +func (m *RpcAIAutofillResponse) Reset() { *m = RpcAIAutofillResponse{} } +func (m *RpcAIAutofillResponse) String() string { return proto.CompactTextString(m) } +func (*RpcAIAutofillResponse) ProtoMessage() {} +func (*RpcAIAutofillResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 1, 1} +} +func (m *RpcAIAutofillResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAIAutofillResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAIAutofillResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcAIAutofillResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAIAutofillResponse.Merge(m, src) +} +func (m *RpcAIAutofillResponse) XXX_Size() int { + return m.Size() +} +func (m *RpcAIAutofillResponse) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAIAutofillResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAIAutofillResponse proto.InternalMessageInfo + +func (m *RpcAIAutofillResponse) GetError() *RpcAIAutofillResponseError { + if m != nil { + return m.Error + } + return nil +} + +func (m *RpcAIAutofillResponse) GetText() string { + if m != nil { + return m.Text + } + return "" +} + +type RpcAIAutofillResponseError struct { + Code RpcAIAutofillResponseErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.RpcAIAutofillResponseErrorCode" json:"code,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` +} + +func (m *RpcAIAutofillResponseError) Reset() { *m = RpcAIAutofillResponseError{} } +func (m *RpcAIAutofillResponseError) String() string { return proto.CompactTextString(m) } +func (*RpcAIAutofillResponseError) ProtoMessage() {} +func (*RpcAIAutofillResponseError) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 1, 1, 0} +} +func (m *RpcAIAutofillResponseError) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAIAutofillResponseError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAIAutofillResponseError.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcAIAutofillResponseError) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAIAutofillResponseError.Merge(m, src) +} +func (m *RpcAIAutofillResponseError) XXX_Size() int { + return m.Size() +} +func (m *RpcAIAutofillResponseError) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAIAutofillResponseError.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAIAutofillResponseError proto.InternalMessageInfo + +func (m *RpcAIAutofillResponseError) GetCode() RpcAIAutofillResponseErrorCode { + if m != nil { + return m.Code + } + return RpcAIAutofillResponseError_NULL +} + +func (m *RpcAIAutofillResponseError) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +type RpcAIListSummary struct { +} + +func (m *RpcAIListSummary) Reset() { *m = RpcAIListSummary{} } +func (m *RpcAIListSummary) String() string { return proto.CompactTextString(m) } +func (*RpcAIListSummary) ProtoMessage() {} +func (*RpcAIListSummary) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 2} +} +func (m *RpcAIListSummary) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAIListSummary) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAIListSummary.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcAIListSummary) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAIListSummary.Merge(m, src) +} +func (m *RpcAIListSummary) XXX_Size() int { + return m.Size() +} +func (m *RpcAIListSummary) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAIListSummary.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAIListSummary proto.InternalMessageInfo + +type RpcAIListSummaryRequest struct { + Config *RpcAIProviderConfig `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"` + SpaceId string `protobuf:"bytes,2,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + ObjectIds []string `protobuf:"bytes,3,rep,name=objectIds,proto3" json:"objectIds,omitempty"` + Prompt string `protobuf:"bytes,4,opt,name=prompt,proto3" json:"prompt,omitempty"` +} + +func (m *RpcAIListSummaryRequest) Reset() { *m = RpcAIListSummaryRequest{} } +func (m *RpcAIListSummaryRequest) String() string { return proto.CompactTextString(m) } +func (*RpcAIListSummaryRequest) ProtoMessage() {} +func (*RpcAIListSummaryRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 2, 0} +} +func (m *RpcAIListSummaryRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAIListSummaryRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAIListSummaryRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcAIListSummaryRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAIListSummaryRequest.Merge(m, src) +} +func (m *RpcAIListSummaryRequest) XXX_Size() int { + return m.Size() +} +func (m *RpcAIListSummaryRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAIListSummaryRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAIListSummaryRequest proto.InternalMessageInfo + +func (m *RpcAIListSummaryRequest) GetConfig() *RpcAIProviderConfig { + if m != nil { + return m.Config + } + return nil +} + +func (m *RpcAIListSummaryRequest) GetSpaceId() string { + if m != nil { + return m.SpaceId + } + return "" +} + +func (m *RpcAIListSummaryRequest) GetObjectIds() []string { + if m != nil { + return m.ObjectIds + } + return nil +} + +func (m *RpcAIListSummaryRequest) GetPrompt() string { + if m != nil { + return m.Prompt + } + return "" +} + +type RpcAIListSummaryResponse struct { + Error *RpcAIListSummaryResponseError `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + ObjectId string `protobuf:"bytes,2,opt,name=objectId,proto3" json:"objectId,omitempty"` +} + +func (m *RpcAIListSummaryResponse) Reset() { *m = RpcAIListSummaryResponse{} } +func (m *RpcAIListSummaryResponse) String() string { return proto.CompactTextString(m) } +func (*RpcAIListSummaryResponse) ProtoMessage() {} +func (*RpcAIListSummaryResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 2, 1} +} +func (m *RpcAIListSummaryResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAIListSummaryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAIListSummaryResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcAIListSummaryResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAIListSummaryResponse.Merge(m, src) +} +func (m *RpcAIListSummaryResponse) XXX_Size() int { + return m.Size() +} +func (m *RpcAIListSummaryResponse) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAIListSummaryResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAIListSummaryResponse proto.InternalMessageInfo + +func (m *RpcAIListSummaryResponse) GetError() *RpcAIListSummaryResponseError { + if m != nil { + return m.Error + } + return nil +} + +func (m *RpcAIListSummaryResponse) GetObjectId() string { + if m != nil { + return m.ObjectId + } + return "" +} + +type RpcAIListSummaryResponseError struct { + Code RpcAIListSummaryResponseErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.RpcAIListSummaryResponseErrorCode" json:"code,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` +} + +func (m *RpcAIListSummaryResponseError) Reset() { *m = RpcAIListSummaryResponseError{} } +func (m *RpcAIListSummaryResponseError) String() string { return proto.CompactTextString(m) } +func (*RpcAIListSummaryResponseError) ProtoMessage() {} +func (*RpcAIListSummaryResponseError) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 2, 1, 0} +} +func (m *RpcAIListSummaryResponseError) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAIListSummaryResponseError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAIListSummaryResponseError.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcAIListSummaryResponseError) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAIListSummaryResponseError.Merge(m, src) +} +func (m *RpcAIListSummaryResponseError) XXX_Size() int { + return m.Size() +} +func (m *RpcAIListSummaryResponseError) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAIListSummaryResponseError.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAIListSummaryResponseError proto.InternalMessageInfo + +func (m *RpcAIListSummaryResponseError) GetCode() RpcAIListSummaryResponseErrorCode { + if m != nil { + return m.Code + } + return RpcAIListSummaryResponseError_NULL +} + +func (m *RpcAIListSummaryResponseError) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +type RpcAIObjectCreateFromUrl struct { +} + +func (m *RpcAIObjectCreateFromUrl) Reset() { *m = RpcAIObjectCreateFromUrl{} } +func (m *RpcAIObjectCreateFromUrl) String() string { return proto.CompactTextString(m) } +func (*RpcAIObjectCreateFromUrl) ProtoMessage() {} +func (*RpcAIObjectCreateFromUrl) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 3} +} +func (m *RpcAIObjectCreateFromUrl) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAIObjectCreateFromUrl) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAIObjectCreateFromUrl.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcAIObjectCreateFromUrl) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAIObjectCreateFromUrl.Merge(m, src) +} +func (m *RpcAIObjectCreateFromUrl) XXX_Size() int { + return m.Size() +} +func (m *RpcAIObjectCreateFromUrl) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAIObjectCreateFromUrl.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAIObjectCreateFromUrl proto.InternalMessageInfo + +type RpcAIObjectCreateFromUrlRequest struct { + Config *RpcAIProviderConfig `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"` + SpaceId string `protobuf:"bytes,2,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"` + Details *types.Struct `protobuf:"bytes,4,opt,name=details,proto3" json:"details,omitempty"` +} + +func (m *RpcAIObjectCreateFromUrlRequest) Reset() { *m = RpcAIObjectCreateFromUrlRequest{} } +func (m *RpcAIObjectCreateFromUrlRequest) String() string { return proto.CompactTextString(m) } +func (*RpcAIObjectCreateFromUrlRequest) ProtoMessage() {} +func (*RpcAIObjectCreateFromUrlRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 3, 0} +} +func (m *RpcAIObjectCreateFromUrlRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAIObjectCreateFromUrlRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAIObjectCreateFromUrlRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcAIObjectCreateFromUrlRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAIObjectCreateFromUrlRequest.Merge(m, src) +} +func (m *RpcAIObjectCreateFromUrlRequest) XXX_Size() int { + return m.Size() +} +func (m *RpcAIObjectCreateFromUrlRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAIObjectCreateFromUrlRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAIObjectCreateFromUrlRequest proto.InternalMessageInfo + +func (m *RpcAIObjectCreateFromUrlRequest) GetConfig() *RpcAIProviderConfig { + if m != nil { + return m.Config + } + return nil +} + +func (m *RpcAIObjectCreateFromUrlRequest) GetSpaceId() string { + if m != nil { + return m.SpaceId + } + return "" +} + +func (m *RpcAIObjectCreateFromUrlRequest) GetUrl() string { + if m != nil { + return m.Url + } + return "" +} + +func (m *RpcAIObjectCreateFromUrlRequest) GetDetails() *types.Struct { + if m != nil { + return m.Details + } + return nil +} + +type RpcAIObjectCreateFromUrlResponse struct { + Error *RpcAIObjectCreateFromUrlResponseError `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + ObjectId string `protobuf:"bytes,2,opt,name=objectId,proto3" json:"objectId,omitempty"` + Details *types.Struct `protobuf:"bytes,3,opt,name=details,proto3" json:"details,omitempty"` +} + +func (m *RpcAIObjectCreateFromUrlResponse) Reset() { *m = RpcAIObjectCreateFromUrlResponse{} } +func (m *RpcAIObjectCreateFromUrlResponse) String() string { return proto.CompactTextString(m) } +func (*RpcAIObjectCreateFromUrlResponse) ProtoMessage() {} +func (*RpcAIObjectCreateFromUrlResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 3, 1} +} +func (m *RpcAIObjectCreateFromUrlResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAIObjectCreateFromUrlResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAIObjectCreateFromUrlResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcAIObjectCreateFromUrlResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAIObjectCreateFromUrlResponse.Merge(m, src) +} +func (m *RpcAIObjectCreateFromUrlResponse) XXX_Size() int { + return m.Size() +} +func (m *RpcAIObjectCreateFromUrlResponse) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAIObjectCreateFromUrlResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAIObjectCreateFromUrlResponse proto.InternalMessageInfo + +func (m *RpcAIObjectCreateFromUrlResponse) GetError() *RpcAIObjectCreateFromUrlResponseError { + if m != nil { + return m.Error + } + return nil +} + +func (m *RpcAIObjectCreateFromUrlResponse) GetObjectId() string { + if m != nil { + return m.ObjectId + } + return "" +} + +func (m *RpcAIObjectCreateFromUrlResponse) GetDetails() *types.Struct { + if m != nil { + return m.Details + } + return nil +} + +type RpcAIObjectCreateFromUrlResponseError struct { + Code RpcAIObjectCreateFromUrlResponseErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.RpcAIObjectCreateFromUrlResponseErrorCode" json:"code,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` +} + +func (m *RpcAIObjectCreateFromUrlResponseError) Reset() { *m = RpcAIObjectCreateFromUrlResponseError{} } +func (m *RpcAIObjectCreateFromUrlResponseError) String() string { return proto.CompactTextString(m) } +func (*RpcAIObjectCreateFromUrlResponseError) ProtoMessage() {} +func (*RpcAIObjectCreateFromUrlResponseError) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 3, 1, 0} +} +func (m *RpcAIObjectCreateFromUrlResponseError) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAIObjectCreateFromUrlResponseError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAIObjectCreateFromUrlResponseError.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcAIObjectCreateFromUrlResponseError) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAIObjectCreateFromUrlResponseError.Merge(m, src) +} +func (m *RpcAIObjectCreateFromUrlResponseError) XXX_Size() int { + return m.Size() +} +func (m *RpcAIObjectCreateFromUrlResponseError) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAIObjectCreateFromUrlResponseError.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAIObjectCreateFromUrlResponseError proto.InternalMessageInfo + +func (m *RpcAIObjectCreateFromUrlResponseError) GetCode() RpcAIObjectCreateFromUrlResponseErrorCode { + if m != nil { + return m.Code + } + return RpcAIObjectCreateFromUrlResponseError_NULL +} + +func (m *RpcAIObjectCreateFromUrlResponseError) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +type RpcAIProviderConfig struct { + Provider RpcAIProvider `protobuf:"varint,1,opt,name=provider,proto3,enum=anytype.RpcAIProvider" json:"provider,omitempty"` + Endpoint string `protobuf:"bytes,2,opt,name=endpoint,proto3" json:"endpoint,omitempty"` + Model string `protobuf:"bytes,3,opt,name=model,proto3" json:"model,omitempty"` + Token string `protobuf:"bytes,4,opt,name=token,proto3" json:"token,omitempty"` + Temperature float32 `protobuf:"fixed32,5,opt,name=temperature,proto3" json:"temperature,omitempty"` +} + +func (m *RpcAIProviderConfig) Reset() { *m = RpcAIProviderConfig{} } +func (m *RpcAIProviderConfig) String() string { return proto.CompactTextString(m) } +func (*RpcAIProviderConfig) ProtoMessage() {} +func (*RpcAIProviderConfig) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 4} +} +func (m *RpcAIProviderConfig) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAIProviderConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAIProviderConfig.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcAIProviderConfig) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAIProviderConfig.Merge(m, src) +} +func (m *RpcAIProviderConfig) XXX_Size() int { + return m.Size() +} +func (m *RpcAIProviderConfig) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAIProviderConfig.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAIProviderConfig proto.InternalMessageInfo + +func (m *RpcAIProviderConfig) GetProvider() RpcAIProvider { + if m != nil { + return m.Provider + } + return RpcAI_OLLAMA +} + +func (m *RpcAIProviderConfig) GetEndpoint() string { + if m != nil { + return m.Endpoint + } + return "" +} + +func (m *RpcAIProviderConfig) GetModel() string { + if m != nil { + return m.Model + } + return "" +} + +func (m *RpcAIProviderConfig) GetToken() string { + if m != nil { + return m.Token + } + return "" +} + +func (m *RpcAIProviderConfig) GetTemperature() float32 { + if m != nil { + return m.Temperature + } + return 0 +} + type RpcGallery struct { } @@ -41012,7 +42641,7 @@ func (m *RpcGallery) Reset() { *m = RpcGallery{} } func (m *RpcGallery) String() string { return proto.CompactTextString(m) } func (*RpcGallery) ProtoMessage() {} func (*RpcGallery) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 17} + return fileDescriptor_8261c968b2e6f45c, []int{0, 18} } func (m *RpcGallery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -41048,7 +42677,7 @@ func (m *RpcGalleryDownloadManifest) Reset() { *m = RpcGalleryDownloadMa func (m *RpcGalleryDownloadManifest) String() string { return proto.CompactTextString(m) } func (*RpcGalleryDownloadManifest) ProtoMessage() {} func (*RpcGalleryDownloadManifest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 0} } func (m *RpcGalleryDownloadManifest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -41085,7 +42714,7 @@ func (m *RpcGalleryDownloadManifestRequest) Reset() { *m = RpcGalleryDow func (m *RpcGalleryDownloadManifestRequest) String() string { return proto.CompactTextString(m) } func (*RpcGalleryDownloadManifestRequest) ProtoMessage() {} func (*RpcGalleryDownloadManifestRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 0, 0} } func (m *RpcGalleryDownloadManifestRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -41130,7 +42759,7 @@ func (m *RpcGalleryDownloadManifestResponse) Reset() { *m = RpcGalleryDo func (m *RpcGalleryDownloadManifestResponse) String() string { return proto.CompactTextString(m) } func (*RpcGalleryDownloadManifestResponse) ProtoMessage() {} func (*RpcGalleryDownloadManifestResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 0, 1} } func (m *RpcGalleryDownloadManifestResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -41184,7 +42813,7 @@ func (m *RpcGalleryDownloadManifestResponseError) Reset() { func (m *RpcGalleryDownloadManifestResponseError) String() string { return proto.CompactTextString(m) } func (*RpcGalleryDownloadManifestResponseError) ProtoMessage() {} func (*RpcGalleryDownloadManifestResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 0, 1, 0} } func (m *RpcGalleryDownloadManifestResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -41234,7 +42863,7 @@ func (m *RpcGalleryDownloadIndex) Reset() { *m = RpcGalleryDownloadIndex func (m *RpcGalleryDownloadIndex) String() string { return proto.CompactTextString(m) } func (*RpcGalleryDownloadIndex) ProtoMessage() {} func (*RpcGalleryDownloadIndex) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 1} } func (m *RpcGalleryDownloadIndex) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -41270,7 +42899,7 @@ func (m *RpcGalleryDownloadIndexRequest) Reset() { *m = RpcGalleryDownlo func (m *RpcGalleryDownloadIndexRequest) String() string { return proto.CompactTextString(m) } func (*RpcGalleryDownloadIndexRequest) ProtoMessage() {} func (*RpcGalleryDownloadIndexRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 1, 0} } func (m *RpcGalleryDownloadIndexRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -41309,7 +42938,7 @@ func (m *RpcGalleryDownloadIndexResponse) Reset() { *m = RpcGalleryDownl func (m *RpcGalleryDownloadIndexResponse) String() string { return proto.CompactTextString(m) } func (*RpcGalleryDownloadIndexResponse) ProtoMessage() {} func (*RpcGalleryDownloadIndexResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 1, 1} } func (m *RpcGalleryDownloadIndexResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -41368,7 +42997,7 @@ func (m *RpcGalleryDownloadIndexResponseError) Reset() { *m = RpcGallery func (m *RpcGalleryDownloadIndexResponseError) String() string { return proto.CompactTextString(m) } func (*RpcGalleryDownloadIndexResponseError) ProtoMessage() {} func (*RpcGalleryDownloadIndexResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 1, 1, 0} } func (m *RpcGalleryDownloadIndexResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -41423,7 +43052,7 @@ func (m *RpcGalleryDownloadIndexResponseCategory) Reset() { func (m *RpcGalleryDownloadIndexResponseCategory) String() string { return proto.CompactTextString(m) } func (*RpcGalleryDownloadIndexResponseCategory) ProtoMessage() {} func (*RpcGalleryDownloadIndexResponseCategory) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 17, 1, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 1, 1, 1} } func (m *RpcGalleryDownloadIndexResponseCategory) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -41481,7 +43110,7 @@ func (m *RpcBlock) Reset() { *m = RpcBlock{} } func (m *RpcBlock) String() string { return proto.CompactTextString(m) } func (*RpcBlock) ProtoMessage() {} func (*RpcBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19} } func (m *RpcBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -41517,7 +43146,7 @@ func (m *RpcBlockReplace) Reset() { *m = RpcBlockReplace{} } func (m *RpcBlockReplace) String() string { return proto.CompactTextString(m) } func (*RpcBlockReplace) ProtoMessage() {} func (*RpcBlockReplace) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 0} } func (m *RpcBlockReplace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -41556,7 +43185,7 @@ func (m *RpcBlockReplaceRequest) Reset() { *m = RpcBlockReplaceRequest{} func (m *RpcBlockReplaceRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockReplaceRequest) ProtoMessage() {} func (*RpcBlockReplaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 0, 0} } func (m *RpcBlockReplaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -41616,7 +43245,7 @@ func (m *RpcBlockReplaceResponse) Reset() { *m = RpcBlockReplaceResponse func (m *RpcBlockReplaceResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockReplaceResponse) ProtoMessage() {} func (*RpcBlockReplaceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 0, 1} } func (m *RpcBlockReplaceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -41675,7 +43304,7 @@ func (m *RpcBlockReplaceResponseError) Reset() { *m = RpcBlockReplaceRes func (m *RpcBlockReplaceResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockReplaceResponseError) ProtoMessage() {} func (*RpcBlockReplaceResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 0, 1, 0} } func (m *RpcBlockReplaceResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -41725,7 +43354,7 @@ func (m *RpcBlockSplit) Reset() { *m = RpcBlockSplit{} } func (m *RpcBlockSplit) String() string { return proto.CompactTextString(m) } func (*RpcBlockSplit) ProtoMessage() {} func (*RpcBlockSplit) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 1} } func (m *RpcBlockSplit) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -41766,7 +43395,7 @@ func (m *RpcBlockSplitRequest) Reset() { *m = RpcBlockSplitRequest{} } func (m *RpcBlockSplitRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockSplitRequest) ProtoMessage() {} func (*RpcBlockSplitRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 1, 0} } func (m *RpcBlockSplitRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -41840,7 +43469,7 @@ func (m *RpcBlockSplitResponse) Reset() { *m = RpcBlockSplitResponse{} } func (m *RpcBlockSplitResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockSplitResponse) ProtoMessage() {} func (*RpcBlockSplitResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 1, 1} } func (m *RpcBlockSplitResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -41899,7 +43528,7 @@ func (m *RpcBlockSplitResponseError) Reset() { *m = RpcBlockSplitRespons func (m *RpcBlockSplitResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockSplitResponseError) ProtoMessage() {} func (*RpcBlockSplitResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 1, 1, 0} } func (m *RpcBlockSplitResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -41949,7 +43578,7 @@ func (m *RpcBlockMerge) Reset() { *m = RpcBlockMerge{} } func (m *RpcBlockMerge) String() string { return proto.CompactTextString(m) } func (*RpcBlockMerge) ProtoMessage() {} func (*RpcBlockMerge) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 2} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 2} } func (m *RpcBlockMerge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -41988,7 +43617,7 @@ func (m *RpcBlockMergeRequest) Reset() { *m = RpcBlockMergeRequest{} } func (m *RpcBlockMergeRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockMergeRequest) ProtoMessage() {} func (*RpcBlockMergeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 2, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 2, 0} } func (m *RpcBlockMergeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -42047,7 +43676,7 @@ func (m *RpcBlockMergeResponse) Reset() { *m = RpcBlockMergeResponse{} } func (m *RpcBlockMergeResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockMergeResponse) ProtoMessage() {} func (*RpcBlockMergeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 2, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 2, 1} } func (m *RpcBlockMergeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -42099,7 +43728,7 @@ func (m *RpcBlockMergeResponseError) Reset() { *m = RpcBlockMergeRespons func (m *RpcBlockMergeResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockMergeResponseError) ProtoMessage() {} func (*RpcBlockMergeResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 2, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 2, 1, 0} } func (m *RpcBlockMergeResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -42149,7 +43778,7 @@ func (m *RpcBlockCopy) Reset() { *m = RpcBlockCopy{} } func (m *RpcBlockCopy) String() string { return proto.CompactTextString(m) } func (*RpcBlockCopy) ProtoMessage() {} func (*RpcBlockCopy) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 3} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 3} } func (m *RpcBlockCopy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -42188,7 +43817,7 @@ func (m *RpcBlockCopyRequest) Reset() { *m = RpcBlockCopyRequest{} } func (m *RpcBlockCopyRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockCopyRequest) ProtoMessage() {} func (*RpcBlockCopyRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 3, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 3, 0} } func (m *RpcBlockCopyRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -42249,7 +43878,7 @@ func (m *RpcBlockCopyResponse) Reset() { *m = RpcBlockCopyResponse{} } func (m *RpcBlockCopyResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockCopyResponse) ProtoMessage() {} func (*RpcBlockCopyResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 3, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 3, 1} } func (m *RpcBlockCopyResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -42315,7 +43944,7 @@ func (m *RpcBlockCopyResponseError) Reset() { *m = RpcBlockCopyResponseE func (m *RpcBlockCopyResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockCopyResponseError) ProtoMessage() {} func (*RpcBlockCopyResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 3, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 3, 1, 0} } func (m *RpcBlockCopyResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -42365,7 +43994,7 @@ func (m *RpcBlockPaste) Reset() { *m = RpcBlockPaste{} } func (m *RpcBlockPaste) String() string { return proto.CompactTextString(m) } func (*RpcBlockPaste) ProtoMessage() {} func (*RpcBlockPaste) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 4} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 4} } func (m *RpcBlockPaste) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -42411,7 +44040,7 @@ func (m *RpcBlockPasteRequest) Reset() { *m = RpcBlockPasteRequest{} } func (m *RpcBlockPasteRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockPasteRequest) ProtoMessage() {} func (*RpcBlockPasteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 4, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 4, 0} } func (m *RpcBlockPasteRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -42520,7 +44149,7 @@ func (m *RpcBlockPasteRequestFile) Reset() { *m = RpcBlockPasteRequestFi func (m *RpcBlockPasteRequestFile) String() string { return proto.CompactTextString(m) } func (*RpcBlockPasteRequestFile) ProtoMessage() {} func (*RpcBlockPasteRequestFile) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 4, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 4, 0, 0} } func (m *RpcBlockPasteRequestFile) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -42582,7 +44211,7 @@ func (m *RpcBlockPasteResponse) Reset() { *m = RpcBlockPasteResponse{} } func (m *RpcBlockPasteResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockPasteResponse) ProtoMessage() {} func (*RpcBlockPasteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 4, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 4, 1} } func (m *RpcBlockPasteResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -42655,7 +44284,7 @@ func (m *RpcBlockPasteResponseError) Reset() { *m = RpcBlockPasteRespons func (m *RpcBlockPasteResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockPasteResponseError) ProtoMessage() {} func (*RpcBlockPasteResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 4, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 4, 1, 0} } func (m *RpcBlockPasteResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -42705,7 +44334,7 @@ func (m *RpcBlockCut) Reset() { *m = RpcBlockCut{} } func (m *RpcBlockCut) String() string { return proto.CompactTextString(m) } func (*RpcBlockCut) ProtoMessage() {} func (*RpcBlockCut) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 5} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 5} } func (m *RpcBlockCut) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -42744,7 +44373,7 @@ func (m *RpcBlockCutRequest) Reset() { *m = RpcBlockCutRequest{} } func (m *RpcBlockCutRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockCutRequest) ProtoMessage() {} func (*RpcBlockCutRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 5, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 5, 0} } func (m *RpcBlockCutRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -42806,7 +44435,7 @@ func (m *RpcBlockCutResponse) Reset() { *m = RpcBlockCutResponse{} } func (m *RpcBlockCutResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockCutResponse) ProtoMessage() {} func (*RpcBlockCutResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 5, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 5, 1} } func (m *RpcBlockCutResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -42879,7 +44508,7 @@ func (m *RpcBlockCutResponseError) Reset() { *m = RpcBlockCutResponseErr func (m *RpcBlockCutResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockCutResponseError) ProtoMessage() {} func (*RpcBlockCutResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 5, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 5, 1, 0} } func (m *RpcBlockCutResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -42929,7 +44558,7 @@ func (m *RpcBlockUpload) Reset() { *m = RpcBlockUpload{} } func (m *RpcBlockUpload) String() string { return proto.CompactTextString(m) } func (*RpcBlockUpload) ProtoMessage() {} func (*RpcBlockUpload) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 6} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 6} } func (m *RpcBlockUpload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -42970,7 +44599,7 @@ func (m *RpcBlockUploadRequest) Reset() { *m = RpcBlockUploadRequest{} } func (m *RpcBlockUploadRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockUploadRequest) ProtoMessage() {} func (*RpcBlockUploadRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 6, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 6, 0} } func (m *RpcBlockUploadRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -43043,7 +44672,7 @@ func (m *RpcBlockUploadResponse) Reset() { *m = RpcBlockUploadResponse{} func (m *RpcBlockUploadResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockUploadResponse) ProtoMessage() {} func (*RpcBlockUploadResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 6, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 6, 1} } func (m *RpcBlockUploadResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -43095,7 +44724,7 @@ func (m *RpcBlockUploadResponseError) Reset() { *m = RpcBlockUploadRespo func (m *RpcBlockUploadResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockUploadResponseError) ProtoMessage() {} func (*RpcBlockUploadResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 6, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 6, 1, 0} } func (m *RpcBlockUploadResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -43145,7 +44774,7 @@ func (m *RpcBlockDownload) Reset() { *m = RpcBlockDownload{} } func (m *RpcBlockDownload) String() string { return proto.CompactTextString(m) } func (*RpcBlockDownload) ProtoMessage() {} func (*RpcBlockDownload) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 7} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 7} } func (m *RpcBlockDownload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -43183,7 +44812,7 @@ func (m *RpcBlockDownloadRequest) Reset() { *m = RpcBlockDownloadRequest func (m *RpcBlockDownloadRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDownloadRequest) ProtoMessage() {} func (*RpcBlockDownloadRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 7, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 7, 0} } func (m *RpcBlockDownloadRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -43235,7 +44864,7 @@ func (m *RpcBlockDownloadResponse) Reset() { *m = RpcBlockDownloadRespon func (m *RpcBlockDownloadResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockDownloadResponse) ProtoMessage() {} func (*RpcBlockDownloadResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 7, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 7, 1} } func (m *RpcBlockDownloadResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -43287,7 +44916,7 @@ func (m *RpcBlockDownloadResponseError) Reset() { *m = RpcBlockDownloadR func (m *RpcBlockDownloadResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockDownloadResponseError) ProtoMessage() {} func (*RpcBlockDownloadResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 7, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 7, 1, 0} } func (m *RpcBlockDownloadResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -43351,7 +44980,7 @@ func (m *RpcBlockCreate) Reset() { *m = RpcBlockCreate{} } func (m *RpcBlockCreate) String() string { return proto.CompactTextString(m) } func (*RpcBlockCreate) ProtoMessage() {} func (*RpcBlockCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 8} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 8} } func (m *RpcBlockCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -43392,7 +45021,7 @@ func (m *RpcBlockCreateRequest) Reset() { *m = RpcBlockCreateRequest{} } func (m *RpcBlockCreateRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockCreateRequest) ProtoMessage() {} func (*RpcBlockCreateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 8, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 8, 0} } func (m *RpcBlockCreateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -43459,7 +45088,7 @@ func (m *RpcBlockCreateResponse) Reset() { *m = RpcBlockCreateResponse{} func (m *RpcBlockCreateResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockCreateResponse) ProtoMessage() {} func (*RpcBlockCreateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 8, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 8, 1} } func (m *RpcBlockCreateResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -43518,7 +45147,7 @@ func (m *RpcBlockCreateResponseError) Reset() { *m = RpcBlockCreateRespo func (m *RpcBlockCreateResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockCreateResponseError) ProtoMessage() {} func (*RpcBlockCreateResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 8, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 8, 1, 0} } func (m *RpcBlockCreateResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -43568,7 +45197,7 @@ func (m *RpcBlockCreateWidget) Reset() { *m = RpcBlockCreateWidget{} } func (m *RpcBlockCreateWidget) String() string { return proto.CompactTextString(m) } func (*RpcBlockCreateWidget) ProtoMessage() {} func (*RpcBlockCreateWidget) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 9} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 9} } func (m *RpcBlockCreateWidget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -43611,7 +45240,7 @@ func (m *RpcBlockCreateWidgetRequest) Reset() { *m = RpcBlockCreateWidge func (m *RpcBlockCreateWidgetRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockCreateWidgetRequest) ProtoMessage() {} func (*RpcBlockCreateWidgetRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 9, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 9, 0} } func (m *RpcBlockCreateWidgetRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -43699,7 +45328,7 @@ func (m *RpcBlockCreateWidgetResponse) Reset() { *m = RpcBlockCreateWidg func (m *RpcBlockCreateWidgetResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockCreateWidgetResponse) ProtoMessage() {} func (*RpcBlockCreateWidgetResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 9, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 9, 1} } func (m *RpcBlockCreateWidgetResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -43758,7 +45387,7 @@ func (m *RpcBlockCreateWidgetResponseError) Reset() { *m = RpcBlockCreat func (m *RpcBlockCreateWidgetResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockCreateWidgetResponseError) ProtoMessage() {} func (*RpcBlockCreateWidgetResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 9, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 9, 1, 0} } func (m *RpcBlockCreateWidgetResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -43809,7 +45438,7 @@ func (m *RpcBlockListDelete) Reset() { *m = RpcBlockListDelete{} } func (m *RpcBlockListDelete) String() string { return proto.CompactTextString(m) } func (*RpcBlockListDelete) ProtoMessage() {} func (*RpcBlockListDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 10} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 10} } func (m *RpcBlockListDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -43847,7 +45476,7 @@ func (m *RpcBlockListDeleteRequest) Reset() { *m = RpcBlockListDeleteReq func (m *RpcBlockListDeleteRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockListDeleteRequest) ProtoMessage() {} func (*RpcBlockListDeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 10, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 10, 0} } func (m *RpcBlockListDeleteRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -43899,7 +45528,7 @@ func (m *RpcBlockListDeleteResponse) Reset() { *m = RpcBlockListDeleteRe func (m *RpcBlockListDeleteResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockListDeleteResponse) ProtoMessage() {} func (*RpcBlockListDeleteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 10, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 10, 1} } func (m *RpcBlockListDeleteResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -43951,7 +45580,7 @@ func (m *RpcBlockListDeleteResponseError) Reset() { *m = RpcBlockListDel func (m *RpcBlockListDeleteResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockListDeleteResponseError) ProtoMessage() {} func (*RpcBlockListDeleteResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 10, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 10, 1, 0} } func (m *RpcBlockListDeleteResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -44001,7 +45630,7 @@ func (m *RpcBlockSetFields) Reset() { *m = RpcBlockSetFields{} } func (m *RpcBlockSetFields) String() string { return proto.CompactTextString(m) } func (*RpcBlockSetFields) ProtoMessage() {} func (*RpcBlockSetFields) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 11} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 11} } func (m *RpcBlockSetFields) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -44040,7 +45669,7 @@ func (m *RpcBlockSetFieldsRequest) Reset() { *m = RpcBlockSetFieldsReque func (m *RpcBlockSetFieldsRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockSetFieldsRequest) ProtoMessage() {} func (*RpcBlockSetFieldsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 11, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 11, 0} } func (m *RpcBlockSetFieldsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -44099,7 +45728,7 @@ func (m *RpcBlockSetFieldsResponse) Reset() { *m = RpcBlockSetFieldsResp func (m *RpcBlockSetFieldsResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockSetFieldsResponse) ProtoMessage() {} func (*RpcBlockSetFieldsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 11, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 11, 1} } func (m *RpcBlockSetFieldsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -44151,7 +45780,7 @@ func (m *RpcBlockSetFieldsResponseError) Reset() { *m = RpcBlockSetField func (m *RpcBlockSetFieldsResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockSetFieldsResponseError) ProtoMessage() {} func (*RpcBlockSetFieldsResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 11, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 11, 1, 0} } func (m *RpcBlockSetFieldsResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -44201,7 +45830,7 @@ func (m *RpcBlockListSetAlign) Reset() { *m = RpcBlockListSetAlign{} } func (m *RpcBlockListSetAlign) String() string { return proto.CompactTextString(m) } func (*RpcBlockListSetAlign) ProtoMessage() {} func (*RpcBlockListSetAlign) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 12} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 12} } func (m *RpcBlockListSetAlign) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -44240,7 +45869,7 @@ func (m *RpcBlockListSetAlignRequest) Reset() { *m = RpcBlockListSetAlig func (m *RpcBlockListSetAlignRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockListSetAlignRequest) ProtoMessage() {} func (*RpcBlockListSetAlignRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 12, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 12, 0} } func (m *RpcBlockListSetAlignRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -44299,7 +45928,7 @@ func (m *RpcBlockListSetAlignResponse) Reset() { *m = RpcBlockListSetAli func (m *RpcBlockListSetAlignResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockListSetAlignResponse) ProtoMessage() {} func (*RpcBlockListSetAlignResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 12, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 12, 1} } func (m *RpcBlockListSetAlignResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -44351,7 +45980,7 @@ func (m *RpcBlockListSetAlignResponseError) Reset() { *m = RpcBlockListS func (m *RpcBlockListSetAlignResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockListSetAlignResponseError) ProtoMessage() {} func (*RpcBlockListSetAlignResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 12, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 12, 1, 0} } func (m *RpcBlockListSetAlignResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -44401,7 +46030,7 @@ func (m *RpcBlockListSetVerticalAlign) Reset() { *m = RpcBlockListSetVer func (m *RpcBlockListSetVerticalAlign) String() string { return proto.CompactTextString(m) } func (*RpcBlockListSetVerticalAlign) ProtoMessage() {} func (*RpcBlockListSetVerticalAlign) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 13} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 13} } func (m *RpcBlockListSetVerticalAlign) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -44440,7 +46069,7 @@ func (m *RpcBlockListSetVerticalAlignRequest) Reset() { *m = RpcBlockLis func (m *RpcBlockListSetVerticalAlignRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockListSetVerticalAlignRequest) ProtoMessage() {} func (*RpcBlockListSetVerticalAlignRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 13, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 13, 0} } func (m *RpcBlockListSetVerticalAlignRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -44499,7 +46128,7 @@ func (m *RpcBlockListSetVerticalAlignResponse) Reset() { *m = RpcBlockLi func (m *RpcBlockListSetVerticalAlignResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockListSetVerticalAlignResponse) ProtoMessage() {} func (*RpcBlockListSetVerticalAlignResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 13, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 13, 1} } func (m *RpcBlockListSetVerticalAlignResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -44555,7 +46184,7 @@ func (m *RpcBlockListSetVerticalAlignResponseError) String() string { } func (*RpcBlockListSetVerticalAlignResponseError) ProtoMessage() {} func (*RpcBlockListSetVerticalAlignResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 13, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 13, 1, 0} } func (m *RpcBlockListSetVerticalAlignResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -44605,7 +46234,7 @@ func (m *RpcBlockListSetFields) Reset() { *m = RpcBlockListSetFields{} } func (m *RpcBlockListSetFields) String() string { return proto.CompactTextString(m) } func (*RpcBlockListSetFields) ProtoMessage() {} func (*RpcBlockListSetFields) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 14} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 14} } func (m *RpcBlockListSetFields) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -44643,7 +46272,7 @@ func (m *RpcBlockListSetFieldsRequest) Reset() { *m = RpcBlockListSetFie func (m *RpcBlockListSetFieldsRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockListSetFieldsRequest) ProtoMessage() {} func (*RpcBlockListSetFieldsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 14, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 14, 0} } func (m *RpcBlockListSetFieldsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -44697,7 +46326,7 @@ func (m *RpcBlockListSetFieldsRequestBlockField) Reset() { func (m *RpcBlockListSetFieldsRequestBlockField) String() string { return proto.CompactTextString(m) } func (*RpcBlockListSetFieldsRequestBlockField) ProtoMessage() {} func (*RpcBlockListSetFieldsRequestBlockField) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 14, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 14, 0, 0} } func (m *RpcBlockListSetFieldsRequestBlockField) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -44749,7 +46378,7 @@ func (m *RpcBlockListSetFieldsResponse) Reset() { *m = RpcBlockListSetFi func (m *RpcBlockListSetFieldsResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockListSetFieldsResponse) ProtoMessage() {} func (*RpcBlockListSetFieldsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 14, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 14, 1} } func (m *RpcBlockListSetFieldsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -44801,7 +46430,7 @@ func (m *RpcBlockListSetFieldsResponseError) Reset() { *m = RpcBlockList func (m *RpcBlockListSetFieldsResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockListSetFieldsResponseError) ProtoMessage() {} func (*RpcBlockListSetFieldsResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 14, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 14, 1, 0} } func (m *RpcBlockListSetFieldsResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -44852,7 +46481,7 @@ func (m *RpcBlockListDuplicate) Reset() { *m = RpcBlockListDuplicate{} } func (m *RpcBlockListDuplicate) String() string { return proto.CompactTextString(m) } func (*RpcBlockListDuplicate) ProtoMessage() {} func (*RpcBlockListDuplicate) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 15} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 15} } func (m *RpcBlockListDuplicate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -44893,7 +46522,7 @@ func (m *RpcBlockListDuplicateRequest) Reset() { *m = RpcBlockListDuplic func (m *RpcBlockListDuplicateRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockListDuplicateRequest) ProtoMessage() {} func (*RpcBlockListDuplicateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 15, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 15, 0} } func (m *RpcBlockListDuplicateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -44967,7 +46596,7 @@ func (m *RpcBlockListDuplicateResponse) Reset() { *m = RpcBlockListDupli func (m *RpcBlockListDuplicateResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockListDuplicateResponse) ProtoMessage() {} func (*RpcBlockListDuplicateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 15, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 15, 1} } func (m *RpcBlockListDuplicateResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -45026,7 +46655,7 @@ func (m *RpcBlockListDuplicateResponseError) Reset() { *m = RpcBlockList func (m *RpcBlockListDuplicateResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockListDuplicateResponseError) ProtoMessage() {} func (*RpcBlockListDuplicateResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 15, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 15, 1, 0} } func (m *RpcBlockListDuplicateResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -45076,7 +46705,7 @@ func (m *RpcBlockListUpdate) Reset() { *m = RpcBlockListUpdate{} } func (m *RpcBlockListUpdate) String() string { return proto.CompactTextString(m) } func (*RpcBlockListUpdate) ProtoMessage() {} func (*RpcBlockListUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 16} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 16} } func (m *RpcBlockListUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -45123,7 +46752,7 @@ func (m *RpcBlockListUpdateRequest) Reset() { *m = RpcBlockListUpdateReq func (m *RpcBlockListUpdateRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockListUpdateRequest) ProtoMessage() {} func (*RpcBlockListUpdateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 16, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 16, 0} } func (m *RpcBlockListUpdateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -45272,7 +46901,7 @@ func (m *RpcBlockListUpdateRequestText) Reset() { *m = RpcBlockListUpdat func (m *RpcBlockListUpdateRequestText) String() string { return proto.CompactTextString(m) } func (*RpcBlockListUpdateRequestText) ProtoMessage() {} func (*RpcBlockListUpdateRequestText) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 16, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 16, 0, 0} } func (m *RpcBlockListUpdateRequestText) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -45365,7 +46994,7 @@ func (m *RpcBlockListConvertToObjects) Reset() { *m = RpcBlockListConver func (m *RpcBlockListConvertToObjects) String() string { return proto.CompactTextString(m) } func (*RpcBlockListConvertToObjects) ProtoMessage() {} func (*RpcBlockListConvertToObjects) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 17} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 17} } func (m *RpcBlockListConvertToObjects) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -45406,7 +47035,7 @@ func (m *RpcBlockListConvertToObjectsRequest) Reset() { *m = RpcBlockLis func (m *RpcBlockListConvertToObjectsRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockListConvertToObjectsRequest) ProtoMessage() {} func (*RpcBlockListConvertToObjectsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 17, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 17, 0} } func (m *RpcBlockListConvertToObjectsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -45480,7 +47109,7 @@ func (m *RpcBlockListConvertToObjectsResponse) Reset() { *m = RpcBlockLi func (m *RpcBlockListConvertToObjectsResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockListConvertToObjectsResponse) ProtoMessage() {} func (*RpcBlockListConvertToObjectsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 17, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 17, 1} } func (m *RpcBlockListConvertToObjectsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -45543,7 +47172,7 @@ func (m *RpcBlockListConvertToObjectsResponseError) String() string { } func (*RpcBlockListConvertToObjectsResponseError) ProtoMessage() {} func (*RpcBlockListConvertToObjectsResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 17, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 17, 1, 0} } func (m *RpcBlockListConvertToObjectsResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -45593,7 +47222,7 @@ func (m *RpcBlockListMoveToExistingObject) Reset() { *m = RpcBlockListMo func (m *RpcBlockListMoveToExistingObject) String() string { return proto.CompactTextString(m) } func (*RpcBlockListMoveToExistingObject) ProtoMessage() {} func (*RpcBlockListMoveToExistingObject) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 18} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 18} } func (m *RpcBlockListMoveToExistingObject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -45636,7 +47265,7 @@ func (m *RpcBlockListMoveToExistingObjectRequest) Reset() { func (m *RpcBlockListMoveToExistingObjectRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockListMoveToExistingObjectRequest) ProtoMessage() {} func (*RpcBlockListMoveToExistingObjectRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 18, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 18, 0} } func (m *RpcBlockListMoveToExistingObjectRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -45711,7 +47340,7 @@ func (m *RpcBlockListMoveToExistingObjectResponse) Reset() { func (m *RpcBlockListMoveToExistingObjectResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockListMoveToExistingObjectResponse) ProtoMessage() {} func (*RpcBlockListMoveToExistingObjectResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 18, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 18, 1} } func (m *RpcBlockListMoveToExistingObjectResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -45767,7 +47396,7 @@ func (m *RpcBlockListMoveToExistingObjectResponseError) String() string { } func (*RpcBlockListMoveToExistingObjectResponseError) ProtoMessage() {} func (*RpcBlockListMoveToExistingObjectResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 18, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 18, 1, 0} } func (m *RpcBlockListMoveToExistingObjectResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -45817,7 +47446,7 @@ func (m *RpcBlockListMoveToNewObject) Reset() { *m = RpcBlockListMoveToN func (m *RpcBlockListMoveToNewObject) String() string { return proto.CompactTextString(m) } func (*RpcBlockListMoveToNewObject) ProtoMessage() {} func (*RpcBlockListMoveToNewObject) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 19} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 19} } func (m *RpcBlockListMoveToNewObject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -45858,7 +47487,7 @@ func (m *RpcBlockListMoveToNewObjectRequest) Reset() { *m = RpcBlockList func (m *RpcBlockListMoveToNewObjectRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockListMoveToNewObjectRequest) ProtoMessage() {} func (*RpcBlockListMoveToNewObjectRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 19, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 19, 0} } func (m *RpcBlockListMoveToNewObjectRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -45932,7 +47561,7 @@ func (m *RpcBlockListMoveToNewObjectResponse) Reset() { *m = RpcBlockLis func (m *RpcBlockListMoveToNewObjectResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockListMoveToNewObjectResponse) ProtoMessage() {} func (*RpcBlockListMoveToNewObjectResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 19, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 19, 1} } func (m *RpcBlockListMoveToNewObjectResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -45993,7 +47622,7 @@ func (m *RpcBlockListMoveToNewObjectResponseError) Reset() { func (m *RpcBlockListMoveToNewObjectResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockListMoveToNewObjectResponseError) ProtoMessage() {} func (*RpcBlockListMoveToNewObjectResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 19, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 19, 1, 0} } func (m *RpcBlockListMoveToNewObjectResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -46043,7 +47672,7 @@ func (m *RpcBlockListTurnInto) Reset() { *m = RpcBlockListTurnInto{} } func (m *RpcBlockListTurnInto) String() string { return proto.CompactTextString(m) } func (*RpcBlockListTurnInto) ProtoMessage() {} func (*RpcBlockListTurnInto) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 20} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 20} } func (m *RpcBlockListTurnInto) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -46082,7 +47711,7 @@ func (m *RpcBlockListTurnIntoRequest) Reset() { *m = RpcBlockListTurnInt func (m *RpcBlockListTurnIntoRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockListTurnIntoRequest) ProtoMessage() {} func (*RpcBlockListTurnIntoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 20, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 20, 0} } func (m *RpcBlockListTurnIntoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -46141,7 +47770,7 @@ func (m *RpcBlockListTurnIntoResponse) Reset() { *m = RpcBlockListTurnIn func (m *RpcBlockListTurnIntoResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockListTurnIntoResponse) ProtoMessage() {} func (*RpcBlockListTurnIntoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 20, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 20, 1} } func (m *RpcBlockListTurnIntoResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -46193,7 +47822,7 @@ func (m *RpcBlockListTurnIntoResponseError) Reset() { *m = RpcBlockListT func (m *RpcBlockListTurnIntoResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockListTurnIntoResponseError) ProtoMessage() {} func (*RpcBlockListTurnIntoResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 20, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 20, 1, 0} } func (m *RpcBlockListTurnIntoResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -46243,7 +47872,7 @@ func (m *RpcBlockListSetBackgroundColor) Reset() { *m = RpcBlockListSetB func (m *RpcBlockListSetBackgroundColor) String() string { return proto.CompactTextString(m) } func (*RpcBlockListSetBackgroundColor) ProtoMessage() {} func (*RpcBlockListSetBackgroundColor) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 21} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 21} } func (m *RpcBlockListSetBackgroundColor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -46282,7 +47911,7 @@ func (m *RpcBlockListSetBackgroundColorRequest) Reset() { *m = RpcBlockL func (m *RpcBlockListSetBackgroundColorRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockListSetBackgroundColorRequest) ProtoMessage() {} func (*RpcBlockListSetBackgroundColorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 21, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 21, 0} } func (m *RpcBlockListSetBackgroundColorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -46343,7 +47972,7 @@ func (m *RpcBlockListSetBackgroundColorResponse) Reset() { func (m *RpcBlockListSetBackgroundColorResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockListSetBackgroundColorResponse) ProtoMessage() {} func (*RpcBlockListSetBackgroundColorResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 21, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 21, 1} } func (m *RpcBlockListSetBackgroundColorResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -46399,7 +48028,7 @@ func (m *RpcBlockListSetBackgroundColorResponseError) String() string { } func (*RpcBlockListSetBackgroundColorResponseError) ProtoMessage() {} func (*RpcBlockListSetBackgroundColorResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 21, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 21, 1, 0} } func (m *RpcBlockListSetBackgroundColorResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -46449,7 +48078,7 @@ func (m *RpcBlockExport) Reset() { *m = RpcBlockExport{} } func (m *RpcBlockExport) String() string { return proto.CompactTextString(m) } func (*RpcBlockExport) ProtoMessage() {} func (*RpcBlockExport) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 22} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 22} } func (m *RpcBlockExport) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -46487,7 +48116,7 @@ func (m *RpcBlockExportRequest) Reset() { *m = RpcBlockExportRequest{} } func (m *RpcBlockExportRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockExportRequest) ProtoMessage() {} func (*RpcBlockExportRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 22, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 22, 0} } func (m *RpcBlockExportRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -46540,7 +48169,7 @@ func (m *RpcBlockExportResponse) Reset() { *m = RpcBlockExportResponse{} func (m *RpcBlockExportResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockExportResponse) ProtoMessage() {} func (*RpcBlockExportResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 22, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 22, 1} } func (m *RpcBlockExportResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -46599,7 +48228,7 @@ func (m *RpcBlockExportResponseError) Reset() { *m = RpcBlockExportRespo func (m *RpcBlockExportResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockExportResponseError) ProtoMessage() {} func (*RpcBlockExportResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 22, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 22, 1, 0} } func (m *RpcBlockExportResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -46649,7 +48278,7 @@ func (m *RpcBlockSetCarriage) Reset() { *m = RpcBlockSetCarriage{} } func (m *RpcBlockSetCarriage) String() string { return proto.CompactTextString(m) } func (*RpcBlockSetCarriage) ProtoMessage() {} func (*RpcBlockSetCarriage) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 23} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 23} } func (m *RpcBlockSetCarriage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -46688,7 +48317,7 @@ func (m *RpcBlockSetCarriageRequest) Reset() { *m = RpcBlockSetCarriageR func (m *RpcBlockSetCarriageRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockSetCarriageRequest) ProtoMessage() {} func (*RpcBlockSetCarriageRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 23, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 23, 0} } func (m *RpcBlockSetCarriageRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -46746,7 +48375,7 @@ func (m *RpcBlockSetCarriageResponse) Reset() { *m = RpcBlockSetCarriage func (m *RpcBlockSetCarriageResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockSetCarriageResponse) ProtoMessage() {} func (*RpcBlockSetCarriageResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 23, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 23, 1} } func (m *RpcBlockSetCarriageResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -46791,7 +48420,7 @@ func (m *RpcBlockSetCarriageResponseError) Reset() { *m = RpcBlockSetCar func (m *RpcBlockSetCarriageResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockSetCarriageResponseError) ProtoMessage() {} func (*RpcBlockSetCarriageResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 23, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 23, 1, 0} } func (m *RpcBlockSetCarriageResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -46841,7 +48470,7 @@ func (m *RpcBlockPreview) Reset() { *m = RpcBlockPreview{} } func (m *RpcBlockPreview) String() string { return proto.CompactTextString(m) } func (*RpcBlockPreview) ProtoMessage() {} func (*RpcBlockPreview) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 24} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 24} } func (m *RpcBlockPreview) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -46879,7 +48508,7 @@ func (m *RpcBlockPreviewRequest) Reset() { *m = RpcBlockPreviewRequest{} func (m *RpcBlockPreviewRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockPreviewRequest) ProtoMessage() {} func (*RpcBlockPreviewRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 24, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 24, 0} } func (m *RpcBlockPreviewRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -46931,7 +48560,7 @@ func (m *RpcBlockPreviewResponse) Reset() { *m = RpcBlockPreviewResponse func (m *RpcBlockPreviewResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockPreviewResponse) ProtoMessage() {} func (*RpcBlockPreviewResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 24, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 24, 1} } func (m *RpcBlockPreviewResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -46983,7 +48612,7 @@ func (m *RpcBlockPreviewResponseError) Reset() { *m = RpcBlockPreviewRes func (m *RpcBlockPreviewResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockPreviewResponseError) ProtoMessage() {} func (*RpcBlockPreviewResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 18, 24, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 24, 1, 0} } func (m *RpcBlockPreviewResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -47033,7 +48662,7 @@ func (m *RpcBlockLatex) Reset() { *m = RpcBlockLatex{} } func (m *RpcBlockLatex) String() string { return proto.CompactTextString(m) } func (*RpcBlockLatex) ProtoMessage() {} func (*RpcBlockLatex) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 19} + return fileDescriptor_8261c968b2e6f45c, []int{0, 20} } func (m *RpcBlockLatex) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -47069,7 +48698,7 @@ func (m *RpcBlockLatexSetText) Reset() { *m = RpcBlockLatexSetText{} } func (m *RpcBlockLatexSetText) String() string { return proto.CompactTextString(m) } func (*RpcBlockLatexSetText) ProtoMessage() {} func (*RpcBlockLatexSetText) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 0} } func (m *RpcBlockLatexSetText) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -47109,7 +48738,7 @@ func (m *RpcBlockLatexSetTextRequest) Reset() { *m = RpcBlockLatexSetTex func (m *RpcBlockLatexSetTextRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockLatexSetTextRequest) ProtoMessage() {} func (*RpcBlockLatexSetTextRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 0, 0} } func (m *RpcBlockLatexSetTextRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -47175,7 +48804,7 @@ func (m *RpcBlockLatexSetTextResponse) Reset() { *m = RpcBlockLatexSetTe func (m *RpcBlockLatexSetTextResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockLatexSetTextResponse) ProtoMessage() {} func (*RpcBlockLatexSetTextResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 0, 1} } func (m *RpcBlockLatexSetTextResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -47227,7 +48856,7 @@ func (m *RpcBlockLatexSetTextResponseError) Reset() { *m = RpcBlockLatex func (m *RpcBlockLatexSetTextResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockLatexSetTextResponseError) ProtoMessage() {} func (*RpcBlockLatexSetTextResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 0, 1, 0} } func (m *RpcBlockLatexSetTextResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -47277,7 +48906,7 @@ func (m *RpcBlockLatexSetProcessor) Reset() { *m = RpcBlockLatexSetProce func (m *RpcBlockLatexSetProcessor) String() string { return proto.CompactTextString(m) } func (*RpcBlockLatexSetProcessor) ProtoMessage() {} func (*RpcBlockLatexSetProcessor) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 1} } func (m *RpcBlockLatexSetProcessor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -47316,7 +48945,7 @@ func (m *RpcBlockLatexSetProcessorRequest) Reset() { *m = RpcBlockLatexS func (m *RpcBlockLatexSetProcessorRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockLatexSetProcessorRequest) ProtoMessage() {} func (*RpcBlockLatexSetProcessorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 1, 0} } func (m *RpcBlockLatexSetProcessorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -47375,7 +49004,7 @@ func (m *RpcBlockLatexSetProcessorResponse) Reset() { *m = RpcBlockLatex func (m *RpcBlockLatexSetProcessorResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockLatexSetProcessorResponse) ProtoMessage() {} func (*RpcBlockLatexSetProcessorResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 1, 1} } func (m *RpcBlockLatexSetProcessorResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -47429,7 +49058,7 @@ func (m *RpcBlockLatexSetProcessorResponseError) Reset() { func (m *RpcBlockLatexSetProcessorResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockLatexSetProcessorResponseError) ProtoMessage() {} func (*RpcBlockLatexSetProcessorResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 19, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 1, 1, 0} } func (m *RpcBlockLatexSetProcessorResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -47479,7 +49108,7 @@ func (m *RpcBlockText) Reset() { *m = RpcBlockText{} } func (m *RpcBlockText) String() string { return proto.CompactTextString(m) } func (*RpcBlockText) ProtoMessage() {} func (*RpcBlockText) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21} } func (m *RpcBlockText) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -47515,7 +49144,7 @@ func (m *RpcBlockTextSetText) Reset() { *m = RpcBlockTextSetText{} } func (m *RpcBlockTextSetText) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetText) ProtoMessage() {} func (*RpcBlockTextSetText) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 0} } func (m *RpcBlockTextSetText) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -47556,7 +49185,7 @@ func (m *RpcBlockTextSetTextRequest) Reset() { *m = RpcBlockTextSetTextR func (m *RpcBlockTextSetTextRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetTextRequest) ProtoMessage() {} func (*RpcBlockTextSetTextRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 0, 0} } func (m *RpcBlockTextSetTextRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -47629,7 +49258,7 @@ func (m *RpcBlockTextSetTextResponse) Reset() { *m = RpcBlockTextSetText func (m *RpcBlockTextSetTextResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetTextResponse) ProtoMessage() {} func (*RpcBlockTextSetTextResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 0, 1} } func (m *RpcBlockTextSetTextResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -47681,7 +49310,7 @@ func (m *RpcBlockTextSetTextResponseError) Reset() { *m = RpcBlockTextSe func (m *RpcBlockTextSetTextResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetTextResponseError) ProtoMessage() {} func (*RpcBlockTextSetTextResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 0, 1, 0} } func (m *RpcBlockTextSetTextResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -47731,7 +49360,7 @@ func (m *RpcBlockTextSetColor) Reset() { *m = RpcBlockTextSetColor{} } func (m *RpcBlockTextSetColor) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetColor) ProtoMessage() {} func (*RpcBlockTextSetColor) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 1} } func (m *RpcBlockTextSetColor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -47770,7 +49399,7 @@ func (m *RpcBlockTextSetColorRequest) Reset() { *m = RpcBlockTextSetColo func (m *RpcBlockTextSetColorRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetColorRequest) ProtoMessage() {} func (*RpcBlockTextSetColorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 1, 0} } func (m *RpcBlockTextSetColorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -47829,7 +49458,7 @@ func (m *RpcBlockTextSetColorResponse) Reset() { *m = RpcBlockTextSetCol func (m *RpcBlockTextSetColorResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetColorResponse) ProtoMessage() {} func (*RpcBlockTextSetColorResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 1, 1} } func (m *RpcBlockTextSetColorResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -47881,7 +49510,7 @@ func (m *RpcBlockTextSetColorResponseError) Reset() { *m = RpcBlockTextS func (m *RpcBlockTextSetColorResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetColorResponseError) ProtoMessage() {} func (*RpcBlockTextSetColorResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 1, 1, 0} } func (m *RpcBlockTextSetColorResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -47931,7 +49560,7 @@ func (m *RpcBlockTextSetMarks) Reset() { *m = RpcBlockTextSetMarks{} } func (m *RpcBlockTextSetMarks) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetMarks) ProtoMessage() {} func (*RpcBlockTextSetMarks) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 2} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 2} } func (m *RpcBlockTextSetMarks) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -47968,7 +49597,7 @@ func (m *RpcBlockTextSetMarksGet) Reset() { *m = RpcBlockTextSetMarksGet func (m *RpcBlockTextSetMarksGet) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetMarksGet) ProtoMessage() {} func (*RpcBlockTextSetMarksGet) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 2, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 2, 0} } func (m *RpcBlockTextSetMarksGet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -48007,7 +49636,7 @@ func (m *RpcBlockTextSetMarksGetRequest) Reset() { *m = RpcBlockTextSetM func (m *RpcBlockTextSetMarksGetRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetMarksGetRequest) ProtoMessage() {} func (*RpcBlockTextSetMarksGetRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 2, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 2, 0, 0} } func (m *RpcBlockTextSetMarksGetRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -48066,7 +49695,7 @@ func (m *RpcBlockTextSetMarksGetResponse) Reset() { *m = RpcBlockTextSet func (m *RpcBlockTextSetMarksGetResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetMarksGetResponse) ProtoMessage() {} func (*RpcBlockTextSetMarksGetResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 2, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 2, 0, 1} } func (m *RpcBlockTextSetMarksGetResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -48118,7 +49747,7 @@ func (m *RpcBlockTextSetMarksGetResponseError) Reset() { *m = RpcBlockTe func (m *RpcBlockTextSetMarksGetResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetMarksGetResponseError) ProtoMessage() {} func (*RpcBlockTextSetMarksGetResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 2, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 2, 0, 1, 0} } func (m *RpcBlockTextSetMarksGetResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -48168,7 +49797,7 @@ func (m *RpcBlockTextSetStyle) Reset() { *m = RpcBlockTextSetStyle{} } func (m *RpcBlockTextSetStyle) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetStyle) ProtoMessage() {} func (*RpcBlockTextSetStyle) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 3} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 3} } func (m *RpcBlockTextSetStyle) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -48207,7 +49836,7 @@ func (m *RpcBlockTextSetStyleRequest) Reset() { *m = RpcBlockTextSetStyl func (m *RpcBlockTextSetStyleRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetStyleRequest) ProtoMessage() {} func (*RpcBlockTextSetStyleRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 3, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 3, 0} } func (m *RpcBlockTextSetStyleRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -48266,7 +49895,7 @@ func (m *RpcBlockTextSetStyleResponse) Reset() { *m = RpcBlockTextSetSty func (m *RpcBlockTextSetStyleResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetStyleResponse) ProtoMessage() {} func (*RpcBlockTextSetStyleResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 3, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 3, 1} } func (m *RpcBlockTextSetStyleResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -48318,7 +49947,7 @@ func (m *RpcBlockTextSetStyleResponseError) Reset() { *m = RpcBlockTextS func (m *RpcBlockTextSetStyleResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetStyleResponseError) ProtoMessage() {} func (*RpcBlockTextSetStyleResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 3, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 3, 1, 0} } func (m *RpcBlockTextSetStyleResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -48368,7 +49997,7 @@ func (m *RpcBlockTextSetChecked) Reset() { *m = RpcBlockTextSetChecked{} func (m *RpcBlockTextSetChecked) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetChecked) ProtoMessage() {} func (*RpcBlockTextSetChecked) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 4} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 4} } func (m *RpcBlockTextSetChecked) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -48407,7 +50036,7 @@ func (m *RpcBlockTextSetCheckedRequest) Reset() { *m = RpcBlockTextSetCh func (m *RpcBlockTextSetCheckedRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetCheckedRequest) ProtoMessage() {} func (*RpcBlockTextSetCheckedRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 4, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 4, 0} } func (m *RpcBlockTextSetCheckedRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -48466,7 +50095,7 @@ func (m *RpcBlockTextSetCheckedResponse) Reset() { *m = RpcBlockTextSetC func (m *RpcBlockTextSetCheckedResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetCheckedResponse) ProtoMessage() {} func (*RpcBlockTextSetCheckedResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 4, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 4, 1} } func (m *RpcBlockTextSetCheckedResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -48518,7 +50147,7 @@ func (m *RpcBlockTextSetCheckedResponseError) Reset() { *m = RpcBlockTex func (m *RpcBlockTextSetCheckedResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetCheckedResponseError) ProtoMessage() {} func (*RpcBlockTextSetCheckedResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 4, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 4, 1, 0} } func (m *RpcBlockTextSetCheckedResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -48568,7 +50197,7 @@ func (m *RpcBlockTextSetIcon) Reset() { *m = RpcBlockTextSetIcon{} } func (m *RpcBlockTextSetIcon) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetIcon) ProtoMessage() {} func (*RpcBlockTextSetIcon) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 5} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 5} } func (m *RpcBlockTextSetIcon) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -48608,7 +50237,7 @@ func (m *RpcBlockTextSetIconRequest) Reset() { *m = RpcBlockTextSetIconR func (m *RpcBlockTextSetIconRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetIconRequest) ProtoMessage() {} func (*RpcBlockTextSetIconRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 5, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 5, 0} } func (m *RpcBlockTextSetIconRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -48674,7 +50303,7 @@ func (m *RpcBlockTextSetIconResponse) Reset() { *m = RpcBlockTextSetIcon func (m *RpcBlockTextSetIconResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetIconResponse) ProtoMessage() {} func (*RpcBlockTextSetIconResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 5, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 5, 1} } func (m *RpcBlockTextSetIconResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -48726,7 +50355,7 @@ func (m *RpcBlockTextSetIconResponseError) Reset() { *m = RpcBlockTextSe func (m *RpcBlockTextSetIconResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextSetIconResponseError) ProtoMessage() {} func (*RpcBlockTextSetIconResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 5, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 5, 1, 0} } func (m *RpcBlockTextSetIconResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -48776,7 +50405,7 @@ func (m *RpcBlockTextListSetStyle) Reset() { *m = RpcBlockTextListSetSty func (m *RpcBlockTextListSetStyle) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextListSetStyle) ProtoMessage() {} func (*RpcBlockTextListSetStyle) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 6} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 6} } func (m *RpcBlockTextListSetStyle) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -48815,7 +50444,7 @@ func (m *RpcBlockTextListSetStyleRequest) Reset() { *m = RpcBlockTextLis func (m *RpcBlockTextListSetStyleRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextListSetStyleRequest) ProtoMessage() {} func (*RpcBlockTextListSetStyleRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 6, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 6, 0} } func (m *RpcBlockTextListSetStyleRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -48874,7 +50503,7 @@ func (m *RpcBlockTextListSetStyleResponse) Reset() { *m = RpcBlockTextLi func (m *RpcBlockTextListSetStyleResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextListSetStyleResponse) ProtoMessage() {} func (*RpcBlockTextListSetStyleResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 6, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 6, 1} } func (m *RpcBlockTextListSetStyleResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -48926,7 +50555,7 @@ func (m *RpcBlockTextListSetStyleResponseError) Reset() { *m = RpcBlockT func (m *RpcBlockTextListSetStyleResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextListSetStyleResponseError) ProtoMessage() {} func (*RpcBlockTextListSetStyleResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 6, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 6, 1, 0} } func (m *RpcBlockTextListSetStyleResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -48976,7 +50605,7 @@ func (m *RpcBlockTextListSetColor) Reset() { *m = RpcBlockTextListSetCol func (m *RpcBlockTextListSetColor) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextListSetColor) ProtoMessage() {} func (*RpcBlockTextListSetColor) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 7} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 7} } func (m *RpcBlockTextListSetColor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -49015,7 +50644,7 @@ func (m *RpcBlockTextListSetColorRequest) Reset() { *m = RpcBlockTextLis func (m *RpcBlockTextListSetColorRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextListSetColorRequest) ProtoMessage() {} func (*RpcBlockTextListSetColorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 7, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 7, 0} } func (m *RpcBlockTextListSetColorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -49074,7 +50703,7 @@ func (m *RpcBlockTextListSetColorResponse) Reset() { *m = RpcBlockTextLi func (m *RpcBlockTextListSetColorResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextListSetColorResponse) ProtoMessage() {} func (*RpcBlockTextListSetColorResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 7, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 7, 1} } func (m *RpcBlockTextListSetColorResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -49126,7 +50755,7 @@ func (m *RpcBlockTextListSetColorResponseError) Reset() { *m = RpcBlockT func (m *RpcBlockTextListSetColorResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextListSetColorResponseError) ProtoMessage() {} func (*RpcBlockTextListSetColorResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 7, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 7, 1, 0} } func (m *RpcBlockTextListSetColorResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -49176,7 +50805,7 @@ func (m *RpcBlockTextListSetMark) Reset() { *m = RpcBlockTextListSetMark func (m *RpcBlockTextListSetMark) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextListSetMark) ProtoMessage() {} func (*RpcBlockTextListSetMark) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 8} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 8} } func (m *RpcBlockTextListSetMark) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -49215,7 +50844,7 @@ func (m *RpcBlockTextListSetMarkRequest) Reset() { *m = RpcBlockTextList func (m *RpcBlockTextListSetMarkRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextListSetMarkRequest) ProtoMessage() {} func (*RpcBlockTextListSetMarkRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 8, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 8, 0} } func (m *RpcBlockTextListSetMarkRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -49274,7 +50903,7 @@ func (m *RpcBlockTextListSetMarkResponse) Reset() { *m = RpcBlockTextLis func (m *RpcBlockTextListSetMarkResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextListSetMarkResponse) ProtoMessage() {} func (*RpcBlockTextListSetMarkResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 8, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 8, 1} } func (m *RpcBlockTextListSetMarkResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -49326,7 +50955,7 @@ func (m *RpcBlockTextListSetMarkResponseError) Reset() { *m = RpcBlockTe func (m *RpcBlockTextListSetMarkResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextListSetMarkResponseError) ProtoMessage() {} func (*RpcBlockTextListSetMarkResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 8, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 8, 1, 0} } func (m *RpcBlockTextListSetMarkResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -49376,7 +51005,7 @@ func (m *RpcBlockTextListClearStyle) Reset() { *m = RpcBlockTextListClea func (m *RpcBlockTextListClearStyle) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextListClearStyle) ProtoMessage() {} func (*RpcBlockTextListClearStyle) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 9} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 9} } func (m *RpcBlockTextListClearStyle) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -49414,7 +51043,7 @@ func (m *RpcBlockTextListClearStyleRequest) Reset() { *m = RpcBlockTextL func (m *RpcBlockTextListClearStyleRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextListClearStyleRequest) ProtoMessage() {} func (*RpcBlockTextListClearStyleRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 9, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 9, 0} } func (m *RpcBlockTextListClearStyleRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -49466,7 +51095,7 @@ func (m *RpcBlockTextListClearStyleResponse) Reset() { *m = RpcBlockText func (m *RpcBlockTextListClearStyleResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextListClearStyleResponse) ProtoMessage() {} func (*RpcBlockTextListClearStyleResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 9, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 9, 1} } func (m *RpcBlockTextListClearStyleResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -49520,7 +51149,7 @@ func (m *RpcBlockTextListClearStyleResponseError) Reset() { func (m *RpcBlockTextListClearStyleResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextListClearStyleResponseError) ProtoMessage() {} func (*RpcBlockTextListClearStyleResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 9, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 9, 1, 0} } func (m *RpcBlockTextListClearStyleResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -49570,7 +51199,7 @@ func (m *RpcBlockTextListClearContent) Reset() { *m = RpcBlockTextListCl func (m *RpcBlockTextListClearContent) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextListClearContent) ProtoMessage() {} func (*RpcBlockTextListClearContent) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 10} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 10} } func (m *RpcBlockTextListClearContent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -49608,7 +51237,7 @@ func (m *RpcBlockTextListClearContentRequest) Reset() { *m = RpcBlockTex func (m *RpcBlockTextListClearContentRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextListClearContentRequest) ProtoMessage() {} func (*RpcBlockTextListClearContentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 10, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 10, 0} } func (m *RpcBlockTextListClearContentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -49660,7 +51289,7 @@ func (m *RpcBlockTextListClearContentResponse) Reset() { *m = RpcBlockTe func (m *RpcBlockTextListClearContentResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTextListClearContentResponse) ProtoMessage() {} func (*RpcBlockTextListClearContentResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 10, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 10, 1} } func (m *RpcBlockTextListClearContentResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -49716,7 +51345,7 @@ func (m *RpcBlockTextListClearContentResponseError) String() string { } func (*RpcBlockTextListClearContentResponseError) ProtoMessage() {} func (*RpcBlockTextListClearContentResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 20, 10, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 10, 1, 0} } func (m *RpcBlockTextListClearContentResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -49766,7 +51395,7 @@ func (m *RpcBlockTable) Reset() { *m = RpcBlockTable{} } func (m *RpcBlockTable) String() string { return proto.CompactTextString(m) } func (*RpcBlockTable) ProtoMessage() {} func (*RpcBlockTable) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22} } func (m *RpcBlockTable) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -49802,7 +51431,7 @@ func (m *RpcBlockTableCreate) Reset() { *m = RpcBlockTableCreate{} } func (m *RpcBlockTableCreate) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableCreate) ProtoMessage() {} func (*RpcBlockTableCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 0} } func (m *RpcBlockTableCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -49844,7 +51473,7 @@ func (m *RpcBlockTableCreateRequest) Reset() { *m = RpcBlockTableCreateR func (m *RpcBlockTableCreateRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableCreateRequest) ProtoMessage() {} func (*RpcBlockTableCreateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 0, 0} } func (m *RpcBlockTableCreateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -49925,7 +51554,7 @@ func (m *RpcBlockTableCreateResponse) Reset() { *m = RpcBlockTableCreate func (m *RpcBlockTableCreateResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableCreateResponse) ProtoMessage() {} func (*RpcBlockTableCreateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 0, 1} } func (m *RpcBlockTableCreateResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -49984,7 +51613,7 @@ func (m *RpcBlockTableCreateResponseError) Reset() { *m = RpcBlockTableC func (m *RpcBlockTableCreateResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableCreateResponseError) ProtoMessage() {} func (*RpcBlockTableCreateResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 0, 1, 0} } func (m *RpcBlockTableCreateResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -50034,7 +51663,7 @@ func (m *RpcBlockTableRowCreate) Reset() { *m = RpcBlockTableRowCreate{} func (m *RpcBlockTableRowCreate) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowCreate) ProtoMessage() {} func (*RpcBlockTableRowCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 1} } func (m *RpcBlockTableRowCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -50073,7 +51702,7 @@ func (m *RpcBlockTableRowCreateRequest) Reset() { *m = RpcBlockTableRowC func (m *RpcBlockTableRowCreateRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowCreateRequest) ProtoMessage() {} func (*RpcBlockTableRowCreateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 1, 0} } func (m *RpcBlockTableRowCreateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -50132,7 +51761,7 @@ func (m *RpcBlockTableRowCreateResponse) Reset() { *m = RpcBlockTableRow func (m *RpcBlockTableRowCreateResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowCreateResponse) ProtoMessage() {} func (*RpcBlockTableRowCreateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 1, 1} } func (m *RpcBlockTableRowCreateResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -50184,7 +51813,7 @@ func (m *RpcBlockTableRowCreateResponseError) Reset() { *m = RpcBlockTab func (m *RpcBlockTableRowCreateResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowCreateResponseError) ProtoMessage() {} func (*RpcBlockTableRowCreateResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 1, 1, 0} } func (m *RpcBlockTableRowCreateResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -50234,7 +51863,7 @@ func (m *RpcBlockTableRowSetHeader) Reset() { *m = RpcBlockTableRowSetHe func (m *RpcBlockTableRowSetHeader) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowSetHeader) ProtoMessage() {} func (*RpcBlockTableRowSetHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 2} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 2} } func (m *RpcBlockTableRowSetHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -50273,7 +51902,7 @@ func (m *RpcBlockTableRowSetHeaderRequest) Reset() { *m = RpcBlockTableR func (m *RpcBlockTableRowSetHeaderRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowSetHeaderRequest) ProtoMessage() {} func (*RpcBlockTableRowSetHeaderRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 2, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 2, 0} } func (m *RpcBlockTableRowSetHeaderRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -50332,7 +51961,7 @@ func (m *RpcBlockTableRowSetHeaderResponse) Reset() { *m = RpcBlockTable func (m *RpcBlockTableRowSetHeaderResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowSetHeaderResponse) ProtoMessage() {} func (*RpcBlockTableRowSetHeaderResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 2, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 2, 1} } func (m *RpcBlockTableRowSetHeaderResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -50386,7 +52015,7 @@ func (m *RpcBlockTableRowSetHeaderResponseError) Reset() { func (m *RpcBlockTableRowSetHeaderResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowSetHeaderResponseError) ProtoMessage() {} func (*RpcBlockTableRowSetHeaderResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 2, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 2, 1, 0} } func (m *RpcBlockTableRowSetHeaderResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -50436,7 +52065,7 @@ func (m *RpcBlockTableRowListFill) Reset() { *m = RpcBlockTableRowListFi func (m *RpcBlockTableRowListFill) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowListFill) ProtoMessage() {} func (*RpcBlockTableRowListFill) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 3} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 3} } func (m *RpcBlockTableRowListFill) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -50474,7 +52103,7 @@ func (m *RpcBlockTableRowListFillRequest) Reset() { *m = RpcBlockTableRo func (m *RpcBlockTableRowListFillRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowListFillRequest) ProtoMessage() {} func (*RpcBlockTableRowListFillRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 3, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 3, 0} } func (m *RpcBlockTableRowListFillRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -50526,7 +52155,7 @@ func (m *RpcBlockTableRowListFillResponse) Reset() { *m = RpcBlockTableR func (m *RpcBlockTableRowListFillResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowListFillResponse) ProtoMessage() {} func (*RpcBlockTableRowListFillResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 3, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 3, 1} } func (m *RpcBlockTableRowListFillResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -50578,7 +52207,7 @@ func (m *RpcBlockTableRowListFillResponseError) Reset() { *m = RpcBlockT func (m *RpcBlockTableRowListFillResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowListFillResponseError) ProtoMessage() {} func (*RpcBlockTableRowListFillResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 3, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 3, 1, 0} } func (m *RpcBlockTableRowListFillResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -50628,7 +52257,7 @@ func (m *RpcBlockTableRowListClean) Reset() { *m = RpcBlockTableRowListC func (m *RpcBlockTableRowListClean) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowListClean) ProtoMessage() {} func (*RpcBlockTableRowListClean) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 4} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 4} } func (m *RpcBlockTableRowListClean) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -50666,7 +52295,7 @@ func (m *RpcBlockTableRowListCleanRequest) Reset() { *m = RpcBlockTableR func (m *RpcBlockTableRowListCleanRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowListCleanRequest) ProtoMessage() {} func (*RpcBlockTableRowListCleanRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 4, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 4, 0} } func (m *RpcBlockTableRowListCleanRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -50718,7 +52347,7 @@ func (m *RpcBlockTableRowListCleanResponse) Reset() { *m = RpcBlockTable func (m *RpcBlockTableRowListCleanResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowListCleanResponse) ProtoMessage() {} func (*RpcBlockTableRowListCleanResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 4, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 4, 1} } func (m *RpcBlockTableRowListCleanResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -50772,7 +52401,7 @@ func (m *RpcBlockTableRowListCleanResponseError) Reset() { func (m *RpcBlockTableRowListCleanResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowListCleanResponseError) ProtoMessage() {} func (*RpcBlockTableRowListCleanResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 4, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 4, 1, 0} } func (m *RpcBlockTableRowListCleanResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -50822,7 +52451,7 @@ func (m *RpcBlockTableColumnListFill) Reset() { *m = RpcBlockTableColumn func (m *RpcBlockTableColumnListFill) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableColumnListFill) ProtoMessage() {} func (*RpcBlockTableColumnListFill) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 5} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 5} } func (m *RpcBlockTableColumnListFill) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -50860,7 +52489,7 @@ func (m *RpcBlockTableColumnListFillRequest) Reset() { *m = RpcBlockTabl func (m *RpcBlockTableColumnListFillRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableColumnListFillRequest) ProtoMessage() {} func (*RpcBlockTableColumnListFillRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 5, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 5, 0} } func (m *RpcBlockTableColumnListFillRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -50912,7 +52541,7 @@ func (m *RpcBlockTableColumnListFillResponse) Reset() { *m = RpcBlockTab func (m *RpcBlockTableColumnListFillResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableColumnListFillResponse) ProtoMessage() {} func (*RpcBlockTableColumnListFillResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 5, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 5, 1} } func (m *RpcBlockTableColumnListFillResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -50966,7 +52595,7 @@ func (m *RpcBlockTableColumnListFillResponseError) Reset() { func (m *RpcBlockTableColumnListFillResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableColumnListFillResponseError) ProtoMessage() {} func (*RpcBlockTableColumnListFillResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 5, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 5, 1, 0} } func (m *RpcBlockTableColumnListFillResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -51016,7 +52645,7 @@ func (m *RpcBlockTableColumnCreate) Reset() { *m = RpcBlockTableColumnCr func (m *RpcBlockTableColumnCreate) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableColumnCreate) ProtoMessage() {} func (*RpcBlockTableColumnCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 6} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 6} } func (m *RpcBlockTableColumnCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -51055,7 +52684,7 @@ func (m *RpcBlockTableColumnCreateRequest) Reset() { *m = RpcBlockTableC func (m *RpcBlockTableColumnCreateRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableColumnCreateRequest) ProtoMessage() {} func (*RpcBlockTableColumnCreateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 6, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 6, 0} } func (m *RpcBlockTableColumnCreateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -51114,7 +52743,7 @@ func (m *RpcBlockTableColumnCreateResponse) Reset() { *m = RpcBlockTable func (m *RpcBlockTableColumnCreateResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableColumnCreateResponse) ProtoMessage() {} func (*RpcBlockTableColumnCreateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 6, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 6, 1} } func (m *RpcBlockTableColumnCreateResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -51168,7 +52797,7 @@ func (m *RpcBlockTableColumnCreateResponseError) Reset() { func (m *RpcBlockTableColumnCreateResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableColumnCreateResponseError) ProtoMessage() {} func (*RpcBlockTableColumnCreateResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 6, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 6, 1, 0} } func (m *RpcBlockTableColumnCreateResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -51218,7 +52847,7 @@ func (m *RpcBlockTableRowDelete) Reset() { *m = RpcBlockTableRowDelete{} func (m *RpcBlockTableRowDelete) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowDelete) ProtoMessage() {} func (*RpcBlockTableRowDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 7} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 7} } func (m *RpcBlockTableRowDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -51256,7 +52885,7 @@ func (m *RpcBlockTableRowDeleteRequest) Reset() { *m = RpcBlockTableRowD func (m *RpcBlockTableRowDeleteRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowDeleteRequest) ProtoMessage() {} func (*RpcBlockTableRowDeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 7, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 7, 0} } func (m *RpcBlockTableRowDeleteRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -51308,7 +52937,7 @@ func (m *RpcBlockTableRowDeleteResponse) Reset() { *m = RpcBlockTableRow func (m *RpcBlockTableRowDeleteResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowDeleteResponse) ProtoMessage() {} func (*RpcBlockTableRowDeleteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 7, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 7, 1} } func (m *RpcBlockTableRowDeleteResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -51360,7 +52989,7 @@ func (m *RpcBlockTableRowDeleteResponseError) Reset() { *m = RpcBlockTab func (m *RpcBlockTableRowDeleteResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowDeleteResponseError) ProtoMessage() {} func (*RpcBlockTableRowDeleteResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 7, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 7, 1, 0} } func (m *RpcBlockTableRowDeleteResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -51410,7 +53039,7 @@ func (m *RpcBlockTableColumnDelete) Reset() { *m = RpcBlockTableColumnDe func (m *RpcBlockTableColumnDelete) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableColumnDelete) ProtoMessage() {} func (*RpcBlockTableColumnDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 8} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 8} } func (m *RpcBlockTableColumnDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -51448,7 +53077,7 @@ func (m *RpcBlockTableColumnDeleteRequest) Reset() { *m = RpcBlockTableC func (m *RpcBlockTableColumnDeleteRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableColumnDeleteRequest) ProtoMessage() {} func (*RpcBlockTableColumnDeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 8, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 8, 0} } func (m *RpcBlockTableColumnDeleteRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -51500,7 +53129,7 @@ func (m *RpcBlockTableColumnDeleteResponse) Reset() { *m = RpcBlockTable func (m *RpcBlockTableColumnDeleteResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableColumnDeleteResponse) ProtoMessage() {} func (*RpcBlockTableColumnDeleteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 8, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 8, 1} } func (m *RpcBlockTableColumnDeleteResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -51554,7 +53183,7 @@ func (m *RpcBlockTableColumnDeleteResponseError) Reset() { func (m *RpcBlockTableColumnDeleteResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableColumnDeleteResponseError) ProtoMessage() {} func (*RpcBlockTableColumnDeleteResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 8, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 8, 1, 0} } func (m *RpcBlockTableColumnDeleteResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -51604,7 +53233,7 @@ func (m *RpcBlockTableColumnMove) Reset() { *m = RpcBlockTableColumnMove func (m *RpcBlockTableColumnMove) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableColumnMove) ProtoMessage() {} func (*RpcBlockTableColumnMove) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 9} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 9} } func (m *RpcBlockTableColumnMove) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -51644,7 +53273,7 @@ func (m *RpcBlockTableColumnMoveRequest) Reset() { *m = RpcBlockTableCol func (m *RpcBlockTableColumnMoveRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableColumnMoveRequest) ProtoMessage() {} func (*RpcBlockTableColumnMoveRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 9, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 9, 0} } func (m *RpcBlockTableColumnMoveRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -51710,7 +53339,7 @@ func (m *RpcBlockTableColumnMoveResponse) Reset() { *m = RpcBlockTableCo func (m *RpcBlockTableColumnMoveResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableColumnMoveResponse) ProtoMessage() {} func (*RpcBlockTableColumnMoveResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 9, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 9, 1} } func (m *RpcBlockTableColumnMoveResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -51762,7 +53391,7 @@ func (m *RpcBlockTableColumnMoveResponseError) Reset() { *m = RpcBlockTa func (m *RpcBlockTableColumnMoveResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableColumnMoveResponseError) ProtoMessage() {} func (*RpcBlockTableColumnMoveResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 9, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 9, 1, 0} } func (m *RpcBlockTableColumnMoveResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -51812,7 +53441,7 @@ func (m *RpcBlockTableRowDuplicate) Reset() { *m = RpcBlockTableRowDupli func (m *RpcBlockTableRowDuplicate) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowDuplicate) ProtoMessage() {} func (*RpcBlockTableRowDuplicate) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 10} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 10} } func (m *RpcBlockTableRowDuplicate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -51852,7 +53481,7 @@ func (m *RpcBlockTableRowDuplicateRequest) Reset() { *m = RpcBlockTableR func (m *RpcBlockTableRowDuplicateRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowDuplicateRequest) ProtoMessage() {} func (*RpcBlockTableRowDuplicateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 10, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 10, 0} } func (m *RpcBlockTableRowDuplicateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -51918,7 +53547,7 @@ func (m *RpcBlockTableRowDuplicateResponse) Reset() { *m = RpcBlockTable func (m *RpcBlockTableRowDuplicateResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowDuplicateResponse) ProtoMessage() {} func (*RpcBlockTableRowDuplicateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 10, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 10, 1} } func (m *RpcBlockTableRowDuplicateResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -51972,7 +53601,7 @@ func (m *RpcBlockTableRowDuplicateResponseError) Reset() { func (m *RpcBlockTableRowDuplicateResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableRowDuplicateResponseError) ProtoMessage() {} func (*RpcBlockTableRowDuplicateResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 10, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 10, 1, 0} } func (m *RpcBlockTableRowDuplicateResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -52022,7 +53651,7 @@ func (m *RpcBlockTableColumnDuplicate) Reset() { *m = RpcBlockTableColum func (m *RpcBlockTableColumnDuplicate) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableColumnDuplicate) ProtoMessage() {} func (*RpcBlockTableColumnDuplicate) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 11} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 11} } func (m *RpcBlockTableColumnDuplicate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -52062,7 +53691,7 @@ func (m *RpcBlockTableColumnDuplicateRequest) Reset() { *m = RpcBlockTab func (m *RpcBlockTableColumnDuplicateRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableColumnDuplicateRequest) ProtoMessage() {} func (*RpcBlockTableColumnDuplicateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 11, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 11, 0} } func (m *RpcBlockTableColumnDuplicateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -52129,7 +53758,7 @@ func (m *RpcBlockTableColumnDuplicateResponse) Reset() { *m = RpcBlockTa func (m *RpcBlockTableColumnDuplicateResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableColumnDuplicateResponse) ProtoMessage() {} func (*RpcBlockTableColumnDuplicateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 11, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 11, 1} } func (m *RpcBlockTableColumnDuplicateResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -52192,7 +53821,7 @@ func (m *RpcBlockTableColumnDuplicateResponseError) String() string { } func (*RpcBlockTableColumnDuplicateResponseError) ProtoMessage() {} func (*RpcBlockTableColumnDuplicateResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 11, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 11, 1, 0} } func (m *RpcBlockTableColumnDuplicateResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -52242,7 +53871,7 @@ func (m *RpcBlockTableExpand) Reset() { *m = RpcBlockTableExpand{} } func (m *RpcBlockTableExpand) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableExpand) ProtoMessage() {} func (*RpcBlockTableExpand) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 12} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 12} } func (m *RpcBlockTableExpand) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -52282,7 +53911,7 @@ func (m *RpcBlockTableExpandRequest) Reset() { *m = RpcBlockTableExpandR func (m *RpcBlockTableExpandRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableExpandRequest) ProtoMessage() {} func (*RpcBlockTableExpandRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 12, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 12, 0} } func (m *RpcBlockTableExpandRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -52348,7 +53977,7 @@ func (m *RpcBlockTableExpandResponse) Reset() { *m = RpcBlockTableExpand func (m *RpcBlockTableExpandResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableExpandResponse) ProtoMessage() {} func (*RpcBlockTableExpandResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 12, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 12, 1} } func (m *RpcBlockTableExpandResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -52400,7 +54029,7 @@ func (m *RpcBlockTableExpandResponseError) Reset() { *m = RpcBlockTableE func (m *RpcBlockTableExpandResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableExpandResponseError) ProtoMessage() {} func (*RpcBlockTableExpandResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 12, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 12, 1, 0} } func (m *RpcBlockTableExpandResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -52450,7 +54079,7 @@ func (m *RpcBlockTableSort) Reset() { *m = RpcBlockTableSort{} } func (m *RpcBlockTableSort) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableSort) ProtoMessage() {} func (*RpcBlockTableSort) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 13} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 13} } func (m *RpcBlockTableSort) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -52489,7 +54118,7 @@ func (m *RpcBlockTableSortRequest) Reset() { *m = RpcBlockTableSortReque func (m *RpcBlockTableSortRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableSortRequest) ProtoMessage() {} func (*RpcBlockTableSortRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 13, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 13, 0} } func (m *RpcBlockTableSortRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -52548,7 +54177,7 @@ func (m *RpcBlockTableSortResponse) Reset() { *m = RpcBlockTableSortResp func (m *RpcBlockTableSortResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableSortResponse) ProtoMessage() {} func (*RpcBlockTableSortResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 13, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 13, 1} } func (m *RpcBlockTableSortResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -52600,7 +54229,7 @@ func (m *RpcBlockTableSortResponseError) Reset() { *m = RpcBlockTableSor func (m *RpcBlockTableSortResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockTableSortResponseError) ProtoMessage() {} func (*RpcBlockTableSortResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 21, 13, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 13, 1, 0} } func (m *RpcBlockTableSortResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -52650,7 +54279,7 @@ func (m *RpcBlockFile) Reset() { *m = RpcBlockFile{} } func (m *RpcBlockFile) String() string { return proto.CompactTextString(m) } func (*RpcBlockFile) ProtoMessage() {} func (*RpcBlockFile) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 22} + return fileDescriptor_8261c968b2e6f45c, []int{0, 23} } func (m *RpcBlockFile) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -52686,7 +54315,7 @@ func (m *RpcBlockFileSetName) Reset() { *m = RpcBlockFileSetName{} } func (m *RpcBlockFileSetName) String() string { return proto.CompactTextString(m) } func (*RpcBlockFileSetName) ProtoMessage() {} func (*RpcBlockFileSetName) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 0} } func (m *RpcBlockFileSetName) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -52725,7 +54354,7 @@ func (m *RpcBlockFileSetNameRequest) Reset() { *m = RpcBlockFileSetNameR func (m *RpcBlockFileSetNameRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockFileSetNameRequest) ProtoMessage() {} func (*RpcBlockFileSetNameRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 0, 0} } func (m *RpcBlockFileSetNameRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -52784,7 +54413,7 @@ func (m *RpcBlockFileSetNameResponse) Reset() { *m = RpcBlockFileSetName func (m *RpcBlockFileSetNameResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockFileSetNameResponse) ProtoMessage() {} func (*RpcBlockFileSetNameResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 0, 1} } func (m *RpcBlockFileSetNameResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -52836,7 +54465,7 @@ func (m *RpcBlockFileSetNameResponseError) Reset() { *m = RpcBlockFileSe func (m *RpcBlockFileSetNameResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockFileSetNameResponseError) ProtoMessage() {} func (*RpcBlockFileSetNameResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 0, 1, 0} } func (m *RpcBlockFileSetNameResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -52886,7 +54515,7 @@ func (m *RpcBlockFileSetTargetObjectId) Reset() { *m = RpcBlockFileSetTa func (m *RpcBlockFileSetTargetObjectId) String() string { return proto.CompactTextString(m) } func (*RpcBlockFileSetTargetObjectId) ProtoMessage() {} func (*RpcBlockFileSetTargetObjectId) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 1} } func (m *RpcBlockFileSetTargetObjectId) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -52925,7 +54554,7 @@ func (m *RpcBlockFileSetTargetObjectIdRequest) Reset() { *m = RpcBlockFi func (m *RpcBlockFileSetTargetObjectIdRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockFileSetTargetObjectIdRequest) ProtoMessage() {} func (*RpcBlockFileSetTargetObjectIdRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 1, 0} } func (m *RpcBlockFileSetTargetObjectIdRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -52984,7 +54613,7 @@ func (m *RpcBlockFileSetTargetObjectIdResponse) Reset() { *m = RpcBlockF func (m *RpcBlockFileSetTargetObjectIdResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockFileSetTargetObjectIdResponse) ProtoMessage() {} func (*RpcBlockFileSetTargetObjectIdResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 1, 1} } func (m *RpcBlockFileSetTargetObjectIdResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -53040,7 +54669,7 @@ func (m *RpcBlockFileSetTargetObjectIdResponseError) String() string { } func (*RpcBlockFileSetTargetObjectIdResponseError) ProtoMessage() {} func (*RpcBlockFileSetTargetObjectIdResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 1, 1, 0} } func (m *RpcBlockFileSetTargetObjectIdResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -53090,7 +54719,7 @@ func (m *RpcBlockFileCreateAndUpload) Reset() { *m = RpcBlockFileCreateA func (m *RpcBlockFileCreateAndUpload) String() string { return proto.CompactTextString(m) } func (*RpcBlockFileCreateAndUpload) ProtoMessage() {} func (*RpcBlockFileCreateAndUpload) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 2} + return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 2} } func (m *RpcBlockFileCreateAndUpload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -53133,7 +54762,7 @@ func (m *RpcBlockFileCreateAndUploadRequest) Reset() { *m = RpcBlockFile func (m *RpcBlockFileCreateAndUploadRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockFileCreateAndUploadRequest) ProtoMessage() {} func (*RpcBlockFileCreateAndUploadRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 2, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 2, 0} } func (m *RpcBlockFileCreateAndUploadRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -53221,7 +54850,7 @@ func (m *RpcBlockFileCreateAndUploadResponse) Reset() { *m = RpcBlockFil func (m *RpcBlockFileCreateAndUploadResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockFileCreateAndUploadResponse) ProtoMessage() {} func (*RpcBlockFileCreateAndUploadResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 2, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 2, 1} } func (m *RpcBlockFileCreateAndUploadResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -53282,7 +54911,7 @@ func (m *RpcBlockFileCreateAndUploadResponseError) Reset() { func (m *RpcBlockFileCreateAndUploadResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockFileCreateAndUploadResponseError) ProtoMessage() {} func (*RpcBlockFileCreateAndUploadResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 2, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 2, 1, 0} } func (m *RpcBlockFileCreateAndUploadResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -53332,7 +54961,7 @@ func (m *RpcBlockFileListSetStyle) Reset() { *m = RpcBlockFileListSetSty func (m *RpcBlockFileListSetStyle) String() string { return proto.CompactTextString(m) } func (*RpcBlockFileListSetStyle) ProtoMessage() {} func (*RpcBlockFileListSetStyle) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 3} + return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 3} } func (m *RpcBlockFileListSetStyle) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -53371,7 +55000,7 @@ func (m *RpcBlockFileListSetStyleRequest) Reset() { *m = RpcBlockFileLis func (m *RpcBlockFileListSetStyleRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockFileListSetStyleRequest) ProtoMessage() {} func (*RpcBlockFileListSetStyleRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 3, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 3, 0} } func (m *RpcBlockFileListSetStyleRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -53430,7 +55059,7 @@ func (m *RpcBlockFileListSetStyleResponse) Reset() { *m = RpcBlockFileLi func (m *RpcBlockFileListSetStyleResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockFileListSetStyleResponse) ProtoMessage() {} func (*RpcBlockFileListSetStyleResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 3, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 3, 1} } func (m *RpcBlockFileListSetStyleResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -53482,7 +55111,7 @@ func (m *RpcBlockFileListSetStyleResponseError) Reset() { *m = RpcBlockF func (m *RpcBlockFileListSetStyleResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockFileListSetStyleResponseError) ProtoMessage() {} func (*RpcBlockFileListSetStyleResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 22, 3, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 3, 1, 0} } func (m *RpcBlockFileListSetStyleResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -53532,7 +55161,7 @@ func (m *RpcBlockImage) Reset() { *m = RpcBlockImage{} } func (m *RpcBlockImage) String() string { return proto.CompactTextString(m) } func (*RpcBlockImage) ProtoMessage() {} func (*RpcBlockImage) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 23} + return fileDescriptor_8261c968b2e6f45c, []int{0, 24} } func (m *RpcBlockImage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -53568,7 +55197,7 @@ func (m *RpcBlockImageSetName) Reset() { *m = RpcBlockImageSetName{} } func (m *RpcBlockImageSetName) String() string { return proto.CompactTextString(m) } func (*RpcBlockImageSetName) ProtoMessage() {} func (*RpcBlockImageSetName) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 24, 0} } func (m *RpcBlockImageSetName) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -53607,7 +55236,7 @@ func (m *RpcBlockImageSetNameRequest) Reset() { *m = RpcBlockImageSetNam func (m *RpcBlockImageSetNameRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockImageSetNameRequest) ProtoMessage() {} func (*RpcBlockImageSetNameRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 24, 0, 0} } func (m *RpcBlockImageSetNameRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -53665,7 +55294,7 @@ func (m *RpcBlockImageSetNameResponse) Reset() { *m = RpcBlockImageSetNa func (m *RpcBlockImageSetNameResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockImageSetNameResponse) ProtoMessage() {} func (*RpcBlockImageSetNameResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 24, 0, 1} } func (m *RpcBlockImageSetNameResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -53710,7 +55339,7 @@ func (m *RpcBlockImageSetNameResponseError) Reset() { *m = RpcBlockImage func (m *RpcBlockImageSetNameResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockImageSetNameResponseError) ProtoMessage() {} func (*RpcBlockImageSetNameResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 24, 0, 1, 0} } func (m *RpcBlockImageSetNameResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -53760,7 +55389,7 @@ func (m *RpcBlockImageSetWidth) Reset() { *m = RpcBlockImageSetWidth{} } func (m *RpcBlockImageSetWidth) String() string { return proto.CompactTextString(m) } func (*RpcBlockImageSetWidth) ProtoMessage() {} func (*RpcBlockImageSetWidth) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 24, 1} } func (m *RpcBlockImageSetWidth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -53799,7 +55428,7 @@ func (m *RpcBlockImageSetWidthRequest) Reset() { *m = RpcBlockImageSetWi func (m *RpcBlockImageSetWidthRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockImageSetWidthRequest) ProtoMessage() {} func (*RpcBlockImageSetWidthRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 24, 1, 0} } func (m *RpcBlockImageSetWidthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -53857,7 +55486,7 @@ func (m *RpcBlockImageSetWidthResponse) Reset() { *m = RpcBlockImageSetW func (m *RpcBlockImageSetWidthResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockImageSetWidthResponse) ProtoMessage() {} func (*RpcBlockImageSetWidthResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 24, 1, 1} } func (m *RpcBlockImageSetWidthResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -53902,7 +55531,7 @@ func (m *RpcBlockImageSetWidthResponseError) Reset() { *m = RpcBlockImag func (m *RpcBlockImageSetWidthResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockImageSetWidthResponseError) ProtoMessage() {} func (*RpcBlockImageSetWidthResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 23, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 24, 1, 1, 0} } func (m *RpcBlockImageSetWidthResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -53952,7 +55581,7 @@ func (m *RpcBlockVideo) Reset() { *m = RpcBlockVideo{} } func (m *RpcBlockVideo) String() string { return proto.CompactTextString(m) } func (*RpcBlockVideo) ProtoMessage() {} func (*RpcBlockVideo) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 24} + return fileDescriptor_8261c968b2e6f45c, []int{0, 25} } func (m *RpcBlockVideo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -53988,7 +55617,7 @@ func (m *RpcBlockVideoSetName) Reset() { *m = RpcBlockVideoSetName{} } func (m *RpcBlockVideoSetName) String() string { return proto.CompactTextString(m) } func (*RpcBlockVideoSetName) ProtoMessage() {} func (*RpcBlockVideoSetName) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 24, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 25, 0} } func (m *RpcBlockVideoSetName) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -54027,7 +55656,7 @@ func (m *RpcBlockVideoSetNameRequest) Reset() { *m = RpcBlockVideoSetNam func (m *RpcBlockVideoSetNameRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockVideoSetNameRequest) ProtoMessage() {} func (*RpcBlockVideoSetNameRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 24, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 25, 0, 0} } func (m *RpcBlockVideoSetNameRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -54085,7 +55714,7 @@ func (m *RpcBlockVideoSetNameResponse) Reset() { *m = RpcBlockVideoSetNa func (m *RpcBlockVideoSetNameResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockVideoSetNameResponse) ProtoMessage() {} func (*RpcBlockVideoSetNameResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 24, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 25, 0, 1} } func (m *RpcBlockVideoSetNameResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -54130,7 +55759,7 @@ func (m *RpcBlockVideoSetNameResponseError) Reset() { *m = RpcBlockVideo func (m *RpcBlockVideoSetNameResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockVideoSetNameResponseError) ProtoMessage() {} func (*RpcBlockVideoSetNameResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 24, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 25, 0, 1, 0} } func (m *RpcBlockVideoSetNameResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -54180,7 +55809,7 @@ func (m *RpcBlockVideoSetWidth) Reset() { *m = RpcBlockVideoSetWidth{} } func (m *RpcBlockVideoSetWidth) String() string { return proto.CompactTextString(m) } func (*RpcBlockVideoSetWidth) ProtoMessage() {} func (*RpcBlockVideoSetWidth) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 24, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 25, 1} } func (m *RpcBlockVideoSetWidth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -54219,7 +55848,7 @@ func (m *RpcBlockVideoSetWidthRequest) Reset() { *m = RpcBlockVideoSetWi func (m *RpcBlockVideoSetWidthRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockVideoSetWidthRequest) ProtoMessage() {} func (*RpcBlockVideoSetWidthRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 24, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 25, 1, 0} } func (m *RpcBlockVideoSetWidthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -54277,7 +55906,7 @@ func (m *RpcBlockVideoSetWidthResponse) Reset() { *m = RpcBlockVideoSetW func (m *RpcBlockVideoSetWidthResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockVideoSetWidthResponse) ProtoMessage() {} func (*RpcBlockVideoSetWidthResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 24, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 25, 1, 1} } func (m *RpcBlockVideoSetWidthResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -54322,7 +55951,7 @@ func (m *RpcBlockVideoSetWidthResponseError) Reset() { *m = RpcBlockVide func (m *RpcBlockVideoSetWidthResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockVideoSetWidthResponseError) ProtoMessage() {} func (*RpcBlockVideoSetWidthResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 24, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 25, 1, 1, 0} } func (m *RpcBlockVideoSetWidthResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -54372,7 +56001,7 @@ func (m *RpcBlockLink) Reset() { *m = RpcBlockLink{} } func (m *RpcBlockLink) String() string { return proto.CompactTextString(m) } func (*RpcBlockLink) ProtoMessage() {} func (*RpcBlockLink) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 25} + return fileDescriptor_8261c968b2e6f45c, []int{0, 26} } func (m *RpcBlockLink) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -54408,7 +56037,7 @@ func (m *RpcBlockLinkCreateWithObject) Reset() { *m = RpcBlockLinkCreate func (m *RpcBlockLinkCreateWithObject) String() string { return proto.CompactTextString(m) } func (*RpcBlockLinkCreateWithObject) ProtoMessage() {} func (*RpcBlockLinkCreateWithObject) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 25, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 26, 0} } func (m *RpcBlockLinkCreateWithObject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -54455,7 +56084,7 @@ func (m *RpcBlockLinkCreateWithObjectRequest) Reset() { *m = RpcBlockLin func (m *RpcBlockLinkCreateWithObjectRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockLinkCreateWithObjectRequest) ProtoMessage() {} func (*RpcBlockLinkCreateWithObjectRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 25, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 26, 0, 0} } func (m *RpcBlockLinkCreateWithObjectRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -54566,7 +56195,7 @@ func (m *RpcBlockLinkCreateWithObjectResponse) Reset() { *m = RpcBlockLi func (m *RpcBlockLinkCreateWithObjectResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockLinkCreateWithObjectResponse) ProtoMessage() {} func (*RpcBlockLinkCreateWithObjectResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 25, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 26, 0, 1} } func (m *RpcBlockLinkCreateWithObjectResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -54643,7 +56272,7 @@ func (m *RpcBlockLinkCreateWithObjectResponseError) String() string { } func (*RpcBlockLinkCreateWithObjectResponseError) ProtoMessage() {} func (*RpcBlockLinkCreateWithObjectResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 25, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 26, 0, 1, 0} } func (m *RpcBlockLinkCreateWithObjectResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -54693,7 +56322,7 @@ func (m *RpcBlockLinkListSetAppearance) Reset() { *m = RpcBlockLinkListS func (m *RpcBlockLinkListSetAppearance) String() string { return proto.CompactTextString(m) } func (*RpcBlockLinkListSetAppearance) ProtoMessage() {} func (*RpcBlockLinkListSetAppearance) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 25, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 26, 1} } func (m *RpcBlockLinkListSetAppearance) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -54735,7 +56364,7 @@ func (m *RpcBlockLinkListSetAppearanceRequest) Reset() { *m = RpcBlockLi func (m *RpcBlockLinkListSetAppearanceRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockLinkListSetAppearanceRequest) ProtoMessage() {} func (*RpcBlockLinkListSetAppearanceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 25, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 26, 1, 0} } func (m *RpcBlockLinkListSetAppearanceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -54815,7 +56444,7 @@ func (m *RpcBlockLinkListSetAppearanceResponse) Reset() { *m = RpcBlockL func (m *RpcBlockLinkListSetAppearanceResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockLinkListSetAppearanceResponse) ProtoMessage() {} func (*RpcBlockLinkListSetAppearanceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 25, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 26, 1, 1} } func (m *RpcBlockLinkListSetAppearanceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -54871,7 +56500,7 @@ func (m *RpcBlockLinkListSetAppearanceResponseError) String() string { } func (*RpcBlockLinkListSetAppearanceResponseError) ProtoMessage() {} func (*RpcBlockLinkListSetAppearanceResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 25, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 26, 1, 1, 0} } func (m *RpcBlockLinkListSetAppearanceResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -54921,7 +56550,7 @@ func (m *RpcBlockRelation) Reset() { *m = RpcBlockRelation{} } func (m *RpcBlockRelation) String() string { return proto.CompactTextString(m) } func (*RpcBlockRelation) ProtoMessage() {} func (*RpcBlockRelation) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 26} + return fileDescriptor_8261c968b2e6f45c, []int{0, 27} } func (m *RpcBlockRelation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -54957,7 +56586,7 @@ func (m *RpcBlockRelationSetKey) Reset() { *m = RpcBlockRelationSetKey{} func (m *RpcBlockRelationSetKey) String() string { return proto.CompactTextString(m) } func (*RpcBlockRelationSetKey) ProtoMessage() {} func (*RpcBlockRelationSetKey) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 26, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 27, 0} } func (m *RpcBlockRelationSetKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -54996,7 +56625,7 @@ func (m *RpcBlockRelationSetKeyRequest) Reset() { *m = RpcBlockRelationS func (m *RpcBlockRelationSetKeyRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockRelationSetKeyRequest) ProtoMessage() {} func (*RpcBlockRelationSetKeyRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 26, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 27, 0, 0} } func (m *RpcBlockRelationSetKeyRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -55055,7 +56684,7 @@ func (m *RpcBlockRelationSetKeyResponse) Reset() { *m = RpcBlockRelation func (m *RpcBlockRelationSetKeyResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockRelationSetKeyResponse) ProtoMessage() {} func (*RpcBlockRelationSetKeyResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 26, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 27, 0, 1} } func (m *RpcBlockRelationSetKeyResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -55107,7 +56736,7 @@ func (m *RpcBlockRelationSetKeyResponseError) Reset() { *m = RpcBlockRel func (m *RpcBlockRelationSetKeyResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockRelationSetKeyResponseError) ProtoMessage() {} func (*RpcBlockRelationSetKeyResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 26, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 27, 0, 1, 0} } func (m *RpcBlockRelationSetKeyResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -55157,7 +56786,7 @@ func (m *RpcBlockRelationAdd) Reset() { *m = RpcBlockRelationAdd{} } func (m *RpcBlockRelationAdd) String() string { return proto.CompactTextString(m) } func (*RpcBlockRelationAdd) ProtoMessage() {} func (*RpcBlockRelationAdd) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 26, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 27, 1} } func (m *RpcBlockRelationAdd) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -55196,7 +56825,7 @@ func (m *RpcBlockRelationAddRequest) Reset() { *m = RpcBlockRelationAddR func (m *RpcBlockRelationAddRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockRelationAddRequest) ProtoMessage() {} func (*RpcBlockRelationAddRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 26, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 27, 1, 0} } func (m *RpcBlockRelationAddRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -55255,7 +56884,7 @@ func (m *RpcBlockRelationAddResponse) Reset() { *m = RpcBlockRelationAdd func (m *RpcBlockRelationAddResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockRelationAddResponse) ProtoMessage() {} func (*RpcBlockRelationAddResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 26, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 27, 1, 1} } func (m *RpcBlockRelationAddResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -55307,7 +56936,7 @@ func (m *RpcBlockRelationAddResponseError) Reset() { *m = RpcBlockRelati func (m *RpcBlockRelationAddResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockRelationAddResponseError) ProtoMessage() {} func (*RpcBlockRelationAddResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 26, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 27, 1, 1, 0} } func (m *RpcBlockRelationAddResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -55357,7 +56986,7 @@ func (m *RpcBlockBookmark) Reset() { *m = RpcBlockBookmark{} } func (m *RpcBlockBookmark) String() string { return proto.CompactTextString(m) } func (*RpcBlockBookmark) ProtoMessage() {} func (*RpcBlockBookmark) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 27} + return fileDescriptor_8261c968b2e6f45c, []int{0, 28} } func (m *RpcBlockBookmark) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -55393,7 +57022,7 @@ func (m *RpcBlockBookmarkFetch) Reset() { *m = RpcBlockBookmarkFetch{} } func (m *RpcBlockBookmarkFetch) String() string { return proto.CompactTextString(m) } func (*RpcBlockBookmarkFetch) ProtoMessage() {} func (*RpcBlockBookmarkFetch) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 27, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 28, 0} } func (m *RpcBlockBookmarkFetch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -55433,7 +57062,7 @@ func (m *RpcBlockBookmarkFetchRequest) Reset() { *m = RpcBlockBookmarkFe func (m *RpcBlockBookmarkFetchRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockBookmarkFetchRequest) ProtoMessage() {} func (*RpcBlockBookmarkFetchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 27, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 28, 0, 0} } func (m *RpcBlockBookmarkFetchRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -55499,7 +57128,7 @@ func (m *RpcBlockBookmarkFetchResponse) Reset() { *m = RpcBlockBookmarkF func (m *RpcBlockBookmarkFetchResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockBookmarkFetchResponse) ProtoMessage() {} func (*RpcBlockBookmarkFetchResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 27, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 28, 0, 1} } func (m *RpcBlockBookmarkFetchResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -55551,7 +57180,7 @@ func (m *RpcBlockBookmarkFetchResponseError) Reset() { *m = RpcBlockBook func (m *RpcBlockBookmarkFetchResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockBookmarkFetchResponseError) ProtoMessage() {} func (*RpcBlockBookmarkFetchResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 27, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 28, 0, 1, 0} } func (m *RpcBlockBookmarkFetchResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -55601,7 +57230,7 @@ func (m *RpcBlockBookmarkCreateAndFetch) Reset() { *m = RpcBlockBookmark func (m *RpcBlockBookmarkCreateAndFetch) String() string { return proto.CompactTextString(m) } func (*RpcBlockBookmarkCreateAndFetch) ProtoMessage() {} func (*RpcBlockBookmarkCreateAndFetch) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 27, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 28, 1} } func (m *RpcBlockBookmarkCreateAndFetch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -55642,7 +57271,7 @@ func (m *RpcBlockBookmarkCreateAndFetchRequest) Reset() { *m = RpcBlockB func (m *RpcBlockBookmarkCreateAndFetchRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockBookmarkCreateAndFetchRequest) ProtoMessage() {} func (*RpcBlockBookmarkCreateAndFetchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 27, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 28, 1, 0} } func (m *RpcBlockBookmarkCreateAndFetchRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -55718,7 +57347,7 @@ func (m *RpcBlockBookmarkCreateAndFetchResponse) Reset() { func (m *RpcBlockBookmarkCreateAndFetchResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockBookmarkCreateAndFetchResponse) ProtoMessage() {} func (*RpcBlockBookmarkCreateAndFetchResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 27, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 28, 1, 1} } func (m *RpcBlockBookmarkCreateAndFetchResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -55781,7 +57410,7 @@ func (m *RpcBlockBookmarkCreateAndFetchResponseError) String() string { } func (*RpcBlockBookmarkCreateAndFetchResponseError) ProtoMessage() {} func (*RpcBlockBookmarkCreateAndFetchResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 27, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 28, 1, 1, 0} } func (m *RpcBlockBookmarkCreateAndFetchResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -55831,7 +57460,7 @@ func (m *RpcBlockDiv) Reset() { *m = RpcBlockDiv{} } func (m *RpcBlockDiv) String() string { return proto.CompactTextString(m) } func (*RpcBlockDiv) ProtoMessage() {} func (*RpcBlockDiv) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 28} + return fileDescriptor_8261c968b2e6f45c, []int{0, 29} } func (m *RpcBlockDiv) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -55867,7 +57496,7 @@ func (m *RpcBlockDivListSetStyle) Reset() { *m = RpcBlockDivListSetStyle func (m *RpcBlockDivListSetStyle) String() string { return proto.CompactTextString(m) } func (*RpcBlockDivListSetStyle) ProtoMessage() {} func (*RpcBlockDivListSetStyle) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 28, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0} } func (m *RpcBlockDivListSetStyle) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -55906,7 +57535,7 @@ func (m *RpcBlockDivListSetStyleRequest) Reset() { *m = RpcBlockDivListS func (m *RpcBlockDivListSetStyleRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDivListSetStyleRequest) ProtoMessage() {} func (*RpcBlockDivListSetStyleRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 28, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 0} } func (m *RpcBlockDivListSetStyleRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -55965,7 +57594,7 @@ func (m *RpcBlockDivListSetStyleResponse) Reset() { *m = RpcBlockDivList func (m *RpcBlockDivListSetStyleResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockDivListSetStyleResponse) ProtoMessage() {} func (*RpcBlockDivListSetStyleResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 28, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 1} } func (m *RpcBlockDivListSetStyleResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -56017,7 +57646,7 @@ func (m *RpcBlockDivListSetStyleResponseError) Reset() { *m = RpcBlockDi func (m *RpcBlockDivListSetStyleResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockDivListSetStyleResponseError) ProtoMessage() {} func (*RpcBlockDivListSetStyleResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 28, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 1, 0} } func (m *RpcBlockDivListSetStyleResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -56067,7 +57696,7 @@ func (m *RpcBlockDataview) Reset() { *m = RpcBlockDataview{} } func (m *RpcBlockDataview) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataview) ProtoMessage() {} func (*RpcBlockDataview) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30} } func (m *RpcBlockDataview) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -56103,7 +57732,7 @@ func (m *RpcBlockDataviewView) Reset() { *m = RpcBlockDataviewView{} } func (m *RpcBlockDataviewView) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewView) ProtoMessage() {} func (*RpcBlockDataviewView) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0} } func (m *RpcBlockDataviewView) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -56139,7 +57768,7 @@ func (m *RpcBlockDataviewViewCreate) Reset() { *m = RpcBlockDataviewView func (m *RpcBlockDataviewViewCreate) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewCreate) ProtoMessage() {} func (*RpcBlockDataviewViewCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 0} } func (m *RpcBlockDataviewViewCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -56179,7 +57808,7 @@ func (m *RpcBlockDataviewViewCreateRequest) Reset() { *m = RpcBlockDatav func (m *RpcBlockDataviewViewCreateRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewCreateRequest) ProtoMessage() {} func (*RpcBlockDataviewViewCreateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 0, 0} } func (m *RpcBlockDataviewViewCreateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -56246,7 +57875,7 @@ func (m *RpcBlockDataviewViewCreateResponse) Reset() { *m = RpcBlockData func (m *RpcBlockDataviewViewCreateResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewCreateResponse) ProtoMessage() {} func (*RpcBlockDataviewViewCreateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 0, 1} } func (m *RpcBlockDataviewViewCreateResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -56307,7 +57936,7 @@ func (m *RpcBlockDataviewViewCreateResponseError) Reset() { func (m *RpcBlockDataviewViewCreateResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewCreateResponseError) ProtoMessage() {} func (*RpcBlockDataviewViewCreateResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 0, 1, 0} } func (m *RpcBlockDataviewViewCreateResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -56357,7 +57986,7 @@ func (m *RpcBlockDataviewViewUpdate) Reset() { *m = RpcBlockDataviewView func (m *RpcBlockDataviewViewUpdate) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewUpdate) ProtoMessage() {} func (*RpcBlockDataviewViewUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 1} } func (m *RpcBlockDataviewViewUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -56397,7 +58026,7 @@ func (m *RpcBlockDataviewViewUpdateRequest) Reset() { *m = RpcBlockDatav func (m *RpcBlockDataviewViewUpdateRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewUpdateRequest) ProtoMessage() {} func (*RpcBlockDataviewViewUpdateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 1, 0} } func (m *RpcBlockDataviewViewUpdateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -56463,7 +58092,7 @@ func (m *RpcBlockDataviewViewUpdateResponse) Reset() { *m = RpcBlockData func (m *RpcBlockDataviewViewUpdateResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewUpdateResponse) ProtoMessage() {} func (*RpcBlockDataviewViewUpdateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 1, 1} } func (m *RpcBlockDataviewViewUpdateResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -56517,7 +58146,7 @@ func (m *RpcBlockDataviewViewUpdateResponseError) Reset() { func (m *RpcBlockDataviewViewUpdateResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewUpdateResponseError) ProtoMessage() {} func (*RpcBlockDataviewViewUpdateResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 1, 1, 0} } func (m *RpcBlockDataviewViewUpdateResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -56567,7 +58196,7 @@ func (m *RpcBlockDataviewViewDelete) Reset() { *m = RpcBlockDataviewView func (m *RpcBlockDataviewViewDelete) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewDelete) ProtoMessage() {} func (*RpcBlockDataviewViewDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 2} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 2} } func (m *RpcBlockDataviewViewDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -56606,7 +58235,7 @@ func (m *RpcBlockDataviewViewDeleteRequest) Reset() { *m = RpcBlockDatav func (m *RpcBlockDataviewViewDeleteRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewDeleteRequest) ProtoMessage() {} func (*RpcBlockDataviewViewDeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 2, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 2, 0} } func (m *RpcBlockDataviewViewDeleteRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -56665,7 +58294,7 @@ func (m *RpcBlockDataviewViewDeleteResponse) Reset() { *m = RpcBlockData func (m *RpcBlockDataviewViewDeleteResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewDeleteResponse) ProtoMessage() {} func (*RpcBlockDataviewViewDeleteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 2, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 2, 1} } func (m *RpcBlockDataviewViewDeleteResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -56719,7 +58348,7 @@ func (m *RpcBlockDataviewViewDeleteResponseError) Reset() { func (m *RpcBlockDataviewViewDeleteResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewDeleteResponseError) ProtoMessage() {} func (*RpcBlockDataviewViewDeleteResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 2, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 2, 1, 0} } func (m *RpcBlockDataviewViewDeleteResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -56769,7 +58398,7 @@ func (m *RpcBlockDataviewViewSetPosition) Reset() { *m = RpcBlockDatavie func (m *RpcBlockDataviewViewSetPosition) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewSetPosition) ProtoMessage() {} func (*RpcBlockDataviewViewSetPosition) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 3} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 3} } func (m *RpcBlockDataviewViewSetPosition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -56811,7 +58440,7 @@ func (m *RpcBlockDataviewViewSetPositionRequest) Reset() { func (m *RpcBlockDataviewViewSetPositionRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewSetPositionRequest) ProtoMessage() {} func (*RpcBlockDataviewViewSetPositionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 3, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 3, 0} } func (m *RpcBlockDataviewViewSetPositionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -56879,7 +58508,7 @@ func (m *RpcBlockDataviewViewSetPositionResponse) Reset() { func (m *RpcBlockDataviewViewSetPositionResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewSetPositionResponse) ProtoMessage() {} func (*RpcBlockDataviewViewSetPositionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 3, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 3, 1} } func (m *RpcBlockDataviewViewSetPositionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -56935,7 +58564,7 @@ func (m *RpcBlockDataviewViewSetPositionResponseError) String() string { } func (*RpcBlockDataviewViewSetPositionResponseError) ProtoMessage() {} func (*RpcBlockDataviewViewSetPositionResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 3, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 3, 1, 0} } func (m *RpcBlockDataviewViewSetPositionResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -56986,7 +58615,7 @@ func (m *RpcBlockDataviewViewSetActive) Reset() { *m = RpcBlockDataviewV func (m *RpcBlockDataviewViewSetActive) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewSetActive) ProtoMessage() {} func (*RpcBlockDataviewViewSetActive) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 4} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 4} } func (m *RpcBlockDataviewViewSetActive) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -57025,7 +58654,7 @@ func (m *RpcBlockDataviewViewSetActiveRequest) Reset() { *m = RpcBlockDa func (m *RpcBlockDataviewViewSetActiveRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewSetActiveRequest) ProtoMessage() {} func (*RpcBlockDataviewViewSetActiveRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 4, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 4, 0} } func (m *RpcBlockDataviewViewSetActiveRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -57084,7 +58713,7 @@ func (m *RpcBlockDataviewViewSetActiveResponse) Reset() { *m = RpcBlockD func (m *RpcBlockDataviewViewSetActiveResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewSetActiveResponse) ProtoMessage() {} func (*RpcBlockDataviewViewSetActiveResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 4, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 4, 1} } func (m *RpcBlockDataviewViewSetActiveResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -57140,7 +58769,7 @@ func (m *RpcBlockDataviewViewSetActiveResponseError) String() string { } func (*RpcBlockDataviewViewSetActiveResponseError) ProtoMessage() {} func (*RpcBlockDataviewViewSetActiveResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 0, 4, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 4, 1, 0} } func (m *RpcBlockDataviewViewSetActiveResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -57190,7 +58819,7 @@ func (m *RpcBlockDataviewRelation) Reset() { *m = RpcBlockDataviewRelati func (m *RpcBlockDataviewRelation) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewRelation) ProtoMessage() {} func (*RpcBlockDataviewRelation) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 1} } func (m *RpcBlockDataviewRelation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -57219,6 +58848,208 @@ func (m *RpcBlockDataviewRelation) XXX_DiscardUnknown() { var xxx_messageInfo_RpcBlockDataviewRelation proto.InternalMessageInfo +type RpcBlockDataviewRelationSet struct { +} + +func (m *RpcBlockDataviewRelationSet) Reset() { *m = RpcBlockDataviewRelationSet{} } +func (m *RpcBlockDataviewRelationSet) String() string { return proto.CompactTextString(m) } +func (*RpcBlockDataviewRelationSet) ProtoMessage() {} +func (*RpcBlockDataviewRelationSet) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 1, 0} +} +func (m *RpcBlockDataviewRelationSet) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcBlockDataviewRelationSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcBlockDataviewRelationSet.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcBlockDataviewRelationSet) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcBlockDataviewRelationSet.Merge(m, src) +} +func (m *RpcBlockDataviewRelationSet) XXX_Size() int { + return m.Size() +} +func (m *RpcBlockDataviewRelationSet) XXX_DiscardUnknown() { + xxx_messageInfo_RpcBlockDataviewRelationSet.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcBlockDataviewRelationSet proto.InternalMessageInfo + +type RpcBlockDataviewRelationSetRequest struct { + ContextId string `protobuf:"bytes,1,opt,name=contextId,proto3" json:"contextId,omitempty"` + BlockId string `protobuf:"bytes,2,opt,name=blockId,proto3" json:"blockId,omitempty"` + RelationKeys []string `protobuf:"bytes,3,rep,name=relationKeys,proto3" json:"relationKeys,omitempty"` +} + +func (m *RpcBlockDataviewRelationSetRequest) Reset() { *m = RpcBlockDataviewRelationSetRequest{} } +func (m *RpcBlockDataviewRelationSetRequest) String() string { return proto.CompactTextString(m) } +func (*RpcBlockDataviewRelationSetRequest) ProtoMessage() {} +func (*RpcBlockDataviewRelationSetRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 1, 0, 0} +} +func (m *RpcBlockDataviewRelationSetRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcBlockDataviewRelationSetRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcBlockDataviewRelationSetRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcBlockDataviewRelationSetRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcBlockDataviewRelationSetRequest.Merge(m, src) +} +func (m *RpcBlockDataviewRelationSetRequest) XXX_Size() int { + return m.Size() +} +func (m *RpcBlockDataviewRelationSetRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RpcBlockDataviewRelationSetRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcBlockDataviewRelationSetRequest proto.InternalMessageInfo + +func (m *RpcBlockDataviewRelationSetRequest) GetContextId() string { + if m != nil { + return m.ContextId + } + return "" +} + +func (m *RpcBlockDataviewRelationSetRequest) GetBlockId() string { + if m != nil { + return m.BlockId + } + return "" +} + +func (m *RpcBlockDataviewRelationSetRequest) GetRelationKeys() []string { + if m != nil { + return m.RelationKeys + } + return nil +} + +type RpcBlockDataviewRelationSetResponse struct { + Error *RpcBlockDataviewRelationSetResponseError `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + Event *ResponseEvent `protobuf:"bytes,2,opt,name=event,proto3" json:"event,omitempty"` +} + +func (m *RpcBlockDataviewRelationSetResponse) Reset() { *m = RpcBlockDataviewRelationSetResponse{} } +func (m *RpcBlockDataviewRelationSetResponse) String() string { return proto.CompactTextString(m) } +func (*RpcBlockDataviewRelationSetResponse) ProtoMessage() {} +func (*RpcBlockDataviewRelationSetResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 1, 0, 1} +} +func (m *RpcBlockDataviewRelationSetResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcBlockDataviewRelationSetResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcBlockDataviewRelationSetResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcBlockDataviewRelationSetResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcBlockDataviewRelationSetResponse.Merge(m, src) +} +func (m *RpcBlockDataviewRelationSetResponse) XXX_Size() int { + return m.Size() +} +func (m *RpcBlockDataviewRelationSetResponse) XXX_DiscardUnknown() { + xxx_messageInfo_RpcBlockDataviewRelationSetResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcBlockDataviewRelationSetResponse proto.InternalMessageInfo + +func (m *RpcBlockDataviewRelationSetResponse) GetError() *RpcBlockDataviewRelationSetResponseError { + if m != nil { + return m.Error + } + return nil +} + +func (m *RpcBlockDataviewRelationSetResponse) GetEvent() *ResponseEvent { + if m != nil { + return m.Event + } + return nil +} + +type RpcBlockDataviewRelationSetResponseError struct { + Code RpcBlockDataviewRelationSetResponseErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.RpcBlockDataviewRelationSetResponseErrorCode" json:"code,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` +} + +func (m *RpcBlockDataviewRelationSetResponseError) Reset() { + *m = RpcBlockDataviewRelationSetResponseError{} +} +func (m *RpcBlockDataviewRelationSetResponseError) String() string { return proto.CompactTextString(m) } +func (*RpcBlockDataviewRelationSetResponseError) ProtoMessage() {} +func (*RpcBlockDataviewRelationSetResponseError) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 1, 0, 1, 0} +} +func (m *RpcBlockDataviewRelationSetResponseError) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcBlockDataviewRelationSetResponseError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcBlockDataviewRelationSetResponseError.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcBlockDataviewRelationSetResponseError) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcBlockDataviewRelationSetResponseError.Merge(m, src) +} +func (m *RpcBlockDataviewRelationSetResponseError) XXX_Size() int { + return m.Size() +} +func (m *RpcBlockDataviewRelationSetResponseError) XXX_DiscardUnknown() { + xxx_messageInfo_RpcBlockDataviewRelationSetResponseError.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcBlockDataviewRelationSetResponseError proto.InternalMessageInfo + +func (m *RpcBlockDataviewRelationSetResponseError) GetCode() RpcBlockDataviewRelationSetResponseErrorCode { + if m != nil { + return m.Code + } + return RpcBlockDataviewRelationSetResponseError_NULL +} + +func (m *RpcBlockDataviewRelationSetResponseError) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + type RpcBlockDataviewRelationAdd struct { } @@ -57226,7 +59057,7 @@ func (m *RpcBlockDataviewRelationAdd) Reset() { *m = RpcBlockDataviewRel func (m *RpcBlockDataviewRelationAdd) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewRelationAdd) ProtoMessage() {} func (*RpcBlockDataviewRelationAdd) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 1, 1} } func (m *RpcBlockDataviewRelationAdd) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -57265,7 +59096,7 @@ func (m *RpcBlockDataviewRelationAddRequest) Reset() { *m = RpcBlockData func (m *RpcBlockDataviewRelationAddRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewRelationAddRequest) ProtoMessage() {} func (*RpcBlockDataviewRelationAddRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 1, 1, 0} } func (m *RpcBlockDataviewRelationAddRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -57324,7 +59155,7 @@ func (m *RpcBlockDataviewRelationAddResponse) Reset() { *m = RpcBlockDat func (m *RpcBlockDataviewRelationAddResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewRelationAddResponse) ProtoMessage() {} func (*RpcBlockDataviewRelationAddResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 1, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 1, 1, 1} } func (m *RpcBlockDataviewRelationAddResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -57378,7 +59209,7 @@ func (m *RpcBlockDataviewRelationAddResponseError) Reset() { func (m *RpcBlockDataviewRelationAddResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewRelationAddResponseError) ProtoMessage() {} func (*RpcBlockDataviewRelationAddResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 1, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 1, 1, 1, 0} } func (m *RpcBlockDataviewRelationAddResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -57428,7 +59259,7 @@ func (m *RpcBlockDataviewRelationDelete) Reset() { *m = RpcBlockDataview func (m *RpcBlockDataviewRelationDelete) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewRelationDelete) ProtoMessage() {} func (*RpcBlockDataviewRelationDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 1, 2} } func (m *RpcBlockDataviewRelationDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -57467,7 +59298,7 @@ func (m *RpcBlockDataviewRelationDeleteRequest) Reset() { *m = RpcBlockD func (m *RpcBlockDataviewRelationDeleteRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewRelationDeleteRequest) ProtoMessage() {} func (*RpcBlockDataviewRelationDeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 1, 2, 0} } func (m *RpcBlockDataviewRelationDeleteRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -57528,7 +59359,7 @@ func (m *RpcBlockDataviewRelationDeleteResponse) Reset() { func (m *RpcBlockDataviewRelationDeleteResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewRelationDeleteResponse) ProtoMessage() {} func (*RpcBlockDataviewRelationDeleteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 1, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 1, 2, 1} } func (m *RpcBlockDataviewRelationDeleteResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -57584,7 +59415,7 @@ func (m *RpcBlockDataviewRelationDeleteResponseError) String() string { } func (*RpcBlockDataviewRelationDeleteResponseError) ProtoMessage() {} func (*RpcBlockDataviewRelationDeleteResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 1, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 1, 2, 1, 0} } func (m *RpcBlockDataviewRelationDeleteResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -57634,7 +59465,7 @@ func (m *RpcBlockDataviewSetSource) Reset() { *m = RpcBlockDataviewSetSo func (m *RpcBlockDataviewSetSource) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewSetSource) ProtoMessage() {} func (*RpcBlockDataviewSetSource) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 2} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 2} } func (m *RpcBlockDataviewSetSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -57673,7 +59504,7 @@ func (m *RpcBlockDataviewSetSourceRequest) Reset() { *m = RpcBlockDatavi func (m *RpcBlockDataviewSetSourceRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewSetSourceRequest) ProtoMessage() {} func (*RpcBlockDataviewSetSourceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 2, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 2, 0} } func (m *RpcBlockDataviewSetSourceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -57732,7 +59563,7 @@ func (m *RpcBlockDataviewSetSourceResponse) Reset() { *m = RpcBlockDatav func (m *RpcBlockDataviewSetSourceResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewSetSourceResponse) ProtoMessage() {} func (*RpcBlockDataviewSetSourceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 2, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 2, 1} } func (m *RpcBlockDataviewSetSourceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -57786,7 +59617,7 @@ func (m *RpcBlockDataviewSetSourceResponseError) Reset() { func (m *RpcBlockDataviewSetSourceResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewSetSourceResponseError) ProtoMessage() {} func (*RpcBlockDataviewSetSourceResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 2, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 2, 1, 0} } func (m *RpcBlockDataviewSetSourceResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -57836,7 +59667,7 @@ func (m *RpcBlockDataviewGroupOrder) Reset() { *m = RpcBlockDataviewGrou func (m *RpcBlockDataviewGroupOrder) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewGroupOrder) ProtoMessage() {} func (*RpcBlockDataviewGroupOrder) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 3} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 3} } func (m *RpcBlockDataviewGroupOrder) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -57872,7 +59703,7 @@ func (m *RpcBlockDataviewGroupOrderUpdate) Reset() { *m = RpcBlockDatavi func (m *RpcBlockDataviewGroupOrderUpdate) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewGroupOrderUpdate) ProtoMessage() {} func (*RpcBlockDataviewGroupOrderUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 3, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 3, 0} } func (m *RpcBlockDataviewGroupOrderUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -57913,7 +59744,7 @@ func (m *RpcBlockDataviewGroupOrderUpdateRequest) Reset() { func (m *RpcBlockDataviewGroupOrderUpdateRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewGroupOrderUpdateRequest) ProtoMessage() {} func (*RpcBlockDataviewGroupOrderUpdateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 3, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 3, 0, 0} } func (m *RpcBlockDataviewGroupOrderUpdateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -57974,7 +59805,7 @@ func (m *RpcBlockDataviewGroupOrderUpdateResponse) Reset() { func (m *RpcBlockDataviewGroupOrderUpdateResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewGroupOrderUpdateResponse) ProtoMessage() {} func (*RpcBlockDataviewGroupOrderUpdateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 3, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 3, 0, 1} } func (m *RpcBlockDataviewGroupOrderUpdateResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -58030,7 +59861,7 @@ func (m *RpcBlockDataviewGroupOrderUpdateResponseError) String() string { } func (*RpcBlockDataviewGroupOrderUpdateResponseError) ProtoMessage() {} func (*RpcBlockDataviewGroupOrderUpdateResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 3, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 3, 0, 1, 0} } func (m *RpcBlockDataviewGroupOrderUpdateResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -58080,7 +59911,7 @@ func (m *RpcBlockDataviewObjectOrder) Reset() { *m = RpcBlockDataviewObj func (m *RpcBlockDataviewObjectOrder) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewObjectOrder) ProtoMessage() {} func (*RpcBlockDataviewObjectOrder) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 4} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 4} } func (m *RpcBlockDataviewObjectOrder) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -58116,7 +59947,7 @@ func (m *RpcBlockDataviewObjectOrderUpdate) Reset() { *m = RpcBlockDatav func (m *RpcBlockDataviewObjectOrderUpdate) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewObjectOrderUpdate) ProtoMessage() {} func (*RpcBlockDataviewObjectOrderUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 4, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 4, 0} } func (m *RpcBlockDataviewObjectOrderUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -58157,7 +59988,7 @@ func (m *RpcBlockDataviewObjectOrderUpdateRequest) Reset() { func (m *RpcBlockDataviewObjectOrderUpdateRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewObjectOrderUpdateRequest) ProtoMessage() {} func (*RpcBlockDataviewObjectOrderUpdateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 4, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 4, 0, 0} } func (m *RpcBlockDataviewObjectOrderUpdateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -58220,7 +60051,7 @@ func (m *RpcBlockDataviewObjectOrderUpdateResponse) String() string { } func (*RpcBlockDataviewObjectOrderUpdateResponse) ProtoMessage() {} func (*RpcBlockDataviewObjectOrderUpdateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 4, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 4, 0, 1} } func (m *RpcBlockDataviewObjectOrderUpdateResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -58276,7 +60107,7 @@ func (m *RpcBlockDataviewObjectOrderUpdateResponseError) String() string { } func (*RpcBlockDataviewObjectOrderUpdateResponseError) ProtoMessage() {} func (*RpcBlockDataviewObjectOrderUpdateResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 4, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 4, 0, 1, 0} } func (m *RpcBlockDataviewObjectOrderUpdateResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -58326,7 +60157,7 @@ func (m *RpcBlockDataviewObjectOrderMove) Reset() { *m = RpcBlockDatavie func (m *RpcBlockDataviewObjectOrderMove) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewObjectOrderMove) ProtoMessage() {} func (*RpcBlockDataviewObjectOrderMove) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 4, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 4, 1} } func (m *RpcBlockDataviewObjectOrderMove) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -58370,7 +60201,7 @@ func (m *RpcBlockDataviewObjectOrderMoveRequest) Reset() { func (m *RpcBlockDataviewObjectOrderMoveRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewObjectOrderMoveRequest) ProtoMessage() {} func (*RpcBlockDataviewObjectOrderMoveRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 4, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 4, 1, 0} } func (m *RpcBlockDataviewObjectOrderMoveRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -58452,7 +60283,7 @@ func (m *RpcBlockDataviewObjectOrderMoveResponse) Reset() { func (m *RpcBlockDataviewObjectOrderMoveResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewObjectOrderMoveResponse) ProtoMessage() {} func (*RpcBlockDataviewObjectOrderMoveResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 4, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 4, 1, 1} } func (m *RpcBlockDataviewObjectOrderMoveResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -58508,7 +60339,7 @@ func (m *RpcBlockDataviewObjectOrderMoveResponseError) String() string { } func (*RpcBlockDataviewObjectOrderMoveResponseError) ProtoMessage() {} func (*RpcBlockDataviewObjectOrderMoveResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 4, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 4, 1, 1, 0} } func (m *RpcBlockDataviewObjectOrderMoveResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -58560,7 +60391,7 @@ func (m *RpcBlockDataviewCreateFromExistingObject) Reset() { func (m *RpcBlockDataviewCreateFromExistingObject) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewCreateFromExistingObject) ProtoMessage() {} func (*RpcBlockDataviewCreateFromExistingObject) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 5} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 5} } func (m *RpcBlockDataviewCreateFromExistingObject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -58603,7 +60434,7 @@ func (m *RpcBlockDataviewCreateFromExistingObjectRequest) String() string { } func (*RpcBlockDataviewCreateFromExistingObjectRequest) ProtoMessage() {} func (*RpcBlockDataviewCreateFromExistingObjectRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 5, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 5, 0} } func (m *RpcBlockDataviewCreateFromExistingObjectRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -58669,7 +60500,7 @@ func (m *RpcBlockDataviewCreateFromExistingObjectResponse) String() string { } func (*RpcBlockDataviewCreateFromExistingObjectResponse) ProtoMessage() {} func (*RpcBlockDataviewCreateFromExistingObjectResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 5, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 5, 1} } func (m *RpcBlockDataviewCreateFromExistingObjectResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -58746,7 +60577,7 @@ func (m *RpcBlockDataviewCreateFromExistingObjectResponseError) String() string } func (*RpcBlockDataviewCreateFromExistingObjectResponseError) ProtoMessage() {} func (*RpcBlockDataviewCreateFromExistingObjectResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 5, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 5, 1, 0} } func (m *RpcBlockDataviewCreateFromExistingObjectResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -58796,7 +60627,7 @@ func (m *RpcBlockDataviewFilter) Reset() { *m = RpcBlockDataviewFilter{} func (m *RpcBlockDataviewFilter) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewFilter) ProtoMessage() {} func (*RpcBlockDataviewFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 6} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 6} } func (m *RpcBlockDataviewFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -58832,7 +60663,7 @@ func (m *RpcBlockDataviewFilterAdd) Reset() { *m = RpcBlockDataviewFilte func (m *RpcBlockDataviewFilterAdd) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewFilterAdd) ProtoMessage() {} func (*RpcBlockDataviewFilterAdd) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 6, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 6, 0} } func (m *RpcBlockDataviewFilterAdd) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -58872,7 +60703,7 @@ func (m *RpcBlockDataviewFilterAddRequest) Reset() { *m = RpcBlockDatavi func (m *RpcBlockDataviewFilterAddRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewFilterAddRequest) ProtoMessage() {} func (*RpcBlockDataviewFilterAddRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 6, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 6, 0, 0} } func (m *RpcBlockDataviewFilterAddRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -58938,7 +60769,7 @@ func (m *RpcBlockDataviewFilterAddResponse) Reset() { *m = RpcBlockDatav func (m *RpcBlockDataviewFilterAddResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewFilterAddResponse) ProtoMessage() {} func (*RpcBlockDataviewFilterAddResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 6, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 6, 0, 1} } func (m *RpcBlockDataviewFilterAddResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -58992,7 +60823,7 @@ func (m *RpcBlockDataviewFilterAddResponseError) Reset() { func (m *RpcBlockDataviewFilterAddResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewFilterAddResponseError) ProtoMessage() {} func (*RpcBlockDataviewFilterAddResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 6, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 6, 0, 1, 0} } func (m *RpcBlockDataviewFilterAddResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -59042,7 +60873,7 @@ func (m *RpcBlockDataviewFilterRemove) Reset() { *m = RpcBlockDataviewFi func (m *RpcBlockDataviewFilterRemove) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewFilterRemove) ProtoMessage() {} func (*RpcBlockDataviewFilterRemove) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 6, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 6, 1} } func (m *RpcBlockDataviewFilterRemove) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -59082,7 +60913,7 @@ func (m *RpcBlockDataviewFilterRemoveRequest) Reset() { *m = RpcBlockDat func (m *RpcBlockDataviewFilterRemoveRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewFilterRemoveRequest) ProtoMessage() {} func (*RpcBlockDataviewFilterRemoveRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 6, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 6, 1, 0} } func (m *RpcBlockDataviewFilterRemoveRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -59148,7 +60979,7 @@ func (m *RpcBlockDataviewFilterRemoveResponse) Reset() { *m = RpcBlockDa func (m *RpcBlockDataviewFilterRemoveResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewFilterRemoveResponse) ProtoMessage() {} func (*RpcBlockDataviewFilterRemoveResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 6, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 6, 1, 1} } func (m *RpcBlockDataviewFilterRemoveResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -59204,7 +61035,7 @@ func (m *RpcBlockDataviewFilterRemoveResponseError) String() string { } func (*RpcBlockDataviewFilterRemoveResponseError) ProtoMessage() {} func (*RpcBlockDataviewFilterRemoveResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 6, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 6, 1, 1, 0} } func (m *RpcBlockDataviewFilterRemoveResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -59254,7 +61085,7 @@ func (m *RpcBlockDataviewFilterReplace) Reset() { *m = RpcBlockDataviewF func (m *RpcBlockDataviewFilterReplace) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewFilterReplace) ProtoMessage() {} func (*RpcBlockDataviewFilterReplace) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 6, 2} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 6, 2} } func (m *RpcBlockDataviewFilterReplace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -59295,7 +61126,7 @@ func (m *RpcBlockDataviewFilterReplaceRequest) Reset() { *m = RpcBlockDa func (m *RpcBlockDataviewFilterReplaceRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewFilterReplaceRequest) ProtoMessage() {} func (*RpcBlockDataviewFilterReplaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 6, 2, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 6, 2, 0} } func (m *RpcBlockDataviewFilterReplaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -59368,7 +61199,7 @@ func (m *RpcBlockDataviewFilterReplaceResponse) Reset() { *m = RpcBlockD func (m *RpcBlockDataviewFilterReplaceResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewFilterReplaceResponse) ProtoMessage() {} func (*RpcBlockDataviewFilterReplaceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 6, 2, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 6, 2, 1} } func (m *RpcBlockDataviewFilterReplaceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -59424,7 +61255,7 @@ func (m *RpcBlockDataviewFilterReplaceResponseError) String() string { } func (*RpcBlockDataviewFilterReplaceResponseError) ProtoMessage() {} func (*RpcBlockDataviewFilterReplaceResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 6, 2, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 6, 2, 1, 0} } func (m *RpcBlockDataviewFilterReplaceResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -59474,7 +61305,7 @@ func (m *RpcBlockDataviewFilterSort) Reset() { *m = RpcBlockDataviewFilt func (m *RpcBlockDataviewFilterSort) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewFilterSort) ProtoMessage() {} func (*RpcBlockDataviewFilterSort) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 6, 3} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 6, 3} } func (m *RpcBlockDataviewFilterSort) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -59514,7 +61345,7 @@ func (m *RpcBlockDataviewFilterSortRequest) Reset() { *m = RpcBlockDatav func (m *RpcBlockDataviewFilterSortRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewFilterSortRequest) ProtoMessage() {} func (*RpcBlockDataviewFilterSortRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 6, 3, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 6, 3, 0} } func (m *RpcBlockDataviewFilterSortRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -59580,7 +61411,7 @@ func (m *RpcBlockDataviewFilterSortResponse) Reset() { *m = RpcBlockData func (m *RpcBlockDataviewFilterSortResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewFilterSortResponse) ProtoMessage() {} func (*RpcBlockDataviewFilterSortResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 6, 3, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 6, 3, 1} } func (m *RpcBlockDataviewFilterSortResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -59634,7 +61465,7 @@ func (m *RpcBlockDataviewFilterSortResponseError) Reset() { func (m *RpcBlockDataviewFilterSortResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewFilterSortResponseError) ProtoMessage() {} func (*RpcBlockDataviewFilterSortResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 6, 3, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 6, 3, 1, 0} } func (m *RpcBlockDataviewFilterSortResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -59684,7 +61515,7 @@ func (m *RpcBlockDataviewSort) Reset() { *m = RpcBlockDataviewSort{} } func (m *RpcBlockDataviewSort) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewSort) ProtoMessage() {} func (*RpcBlockDataviewSort) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 7} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 7} } func (m *RpcBlockDataviewSort) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -59720,7 +61551,7 @@ func (m *RpcBlockDataviewSortAdd) Reset() { *m = RpcBlockDataviewSortAdd func (m *RpcBlockDataviewSortAdd) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewSortAdd) ProtoMessage() {} func (*RpcBlockDataviewSortAdd) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 7, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 7, 0} } func (m *RpcBlockDataviewSortAdd) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -59760,7 +61591,7 @@ func (m *RpcBlockDataviewSortAddRequest) Reset() { *m = RpcBlockDataview func (m *RpcBlockDataviewSortAddRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewSortAddRequest) ProtoMessage() {} func (*RpcBlockDataviewSortAddRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 7, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 7, 0, 0} } func (m *RpcBlockDataviewSortAddRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -59826,7 +61657,7 @@ func (m *RpcBlockDataviewSortAddResponse) Reset() { *m = RpcBlockDatavie func (m *RpcBlockDataviewSortAddResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewSortAddResponse) ProtoMessage() {} func (*RpcBlockDataviewSortAddResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 7, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 7, 0, 1} } func (m *RpcBlockDataviewSortAddResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -59878,7 +61709,7 @@ func (m *RpcBlockDataviewSortAddResponseError) Reset() { *m = RpcBlockDa func (m *RpcBlockDataviewSortAddResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewSortAddResponseError) ProtoMessage() {} func (*RpcBlockDataviewSortAddResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 7, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 7, 0, 1, 0} } func (m *RpcBlockDataviewSortAddResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -59928,7 +61759,7 @@ func (m *RpcBlockDataviewSortRemove) Reset() { *m = RpcBlockDataviewSort func (m *RpcBlockDataviewSortRemove) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewSortRemove) ProtoMessage() {} func (*RpcBlockDataviewSortRemove) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 7, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 7, 1} } func (m *RpcBlockDataviewSortRemove) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -59968,7 +61799,7 @@ func (m *RpcBlockDataviewSortRemoveRequest) Reset() { *m = RpcBlockDatav func (m *RpcBlockDataviewSortRemoveRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewSortRemoveRequest) ProtoMessage() {} func (*RpcBlockDataviewSortRemoveRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 7, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 7, 1, 0} } func (m *RpcBlockDataviewSortRemoveRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -60034,7 +61865,7 @@ func (m *RpcBlockDataviewSortRemoveResponse) Reset() { *m = RpcBlockData func (m *RpcBlockDataviewSortRemoveResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewSortRemoveResponse) ProtoMessage() {} func (*RpcBlockDataviewSortRemoveResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 7, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 7, 1, 1} } func (m *RpcBlockDataviewSortRemoveResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -60088,7 +61919,7 @@ func (m *RpcBlockDataviewSortRemoveResponseError) Reset() { func (m *RpcBlockDataviewSortRemoveResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewSortRemoveResponseError) ProtoMessage() {} func (*RpcBlockDataviewSortRemoveResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 7, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 7, 1, 1, 0} } func (m *RpcBlockDataviewSortRemoveResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -60138,7 +61969,7 @@ func (m *RpcBlockDataviewSortReplace) Reset() { *m = RpcBlockDataviewSor func (m *RpcBlockDataviewSortReplace) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewSortReplace) ProtoMessage() {} func (*RpcBlockDataviewSortReplace) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 7, 2} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 7, 2} } func (m *RpcBlockDataviewSortReplace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -60179,7 +62010,7 @@ func (m *RpcBlockDataviewSortReplaceRequest) Reset() { *m = RpcBlockData func (m *RpcBlockDataviewSortReplaceRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewSortReplaceRequest) ProtoMessage() {} func (*RpcBlockDataviewSortReplaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 7, 2, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 7, 2, 0} } func (m *RpcBlockDataviewSortReplaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -60252,7 +62083,7 @@ func (m *RpcBlockDataviewSortReplaceResponse) Reset() { *m = RpcBlockDat func (m *RpcBlockDataviewSortReplaceResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewSortReplaceResponse) ProtoMessage() {} func (*RpcBlockDataviewSortReplaceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 7, 2, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 7, 2, 1} } func (m *RpcBlockDataviewSortReplaceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -60306,7 +62137,7 @@ func (m *RpcBlockDataviewSortReplaceResponseError) Reset() { func (m *RpcBlockDataviewSortReplaceResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewSortReplaceResponseError) ProtoMessage() {} func (*RpcBlockDataviewSortReplaceResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 7, 2, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 7, 2, 1, 0} } func (m *RpcBlockDataviewSortReplaceResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -60356,7 +62187,7 @@ func (m *RpcBlockDataviewSortSSort) Reset() { *m = RpcBlockDataviewSortS func (m *RpcBlockDataviewSortSSort) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewSortSSort) ProtoMessage() {} func (*RpcBlockDataviewSortSSort) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 7, 3} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 7, 3} } func (m *RpcBlockDataviewSortSSort) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -60396,7 +62227,7 @@ func (m *RpcBlockDataviewSortSSortRequest) Reset() { *m = RpcBlockDatavi func (m *RpcBlockDataviewSortSSortRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewSortSSortRequest) ProtoMessage() {} func (*RpcBlockDataviewSortSSortRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 7, 3, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 7, 3, 0} } func (m *RpcBlockDataviewSortSSortRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -60462,7 +62293,7 @@ func (m *RpcBlockDataviewSortSSortResponse) Reset() { *m = RpcBlockDatav func (m *RpcBlockDataviewSortSSortResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewSortSSortResponse) ProtoMessage() {} func (*RpcBlockDataviewSortSSortResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 7, 3, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 7, 3, 1} } func (m *RpcBlockDataviewSortSSortResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -60516,7 +62347,7 @@ func (m *RpcBlockDataviewSortSSortResponseError) Reset() { func (m *RpcBlockDataviewSortSSortResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewSortSSortResponseError) ProtoMessage() {} func (*RpcBlockDataviewSortSSortResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 7, 3, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 7, 3, 1, 0} } func (m *RpcBlockDataviewSortSSortResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -60566,7 +62397,7 @@ func (m *RpcBlockDataviewViewRelation) Reset() { *m = RpcBlockDataviewVi func (m *RpcBlockDataviewViewRelation) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewRelation) ProtoMessage() {} func (*RpcBlockDataviewViewRelation) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 8} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 8} } func (m *RpcBlockDataviewViewRelation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -60602,7 +62433,7 @@ func (m *RpcBlockDataviewViewRelationAdd) Reset() { *m = RpcBlockDatavie func (m *RpcBlockDataviewViewRelationAdd) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewRelationAdd) ProtoMessage() {} func (*RpcBlockDataviewViewRelationAdd) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 8, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 8, 0} } func (m *RpcBlockDataviewViewRelationAdd) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -60644,7 +62475,7 @@ func (m *RpcBlockDataviewViewRelationAddRequest) Reset() { func (m *RpcBlockDataviewViewRelationAddRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewRelationAddRequest) ProtoMessage() {} func (*RpcBlockDataviewViewRelationAddRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 8, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 8, 0, 0} } func (m *RpcBlockDataviewViewRelationAddRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -60712,7 +62543,7 @@ func (m *RpcBlockDataviewViewRelationAddResponse) Reset() { func (m *RpcBlockDataviewViewRelationAddResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewRelationAddResponse) ProtoMessage() {} func (*RpcBlockDataviewViewRelationAddResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 8, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 8, 0, 1} } func (m *RpcBlockDataviewViewRelationAddResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -60768,7 +62599,7 @@ func (m *RpcBlockDataviewViewRelationAddResponseError) String() string { } func (*RpcBlockDataviewViewRelationAddResponseError) ProtoMessage() {} func (*RpcBlockDataviewViewRelationAddResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 8, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 8, 0, 1, 0} } func (m *RpcBlockDataviewViewRelationAddResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -60818,7 +62649,7 @@ func (m *RpcBlockDataviewViewRelationRemove) Reset() { *m = RpcBlockData func (m *RpcBlockDataviewViewRelationRemove) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewRelationRemove) ProtoMessage() {} func (*RpcBlockDataviewViewRelationRemove) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 8, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 8, 1} } func (m *RpcBlockDataviewViewRelationRemove) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -60862,7 +62693,7 @@ func (m *RpcBlockDataviewViewRelationRemoveRequest) String() string { } func (*RpcBlockDataviewViewRelationRemoveRequest) ProtoMessage() {} func (*RpcBlockDataviewViewRelationRemoveRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 8, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 8, 1, 0} } func (m *RpcBlockDataviewViewRelationRemoveRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -60932,7 +62763,7 @@ func (m *RpcBlockDataviewViewRelationRemoveResponse) String() string { } func (*RpcBlockDataviewViewRelationRemoveResponse) ProtoMessage() {} func (*RpcBlockDataviewViewRelationRemoveResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 8, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 8, 1, 1} } func (m *RpcBlockDataviewViewRelationRemoveResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -60988,7 +62819,7 @@ func (m *RpcBlockDataviewViewRelationRemoveResponseError) String() string { } func (*RpcBlockDataviewViewRelationRemoveResponseError) ProtoMessage() {} func (*RpcBlockDataviewViewRelationRemoveResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 8, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 8, 1, 1, 0} } func (m *RpcBlockDataviewViewRelationRemoveResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -61038,7 +62869,7 @@ func (m *RpcBlockDataviewViewRelationReplace) Reset() { *m = RpcBlockDat func (m *RpcBlockDataviewViewRelationReplace) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewRelationReplace) ProtoMessage() {} func (*RpcBlockDataviewViewRelationReplace) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 8, 2} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 8, 2} } func (m *RpcBlockDataviewViewRelationReplace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -61083,7 +62914,7 @@ func (m *RpcBlockDataviewViewRelationReplaceRequest) String() string { } func (*RpcBlockDataviewViewRelationReplaceRequest) ProtoMessage() {} func (*RpcBlockDataviewViewRelationReplaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 8, 2, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 8, 2, 0} } func (m *RpcBlockDataviewViewRelationReplaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -61160,7 +62991,7 @@ func (m *RpcBlockDataviewViewRelationReplaceResponse) String() string { } func (*RpcBlockDataviewViewRelationReplaceResponse) ProtoMessage() {} func (*RpcBlockDataviewViewRelationReplaceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 8, 2, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 8, 2, 1} } func (m *RpcBlockDataviewViewRelationReplaceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -61216,7 +63047,7 @@ func (m *RpcBlockDataviewViewRelationReplaceResponseError) String() string { } func (*RpcBlockDataviewViewRelationReplaceResponseError) ProtoMessage() {} func (*RpcBlockDataviewViewRelationReplaceResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 8, 2, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 8, 2, 1, 0} } func (m *RpcBlockDataviewViewRelationReplaceResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -61266,7 +63097,7 @@ func (m *RpcBlockDataviewViewRelationSort) Reset() { *m = RpcBlockDatavi func (m *RpcBlockDataviewViewRelationSort) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewRelationSort) ProtoMessage() {} func (*RpcBlockDataviewViewRelationSort) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 8, 3} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 8, 3} } func (m *RpcBlockDataviewViewRelationSort) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -61308,7 +63139,7 @@ func (m *RpcBlockDataviewViewRelationSortRequest) Reset() { func (m *RpcBlockDataviewViewRelationSortRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewRelationSortRequest) ProtoMessage() {} func (*RpcBlockDataviewViewRelationSortRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 8, 3, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 8, 3, 0} } func (m *RpcBlockDataviewViewRelationSortRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -61376,7 +63207,7 @@ func (m *RpcBlockDataviewViewRelationSortResponse) Reset() { func (m *RpcBlockDataviewViewRelationSortResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockDataviewViewRelationSortResponse) ProtoMessage() {} func (*RpcBlockDataviewViewRelationSortResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 8, 3, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 8, 3, 1} } func (m *RpcBlockDataviewViewRelationSortResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -61432,7 +63263,7 @@ func (m *RpcBlockDataviewViewRelationSortResponseError) String() string { } func (*RpcBlockDataviewViewRelationSortResponseError) ProtoMessage() {} func (*RpcBlockDataviewViewRelationSortResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 29, 8, 3, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 8, 3, 1, 0} } func (m *RpcBlockDataviewViewRelationSortResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -61482,7 +63313,7 @@ func (m *RpcBlockWidget) Reset() { *m = RpcBlockWidget{} } func (m *RpcBlockWidget) String() string { return proto.CompactTextString(m) } func (*RpcBlockWidget) ProtoMessage() {} func (*RpcBlockWidget) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 30} + return fileDescriptor_8261c968b2e6f45c, []int{0, 31} } func (m *RpcBlockWidget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -61518,7 +63349,7 @@ func (m *RpcBlockWidgetSetTargetId) Reset() { *m = RpcBlockWidgetSetTarg func (m *RpcBlockWidgetSetTargetId) String() string { return proto.CompactTextString(m) } func (*RpcBlockWidgetSetTargetId) ProtoMessage() {} func (*RpcBlockWidgetSetTargetId) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 0} } func (m *RpcBlockWidgetSetTargetId) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -61557,7 +63388,7 @@ func (m *RpcBlockWidgetSetTargetIdRequest) Reset() { *m = RpcBlockWidget func (m *RpcBlockWidgetSetTargetIdRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockWidgetSetTargetIdRequest) ProtoMessage() {} func (*RpcBlockWidgetSetTargetIdRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 0, 0} } func (m *RpcBlockWidgetSetTargetIdRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -61616,7 +63447,7 @@ func (m *RpcBlockWidgetSetTargetIdResponse) Reset() { *m = RpcBlockWidge func (m *RpcBlockWidgetSetTargetIdResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockWidgetSetTargetIdResponse) ProtoMessage() {} func (*RpcBlockWidgetSetTargetIdResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 0, 1} } func (m *RpcBlockWidgetSetTargetIdResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -61670,7 +63501,7 @@ func (m *RpcBlockWidgetSetTargetIdResponseError) Reset() { func (m *RpcBlockWidgetSetTargetIdResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockWidgetSetTargetIdResponseError) ProtoMessage() {} func (*RpcBlockWidgetSetTargetIdResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 0, 1, 0} } func (m *RpcBlockWidgetSetTargetIdResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -61720,7 +63551,7 @@ func (m *RpcBlockWidgetSetLayout) Reset() { *m = RpcBlockWidgetSetLayout func (m *RpcBlockWidgetSetLayout) String() string { return proto.CompactTextString(m) } func (*RpcBlockWidgetSetLayout) ProtoMessage() {} func (*RpcBlockWidgetSetLayout) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 1} } func (m *RpcBlockWidgetSetLayout) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -61759,7 +63590,7 @@ func (m *RpcBlockWidgetSetLayoutRequest) Reset() { *m = RpcBlockWidgetSe func (m *RpcBlockWidgetSetLayoutRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockWidgetSetLayoutRequest) ProtoMessage() {} func (*RpcBlockWidgetSetLayoutRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 1, 0} } func (m *RpcBlockWidgetSetLayoutRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -61818,7 +63649,7 @@ func (m *RpcBlockWidgetSetLayoutResponse) Reset() { *m = RpcBlockWidgetS func (m *RpcBlockWidgetSetLayoutResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockWidgetSetLayoutResponse) ProtoMessage() {} func (*RpcBlockWidgetSetLayoutResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 1, 1} } func (m *RpcBlockWidgetSetLayoutResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -61870,7 +63701,7 @@ func (m *RpcBlockWidgetSetLayoutResponseError) Reset() { *m = RpcBlockWi func (m *RpcBlockWidgetSetLayoutResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockWidgetSetLayoutResponseError) ProtoMessage() {} func (*RpcBlockWidgetSetLayoutResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 1, 1, 0} } func (m *RpcBlockWidgetSetLayoutResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -61920,7 +63751,7 @@ func (m *RpcBlockWidgetSetLimit) Reset() { *m = RpcBlockWidgetSetLimit{} func (m *RpcBlockWidgetSetLimit) String() string { return proto.CompactTextString(m) } func (*RpcBlockWidgetSetLimit) ProtoMessage() {} func (*RpcBlockWidgetSetLimit) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 2} + return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 2} } func (m *RpcBlockWidgetSetLimit) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -61959,7 +63790,7 @@ func (m *RpcBlockWidgetSetLimitRequest) Reset() { *m = RpcBlockWidgetSet func (m *RpcBlockWidgetSetLimitRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockWidgetSetLimitRequest) ProtoMessage() {} func (*RpcBlockWidgetSetLimitRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 2, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 2, 0} } func (m *RpcBlockWidgetSetLimitRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -62018,7 +63849,7 @@ func (m *RpcBlockWidgetSetLimitResponse) Reset() { *m = RpcBlockWidgetSe func (m *RpcBlockWidgetSetLimitResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockWidgetSetLimitResponse) ProtoMessage() {} func (*RpcBlockWidgetSetLimitResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 2, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 2, 1} } func (m *RpcBlockWidgetSetLimitResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -62070,7 +63901,7 @@ func (m *RpcBlockWidgetSetLimitResponseError) Reset() { *m = RpcBlockWid func (m *RpcBlockWidgetSetLimitResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockWidgetSetLimitResponseError) ProtoMessage() {} func (*RpcBlockWidgetSetLimitResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 2, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 2, 1, 0} } func (m *RpcBlockWidgetSetLimitResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -62120,7 +63951,7 @@ func (m *RpcBlockWidgetSetViewId) Reset() { *m = RpcBlockWidgetSetViewId func (m *RpcBlockWidgetSetViewId) String() string { return proto.CompactTextString(m) } func (*RpcBlockWidgetSetViewId) ProtoMessage() {} func (*RpcBlockWidgetSetViewId) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 3} + return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 3} } func (m *RpcBlockWidgetSetViewId) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -62159,7 +63990,7 @@ func (m *RpcBlockWidgetSetViewIdRequest) Reset() { *m = RpcBlockWidgetSe func (m *RpcBlockWidgetSetViewIdRequest) String() string { return proto.CompactTextString(m) } func (*RpcBlockWidgetSetViewIdRequest) ProtoMessage() {} func (*RpcBlockWidgetSetViewIdRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 3, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 3, 0} } func (m *RpcBlockWidgetSetViewIdRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -62218,7 +64049,7 @@ func (m *RpcBlockWidgetSetViewIdResponse) Reset() { *m = RpcBlockWidgetS func (m *RpcBlockWidgetSetViewIdResponse) String() string { return proto.CompactTextString(m) } func (*RpcBlockWidgetSetViewIdResponse) ProtoMessage() {} func (*RpcBlockWidgetSetViewIdResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 3, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 3, 1} } func (m *RpcBlockWidgetSetViewIdResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -62270,7 +64101,7 @@ func (m *RpcBlockWidgetSetViewIdResponseError) Reset() { *m = RpcBlockWi func (m *RpcBlockWidgetSetViewIdResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBlockWidgetSetViewIdResponseError) ProtoMessage() {} func (*RpcBlockWidgetSetViewIdResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 30, 3, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 3, 1, 0} } func (m *RpcBlockWidgetSetViewIdResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -62320,7 +64151,7 @@ func (m *RpcDebug) Reset() { *m = RpcDebug{} } func (m *RpcDebug) String() string { return proto.CompactTextString(m) } func (*RpcDebug) ProtoMessage() {} func (*RpcDebug) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32} } func (m *RpcDebug) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -62358,7 +64189,7 @@ func (m *RpcDebugTreeInfo) Reset() { *m = RpcDebugTreeInfo{} } func (m *RpcDebugTreeInfo) String() string { return proto.CompactTextString(m) } func (*RpcDebugTreeInfo) ProtoMessage() {} func (*RpcDebugTreeInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 0} } func (m *RpcDebugTreeInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -62408,7 +64239,7 @@ func (m *RpcDebugStat) Reset() { *m = RpcDebugStat{} } func (m *RpcDebugStat) String() string { return proto.CompactTextString(m) } func (*RpcDebugStat) ProtoMessage() {} func (*RpcDebugStat) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 1} } func (m *RpcDebugStat) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -62444,7 +64275,7 @@ func (m *RpcDebugStatRequest) Reset() { *m = RpcDebugStatRequest{} } func (m *RpcDebugStatRequest) String() string { return proto.CompactTextString(m) } func (*RpcDebugStatRequest) ProtoMessage() {} func (*RpcDebugStatRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 1, 0} } func (m *RpcDebugStatRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -62482,7 +64313,7 @@ func (m *RpcDebugStatResponse) Reset() { *m = RpcDebugStatResponse{} } func (m *RpcDebugStatResponse) String() string { return proto.CompactTextString(m) } func (*RpcDebugStatResponse) ProtoMessage() {} func (*RpcDebugStatResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 1, 1} } func (m *RpcDebugStatResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -62534,7 +64365,7 @@ func (m *RpcDebugStatResponseError) Reset() { *m = RpcDebugStatResponseE func (m *RpcDebugStatResponseError) String() string { return proto.CompactTextString(m) } func (*RpcDebugStatResponseError) ProtoMessage() {} func (*RpcDebugStatResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 1, 1, 0} } func (m *RpcDebugStatResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -62584,7 +64415,7 @@ func (m *RpcDebugTreeHeads) Reset() { *m = RpcDebugTreeHeads{} } func (m *RpcDebugTreeHeads) String() string { return proto.CompactTextString(m) } func (*RpcDebugTreeHeads) ProtoMessage() {} func (*RpcDebugTreeHeads) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 2} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 2} } func (m *RpcDebugTreeHeads) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -62621,7 +64452,7 @@ func (m *RpcDebugTreeHeadsRequest) Reset() { *m = RpcDebugTreeHeadsReque func (m *RpcDebugTreeHeadsRequest) String() string { return proto.CompactTextString(m) } func (*RpcDebugTreeHeadsRequest) ProtoMessage() {} func (*RpcDebugTreeHeadsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 2, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 2, 0} } func (m *RpcDebugTreeHeadsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -62667,7 +64498,7 @@ func (m *RpcDebugTreeHeadsResponse) Reset() { *m = RpcDebugTreeHeadsResp func (m *RpcDebugTreeHeadsResponse) String() string { return proto.CompactTextString(m) } func (*RpcDebugTreeHeadsResponse) ProtoMessage() {} func (*RpcDebugTreeHeadsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 2, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 2, 1} } func (m *RpcDebugTreeHeadsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -62726,7 +64557,7 @@ func (m *RpcDebugTreeHeadsResponseError) Reset() { *m = RpcDebugTreeHead func (m *RpcDebugTreeHeadsResponseError) String() string { return proto.CompactTextString(m) } func (*RpcDebugTreeHeadsResponseError) ProtoMessage() {} func (*RpcDebugTreeHeadsResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 2, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 2, 1, 0} } func (m *RpcDebugTreeHeadsResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -62776,7 +64607,7 @@ func (m *RpcDebugTree) Reset() { *m = RpcDebugTree{} } func (m *RpcDebugTree) String() string { return proto.CompactTextString(m) } func (*RpcDebugTree) ProtoMessage() {} func (*RpcDebugTree) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 3} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 3} } func (m *RpcDebugTree) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -62816,7 +64647,7 @@ func (m *RpcDebugTreeRequest) Reset() { *m = RpcDebugTreeRequest{} } func (m *RpcDebugTreeRequest) String() string { return proto.CompactTextString(m) } func (*RpcDebugTreeRequest) ProtoMessage() {} func (*RpcDebugTreeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 3, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 3, 0} } func (m *RpcDebugTreeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -62882,7 +64713,7 @@ func (m *RpcDebugTreeResponse) Reset() { *m = RpcDebugTreeResponse{} } func (m *RpcDebugTreeResponse) String() string { return proto.CompactTextString(m) } func (*RpcDebugTreeResponse) ProtoMessage() {} func (*RpcDebugTreeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 3, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 3, 1} } func (m *RpcDebugTreeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -62934,7 +64765,7 @@ func (m *RpcDebugTreeResponseError) Reset() { *m = RpcDebugTreeResponseE func (m *RpcDebugTreeResponseError) String() string { return proto.CompactTextString(m) } func (*RpcDebugTreeResponseError) ProtoMessage() {} func (*RpcDebugTreeResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 3, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 3, 1, 0} } func (m *RpcDebugTreeResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -62984,7 +64815,7 @@ func (m *RpcDebugSpaceSummary) Reset() { *m = RpcDebugSpaceSummary{} } func (m *RpcDebugSpaceSummary) String() string { return proto.CompactTextString(m) } func (*RpcDebugSpaceSummary) ProtoMessage() {} func (*RpcDebugSpaceSummary) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 4} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 4} } func (m *RpcDebugSpaceSummary) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -63021,7 +64852,7 @@ func (m *RpcDebugSpaceSummaryRequest) Reset() { *m = RpcDebugSpaceSummar func (m *RpcDebugSpaceSummaryRequest) String() string { return proto.CompactTextString(m) } func (*RpcDebugSpaceSummaryRequest) ProtoMessage() {} func (*RpcDebugSpaceSummaryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 4, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 4, 0} } func (m *RpcDebugSpaceSummaryRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -63067,7 +64898,7 @@ func (m *RpcDebugSpaceSummaryResponse) Reset() { *m = RpcDebugSpaceSumma func (m *RpcDebugSpaceSummaryResponse) String() string { return proto.CompactTextString(m) } func (*RpcDebugSpaceSummaryResponse) ProtoMessage() {} func (*RpcDebugSpaceSummaryResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 4, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 4, 1} } func (m *RpcDebugSpaceSummaryResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -63126,7 +64957,7 @@ func (m *RpcDebugSpaceSummaryResponseError) Reset() { *m = RpcDebugSpace func (m *RpcDebugSpaceSummaryResponseError) String() string { return proto.CompactTextString(m) } func (*RpcDebugSpaceSummaryResponseError) ProtoMessage() {} func (*RpcDebugSpaceSummaryResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 4, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 4, 1, 0} } func (m *RpcDebugSpaceSummaryResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -63176,7 +65007,7 @@ func (m *RpcDebugStackGoroutines) Reset() { *m = RpcDebugStackGoroutines func (m *RpcDebugStackGoroutines) String() string { return proto.CompactTextString(m) } func (*RpcDebugStackGoroutines) ProtoMessage() {} func (*RpcDebugStackGoroutines) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 5} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 5} } func (m *RpcDebugStackGoroutines) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -63213,7 +65044,7 @@ func (m *RpcDebugStackGoroutinesRequest) Reset() { *m = RpcDebugStackGor func (m *RpcDebugStackGoroutinesRequest) String() string { return proto.CompactTextString(m) } func (*RpcDebugStackGoroutinesRequest) ProtoMessage() {} func (*RpcDebugStackGoroutinesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 5, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 5, 0} } func (m *RpcDebugStackGoroutinesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -63257,7 +65088,7 @@ func (m *RpcDebugStackGoroutinesResponse) Reset() { *m = RpcDebugStackGo func (m *RpcDebugStackGoroutinesResponse) String() string { return proto.CompactTextString(m) } func (*RpcDebugStackGoroutinesResponse) ProtoMessage() {} func (*RpcDebugStackGoroutinesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 5, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 5, 1} } func (m *RpcDebugStackGoroutinesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -63302,7 +65133,7 @@ func (m *RpcDebugStackGoroutinesResponseError) Reset() { *m = RpcDebugSt func (m *RpcDebugStackGoroutinesResponseError) String() string { return proto.CompactTextString(m) } func (*RpcDebugStackGoroutinesResponseError) ProtoMessage() {} func (*RpcDebugStackGoroutinesResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 5, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 5, 1, 0} } func (m *RpcDebugStackGoroutinesResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -63352,7 +65183,7 @@ func (m *RpcDebugExportLocalstore) Reset() { *m = RpcDebugExportLocalsto func (m *RpcDebugExportLocalstore) String() string { return proto.CompactTextString(m) } func (*RpcDebugExportLocalstore) ProtoMessage() {} func (*RpcDebugExportLocalstore) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 6} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 6} } func (m *RpcDebugExportLocalstore) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -63393,7 +65224,7 @@ func (m *RpcDebugExportLocalstoreRequest) Reset() { *m = RpcDebugExportL func (m *RpcDebugExportLocalstoreRequest) String() string { return proto.CompactTextString(m) } func (*RpcDebugExportLocalstoreRequest) ProtoMessage() {} func (*RpcDebugExportLocalstoreRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 6, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 6, 0} } func (m *RpcDebugExportLocalstoreRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -63453,7 +65284,7 @@ func (m *RpcDebugExportLocalstoreResponse) Reset() { *m = RpcDebugExport func (m *RpcDebugExportLocalstoreResponse) String() string { return proto.CompactTextString(m) } func (*RpcDebugExportLocalstoreResponse) ProtoMessage() {} func (*RpcDebugExportLocalstoreResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 6, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 6, 1} } func (m *RpcDebugExportLocalstoreResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -63512,7 +65343,7 @@ func (m *RpcDebugExportLocalstoreResponseError) Reset() { *m = RpcDebugE func (m *RpcDebugExportLocalstoreResponseError) String() string { return proto.CompactTextString(m) } func (*RpcDebugExportLocalstoreResponseError) ProtoMessage() {} func (*RpcDebugExportLocalstoreResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 6, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 6, 1, 0} } func (m *RpcDebugExportLocalstoreResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -63562,7 +65393,7 @@ func (m *RpcDebugSubscriptions) Reset() { *m = RpcDebugSubscriptions{} } func (m *RpcDebugSubscriptions) String() string { return proto.CompactTextString(m) } func (*RpcDebugSubscriptions) ProtoMessage() {} func (*RpcDebugSubscriptions) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 7} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 7} } func (m *RpcDebugSubscriptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -63598,7 +65429,7 @@ func (m *RpcDebugSubscriptionsRequest) Reset() { *m = RpcDebugSubscripti func (m *RpcDebugSubscriptionsRequest) String() string { return proto.CompactTextString(m) } func (*RpcDebugSubscriptionsRequest) ProtoMessage() {} func (*RpcDebugSubscriptionsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 7, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 7, 0} } func (m *RpcDebugSubscriptionsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -63636,7 +65467,7 @@ func (m *RpcDebugSubscriptionsResponse) Reset() { *m = RpcDebugSubscript func (m *RpcDebugSubscriptionsResponse) String() string { return proto.CompactTextString(m) } func (*RpcDebugSubscriptionsResponse) ProtoMessage() {} func (*RpcDebugSubscriptionsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 7, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 7, 1} } func (m *RpcDebugSubscriptionsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -63688,7 +65519,7 @@ func (m *RpcDebugSubscriptionsResponseError) Reset() { *m = RpcDebugSubs func (m *RpcDebugSubscriptionsResponseError) String() string { return proto.CompactTextString(m) } func (*RpcDebugSubscriptionsResponseError) ProtoMessage() {} func (*RpcDebugSubscriptionsResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 7, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 7, 1, 0} } func (m *RpcDebugSubscriptionsResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -63738,7 +65569,7 @@ func (m *RpcDebugOpenedObjects) Reset() { *m = RpcDebugOpenedObjects{} } func (m *RpcDebugOpenedObjects) String() string { return proto.CompactTextString(m) } func (*RpcDebugOpenedObjects) ProtoMessage() {} func (*RpcDebugOpenedObjects) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 8} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 8} } func (m *RpcDebugOpenedObjects) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -63774,7 +65605,7 @@ func (m *RpcDebugOpenedObjectsRequest) Reset() { *m = RpcDebugOpenedObje func (m *RpcDebugOpenedObjectsRequest) String() string { return proto.CompactTextString(m) } func (*RpcDebugOpenedObjectsRequest) ProtoMessage() {} func (*RpcDebugOpenedObjectsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 8, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 8, 0} } func (m *RpcDebugOpenedObjectsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -63812,7 +65643,7 @@ func (m *RpcDebugOpenedObjectsResponse) Reset() { *m = RpcDebugOpenedObj func (m *RpcDebugOpenedObjectsResponse) String() string { return proto.CompactTextString(m) } func (*RpcDebugOpenedObjectsResponse) ProtoMessage() {} func (*RpcDebugOpenedObjectsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 8, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 8, 1} } func (m *RpcDebugOpenedObjectsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -63864,7 +65695,7 @@ func (m *RpcDebugOpenedObjectsResponseError) Reset() { *m = RpcDebugOpen func (m *RpcDebugOpenedObjectsResponseError) String() string { return proto.CompactTextString(m) } func (*RpcDebugOpenedObjectsResponseError) ProtoMessage() {} func (*RpcDebugOpenedObjectsResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 8, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 8, 1, 0} } func (m *RpcDebugOpenedObjectsResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -63914,7 +65745,7 @@ func (m *RpcDebugRunProfiler) Reset() { *m = RpcDebugRunProfiler{} } func (m *RpcDebugRunProfiler) String() string { return proto.CompactTextString(m) } func (*RpcDebugRunProfiler) ProtoMessage() {} func (*RpcDebugRunProfiler) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 9} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 9} } func (m *RpcDebugRunProfiler) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -63951,7 +65782,7 @@ func (m *RpcDebugRunProfilerRequest) Reset() { *m = RpcDebugRunProfilerR func (m *RpcDebugRunProfilerRequest) String() string { return proto.CompactTextString(m) } func (*RpcDebugRunProfilerRequest) ProtoMessage() {} func (*RpcDebugRunProfilerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 9, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 9, 0} } func (m *RpcDebugRunProfilerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -63996,7 +65827,7 @@ func (m *RpcDebugRunProfilerResponse) Reset() { *m = RpcDebugRunProfiler func (m *RpcDebugRunProfilerResponse) String() string { return proto.CompactTextString(m) } func (*RpcDebugRunProfilerResponse) ProtoMessage() {} func (*RpcDebugRunProfilerResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 9, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 9, 1} } func (m *RpcDebugRunProfilerResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64048,7 +65879,7 @@ func (m *RpcDebugRunProfilerResponseError) Reset() { *m = RpcDebugRunPro func (m *RpcDebugRunProfilerResponseError) String() string { return proto.CompactTextString(m) } func (*RpcDebugRunProfilerResponseError) ProtoMessage() {} func (*RpcDebugRunProfilerResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 9, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 9, 1, 0} } func (m *RpcDebugRunProfilerResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64098,7 +65929,7 @@ func (m *RpcDebugAccountSelectTrace) Reset() { *m = RpcDebugAccountSelec func (m *RpcDebugAccountSelectTrace) String() string { return proto.CompactTextString(m) } func (*RpcDebugAccountSelectTrace) ProtoMessage() {} func (*RpcDebugAccountSelectTrace) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 10} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 10} } func (m *RpcDebugAccountSelectTrace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64135,7 +65966,7 @@ func (m *RpcDebugAccountSelectTraceRequest) Reset() { *m = RpcDebugAccou func (m *RpcDebugAccountSelectTraceRequest) String() string { return proto.CompactTextString(m) } func (*RpcDebugAccountSelectTraceRequest) ProtoMessage() {} func (*RpcDebugAccountSelectTraceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 10, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 10, 0} } func (m *RpcDebugAccountSelectTraceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64180,7 +66011,7 @@ func (m *RpcDebugAccountSelectTraceResponse) Reset() { *m = RpcDebugAcco func (m *RpcDebugAccountSelectTraceResponse) String() string { return proto.CompactTextString(m) } func (*RpcDebugAccountSelectTraceResponse) ProtoMessage() {} func (*RpcDebugAccountSelectTraceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 10, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 10, 1} } func (m *RpcDebugAccountSelectTraceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64234,7 +66065,7 @@ func (m *RpcDebugAccountSelectTraceResponseError) Reset() { func (m *RpcDebugAccountSelectTraceResponseError) String() string { return proto.CompactTextString(m) } func (*RpcDebugAccountSelectTraceResponseError) ProtoMessage() {} func (*RpcDebugAccountSelectTraceResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 10, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 10, 1, 0} } func (m *RpcDebugAccountSelectTraceResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64284,7 +66115,7 @@ func (m *RpcDebugExportLog) Reset() { *m = RpcDebugExportLog{} } func (m *RpcDebugExportLog) String() string { return proto.CompactTextString(m) } func (*RpcDebugExportLog) ProtoMessage() {} func (*RpcDebugExportLog) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 11} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 11} } func (m *RpcDebugExportLog) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64321,7 +66152,7 @@ func (m *RpcDebugExportLogRequest) Reset() { *m = RpcDebugExportLogReque func (m *RpcDebugExportLogRequest) String() string { return proto.CompactTextString(m) } func (*RpcDebugExportLogRequest) ProtoMessage() {} func (*RpcDebugExportLogRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 11, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 11, 0} } func (m *RpcDebugExportLogRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64366,7 +66197,7 @@ func (m *RpcDebugExportLogResponse) Reset() { *m = RpcDebugExportLogResp func (m *RpcDebugExportLogResponse) String() string { return proto.CompactTextString(m) } func (*RpcDebugExportLogResponse) ProtoMessage() {} func (*RpcDebugExportLogResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 11, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 11, 1} } func (m *RpcDebugExportLogResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64418,7 +66249,7 @@ func (m *RpcDebugExportLogResponseError) Reset() { *m = RpcDebugExportLo func (m *RpcDebugExportLogResponseError) String() string { return proto.CompactTextString(m) } func (*RpcDebugExportLogResponseError) ProtoMessage() {} func (*RpcDebugExportLogResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 11, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 11, 1, 0} } func (m *RpcDebugExportLogResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64468,7 +66299,7 @@ func (m *RpcDebugPing) Reset() { *m = RpcDebugPing{} } func (m *RpcDebugPing) String() string { return proto.CompactTextString(m) } func (*RpcDebugPing) ProtoMessage() {} func (*RpcDebugPing) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 12} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 12} } func (m *RpcDebugPing) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64506,7 +66337,7 @@ func (m *RpcDebugPingRequest) Reset() { *m = RpcDebugPingRequest{} } func (m *RpcDebugPingRequest) String() string { return proto.CompactTextString(m) } func (*RpcDebugPingRequest) ProtoMessage() {} func (*RpcDebugPingRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 12, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 12, 0} } func (m *RpcDebugPingRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64558,7 +66389,7 @@ func (m *RpcDebugPingResponse) Reset() { *m = RpcDebugPingResponse{} } func (m *RpcDebugPingResponse) String() string { return proto.CompactTextString(m) } func (*RpcDebugPingResponse) ProtoMessage() {} func (*RpcDebugPingResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 12, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 12, 1} } func (m *RpcDebugPingResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64610,7 +66441,7 @@ func (m *RpcDebugPingResponseError) Reset() { *m = RpcDebugPingResponseE func (m *RpcDebugPingResponseError) String() string { return proto.CompactTextString(m) } func (*RpcDebugPingResponseError) ProtoMessage() {} func (*RpcDebugPingResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 12, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 12, 1, 0} } func (m *RpcDebugPingResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64660,7 +66491,7 @@ func (m *RpcDebugAnystoreObjectChanges) Reset() { *m = RpcDebugAnystoreO func (m *RpcDebugAnystoreObjectChanges) String() string { return proto.CompactTextString(m) } func (*RpcDebugAnystoreObjectChanges) ProtoMessage() {} func (*RpcDebugAnystoreObjectChanges) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 13} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 13} } func (m *RpcDebugAnystoreObjectChanges) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64698,7 +66529,7 @@ func (m *RpcDebugAnystoreObjectChangesRequest) Reset() { *m = RpcDebugAn func (m *RpcDebugAnystoreObjectChangesRequest) String() string { return proto.CompactTextString(m) } func (*RpcDebugAnystoreObjectChangesRequest) ProtoMessage() {} func (*RpcDebugAnystoreObjectChangesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 13, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 13, 0} } func (m *RpcDebugAnystoreObjectChangesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64751,7 +66582,7 @@ func (m *RpcDebugAnystoreObjectChangesResponse) Reset() { *m = RpcDebugA func (m *RpcDebugAnystoreObjectChangesResponse) String() string { return proto.CompactTextString(m) } func (*RpcDebugAnystoreObjectChangesResponse) ProtoMessage() {} func (*RpcDebugAnystoreObjectChangesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 13, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 13, 1} } func (m *RpcDebugAnystoreObjectChangesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64816,7 +66647,7 @@ func (m *RpcDebugAnystoreObjectChangesResponseChange) String() string { } func (*RpcDebugAnystoreObjectChangesResponseChange) ProtoMessage() {} func (*RpcDebugAnystoreObjectChangesResponseChange) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 13, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 13, 1, 0} } func (m *RpcDebugAnystoreObjectChangesResponseChange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64886,7 +66717,7 @@ func (m *RpcDebugAnystoreObjectChangesResponseError) String() string { } func (*RpcDebugAnystoreObjectChangesResponseError) ProtoMessage() {} func (*RpcDebugAnystoreObjectChangesResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 13, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 13, 1, 1} } func (m *RpcDebugAnystoreObjectChangesResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64936,7 +66767,7 @@ func (m *RpcDebugNetCheck) Reset() { *m = RpcDebugNetCheck{} } func (m *RpcDebugNetCheck) String() string { return proto.CompactTextString(m) } func (*RpcDebugNetCheck) ProtoMessage() {} func (*RpcDebugNetCheck) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 14} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 14} } func (m *RpcDebugNetCheck) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64973,7 +66804,7 @@ func (m *RpcDebugNetCheckRequest) Reset() { *m = RpcDebugNetCheckRequest func (m *RpcDebugNetCheckRequest) String() string { return proto.CompactTextString(m) } func (*RpcDebugNetCheckRequest) ProtoMessage() {} func (*RpcDebugNetCheckRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 14, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 14, 0} } func (m *RpcDebugNetCheckRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -65018,7 +66849,7 @@ func (m *RpcDebugNetCheckResponse) Reset() { *m = RpcDebugNetCheckRespon func (m *RpcDebugNetCheckResponse) String() string { return proto.CompactTextString(m) } func (*RpcDebugNetCheckResponse) ProtoMessage() {} func (*RpcDebugNetCheckResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 14, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 14, 1} } func (m *RpcDebugNetCheckResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -65070,7 +66901,7 @@ func (m *RpcDebugNetCheckResponseError) Reset() { *m = RpcDebugNetCheckR func (m *RpcDebugNetCheckResponseError) String() string { return proto.CompactTextString(m) } func (*RpcDebugNetCheckResponseError) ProtoMessage() {} func (*RpcDebugNetCheckResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 31, 14, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 14, 1, 0} } func (m *RpcDebugNetCheckResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -65120,7 +66951,7 @@ func (m *RpcInitial) Reset() { *m = RpcInitial{} } func (m *RpcInitial) String() string { return proto.CompactTextString(m) } func (*RpcInitial) ProtoMessage() {} func (*RpcInitial) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 32} + return fileDescriptor_8261c968b2e6f45c, []int{0, 33} } func (m *RpcInitial) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -65156,7 +66987,7 @@ func (m *RpcInitialSetParameters) Reset() { *m = RpcInitialSetParameters func (m *RpcInitialSetParameters) String() string { return proto.CompactTextString(m) } func (*RpcInitialSetParameters) ProtoMessage() {} func (*RpcInitialSetParameters) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 33, 0} } func (m *RpcInitialSetParameters) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -65199,7 +67030,7 @@ func (m *RpcInitialSetParametersRequest) Reset() { *m = RpcInitialSetPar func (m *RpcInitialSetParametersRequest) String() string { return proto.CompactTextString(m) } func (*RpcInitialSetParametersRequest) ProtoMessage() {} func (*RpcInitialSetParametersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 33, 0, 0} } func (m *RpcInitialSetParametersRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -65285,7 +67116,7 @@ func (m *RpcInitialSetParametersResponse) Reset() { *m = RpcInitialSetPa func (m *RpcInitialSetParametersResponse) String() string { return proto.CompactTextString(m) } func (*RpcInitialSetParametersResponse) ProtoMessage() {} func (*RpcInitialSetParametersResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 33, 0, 1} } func (m *RpcInitialSetParametersResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -65330,7 +67161,7 @@ func (m *RpcInitialSetParametersResponseError) Reset() { *m = RpcInitial func (m *RpcInitialSetParametersResponseError) String() string { return proto.CompactTextString(m) } func (*RpcInitialSetParametersResponseError) ProtoMessage() {} func (*RpcInitialSetParametersResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 32, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 33, 0, 1, 0} } func (m *RpcInitialSetParametersResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -65380,7 +67211,7 @@ func (m *RpcLog) Reset() { *m = RpcLog{} } func (m *RpcLog) String() string { return proto.CompactTextString(m) } func (*RpcLog) ProtoMessage() {} func (*RpcLog) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 33} + return fileDescriptor_8261c968b2e6f45c, []int{0, 34} } func (m *RpcLog) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -65416,7 +67247,7 @@ func (m *RpcLogSend) Reset() { *m = RpcLogSend{} } func (m *RpcLogSend) String() string { return proto.CompactTextString(m) } func (*RpcLogSend) ProtoMessage() {} func (*RpcLogSend) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 33, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 34, 0} } func (m *RpcLogSend) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -65454,7 +67285,7 @@ func (m *RpcLogSendRequest) Reset() { *m = RpcLogSendRequest{} } func (m *RpcLogSendRequest) String() string { return proto.CompactTextString(m) } func (*RpcLogSendRequest) ProtoMessage() {} func (*RpcLogSendRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 33, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 34, 0, 0} } func (m *RpcLogSendRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -65505,7 +67336,7 @@ func (m *RpcLogSendResponse) Reset() { *m = RpcLogSendResponse{} } func (m *RpcLogSendResponse) String() string { return proto.CompactTextString(m) } func (*RpcLogSendResponse) ProtoMessage() {} func (*RpcLogSendResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 33, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 34, 0, 1} } func (m *RpcLogSendResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -65550,7 +67381,7 @@ func (m *RpcLogSendResponseError) Reset() { *m = RpcLogSendResponseError func (m *RpcLogSendResponseError) String() string { return proto.CompactTextString(m) } func (*RpcLogSendResponseError) ProtoMessage() {} func (*RpcLogSendResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 33, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 34, 0, 1, 0} } func (m *RpcLogSendResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -65600,7 +67431,7 @@ func (m *RpcProcess) Reset() { *m = RpcProcess{} } func (m *RpcProcess) String() string { return proto.CompactTextString(m) } func (*RpcProcess) ProtoMessage() {} func (*RpcProcess) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 34} + return fileDescriptor_8261c968b2e6f45c, []int{0, 35} } func (m *RpcProcess) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -65636,7 +67467,7 @@ func (m *RpcProcessCancel) Reset() { *m = RpcProcessCancel{} } func (m *RpcProcessCancel) String() string { return proto.CompactTextString(m) } func (*RpcProcessCancel) ProtoMessage() {} func (*RpcProcessCancel) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 34, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 35, 0} } func (m *RpcProcessCancel) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -65673,7 +67504,7 @@ func (m *RpcProcessCancelRequest) Reset() { *m = RpcProcessCancelRequest func (m *RpcProcessCancelRequest) String() string { return proto.CompactTextString(m) } func (*RpcProcessCancelRequest) ProtoMessage() {} func (*RpcProcessCancelRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 34, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 35, 0, 0} } func (m *RpcProcessCancelRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -65717,7 +67548,7 @@ func (m *RpcProcessCancelResponse) Reset() { *m = RpcProcessCancelRespon func (m *RpcProcessCancelResponse) String() string { return proto.CompactTextString(m) } func (*RpcProcessCancelResponse) ProtoMessage() {} func (*RpcProcessCancelResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 34, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 35, 0, 1} } func (m *RpcProcessCancelResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -65762,7 +67593,7 @@ func (m *RpcProcessCancelResponseError) Reset() { *m = RpcProcessCancelR func (m *RpcProcessCancelResponseError) String() string { return proto.CompactTextString(m) } func (*RpcProcessCancelResponseError) ProtoMessage() {} func (*RpcProcessCancelResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 34, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 35, 0, 1, 0} } func (m *RpcProcessCancelResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -65812,7 +67643,7 @@ func (m *RpcProcessSubscribe) Reset() { *m = RpcProcessSubscribe{} } func (m *RpcProcessSubscribe) String() string { return proto.CompactTextString(m) } func (*RpcProcessSubscribe) ProtoMessage() {} func (*RpcProcessSubscribe) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 34, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 35, 1} } func (m *RpcProcessSubscribe) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -65848,7 +67679,7 @@ func (m *RpcProcessSubscribeRequest) Reset() { *m = RpcProcessSubscribeR func (m *RpcProcessSubscribeRequest) String() string { return proto.CompactTextString(m) } func (*RpcProcessSubscribeRequest) ProtoMessage() {} func (*RpcProcessSubscribeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 34, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 35, 1, 0} } func (m *RpcProcessSubscribeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -65885,7 +67716,7 @@ func (m *RpcProcessSubscribeResponse) Reset() { *m = RpcProcessSubscribe func (m *RpcProcessSubscribeResponse) String() string { return proto.CompactTextString(m) } func (*RpcProcessSubscribeResponse) ProtoMessage() {} func (*RpcProcessSubscribeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 34, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 35, 1, 1} } func (m *RpcProcessSubscribeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -65930,7 +67761,7 @@ func (m *RpcProcessSubscribeResponseError) Reset() { *m = RpcProcessSubs func (m *RpcProcessSubscribeResponseError) String() string { return proto.CompactTextString(m) } func (*RpcProcessSubscribeResponseError) ProtoMessage() {} func (*RpcProcessSubscribeResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 34, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 35, 1, 1, 0} } func (m *RpcProcessSubscribeResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -65980,7 +67811,7 @@ func (m *RpcProcessUnsubscribe) Reset() { *m = RpcProcessUnsubscribe{} } func (m *RpcProcessUnsubscribe) String() string { return proto.CompactTextString(m) } func (*RpcProcessUnsubscribe) ProtoMessage() {} func (*RpcProcessUnsubscribe) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 34, 2} + return fileDescriptor_8261c968b2e6f45c, []int{0, 35, 2} } func (m *RpcProcessUnsubscribe) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -66016,7 +67847,7 @@ func (m *RpcProcessUnsubscribeRequest) Reset() { *m = RpcProcessUnsubscr func (m *RpcProcessUnsubscribeRequest) String() string { return proto.CompactTextString(m) } func (*RpcProcessUnsubscribeRequest) ProtoMessage() {} func (*RpcProcessUnsubscribeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 34, 2, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 35, 2, 0} } func (m *RpcProcessUnsubscribeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -66053,7 +67884,7 @@ func (m *RpcProcessUnsubscribeResponse) Reset() { *m = RpcProcessUnsubsc func (m *RpcProcessUnsubscribeResponse) String() string { return proto.CompactTextString(m) } func (*RpcProcessUnsubscribeResponse) ProtoMessage() {} func (*RpcProcessUnsubscribeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 34, 2, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 35, 2, 1} } func (m *RpcProcessUnsubscribeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -66098,7 +67929,7 @@ func (m *RpcProcessUnsubscribeResponseError) Reset() { *m = RpcProcessUn func (m *RpcProcessUnsubscribeResponseError) String() string { return proto.CompactTextString(m) } func (*RpcProcessUnsubscribeResponseError) ProtoMessage() {} func (*RpcProcessUnsubscribeResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 34, 2, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 35, 2, 1, 0} } func (m *RpcProcessUnsubscribeResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -66149,7 +67980,7 @@ func (m *RpcGenericErrorResponse) Reset() { *m = RpcGenericErrorResponse func (m *RpcGenericErrorResponse) String() string { return proto.CompactTextString(m) } func (*RpcGenericErrorResponse) ProtoMessage() {} func (*RpcGenericErrorResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 35} + return fileDescriptor_8261c968b2e6f45c, []int{0, 36} } func (m *RpcGenericErrorResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -66194,7 +68025,7 @@ func (m *RpcGenericErrorResponseError) Reset() { *m = RpcGenericErrorRes func (m *RpcGenericErrorResponseError) String() string { return proto.CompactTextString(m) } func (*RpcGenericErrorResponseError) ProtoMessage() {} func (*RpcGenericErrorResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 35, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 36, 0} } func (m *RpcGenericErrorResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -66244,7 +68075,7 @@ func (m *RpcNotification) Reset() { *m = RpcNotification{} } func (m *RpcNotification) String() string { return proto.CompactTextString(m) } func (*RpcNotification) ProtoMessage() {} func (*RpcNotification) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 36} + return fileDescriptor_8261c968b2e6f45c, []int{0, 37} } func (m *RpcNotification) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -66280,7 +68111,7 @@ func (m *RpcNotificationList) Reset() { *m = RpcNotificationList{} } func (m *RpcNotificationList) String() string { return proto.CompactTextString(m) } func (*RpcNotificationList) ProtoMessage() {} func (*RpcNotificationList) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 36, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 0} } func (m *RpcNotificationList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -66318,7 +68149,7 @@ func (m *RpcNotificationListRequest) Reset() { *m = RpcNotificationListR func (m *RpcNotificationListRequest) String() string { return proto.CompactTextString(m) } func (*RpcNotificationListRequest) ProtoMessage() {} func (*RpcNotificationListRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 36, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 0, 0} } func (m *RpcNotificationListRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -66370,7 +68201,7 @@ func (m *RpcNotificationListResponse) Reset() { *m = RpcNotificationList func (m *RpcNotificationListResponse) String() string { return proto.CompactTextString(m) } func (*RpcNotificationListResponse) ProtoMessage() {} func (*RpcNotificationListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 36, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 0, 1} } func (m *RpcNotificationListResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -66422,7 +68253,7 @@ func (m *RpcNotificationListResponseError) Reset() { *m = RpcNotificatio func (m *RpcNotificationListResponseError) String() string { return proto.CompactTextString(m) } func (*RpcNotificationListResponseError) ProtoMessage() {} func (*RpcNotificationListResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 36, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 0, 1, 0} } func (m *RpcNotificationListResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -66472,7 +68303,7 @@ func (m *RpcNotificationReply) Reset() { *m = RpcNotificationReply{} } func (m *RpcNotificationReply) String() string { return proto.CompactTextString(m) } func (*RpcNotificationReply) ProtoMessage() {} func (*RpcNotificationReply) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 36, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 1} } func (m *RpcNotificationReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -66510,7 +68341,7 @@ func (m *RpcNotificationReplyRequest) Reset() { *m = RpcNotificationRepl func (m *RpcNotificationReplyRequest) String() string { return proto.CompactTextString(m) } func (*RpcNotificationReplyRequest) ProtoMessage() {} func (*RpcNotificationReplyRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 36, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 1, 0} } func (m *RpcNotificationReplyRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -66561,7 +68392,7 @@ func (m *RpcNotificationReplyResponse) Reset() { *m = RpcNotificationRep func (m *RpcNotificationReplyResponse) String() string { return proto.CompactTextString(m) } func (*RpcNotificationReplyResponse) ProtoMessage() {} func (*RpcNotificationReplyResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 36, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 1, 1} } func (m *RpcNotificationReplyResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -66606,7 +68437,7 @@ func (m *RpcNotificationReplyResponseError) Reset() { *m = RpcNotificati func (m *RpcNotificationReplyResponseError) String() string { return proto.CompactTextString(m) } func (*RpcNotificationReplyResponseError) ProtoMessage() {} func (*RpcNotificationReplyResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 36, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 1, 1, 0} } func (m *RpcNotificationReplyResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -66656,7 +68487,7 @@ func (m *RpcNotificationTest) Reset() { *m = RpcNotificationTest{} } func (m *RpcNotificationTest) String() string { return proto.CompactTextString(m) } func (*RpcNotificationTest) ProtoMessage() {} func (*RpcNotificationTest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 36, 2} + return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 2} } func (m *RpcNotificationTest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -66692,7 +68523,7 @@ func (m *RpcNotificationTestRequest) Reset() { *m = RpcNotificationTestR func (m *RpcNotificationTestRequest) String() string { return proto.CompactTextString(m) } func (*RpcNotificationTestRequest) ProtoMessage() {} func (*RpcNotificationTestRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 36, 2, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 2, 0} } func (m *RpcNotificationTestRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -66730,7 +68561,7 @@ func (m *RpcNotificationTestResponse) Reset() { *m = RpcNotificationTest func (m *RpcNotificationTestResponse) String() string { return proto.CompactTextString(m) } func (*RpcNotificationTestResponse) ProtoMessage() {} func (*RpcNotificationTestResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 36, 2, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 2, 1} } func (m *RpcNotificationTestResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -66782,7 +68613,7 @@ func (m *RpcNotificationTestResponseError) Reset() { *m = RpcNotificatio func (m *RpcNotificationTestResponseError) String() string { return proto.CompactTextString(m) } func (*RpcNotificationTestResponseError) ProtoMessage() {} func (*RpcNotificationTestResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 36, 2, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 2, 1, 0} } func (m *RpcNotificationTestResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -66836,7 +68667,7 @@ func (m *RpcMembership) Reset() { *m = RpcMembership{} } func (m *RpcMembership) String() string { return proto.CompactTextString(m) } func (*RpcMembership) ProtoMessage() {} func (*RpcMembership) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38} } func (m *RpcMembership) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -66876,7 +68707,7 @@ func (m *RpcMembershipGetStatus) Reset() { *m = RpcMembershipGetStatus{} func (m *RpcMembershipGetStatus) String() string { return proto.CompactTextString(m) } func (*RpcMembershipGetStatus) ProtoMessage() {} func (*RpcMembershipGetStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 0} } func (m *RpcMembershipGetStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -66915,7 +68746,7 @@ func (m *RpcMembershipGetStatusRequest) Reset() { *m = RpcMembershipGetS func (m *RpcMembershipGetStatusRequest) String() string { return proto.CompactTextString(m) } func (*RpcMembershipGetStatusRequest) ProtoMessage() {} func (*RpcMembershipGetStatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 0, 0} } func (m *RpcMembershipGetStatusRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -66960,7 +68791,7 @@ func (m *RpcMembershipGetStatusResponse) Reset() { *m = RpcMembershipGet func (m *RpcMembershipGetStatusResponse) String() string { return proto.CompactTextString(m) } func (*RpcMembershipGetStatusResponse) ProtoMessage() {} func (*RpcMembershipGetStatusResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 0, 1} } func (m *RpcMembershipGetStatusResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -67012,7 +68843,7 @@ func (m *RpcMembershipGetStatusResponseError) Reset() { *m = RpcMembersh func (m *RpcMembershipGetStatusResponseError) String() string { return proto.CompactTextString(m) } func (*RpcMembershipGetStatusResponseError) ProtoMessage() {} func (*RpcMembershipGetStatusResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 0, 1, 0} } func (m *RpcMembershipGetStatusResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -67065,7 +68896,7 @@ func (m *RpcMembershipIsNameValid) Reset() { *m = RpcMembershipIsNameVal func (m *RpcMembershipIsNameValid) String() string { return proto.CompactTextString(m) } func (*RpcMembershipIsNameValid) ProtoMessage() {} func (*RpcMembershipIsNameValid) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 1} } func (m *RpcMembershipIsNameValid) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -67104,7 +68935,7 @@ func (m *RpcMembershipIsNameValidRequest) Reset() { *m = RpcMembershipIs func (m *RpcMembershipIsNameValidRequest) String() string { return proto.CompactTextString(m) } func (*RpcMembershipIsNameValidRequest) ProtoMessage() {} func (*RpcMembershipIsNameValidRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 1, 0} } func (m *RpcMembershipIsNameValidRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -67162,7 +68993,7 @@ func (m *RpcMembershipIsNameValidResponse) Reset() { *m = RpcMembershipI func (m *RpcMembershipIsNameValidResponse) String() string { return proto.CompactTextString(m) } func (*RpcMembershipIsNameValidResponse) ProtoMessage() {} func (*RpcMembershipIsNameValidResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 1, 1} } func (m *RpcMembershipIsNameValidResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -67207,7 +69038,7 @@ func (m *RpcMembershipIsNameValidResponseError) Reset() { *m = RpcMember func (m *RpcMembershipIsNameValidResponseError) String() string { return proto.CompactTextString(m) } func (*RpcMembershipIsNameValidResponseError) ProtoMessage() {} func (*RpcMembershipIsNameValidResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 1, 1, 0} } func (m *RpcMembershipIsNameValidResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -67260,7 +69091,7 @@ func (m *RpcMembershipRegisterPaymentRequest) Reset() { *m = RpcMembersh func (m *RpcMembershipRegisterPaymentRequest) String() string { return proto.CompactTextString(m) } func (*RpcMembershipRegisterPaymentRequest) ProtoMessage() {} func (*RpcMembershipRegisterPaymentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 2} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 2} } func (m *RpcMembershipRegisterPaymentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -67311,7 +69142,7 @@ func (m *RpcMembershipRegisterPaymentRequestRequest) String() string { } func (*RpcMembershipRegisterPaymentRequestRequest) ProtoMessage() {} func (*RpcMembershipRegisterPaymentRequestRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 2, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 2, 0} } func (m *RpcMembershipRegisterPaymentRequestRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -67392,7 +69223,7 @@ func (m *RpcMembershipRegisterPaymentRequestResponse) String() string { } func (*RpcMembershipRegisterPaymentRequestResponse) ProtoMessage() {} func (*RpcMembershipRegisterPaymentRequestResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 2, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 2, 1} } func (m *RpcMembershipRegisterPaymentRequestResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -67455,7 +69286,7 @@ func (m *RpcMembershipRegisterPaymentRequestResponseError) String() string { } func (*RpcMembershipRegisterPaymentRequestResponseError) ProtoMessage() {} func (*RpcMembershipRegisterPaymentRequestResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 2, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 2, 1, 0} } func (m *RpcMembershipRegisterPaymentRequestResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -67510,7 +69341,7 @@ func (m *RpcMembershipGetPortalLinkUrl) Reset() { *m = RpcMembershipGetP func (m *RpcMembershipGetPortalLinkUrl) String() string { return proto.CompactTextString(m) } func (*RpcMembershipGetPortalLinkUrl) ProtoMessage() {} func (*RpcMembershipGetPortalLinkUrl) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 3} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 3} } func (m *RpcMembershipGetPortalLinkUrl) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -67546,7 +69377,7 @@ func (m *RpcMembershipGetPortalLinkUrlRequest) Reset() { *m = RpcMembers func (m *RpcMembershipGetPortalLinkUrlRequest) String() string { return proto.CompactTextString(m) } func (*RpcMembershipGetPortalLinkUrlRequest) ProtoMessage() {} func (*RpcMembershipGetPortalLinkUrlRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 3, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 3, 0} } func (m *RpcMembershipGetPortalLinkUrlRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -67584,7 +69415,7 @@ func (m *RpcMembershipGetPortalLinkUrlResponse) Reset() { *m = RpcMember func (m *RpcMembershipGetPortalLinkUrlResponse) String() string { return proto.CompactTextString(m) } func (*RpcMembershipGetPortalLinkUrlResponse) ProtoMessage() {} func (*RpcMembershipGetPortalLinkUrlResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 3, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 3, 1} } func (m *RpcMembershipGetPortalLinkUrlResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -67640,7 +69471,7 @@ func (m *RpcMembershipGetPortalLinkUrlResponseError) String() string { } func (*RpcMembershipGetPortalLinkUrlResponseError) ProtoMessage() {} func (*RpcMembershipGetPortalLinkUrlResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 3, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 3, 1, 0} } func (m *RpcMembershipGetPortalLinkUrlResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -67690,7 +69521,7 @@ func (m *RpcMembershipFinalize) Reset() { *m = RpcMembershipFinalize{} } func (m *RpcMembershipFinalize) String() string { return proto.CompactTextString(m) } func (*RpcMembershipFinalize) ProtoMessage() {} func (*RpcMembershipFinalize) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 4} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 4} } func (m *RpcMembershipFinalize) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -67730,7 +69561,7 @@ func (m *RpcMembershipFinalizeRequest) Reset() { *m = RpcMembershipFinal func (m *RpcMembershipFinalizeRequest) String() string { return proto.CompactTextString(m) } func (*RpcMembershipFinalizeRequest) ProtoMessage() {} func (*RpcMembershipFinalizeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 4, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 4, 0} } func (m *RpcMembershipFinalizeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -67781,7 +69612,7 @@ func (m *RpcMembershipFinalizeResponse) Reset() { *m = RpcMembershipFina func (m *RpcMembershipFinalizeResponse) String() string { return proto.CompactTextString(m) } func (*RpcMembershipFinalizeResponse) ProtoMessage() {} func (*RpcMembershipFinalizeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 4, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 4, 1} } func (m *RpcMembershipFinalizeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -67826,7 +69657,7 @@ func (m *RpcMembershipFinalizeResponseError) Reset() { *m = RpcMembershi func (m *RpcMembershipFinalizeResponseError) String() string { return proto.CompactTextString(m) } func (*RpcMembershipFinalizeResponseError) ProtoMessage() {} func (*RpcMembershipFinalizeResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 4, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 4, 1, 0} } func (m *RpcMembershipFinalizeResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -67881,7 +69712,7 @@ func (m *RpcMembershipGetVerificationEmailStatus) Reset() { func (m *RpcMembershipGetVerificationEmailStatus) String() string { return proto.CompactTextString(m) } func (*RpcMembershipGetVerificationEmailStatus) ProtoMessage() {} func (*RpcMembershipGetVerificationEmailStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 5} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 5} } func (m *RpcMembershipGetVerificationEmailStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -67921,7 +69752,7 @@ func (m *RpcMembershipGetVerificationEmailStatusRequest) String() string { } func (*RpcMembershipGetVerificationEmailStatusRequest) ProtoMessage() {} func (*RpcMembershipGetVerificationEmailStatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 5, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 5, 0} } func (m *RpcMembershipGetVerificationEmailStatusRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -67963,7 +69794,7 @@ func (m *RpcMembershipGetVerificationEmailStatusResponse) String() string { } func (*RpcMembershipGetVerificationEmailStatusResponse) ProtoMessage() {} func (*RpcMembershipGetVerificationEmailStatusResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 5, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 5, 1} } func (m *RpcMembershipGetVerificationEmailStatusResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -68019,7 +69850,7 @@ func (m *RpcMembershipGetVerificationEmailStatusResponseError) String() string { } func (*RpcMembershipGetVerificationEmailStatusResponseError) ProtoMessage() {} func (*RpcMembershipGetVerificationEmailStatusResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 5, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 5, 1, 0} } func (m *RpcMembershipGetVerificationEmailStatusResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -68072,7 +69903,7 @@ func (m *RpcMembershipGetVerificationEmail) Reset() { *m = RpcMembership func (m *RpcMembershipGetVerificationEmail) String() string { return proto.CompactTextString(m) } func (*RpcMembershipGetVerificationEmail) ProtoMessage() {} func (*RpcMembershipGetVerificationEmail) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 6} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 6} } func (m *RpcMembershipGetVerificationEmail) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -68115,7 +69946,7 @@ func (m *RpcMembershipGetVerificationEmailRequest) Reset() { func (m *RpcMembershipGetVerificationEmailRequest) String() string { return proto.CompactTextString(m) } func (*RpcMembershipGetVerificationEmailRequest) ProtoMessage() {} func (*RpcMembershipGetVerificationEmailRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 6, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 6, 0} } func (m *RpcMembershipGetVerificationEmailRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -68184,7 +70015,7 @@ func (m *RpcMembershipGetVerificationEmailResponse) String() string { } func (*RpcMembershipGetVerificationEmailResponse) ProtoMessage() {} func (*RpcMembershipGetVerificationEmailResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 6, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 6, 1} } func (m *RpcMembershipGetVerificationEmailResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -68233,7 +70064,7 @@ func (m *RpcMembershipGetVerificationEmailResponseError) String() string { } func (*RpcMembershipGetVerificationEmailResponseError) ProtoMessage() {} func (*RpcMembershipGetVerificationEmailResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 6, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 6, 1, 0} } func (m *RpcMembershipGetVerificationEmailResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -68286,7 +70117,7 @@ func (m *RpcMembershipVerifyEmailCode) Reset() { *m = RpcMembershipVerif func (m *RpcMembershipVerifyEmailCode) String() string { return proto.CompactTextString(m) } func (*RpcMembershipVerifyEmailCode) ProtoMessage() {} func (*RpcMembershipVerifyEmailCode) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 7} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 7} } func (m *RpcMembershipVerifyEmailCode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -68323,7 +70154,7 @@ func (m *RpcMembershipVerifyEmailCodeRequest) Reset() { *m = RpcMembersh func (m *RpcMembershipVerifyEmailCodeRequest) String() string { return proto.CompactTextString(m) } func (*RpcMembershipVerifyEmailCodeRequest) ProtoMessage() {} func (*RpcMembershipVerifyEmailCodeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 7, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 7, 0} } func (m *RpcMembershipVerifyEmailCodeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -68367,7 +70198,7 @@ func (m *RpcMembershipVerifyEmailCodeResponse) Reset() { *m = RpcMembers func (m *RpcMembershipVerifyEmailCodeResponse) String() string { return proto.CompactTextString(m) } func (*RpcMembershipVerifyEmailCodeResponse) ProtoMessage() {} func (*RpcMembershipVerifyEmailCodeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 7, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 7, 1} } func (m *RpcMembershipVerifyEmailCodeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -68416,7 +70247,7 @@ func (m *RpcMembershipVerifyEmailCodeResponseError) String() string { } func (*RpcMembershipVerifyEmailCodeResponseError) ProtoMessage() {} func (*RpcMembershipVerifyEmailCodeResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 7, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 7, 1, 0} } func (m *RpcMembershipVerifyEmailCodeResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -68469,7 +70300,7 @@ func (m *RpcMembershipGetTiers) Reset() { *m = RpcMembershipGetTiers{} } func (m *RpcMembershipGetTiers) String() string { return proto.CompactTextString(m) } func (*RpcMembershipGetTiers) ProtoMessage() {} func (*RpcMembershipGetTiers) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 8} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 8} } func (m *RpcMembershipGetTiers) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -68509,7 +70340,7 @@ func (m *RpcMembershipGetTiersRequest) Reset() { *m = RpcMembershipGetTi func (m *RpcMembershipGetTiersRequest) String() string { return proto.CompactTextString(m) } func (*RpcMembershipGetTiersRequest) ProtoMessage() {} func (*RpcMembershipGetTiersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 8, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 8, 0} } func (m *RpcMembershipGetTiersRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -68561,7 +70392,7 @@ func (m *RpcMembershipGetTiersResponse) Reset() { *m = RpcMembershipGetT func (m *RpcMembershipGetTiersResponse) String() string { return proto.CompactTextString(m) } func (*RpcMembershipGetTiersResponse) ProtoMessage() {} func (*RpcMembershipGetTiersResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 8, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 8, 1} } func (m *RpcMembershipGetTiersResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -68613,7 +70444,7 @@ func (m *RpcMembershipGetTiersResponseError) Reset() { *m = RpcMembershi func (m *RpcMembershipGetTiersResponseError) String() string { return proto.CompactTextString(m) } func (*RpcMembershipGetTiersResponseError) ProtoMessage() {} func (*RpcMembershipGetTiersResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 8, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 8, 1, 0} } func (m *RpcMembershipGetTiersResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -68663,7 +70494,7 @@ func (m *RpcMembershipVerifyAppStoreReceipt) Reset() { *m = RpcMembershi func (m *RpcMembershipVerifyAppStoreReceipt) String() string { return proto.CompactTextString(m) } func (*RpcMembershipVerifyAppStoreReceipt) ProtoMessage() {} func (*RpcMembershipVerifyAppStoreReceipt) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 9} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 9} } func (m *RpcMembershipVerifyAppStoreReceipt) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -68705,7 +70536,7 @@ func (m *RpcMembershipVerifyAppStoreReceiptRequest) String() string { } func (*RpcMembershipVerifyAppStoreReceiptRequest) ProtoMessage() {} func (*RpcMembershipVerifyAppStoreReceiptRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 9, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 9, 0} } func (m *RpcMembershipVerifyAppStoreReceiptRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -68753,7 +70584,7 @@ func (m *RpcMembershipVerifyAppStoreReceiptResponse) String() string { } func (*RpcMembershipVerifyAppStoreReceiptResponse) ProtoMessage() {} func (*RpcMembershipVerifyAppStoreReceiptResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 9, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 9, 1} } func (m *RpcMembershipVerifyAppStoreReceiptResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -68802,7 +70633,7 @@ func (m *RpcMembershipVerifyAppStoreReceiptResponseError) String() string { } func (*RpcMembershipVerifyAppStoreReceiptResponseError) ProtoMessage() {} func (*RpcMembershipVerifyAppStoreReceiptResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 37, 9, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 9, 1, 0} } func (m *RpcMembershipVerifyAppStoreReceiptResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -68852,7 +70683,7 @@ func (m *RpcNameService) Reset() { *m = RpcNameService{} } func (m *RpcNameService) String() string { return proto.CompactTextString(m) } func (*RpcNameService) ProtoMessage() {} func (*RpcNameService) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 38} + return fileDescriptor_8261c968b2e6f45c, []int{0, 39} } func (m *RpcNameService) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -68888,7 +70719,7 @@ func (m *RpcNameServiceResolveName) Reset() { *m = RpcNameServiceResolve func (m *RpcNameServiceResolveName) String() string { return proto.CompactTextString(m) } func (*RpcNameServiceResolveName) ProtoMessage() {} func (*RpcNameServiceResolveName) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 0} } func (m *RpcNameServiceResolveName) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -68926,7 +70757,7 @@ func (m *RpcNameServiceResolveNameRequest) Reset() { *m = RpcNameService func (m *RpcNameServiceResolveNameRequest) String() string { return proto.CompactTextString(m) } func (*RpcNameServiceResolveNameRequest) ProtoMessage() {} func (*RpcNameServiceResolveNameRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 0, 0} } func (m *RpcNameServiceResolveNameRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -68991,7 +70822,7 @@ func (m *RpcNameServiceResolveNameResponse) Reset() { *m = RpcNameServic func (m *RpcNameServiceResolveNameResponse) String() string { return proto.CompactTextString(m) } func (*RpcNameServiceResolveNameResponse) ProtoMessage() {} func (*RpcNameServiceResolveNameResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 0, 1} } func (m *RpcNameServiceResolveNameResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -69080,7 +70911,7 @@ func (m *RpcNameServiceResolveNameResponseError) Reset() { func (m *RpcNameServiceResolveNameResponseError) String() string { return proto.CompactTextString(m) } func (*RpcNameServiceResolveNameResponseError) ProtoMessage() {} func (*RpcNameServiceResolveNameResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 0, 1, 0} } func (m *RpcNameServiceResolveNameResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -69130,7 +70961,7 @@ func (m *RpcNameServiceResolveAnyId) Reset() { *m = RpcNameServiceResolv func (m *RpcNameServiceResolveAnyId) String() string { return proto.CompactTextString(m) } func (*RpcNameServiceResolveAnyId) ProtoMessage() {} func (*RpcNameServiceResolveAnyId) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 1} } func (m *RpcNameServiceResolveAnyId) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -69167,7 +70998,7 @@ func (m *RpcNameServiceResolveAnyIdRequest) Reset() { *m = RpcNameServic func (m *RpcNameServiceResolveAnyIdRequest) String() string { return proto.CompactTextString(m) } func (*RpcNameServiceResolveAnyIdRequest) ProtoMessage() {} func (*RpcNameServiceResolveAnyIdRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 1, 0} } func (m *RpcNameServiceResolveAnyIdRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -69215,7 +71046,7 @@ func (m *RpcNameServiceResolveAnyIdResponse) Reset() { *m = RpcNameServi func (m *RpcNameServiceResolveAnyIdResponse) String() string { return proto.CompactTextString(m) } func (*RpcNameServiceResolveAnyIdResponse) ProtoMessage() {} func (*RpcNameServiceResolveAnyIdResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 1, 1} } func (m *RpcNameServiceResolveAnyIdResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -69283,7 +71114,7 @@ func (m *RpcNameServiceResolveAnyIdResponseError) Reset() { func (m *RpcNameServiceResolveAnyIdResponseError) String() string { return proto.CompactTextString(m) } func (*RpcNameServiceResolveAnyIdResponseError) ProtoMessage() {} func (*RpcNameServiceResolveAnyIdResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 1, 1, 0} } func (m *RpcNameServiceResolveAnyIdResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -69333,7 +71164,7 @@ func (m *RpcNameServiceResolveSpaceId) Reset() { *m = RpcNameServiceReso func (m *RpcNameServiceResolveSpaceId) String() string { return proto.CompactTextString(m) } func (*RpcNameServiceResolveSpaceId) ProtoMessage() {} func (*RpcNameServiceResolveSpaceId) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 2} + return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 2} } func (m *RpcNameServiceResolveSpaceId) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -69370,7 +71201,7 @@ func (m *RpcNameServiceResolveSpaceIdRequest) Reset() { *m = RpcNameServ func (m *RpcNameServiceResolveSpaceIdRequest) String() string { return proto.CompactTextString(m) } func (*RpcNameServiceResolveSpaceIdRequest) ProtoMessage() {} func (*RpcNameServiceResolveSpaceIdRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 2, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 2, 0} } func (m *RpcNameServiceResolveSpaceIdRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -69418,7 +71249,7 @@ func (m *RpcNameServiceResolveSpaceIdResponse) Reset() { *m = RpcNameSer func (m *RpcNameServiceResolveSpaceIdResponse) String() string { return proto.CompactTextString(m) } func (*RpcNameServiceResolveSpaceIdResponse) ProtoMessage() {} func (*RpcNameServiceResolveSpaceIdResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 2, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 2, 1} } func (m *RpcNameServiceResolveSpaceIdResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -69488,7 +71319,7 @@ func (m *RpcNameServiceResolveSpaceIdResponseError) String() string { } func (*RpcNameServiceResolveSpaceIdResponseError) ProtoMessage() {} func (*RpcNameServiceResolveSpaceIdResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 2, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 2, 1, 0} } func (m *RpcNameServiceResolveSpaceIdResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -69538,7 +71369,7 @@ func (m *RpcNameServiceUserAccount) Reset() { *m = RpcNameServiceUserAcc func (m *RpcNameServiceUserAccount) String() string { return proto.CompactTextString(m) } func (*RpcNameServiceUserAccount) ProtoMessage() {} func (*RpcNameServiceUserAccount) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 3} + return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 3} } func (m *RpcNameServiceUserAccount) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -69574,7 +71405,7 @@ func (m *RpcNameServiceUserAccountGet) Reset() { *m = RpcNameServiceUser func (m *RpcNameServiceUserAccountGet) String() string { return proto.CompactTextString(m) } func (*RpcNameServiceUserAccountGet) ProtoMessage() {} func (*RpcNameServiceUserAccountGet) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 3, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 3, 0} } func (m *RpcNameServiceUserAccountGet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -69610,7 +71441,7 @@ func (m *RpcNameServiceUserAccountGetRequest) Reset() { *m = RpcNameServ func (m *RpcNameServiceUserAccountGetRequest) String() string { return proto.CompactTextString(m) } func (*RpcNameServiceUserAccountGetRequest) ProtoMessage() {} func (*RpcNameServiceUserAccountGetRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 3, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 3, 0, 0} } func (m *RpcNameServiceUserAccountGetRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -69656,7 +71487,7 @@ func (m *RpcNameServiceUserAccountGetResponse) Reset() { *m = RpcNameSer func (m *RpcNameServiceUserAccountGetResponse) String() string { return proto.CompactTextString(m) } func (*RpcNameServiceUserAccountGetResponse) ProtoMessage() {} func (*RpcNameServiceUserAccountGetResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 3, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 3, 0, 1} } func (m *RpcNameServiceUserAccountGetResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -69733,7 +71564,7 @@ func (m *RpcNameServiceUserAccountGetResponseError) String() string { } func (*RpcNameServiceUserAccountGetResponseError) ProtoMessage() {} func (*RpcNameServiceUserAccountGetResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 38, 3, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 3, 0, 1, 0} } func (m *RpcNameServiceUserAccountGetResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -69783,7 +71614,7 @@ func (m *RpcBroadcast) Reset() { *m = RpcBroadcast{} } func (m *RpcBroadcast) String() string { return proto.CompactTextString(m) } func (*RpcBroadcast) ProtoMessage() {} func (*RpcBroadcast) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 39} + return fileDescriptor_8261c968b2e6f45c, []int{0, 40} } func (m *RpcBroadcast) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -69819,7 +71650,7 @@ func (m *RpcBroadcastPayloadEvent) Reset() { *m = RpcBroadcastPayloadEve func (m *RpcBroadcastPayloadEvent) String() string { return proto.CompactTextString(m) } func (*RpcBroadcastPayloadEvent) ProtoMessage() {} func (*RpcBroadcastPayloadEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 40, 0} } func (m *RpcBroadcastPayloadEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -69856,7 +71687,7 @@ func (m *RpcBroadcastPayloadEventRequest) Reset() { *m = RpcBroadcastPay func (m *RpcBroadcastPayloadEventRequest) String() string { return proto.CompactTextString(m) } func (*RpcBroadcastPayloadEventRequest) ProtoMessage() {} func (*RpcBroadcastPayloadEventRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 40, 0, 0} } func (m *RpcBroadcastPayloadEventRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -69901,7 +71732,7 @@ func (m *RpcBroadcastPayloadEventResponse) Reset() { *m = RpcBroadcastPa func (m *RpcBroadcastPayloadEventResponse) String() string { return proto.CompactTextString(m) } func (*RpcBroadcastPayloadEventResponse) ProtoMessage() {} func (*RpcBroadcastPayloadEventResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 40, 0, 1} } func (m *RpcBroadcastPayloadEventResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -69953,7 +71784,7 @@ func (m *RpcBroadcastPayloadEventResponseError) Reset() { *m = RpcBroadc func (m *RpcBroadcastPayloadEventResponseError) String() string { return proto.CompactTextString(m) } func (*RpcBroadcastPayloadEventResponseError) ProtoMessage() {} func (*RpcBroadcastPayloadEventResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 39, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 40, 0, 1, 0} } func (m *RpcBroadcastPayloadEventResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70003,7 +71834,7 @@ func (m *RpcDevice) Reset() { *m = RpcDevice{} } func (m *RpcDevice) String() string { return proto.CompactTextString(m) } func (*RpcDevice) ProtoMessage() {} func (*RpcDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 40} + return fileDescriptor_8261c968b2e6f45c, []int{0, 41} } func (m *RpcDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70039,7 +71870,7 @@ func (m *RpcDeviceSetName) Reset() { *m = RpcDeviceSetName{} } func (m *RpcDeviceSetName) String() string { return proto.CompactTextString(m) } func (*RpcDeviceSetName) ProtoMessage() {} func (*RpcDeviceSetName) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 40, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 0} } func (m *RpcDeviceSetName) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70077,7 +71908,7 @@ func (m *RpcDeviceSetNameRequest) Reset() { *m = RpcDeviceSetNameRequest func (m *RpcDeviceSetNameRequest) String() string { return proto.CompactTextString(m) } func (*RpcDeviceSetNameRequest) ProtoMessage() {} func (*RpcDeviceSetNameRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 40, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 0, 0} } func (m *RpcDeviceSetNameRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70128,7 +71959,7 @@ func (m *RpcDeviceSetNameResponse) Reset() { *m = RpcDeviceSetNameRespon func (m *RpcDeviceSetNameResponse) String() string { return proto.CompactTextString(m) } func (*RpcDeviceSetNameResponse) ProtoMessage() {} func (*RpcDeviceSetNameResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 40, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 0, 1} } func (m *RpcDeviceSetNameResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70173,7 +72004,7 @@ func (m *RpcDeviceSetNameResponseError) Reset() { *m = RpcDeviceSetNameR func (m *RpcDeviceSetNameResponseError) String() string { return proto.CompactTextString(m) } func (*RpcDeviceSetNameResponseError) ProtoMessage() {} func (*RpcDeviceSetNameResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 40, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 0, 1, 0} } func (m *RpcDeviceSetNameResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70223,7 +72054,7 @@ func (m *RpcDeviceList) Reset() { *m = RpcDeviceList{} } func (m *RpcDeviceList) String() string { return proto.CompactTextString(m) } func (*RpcDeviceList) ProtoMessage() {} func (*RpcDeviceList) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 40, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 1} } func (m *RpcDeviceList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70259,7 +72090,7 @@ func (m *RpcDeviceListRequest) Reset() { *m = RpcDeviceListRequest{} } func (m *RpcDeviceListRequest) String() string { return proto.CompactTextString(m) } func (*RpcDeviceListRequest) ProtoMessage() {} func (*RpcDeviceListRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 40, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 1, 0} } func (m *RpcDeviceListRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70297,7 +72128,7 @@ func (m *RpcDeviceListResponse) Reset() { *m = RpcDeviceListResponse{} } func (m *RpcDeviceListResponse) String() string { return proto.CompactTextString(m) } func (*RpcDeviceListResponse) ProtoMessage() {} func (*RpcDeviceListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 40, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 1, 1} } func (m *RpcDeviceListResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70349,7 +72180,7 @@ func (m *RpcDeviceListResponseError) Reset() { *m = RpcDeviceListRespons func (m *RpcDeviceListResponseError) String() string { return proto.CompactTextString(m) } func (*RpcDeviceListResponseError) ProtoMessage() {} func (*RpcDeviceListResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 40, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 1, 1, 0} } func (m *RpcDeviceListResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70399,7 +72230,7 @@ func (m *RpcDeviceNetworkState) Reset() { *m = RpcDeviceNetworkState{} } func (m *RpcDeviceNetworkState) String() string { return proto.CompactTextString(m) } func (*RpcDeviceNetworkState) ProtoMessage() {} func (*RpcDeviceNetworkState) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 40, 2} + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 2} } func (m *RpcDeviceNetworkState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70435,7 +72266,7 @@ func (m *RpcDeviceNetworkStateSet) Reset() { *m = RpcDeviceNetworkStateS func (m *RpcDeviceNetworkStateSet) String() string { return proto.CompactTextString(m) } func (*RpcDeviceNetworkStateSet) ProtoMessage() {} func (*RpcDeviceNetworkStateSet) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 40, 2, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 2, 0} } func (m *RpcDeviceNetworkStateSet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70472,7 +72303,7 @@ func (m *RpcDeviceNetworkStateSetRequest) Reset() { *m = RpcDeviceNetwor func (m *RpcDeviceNetworkStateSetRequest) String() string { return proto.CompactTextString(m) } func (*RpcDeviceNetworkStateSetRequest) ProtoMessage() {} func (*RpcDeviceNetworkStateSetRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 40, 2, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 2, 0, 0} } func (m *RpcDeviceNetworkStateSetRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70516,7 +72347,7 @@ func (m *RpcDeviceNetworkStateSetResponse) Reset() { *m = RpcDeviceNetwo func (m *RpcDeviceNetworkStateSetResponse) String() string { return proto.CompactTextString(m) } func (*RpcDeviceNetworkStateSetResponse) ProtoMessage() {} func (*RpcDeviceNetworkStateSetResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 40, 2, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 2, 0, 1} } func (m *RpcDeviceNetworkStateSetResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70561,7 +72392,7 @@ func (m *RpcDeviceNetworkStateSetResponseError) Reset() { *m = RpcDevice func (m *RpcDeviceNetworkStateSetResponseError) String() string { return proto.CompactTextString(m) } func (*RpcDeviceNetworkStateSetResponseError) ProtoMessage() {} func (*RpcDeviceNetworkStateSetResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 40, 2, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 2, 0, 1, 0} } func (m *RpcDeviceNetworkStateSetResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70611,7 +72442,7 @@ func (m *RpcChat) Reset() { *m = RpcChat{} } func (m *RpcChat) String() string { return proto.CompactTextString(m) } func (*RpcChat) ProtoMessage() {} func (*RpcChat) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42} } func (m *RpcChat) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70647,7 +72478,7 @@ func (m *RpcChatAddMessage) Reset() { *m = RpcChatAddMessage{} } func (m *RpcChatAddMessage) String() string { return proto.CompactTextString(m) } func (*RpcChatAddMessage) ProtoMessage() {} func (*RpcChatAddMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 0} } func (m *RpcChatAddMessage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70685,7 +72516,7 @@ func (m *RpcChatAddMessageRequest) Reset() { *m = RpcChatAddMessageReque func (m *RpcChatAddMessageRequest) String() string { return proto.CompactTextString(m) } func (*RpcChatAddMessageRequest) ProtoMessage() {} func (*RpcChatAddMessageRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 0, 0} } func (m *RpcChatAddMessageRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70738,7 +72569,7 @@ func (m *RpcChatAddMessageResponse) Reset() { *m = RpcChatAddMessageResp func (m *RpcChatAddMessageResponse) String() string { return proto.CompactTextString(m) } func (*RpcChatAddMessageResponse) ProtoMessage() {} func (*RpcChatAddMessageResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 0, 1} } func (m *RpcChatAddMessageResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70797,7 +72628,7 @@ func (m *RpcChatAddMessageResponseError) Reset() { *m = RpcChatAddMessag func (m *RpcChatAddMessageResponseError) String() string { return proto.CompactTextString(m) } func (*RpcChatAddMessageResponseError) ProtoMessage() {} func (*RpcChatAddMessageResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 0, 1, 0} } func (m *RpcChatAddMessageResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70847,7 +72678,7 @@ func (m *RpcChatEditMessageContent) Reset() { *m = RpcChatEditMessageCon func (m *RpcChatEditMessageContent) String() string { return proto.CompactTextString(m) } func (*RpcChatEditMessageContent) ProtoMessage() {} func (*RpcChatEditMessageContent) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 1} } func (m *RpcChatEditMessageContent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70886,7 +72717,7 @@ func (m *RpcChatEditMessageContentRequest) Reset() { *m = RpcChatEditMes func (m *RpcChatEditMessageContentRequest) String() string { return proto.CompactTextString(m) } func (*RpcChatEditMessageContentRequest) ProtoMessage() {} func (*RpcChatEditMessageContentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 1, 0} } func (m *RpcChatEditMessageContentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70944,7 +72775,7 @@ func (m *RpcChatEditMessageContentResponse) Reset() { *m = RpcChatEditMe func (m *RpcChatEditMessageContentResponse) String() string { return proto.CompactTextString(m) } func (*RpcChatEditMessageContentResponse) ProtoMessage() {} func (*RpcChatEditMessageContentResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 1, 1} } func (m *RpcChatEditMessageContentResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70991,7 +72822,7 @@ func (m *RpcChatEditMessageContentResponseError) Reset() { func (m *RpcChatEditMessageContentResponseError) String() string { return proto.CompactTextString(m) } func (*RpcChatEditMessageContentResponseError) ProtoMessage() {} func (*RpcChatEditMessageContentResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 1, 1, 0} } func (m *RpcChatEditMessageContentResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71041,7 +72872,7 @@ func (m *RpcChatToggleMessageReaction) Reset() { *m = RpcChatToggleMessa func (m *RpcChatToggleMessageReaction) String() string { return proto.CompactTextString(m) } func (*RpcChatToggleMessageReaction) ProtoMessage() {} func (*RpcChatToggleMessageReaction) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 2} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 2} } func (m *RpcChatToggleMessageReaction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71080,7 +72911,7 @@ func (m *RpcChatToggleMessageReactionRequest) Reset() { *m = RpcChatTogg func (m *RpcChatToggleMessageReactionRequest) String() string { return proto.CompactTextString(m) } func (*RpcChatToggleMessageReactionRequest) ProtoMessage() {} func (*RpcChatToggleMessageReactionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 2, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 2, 0} } func (m *RpcChatToggleMessageReactionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71138,7 +72969,7 @@ func (m *RpcChatToggleMessageReactionResponse) Reset() { *m = RpcChatTog func (m *RpcChatToggleMessageReactionResponse) String() string { return proto.CompactTextString(m) } func (*RpcChatToggleMessageReactionResponse) ProtoMessage() {} func (*RpcChatToggleMessageReactionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 2, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 2, 1} } func (m *RpcChatToggleMessageReactionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71187,7 +73018,7 @@ func (m *RpcChatToggleMessageReactionResponseError) String() string { } func (*RpcChatToggleMessageReactionResponseError) ProtoMessage() {} func (*RpcChatToggleMessageReactionResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 2, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 2, 1, 0} } func (m *RpcChatToggleMessageReactionResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71237,7 +73068,7 @@ func (m *RpcChatDeleteMessage) Reset() { *m = RpcChatDeleteMessage{} } func (m *RpcChatDeleteMessage) String() string { return proto.CompactTextString(m) } func (*RpcChatDeleteMessage) ProtoMessage() {} func (*RpcChatDeleteMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 3} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 3} } func (m *RpcChatDeleteMessage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71275,7 +73106,7 @@ func (m *RpcChatDeleteMessageRequest) Reset() { *m = RpcChatDeleteMessag func (m *RpcChatDeleteMessageRequest) String() string { return proto.CompactTextString(m) } func (*RpcChatDeleteMessageRequest) ProtoMessage() {} func (*RpcChatDeleteMessageRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 3, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 3, 0} } func (m *RpcChatDeleteMessageRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71326,7 +73157,7 @@ func (m *RpcChatDeleteMessageResponse) Reset() { *m = RpcChatDeleteMessa func (m *RpcChatDeleteMessageResponse) String() string { return proto.CompactTextString(m) } func (*RpcChatDeleteMessageResponse) ProtoMessage() {} func (*RpcChatDeleteMessageResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 3, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 3, 1} } func (m *RpcChatDeleteMessageResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71371,7 +73202,7 @@ func (m *RpcChatDeleteMessageResponseError) Reset() { *m = RpcChatDelete func (m *RpcChatDeleteMessageResponseError) String() string { return proto.CompactTextString(m) } func (*RpcChatDeleteMessageResponseError) ProtoMessage() {} func (*RpcChatDeleteMessageResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 3, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 3, 1, 0} } func (m *RpcChatDeleteMessageResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71421,7 +73252,7 @@ func (m *RpcChatGetMessages) Reset() { *m = RpcChatGetMessages{} } func (m *RpcChatGetMessages) String() string { return proto.CompactTextString(m) } func (*RpcChatGetMessages) ProtoMessage() {} func (*RpcChatGetMessages) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 4} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 4} } func (m *RpcChatGetMessages) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71462,7 +73293,7 @@ func (m *RpcChatGetMessagesRequest) Reset() { *m = RpcChatGetMessagesReq func (m *RpcChatGetMessagesRequest) String() string { return proto.CompactTextString(m) } func (*RpcChatGetMessagesRequest) ProtoMessage() {} func (*RpcChatGetMessagesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 4, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 4, 0} } func (m *RpcChatGetMessagesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71536,7 +73367,7 @@ func (m *RpcChatGetMessagesResponse) Reset() { *m = RpcChatGetMessagesRe func (m *RpcChatGetMessagesResponse) String() string { return proto.CompactTextString(m) } func (*RpcChatGetMessagesResponse) ProtoMessage() {} func (*RpcChatGetMessagesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 4, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 4, 1} } func (m *RpcChatGetMessagesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71595,7 +73426,7 @@ func (m *RpcChatGetMessagesResponseError) Reset() { *m = RpcChatGetMessa func (m *RpcChatGetMessagesResponseError) String() string { return proto.CompactTextString(m) } func (*RpcChatGetMessagesResponseError) ProtoMessage() {} func (*RpcChatGetMessagesResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 4, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 4, 1, 0} } func (m *RpcChatGetMessagesResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71645,7 +73476,7 @@ func (m *RpcChatGetMessagesByIds) Reset() { *m = RpcChatGetMessagesByIds func (m *RpcChatGetMessagesByIds) String() string { return proto.CompactTextString(m) } func (*RpcChatGetMessagesByIds) ProtoMessage() {} func (*RpcChatGetMessagesByIds) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 5} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 5} } func (m *RpcChatGetMessagesByIds) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71683,7 +73514,7 @@ func (m *RpcChatGetMessagesByIdsRequest) Reset() { *m = RpcChatGetMessag func (m *RpcChatGetMessagesByIdsRequest) String() string { return proto.CompactTextString(m) } func (*RpcChatGetMessagesByIdsRequest) ProtoMessage() {} func (*RpcChatGetMessagesByIdsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 5, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 5, 0} } func (m *RpcChatGetMessagesByIdsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71735,7 +73566,7 @@ func (m *RpcChatGetMessagesByIdsResponse) Reset() { *m = RpcChatGetMessa func (m *RpcChatGetMessagesByIdsResponse) String() string { return proto.CompactTextString(m) } func (*RpcChatGetMessagesByIdsResponse) ProtoMessage() {} func (*RpcChatGetMessagesByIdsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 5, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 5, 1} } func (m *RpcChatGetMessagesByIdsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71787,7 +73618,7 @@ func (m *RpcChatGetMessagesByIdsResponseError) Reset() { *m = RpcChatGet func (m *RpcChatGetMessagesByIdsResponseError) String() string { return proto.CompactTextString(m) } func (*RpcChatGetMessagesByIdsResponseError) ProtoMessage() {} func (*RpcChatGetMessagesByIdsResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 5, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 5, 1, 0} } func (m *RpcChatGetMessagesByIdsResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71837,7 +73668,7 @@ func (m *RpcChatSubscribeLastMessages) Reset() { *m = RpcChatSubscribeLa func (m *RpcChatSubscribeLastMessages) String() string { return proto.CompactTextString(m) } func (*RpcChatSubscribeLastMessages) ProtoMessage() {} func (*RpcChatSubscribeLastMessages) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 6} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 6} } func (m *RpcChatSubscribeLastMessages) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71876,7 +73707,7 @@ func (m *RpcChatSubscribeLastMessagesRequest) Reset() { *m = RpcChatSubs func (m *RpcChatSubscribeLastMessagesRequest) String() string { return proto.CompactTextString(m) } func (*RpcChatSubscribeLastMessagesRequest) ProtoMessage() {} func (*RpcChatSubscribeLastMessagesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 6, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 6, 0} } func (m *RpcChatSubscribeLastMessagesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71937,7 +73768,7 @@ func (m *RpcChatSubscribeLastMessagesResponse) Reset() { *m = RpcChatSub func (m *RpcChatSubscribeLastMessagesResponse) String() string { return proto.CompactTextString(m) } func (*RpcChatSubscribeLastMessagesResponse) ProtoMessage() {} func (*RpcChatSubscribeLastMessagesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 6, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 6, 1} } func (m *RpcChatSubscribeLastMessagesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72007,7 +73838,7 @@ func (m *RpcChatSubscribeLastMessagesResponseError) String() string { } func (*RpcChatSubscribeLastMessagesResponseError) ProtoMessage() {} func (*RpcChatSubscribeLastMessagesResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 6, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 6, 1, 0} } func (m *RpcChatSubscribeLastMessagesResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72057,7 +73888,7 @@ func (m *RpcChatUnsubscribe) Reset() { *m = RpcChatUnsubscribe{} } func (m *RpcChatUnsubscribe) String() string { return proto.CompactTextString(m) } func (*RpcChatUnsubscribe) ProtoMessage() {} func (*RpcChatUnsubscribe) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 7} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 7} } func (m *RpcChatUnsubscribe) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72095,7 +73926,7 @@ func (m *RpcChatUnsubscribeRequest) Reset() { *m = RpcChatUnsubscribeReq func (m *RpcChatUnsubscribeRequest) String() string { return proto.CompactTextString(m) } func (*RpcChatUnsubscribeRequest) ProtoMessage() {} func (*RpcChatUnsubscribeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 7, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 7, 0} } func (m *RpcChatUnsubscribeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72146,7 +73977,7 @@ func (m *RpcChatUnsubscribeResponse) Reset() { *m = RpcChatUnsubscribeRe func (m *RpcChatUnsubscribeResponse) String() string { return proto.CompactTextString(m) } func (*RpcChatUnsubscribeResponse) ProtoMessage() {} func (*RpcChatUnsubscribeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 7, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 7, 1} } func (m *RpcChatUnsubscribeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72191,7 +74022,7 @@ func (m *RpcChatUnsubscribeResponseError) Reset() { *m = RpcChatUnsubscr func (m *RpcChatUnsubscribeResponseError) String() string { return proto.CompactTextString(m) } func (*RpcChatUnsubscribeResponseError) ProtoMessage() {} func (*RpcChatUnsubscribeResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 7, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 7, 1, 0} } func (m *RpcChatUnsubscribeResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72241,7 +74072,7 @@ func (m *RpcChatSubscribeToMessagePreviews) Reset() { *m = RpcChatSubscr func (m *RpcChatSubscribeToMessagePreviews) String() string { return proto.CompactTextString(m) } func (*RpcChatSubscribeToMessagePreviews) ProtoMessage() {} func (*RpcChatSubscribeToMessagePreviews) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 8} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 8} } func (m *RpcChatSubscribeToMessagePreviews) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72279,7 +74110,7 @@ func (m *RpcChatSubscribeToMessagePreviewsRequest) Reset() { func (m *RpcChatSubscribeToMessagePreviewsRequest) String() string { return proto.CompactTextString(m) } func (*RpcChatSubscribeToMessagePreviewsRequest) ProtoMessage() {} func (*RpcChatSubscribeToMessagePreviewsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 8, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 8, 0} } func (m *RpcChatSubscribeToMessagePreviewsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72321,7 +74152,7 @@ func (m *RpcChatSubscribeToMessagePreviewsResponse) String() string { } func (*RpcChatSubscribeToMessagePreviewsResponse) ProtoMessage() {} func (*RpcChatSubscribeToMessagePreviewsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 8, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 8, 1} } func (m *RpcChatSubscribeToMessagePreviewsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72377,7 +74208,7 @@ func (m *RpcChatSubscribeToMessagePreviewsResponseError) String() string { } func (*RpcChatSubscribeToMessagePreviewsResponseError) ProtoMessage() {} func (*RpcChatSubscribeToMessagePreviewsResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 8, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 8, 1, 0} } func (m *RpcChatSubscribeToMessagePreviewsResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72420,6 +74251,186 @@ func (m *RpcChatSubscribeToMessagePreviewsResponseError) GetDescription() string return "" } +type RpcChatUnsubscribeFromMessagePreviews struct { +} + +func (m *RpcChatUnsubscribeFromMessagePreviews) Reset() { *m = RpcChatUnsubscribeFromMessagePreviews{} } +func (m *RpcChatUnsubscribeFromMessagePreviews) String() string { return proto.CompactTextString(m) } +func (*RpcChatUnsubscribeFromMessagePreviews) ProtoMessage() {} +func (*RpcChatUnsubscribeFromMessagePreviews) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 9} +} +func (m *RpcChatUnsubscribeFromMessagePreviews) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcChatUnsubscribeFromMessagePreviews) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcChatUnsubscribeFromMessagePreviews.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcChatUnsubscribeFromMessagePreviews) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcChatUnsubscribeFromMessagePreviews.Merge(m, src) +} +func (m *RpcChatUnsubscribeFromMessagePreviews) XXX_Size() int { + return m.Size() +} +func (m *RpcChatUnsubscribeFromMessagePreviews) XXX_DiscardUnknown() { + xxx_messageInfo_RpcChatUnsubscribeFromMessagePreviews.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcChatUnsubscribeFromMessagePreviews proto.InternalMessageInfo + +type RpcChatUnsubscribeFromMessagePreviewsRequest struct { +} + +func (m *RpcChatUnsubscribeFromMessagePreviewsRequest) Reset() { + *m = RpcChatUnsubscribeFromMessagePreviewsRequest{} +} +func (m *RpcChatUnsubscribeFromMessagePreviewsRequest) String() string { + return proto.CompactTextString(m) +} +func (*RpcChatUnsubscribeFromMessagePreviewsRequest) ProtoMessage() {} +func (*RpcChatUnsubscribeFromMessagePreviewsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 9, 0} +} +func (m *RpcChatUnsubscribeFromMessagePreviewsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcChatUnsubscribeFromMessagePreviewsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcChatUnsubscribeFromMessagePreviewsRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcChatUnsubscribeFromMessagePreviewsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcChatUnsubscribeFromMessagePreviewsRequest.Merge(m, src) +} +func (m *RpcChatUnsubscribeFromMessagePreviewsRequest) XXX_Size() int { + return m.Size() +} +func (m *RpcChatUnsubscribeFromMessagePreviewsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RpcChatUnsubscribeFromMessagePreviewsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcChatUnsubscribeFromMessagePreviewsRequest proto.InternalMessageInfo + +type RpcChatUnsubscribeFromMessagePreviewsResponse struct { + Error *RpcChatUnsubscribeFromMessagePreviewsResponseError `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` +} + +func (m *RpcChatUnsubscribeFromMessagePreviewsResponse) Reset() { + *m = RpcChatUnsubscribeFromMessagePreviewsResponse{} +} +func (m *RpcChatUnsubscribeFromMessagePreviewsResponse) String() string { + return proto.CompactTextString(m) +} +func (*RpcChatUnsubscribeFromMessagePreviewsResponse) ProtoMessage() {} +func (*RpcChatUnsubscribeFromMessagePreviewsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 9, 1} +} +func (m *RpcChatUnsubscribeFromMessagePreviewsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcChatUnsubscribeFromMessagePreviewsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcChatUnsubscribeFromMessagePreviewsResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcChatUnsubscribeFromMessagePreviewsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcChatUnsubscribeFromMessagePreviewsResponse.Merge(m, src) +} +func (m *RpcChatUnsubscribeFromMessagePreviewsResponse) XXX_Size() int { + return m.Size() +} +func (m *RpcChatUnsubscribeFromMessagePreviewsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_RpcChatUnsubscribeFromMessagePreviewsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcChatUnsubscribeFromMessagePreviewsResponse proto.InternalMessageInfo + +func (m *RpcChatUnsubscribeFromMessagePreviewsResponse) GetError() *RpcChatUnsubscribeFromMessagePreviewsResponseError { + if m != nil { + return m.Error + } + return nil +} + +type RpcChatUnsubscribeFromMessagePreviewsResponseError struct { + Code RpcChatUnsubscribeFromMessagePreviewsResponseErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.RpcChatUnsubscribeFromMessagePreviewsResponseErrorCode" json:"code,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` +} + +func (m *RpcChatUnsubscribeFromMessagePreviewsResponseError) Reset() { + *m = RpcChatUnsubscribeFromMessagePreviewsResponseError{} +} +func (m *RpcChatUnsubscribeFromMessagePreviewsResponseError) String() string { + return proto.CompactTextString(m) +} +func (*RpcChatUnsubscribeFromMessagePreviewsResponseError) ProtoMessage() {} +func (*RpcChatUnsubscribeFromMessagePreviewsResponseError) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 9, 1, 0} +} +func (m *RpcChatUnsubscribeFromMessagePreviewsResponseError) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcChatUnsubscribeFromMessagePreviewsResponseError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcChatUnsubscribeFromMessagePreviewsResponseError.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RpcChatUnsubscribeFromMessagePreviewsResponseError) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcChatUnsubscribeFromMessagePreviewsResponseError.Merge(m, src) +} +func (m *RpcChatUnsubscribeFromMessagePreviewsResponseError) XXX_Size() int { + return m.Size() +} +func (m *RpcChatUnsubscribeFromMessagePreviewsResponseError) XXX_DiscardUnknown() { + xxx_messageInfo_RpcChatUnsubscribeFromMessagePreviewsResponseError.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcChatUnsubscribeFromMessagePreviewsResponseError proto.InternalMessageInfo + +func (m *RpcChatUnsubscribeFromMessagePreviewsResponseError) GetCode() RpcChatUnsubscribeFromMessagePreviewsResponseErrorCode { + if m != nil { + return m.Code + } + return RpcChatUnsubscribeFromMessagePreviewsResponseError_NULL +} + +func (m *RpcChatUnsubscribeFromMessagePreviewsResponseError) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + type RpcChatReadMessages struct { } @@ -72427,7 +74438,7 @@ func (m *RpcChatReadMessages) Reset() { *m = RpcChatReadMessages{} } func (m *RpcChatReadMessages) String() string { return proto.CompactTextString(m) } func (*RpcChatReadMessages) ProtoMessage() {} func (*RpcChatReadMessages) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 9} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 10} } func (m *RpcChatReadMessages) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72468,7 +74479,7 @@ func (m *RpcChatReadMessagesRequest) Reset() { *m = RpcChatReadMessagesR func (m *RpcChatReadMessagesRequest) String() string { return proto.CompactTextString(m) } func (*RpcChatReadMessagesRequest) ProtoMessage() {} func (*RpcChatReadMessagesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 9, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 10, 0} } func (m *RpcChatReadMessagesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72541,7 +74552,7 @@ func (m *RpcChatReadMessagesResponse) Reset() { *m = RpcChatReadMessages func (m *RpcChatReadMessagesResponse) String() string { return proto.CompactTextString(m) } func (*RpcChatReadMessagesResponse) ProtoMessage() {} func (*RpcChatReadMessagesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 9, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 10, 1} } func (m *RpcChatReadMessagesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72593,7 +74604,7 @@ func (m *RpcChatReadMessagesResponseError) Reset() { *m = RpcChatReadMes func (m *RpcChatReadMessagesResponseError) String() string { return proto.CompactTextString(m) } func (*RpcChatReadMessagesResponseError) ProtoMessage() {} func (*RpcChatReadMessagesResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 9, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 10, 1, 0} } func (m *RpcChatReadMessagesResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72643,7 +74654,7 @@ func (m *RpcChatUnread) Reset() { *m = RpcChatUnread{} } func (m *RpcChatUnread) String() string { return proto.CompactTextString(m) } func (*RpcChatUnread) ProtoMessage() {} func (*RpcChatUnread) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 10} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 11} } func (m *RpcChatUnread) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72681,7 +74692,7 @@ func (m *RpcChatUnreadRequest) Reset() { *m = RpcChatUnreadRequest{} } func (m *RpcChatUnreadRequest) String() string { return proto.CompactTextString(m) } func (*RpcChatUnreadRequest) ProtoMessage() {} func (*RpcChatUnreadRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 10, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 11, 0} } func (m *RpcChatUnreadRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72733,7 +74744,7 @@ func (m *RpcChatUnreadResponse) Reset() { *m = RpcChatUnreadResponse{} } func (m *RpcChatUnreadResponse) String() string { return proto.CompactTextString(m) } func (*RpcChatUnreadResponse) ProtoMessage() {} func (*RpcChatUnreadResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 10, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 11, 1} } func (m *RpcChatUnreadResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72785,7 +74796,7 @@ func (m *RpcChatUnreadResponseError) Reset() { *m = RpcChatUnreadRespons func (m *RpcChatUnreadResponseError) String() string { return proto.CompactTextString(m) } func (*RpcChatUnreadResponseError) ProtoMessage() {} func (*RpcChatUnreadResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 10, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 11, 1, 0} } func (m *RpcChatUnreadResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72924,9 +74935,11 @@ func init() { proto.RegisterEnum("anytype.RpcAppShutdownResponseErrorCode", RpcAppShutdownResponseErrorCode_name, RpcAppShutdownResponseErrorCode_value) proto.RegisterEnum("anytype.RpcSpaceLeaveApproveResponseErrorCode", RpcSpaceLeaveApproveResponseErrorCode_name, RpcSpaceLeaveApproveResponseErrorCode_value) proto.RegisterEnum("anytype.RpcSpaceMakeShareableResponseErrorCode", RpcSpaceMakeShareableResponseErrorCode_name, RpcSpaceMakeShareableResponseErrorCode_value) + proto.RegisterEnum("anytype.RpcSpaceInviteGenerateRequestInviteType", RpcSpaceInviteGenerateRequestInviteType_name, RpcSpaceInviteGenerateRequestInviteType_value) proto.RegisterEnum("anytype.RpcSpaceInviteGenerateResponseErrorCode", RpcSpaceInviteGenerateResponseErrorCode_name, RpcSpaceInviteGenerateResponseErrorCode_value) proto.RegisterEnum("anytype.RpcSpaceStopSharingResponseErrorCode", RpcSpaceStopSharingResponseErrorCode_name, RpcSpaceStopSharingResponseErrorCode_value) proto.RegisterEnum("anytype.RpcSpaceInviteGetCurrentResponseErrorCode", RpcSpaceInviteGetCurrentResponseErrorCode_name, RpcSpaceInviteGetCurrentResponseErrorCode_value) + proto.RegisterEnum("anytype.RpcSpaceInviteGetGuestResponseErrorCode", RpcSpaceInviteGetGuestResponseErrorCode_name, RpcSpaceInviteGetGuestResponseErrorCode_value) proto.RegisterEnum("anytype.RpcSpaceInviteRevokeResponseErrorCode", RpcSpaceInviteRevokeResponseErrorCode_name, RpcSpaceInviteRevokeResponseErrorCode_value) proto.RegisterEnum("anytype.RpcSpaceInviteViewResponseErrorCode", RpcSpaceInviteViewResponseErrorCode_name, RpcSpaceInviteViewResponseErrorCode_value) proto.RegisterEnum("anytype.RpcSpaceJoinResponseErrorCode", RpcSpaceJoinResponseErrorCode_name, RpcSpaceJoinResponseErrorCode_value) @@ -73075,6 +75088,14 @@ func init() { proto.RegisterEnum("anytype.RpcLinkPreviewResponseErrorCode", RpcLinkPreviewResponseErrorCode_name, RpcLinkPreviewResponseErrorCode_value) proto.RegisterEnum("anytype.RpcUnsplashSearchResponseErrorCode", RpcUnsplashSearchResponseErrorCode_name, RpcUnsplashSearchResponseErrorCode_value) proto.RegisterEnum("anytype.RpcUnsplashDownloadResponseErrorCode", RpcUnsplashDownloadResponseErrorCode_name, RpcUnsplashDownloadResponseErrorCode_value) + proto.RegisterEnum("anytype.RpcAIProvider", RpcAIProvider_name, RpcAIProvider_value) + proto.RegisterEnum("anytype.RpcAIWritingToolsRequestWritingMode", RpcAIWritingToolsRequestWritingMode_name, RpcAIWritingToolsRequestWritingMode_value) + proto.RegisterEnum("anytype.RpcAIWritingToolsRequestLanguage", RpcAIWritingToolsRequestLanguage_name, RpcAIWritingToolsRequestLanguage_value) + proto.RegisterEnum("anytype.RpcAIWritingToolsResponseErrorCode", RpcAIWritingToolsResponseErrorCode_name, RpcAIWritingToolsResponseErrorCode_value) + proto.RegisterEnum("anytype.RpcAIAutofillRequestAutofillMode", RpcAIAutofillRequestAutofillMode_name, RpcAIAutofillRequestAutofillMode_value) + proto.RegisterEnum("anytype.RpcAIAutofillResponseErrorCode", RpcAIAutofillResponseErrorCode_name, RpcAIAutofillResponseErrorCode_value) + proto.RegisterEnum("anytype.RpcAIListSummaryResponseErrorCode", RpcAIListSummaryResponseErrorCode_name, RpcAIListSummaryResponseErrorCode_value) + proto.RegisterEnum("anytype.RpcAIObjectCreateFromUrlResponseErrorCode", RpcAIObjectCreateFromUrlResponseErrorCode_name, RpcAIObjectCreateFromUrlResponseErrorCode_value) proto.RegisterEnum("anytype.RpcGalleryDownloadManifestResponseErrorCode", RpcGalleryDownloadManifestResponseErrorCode_name, RpcGalleryDownloadManifestResponseErrorCode_value) proto.RegisterEnum("anytype.RpcGalleryDownloadIndexResponseErrorCode", RpcGalleryDownloadIndexResponseErrorCode_name, RpcGalleryDownloadIndexResponseErrorCode_value) proto.RegisterEnum("anytype.RpcBlockReplaceResponseErrorCode", RpcBlockReplaceResponseErrorCode_name, RpcBlockReplaceResponseErrorCode_value) @@ -73149,6 +75170,7 @@ func init() { proto.RegisterEnum("anytype.RpcBlockDataviewViewDeleteResponseErrorCode", RpcBlockDataviewViewDeleteResponseErrorCode_name, RpcBlockDataviewViewDeleteResponseErrorCode_value) proto.RegisterEnum("anytype.RpcBlockDataviewViewSetPositionResponseErrorCode", RpcBlockDataviewViewSetPositionResponseErrorCode_name, RpcBlockDataviewViewSetPositionResponseErrorCode_value) proto.RegisterEnum("anytype.RpcBlockDataviewViewSetActiveResponseErrorCode", RpcBlockDataviewViewSetActiveResponseErrorCode_name, RpcBlockDataviewViewSetActiveResponseErrorCode_value) + proto.RegisterEnum("anytype.RpcBlockDataviewRelationSetResponseErrorCode", RpcBlockDataviewRelationSetResponseErrorCode_name, RpcBlockDataviewRelationSetResponseErrorCode_value) proto.RegisterEnum("anytype.RpcBlockDataviewRelationAddResponseErrorCode", RpcBlockDataviewRelationAddResponseErrorCode_name, RpcBlockDataviewRelationAddResponseErrorCode_value) proto.RegisterEnum("anytype.RpcBlockDataviewRelationDeleteResponseErrorCode", RpcBlockDataviewRelationDeleteResponseErrorCode_name, RpcBlockDataviewRelationDeleteResponseErrorCode_value) proto.RegisterEnum("anytype.RpcBlockDataviewSetSourceResponseErrorCode", RpcBlockDataviewSetSourceResponseErrorCode_name, RpcBlockDataviewSetSourceResponseErrorCode_value) @@ -73224,6 +75246,7 @@ func init() { proto.RegisterEnum("anytype.RpcChatSubscribeLastMessagesResponseErrorCode", RpcChatSubscribeLastMessagesResponseErrorCode_name, RpcChatSubscribeLastMessagesResponseErrorCode_value) proto.RegisterEnum("anytype.RpcChatUnsubscribeResponseErrorCode", RpcChatUnsubscribeResponseErrorCode_name, RpcChatUnsubscribeResponseErrorCode_value) proto.RegisterEnum("anytype.RpcChatSubscribeToMessagePreviewsResponseErrorCode", RpcChatSubscribeToMessagePreviewsResponseErrorCode_name, RpcChatSubscribeToMessagePreviewsResponseErrorCode_value) + proto.RegisterEnum("anytype.RpcChatUnsubscribeFromMessagePreviewsResponseErrorCode", RpcChatUnsubscribeFromMessagePreviewsResponseErrorCode_name, RpcChatUnsubscribeFromMessagePreviewsResponseErrorCode_value) proto.RegisterEnum("anytype.RpcChatReadMessagesReadType", RpcChatReadMessagesReadType_name, RpcChatReadMessagesReadType_value) proto.RegisterEnum("anytype.RpcChatReadMessagesResponseErrorCode", RpcChatReadMessagesResponseErrorCode_name, RpcChatReadMessagesResponseErrorCode_value) proto.RegisterEnum("anytype.RpcChatUnreadResponseErrorCode", RpcChatUnreadResponseErrorCode_name, RpcChatUnreadResponseErrorCode_value) @@ -73262,6 +75285,10 @@ func init() { proto.RegisterType((*RpcSpaceInviteGetCurrentRequest)(nil), "anytype.Rpc.Space.InviteGetCurrent.Request") proto.RegisterType((*RpcSpaceInviteGetCurrentResponse)(nil), "anytype.Rpc.Space.InviteGetCurrent.Response") proto.RegisterType((*RpcSpaceInviteGetCurrentResponseError)(nil), "anytype.Rpc.Space.InviteGetCurrent.Response.Error") + proto.RegisterType((*RpcSpaceInviteGetGuest)(nil), "anytype.Rpc.Space.InviteGetGuest") + proto.RegisterType((*RpcSpaceInviteGetGuestRequest)(nil), "anytype.Rpc.Space.InviteGetGuest.Request") + proto.RegisterType((*RpcSpaceInviteGetGuestResponse)(nil), "anytype.Rpc.Space.InviteGetGuest.Response") + proto.RegisterType((*RpcSpaceInviteGetGuestResponseError)(nil), "anytype.Rpc.Space.InviteGetGuest.Response.Error") proto.RegisterType((*RpcSpaceInviteRevoke)(nil), "anytype.Rpc.Space.InviteRevoke") proto.RegisterType((*RpcSpaceInviteRevokeRequest)(nil), "anytype.Rpc.Space.InviteRevoke.Request") proto.RegisterType((*RpcSpaceInviteRevokeResponse)(nil), "anytype.Rpc.Space.InviteRevoke.Response") @@ -73858,6 +75885,24 @@ func init() { proto.RegisterType((*RpcUnsplashDownloadRequest)(nil), "anytype.Rpc.Unsplash.Download.Request") proto.RegisterType((*RpcUnsplashDownloadResponse)(nil), "anytype.Rpc.Unsplash.Download.Response") proto.RegisterType((*RpcUnsplashDownloadResponseError)(nil), "anytype.Rpc.Unsplash.Download.Response.Error") + proto.RegisterType((*RpcAI)(nil), "anytype.Rpc.AI") + proto.RegisterType((*RpcAIWritingTools)(nil), "anytype.Rpc.AI.WritingTools") + proto.RegisterType((*RpcAIWritingToolsRequest)(nil), "anytype.Rpc.AI.WritingTools.Request") + proto.RegisterType((*RpcAIWritingToolsResponse)(nil), "anytype.Rpc.AI.WritingTools.Response") + proto.RegisterType((*RpcAIWritingToolsResponseError)(nil), "anytype.Rpc.AI.WritingTools.Response.Error") + proto.RegisterType((*RpcAIAutofill)(nil), "anytype.Rpc.AI.Autofill") + proto.RegisterType((*RpcAIAutofillRequest)(nil), "anytype.Rpc.AI.Autofill.Request") + proto.RegisterType((*RpcAIAutofillResponse)(nil), "anytype.Rpc.AI.Autofill.Response") + proto.RegisterType((*RpcAIAutofillResponseError)(nil), "anytype.Rpc.AI.Autofill.Response.Error") + proto.RegisterType((*RpcAIListSummary)(nil), "anytype.Rpc.AI.ListSummary") + proto.RegisterType((*RpcAIListSummaryRequest)(nil), "anytype.Rpc.AI.ListSummary.Request") + proto.RegisterType((*RpcAIListSummaryResponse)(nil), "anytype.Rpc.AI.ListSummary.Response") + proto.RegisterType((*RpcAIListSummaryResponseError)(nil), "anytype.Rpc.AI.ListSummary.Response.Error") + proto.RegisterType((*RpcAIObjectCreateFromUrl)(nil), "anytype.Rpc.AI.ObjectCreateFromUrl") + proto.RegisterType((*RpcAIObjectCreateFromUrlRequest)(nil), "anytype.Rpc.AI.ObjectCreateFromUrl.Request") + proto.RegisterType((*RpcAIObjectCreateFromUrlResponse)(nil), "anytype.Rpc.AI.ObjectCreateFromUrl.Response") + proto.RegisterType((*RpcAIObjectCreateFromUrlResponseError)(nil), "anytype.Rpc.AI.ObjectCreateFromUrl.Response.Error") + proto.RegisterType((*RpcAIProviderConfig)(nil), "anytype.Rpc.AI.ProviderConfig") proto.RegisterType((*RpcGallery)(nil), "anytype.Rpc.Gallery") proto.RegisterType((*RpcGalleryDownloadManifest)(nil), "anytype.Rpc.Gallery.DownloadManifest") proto.RegisterType((*RpcGalleryDownloadManifestRequest)(nil), "anytype.Rpc.Gallery.DownloadManifest.Request") @@ -74172,6 +76217,10 @@ func init() { proto.RegisterType((*RpcBlockDataviewViewSetActiveResponse)(nil), "anytype.Rpc.BlockDataview.View.SetActive.Response") proto.RegisterType((*RpcBlockDataviewViewSetActiveResponseError)(nil), "anytype.Rpc.BlockDataview.View.SetActive.Response.Error") proto.RegisterType((*RpcBlockDataviewRelation)(nil), "anytype.Rpc.BlockDataview.Relation") + proto.RegisterType((*RpcBlockDataviewRelationSet)(nil), "anytype.Rpc.BlockDataview.Relation.Set") + proto.RegisterType((*RpcBlockDataviewRelationSetRequest)(nil), "anytype.Rpc.BlockDataview.Relation.Set.Request") + proto.RegisterType((*RpcBlockDataviewRelationSetResponse)(nil), "anytype.Rpc.BlockDataview.Relation.Set.Response") + proto.RegisterType((*RpcBlockDataviewRelationSetResponseError)(nil), "anytype.Rpc.BlockDataview.Relation.Set.Response.Error") proto.RegisterType((*RpcBlockDataviewRelationAdd)(nil), "anytype.Rpc.BlockDataview.Relation.Add") proto.RegisterType((*RpcBlockDataviewRelationAddRequest)(nil), "anytype.Rpc.BlockDataview.Relation.Add.Request") proto.RegisterType((*RpcBlockDataviewRelationAddResponse)(nil), "anytype.Rpc.BlockDataview.Relation.Add.Response") @@ -74482,6 +76531,10 @@ func init() { proto.RegisterType((*RpcChatSubscribeToMessagePreviewsRequest)(nil), "anytype.Rpc.Chat.SubscribeToMessagePreviews.Request") proto.RegisterType((*RpcChatSubscribeToMessagePreviewsResponse)(nil), "anytype.Rpc.Chat.SubscribeToMessagePreviews.Response") proto.RegisterType((*RpcChatSubscribeToMessagePreviewsResponseError)(nil), "anytype.Rpc.Chat.SubscribeToMessagePreviews.Response.Error") + proto.RegisterType((*RpcChatUnsubscribeFromMessagePreviews)(nil), "anytype.Rpc.Chat.UnsubscribeFromMessagePreviews") + proto.RegisterType((*RpcChatUnsubscribeFromMessagePreviewsRequest)(nil), "anytype.Rpc.Chat.UnsubscribeFromMessagePreviews.Request") + proto.RegisterType((*RpcChatUnsubscribeFromMessagePreviewsResponse)(nil), "anytype.Rpc.Chat.UnsubscribeFromMessagePreviews.Response") + proto.RegisterType((*RpcChatUnsubscribeFromMessagePreviewsResponseError)(nil), "anytype.Rpc.Chat.UnsubscribeFromMessagePreviews.Response.Error") proto.RegisterType((*RpcChatReadMessages)(nil), "anytype.Rpc.Chat.ReadMessages") proto.RegisterType((*RpcChatReadMessagesRequest)(nil), "anytype.Rpc.Chat.ReadMessages.Request") proto.RegisterType((*RpcChatReadMessagesResponse)(nil), "anytype.Rpc.Chat.ReadMessages.Response") @@ -74498,1291 +76551,1354 @@ func init() { func init() { proto.RegisterFile("pb/protos/commands.proto", fileDescriptor_8261c968b2e6f45c) } var fileDescriptor_8261c968b2e6f45c = []byte{ - // 20537 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7d, 0x98, 0x24, 0x49, - 0x55, 0x37, 0x3a, 0x55, 0x59, 0x55, 0xdd, 0x7d, 0xfa, 0x63, 0x6a, 0x72, 0x67, 0x66, 0x67, 0x63, - 0x97, 0xd9, 0x75, 0x58, 0x96, 0x75, 0x59, 0x7a, 0x61, 0x41, 0x64, 0x97, 0x5d, 0x96, 0xea, 0xea, - 0xea, 0xee, 0xda, 0xed, 0xae, 0x6a, 0xb2, 0xaa, 0x67, 0x58, 0xdf, 0xeb, 0x2d, 0x73, 0xaa, 0xa2, - 0xbb, 0x73, 0xa7, 0x3a, 0xb3, 0xc8, 0xcc, 0x9e, 0xd9, 0xe6, 0x3e, 0xef, 0x7d, 0x45, 0x44, 0x50, - 0x44, 0x44, 0x45, 0x45, 0x05, 0x04, 0x44, 0x04, 0x45, 0xe4, 0xfb, 0x05, 0xe5, 0x43, 0x05, 0x41, - 0x44, 0x45, 0xf1, 0x03, 0x50, 0xae, 0xe0, 0x27, 0xbe, 0x8f, 0x5e, 0xaf, 0x5e, 0x05, 0xf1, 0xd5, - 0xd7, 0xfb, 0x64, 0x44, 0x64, 0x66, 0x44, 0x75, 0x65, 0x56, 0x64, 0x75, 0x65, 0xf5, 0x2a, 0xf7, - 0xbf, 0xcc, 0xc8, 0xc8, 0x13, 0x27, 0xce, 0xef, 0x44, 0xc4, 0x89, 0x88, 0x13, 0x27, 0xe0, 0x5c, - 0xef, 0xf2, 0x5d, 0x3d, 0xdb, 0x72, 0x2d, 0xe7, 0xae, 0xb6, 0xb5, 0xb7, 0xa7, 0x9b, 0x1d, 0x67, - 0x91, 0xbc, 0xab, 0x53, 0xba, 0x79, 0xe0, 0x1e, 0xf4, 0x30, 0xba, 0xb5, 0x77, 0x65, 0xe7, 0xae, - 0xae, 0x71, 0xf9, 0xae, 0xde, 0xe5, 0xbb, 0xf6, 0xac, 0x0e, 0xee, 0xfa, 0x3f, 0x90, 0x17, 0x96, - 0x1d, 0xdd, 0x1e, 0x95, 0xab, 0x6b, 0xb5, 0xf5, 0xae, 0xe3, 0x5a, 0x36, 0x66, 0x39, 0xcf, 0x86, - 0x45, 0xe2, 0xab, 0xd8, 0x74, 0x7d, 0x0a, 0x37, 0xed, 0x58, 0xd6, 0x4e, 0x17, 0xd3, 0x6f, 0x97, - 0xf7, 0xb7, 0xef, 0x72, 0x5c, 0x7b, 0xbf, 0xed, 0xb2, 0xaf, 0xb7, 0xf4, 0x7f, 0xed, 0x60, 0xa7, - 0x6d, 0x1b, 0x3d, 0xd7, 0xb2, 0x69, 0x8e, 0x0b, 0x7f, 0xf3, 0x9e, 0x69, 0x50, 0xb4, 0x5e, 0x1b, - 0x7d, 0x65, 0x0a, 0x94, 0x52, 0xaf, 0x87, 0x3e, 0x96, 0x05, 0x58, 0xc5, 0xee, 0x45, 0x6c, 0x3b, - 0x86, 0x65, 0xa2, 0x93, 0x30, 0xa5, 0xe1, 0xe7, 0xef, 0x63, 0xc7, 0xbd, 0x37, 0xf7, 0xd2, 0xbf, - 0x54, 0x32, 0xe8, 0x4d, 0x59, 0x98, 0xd6, 0xb0, 0xd3, 0xb3, 0x4c, 0x07, 0xab, 0xcf, 0x81, 0x3c, - 0xb6, 0x6d, 0xcb, 0x3e, 0x97, 0xb9, 0x25, 0x73, 0xfb, 0xec, 0xdd, 0x77, 0x2c, 0xb2, 0xea, 0x2f, - 0x6a, 0xbd, 0xf6, 0x62, 0xa9, 0xd7, 0x5b, 0x0c, 0x29, 0x2d, 0xfa, 0x3f, 0x2d, 0x56, 0xbc, 0x3f, - 0x34, 0xfa, 0xa3, 0x7a, 0x0e, 0xa6, 0xae, 0xd2, 0x0c, 0xe7, 0xb2, 0xb7, 0x64, 0x6e, 0x9f, 0xd1, - 0xfc, 0x57, 0xef, 0x4b, 0x07, 0xbb, 0xba, 0xd1, 0x75, 0xce, 0x29, 0xf4, 0x0b, 0x7b, 0x45, 0x6f, - 0xc8, 0x40, 0x9e, 0x10, 0x51, 0xcb, 0x90, 0x6b, 0x5b, 0x1d, 0x4c, 0x8a, 0x5f, 0xb8, 0xfb, 0x2e, - 0xf9, 0xe2, 0x17, 0xcb, 0x56, 0x07, 0x6b, 0xe4, 0x67, 0xf5, 0x16, 0x98, 0xf5, 0xc5, 0x12, 0xb2, - 0xc1, 0x27, 0x5d, 0xb8, 0x1b, 0x72, 0x5e, 0x7e, 0x75, 0x1a, 0x72, 0xb5, 0xad, 0xf5, 0xf5, 0xe2, - 0x09, 0xf5, 0x14, 0xcc, 0x6f, 0xd5, 0x1e, 0xaa, 0xd5, 0x2f, 0xd5, 0x5a, 0x15, 0x4d, 0xab, 0x6b, - 0xc5, 0x8c, 0x3a, 0x0f, 0x33, 0x4b, 0xa5, 0xe5, 0x56, 0xb5, 0xb6, 0xb9, 0xd5, 0x2c, 0x66, 0xd1, - 0x6b, 0x15, 0x58, 0x68, 0x60, 0x77, 0x19, 0x5f, 0x35, 0xda, 0xb8, 0xe1, 0xea, 0x2e, 0x46, 0xaf, - 0xc8, 0x04, 0xc2, 0x54, 0xb7, 0xbc, 0x42, 0x83, 0x4f, 0xac, 0x02, 0x4f, 0x3b, 0x54, 0x01, 0x91, - 0xc2, 0x22, 0xfb, 0x7b, 0x91, 0x4b, 0xd3, 0x78, 0x3a, 0x17, 0x9e, 0x0c, 0xb3, 0xdc, 0x37, 0x75, - 0x01, 0x60, 0xa9, 0x54, 0x7e, 0x68, 0x55, 0xab, 0x6f, 0xd5, 0x96, 0x8b, 0x27, 0xbc, 0xf7, 0x95, - 0xba, 0x56, 0x61, 0xef, 0x19, 0xf4, 0xb5, 0x0c, 0x07, 0xe6, 0xb2, 0x08, 0xe6, 0xe2, 0x70, 0x66, - 0x06, 0x00, 0x8a, 0x7e, 0x3a, 0x00, 0x67, 0x55, 0x00, 0xe7, 0x69, 0xc9, 0xc8, 0xa5, 0x0f, 0xd0, - 0x8b, 0xb3, 0x30, 0xdd, 0xd8, 0xdd, 0x77, 0x3b, 0xd6, 0x35, 0x13, 0xcd, 0x04, 0xc8, 0xa0, 0xbf, - 0xe5, 0x65, 0xf2, 0x6c, 0x51, 0x26, 0xb7, 0x1f, 0xae, 0x04, 0xa3, 0x10, 0x21, 0x8d, 0x9f, 0x0c, - 0xa4, 0x51, 0x12, 0xa4, 0xf1, 0x64, 0x59, 0x42, 0xe9, 0xcb, 0xe1, 0xc7, 0x9e, 0x09, 0xf9, 0x46, - 0x4f, 0x6f, 0x63, 0xf4, 0x29, 0x05, 0xe6, 0xd6, 0xb1, 0x7e, 0x15, 0x97, 0x7a, 0x3d, 0xdb, 0xba, - 0x8a, 0x51, 0x39, 0xd4, 0xd7, 0x73, 0x30, 0xe5, 0x78, 0x99, 0xaa, 0x1d, 0x52, 0x83, 0x19, 0xcd, - 0x7f, 0x55, 0xcf, 0x03, 0x18, 0x1d, 0x6c, 0xba, 0x86, 0x6b, 0x60, 0xe7, 0x5c, 0xf6, 0x16, 0xe5, - 0xf6, 0x19, 0x8d, 0x4b, 0x41, 0x5f, 0xc9, 0xca, 0xea, 0x18, 0xe1, 0x62, 0x91, 0xe7, 0x20, 0x42, - 0xaa, 0x6f, 0xcc, 0xca, 0xe8, 0xd8, 0x50, 0x72, 0xc9, 0x64, 0xfb, 0xf3, 0x99, 0xe4, 0xc2, 0xf5, - 0x72, 0xd4, 0xea, 0xad, 0xc6, 0x56, 0x79, 0xad, 0xd5, 0xd8, 0x2c, 0x95, 0x2b, 0x45, 0xac, 0x9e, - 0x86, 0x22, 0x79, 0x6c, 0x55, 0x1b, 0xad, 0xe5, 0xca, 0x7a, 0xa5, 0x59, 0x59, 0x2e, 0x6e, 0xab, - 0x2a, 0x2c, 0x68, 0x95, 0xe7, 0x6e, 0x55, 0x1a, 0xcd, 0xd6, 0x4a, 0xa9, 0xba, 0x5e, 0x59, 0x2e, - 0xee, 0x78, 0x3f, 0xaf, 0x57, 0x37, 0xaa, 0xcd, 0x96, 0x56, 0x29, 0x95, 0xd7, 0x2a, 0xcb, 0xc5, - 0x5d, 0xf5, 0x7a, 0xb8, 0xae, 0x56, 0x6f, 0x95, 0x36, 0x37, 0xb5, 0xfa, 0xc5, 0x4a, 0x8b, 0xfd, - 0xd1, 0x28, 0x1a, 0xb4, 0xa0, 0x66, 0xab, 0xb1, 0x56, 0xd2, 0x2a, 0xa5, 0xa5, 0xf5, 0x4a, 0xf1, - 0x11, 0xf4, 0x22, 0x05, 0xe6, 0x37, 0xf4, 0x2b, 0xb8, 0xb1, 0xab, 0xdb, 0x58, 0xbf, 0xdc, 0xc5, - 0xe8, 0xf1, 0x12, 0x78, 0xa2, 0x4f, 0xf1, 0x78, 0x55, 0x44, 0xbc, 0xee, 0x1a, 0x20, 0x60, 0xa1, - 0x88, 0x08, 0xc0, 0xfe, 0x39, 0x68, 0x06, 0x6b, 0x02, 0x60, 0x4f, 0x4f, 0x48, 0x2f, 0x19, 0x62, - 0xdf, 0xf1, 0x18, 0x40, 0x0c, 0x7d, 0x41, 0x81, 0x85, 0xaa, 0x79, 0xd5, 0x70, 0xf1, 0x2a, 0x36, - 0xb1, 0xed, 0x8d, 0x03, 0x52, 0x30, 0xbc, 0x49, 0xe1, 0x60, 0x58, 0x11, 0x61, 0x78, 0xca, 0x00, - 0xb1, 0x89, 0x65, 0x44, 0x8c, 0xb6, 0x37, 0xc1, 0x8c, 0x41, 0xf2, 0x95, 0x8d, 0x0e, 0x93, 0x58, - 0x98, 0xa0, 0xde, 0x0a, 0xf3, 0xf4, 0x65, 0xc5, 0xe8, 0xe2, 0x87, 0xf0, 0x01, 0x1b, 0x77, 0xc5, - 0x44, 0xf4, 0xbd, 0x41, 0xe3, 0xab, 0x0a, 0x58, 0x7e, 0x53, 0x52, 0xa6, 0x92, 0x81, 0xf9, 0xaa, - 0xc7, 0x42, 0xf3, 0x3b, 0xd4, 0xca, 0x0c, 0xf4, 0x6f, 0x59, 0x98, 0x6d, 0xb8, 0x56, 0xcf, 0x53, - 0x59, 0xc3, 0xdc, 0x91, 0x03, 0xf7, 0x13, 0x7c, 0x1b, 0x2b, 0x8b, 0xe0, 0x3e, 0x79, 0x80, 0x1c, - 0xb9, 0x02, 0x22, 0x5a, 0xd8, 0x57, 0x82, 0x16, 0xb6, 0x22, 0xa0, 0x72, 0x77, 0x22, 0x6a, 0xff, - 0x01, 0xdb, 0xd7, 0xab, 0x14, 0x28, 0xfa, 0x6a, 0xe6, 0x96, 0xf7, 0x6d, 0x1b, 0x9b, 0xae, 0x1c, - 0x08, 0x7f, 0xc4, 0x83, 0xb0, 0x26, 0x82, 0x70, 0x77, 0x8c, 0x32, 0xfb, 0xa5, 0xa4, 0xd8, 0xc6, - 0x3e, 0x12, 0xa0, 0xf9, 0x90, 0x80, 0xe6, 0x37, 0x27, 0x67, 0x2b, 0x19, 0xa4, 0x6b, 0x23, 0x20, - 0x7a, 0x1a, 0x8a, 0xde, 0x98, 0x54, 0x6e, 0x56, 0x2f, 0x56, 0x5a, 0xd5, 0xda, 0xc5, 0x6a, 0xb3, - 0x52, 0xc4, 0xe8, 0x07, 0x15, 0x98, 0xa3, 0xac, 0x69, 0xf8, 0xaa, 0x75, 0x45, 0xb2, 0xd7, 0xfb, - 0x42, 0x42, 0x63, 0x81, 0x2f, 0x21, 0xa2, 0x65, 0x7c, 0x4f, 0x02, 0x63, 0x21, 0x86, 0xdc, 0x63, - 0xa9, 0xb7, 0x3a, 0xd4, 0x0c, 0x76, 0x06, 0xb4, 0x96, 0x81, 0xbd, 0xd5, 0xab, 0x72, 0x00, 0xb4, - 0x92, 0x17, 0x0d, 0x7c, 0x0d, 0x6d, 0x84, 0x98, 0x08, 0x6a, 0x9b, 0x19, 0xaa, 0xb6, 0xd9, 0x41, - 0x6a, 0xfb, 0x3e, 0x7e, 0xcc, 0x5a, 0x12, 0xd1, 0xbb, 0x33, 0x52, 0xdc, 0x1e, 0x27, 0xd1, 0xb3, - 0x43, 0x5f, 0x51, 0xb2, 0xa2, 0xd5, 0x79, 0x13, 0xcc, 0x90, 0xc7, 0x9a, 0xbe, 0x87, 0x59, 0x1b, - 0x0a, 0x13, 0xd4, 0x0b, 0x30, 0x47, 0x33, 0xb6, 0x2d, 0xd3, 0xab, 0x4f, 0x8e, 0x64, 0x10, 0xd2, - 0x3c, 0x10, 0xdb, 0x36, 0xd6, 0x5d, 0xcb, 0x26, 0x34, 0xf2, 0x14, 0x44, 0x2e, 0x09, 0x7d, 0x39, - 0x68, 0x85, 0x15, 0x41, 0x73, 0x9e, 0x9a, 0xa4, 0x2a, 0xc9, 0xf4, 0xe6, 0xea, 0x68, 0xed, 0x8f, - 0xb6, 0xba, 0x96, 0x87, 0xf6, 0x0a, 0x99, 0xda, 0x61, 0xf5, 0x2c, 0xa8, 0x2c, 0xd5, 0xcb, 0x5b, - 0xae, 0xd7, 0x9a, 0x95, 0x5a, 0xb3, 0xb8, 0x3d, 0x50, 0xa3, 0x76, 0xd0, 0x1b, 0x73, 0x90, 0x7b, - 0xd0, 0x32, 0x4c, 0xf4, 0xe2, 0x8c, 0xa0, 0x12, 0x26, 0x76, 0xaf, 0x59, 0xf6, 0x95, 0xa0, 0xa1, - 0x86, 0x09, 0xf1, 0xd8, 0x84, 0xaa, 0xa4, 0x0c, 0x55, 0xa5, 0xdc, 0x20, 0x55, 0xfa, 0x01, 0x5e, - 0x95, 0xee, 0x13, 0x55, 0xe9, 0xb6, 0x01, 0xf2, 0xf7, 0x98, 0x8f, 0xe8, 0x00, 0x3e, 0x1e, 0x74, - 0x00, 0x0f, 0x08, 0x30, 0x3e, 0x49, 0x8e, 0x4c, 0x32, 0x00, 0x3f, 0x9f, 0x6a, 0xc3, 0x1f, 0x04, - 0xf5, 0x4e, 0x04, 0xd4, 0xbb, 0x03, 0xfa, 0x04, 0xe3, 0x70, 0xd7, 0xf1, 0xc8, 0xe1, 0x6e, 0xe2, - 0x8a, 0x7a, 0x06, 0x4e, 0x2d, 0x57, 0x57, 0x56, 0x2a, 0x5a, 0xa5, 0xd6, 0x6c, 0xd5, 0x2a, 0xcd, - 0x4b, 0x75, 0xed, 0xa1, 0x62, 0x17, 0xbd, 0x41, 0x01, 0xf0, 0x24, 0x54, 0xd6, 0xcd, 0x36, 0xee, - 0xca, 0xf5, 0xe8, 0xff, 0x77, 0x36, 0x59, 0x9f, 0x10, 0xd2, 0x8f, 0x80, 0xf3, 0x35, 0x59, 0xf9, - 0x56, 0x19, 0x49, 0x2c, 0x19, 0xa8, 0x6f, 0x7d, 0x2c, 0xd8, 0x9e, 0xd7, 0xc1, 0x49, 0x9f, 0x1e, - 0xcb, 0x3e, 0x78, 0xda, 0xf7, 0xf6, 0x1c, 0x2c, 0x30, 0x58, 0xfc, 0x79, 0xfc, 0x4b, 0x33, 0x32, - 0x13, 0x79, 0x04, 0xd3, 0x6c, 0xda, 0xee, 0x77, 0xef, 0xc1, 0xbb, 0xba, 0x0a, 0xb3, 0x3d, 0x6c, - 0xef, 0x19, 0x8e, 0x63, 0x58, 0x26, 0x5d, 0x90, 0x5b, 0xb8, 0xfb, 0x09, 0x81, 0xc4, 0xc9, 0xda, - 0xe5, 0xe2, 0xa6, 0x6e, 0xbb, 0x46, 0xdb, 0xe8, 0xe9, 0xa6, 0xbb, 0x19, 0x66, 0xd6, 0xf8, 0x3f, - 0xd1, 0x2b, 0x13, 0x4e, 0x6b, 0xc4, 0x9a, 0x44, 0xa8, 0xc4, 0x2f, 0x25, 0x98, 0x92, 0xc4, 0x12, - 0x4c, 0xa6, 0x16, 0x1f, 0x4b, 0x55, 0x2d, 0x06, 0xe0, 0xbd, 0xa3, 0xde, 0x00, 0x67, 0xaa, 0xb5, - 0x72, 0x5d, 0xd3, 0x2a, 0xe5, 0x66, 0x6b, 0xb3, 0xa2, 0x6d, 0x54, 0x1b, 0x8d, 0x6a, 0xbd, 0xd6, - 0x38, 0x4a, 0x6b, 0x47, 0x9f, 0x54, 0x02, 0x8d, 0x59, 0xc6, 0xed, 0xae, 0x61, 0x62, 0xf4, 0xc0, - 0x11, 0x15, 0x46, 0x5c, 0xf5, 0x91, 0xc7, 0x99, 0x95, 0x1f, 0x81, 0xf3, 0xeb, 0x93, 0xe3, 0x3c, - 0x98, 0xe0, 0x7f, 0xe2, 0xe6, 0xff, 0x05, 0x05, 0x4e, 0x71, 0x0d, 0x51, 0xc3, 0x7b, 0x63, 0x5b, - 0xc9, 0xfb, 0x0e, 0xbe, 0xed, 0x56, 0x45, 0x4c, 0x07, 0x59, 0xd3, 0x87, 0xd8, 0x88, 0x80, 0xf5, - 0xad, 0x01, 0xac, 0xeb, 0x02, 0xac, 0xcf, 0x1c, 0x81, 0x66, 0x32, 0x64, 0x7f, 0x21, 0x55, 0x64, - 0x6f, 0x80, 0x33, 0x9b, 0x25, 0xad, 0x59, 0x2d, 0x57, 0x37, 0x4b, 0xde, 0x38, 0xca, 0x0d, 0xd9, - 0x11, 0xe6, 0xba, 0x08, 0xfa, 0x40, 0x7c, 0x3f, 0x9c, 0x83, 0x9b, 0x06, 0x77, 0xb4, 0xe5, 0x5d, - 0xdd, 0xdc, 0xc1, 0xc8, 0x90, 0x81, 0x7a, 0x19, 0xa6, 0xda, 0x24, 0x3b, 0xc5, 0x99, 0xdf, 0xba, - 0x89, 0xe9, 0xcb, 0x69, 0x09, 0x9a, 0xff, 0x2b, 0x7a, 0x17, 0xaf, 0x10, 0x4d, 0x51, 0x21, 0x9e, - 0x1d, 0x0f, 0xde, 0x21, 0xbe, 0x23, 0x74, 0xe3, 0xd3, 0x81, 0x6e, 0x5c, 0x12, 0x74, 0xa3, 0x7c, - 0x34, 0xf2, 0xc9, 0xd4, 0xe4, 0x37, 0x1e, 0x0b, 0x1d, 0x40, 0xa4, 0x36, 0x19, 0xd1, 0xa3, 0xc2, - 0xc0, 0xee, 0xfe, 0x75, 0x0a, 0x14, 0x96, 0x71, 0x17, 0xcb, 0xae, 0x44, 0xfe, 0x5d, 0x56, 0x76, - 0x43, 0x84, 0xc2, 0x40, 0x69, 0x47, 0xaf, 0x8e, 0xb8, 0xc6, 0x1e, 0x76, 0x5c, 0x7d, 0xaf, 0x47, - 0x44, 0xad, 0x68, 0x61, 0x02, 0xfa, 0xce, 0xac, 0xcc, 0x76, 0x49, 0x4c, 0x31, 0xff, 0x39, 0xd6, - 0x14, 0x3f, 0x93, 0x85, 0xe9, 0x06, 0x76, 0xeb, 0x76, 0x07, 0xdb, 0xa8, 0x11, 0x62, 0x74, 0x0b, - 0xcc, 0x12, 0x50, 0xbc, 0x69, 0x66, 0x80, 0x13, 0x9f, 0xa4, 0xde, 0x06, 0x0b, 0xc1, 0x2b, 0xf9, - 0x9d, 0x75, 0xe3, 0x7d, 0xa9, 0xe8, 0xef, 0x33, 0xb2, 0xbb, 0xb8, 0x6c, 0xc9, 0x90, 0x71, 0x13, - 0xd1, 0x4a, 0xe5, 0x76, 0x64, 0x63, 0x49, 0xa5, 0xbf, 0xd1, 0xf5, 0x8e, 0x2c, 0xc0, 0x96, 0xe9, - 0xf8, 0x72, 0x7d, 0x52, 0x02, 0xb9, 0xa2, 0x7f, 0xca, 0x24, 0x9b, 0xc5, 0x84, 0xe5, 0x44, 0x48, - 0xec, 0xa7, 0x12, 0xac, 0x2d, 0x44, 0x12, 0x4b, 0x5f, 0x66, 0x9f, 0x3d, 0x09, 0x85, 0x4b, 0x7a, - 0xb7, 0x8b, 0x5d, 0xf4, 0x5a, 0x05, 0x0a, 0x65, 0x1b, 0xeb, 0x2e, 0x46, 0x38, 0x14, 0x1d, 0x82, - 0x69, 0xdb, 0xb2, 0xdc, 0x4d, 0xdd, 0xdd, 0x65, 0x72, 0x0b, 0xde, 0xd5, 0x67, 0xc2, 0xf5, 0xdb, - 0xfb, 0xdd, 0xae, 0x8b, 0x1f, 0x75, 0x37, 0x6d, 0x63, 0x4f, 0xb7, 0x0f, 0xd6, 0x75, 0x73, 0x67, - 0x5f, 0xdf, 0xc1, 0x8c, 0xbd, 0xa8, 0xcf, 0xcc, 0xd5, 0xe0, 0xe7, 0xf8, 0x8e, 0xe7, 0x01, 0x51, - 0xe8, 0xdf, 0x28, 0xc8, 0x89, 0xb2, 0xb8, 0x48, 0xd9, 0x8b, 0xe8, 0x79, 0x10, 0x4c, 0xef, 0x99, - 0x78, 0xcf, 0x32, 0x8d, 0xb6, 0x6f, 0xad, 0xfa, 0xef, 0xe8, 0x57, 0x02, 0x34, 0x96, 0x04, 0x34, - 0x16, 0xa5, 0x4b, 0x49, 0x06, 0x45, 0x63, 0x84, 0x7e, 0xe7, 0x66, 0xb8, 0x91, 0x76, 0x23, 0xad, - 0x66, 0xbd, 0x55, 0xd6, 0x2a, 0xa5, 0x66, 0xa5, 0xb5, 0x5e, 0x2f, 0x97, 0xd6, 0x5b, 0x5a, 0x65, - 0xb3, 0x5e, 0xc4, 0xde, 0xec, 0x7c, 0x4a, 0xc3, 0x6d, 0xeb, 0x2a, 0xb6, 0xd1, 0x0b, 0x33, 0x72, - 0x10, 0xc5, 0x08, 0x25, 0x0e, 0x3e, 0x45, 0x06, 0xbe, 0x1f, 0x90, 0xf6, 0x14, 0x61, 0x82, 0x65, - 0xcc, 0x47, 0xb4, 0x98, 0x5f, 0x95, 0xea, 0x63, 0x62, 0x49, 0x3d, 0x06, 0x40, 0xfa, 0xc7, 0x2c, - 0x4c, 0x95, 0x2d, 0xf3, 0x2a, 0xb6, 0x5d, 0x7e, 0x92, 0xc5, 0xe3, 0x90, 0xe9, 0xc3, 0xe1, 0x1c, - 0x4c, 0x61, 0xd3, 0xb5, 0xad, 0x9e, 0x3f, 0xcb, 0xf2, 0x5f, 0xd1, 0x9b, 0x93, 0x4a, 0x98, 0x95, - 0x1c, 0xbd, 0xda, 0x3a, 0xb8, 0x20, 0x81, 0x3d, 0xa5, 0xaf, 0xed, 0xbc, 0x21, 0x09, 0x2e, 0x83, - 0x19, 0x48, 0xbf, 0x1f, 0xfb, 0xa2, 0x02, 0xf3, 0xb4, 0xdd, 0x36, 0x30, 0x31, 0x0b, 0x51, 0x9d, - 0x5f, 0xe7, 0xec, 0x13, 0xfe, 0xda, 0x09, 0x41, 0xfc, 0x05, 0xbd, 0xd7, 0x0b, 0xd6, 0xbc, 0xd7, - 0x4e, 0x68, 0xec, 0x9d, 0xaa, 0xf9, 0x52, 0x01, 0x72, 0xfa, 0xbe, 0xbb, 0x8b, 0xfe, 0x4d, 0x7a, - 0xc6, 0x2b, 0xf4, 0x23, 0x8c, 0x9f, 0x08, 0x48, 0x4e, 0x43, 0xde, 0xb5, 0xae, 0x60, 0x5f, 0x0e, - 0xf4, 0xc5, 0x83, 0x43, 0xef, 0xf5, 0x9a, 0xe4, 0x03, 0x83, 0xc3, 0x7f, 0xf7, 0x0c, 0x2c, 0xbd, - 0xdd, 0xb6, 0xf6, 0x4d, 0xb7, 0xea, 0xaf, 0x7b, 0x87, 0x09, 0xe8, 0xb3, 0x19, 0x99, 0x19, 0xb4, - 0x04, 0x83, 0xc9, 0x20, 0xbb, 0x3c, 0x42, 0x53, 0x5a, 0x84, 0x3b, 0x4a, 0x9b, 0x9b, 0xad, 0x66, - 0xfd, 0xa1, 0x4a, 0x2d, 0xb4, 0x76, 0x5b, 0xd5, 0x5a, 0xab, 0xb9, 0x56, 0x69, 0x95, 0xb7, 0x34, - 0xb2, 0x38, 0x59, 0x2a, 0x97, 0xeb, 0x5b, 0xb5, 0x66, 0x11, 0xa3, 0xb7, 0x65, 0x61, 0xae, 0xdc, - 0xb5, 0x9c, 0x00, 0xe1, 0x9b, 0x43, 0x84, 0x03, 0x31, 0x66, 0x38, 0x31, 0xa2, 0xff, 0x99, 0x91, - 0xf5, 0x74, 0xf0, 0x05, 0xc2, 0x91, 0x8f, 0xe8, 0xa5, 0xde, 0x2c, 0xe5, 0xe9, 0x30, 0x9c, 0x5e, - 0xfa, 0x4d, 0xe2, 0xf3, 0x15, 0x98, 0x2a, 0x51, 0xc5, 0x40, 0x7f, 0x92, 0x81, 0x42, 0xd9, 0x32, - 0xb7, 0x8d, 0x1d, 0xcf, 0x82, 0xc4, 0xa6, 0x7e, 0xb9, 0x8b, 0x97, 0x75, 0x57, 0xbf, 0x6a, 0xe0, - 0x6b, 0xa4, 0x02, 0xd3, 0x5a, 0x5f, 0xaa, 0xc7, 0x14, 0x4b, 0xc1, 0x97, 0xf7, 0x77, 0x08, 0x53, - 0xd3, 0x1a, 0x9f, 0xe4, 0x8d, 0x1f, 0xf4, 0x75, 0xd3, 0xc6, 0x36, 0xee, 0x62, 0xdd, 0xc1, 0xde, - 0x5c, 0xcc, 0xc4, 0x5d, 0xa2, 0xb4, 0xd3, 0x5a, 0xd4, 0x67, 0xf5, 0x02, 0xcc, 0xd1, 0x4f, 0xc4, - 0xfe, 0x71, 0x88, 0x1a, 0x4f, 0x6b, 0x42, 0x9a, 0xfa, 0x64, 0xc8, 0xe3, 0x47, 0x5d, 0x5b, 0x3f, - 0xd7, 0x21, 0x78, 0x5d, 0xbf, 0x48, 0x5d, 0x1d, 0x17, 0x7d, 0x57, 0xc7, 0xc5, 0x06, 0x71, 0x84, - 0xd4, 0x68, 0x2e, 0xf4, 0xc9, 0xe9, 0xc0, 0x7a, 0x79, 0x9b, 0x12, 0x2a, 0x86, 0x0a, 0x39, 0x53, - 0xdf, 0xc3, 0x4c, 0x2f, 0xc8, 0xb3, 0x7a, 0x07, 0x9c, 0xd4, 0xaf, 0xea, 0xae, 0x6e, 0xaf, 0x5b, - 0x6d, 0xbd, 0x4b, 0x86, 0x4d, 0xbf, 0xe5, 0xf7, 0x7f, 0x20, 0xdb, 0x50, 0xae, 0x65, 0x63, 0x92, - 0xcb, 0xdf, 0x86, 0xf2, 0x13, 0x3c, 0xea, 0x46, 0xdb, 0x32, 0x09, 0xff, 0x8a, 0x46, 0x9e, 0x3d, - 0xa9, 0x74, 0x0c, 0xc7, 0xab, 0x08, 0xa1, 0x52, 0xa3, 0xfb, 0x29, 0x8d, 0x03, 0xb3, 0x4d, 0xb6, - 0xa0, 0xa6, 0xb5, 0xa8, 0xcf, 0xea, 0x12, 0xcc, 0xb2, 0xdd, 0x97, 0x0d, 0x4f, 0xaf, 0x0a, 0x44, - 0xaf, 0x6e, 0x11, 0x1d, 0xc9, 0x28, 0x9e, 0x8b, 0xb5, 0x30, 0x9f, 0xc6, 0xff, 0xa4, 0x3e, 0x07, - 0x6e, 0x64, 0xaf, 0xe5, 0x7d, 0xc7, 0xb5, 0xf6, 0x28, 0xe8, 0x2b, 0x46, 0x97, 0xd6, 0x60, 0x8a, - 0xd4, 0x20, 0x2e, 0x8b, 0x7a, 0x37, 0x9c, 0xee, 0xd9, 0x78, 0x1b, 0xdb, 0x0f, 0xeb, 0x7b, 0xfb, - 0x8f, 0x36, 0x6d, 0xdd, 0x74, 0x7a, 0x96, 0xed, 0x9e, 0x9b, 0x26, 0xcc, 0x0f, 0xfc, 0xa6, 0xde, - 0x09, 0xa7, 0x1e, 0x71, 0x2c, 0xb3, 0xd4, 0x33, 0xd6, 0x0d, 0xc7, 0xc5, 0x66, 0xa9, 0xd3, 0xb1, - 0xcf, 0xcd, 0x90, 0xb2, 0x0e, 0x7f, 0x60, 0xdd, 0xea, 0x34, 0x14, 0xa8, 0xb0, 0xd1, 0x2b, 0xf2, - 0xd2, 0x1e, 0xa7, 0xac, 0xfa, 0xb1, 0x76, 0xe0, 0x53, 0x60, 0x8a, 0xf5, 0x87, 0x04, 0xd6, 0xd9, - 0xbb, 0xcf, 0xf6, 0x2d, 0x7d, 0x30, 0x2a, 0x9a, 0x9f, 0x4d, 0x7d, 0x1a, 0x14, 0xda, 0x44, 0x08, - 0x04, 0xe1, 0xd9, 0xbb, 0x6f, 0x1c, 0x5c, 0x28, 0xc9, 0xa2, 0xb1, 0xac, 0xe8, 0x73, 0x8a, 0x94, - 0x93, 0x6a, 0x1c, 0xc7, 0xc9, 0xfa, 0x80, 0x2f, 0x67, 0x47, 0xe8, 0x64, 0xef, 0x84, 0xdb, 0x59, - 0x0f, 0xca, 0xac, 0x95, 0xe5, 0xd6, 0xd2, 0x96, 0x3f, 0x5f, 0xf5, 0x6c, 0x98, 0x46, 0xb3, 0xa4, - 0x35, 0x5b, 0xb5, 0xfa, 0xb2, 0x37, 0xcf, 0xbd, 0x03, 0x6e, 0x1b, 0x92, 0xbb, 0xd2, 0x6c, 0xd5, - 0x4a, 0x1b, 0x95, 0xe2, 0xb6, 0x68, 0x09, 0x35, 0x9a, 0xf5, 0xcd, 0x96, 0xb6, 0x55, 0xab, 0x55, - 0x6b, 0xab, 0x94, 0x98, 0x67, 0x7a, 0x9e, 0x0d, 0x33, 0x5c, 0xd2, 0xaa, 0xcd, 0x4a, 0xab, 0x5c, - 0xaf, 0xad, 0x54, 0x57, 0x8b, 0xc6, 0x30, 0x33, 0xea, 0x11, 0xf5, 0x16, 0xb8, 0x49, 0xe0, 0xa4, - 0x5a, 0xaf, 0x79, 0x93, 0xef, 0x72, 0xa9, 0x56, 0xae, 0x78, 0x33, 0xed, 0x2b, 0x2a, 0x82, 0x33, - 0x94, 0x5c, 0x6b, 0xa5, 0xba, 0xce, 0xef, 0x97, 0x7d, 0x22, 0xa3, 0x9e, 0x83, 0xeb, 0xf8, 0x6f, - 0xd5, 0xda, 0xc5, 0xd2, 0x7a, 0x75, 0xb9, 0xf8, 0xeb, 0x19, 0xf5, 0x56, 0xb8, 0x59, 0xf8, 0x8b, - 0x6e, 0x7d, 0xb5, 0xaa, 0xcb, 0xad, 0x8d, 0x6a, 0x63, 0xa3, 0xd4, 0x2c, 0xaf, 0x15, 0x3f, 0x49, - 0x26, 0x26, 0x81, 0xa5, 0xcd, 0x79, 0x8e, 0xbe, 0x8a, 0xb7, 0x00, 0x4a, 0xa2, 0xa2, 0x3e, 0x69, - 0x20, 0xec, 0xf1, 0x16, 0xef, 0xc7, 0x82, 0xb1, 0x64, 0x59, 0x50, 0xa1, 0xa7, 0x24, 0xa0, 0x95, - 0x4c, 0x87, 0x9a, 0x23, 0xa8, 0xd0, 0x2d, 0x70, 0x53, 0xad, 0x42, 0x91, 0xd2, 0x2a, 0xe5, 0xfa, - 0xc5, 0x8a, 0xd6, 0xba, 0x54, 0x5a, 0x5f, 0xaf, 0x34, 0x5b, 0x2b, 0x55, 0xad, 0xd1, 0x2c, 0x6e, - 0xa3, 0x7f, 0xca, 0x06, 0x0b, 0x4e, 0x9c, 0xb4, 0xfe, 0x24, 0x9b, 0xb4, 0x59, 0xc7, 0x2e, 0x2c, - 0x7d, 0x13, 0x14, 0x1c, 0x57, 0x77, 0xf7, 0x1d, 0xd6, 0xaa, 0x1f, 0x37, 0xb8, 0x55, 0x2f, 0x36, - 0x48, 0x26, 0x8d, 0x65, 0x46, 0x9f, 0xcb, 0x24, 0x69, 0xa6, 0x63, 0x58, 0x73, 0x32, 0x46, 0x10, - 0xf1, 0x79, 0x40, 0xbe, 0xb6, 0x57, 0x1b, 0xad, 0xd2, 0xba, 0x56, 0x29, 0x2d, 0x3f, 0x1c, 0xac, - 0x34, 0x61, 0xf5, 0x0c, 0x9c, 0xda, 0xaa, 0x95, 0x96, 0xd6, 0x2b, 0xa4, 0xb9, 0xd4, 0x6b, 0xb5, - 0x4a, 0xd9, 0x93, 0xfb, 0x77, 0x92, 0x7d, 0x1d, 0xcf, 0xde, 0x26, 0x7c, 0x7b, 0x36, 0x11, 0x27, - 0xff, 0xbf, 0x94, 0x76, 0x7f, 0x0a, 0x35, 0x8c, 0xa7, 0x35, 0x5e, 0x1c, 0x3e, 0x2b, 0xe5, 0xf1, - 0x24, 0xc5, 0x49, 0x32, 0x3c, 0xbe, 0x6d, 0x04, 0x3c, 0xce, 0xc0, 0x29, 0x1e, 0x0f, 0xe2, 0xf9, - 0x14, 0x0d, 0xc3, 0x7b, 0x15, 0x98, 0xda, 0x30, 0x76, 0x88, 0xeb, 0xe7, 0x7e, 0x68, 0x7a, 0x2c, - 0x40, 0x36, 0xf0, 0xb4, 0xc9, 0x1a, 0x1d, 0x61, 0x9a, 0x9e, 0x95, 0x5f, 0x49, 0x91, 0x9a, 0x8a, - 0xbf, 0x2b, 0x71, 0xcf, 0xc4, 0x18, 0x8e, 0xe8, 0x99, 0xfe, 0x2c, 0x51, 0xcf, 0x34, 0x98, 0x56, - 0x32, 0x98, 0xec, 0xa3, 0xc1, 0xc4, 0x7b, 0xc6, 0xcc, 0xc1, 0x74, 0x30, 0x4e, 0x90, 0x4d, 0x1a, - 0xef, 0x63, 0xa5, 0x56, 0xdf, 0x5a, 0x5d, 0x6b, 0xad, 0x68, 0x95, 0x0a, 0x5b, 0xd6, 0xdd, 0x41, - 0xef, 0xcc, 0xc2, 0x3c, 0xe3, 0x9d, 0x79, 0x3c, 0xdc, 0x1c, 0x09, 0x1f, 0x13, 0xf4, 0xbf, 0xf3, - 0x53, 0x8a, 0x55, 0x51, 0xd0, 0x4f, 0x8d, 0x13, 0x4e, 0xac, 0xcb, 0xc3, 0x5b, 0x02, 0x71, 0x3f, - 0x28, 0x88, 0xfb, 0x19, 0x89, 0x29, 0xa6, 0x3f, 0xad, 0xf8, 0xeb, 0x19, 0x28, 0x34, 0x70, 0x17, - 0xb7, 0x5d, 0xf4, 0x23, 0xca, 0xc8, 0xda, 0x1e, 0x65, 0x22, 0x2b, 0x89, 0x4c, 0xe4, 0x5c, 0x0a, - 0x26, 0x72, 0x7e, 0x74, 0x13, 0xb9, 0x90, 0xd4, 0x44, 0x9e, 0x8a, 0x30, 0x91, 0xe3, 0xfa, 0x83, - 0x69, 0x99, 0xfe, 0xe0, 0xa3, 0x85, 0xa4, 0x63, 0x2f, 0x85, 0xf4, 0x78, 0x4d, 0xea, 0xef, 0xcb, - 0x27, 0x19, 0xab, 0x07, 0x72, 0x9c, 0x4c, 0xff, 0x5f, 0x93, 0x4b, 0x61, 0x09, 0x50, 0x7d, 0x3c, - 0xdc, 0x1c, 0xbe, 0xb7, 0x2a, 0xcf, 0xab, 0x36, 0x9a, 0x0d, 0x62, 0x47, 0x97, 0xeb, 0x9a, 0xb6, - 0xb5, 0x49, 0x37, 0x8f, 0xce, 0x82, 0x1a, 0x52, 0xd1, 0xb6, 0x6a, 0xd4, 0x6a, 0xde, 0x11, 0xa9, - 0xaf, 0x54, 0x6b, 0xcb, 0xad, 0x60, 0x24, 0xaa, 0xad, 0xd4, 0x8b, 0xbb, 0xea, 0x22, 0xdc, 0xc1, - 0x51, 0x27, 0x5d, 0x1b, 0x2d, 0xa1, 0x54, 0x5b, 0x6e, 0x6d, 0xd4, 0x2a, 0x1b, 0xf5, 0x5a, 0xb5, - 0x4c, 0xd2, 0x1b, 0x95, 0x66, 0xd1, 0xf0, 0xcc, 0xb7, 0x3e, 0x3b, 0xbd, 0x51, 0x29, 0x69, 0xe5, - 0xb5, 0x8a, 0x46, 0x8b, 0x7c, 0x44, 0xbd, 0x0d, 0x2e, 0x94, 0x6a, 0xf5, 0xa6, 0x97, 0x52, 0xaa, - 0x3d, 0xdc, 0x7c, 0x78, 0xb3, 0xd2, 0xda, 0xd4, 0xea, 0xe5, 0x4a, 0xa3, 0xe1, 0x8d, 0x7e, 0xcc, - 0xaa, 0x2f, 0x76, 0xd5, 0x67, 0xc3, 0xbd, 0x1c, 0x6b, 0x95, 0x26, 0xf1, 0x54, 0xd8, 0xa8, 0x13, - 0x67, 0xb5, 0xe5, 0x4a, 0x6b, 0xad, 0xd4, 0x68, 0x55, 0x6b, 0xe5, 0xfa, 0xc6, 0x66, 0xa9, 0x59, - 0xf5, 0x06, 0xc9, 0x4d, 0xad, 0xde, 0xac, 0xb7, 0x2e, 0x56, 0xb4, 0x46, 0xb5, 0x5e, 0x2b, 0x9a, - 0x5e, 0x95, 0xb9, 0x51, 0xd5, 0xb7, 0x6e, 0x2c, 0xf5, 0x26, 0x38, 0xe7, 0xa7, 0xaf, 0xd7, 0x3d, - 0x41, 0x73, 0x76, 0x7e, 0x8f, 0xb7, 0x8d, 0x1a, 0xcd, 0xba, 0x46, 0x2d, 0xfd, 0x8d, 0xea, 0xaa, - 0xe6, 0x4d, 0x4f, 0x8a, 0xcf, 0x4f, 0x75, 0x1e, 0xf0, 0x2f, 0x59, 0xc8, 0x35, 0x5c, 0xab, 0x87, - 0xbe, 0x31, 0xec, 0xe8, 0xce, 0x03, 0xd8, 0xc4, 0x31, 0x61, 0x59, 0x77, 0x75, 0xb6, 0x76, 0xc2, - 0xa5, 0xa0, 0x5f, 0x93, 0xde, 0x4d, 0x0d, 0x2d, 0x25, 0xab, 0x17, 0x31, 0x30, 0x7c, 0x4d, 0xee, - 0x78, 0x59, 0x34, 0xa1, 0x64, 0xed, 0xe1, 0x7b, 0x46, 0xd9, 0x2f, 0x45, 0x70, 0x96, 0x83, 0xd5, - 0x93, 0xbf, 0xaf, 0x32, 0x58, 0xbd, 0x1e, 0xae, 0xeb, 0x53, 0x3e, 0xa2, 0x73, 0xdb, 0xea, 0x37, - 0xc0, 0xe3, 0x38, 0xf5, 0xaf, 0x6c, 0xd4, 0x2f, 0x56, 0x02, 0x45, 0x5f, 0x2e, 0x35, 0x4b, 0xc5, - 0x1d, 0xf4, 0x19, 0x05, 0x72, 0x1b, 0xd6, 0xd5, 0xfe, 0x4d, 0x6c, 0x13, 0x5f, 0xe3, 0x76, 0x3a, - 0xfc, 0x57, 0xf1, 0x38, 0x8d, 0x94, 0xd8, 0x37, 0xa2, 0x1d, 0x56, 0x3e, 0x9b, 0x4d, 0x22, 0xf6, - 0x8d, 0xa3, 0x7a, 0xa9, 0xfc, 0xf5, 0x28, 0x62, 0x8f, 0x10, 0x2d, 0x56, 0x2f, 0xc0, 0xf9, 0xf0, - 0x43, 0x75, 0xb9, 0x52, 0x6b, 0x56, 0x57, 0x1e, 0x0e, 0x85, 0x5b, 0xd5, 0xa4, 0xc4, 0x3f, 0xac, - 0x9b, 0x8b, 0x9f, 0xdf, 0x9f, 0x83, 0xd3, 0xe1, 0xb7, 0xd5, 0x4a, 0xd3, 0xff, 0xf2, 0x08, 0x7a, - 0x71, 0x1e, 0xe6, 0x68, 0xb7, 0xbf, 0xd5, 0xeb, 0x78, 0x16, 0xf3, 0xd3, 0x42, 0x74, 0x6f, 0x87, - 0x93, 0xd5, 0xcd, 0x95, 0x46, 0xc3, 0xb5, 0x6c, 0x7d, 0x07, 0x93, 0x11, 0x92, 0x4a, 0xab, 0x3f, - 0x19, 0xbd, 0x47, 0x7a, 0x2d, 0x5e, 0x1c, 0x6a, 0x68, 0x99, 0x11, 0xa8, 0x7f, 0x51, 0x6a, 0xed, - 0x5c, 0x82, 0x60, 0x32, 0xf4, 0x1f, 0x19, 0x73, 0x9b, 0x8b, 0xc6, 0x65, 0xfb, 0xc2, 0x4b, 0xb2, - 0x30, 0xd3, 0x34, 0xf6, 0xf0, 0x0b, 0x2c, 0x13, 0x3b, 0xea, 0x14, 0x28, 0xab, 0x1b, 0xcd, 0xe2, - 0x09, 0xef, 0xc1, 0x9b, 0xca, 0x64, 0xc8, 0x43, 0xc5, 0x2b, 0xc0, 0x7b, 0x28, 0x35, 0x8b, 0x8a, - 0xf7, 0xb0, 0x51, 0x69, 0x16, 0x73, 0xde, 0x43, 0xad, 0xd2, 0x2c, 0xe6, 0xbd, 0x87, 0xcd, 0xf5, - 0x66, 0xb1, 0xe0, 0x3d, 0x54, 0x1b, 0xcd, 0xe2, 0x94, 0xf7, 0xb0, 0xd4, 0x68, 0x16, 0xa7, 0xbd, - 0x87, 0x8b, 0x8d, 0x66, 0x71, 0xc6, 0x7b, 0x28, 0x37, 0x9b, 0x45, 0xf0, 0x1e, 0x1e, 0x6c, 0x34, - 0x8b, 0xb3, 0xde, 0x43, 0xa9, 0xdc, 0x2c, 0xce, 0x91, 0x87, 0x4a, 0xb3, 0x38, 0xef, 0x3d, 0x34, - 0x1a, 0xcd, 0xe2, 0x02, 0xa1, 0xdc, 0x68, 0x16, 0x4f, 0x92, 0xb2, 0xaa, 0xcd, 0x62, 0xd1, 0x7b, - 0x58, 0x6b, 0x34, 0x8b, 0xa7, 0x48, 0xe6, 0x46, 0xb3, 0xa8, 0x92, 0x42, 0x1b, 0xcd, 0xe2, 0x75, - 0x24, 0x4f, 0xa3, 0x59, 0x3c, 0x4d, 0x8a, 0x68, 0x34, 0x8b, 0x67, 0x08, 0x1b, 0x95, 0x66, 0xf1, - 0x2c, 0xc9, 0xa3, 0x35, 0x8b, 0xd7, 0x93, 0x4f, 0xb5, 0x66, 0xf1, 0x1c, 0x61, 0xac, 0xd2, 0x2c, - 0xde, 0x40, 0x1e, 0xb4, 0x66, 0x11, 0x91, 0x4f, 0xa5, 0x66, 0xf1, 0x46, 0xf4, 0x38, 0x98, 0x59, - 0xc5, 0x2e, 0x05, 0x11, 0x15, 0x41, 0x59, 0xc5, 0x2e, 0x3f, 0x79, 0x7e, 0x6d, 0x0e, 0xae, 0x67, - 0x0b, 0x2e, 0x2b, 0xb6, 0xb5, 0xb7, 0x8e, 0x77, 0xf4, 0xf6, 0x41, 0xe5, 0x51, 0xcf, 0x94, 0x43, - 0x2f, 0xcf, 0x08, 0xeb, 0xcb, 0xbd, 0xb0, 0x37, 0x22, 0xcf, 0xb1, 0xa6, 0xaf, 0xbf, 0x62, 0xac, - 0x88, 0x2b, 0xc6, 0x51, 0xc6, 0x5e, 0x4e, 0xc6, 0xd8, 0xfb, 0x07, 0xbe, 0x31, 0x08, 0xdb, 0x43, - 0x99, 0xbe, 0xed, 0x21, 0xaf, 0x85, 0xf5, 0xb0, 0xed, 0x58, 0xa6, 0xde, 0x6d, 0x30, 0x67, 0x20, - 0x3a, 0xbf, 0xec, 0x4f, 0x56, 0x9f, 0xeb, 0x37, 0x2a, 0x6a, 0xf0, 0x3d, 0x2b, 0x6e, 0x49, 0xaa, - 0x5f, 0x42, 0x11, 0xed, 0xeb, 0x93, 0x41, 0xfb, 0x6a, 0x0a, 0xed, 0xeb, 0x39, 0x47, 0xa0, 0x9d, - 0xac, 0xa9, 0x55, 0x47, 0x9b, 0x64, 0x86, 0xae, 0xf2, 0xfe, 0x6e, 0x94, 0x82, 0x3e, 0x93, 0x85, - 0xb3, 0x15, 0x73, 0xd0, 0x24, 0x85, 0x57, 0xa3, 0xb7, 0xf1, 0xd0, 0x6c, 0x8a, 0x22, 0xbd, 0x77, - 0x60, 0xb5, 0x07, 0xd3, 0x8c, 0x90, 0xe8, 0x6f, 0x05, 0x12, 0x6d, 0x08, 0x12, 0x7d, 0x60, 0x74, - 0xd2, 0xc9, 0x04, 0x5a, 0x1b, 0x6b, 0xdf, 0x95, 0x43, 0x7f, 0x9e, 0x85, 0x53, 0xd4, 0x9f, 0xef, - 0x41, 0x3a, 0x27, 0x22, 0xbd, 0xbd, 0x68, 0x7d, 0x75, 0xc3, 0xf9, 0x13, 0xd5, 0x6f, 0x2e, 0x05, - 0xbd, 0x91, 0x17, 0xf8, 0x43, 0xa2, 0xc0, 0x23, 0xfa, 0xf1, 0xfe, 0xe2, 0x22, 0x64, 0xfd, 0xeb, - 0x81, 0xac, 0x6b, 0x82, 0xac, 0xef, 0x1d, 0x89, 0xea, 0xf1, 0x8a, 0xf9, 0xcb, 0x39, 0x78, 0x1c, - 0xe5, 0x90, 0x29, 0x02, 0xed, 0x07, 0x4b, 0x66, 0x47, 0xc3, 0x8e, 0xab, 0xdb, 0xae, 0x10, 0xca, - 0xa2, 0x6f, 0xd2, 0x9d, 0x49, 0x61, 0xd2, 0x9d, 0x1d, 0x3a, 0xe9, 0x46, 0xef, 0xe6, 0x0d, 0xbc, - 0x4b, 0x22, 0xb2, 0xa5, 0x18, 0x0c, 0x22, 0x6a, 0x18, 0xd5, 0xa2, 0x02, 0xcb, 0xef, 0x5b, 0x04, - 0x94, 0x57, 0x8e, 0x5c, 0x42, 0x32, 0xc4, 0x7f, 0x6d, 0xbc, 0x96, 0x78, 0x8e, 0xff, 0x26, 0x9a, - 0x8d, 0xc5, 0x4e, 0xaa, 0x53, 0xa8, 0x57, 0x4e, 0xc3, 0x0c, 0xe9, 0x72, 0xd6, 0x0d, 0xf3, 0x0a, - 0xfa, 0x33, 0x05, 0xe6, 0x6a, 0xf8, 0x5a, 0x79, 0x57, 0xef, 0x76, 0xb1, 0xb9, 0x83, 0xd1, 0x23, - 0x82, 0x6d, 0xaf, 0xf7, 0x7a, 0xb5, 0x70, 0xb7, 0xd6, 0x7f, 0x55, 0x1f, 0x80, 0xbc, 0xd3, 0xb6, - 0x7a, 0xd4, 0xab, 0x6c, 0x81, 0x73, 0x0d, 0x13, 0x57, 0x9c, 0x4b, 0xfb, 0xee, 0xee, 0x22, 0x29, - 0xab, 0xd4, 0x33, 0x1a, 0xde, 0x0f, 0x1a, 0xfd, 0x8f, 0x8d, 0x93, 0x7f, 0x39, 0xb0, 0x33, 0xce, - 0xc4, 0x74, 0xc6, 0x01, 0xe3, 0x8b, 0x3c, 0xd3, 0x11, 0x8b, 0x24, 0xb7, 0xc0, 0x6c, 0xdb, 0xcf, - 0x12, 0x9c, 0x99, 0xe3, 0x93, 0xd0, 0x5f, 0x24, 0xea, 0xae, 0xa5, 0x0a, 0x4f, 0xa6, 0x55, 0x78, - 0xcc, 0xa6, 0xe6, 0x19, 0x38, 0xd5, 0xac, 0xd7, 0x5b, 0x1b, 0xa5, 0xda, 0xc3, 0x61, 0xac, 0x8a, - 0x6d, 0xf4, 0x9a, 0x1c, 0x2c, 0x34, 0xac, 0xee, 0x55, 0x1c, 0xe2, 0x5c, 0x15, 0x9c, 0x31, 0x79, - 0x39, 0x65, 0x0e, 0xc9, 0x49, 0x3d, 0x0b, 0x05, 0xdd, 0x74, 0xae, 0x61, 0xdf, 0xfc, 0x67, 0x6f, - 0x0c, 0xc6, 0x0f, 0xf3, 0x1d, 0x81, 0x26, 0xc2, 0x78, 0xdf, 0x10, 0x49, 0x8a, 0x5c, 0x45, 0x00, - 0x79, 0x01, 0xe6, 0x1c, 0xea, 0xb3, 0xd1, 0xe4, 0x5c, 0x73, 0x84, 0x34, 0xc2, 0x22, 0x75, 0x1a, - 0x52, 0x18, 0x8b, 0xe4, 0x0d, 0xbd, 0x21, 0xe8, 0x3f, 0xb6, 0x04, 0x88, 0x4b, 0x47, 0x61, 0x2c, - 0x19, 0xc8, 0xaf, 0x1b, 0xf7, 0x24, 0xfe, 0x1c, 0x9c, 0x66, 0xcd, 0xbe, 0x55, 0x5e, 0x2b, 0xad, - 0xaf, 0x57, 0x6a, 0xab, 0x95, 0x56, 0x75, 0x99, 0xee, 0x01, 0x87, 0x29, 0xa5, 0x66, 0xb3, 0xb2, - 0xb1, 0xd9, 0x6c, 0xb4, 0x2a, 0xcf, 0x2b, 0x57, 0x2a, 0xcb, 0xc4, 0x1d, 0x9a, 0x9c, 0x67, 0xf4, - 0x1d, 0xd7, 0x4b, 0xb5, 0xc6, 0xa5, 0x8a, 0x56, 0xdc, 0xbd, 0x50, 0x82, 0x59, 0x6e, 0xa0, 0xf0, - 0xb8, 0x5b, 0xc6, 0xdb, 0xfa, 0x7e, 0x97, 0x99, 0xe3, 0xc5, 0x13, 0x1e, 0x77, 0x44, 0x36, 0x75, - 0xb3, 0x7b, 0x50, 0xcc, 0xa8, 0x45, 0x98, 0xe3, 0xc7, 0x84, 0x62, 0x16, 0xbd, 0xe3, 0x26, 0x98, - 0xb9, 0x64, 0xd9, 0x57, 0x88, 0x0f, 0x2f, 0x7a, 0x3f, 0x8d, 0x69, 0xe5, 0x47, 0x07, 0xe0, 0x0c, - 0xb0, 0xd7, 0xc9, 0x3b, 0x6d, 0xf9, 0xd4, 0x16, 0x87, 0x46, 0x00, 0xb8, 0x05, 0x66, 0xaf, 0xf9, - 0xb9, 0xc3, 0x96, 0xce, 0x25, 0xa1, 0x9f, 0x91, 0x73, 0xc3, 0x1a, 0x5e, 0x64, 0xfa, 0xeb, 0xf9, - 0x6f, 0xcf, 0x42, 0x61, 0x15, 0xbb, 0xa5, 0x6e, 0x97, 0x97, 0xdb, 0xab, 0xa5, 0x4f, 0x75, 0x0a, - 0x95, 0x28, 0x75, 0xbb, 0xd1, 0x8d, 0x8a, 0x13, 0x90, 0x7f, 0xfa, 0x48, 0x48, 0x93, 0xf4, 0x99, - 0x1e, 0x52, 0x60, 0xfa, 0x12, 0xfb, 0x95, 0xd0, 0x51, 0xfa, 0x4d, 0x9c, 0x99, 0xf4, 0xd4, 0x30, - 0x9e, 0x59, 0x26, 0xde, 0x65, 0xc9, 0xcf, 0xa7, 0x3e, 0x04, 0x53, 0xfb, 0x0e, 0x2e, 0xeb, 0x8e, - 0x3f, 0xb4, 0x89, 0x35, 0xad, 0x5f, 0x7e, 0x04, 0xb7, 0xdd, 0xc5, 0xea, 0x9e, 0x37, 0xf1, 0xd9, - 0xa2, 0x19, 0x83, 0x10, 0x61, 0xec, 0x5d, 0xf3, 0x29, 0x78, 0xd3, 0xce, 0x6b, 0x86, 0xbb, 0x5b, - 0xde, 0xd5, 0x5d, 0xb6, 0x8d, 0x12, 0xbc, 0xa3, 0x57, 0x8c, 0x00, 0x67, 0xac, 0x93, 0x4d, 0xe4, - 0xe1, 0xf0, 0xc4, 0x20, 0x8e, 0xc1, 0x33, 0x66, 0x14, 0x10, 0xff, 0x26, 0x0b, 0xb9, 0x7a, 0x0f, - 0x9b, 0xd2, 0x27, 0x21, 0x03, 0xd9, 0x66, 0xfb, 0x64, 0xfb, 0x06, 0x79, 0x27, 0xdd, 0xa0, 0xd2, - 0x5e, 0xc9, 0x11, 0x92, 0xbd, 0x0b, 0x72, 0x86, 0xb9, 0x6d, 0x31, 0xcb, 0xf6, 0xc6, 0x08, 0x5b, - 0xa7, 0x6a, 0x6e, 0x5b, 0x1a, 0xc9, 0x28, 0xeb, 0x9f, 0x1b, 0x57, 0x76, 0xfa, 0xe2, 0xfe, 0xdb, - 0x69, 0x28, 0x50, 0x75, 0x46, 0xaf, 0x52, 0x40, 0x29, 0x75, 0x3a, 0x11, 0x82, 0xcf, 0x1e, 0x12, - 0xbc, 0x45, 0x7e, 0x0b, 0x30, 0x09, 0xde, 0xc5, 0x40, 0x56, 0x92, 0x7d, 0x3b, 0x6b, 0x52, 0xa5, - 0x4e, 0x27, 0xfa, 0x14, 0x41, 0x50, 0x60, 0x56, 0x2c, 0x90, 0x6f, 0xe1, 0x8a, 0x5c, 0x0b, 0x4f, - 0x3c, 0x10, 0x44, 0xf2, 0x97, 0x3e, 0x44, 0xff, 0x90, 0x85, 0xa9, 0x75, 0xc3, 0x71, 0x3d, 0x6c, - 0x4a, 0x32, 0xd8, 0xdc, 0x04, 0x33, 0xbe, 0x68, 0xbc, 0x2e, 0xcf, 0xeb, 0xcf, 0xc3, 0x04, 0x71, - 0x26, 0xfe, 0xa0, 0x88, 0xce, 0xd3, 0xe3, 0x6b, 0xcf, 0xb8, 0x88, 0x3e, 0x61, 0x16, 0x16, 0x9b, - 0xed, 0x2f, 0xf6, 0xe7, 0x02, 0x81, 0x6f, 0x08, 0x02, 0xbf, 0x67, 0x94, 0x22, 0xd3, 0x17, 0xfa, - 0xef, 0x67, 0x01, 0xbc, 0xb2, 0xd9, 0x31, 0xde, 0x27, 0x0a, 0xc1, 0x39, 0x62, 0xa4, 0xfb, 0x1a, - 0x5e, 0xba, 0x1b, 0xa2, 0x74, 0xbf, 0x79, 0x78, 0x55, 0xe3, 0x8e, 0xeb, 0xaa, 0x45, 0x50, 0x8c, - 0x40, 0xb4, 0xde, 0x23, 0x7a, 0x7b, 0x20, 0xd4, 0x4d, 0x41, 0xa8, 0xf7, 0x8d, 0x58, 0x52, 0xfa, - 0x72, 0xfd, 0xa3, 0x2c, 0x4c, 0x35, 0xb0, 0xeb, 0x75, 0x93, 0xe8, 0xa2, 0x4c, 0x0f, 0xcf, 0xb5, - 0xed, 0xac, 0x64, 0xdb, 0xfe, 0x6a, 0x46, 0x36, 0xc8, 0x57, 0x28, 0x19, 0xc6, 0x53, 0xc4, 0xea, - 0xc3, 0x9b, 0xa4, 0x82, 0x7c, 0x0d, 0xa3, 0x96, 0xbe, 0x74, 0xdf, 0x96, 0x0d, 0x7c, 0x40, 0xc4, - 0x53, 0x76, 0xbc, 0x59, 0x9c, 0x39, 0x6c, 0x16, 0xcb, 0x9f, 0xb2, 0xe3, 0xeb, 0x18, 0xed, 0x98, - 0x90, 0xd8, 0xd8, 0x18, 0x83, 0xcf, 0xc0, 0x28, 0xf2, 0x7a, 0x91, 0x02, 0x05, 0xb6, 0x79, 0xf0, - 0x40, 0xfc, 0xde, 0xc1, 0xf0, 0xa9, 0xc5, 0xfb, 0x46, 0x30, 0xe5, 0xe2, 0x96, 0xe5, 0x03, 0x36, - 0xb2, 0x1c, 0x1b, 0x77, 0x42, 0x9e, 0x44, 0x21, 0x66, 0xe3, 0x5c, 0xe8, 0xee, 0xe1, 0x93, 0xa8, - 0x78, 0x5f, 0x35, 0x9a, 0x29, 0x31, 0x0a, 0x63, 0x58, 0xc9, 0x1f, 0x05, 0x85, 0x2f, 0xab, 0x00, - 0x9b, 0xfb, 0x97, 0xbb, 0x86, 0xb3, 0x6b, 0x98, 0xc4, 0xfb, 0x6b, 0x8e, 0xbd, 0xd2, 0x60, 0xba, - 0xb1, 0xe6, 0x5f, 0xa4, 0x51, 0x50, 0x04, 0x65, 0xdf, 0x36, 0xd8, 0x32, 0x80, 0xf7, 0xa8, 0xde, - 0x1f, 0x78, 0x48, 0xe6, 0xfa, 0xc2, 0xa8, 0x78, 0x62, 0x08, 0x39, 0x58, 0xe4, 0x4a, 0x0f, 0x3d, - 0x25, 0xf9, 0x88, 0xc9, 0x79, 0x31, 0x62, 0xb2, 0x70, 0xb6, 0xba, 0xd0, 0x77, 0xb6, 0xda, 0xc3, - 0xd1, 0x31, 0x5e, 0x80, 0x89, 0x53, 0x91, 0xa2, 0x91, 0x67, 0xef, 0x8f, 0x47, 0x2c, 0xc3, 0x24, - 0x9b, 0x3a, 0xcc, 0x83, 0x3f, 0x4c, 0xe0, 0xfb, 0xbc, 0x19, 0xc9, 0x3e, 0xef, 0x23, 0xe1, 0xdc, - 0xc7, 0x92, 0x34, 0x9c, 0x13, 0x48, 0x4e, 0x60, 0x37, 0xd7, 0xc7, 0x2e, 0xfa, 0xa8, 0x74, 0x50, - 0x45, 0x4e, 0xc6, 0xb1, 0xb3, 0x18, 0xc6, 0x41, 0x36, 0xe0, 0x80, 0xdb, 0x03, 0x8e, 0xeb, 0x81, - 0x87, 0xd1, 0x4f, 0xa6, 0xcb, 0x7b, 0x23, 0xac, 0xd7, 0xa8, 0xb0, 0xe0, 0x1f, 0x52, 0xaf, 0x2f, - 0x3d, 0x58, 0x29, 0x37, 0x8b, 0xf8, 0xf0, 0xc1, 0x75, 0x72, 0x44, 0x9d, 0x1e, 0x47, 0x0f, 0xd7, - 0x64, 0xd0, 0xff, 0xc8, 0x42, 0x81, 0x99, 0x1b, 0x0f, 0x1c, 0x11, 0x42, 0xf4, 0xda, 0x51, 0x20, - 0x89, 0x8d, 0x15, 0xf2, 0xa9, 0xa4, 0x00, 0x8c, 0xc1, 0xc0, 0x78, 0x38, 0x35, 0x00, 0xd0, 0x3f, - 0x67, 0x21, 0xe7, 0x99, 0x41, 0x72, 0x91, 0x18, 0x3e, 0x29, 0xed, 0xc6, 0xcb, 0x09, 0xc0, 0x23, - 0x1f, 0xa1, 0xdf, 0x4b, 0x30, 0xd3, 0xa3, 0x19, 0x83, 0x38, 0x20, 0xb7, 0x4a, 0x74, 0x46, 0x58, - 0x0b, 0x7f, 0x43, 0xef, 0x95, 0x72, 0x05, 0x8e, 0xe7, 0x27, 0x19, 0x1c, 0x95, 0x71, 0x04, 0x6d, - 0xd8, 0x46, 0xff, 0x9a, 0x05, 0xd0, 0xb0, 0x63, 0x75, 0xaf, 0xe2, 0x2d, 0xdb, 0x40, 0x37, 0x86, - 0x00, 0xb0, 0x66, 0x9f, 0x09, 0x9b, 0xfd, 0xa7, 0xb3, 0xb2, 0x6e, 0xbd, 0x82, 0xe6, 0xf9, 0xc4, - 0x23, 0xc4, 0xff, 0x6c, 0x98, 0x62, 0x72, 0x64, 0x36, 0xa5, 0x9c, 0xf0, 0xfd, 0x9f, 0xd0, 0x07, - 0xa4, 0xdc, 0x82, 0x65, 0x38, 0x4a, 0x06, 0x40, 0x79, 0x04, 0x00, 0x4e, 0xc2, 0xac, 0x0f, 0xc0, - 0x96, 0x56, 0x2d, 0x62, 0xf4, 0x2e, 0x85, 0x78, 0x58, 0xd0, 0xc1, 0xed, 0xe8, 0x3d, 0xcd, 0x9f, - 0x4b, 0x4f, 0xf6, 0x39, 0x79, 0x04, 0xe5, 0xa7, 0x04, 0xd0, 0x6f, 0x4b, 0xcd, 0xee, 0x25, 0x18, - 0x7a, 0xac, 0xf4, 0x57, 0x17, 0x2a, 0x30, 0x2f, 0x58, 0x25, 0xea, 0x39, 0x38, 0x2d, 0x24, 0xd0, - 0xf1, 0xae, 0x53, 0x3c, 0xa1, 0x22, 0x38, 0x2b, 0x7c, 0x61, 0x2f, 0xb8, 0x53, 0xcc, 0xa0, 0x4f, - 0xfd, 0x51, 0x26, 0x58, 0xef, 0x79, 0x5f, 0x8e, 0xad, 0xb4, 0x7d, 0x5c, 0x0c, 0x3d, 0xd9, 0xb6, - 0x4c, 0x17, 0x3f, 0xca, 0xb9, 0xa9, 0x04, 0x09, 0xb1, 0x56, 0xc3, 0x39, 0x98, 0x72, 0x6d, 0xde, - 0x75, 0xc5, 0x7f, 0xe5, 0x15, 0x2b, 0x2f, 0x2a, 0x56, 0x0d, 0x2e, 0x18, 0x66, 0xbb, 0xbb, 0xdf, - 0xc1, 0x1a, 0xee, 0xea, 0x9e, 0x0c, 0x9d, 0x92, 0xb3, 0x8c, 0x7b, 0xd8, 0xec, 0x60, 0xd3, 0xa5, - 0x7c, 0xfa, 0xa7, 0x50, 0x25, 0x72, 0x8a, 0xca, 0x78, 0xbf, 0xa8, 0x8c, 0x4f, 0x1c, 0xb4, 0x84, - 0x1b, 0xb3, 0xde, 0x77, 0x0f, 0x00, 0xad, 0xdb, 0x45, 0x03, 0x5f, 0x63, 0x6a, 0x78, 0x43, 0xdf, - 0xaa, 0x5f, 0x3d, 0xc8, 0xa0, 0x71, 0x99, 0xd1, 0x17, 0x02, 0xf5, 0x7b, 0x8e, 0xa0, 0x7e, 0x77, - 0x4a, 0xb2, 0x90, 0x4c, 0xeb, 0x7a, 0x23, 0x68, 0xdd, 0x3c, 0xcc, 0x84, 0xbb, 0xc9, 0x8a, 0x7a, - 0x03, 0x9c, 0xf1, 0x3d, 0x8c, 0x6b, 0x95, 0xca, 0x72, 0xa3, 0xb5, 0xb5, 0xb9, 0xaa, 0x95, 0x96, - 0x2b, 0x45, 0xf0, 0xf4, 0x93, 0xea, 0x65, 0xe0, 0x18, 0x9c, 0x43, 0x7f, 0x90, 0x85, 0x3c, 0x39, - 0x42, 0x8d, 0xbe, 0x75, 0x4c, 0x9a, 0xe3, 0x08, 0x4e, 0x4f, 0xc1, 0xb8, 0x2b, 0x7f, 0x25, 0x04, - 0x13, 0x26, 0xe1, 0xea, 0x48, 0x57, 0x42, 0xc4, 0x10, 0x4a, 0x7f, 0x26, 0xe4, 0x35, 0xc9, 0xc6, - 0xae, 0x75, 0xed, 0xeb, 0xb9, 0x49, 0x7a, 0xf5, 0x3f, 0xe6, 0x26, 0x39, 0x80, 0x85, 0x89, 0x37, - 0xc9, 0x01, 0xed, 0x2e, 0xa6, 0x99, 0xa2, 0x0f, 0xe7, 0x83, 0xf9, 0xdf, 0xc7, 0xb2, 0x47, 0xda, - 0xfb, 0x2a, 0xc1, 0xbc, 0x61, 0xba, 0xd8, 0x36, 0xf5, 0xee, 0x4a, 0x57, 0xdf, 0xf1, 0xed, 0xd3, - 0xfe, 0x0d, 0x8f, 0x2a, 0x97, 0x47, 0x13, 0xff, 0x50, 0xcf, 0x03, 0xb8, 0x78, 0xaf, 0xd7, 0xd5, - 0xdd, 0x50, 0xf5, 0xb8, 0x14, 0x5e, 0xfb, 0x72, 0xa2, 0xf6, 0x3d, 0x05, 0xae, 0xa3, 0xa0, 0x35, - 0x0f, 0x7a, 0x78, 0xcb, 0x34, 0x9e, 0xbf, 0x4f, 0x22, 0x15, 0x53, 0x1d, 0x1d, 0xf4, 0x49, 0xd8, - 0x01, 0x2a, 0x88, 0x3b, 0x40, 0xea, 0x7d, 0x70, 0x03, 0x09, 0x2b, 0x8d, 0xbd, 0x5f, 0x2e, 0x19, - 0x9d, 0x1d, 0xec, 0x56, 0xb7, 0x37, 0x0c, 0xc7, 0x31, 0xcc, 0x1d, 0x32, 0x1d, 0x9f, 0xd6, 0xa2, - 0x33, 0xa0, 0xbf, 0x91, 0x8e, 0x82, 0xe4, 0xf7, 0x19, 0x43, 0xa2, 0x20, 0x05, 0xed, 0x54, 0xe9, - 0x6b, 0xa7, 0xc1, 0xaa, 0x4e, 0x4e, 0x62, 0x55, 0x87, 0xc7, 0x34, 0x2f, 0xb9, 0x3a, 0xf0, 0x7a, - 0xa9, 0x30, 0x4b, 0x71, 0xd5, 0x48, 0xbf, 0xef, 0xfb, 0x8a, 0x02, 0x0b, 0xb4, 0xe8, 0x25, 0xcb, - 0xba, 0xb2, 0xa7, 0xdb, 0x57, 0xd0, 0x0f, 0x1c, 0x6d, 0x17, 0x37, 0x76, 0xf7, 0x2a, 0x6a, 0x4b, - 0xb6, 0x4f, 0x79, 0x73, 0xfd, 0xca, 0x8b, 0x7e, 0x4b, 0x7a, 0x4a, 0x22, 0xc8, 0xd3, 0xaf, 0xd4, - 0x64, 0xb6, 0xb7, 0xe4, 0x0e, 0x2e, 0xca, 0x30, 0x98, 0x3e, 0xf0, 0xbf, 0x11, 0x00, 0xef, 0x8f, - 0x23, 0xfc, 0xce, 0xc0, 0x38, 0x71, 0x47, 0x5f, 0x1c, 0x0d, 0x3b, 0x9f, 0xaf, 0x11, 0xb0, 0x2b, - 0x82, 0x72, 0x25, 0x70, 0x46, 0xf2, 0x1e, 0xf9, 0x0a, 0xe5, 0xd2, 0x43, 0x33, 0x82, 0xe5, 0x89, - 0xa0, 0x79, 0x5a, 0x64, 0xa1, 0xde, 0x4b, 0x15, 0xd3, 0xcf, 0x4b, 0xef, 0xb8, 0x0d, 0x14, 0x10, - 0xe5, 0x6e, 0x32, 0xad, 0x52, 0x6e, 0xbb, 0x4e, 0x9e, 0xcd, 0xf4, 0xd1, 0x7c, 0x79, 0x1e, 0x66, - 0xfc, 0x68, 0x54, 0xe4, 0x86, 0xb6, 0x00, 0xc3, 0xb3, 0x50, 0x70, 0xac, 0x7d, 0xbb, 0x8d, 0xd9, - 0x1e, 0x28, 0x7b, 0x1b, 0x61, 0xbf, 0x6e, 0xa8, 0xb9, 0x70, 0xc8, 0x22, 0xc9, 0x25, 0xb6, 0x48, - 0xa2, 0xed, 0xdd, 0x18, 0xfb, 0x01, 0xbd, 0x42, 0xfa, 0x5a, 0x0d, 0x01, 0xb3, 0x06, 0x76, 0x1f, - 0x8b, 0x46, 0xc0, 0x2f, 0x4b, 0xed, 0x06, 0x0d, 0xa9, 0x49, 0x32, 0x95, 0xab, 0x8f, 0x60, 0x07, - 0xdf, 0x08, 0xd7, 0xfb, 0x39, 0x98, 0x01, 0x4c, 0x0c, 0xde, 0x2d, 0x6d, 0xbd, 0xa8, 0xa0, 0x17, - 0xe5, 0xa0, 0x48, 0x59, 0xab, 0x07, 0xb6, 0x20, 0x7a, 0x75, 0xe6, 0xb8, 0x0d, 0xde, 0xe8, 0x19, - 0xec, 0xef, 0x66, 0x65, 0x43, 0x77, 0x0b, 0x82, 0x0f, 0x6b, 0x17, 0xa1, 0x49, 0x23, 0x34, 0xb3, - 0x18, 0xe5, 0x43, 0x3f, 0x9b, 0x91, 0x89, 0x04, 0x2e, 0xc7, 0x62, 0xfa, 0xbd, 0xd2, 0x57, 0x73, - 0x7e, 0x50, 0xc1, 0x15, 0xdb, 0xda, 0xdb, 0xb2, 0xbb, 0xe8, 0x7f, 0x49, 0x5d, 0xb4, 0x10, 0x31, - 0xbb, 0xc8, 0x46, 0xcf, 0x2e, 0xc8, 0x8a, 0x74, 0x37, 0xdc, 0x0a, 0xeb, 0x8e, 0x30, 0x7c, 0xab, - 0xb7, 0xc1, 0x82, 0xde, 0xe9, 0x6c, 0xea, 0x3b, 0xb8, 0xec, 0x4d, 0xdb, 0x4d, 0x97, 0x05, 0x1c, - 0xeb, 0x4b, 0x8d, 0x9d, 0xca, 0x88, 0x7d, 0xe4, 0xd4, 0x21, 0xab, 0x54, 0x7e, 0x19, 0x56, 0x00, - 0x91, 0xc9, 0x6f, 0x22, 0xc3, 0x9f, 0x37, 0x64, 0xb4, 0x77, 0xf5, 0x30, 0x3c, 0x22, 0x7b, 0x93, - 0xf4, 0xc5, 0x92, 0xe0, 0x3b, 0x7d, 0xcd, 0xfb, 0xa5, 0x2c, 0x4c, 0x79, 0x78, 0x94, 0x3a, 0x1d, - 0xf4, 0x04, 0x21, 0x8a, 0x68, 0xa4, 0x37, 0xdc, 0x77, 0x4b, 0xbb, 0x21, 0xfa, 0x35, 0xa4, 0xf4, - 0x23, 0x30, 0x09, 0x85, 0x98, 0x15, 0x84, 0x28, 0xe7, 0x6d, 0x18, 0x5b, 0x44, 0xfa, 0xe2, 0xfb, - 0x64, 0x16, 0xe6, 0xfd, 0x79, 0xc6, 0x0a, 0x76, 0xdb, 0xbb, 0xe8, 0x1e, 0xd9, 0x75, 0x2e, 0xd6, - 0x12, 0x83, 0x2d, 0xe1, 0x2e, 0xfa, 0xb7, 0x4c, 0x42, 0x95, 0x17, 0x4a, 0x8e, 0x58, 0x24, 0x4c, - 0xa4, 0x8b, 0x71, 0x04, 0xd3, 0x17, 0xe6, 0x17, 0xb2, 0x00, 0x4d, 0x2b, 0x98, 0x2c, 0x1f, 0x41, - 0x92, 0x3f, 0x28, 0xbd, 0x5b, 0xcc, 0x2a, 0x1e, 0x16, 0x9b, 0xbc, 0xe7, 0x90, 0x74, 0xa6, 0x1a, - 0x56, 0xd2, 0x44, 0xda, 0xfa, 0xcc, 0xf2, 0x7e, 0xaf, 0x6b, 0xb4, 0x75, 0xb7, 0xdf, 0x03, 0x30, - 0x5a, 0xbc, 0xe4, 0x7a, 0xe3, 0x44, 0x46, 0x63, 0x50, 0x46, 0x84, 0x2c, 0x69, 0x04, 0x9f, 0xac, - 0x1f, 0xc1, 0x47, 0xd2, 0xab, 0x67, 0x08, 0xf1, 0x09, 0xa8, 0xa7, 0x02, 0x27, 0xeb, 0x3d, 0x6c, - 0x2e, 0xd9, 0x58, 0xef, 0xb4, 0xed, 0xfd, 0xbd, 0xcb, 0x0e, 0xef, 0xbe, 0x1a, 0xaf, 0xa3, 0xdc, - 0xca, 0x75, 0x56, 0x58, 0xb9, 0x46, 0xdf, 0xa5, 0xc8, 0x46, 0x4f, 0xe3, 0xf6, 0x57, 0x38, 0x1e, - 0x46, 0x18, 0xea, 0x12, 0x39, 0x5d, 0xf5, 0x2d, 0x52, 0xe7, 0x92, 0x2c, 0x52, 0xbf, 0x55, 0x2a, - 0x16, 0x9b, 0x54, 0xbd, 0x26, 0xe2, 0x3b, 0xb7, 0xd0, 0xc0, 0x6e, 0x04, 0xbc, 0xb7, 0xc2, 0xfc, - 0xe5, 0xf0, 0x4b, 0x00, 0xb1, 0x98, 0x38, 0xc0, 0xa3, 0xf5, 0x6d, 0x49, 0x57, 0x68, 0x44, 0x16, - 0x22, 0xd0, 0x0d, 0x10, 0xcc, 0xca, 0xb8, 0xcd, 0x25, 0x5a, 0x6e, 0x89, 0x2d, 0x3f, 0x7d, 0x14, - 0x3e, 0x9a, 0x85, 0x59, 0x72, 0x69, 0xf3, 0xd2, 0x01, 0x39, 0xc8, 0x29, 0x69, 0x94, 0xbc, 0x9c, - 0x17, 0xb3, 0x0a, 0xb9, 0xae, 0x61, 0x5e, 0xf1, 0xfd, 0x1d, 0xbd, 0xe7, 0xf0, 0x0a, 0xd0, 0xec, - 0x80, 0x2b, 0x40, 0x83, 0x6d, 0x92, 0xa0, 0xdc, 0x23, 0xdd, 0x49, 0x3f, 0x94, 0x5c, 0xfa, 0x62, - 0xfc, 0xab, 0x1c, 0x14, 0x1a, 0x58, 0xb7, 0xdb, 0xbb, 0xe8, 0x7d, 0xd9, 0x81, 0x53, 0x89, 0x69, - 0x71, 0x2a, 0xb1, 0x02, 0x53, 0xdb, 0x46, 0xd7, 0xc5, 0x36, 0xf5, 0x01, 0xe7, 0xbb, 0x76, 0xda, - 0xc4, 0x97, 0xba, 0x56, 0xfb, 0xca, 0x22, 0x33, 0xed, 0x17, 0xfd, 0xe8, 0xcd, 0x8b, 0x2b, 0xe4, - 0x27, 0xcd, 0xff, 0xd9, 0x33, 0x08, 0x1d, 0xcb, 0x76, 0xa3, 0x6e, 0x03, 0x8a, 0xa0, 0xd2, 0xb0, - 0x6c, 0x57, 0xa3, 0x3f, 0x7a, 0x30, 0x6f, 0xef, 0x77, 0xbb, 0x4d, 0xfc, 0xa8, 0xeb, 0x4f, 0xeb, - 0xfc, 0x77, 0xcf, 0x58, 0xb4, 0xb6, 0xb7, 0x1d, 0x4c, 0x17, 0x15, 0xf2, 0x1a, 0x7b, 0x53, 0x4f, - 0x43, 0xbe, 0x6b, 0xec, 0x19, 0x74, 0x22, 0x92, 0xd7, 0xe8, 0x8b, 0x7a, 0x07, 0x14, 0xc3, 0x39, - 0x10, 0x65, 0xf4, 0x5c, 0x81, 0x34, 0xcd, 0x43, 0xe9, 0x9e, 0xce, 0x5c, 0xc1, 0x07, 0xce, 0xb9, - 0x29, 0xf2, 0x9d, 0x3c, 0x8b, 0x07, 0x6e, 0x64, 0x36, 0x4c, 0xa8, 0xc4, 0xa3, 0x67, 0xb8, 0x36, - 0x6e, 0x5b, 0x76, 0xc7, 0x97, 0x4d, 0xf4, 0x04, 0x83, 0xe5, 0x4b, 0xb6, 0xcd, 0x31, 0xb0, 0xf0, - 0xf4, 0x35, 0xed, 0xdd, 0x05, 0xaf, 0xdb, 0xf4, 0x8a, 0xbe, 0x64, 0xb8, 0xbb, 0x1b, 0xd8, 0xd5, - 0xd1, 0x5f, 0x29, 0x03, 0x35, 0x6e, 0xf6, 0xff, 0xd7, 0xb8, 0x21, 0x1a, 0x47, 0x63, 0x7e, 0xb9, - 0xfb, 0xb6, 0xe9, 0xc9, 0x91, 0xf9, 0xd1, 0x72, 0x29, 0xea, 0x7d, 0x70, 0x43, 0xf8, 0xe6, 0x2f, - 0xa5, 0x2e, 0x73, 0xae, 0xb5, 0xd3, 0x5a, 0x74, 0x06, 0x75, 0x13, 0x1e, 0x4f, 0x3f, 0xae, 0x35, - 0x37, 0xd6, 0xd7, 0x8c, 0x9d, 0xdd, 0xae, 0xb1, 0xb3, 0xeb, 0x3a, 0x55, 0xd3, 0x71, 0xb1, 0xde, - 0xa9, 0x6f, 0x6b, 0xf4, 0x1e, 0x2f, 0x20, 0x74, 0x64, 0xb2, 0x8a, 0x3e, 0xe2, 0x72, 0xa3, 0x1b, - 0xaf, 0x29, 0x11, 0x2d, 0xe5, 0x19, 0x5e, 0x4b, 0x71, 0xf6, 0xbb, 0x01, 0xa6, 0x37, 0xf5, 0x61, - 0x1a, 0xaa, 0xfa, 0x7e, 0x97, 0x34, 0x17, 0x92, 0x39, 0xe9, 0x38, 0x17, 0xc3, 0x49, 0xfa, 0xcd, - 0xe6, 0x7f, 0x15, 0x20, 0xbf, 0x6a, 0xeb, 0xbd, 0x5d, 0xf4, 0x22, 0xae, 0x7f, 0x1e, 0x57, 0x9b, - 0x08, 0xb4, 0x33, 0x3b, 0x4c, 0x3b, 0x95, 0x21, 0xda, 0x99, 0xe3, 0xb4, 0x33, 0x7a, 0xd1, 0xf9, - 0x02, 0xcc, 0xb5, 0xad, 0x6e, 0x17, 0xb7, 0x3d, 0x79, 0x54, 0x3b, 0x64, 0xb5, 0x67, 0x46, 0x13, - 0xd2, 0x48, 0x84, 0x7b, 0xec, 0x36, 0xe8, 0x1a, 0x3b, 0x55, 0xfa, 0x30, 0x01, 0xbd, 0x3a, 0x0b, - 0xb9, 0x4a, 0x67, 0x07, 0x0b, 0xeb, 0xf0, 0x19, 0x6e, 0x1d, 0xfe, 0x2c, 0x14, 0x5c, 0xdd, 0xde, - 0xc1, 0xae, 0xbf, 0x4e, 0x40, 0xdf, 0x82, 0xc0, 0xfb, 0x0a, 0x17, 0x78, 0xff, 0x9b, 0x21, 0xe7, - 0xc9, 0x8c, 0xb9, 0xc5, 0x3f, 0x7e, 0x10, 0xfc, 0x44, 0xf6, 0x8b, 0x5e, 0x89, 0x8b, 0x5e, 0xad, - 0x35, 0xf2, 0x43, 0x3f, 0xd6, 0xf9, 0x43, 0x58, 0x93, 0x2b, 0x89, 0xdb, 0x96, 0x59, 0xdd, 0xd3, - 0x77, 0x30, 0xab, 0x66, 0x98, 0xe0, 0x7f, 0xad, 0xec, 0x59, 0x8f, 0x18, 0x6c, 0x51, 0x2b, 0x4c, - 0xf0, 0xaa, 0xb0, 0x6b, 0x74, 0x3a, 0xd8, 0x64, 0x2d, 0x9b, 0xbd, 0x5d, 0x38, 0x0f, 0x39, 0x8f, - 0x07, 0x4f, 0x7f, 0x3c, 0x63, 0xa1, 0x78, 0x42, 0x9d, 0xf3, 0x9a, 0x15, 0x6d, 0xbc, 0xc5, 0x8c, - 0xb8, 0xe6, 0x2a, 0xe3, 0x35, 0x44, 0x2b, 0x37, 0xb8, 0x71, 0x3d, 0x19, 0xf2, 0xa6, 0xd5, 0xc1, - 0x43, 0x07, 0x21, 0x9a, 0x4b, 0x7d, 0x3a, 0xe4, 0x71, 0xc7, 0xeb, 0x15, 0x14, 0x92, 0xfd, 0x7c, - 0xbc, 0x2c, 0x35, 0x9a, 0x39, 0x99, 0x6b, 0xd2, 0x20, 0x6e, 0xd3, 0x6f, 0x80, 0xdf, 0x3b, 0x05, - 0x27, 0x69, 0x1f, 0xd0, 0xd8, 0xbf, 0xec, 0x91, 0xba, 0x8c, 0xd1, 0x9b, 0x06, 0x0f, 0x5c, 0x27, - 0x45, 0x65, 0x3f, 0x0d, 0x79, 0x67, 0xff, 0x72, 0x60, 0x84, 0xd2, 0x17, 0xbe, 0xe9, 0x66, 0xc7, - 0x32, 0x9c, 0x29, 0xa3, 0x0e, 0x67, 0xc2, 0xd0, 0xa4, 0xf8, 0x8d, 0x3f, 0x1c, 0xc8, 0xe8, 0x81, - 0x0e, 0x7f, 0x20, 0x1b, 0x34, 0x0c, 0x9d, 0x83, 0x29, 0x7d, 0xdb, 0xc5, 0x76, 0x68, 0x26, 0xb2, - 0x57, 0x6f, 0xa8, 0xbc, 0x8c, 0xb7, 0x2d, 0xdb, 0x13, 0x0b, 0xbd, 0x77, 0x21, 0x78, 0xe7, 0x5a, - 0x2e, 0x08, 0x3b, 0x68, 0x77, 0xc2, 0x29, 0xd3, 0x5a, 0xc6, 0x3d, 0x26, 0x67, 0x8a, 0xe2, 0x3c, - 0x69, 0x01, 0x87, 0x3f, 0x1c, 0xea, 0x4a, 0x16, 0x0e, 0x77, 0x25, 0xe8, 0xd3, 0x49, 0xe7, 0xcc, - 0x7d, 0x40, 0x8f, 0xcd, 0x42, 0x53, 0x9f, 0x05, 0x73, 0x1d, 0xe6, 0x21, 0xd6, 0x36, 0x82, 0x56, - 0x12, 0xf9, 0x9f, 0x90, 0x39, 0x54, 0xa4, 0x1c, 0xaf, 0x48, 0xab, 0x30, 0x4d, 0x8e, 0x5e, 0x7b, - 0x9a, 0x94, 0xef, 0xf3, 0xc8, 0x27, 0xd3, 0xba, 0xa0, 0x52, 0x9c, 0xd8, 0x16, 0xcb, 0xec, 0x17, - 0x2d, 0xf8, 0x39, 0xd9, 0xec, 0x3b, 0x5e, 0x42, 0xe9, 0x37, 0xc7, 0x9f, 0x2b, 0xc0, 0x0d, 0x65, - 0xdb, 0x72, 0x1c, 0x72, 0x04, 0xa7, 0xbf, 0x61, 0xbe, 0x39, 0x2b, 0x5c, 0xc1, 0xf3, 0x98, 0x6e, - 0x7e, 0x83, 0x1a, 0xd4, 0xe4, 0x9a, 0xc6, 0x9f, 0x4b, 0x07, 0xad, 0x09, 0xf6, 0x1f, 0x22, 0x84, - 0xfe, 0xf5, 0xd1, 0x48, 0xde, 0x9d, 0x91, 0x89, 0xa3, 0x93, 0x50, 0x56, 0x13, 0xb8, 0x73, 0x29, - 0x0b, 0x37, 0xf6, 0x73, 0xb3, 0x65, 0x3a, 0x41, 0x83, 0xb9, 0x79, 0x48, 0x7b, 0x11, 0xe3, 0xae, - 0xc4, 0xde, 0xb8, 0x1b, 0x51, 0x77, 0xae, 0xb4, 0x88, 0xc5, 0x92, 0xf0, 0x40, 0x4f, 0xdc, 0x8d, - 0xbb, 0x89, 0xc9, 0xa7, 0x2f, 0xdc, 0xdf, 0xcd, 0xc1, 0xc9, 0x55, 0xdb, 0xda, 0xef, 0x39, 0x61, - 0x0f, 0xf4, 0x27, 0x83, 0x37, 0x64, 0x0b, 0x32, 0xa6, 0xc1, 0x2d, 0x30, 0x6b, 0x33, 0x6b, 0x2e, - 0xdc, 0x9e, 0xe5, 0x93, 0xf8, 0xde, 0x4b, 0x39, 0x4a, 0xef, 0x15, 0xf6, 0x33, 0x39, 0xa1, 0x9f, - 0xe9, 0xef, 0x39, 0xf2, 0x03, 0x7a, 0x8e, 0x3f, 0xce, 0x26, 0x1c, 0x54, 0xfb, 0x44, 0x14, 0xd1, - 0x5f, 0x94, 0xa1, 0xb0, 0x43, 0x32, 0xb2, 0xee, 0xe2, 0x49, 0x72, 0x35, 0x23, 0xc4, 0x35, 0xf6, - 0x6b, 0x28, 0x57, 0x85, 0xd7, 0xe1, 0x44, 0x03, 0x5c, 0x3c, 0xb7, 0xe9, 0x2b, 0xd5, 0x1b, 0x72, - 0x30, 0x17, 0x94, 0x5e, 0xed, 0x38, 0x42, 0x74, 0x57, 0x4e, 0xa3, 0xe6, 0x65, 0x34, 0xea, 0xd0, - 0x3a, 0x73, 0x30, 0xea, 0x28, 0xdc, 0xa8, 0x33, 0x70, 0x74, 0x99, 0x8b, 0x18, 0x5d, 0xd0, 0x0b, - 0x15, 0xd9, 0x4b, 0xec, 0xc4, 0xae, 0x95, 0xd4, 0xe6, 0xb1, 0x3c, 0x58, 0x48, 0x5e, 0xa5, 0x37, - 0xbc, 0x56, 0xe9, 0x2b, 0xc9, 0x87, 0xb2, 0x70, 0xea, 0x70, 0x67, 0xfe, 0x0d, 0xa2, 0x97, 0x9a, - 0x57, 0x27, 0x27, 0xf0, 0x52, 0x23, 0x6f, 0xe2, 0x26, 0x5d, 0x6c, 0x10, 0x14, 0xc1, 0xde, 0x1b, - 0xde, 0x89, 0xcb, 0x85, 0x39, 0x91, 0x24, 0x9a, 0xbe, 0x00, 0x7f, 0x48, 0x81, 0x99, 0x06, 0x76, - 0xd7, 0xf5, 0x03, 0x6b, 0xdf, 0x45, 0xba, 0xec, 0xf6, 0xdc, 0x33, 0xa1, 0xd0, 0x25, 0xbf, 0x90, - 0x0e, 0x86, 0x0f, 0x3a, 0xca, 0xef, 0x6f, 0x11, 0xdf, 0x20, 0x4a, 0x5a, 0x63, 0xf9, 0xc5, 0xe8, - 0x33, 0x32, 0xbb, 0xa3, 0x01, 0x77, 0x63, 0xd9, 0xda, 0x49, 0xb4, 0x77, 0x1a, 0x55, 0x74, 0xfa, - 0xb0, 0x7c, 0x97, 0x02, 0xf3, 0x0d, 0xec, 0x56, 0x9d, 0x15, 0xfd, 0xaa, 0x65, 0x1b, 0x2e, 0x46, - 0xab, 0xb2, 0xd0, 0x9c, 0x07, 0x30, 0x82, 0xdf, 0x58, 0x4c, 0x2c, 0x2e, 0x05, 0xfd, 0x6c, 0x52, - 0x47, 0x21, 0x81, 0x8f, 0xb1, 0x80, 0x90, 0xc8, 0xc7, 0x22, 0xae, 0xf8, 0x09, 0x5c, 0xc3, 0x9d, - 0x65, 0x40, 0x94, 0xec, 0xf6, 0xae, 0x71, 0x15, 0x77, 0x12, 0x02, 0xe1, 0xff, 0x16, 0x02, 0x11, - 0x10, 0x4a, 0xec, 0xbe, 0x22, 0xf0, 0x31, 0x0e, 0xf7, 0x95, 0x38, 0x82, 0x13, 0x09, 0x6b, 0xe5, - 0x75, 0x3d, 0x6c, 0x3d, 0xf3, 0x01, 0x59, 0xb1, 0x86, 0x26, 0x5b, 0x96, 0x37, 0xd9, 0x46, 0xea, - 0x58, 0x68, 0xd9, 0xc3, 0x74, 0x3a, 0x97, 0x46, 0xc7, 0x32, 0xb0, 0xe8, 0xf4, 0x85, 0xfe, 0x5e, - 0x05, 0xce, 0x04, 0xf1, 0x5e, 0x1a, 0xd8, 0x5d, 0xd6, 0x9d, 0xdd, 0xcb, 0x96, 0x6e, 0x77, 0x50, - 0x79, 0x0c, 0x07, 0x0e, 0xd1, 0x1f, 0xf2, 0x20, 0xd4, 0x44, 0x10, 0x06, 0xba, 0x92, 0x0e, 0xe4, - 0x65, 0x1c, 0x9d, 0x4c, 0xac, 0xb7, 0xeb, 0x2f, 0x04, 0x60, 0x3d, 0x57, 0x00, 0xeb, 0xfe, 0x51, - 0x59, 0x4c, 0x1f, 0xb8, 0x1f, 0xa5, 0x23, 0x02, 0xe7, 0xf5, 0xfc, 0xb0, 0x2c, 0x60, 0x11, 0x5e, - 0xaf, 0x4a, 0xa4, 0xd7, 0xeb, 0x48, 0x63, 0xc4, 0x50, 0x8f, 0xe5, 0x74, 0xc7, 0x88, 0x63, 0xf4, - 0x46, 0x7e, 0xa7, 0x02, 0x45, 0x12, 0xf0, 0x8b, 0xf3, 0x08, 0xe7, 0xe3, 0x67, 0xc7, 0xa3, 0x73, - 0xc8, 0xfb, 0x7c, 0x2a, 0xa9, 0xf7, 0x39, 0x7a, 0x47, 0x52, 0x1f, 0xf3, 0x7e, 0x6e, 0xc7, 0x82, - 0x58, 0x22, 0x17, 0xf2, 0x21, 0x1c, 0xa4, 0x0f, 0xda, 0xf7, 0x29, 0x00, 0x5e, 0x83, 0x66, 0x67, - 0x23, 0x9e, 0x27, 0x0b, 0xd7, 0x5d, 0xbc, 0xdf, 0xbd, 0x07, 0xd4, 0x99, 0x3e, 0xa0, 0x28, 0xc5, - 0xf0, 0xd4, 0xc5, 0x9b, 0x92, 0xfa, 0x56, 0x86, 0x5c, 0x8d, 0x05, 0x96, 0x44, 0xde, 0x96, 0x91, - 0x65, 0xa7, 0x0f, 0xc8, 0x7f, 0xcf, 0x42, 0xbe, 0x69, 0x35, 0xb0, 0x7b, 0x74, 0x53, 0x20, 0x71, - 0xd4, 0x00, 0x52, 0xee, 0x38, 0xa2, 0x06, 0x0c, 0x22, 0x94, 0xbe, 0xe8, 0xde, 0x93, 0x85, 0xb9, - 0xa6, 0x55, 0x0e, 0x16, 0xa7, 0xe4, 0x7d, 0x55, 0xe5, 0x2f, 0xe2, 0x0f, 0x2a, 0x18, 0x16, 0x73, - 0xa4, 0x8b, 0xf8, 0x87, 0xd3, 0x4b, 0x5f, 0x6e, 0xf7, 0xc0, 0xc9, 0x2d, 0xb3, 0x63, 0x69, 0xb8, - 0x63, 0xb1, 0x95, 0x6e, 0x55, 0x85, 0xdc, 0xbe, 0xd9, 0xb1, 0x08, 0xcb, 0x79, 0x8d, 0x3c, 0x7b, - 0x69, 0x36, 0xee, 0x58, 0xcc, 0x37, 0x80, 0x3c, 0xa3, 0x3f, 0x57, 0x20, 0xe7, 0xfd, 0x2b, 0x2f, - 0xea, 0x77, 0x2a, 0x09, 0xe3, 0x20, 0x78, 0xe4, 0xc7, 0x62, 0x09, 0x3d, 0xc0, 0xad, 0xfd, 0x53, - 0x0f, 0xd6, 0xc7, 0x47, 0x95, 0xc7, 0x89, 0x22, 0x5c, 0xf3, 0x57, 0xcf, 0xc1, 0xd4, 0xe5, 0xae, - 0xd5, 0xbe, 0x12, 0x1e, 0xd7, 0x67, 0xaf, 0xea, 0x1d, 0x90, 0xb7, 0x75, 0x73, 0x07, 0xb3, 0x3d, - 0x85, 0xd3, 0x7d, 0x7d, 0x21, 0xf1, 0x7a, 0xd1, 0x68, 0x16, 0xf4, 0x8e, 0x24, 0x11, 0x18, 0x06, - 0x54, 0x3e, 0x99, 0x3e, 0x2c, 0x8f, 0x70, 0xf2, 0xac, 0x08, 0x73, 0xe5, 0x52, 0x8d, 0xde, 0x63, - 0x58, 0xbf, 0x58, 0x29, 0x2a, 0x04, 0x66, 0x4f, 0x26, 0x29, 0xc2, 0xec, 0x91, 0xff, 0xba, 0x85, - 0x79, 0x40, 0xe5, 0x8f, 0x03, 0xe6, 0x4f, 0x66, 0x61, 0x7e, 0xdd, 0x70, 0xdc, 0x28, 0x6f, 0xff, - 0x98, 0x78, 0xbf, 0xaf, 0x48, 0x6a, 0x2a, 0x0b, 0xe5, 0x48, 0x07, 0xfa, 0x4d, 0x64, 0x0e, 0xc7, - 0x15, 0x31, 0x99, 0x63, 0x29, 0x84, 0x03, 0x7a, 0xf1, 0xbc, 0xb4, 0x24, 0x13, 0x1b, 0x4a, 0x61, - 0x21, 0x93, 0x37, 0x94, 0x22, 0xcb, 0x4e, 0x5f, 0xbe, 0x7f, 0x9e, 0x85, 0x53, 0x5e, 0xf1, 0x71, - 0xcb, 0x52, 0xd1, 0x62, 0x1e, 0xba, 0x2c, 0x95, 0x78, 0x65, 0xfc, 0x10, 0x2f, 0xe3, 0x58, 0x19, - 0x1f, 0x46, 0x74, 0xc2, 0x62, 0x8e, 0x58, 0x86, 0x1d, 0x26, 0xe6, 0x98, 0x65, 0xd8, 0xd1, 0xc5, - 0x1c, 0xbf, 0x14, 0x3b, 0xa2, 0x98, 0x8f, 0x6d, 0x81, 0xf5, 0xa7, 0x94, 0x40, 0xcc, 0x91, 0x6b, - 0x1b, 0x31, 0x62, 0x4e, 0x7c, 0xa2, 0x57, 0xbc, 0x91, 0x3f, 0x81, 0xe0, 0xc7, 0xbc, 0xbe, 0x31, - 0x0a, 0x4c, 0xc7, 0xb8, 0xc6, 0xf1, 0x63, 0x0a, 0x2c, 0x30, 0x2e, 0x06, 0x4f, 0x99, 0x63, 0x30, - 0x4a, 0x3c, 0x65, 0x4e, 0x7c, 0x06, 0x48, 0xe4, 0x6c, 0xf2, 0x67, 0x80, 0x62, 0xcb, 0x4f, 0x1f, - 0x9c, 0xbf, 0xcc, 0xc1, 0x59, 0x8f, 0x85, 0x0d, 0xab, 0x63, 0x6c, 0x1f, 0x50, 0x2e, 0x2e, 0xea, - 0xdd, 0x7d, 0xec, 0xa0, 0xf7, 0x67, 0x65, 0x51, 0xfa, 0xdf, 0x00, 0xac, 0x1e, 0xb6, 0x69, 0x1c, - 0x37, 0x06, 0xd4, 0x7d, 0x51, 0x95, 0x3d, 0x5c, 0x52, 0x70, 0xfd, 0x4d, 0xdd, 0x27, 0xa2, 0x71, - 0xf4, 0x3c, 0xab, 0x70, 0x26, 0xf8, 0xd2, 0xef, 0xe0, 0x91, 0x39, 0xec, 0xe0, 0x71, 0x3b, 0x28, - 0x7a, 0xa7, 0x13, 0x40, 0xd5, 0xbf, 0x99, 0x4d, 0xca, 0xd4, 0xbc, 0x2c, 0x5e, 0x4e, 0x07, 0x87, - 0x47, 0xf3, 0x22, 0x72, 0x3a, 0xd8, 0x55, 0x17, 0xa1, 0x40, 0xaf, 0x03, 0x0f, 0x56, 0xf4, 0x07, - 0x67, 0x66, 0xb9, 0x44, 0xd3, 0xae, 0x2e, 0xaa, 0xe1, 0x3d, 0x89, 0x24, 0x33, 0xa8, 0x9f, 0x0e, - 0xed, 0x64, 0x4d, 0x50, 0xb0, 0x67, 0x8f, 0x4c, 0x79, 0x32, 0xbb, 0x61, 0xa5, 0x5e, 0xaf, 0x7b, - 0xd0, 0x64, 0x81, 0x07, 0x12, 0xed, 0x86, 0x71, 0xf1, 0x0b, 0xb2, 0x87, 0xe2, 0x17, 0x24, 0xde, - 0x0d, 0x13, 0xf8, 0x18, 0xc7, 0x6e, 0x58, 0x1c, 0xc1, 0x89, 0xdc, 0xc3, 0x43, 0xac, 0x66, 0x76, - 0x1b, 0xc1, 0x3f, 0x0e, 0xf6, 0xac, 0x06, 0xd1, 0xd9, 0x65, 0xd0, 0x45, 0x05, 0xb1, 0xb7, 0xb0, - 0xa8, 0x4f, 0x87, 0xc2, 0xb6, 0x65, 0xef, 0xe9, 0xfe, 0xc6, 0x7d, 0xff, 0x49, 0x11, 0x76, 0x03, - 0xc0, 0x0a, 0xc9, 0xa3, 0xb1, 0xbc, 0xde, 0x7c, 0xe4, 0x05, 0x46, 0x8f, 0x05, 0x7d, 0xf4, 0x1e, - 0xd5, 0x5b, 0x61, 0x9e, 0xc5, 0x7e, 0xac, 0x61, 0xc7, 0xc5, 0x1d, 0x16, 0xd1, 0x42, 0x4c, 0x54, - 0x2f, 0xc0, 0x1c, 0x4b, 0x58, 0x31, 0xba, 0xd8, 0x61, 0x41, 0x2d, 0x84, 0x34, 0xf5, 0x2c, 0x14, - 0x0c, 0xe7, 0x41, 0xc7, 0x32, 0x59, 0x40, 0x3e, 0xf6, 0xa6, 0xde, 0x0e, 0x27, 0x59, 0xbe, 0xc0, - 0x58, 0xa5, 0x07, 0x76, 0xfa, 0x93, 0x3d, 0xd5, 0x32, 0xad, 0x4d, 0xdb, 0xda, 0xb1, 0xb1, 0xe3, - 0x90, 0x53, 0x53, 0xd3, 0x1a, 0x97, 0xa2, 0x3e, 0x0c, 0xa7, 0xba, 0x86, 0x79, 0xc5, 0x21, 0x31, - 0x82, 0x57, 0x98, 0xdb, 0xd8, 0xdc, 0x80, 0xd8, 0xdd, 0x5c, 0x63, 0x63, 0x72, 0xe0, 0x7f, 0xd1, - 0x0e, 0x53, 0x51, 0xef, 0x80, 0x22, 0xe3, 0x66, 0x49, 0x6f, 0x5f, 0x21, 0xdf, 0x99, 0x3b, 0xea, - 0xa1, 0x74, 0x4e, 0x18, 0x34, 0x8c, 0xfe, 0x82, 0x20, 0x0c, 0x1a, 0x49, 0xff, 0x55, 0x19, 0x98, - 0x13, 0x0a, 0xd0, 0x41, 0xf5, 0xbb, 0x45, 0xe7, 0xd2, 0xae, 0xe1, 0x62, 0x8f, 0x39, 0x76, 0xd6, - 0xe5, 0xa9, 0x43, 0x98, 0xd7, 0x0e, 0xfd, 0xa8, 0x0d, 0x20, 0xe6, 0xf1, 0x45, 0x3b, 0x3c, 0xe2, - 0x59, 0xe6, 0x30, 0x5b, 0x55, 0x48, 0x43, 0x2f, 0x00, 0xf5, 0x30, 0x35, 0xce, 0x0b, 0x24, 0x93, - 0xcc, 0x0b, 0xc4, 0x93, 0x9b, 0xde, 0xed, 0x5a, 0xd7, 0x70, 0x27, 0x20, 0xcb, 0x74, 0xf5, 0x50, - 0x3a, 0xfa, 0xcc, 0x28, 0xf3, 0xc2, 0xc4, 0x17, 0x6b, 0x78, 0x8d, 0x6c, 0xbf, 0xdd, 0xc6, 0xb8, - 0xc3, 0x0e, 0xae, 0xf9, 0xaf, 0x09, 0xaf, 0xdc, 0x48, 0x3c, 0x8b, 0x3c, 0xa6, 0x3b, 0x37, 0xde, - 0x17, 0xde, 0x7c, 0xb2, 0x2f, 0xd3, 0xd5, 0xc4, 0x9d, 0x8f, 0x1f, 0xa9, 0x53, 0x41, 0xef, 0x49, - 0x7a, 0x5a, 0x34, 0x16, 0xd3, 0xb3, 0xde, 0xe0, 0xee, 0xec, 0x77, 0x83, 0xe3, 0x4e, 0xf4, 0x2d, - 0x21, 0x7a, 0x89, 0x0e, 0x90, 0x1e, 0x13, 0x72, 0xbf, 0x72, 0x06, 0x0a, 0xf4, 0xe6, 0x41, 0xf4, - 0xaa, 0x85, 0x81, 0xd0, 0x2d, 0x88, 0xd0, 0x6d, 0xc1, 0x9c, 0x69, 0x79, 0xc5, 0x6d, 0xea, 0xb6, - 0xbe, 0xe7, 0xc4, 0x2d, 0xef, 0x53, 0xba, 0x81, 0x2d, 0x57, 0xe3, 0x7e, 0x5b, 0x3b, 0xa1, 0x09, - 0x64, 0xd4, 0xff, 0x1d, 0x4e, 0x5e, 0x66, 0xa1, 0x39, 0x1c, 0x46, 0x39, 0x1b, 0xed, 0xfc, 0xda, - 0x47, 0x79, 0x49, 0xfc, 0x73, 0xed, 0x84, 0xd6, 0x4f, 0x4c, 0xfd, 0x2f, 0xb0, 0xe0, 0xbd, 0x76, - 0xac, 0x6b, 0x3e, 0xe3, 0x4a, 0xf4, 0x0c, 0xa0, 0x8f, 0xfc, 0x86, 0xf0, 0xe3, 0xda, 0x09, 0xad, - 0x8f, 0x94, 0x5a, 0x07, 0xd8, 0x75, 0xf7, 0xba, 0x8c, 0x70, 0x2e, 0xba, 0x33, 0xe9, 0x23, 0xbc, - 0x16, 0xfc, 0xb4, 0x76, 0x42, 0xe3, 0x48, 0xa8, 0xeb, 0x30, 0xe3, 0x3e, 0xea, 0x32, 0x7a, 0xf9, - 0x68, 0xaf, 0x93, 0x3e, 0x7a, 0x4d, 0xff, 0x9f, 0xb5, 0x13, 0x5a, 0x48, 0x40, 0xad, 0xc2, 0x74, - 0xef, 0x32, 0x23, 0x56, 0x88, 0x1e, 0xa9, 0xfa, 0x88, 0x6d, 0x5e, 0x0e, 0x68, 0x05, 0xbf, 0x7b, - 0x8c, 0xb5, 0x9d, 0xab, 0x8c, 0xd6, 0x94, 0x34, 0x63, 0x65, 0xff, 0x1f, 0x8f, 0xb1, 0x80, 0x80, - 0x5a, 0x85, 0x19, 0xc7, 0xd4, 0x7b, 0xce, 0xae, 0xe5, 0x3a, 0xe7, 0xa6, 0xfb, 0x1c, 0x94, 0xa3, - 0xa9, 0x35, 0xd8, 0x3f, 0x5a, 0xf8, 0xb7, 0xfa, 0x74, 0x38, 0xb3, 0xdf, 0xeb, 0xe8, 0x2e, 0xae, - 0x3c, 0x6a, 0x38, 0xae, 0x61, 0xee, 0xf8, 0xb1, 0xa5, 0xe9, 0x30, 0x3f, 0xf8, 0xa3, 0xba, 0xc8, - 0x8e, 0x2a, 0x02, 0x69, 0x97, 0xa8, 0x7f, 0x97, 0x9c, 0x16, 0xcb, 0x9d, 0x50, 0x7c, 0x16, 0xe4, - 0xbc, 0x4f, 0xc4, 0x2c, 0x58, 0x18, 0xbc, 0x02, 0xdf, 0xaf, 0x3b, 0xa4, 0x01, 0x7b, 0x3f, 0xf5, - 0x59, 0x16, 0x73, 0x87, 0x2c, 0x8b, 0x5b, 0x60, 0xd6, 0x70, 0x36, 0x8c, 0x1d, 0x3a, 0xad, 0x61, - 0x23, 0x3f, 0x9f, 0x44, 0x97, 0x81, 0x6a, 0xf8, 0x1a, 0x1d, 0xf2, 0x4f, 0xfa, 0xcb, 0x40, 0x7e, - 0x0a, 0xba, 0x0d, 0xe6, 0xf8, 0x46, 0x46, 0xaf, 0x2f, 0x36, 0xc2, 0x49, 0x11, 0x7b, 0x43, 0xb7, - 0xc2, 0x82, 0xa8, 0xd3, 0x9c, 0xed, 0xa7, 0xf8, 0x83, 0x18, 0x7a, 0x3c, 0x9c, 0xec, 0x6b, 0x58, - 0x7e, 0xb0, 0x9f, 0x4c, 0x18, 0xec, 0xe7, 0x16, 0x80, 0x50, 0x8b, 0x07, 0x92, 0xb9, 0x19, 0x66, - 0x02, 0xbd, 0x1c, 0x98, 0xe1, 0x4b, 0x19, 0x98, 0xf6, 0x95, 0x6d, 0x50, 0x06, 0xcf, 0xa6, 0x30, - 0xb9, 0x9d, 0x3d, 0xdf, 0xa6, 0xe0, 0xd3, 0x3c, 0x03, 0x2f, 0xf4, 0xa7, 0x6f, 0x1a, 0x6e, 0xd7, - 0x3f, 0x93, 0xda, 0x9f, 0xac, 0x6e, 0x02, 0x18, 0x04, 0xa3, 0x66, 0x78, 0x48, 0xf5, 0x29, 0x09, - 0xda, 0x03, 0xd5, 0x07, 0x8e, 0xc6, 0x85, 0x6f, 0x60, 0x27, 0x48, 0x67, 0x20, 0x4f, 0x2f, 0x58, - 0x38, 0xa1, 0x2e, 0x00, 0x54, 0x9e, 0xb7, 0x59, 0xd1, 0xaa, 0x95, 0x5a, 0xb9, 0x52, 0xcc, 0xa0, - 0x1f, 0xcf, 0xc2, 0x4c, 0xd0, 0x08, 0x06, 0x56, 0xb2, 0xc2, 0x54, 0x6b, 0xe8, 0x0d, 0xb1, 0x87, - 0x1b, 0x15, 0xaf, 0x64, 0xcf, 0x84, 0xeb, 0xf7, 0x1d, 0xbc, 0x62, 0xd8, 0x8e, 0xab, 0x59, 0xd7, - 0x56, 0x2c, 0x3b, 0x34, 0x89, 0x68, 0x68, 0xe2, 0xa8, 0xcf, 0x9e, 0xa9, 0xdf, 0xc1, 0xe4, 0xb4, - 0x22, 0xb6, 0xd9, 0x96, 0x4d, 0x98, 0xe0, 0xd1, 0x75, 0x6d, 0xdd, 0x74, 0x7a, 0x96, 0x83, 0x35, - 0xeb, 0x9a, 0x53, 0x32, 0x3b, 0x65, 0xab, 0xbb, 0xbf, 0x67, 0x3a, 0xcc, 0x58, 0x8f, 0xfa, 0xec, - 0x49, 0x87, 0xdc, 0xff, 0xbc, 0x00, 0x50, 0xae, 0xaf, 0xaf, 0x57, 0xca, 0xcd, 0x6a, 0xbd, 0x56, - 0x3c, 0xe1, 0x49, 0xab, 0x59, 0x5a, 0x5a, 0xf7, 0xa4, 0xf3, 0xad, 0x30, 0xed, 0xb7, 0x69, 0x16, - 0x9f, 0x28, 0xe3, 0xc7, 0x27, 0x52, 0x4b, 0x30, 0xed, 0xb7, 0x72, 0x36, 0x22, 0x3c, 0xa1, 0xff, - 0x3c, 0xfa, 0x9e, 0x6e, 0xbb, 0xc4, 0xb4, 0xf4, 0x89, 0x2c, 0xe9, 0x0e, 0xd6, 0x82, 0xdf, 0x2e, - 0x3c, 0x99, 0x71, 0xa0, 0xc2, 0x42, 0x69, 0x7d, 0xbd, 0x55, 0xd7, 0x5a, 0xb5, 0x7a, 0x73, 0xad, - 0x5a, 0x5b, 0xa5, 0x23, 0x64, 0x75, 0xb5, 0x56, 0xd7, 0x2a, 0x74, 0x80, 0x6c, 0x14, 0x33, 0xf4, - 0xfe, 0xf1, 0xa5, 0x69, 0x28, 0xf4, 0x88, 0x74, 0xd1, 0xe7, 0x95, 0x84, 0xa6, 0x45, 0x80, 0x53, - 0xc4, 0x0d, 0xc9, 0xc2, 0x61, 0x90, 0xec, 0x80, 0xc3, 0xda, 0x17, 0x60, 0x8e, 0x9a, 0x43, 0x0e, - 0xd9, 0x57, 0x23, 0xc8, 0x29, 0x9a, 0x90, 0x86, 0x3e, 0x9a, 0x4d, 0x60, 0x5c, 0x0c, 0xe4, 0x28, - 0x99, 0x71, 0xf1, 0x7b, 0x99, 0xd1, 0xae, 0x23, 0xa9, 0xd6, 0x9a, 0x15, 0xad, 0x56, 0x5a, 0x67, - 0x59, 0x14, 0xf5, 0x1c, 0x9c, 0xae, 0xd5, 0x59, 0x30, 0xce, 0x46, 0xab, 0x59, 0x6f, 0x55, 0x37, - 0x36, 0xeb, 0x5a, 0xb3, 0x98, 0x57, 0xcf, 0x82, 0x4a, 0x9f, 0x5b, 0xd5, 0x46, 0xab, 0x5c, 0xaa, - 0x95, 0x2b, 0xeb, 0x95, 0xe5, 0x62, 0x41, 0x7d, 0x22, 0x3c, 0x9e, 0x5e, 0x6f, 0x55, 0x5f, 0x69, - 0x69, 0xf5, 0x4b, 0x0d, 0x0f, 0x41, 0xad, 0xb2, 0x5e, 0xf2, 0x14, 0x89, 0xbb, 0x87, 0x7c, 0x4a, - 0xbd, 0x0e, 0x4e, 0xae, 0x54, 0xd7, 0x2b, 0xad, 0xf5, 0x7a, 0x69, 0x99, 0x95, 0x37, 0xad, 0xde, - 0x04, 0xe7, 0xaa, 0xb5, 0xc6, 0xd6, 0xca, 0x4a, 0xb5, 0x5c, 0xad, 0xd4, 0x9a, 0xad, 0xcd, 0x8a, - 0xb6, 0x51, 0x6d, 0x34, 0xbc, 0x7f, 0x8b, 0x33, 0xe4, 0x96, 0x67, 0xda, 0x67, 0x7a, 0x46, 0xec, - 0xfc, 0x45, 0xbd, 0x6b, 0x78, 0x03, 0x05, 0xb9, 0xfe, 0xbd, 0xef, 0x1c, 0x97, 0x4b, 0xae, 0x89, - 0x67, 0x27, 0x41, 0xc8, 0x0b, 0xfa, 0x4e, 0x25, 0xe1, 0x39, 0x2e, 0x06, 0x04, 0x2d, 0x71, 0x51, - 0x28, 0x2d, 0x62, 0xd5, 0xe1, 0xf5, 0xd9, 0x04, 0xe7, 0xb8, 0xe4, 0xc9, 0x27, 0x03, 0xff, 0x27, - 0xc6, 0x05, 0x7e, 0x11, 0xe6, 0xb6, 0x6a, 0xa5, 0xad, 0xe6, 0x5a, 0x5d, 0xab, 0x7e, 0x0b, 0xb9, - 0x85, 0x60, 0x1e, 0x66, 0x56, 0xea, 0xda, 0x52, 0x75, 0x79, 0xb9, 0x52, 0x2b, 0xe6, 0xd5, 0xeb, - 0xe1, 0xba, 0x46, 0x45, 0xbb, 0x58, 0x2d, 0x57, 0x5a, 0x5b, 0xb5, 0xd2, 0xc5, 0x52, 0x75, 0x9d, - 0xf4, 0x11, 0x85, 0x98, 0xab, 0xeb, 0xa7, 0xd0, 0xb7, 0xe7, 0x00, 0x68, 0xd5, 0xc9, 0x25, 0x5c, - 0xdc, 0x05, 0xe7, 0x7f, 0x90, 0x74, 0xba, 0x17, 0x92, 0x89, 0x68, 0xbf, 0x55, 0x98, 0xb6, 0xd9, - 0x07, 0xb6, 0xae, 0x39, 0x8c, 0x0e, 0x7d, 0xf4, 0xa9, 0x69, 0xc1, 0xef, 0xe8, 0xfd, 0x49, 0x66, - 0x77, 0x91, 0x8c, 0x25, 0x43, 0x72, 0x65, 0x3c, 0x40, 0xa2, 0x97, 0x67, 0x60, 0x41, 0xac, 0x98, - 0x57, 0x09, 0x62, 0x4c, 0xc9, 0x55, 0x42, 0xfc, 0x99, 0x33, 0xb2, 0x2e, 0x3c, 0x8d, 0x0d, 0xa7, - 0xe0, 0xb7, 0x4c, 0x1a, 0x92, 0xc1, 0xb7, 0x58, 0x8a, 0x19, 0x8f, 0x79, 0xcf, 0xe8, 0x28, 0x66, - 0xd5, 0x29, 0x50, 0x9a, 0x8f, 0xba, 0x45, 0x05, 0x7d, 0x49, 0x81, 0x79, 0xe1, 0x06, 0x75, 0x6f, - 0xf6, 0x25, 0x71, 0xbb, 0x31, 0x77, 0x37, 0x7b, 0xe6, 0xa8, 0x77, 0xb3, 0x5f, 0xb8, 0x0b, 0xa6, - 0x58, 0x1a, 0x91, 0x6f, 0xbd, 0xe6, 0x99, 0x02, 0x27, 0x61, 0x76, 0xb5, 0xd2, 0x6c, 0x35, 0x9a, - 0x25, 0xad, 0x59, 0x59, 0x2e, 0x66, 0xbc, 0x81, 0xaf, 0xb2, 0xb1, 0xd9, 0x7c, 0xb8, 0x98, 0x4d, - 0xee, 0x1a, 0xdb, 0xcf, 0xc8, 0x84, 0x5d, 0x63, 0xe3, 0x8a, 0x4f, 0x7f, 0xae, 0xfa, 0x69, 0x05, - 0x8a, 0x94, 0x83, 0xca, 0xa3, 0x3d, 0x6c, 0x1b, 0xd8, 0x6c, 0x63, 0x74, 0x45, 0x26, 0x54, 0xef, - 0xa1, 0x20, 0x95, 0xa4, 0x3f, 0xe7, 0xac, 0x44, 0xfa, 0xd2, 0x67, 0x60, 0xe7, 0x0e, 0x19, 0xd8, - 0xbf, 0x95, 0xd4, 0x37, 0xb6, 0x9f, 0xdd, 0xb1, 0x40, 0xf6, 0x89, 0x24, 0xbe, 0xb1, 0x43, 0x38, - 0x98, 0x48, 0x04, 0xee, 0x88, 0xf1, 0xb7, 0xa8, 0xa0, 0x97, 0x29, 0x70, 0x72, 0x59, 0x77, 0xf1, - 0xd2, 0x41, 0xd3, 0xbf, 0xe1, 0x34, 0xe2, 0x56, 0xf2, 0xcc, 0xa1, 0x5b, 0xc9, 0xc3, 0x4b, 0x52, - 0xb3, 0x7d, 0x97, 0xa4, 0xa2, 0x77, 0x27, 0x3d, 0x4d, 0xdb, 0xc7, 0xc3, 0xd8, 0xc2, 0x64, 0x27, - 0x3b, 0x25, 0x1b, 0xcf, 0x45, 0xfa, 0x0d, 0xec, 0xed, 0x33, 0x50, 0xa4, 0xac, 0x70, 0xee, 0x9f, - 0x3f, 0xc4, 0x2e, 0xf2, 0x6f, 0x25, 0x88, 0xb6, 0xe9, 0xc7, 0x2f, 0xc9, 0x8a, 0xf1, 0x4b, 0x84, - 0xdd, 0x04, 0xa5, 0xdf, 0x65, 0x27, 0x69, 0x67, 0xc8, 0xf9, 0x7a, 0x46, 0x07, 0x38, 0x4e, 0xaf, - 0x33, 0x8c, 0x2d, 0x7e, 0x32, 0x97, 0x4d, 0xb3, 0xfb, 0x5d, 0x2b, 0xb2, 0xc8, 0xc4, 0xdf, 0xa9, - 0x9f, 0xd4, 0xf1, 0x5f, 0xf0, 0xb5, 0x8d, 0xb9, 0x68, 0x3e, 0x3d, 0xc7, 0xff, 0x61, 0x1c, 0xa4, - 0x8f, 0xc2, 0xbf, 0x65, 0x21, 0xd7, 0xb0, 0x6c, 0x77, 0x5c, 0x18, 0x24, 0x75, 0x56, 0xe0, 0x24, - 0xd0, 0x88, 0x9e, 0x73, 0xa6, 0xe7, 0xac, 0x10, 0x5f, 0xfe, 0x04, 0x02, 0x96, 0x9e, 0x84, 0x05, - 0xca, 0x49, 0x70, 0xdb, 0xcf, 0xbf, 0x66, 0x69, 0x7f, 0xf5, 0x90, 0x2c, 0x22, 0x64, 0xcb, 0x2a, - 0x70, 0x16, 0xf0, 0x41, 0x11, 0xd2, 0xd0, 0x9b, 0x79, 0x5c, 0x96, 0x45, 0x5c, 0x06, 0xcd, 0xb8, - 0x83, 0x0b, 0x73, 0xc6, 0xd5, 0x33, 0x25, 0x89, 0x7d, 0x1a, 0x53, 0x78, 0xfa, 0x88, 0xbc, 0x58, - 0x81, 0x02, 0x73, 0xd6, 0x1c, 0x2b, 0x02, 0x49, 0x5b, 0x46, 0x20, 0x04, 0x39, 0xa7, 0x4e, 0x65, - 0xdc, 0x2d, 0x23, 0xbe, 0xfc, 0xf4, 0x71, 0xf8, 0x77, 0xe6, 0x85, 0x5c, 0xba, 0xaa, 0x1b, 0x5d, - 0xfd, 0x72, 0x37, 0x41, 0xcc, 0xf1, 0x8f, 0x26, 0x3c, 0x77, 0x19, 0x54, 0x55, 0x28, 0x2f, 0x42, - 0xe2, 0xdf, 0x04, 0x33, 0xb6, 0xb0, 0x4b, 0xeb, 0x59, 0x51, 0x7d, 0x1e, 0xe0, 0xec, 0xbb, 0x16, - 0xe6, 0x4c, 0x74, 0xc8, 0x52, 0x8a, 0x9f, 0x89, 0x1c, 0x0a, 0x9b, 0x2d, 0x75, 0x3a, 0x2b, 0x58, - 0x77, 0xf7, 0x6d, 0xdc, 0x49, 0x34, 0x44, 0xd8, 0x7d, 0x1b, 0xd9, 0x9c, 0x24, 0x84, 0xa8, 0x9f, - 0xeb, 0x22, 0x3a, 0xcf, 0x18, 0xd2, 0x1b, 0xf8, 0xbc, 0x8c, 0xa5, 0x4b, 0xfa, 0xf9, 0x00, 0x92, - 0xba, 0x00, 0xc9, 0xb3, 0x46, 0x63, 0x22, 0x7d, 0x40, 0x7e, 0x44, 0x81, 0x05, 0x6a, 0x27, 0x8c, - 0x1b, 0x93, 0x0f, 0x26, 0x74, 0xee, 0xe2, 0xee, 0x53, 0xe3, 0xd9, 0x19, 0x0b, 0x2c, 0x49, 0x5c, - 0xc1, 0xe4, 0xf8, 0x48, 0x1f, 0x99, 0x97, 0x9c, 0x02, 0xe0, 0x1c, 0x76, 0x3f, 0x5a, 0x08, 0x23, - 0x70, 0xa2, 0x77, 0xb0, 0xf9, 0x47, 0x43, 0x08, 0x07, 0xcf, 0x39, 0xe3, 0x06, 0x1b, 0x52, 0x62, - 0xa2, 0xd4, 0xa8, 0xf2, 0x7b, 0x09, 0x6d, 0x5e, 0xe6, 0x2e, 0x3b, 0x74, 0x70, 0x1f, 0xb1, 0x97, - 0xfb, 0x58, 0x02, 0xe3, 0x77, 0x18, 0x2b, 0xc9, 0x50, 0x5b, 0x1f, 0x61, 0x66, 0x7f, 0x0e, 0x4e, - 0x6b, 0x95, 0xd2, 0x72, 0xbd, 0xb6, 0xfe, 0x30, 0x7f, 0xb9, 0x56, 0x51, 0xe1, 0x27, 0x27, 0xa9, - 0xc0, 0xf6, 0xc6, 0x84, 0x7d, 0xa0, 0x28, 0xab, 0xb8, 0xd9, 0x0a, 0xb7, 0xb8, 0x32, 0xbc, 0x57, - 0x93, 0x20, 0x7b, 0x9c, 0x28, 0xfc, 0x7d, 0x01, 0x66, 0x35, 0xdc, 0xb6, 0xf6, 0xf6, 0xb0, 0xd9, - 0xc1, 0x1d, 0xf4, 0x46, 0x05, 0xe6, 0x82, 0xfd, 0xbe, 0x06, 0x76, 0xd1, 0x7f, 0x09, 0xb1, 0xb9, - 0x00, 0x73, 0x5e, 0xe5, 0xea, 0x62, 0x88, 0x7f, 0x21, 0x4d, 0xbd, 0x13, 0x4e, 0xf9, 0x28, 0xd4, - 0xfb, 0xa6, 0x30, 0x87, 0x3f, 0x88, 0x1e, 0x39, 0x5b, 0x22, 0x46, 0x0f, 0x44, 0x0b, 0x33, 0x60, - 0x77, 0x91, 0x67, 0x35, 0x02, 0xac, 0xdf, 0x09, 0xc0, 0x7a, 0x9e, 0x00, 0xd6, 0xf2, 0x11, 0xe9, - 0x1f, 0x27, 0x6a, 0xbf, 0xa8, 0xc0, 0x69, 0xbf, 0x23, 0x9e, 0x1c, 0x5a, 0x1f, 0xe3, 0xd1, 0xfa, - 0x56, 0x11, 0xad, 0x55, 0x19, 0x69, 0x0e, 0x62, 0x39, 0x02, 0xb5, 0xcf, 0x05, 0xa8, 0x7d, 0x9b, - 0x80, 0xda, 0xfa, 0x98, 0xca, 0x39, 0x4e, 0xf4, 0x3e, 0xa8, 0xc0, 0x39, 0xcf, 0xec, 0x2c, 0x5b, - 0xe6, 0x76, 0xd7, 0x68, 0xbb, 0x86, 0xb9, 0x13, 0x3a, 0x1f, 0xae, 0xca, 0xac, 0x6c, 0xf6, 0x63, - 0x9b, 0x3d, 0x8c, 0xad, 0x18, 0x19, 0x45, 0xb6, 0x6d, 0x45, 0xb1, 0x15, 0x31, 0x84, 0x71, 0x6e, - 0xf5, 0xa1, 0xe6, 0xf0, 0x49, 0xc9, 0x5b, 0x9f, 0x24, 0x07, 0xc7, 0x89, 0xdf, 0x8b, 0x81, 0x33, - 0x3d, 0xbe, 0x5b, 0x81, 0x22, 0xf1, 0x74, 0x25, 0x3d, 0x3b, 0xbb, 0x79, 0xb6, 0x2e, 0x9e, 0x81, - 0xe8, 0xf9, 0x02, 0xf2, 0xcf, 0x40, 0xf8, 0x09, 0xea, 0x6d, 0xb0, 0xd0, 0xde, 0xc5, 0xed, 0x2b, - 0x55, 0xd3, 0xf7, 0x45, 0xa2, 0x8e, 0x2b, 0x7d, 0xa9, 0xe2, 0x60, 0xf6, 0x90, 0x08, 0xa6, 0xb8, - 0xf0, 0x28, 0x4c, 0x6c, 0x78, 0xa6, 0x22, 0x1a, 0xda, 0xaf, 0x07, 0x00, 0xd5, 0x04, 0x80, 0xee, - 0x1d, 0x89, 0x6a, 0x32, 0x58, 0x6a, 0x23, 0xc0, 0x82, 0xe0, 0x6c, 0x7d, 0xb3, 0x59, 0xad, 0xd7, - 0x5a, 0x5b, 0x8d, 0xca, 0x72, 0x6b, 0xc9, 0x07, 0xa7, 0x51, 0x54, 0xd0, 0x97, 0xb3, 0x30, 0x45, - 0xd9, 0x72, 0xd0, 0x93, 0x42, 0x08, 0x86, 0x1e, 0xfe, 0x40, 0x6f, 0x97, 0x0e, 0xe5, 0x14, 0x08, - 0x82, 0x95, 0x13, 0xd1, 0x30, 0x9e, 0x09, 0x53, 0x14, 0x64, 0x7f, 0x17, 0xe0, 0x7c, 0x84, 0x65, - 0xc7, 0xc8, 0x68, 0x7e, 0x76, 0xc9, 0xb0, 0x4e, 0x43, 0xd8, 0x48, 0xdf, 0x1a, 0x7f, 0x61, 0x8e, - 0x2e, 0x1d, 0x5c, 0x32, 0xdc, 0x5d, 0x72, 0x36, 0x04, 0x3d, 0x57, 0xa6, 0xe3, 0xba, 0x13, 0xf2, - 0x57, 0xbd, 0xdc, 0x43, 0xce, 0xd9, 0xd0, 0x4c, 0xe8, 0x27, 0xa4, 0xa3, 0x88, 0x0b, 0xfa, 0x19, - 0xf0, 0x14, 0x01, 0xce, 0x06, 0xe4, 0xba, 0x86, 0xe3, 0x32, 0x9b, 0xfb, 0x9e, 0x44, 0x84, 0xfc, - 0x87, 0xaa, 0x8b, 0xf7, 0x34, 0x42, 0x06, 0x3d, 0xe8, 0x59, 0x4c, 0x61, 0xaa, 0xc4, 0x59, 0xa3, - 0x73, 0x30, 0xc5, 0xce, 0xc0, 0xb3, 0x6d, 0x29, 0xff, 0x55, 0x72, 0x2b, 0x48, 0xaa, 0xb6, 0xe9, - 0xeb, 0xc0, 0xff, 0x7b, 0x12, 0xa6, 0xd6, 0x0c, 0xc7, 0xb5, 0xec, 0x03, 0xf4, 0xa6, 0x0c, 0x4c, - 0x5d, 0xc4, 0xb6, 0x63, 0x58, 0xe6, 0x21, 0xf7, 0xac, 0x5b, 0x60, 0xb6, 0x67, 0xe3, 0xab, 0x86, - 0xb5, 0xef, 0x70, 0xa3, 0x04, 0x97, 0xa4, 0x22, 0x98, 0xd6, 0xf7, 0xdd, 0x5d, 0xcb, 0x0e, 0x43, - 0x67, 0xf9, 0xef, 0xea, 0x79, 0x00, 0xfa, 0x5c, 0xd3, 0xf7, 0xb0, 0x7f, 0x3b, 0x7e, 0x98, 0xa2, - 0xaa, 0x90, 0x73, 0x8d, 0x3d, 0xcc, 0x62, 0xe9, 0x93, 0x67, 0x4f, 0xc0, 0x24, 0x2e, 0x2d, 0x8b, - 0xff, 0xab, 0x68, 0xfe, 0x2b, 0xfa, 0x43, 0x05, 0x66, 0x57, 0xb1, 0xcb, 0x58, 0x75, 0xd0, 0x2b, - 0x32, 0x52, 0xd7, 0x57, 0x79, 0xf3, 0x92, 0xae, 0xee, 0xf8, 0xff, 0x05, 0x43, 0xae, 0x98, 0x18, - 0x06, 0xf6, 0x57, 0xf8, 0x5b, 0x3d, 0x48, 0x94, 0x57, 0xb7, 0x4a, 0x8f, 0x5d, 0xb0, 0xcc, 0x6c, - 0xe3, 0xf8, 0xf0, 0x07, 0xd1, 0x26, 0x8e, 0x8d, 0x90, 0xc2, 0x64, 0xbf, 0xc8, 0xd5, 0x27, 0xb2, - 0x3b, 0x9a, 0xbe, 0xca, 0x72, 0x1c, 0xba, 0xb0, 0x85, 0xa7, 0xc4, 0xc8, 0x68, 0x41, 0x6e, 0xc9, - 0xd8, 0x2a, 0xc3, 0x39, 0x99, 0xc0, 0x15, 0xbd, 0x0a, 0xcc, 0x36, 0x76, 0xad, 0x6b, 0xbe, 0x1c, - 0xbf, 0x55, 0x0e, 0xd8, 0x9b, 0x60, 0xe6, 0x6a, 0x1f, 0xa8, 0x61, 0x02, 0x7f, 0x2b, 0xa0, 0x22, - 0xde, 0x0a, 0xf8, 0x52, 0x25, 0x29, 0x4c, 0x1c, 0x73, 0x11, 0x30, 0x89, 0x17, 0xf9, 0x65, 0x13, - 0x5c, 0xe4, 0xa7, 0x3e, 0x03, 0xa6, 0x18, 0xd7, 0x6c, 0x99, 0x3a, 0x1e, 0x60, 0x3f, 0x33, 0x5f, - 0xc1, 0x9c, 0x58, 0xc1, 0x64, 0xc8, 0x47, 0x57, 0x2e, 0x7d, 0xe4, 0x7f, 0x33, 0x4b, 0x22, 0x6b, - 0xf9, 0xc0, 0x97, 0xc7, 0x00, 0x3c, 0xfa, 0x5a, 0x46, 0x76, 0x33, 0x27, 0x90, 0x40, 0xc0, 0xc1, - 0x91, 0xae, 0xa6, 0x1b, 0x4a, 0x2e, 0x7d, 0x79, 0xfe, 0x78, 0x0e, 0xe6, 0x96, 0x8d, 0xed, 0xed, - 0xa0, 0x93, 0x7c, 0xa5, 0x64, 0x27, 0x19, 0xed, 0x42, 0xe5, 0xd9, 0xb9, 0xfb, 0xb6, 0x8d, 0x4d, - 0xbf, 0x52, 0xac, 0x39, 0xf5, 0xa5, 0xaa, 0xb7, 0xc3, 0x49, 0x7f, 0x5c, 0xe0, 0x3b, 0xca, 0x19, - 0xad, 0x3f, 0x19, 0x7d, 0x45, 0xda, 0x13, 0xc0, 0x97, 0x28, 0x5f, 0xa5, 0x88, 0x06, 0x78, 0x1f, - 0xcc, 0xef, 0xd2, 0xdc, 0x64, 0xb9, 0xd4, 0xef, 0x2c, 0xcf, 0xf6, 0xdd, 0x5c, 0xb0, 0x81, 0x1d, - 0x47, 0xdf, 0xc1, 0x9a, 0x98, 0xb9, 0xaf, 0xf9, 0x2a, 0x49, 0xee, 0xe1, 0x94, 0x73, 0x2a, 0x90, - 0xa8, 0x49, 0xfa, 0xda, 0xf1, 0xb9, 0x0b, 0x90, 0x5b, 0x31, 0xba, 0x18, 0x7d, 0x4f, 0x16, 0x66, - 0xbc, 0x59, 0xb7, 0xd9, 0xf6, 0xde, 0x38, 0x87, 0xca, 0xbf, 0xcf, 0xc8, 0xde, 0x3f, 0xed, 0xd1, - 0x59, 0x0c, 0x68, 0x44, 0xb4, 0x1b, 0xb9, 0x7b, 0xa6, 0x63, 0x49, 0x4d, 0xe0, 0xb6, 0x30, 0x6f, - 0xea, 0xb1, 0xbd, 0xdd, 0xb5, 0x74, 0x61, 0xc3, 0xa0, 0xdf, 0x14, 0x0a, 0x8f, 0x6f, 0xd6, 0x2c, - 0x77, 0xd3, 0x30, 0xcd, 0x20, 0x22, 0xca, 0xa1, 0x74, 0xd1, 0xd7, 0x25, 0x36, 0xa8, 0x1c, 0xa9, - 0x3b, 0x2b, 0x3d, 0x42, 0xb3, 0x6f, 0x83, 0x85, 0xcb, 0x07, 0x2e, 0x76, 0x58, 0x2e, 0x56, 0x6c, - 0x4e, 0xeb, 0x4b, 0xe5, 0xae, 0x84, 0x88, 0x0b, 0x3e, 0x17, 0x53, 0x60, 0x32, 0x51, 0xaf, 0x8d, - 0x30, 0x03, 0x3c, 0x0d, 0xc5, 0x5a, 0x7d, 0xb9, 0x42, 0xfc, 0x7b, 0x7d, 0x8f, 0xc9, 0x1d, 0xf4, - 0x83, 0x0a, 0xcc, 0x11, 0x07, 0x3c, 0x1f, 0x85, 0xc7, 0x4b, 0xcc, 0x47, 0xd0, 0x17, 0xa4, 0x7d, - 0x7f, 0x49, 0x95, 0xf9, 0x02, 0xa2, 0x05, 0xbd, 0x6d, 0x74, 0xfb, 0x05, 0x9d, 0xd7, 0xfa, 0x52, - 0x07, 0x00, 0xa2, 0x0c, 0x04, 0xe4, 0x17, 0xa5, 0x1c, 0x80, 0x87, 0x71, 0x77, 0x5c, 0xa8, 0xfc, - 0x92, 0x02, 0xb3, 0xde, 0x24, 0xc5, 0x07, 0xa5, 0x2e, 0x80, 0x62, 0x99, 0xdd, 0x83, 0x70, 0x59, - 0xc4, 0x7f, 0x4d, 0xd4, 0x48, 0xfe, 0x48, 0x7a, 0xe6, 0x4e, 0x44, 0xc4, 0xf1, 0x32, 0x21, 0xfc, - 0x3e, 0x20, 0x35, 0x9f, 0x1f, 0xc2, 0xdc, 0x71, 0xc1, 0xf7, 0x86, 0x02, 0x14, 0xb6, 0x7a, 0x04, - 0xb9, 0xcf, 0x2b, 0x32, 0xd7, 0xab, 0x1c, 0x3a, 0xfc, 0xe5, 0x99, 0x59, 0x5d, 0xab, 0xad, 0x77, - 0x37, 0xc3, 0xf3, 0xcf, 0x61, 0x82, 0x7a, 0x2f, 0xf3, 0x07, 0xa7, 0xc7, 0x78, 0x6f, 0x8b, 0xbd, - 0x79, 0x84, 0xc8, 0x88, 0x3b, 0x68, 0x77, 0x27, 0x9c, 0xea, 0x18, 0x8e, 0x7e, 0xb9, 0x8b, 0x2b, - 0x66, 0xdb, 0x3e, 0xa0, 0xe2, 0x60, 0xd3, 0xaa, 0x43, 0x1f, 0xd4, 0xfb, 0x21, 0xef, 0xb8, 0x07, - 0x5d, 0x3a, 0x4f, 0xe4, 0xcf, 0xe5, 0x45, 0x16, 0xd5, 0xf0, 0xb2, 0x6b, 0xf4, 0x2f, 0xde, 0xad, - 0x73, 0x4a, 0xce, 0xad, 0x53, 0x7d, 0x1a, 0x14, 0x2c, 0xdb, 0xd8, 0x31, 0xe8, 0x65, 0x82, 0x0b, - 0x87, 0x02, 0xec, 0x52, 0x53, 0xa0, 0x4e, 0xb2, 0x68, 0x2c, 0xab, 0xfa, 0x0c, 0x98, 0x31, 0xf6, - 0xf4, 0x1d, 0xfc, 0x90, 0x61, 0xd2, 0xf0, 0x03, 0x0b, 0x77, 0x9f, 0x3b, 0x74, 0xe4, 0x90, 0x7d, - 0xd7, 0xc2, 0xac, 0xea, 0x7d, 0x70, 0x43, 0xdb, 0xc6, 0xba, 0x8b, 0x3d, 0x01, 0x5d, 0x32, 0x3a, - 0x3b, 0xd8, 0xad, 0x6e, 0x6f, 0x18, 0x8e, 0x63, 0x98, 0x3b, 0xec, 0xbe, 0xd0, 0xe8, 0x0c, 0xe8, - 0x03, 0x59, 0xd9, 0x18, 0x82, 0x44, 0x32, 0x54, 0x25, 0x46, 0xb8, 0xd7, 0x9c, 0x93, 0xa2, 0x22, - 0xe9, 0x1c, 0xfb, 0x3a, 0xa9, 0xe8, 0x7e, 0xd1, 0x6c, 0xa5, 0x3f, 0xf4, 0xff, 0x7e, 0x16, 0xa6, - 0x97, 0xad, 0x6b, 0x26, 0x69, 0x26, 0xf7, 0xc8, 0x59, 0xca, 0x03, 0x02, 0x02, 0x88, 0x37, 0x64, - 0xc7, 0x9e, 0x21, 0x23, 0xb5, 0xf5, 0x8b, 0x8c, 0x80, 0x21, 0xb6, 0xdd, 0x49, 0x1e, 0x3b, 0x8f, - 0x2b, 0x27, 0x7d, 0xb9, 0xfe, 0xb6, 0x02, 0xb9, 0x65, 0xdb, 0xea, 0xa1, 0x9f, 0xcf, 0x24, 0x70, - 0x12, 0xeb, 0xd8, 0x56, 0xaf, 0x49, 0x2e, 0x1e, 0x0d, 0xf7, 0x45, 0xf8, 0x34, 0xf5, 0x1e, 0x98, - 0xee, 0x59, 0x8e, 0xe1, 0xfa, 0x93, 0x90, 0x85, 0xbb, 0x1f, 0x37, 0xb0, 0x2f, 0xd8, 0x64, 0x99, - 0xb4, 0x20, 0xbb, 0xd7, 0xe7, 0x13, 0x11, 0x7a, 0x72, 0xf1, 0xc4, 0xe8, 0x5f, 0xbe, 0xda, 0x97, - 0x8a, 0x5e, 0xc5, 0x23, 0xf9, 0x2c, 0x11, 0xc9, 0x27, 0x0c, 0x90, 0xb0, 0x6d, 0xf5, 0xc6, 0xe2, - 0xd6, 0xf1, 0x9a, 0x00, 0xd5, 0x67, 0x0b, 0xa8, 0xde, 0x21, 0x55, 0x66, 0xfa, 0x88, 0x7e, 0x20, - 0x07, 0x40, 0x8c, 0x94, 0x2d, 0x6f, 0xfa, 0x24, 0x67, 0xa1, 0x7d, 0x57, 0x8e, 0x93, 0x65, 0x49, - 0x94, 0xe5, 0x93, 0x22, 0x6c, 0x20, 0x42, 0x3e, 0x42, 0xa2, 0x25, 0xc8, 0xef, 0x7b, 0x9f, 0x99, - 0x44, 0x25, 0x49, 0x90, 0x57, 0x8d, 0xfe, 0x89, 0x7e, 0x33, 0x03, 0x79, 0x92, 0xa0, 0x9e, 0x07, - 0x20, 0x66, 0x01, 0x3d, 0x82, 0x99, 0x21, 0x06, 0x00, 0x97, 0x42, 0xb4, 0xd5, 0xe8, 0xb0, 0xcf, - 0xd4, 0xe0, 0x0e, 0x13, 0xbc, 0xbf, 0x89, 0xb1, 0x40, 0x68, 0x31, 0xf3, 0x81, 0x4b, 0xf1, 0xfe, - 0x26, 0x6f, 0xeb, 0x78, 0x9b, 0xde, 0x09, 0x91, 0xd3, 0xc2, 0x84, 0xe0, 0xef, 0xf5, 0xe0, 0x26, - 0x51, 0xff, 0x6f, 0x92, 0xe2, 0x4d, 0xa5, 0x89, 0x5a, 0x2e, 0x85, 0x45, 0x14, 0x48, 0xa6, 0xfe, - 0x64, 0xf4, 0xc6, 0x40, 0x6d, 0x96, 0x05, 0xb5, 0x79, 0x4a, 0x02, 0xf1, 0xa6, 0xaf, 0x3c, 0x5f, - 0xca, 0xc3, 0x4c, 0xcd, 0xea, 0x30, 0xdd, 0xe1, 0xa6, 0x9b, 0x9f, 0xc8, 0x27, 0x9a, 0x6e, 0x06, - 0x34, 0x22, 0x14, 0xe4, 0x39, 0xa2, 0x82, 0xc8, 0x51, 0xe0, 0xf5, 0x43, 0x5d, 0x82, 0x02, 0xd1, - 0xde, 0xc3, 0x57, 0x54, 0xc6, 0x91, 0x20, 0xa2, 0xd5, 0xd8, 0x9f, 0xff, 0xe9, 0x74, 0xec, 0xbf, - 0x41, 0x9e, 0x54, 0x30, 0x66, 0x6f, 0x48, 0xac, 0x68, 0x36, 0xbe, 0xa2, 0x4a, 0x7c, 0x45, 0x73, - 0xfd, 0x15, 0x4d, 0xb2, 0x8a, 0x10, 0xa5, 0x21, 0xe9, 0xeb, 0xf8, 0xdf, 0x4c, 0x01, 0xd4, 0xf4, - 0xab, 0xc6, 0x0e, 0xdd, 0x5b, 0xfe, 0x43, 0x7f, 0xf6, 0xc4, 0x76, 0x81, 0xbf, 0x8f, 0x1b, 0x08, - 0xef, 0x81, 0x29, 0x36, 0xee, 0xb1, 0x8a, 0xdc, 0x2c, 0x54, 0x24, 0xa4, 0x42, 0x8d, 0xda, 0x47, - 0x5d, 0xcd, 0xcf, 0x2f, 0xdc, 0xa6, 0x9f, 0xed, 0xbb, 0x4d, 0x7f, 0xf0, 0x0e, 0x46, 0xc4, 0x1d, - 0xfb, 0xe8, 0xbd, 0xd2, 0x67, 0xa8, 0x38, 0x7e, 0xb8, 0x1a, 0x45, 0x34, 0xc1, 0xa7, 0xc1, 0x94, - 0x15, 0x6c, 0x87, 0x2b, 0x91, 0xab, 0x68, 0x55, 0x73, 0xdb, 0xd2, 0xfc, 0x9c, 0x92, 0x5b, 0x67, - 0x52, 0x7c, 0x4c, 0xe4, 0x98, 0xe2, 0xd9, 0x55, 0x3f, 0xbe, 0xa6, 0x57, 0x8f, 0x4b, 0x86, 0xbb, - 0xbb, 0x6e, 0x98, 0x57, 0x1c, 0xf4, 0x6d, 0x72, 0x16, 0x24, 0x87, 0x7f, 0x36, 0x19, 0xfe, 0x62, - 0x7c, 0xab, 0x86, 0x88, 0xda, 0xfd, 0x51, 0x54, 0x06, 0x73, 0x1b, 0x01, 0xe0, 0xbd, 0x50, 0xa0, - 0x8c, 0xb2, 0x4e, 0xf4, 0x42, 0x24, 0x7e, 0x01, 0x25, 0x8d, 0xfd, 0x81, 0xde, 0x13, 0xe0, 0x78, - 0x51, 0xc0, 0x71, 0xe9, 0x48, 0x9c, 0xa5, 0x0e, 0xe9, 0x85, 0xa7, 0xc2, 0x14, 0x93, 0xb4, 0xba, - 0xc0, 0xb7, 0xe2, 0xe2, 0x09, 0x15, 0xa0, 0xb0, 0x61, 0x5d, 0xc5, 0x4d, 0xab, 0x98, 0xf1, 0x9e, - 0x3d, 0xfe, 0x9a, 0x56, 0x31, 0x8b, 0x5e, 0x3b, 0x0d, 0xd3, 0x41, 0x60, 0xc3, 0xdf, 0xcf, 0x42, - 0xb1, 0x4c, 0x66, 0x68, 0x2b, 0xb6, 0xb5, 0x47, 0x6b, 0x24, 0xef, 0x8f, 0xff, 0x23, 0xd2, 0x0e, - 0x22, 0x41, 0xc0, 0xc1, 0xfe, 0xc2, 0x22, 0xb0, 0xa4, 0x4b, 0x98, 0x59, 0x7f, 0x09, 0x13, 0xbd, - 0x4d, 0xca, 0x61, 0x44, 0xb6, 0x94, 0xf4, 0x9b, 0xda, 0x6f, 0x65, 0x21, 0x5f, 0xee, 0x5a, 0x26, - 0xe6, 0x0f, 0x8d, 0x0e, 0x3d, 0x9d, 0x38, 0x78, 0x1f, 0x03, 0xbd, 0x30, 0x2b, 0x6b, 0x6b, 0x84, - 0x02, 0xf0, 0xca, 0x96, 0x94, 0xad, 0xdc, 0x20, 0x15, 0x4b, 0x3a, 0x7d, 0x81, 0x7e, 0x39, 0x0b, - 0x33, 0x34, 0x12, 0x59, 0xa9, 0xdb, 0x45, 0x8f, 0x0b, 0x85, 0x3a, 0x20, 0x38, 0x24, 0xfa, 0x45, - 0xe9, 0x43, 0x51, 0x41, 0xad, 0x02, 0xda, 0x09, 0x82, 0xe9, 0x25, 0x3b, 0xa3, 0x23, 0xb7, 0x13, - 0x37, 0x94, 0xa1, 0xf4, 0x45, 0xfd, 0x07, 0x59, 0xcf, 0x00, 0x30, 0xaf, 0x6c, 0xda, 0xf8, 0xaa, - 0x81, 0xaf, 0xa1, 0x1b, 0x43, 0x61, 0x1f, 0x0e, 0xb3, 0xf4, 0x16, 0xe9, 0x45, 0x1c, 0x8e, 0x64, - 0xe4, 0x46, 0xd8, 0x6c, 0x37, 0xcc, 0xc4, 0x7a, 0xf1, 0xfe, 0xd8, 0x57, 0x1c, 0x19, 0x8d, 0xcf, - 0x2e, 0xb9, 0x66, 0x13, 0xcd, 0x45, 0xfa, 0x82, 0xfd, 0xc8, 0x14, 0x4c, 0x6f, 0x99, 0x4e, 0xaf, - 0xab, 0x3b, 0xbb, 0xe8, 0x5f, 0x15, 0x28, 0xd0, 0x8b, 0x51, 0xd1, 0x37, 0x09, 0xd1, 0x5c, 0x9e, - 0xbf, 0x8f, 0x6d, 0xdf, 0x81, 0x87, 0xbe, 0x84, 0xf6, 0x51, 0x96, 0xb3, 0x8f, 0xd0, 0x07, 0x14, - 0xd9, 0x49, 0xaa, 0x5f, 0x28, 0xbb, 0x89, 0x35, 0x3a, 0x80, 0x48, 0xcf, 0x68, 0xbb, 0xfb, 0x36, - 0x76, 0x06, 0x06, 0x10, 0x89, 0xa4, 0xb2, 0x49, 0xff, 0xd2, 0x82, 0xdf, 0x91, 0x0e, 0x53, 0x2c, - 0xf1, 0xd0, 0x66, 0xd4, 0xe1, 0x88, 0x07, 0x67, 0xa1, 0xa0, 0xdb, 0xae, 0xe1, 0xb8, 0x6c, 0x7b, - 0x96, 0xbd, 0x79, 0xdd, 0x25, 0x7d, 0xda, 0xb2, 0xbb, 0x7e, 0xdc, 0xa7, 0x20, 0x01, 0xfd, 0x92, - 0xd4, 0xfc, 0x31, 0xbe, 0xe6, 0xc9, 0x20, 0x7f, 0x68, 0x84, 0x15, 0xee, 0xeb, 0xe1, 0x3a, 0xad, - 0xd4, 0xac, 0xb4, 0x68, 0x98, 0xa0, 0x20, 0x22, 0x50, 0x07, 0xbd, 0x5b, 0xe1, 0xd6, 0xef, 0x0e, - 0x84, 0x31, 0x82, 0x49, 0x31, 0x1c, 0x23, 0x82, 0x84, 0x98, 0xbd, 0x6e, 0x61, 0x09, 0x57, 0x91, - 0x5e, 0xc2, 0x45, 0x3f, 0x27, 0xbd, 0x17, 0x15, 0x88, 0x72, 0xc8, 0x1a, 0x60, 0xdc, 0xc5, 0x89, - 0x1f, 0x92, 0xda, 0x57, 0x1a, 0x56, 0xd2, 0x31, 0xc2, 0xf6, 0xe6, 0x29, 0x98, 0x5a, 0xd5, 0xbb, - 0x5d, 0x6c, 0x1f, 0x78, 0x43, 0x52, 0xd1, 0xe7, 0x70, 0x43, 0x37, 0x8d, 0x6d, 0xec, 0xb8, 0xf1, - 0x9d, 0xe5, 0x7b, 0xa5, 0x83, 0xf2, 0xb3, 0x32, 0x16, 0xfb, 0xe9, 0x47, 0xc8, 0xfc, 0x2e, 0xc8, - 0x19, 0xe6, 0xb6, 0xc5, 0xba, 0xcc, 0xfe, 0x35, 0x7f, 0xff, 0x67, 0x32, 0x75, 0x21, 0x19, 0x25, - 0xe3, 0xf2, 0x4b, 0x72, 0x91, 0x7e, 0xcf, 0xf9, 0x0b, 0x39, 0x98, 0xf7, 0x99, 0xa8, 0x9a, 0x1d, - 0xfc, 0x28, 0xbf, 0x14, 0xf3, 0x83, 0x39, 0xd9, 0x03, 0xb8, 0xfd, 0xf5, 0x21, 0xa4, 0x22, 0x44, - 0xda, 0x04, 0x68, 0xeb, 0x2e, 0xde, 0xb1, 0x6c, 0x23, 0xe8, 0x0f, 0x9f, 0x9e, 0x84, 0x5a, 0x99, - 0xfe, 0x7d, 0xa0, 0x71, 0x74, 0xd4, 0xfb, 0x61, 0x16, 0x07, 0x11, 0x4f, 0xfc, 0xa5, 0x9a, 0x58, - 0xbc, 0xf8, 0xfc, 0xe8, 0x0f, 0xa4, 0xce, 0xf9, 0xca, 0x54, 0x33, 0x19, 0x66, 0xad, 0xd1, 0xda, - 0xd0, 0x56, 0x6d, 0xa3, 0xa4, 0x35, 0xd6, 0x4a, 0xeb, 0xeb, 0xd5, 0xda, 0x6a, 0x10, 0x6a, 0x4b, - 0x85, 0x85, 0xe5, 0xfa, 0xa5, 0x1a, 0x17, 0x0b, 0x2d, 0x87, 0x36, 0x61, 0xda, 0x97, 0xd7, 0x20, - 0x4f, 0x4e, 0x5e, 0x66, 0xcc, 0x93, 0x93, 0x4b, 0xf2, 0x8c, 0x33, 0xa3, 0x1d, 0xb8, 0xf7, 0x90, - 0x67, 0xf4, 0x1b, 0x3a, 0xe4, 0xc9, 0x9a, 0x3a, 0x7a, 0x27, 0xd9, 0x44, 0xec, 0x75, 0xf5, 0x36, - 0x46, 0x7b, 0x09, 0xac, 0x71, 0xff, 0x96, 0xa8, 0xec, 0xa1, 0x5b, 0xa2, 0xc8, 0x23, 0xb3, 0xfa, - 0x4e, 0x0f, 0x5a, 0xc7, 0xd7, 0x68, 0x16, 0xf1, 0x48, 0x6c, 0xec, 0xee, 0x0a, 0x5d, 0xfe, 0x67, - 0x6c, 0x46, 0xa8, 0x64, 0x34, 0x4f, 0x69, 0x84, 0xff, 0x8d, 0xe3, 0x28, 0xfd, 0x16, 0xff, 0xf9, - 0x1c, 0xe4, 0x1b, 0xbd, 0xae, 0xe1, 0xa2, 0x1f, 0xcb, 0x8e, 0x05, 0x33, 0x7a, 0xb3, 0x97, 0x32, - 0xf4, 0x66, 0xaf, 0x70, 0xcf, 0x36, 0x27, 0xb1, 0x67, 0xdb, 0xc4, 0x8f, 0xba, 0xe2, 0x9e, 0xed, - 0x3d, 0x2c, 0x5c, 0x26, 0xdd, 0xf1, 0x7d, 0xc2, 0x00, 0x91, 0x92, 0x6a, 0x0d, 0x88, 0xc3, 0x7a, - 0xe1, 0xa9, 0x2c, 0x1c, 0x24, 0x40, 0x61, 0xa9, 0xde, 0x6c, 0xd6, 0x37, 0x8a, 0x27, 0x48, 0x1c, - 0xb1, 0xfa, 0x26, 0x0d, 0xce, 0x55, 0xad, 0xd5, 0x2a, 0x5a, 0x31, 0x4b, 0x02, 0x54, 0x56, 0x9b, - 0xeb, 0x95, 0xa2, 0x22, 0x5e, 0xf3, 0x12, 0x6b, 0x7e, 0x8b, 0x65, 0xa7, 0xa9, 0x5e, 0x72, 0x86, - 0x78, 0x34, 0x3f, 0xe9, 0x2b, 0xd7, 0x0f, 0x2b, 0x90, 0xdf, 0xc0, 0xf6, 0x0e, 0x46, 0xcf, 0x4f, - 0xb0, 0xc9, 0xb7, 0x6d, 0xd8, 0x0e, 0x0d, 0xe7, 0x19, 0x6e, 0xf2, 0xf1, 0x69, 0xea, 0xad, 0x30, - 0xef, 0xe0, 0xb6, 0x65, 0x76, 0xfc, 0x4c, 0xb4, 0x3f, 0x12, 0x13, 0xd1, 0xab, 0x13, 0x42, 0x46, - 0x18, 0x1d, 0xcb, 0x4e, 0x5d, 0x12, 0x60, 0x06, 0x95, 0x9a, 0x3e, 0x30, 0x5f, 0x51, 0xbc, 0x9f, - 0x7a, 0x07, 0xe8, 0xd5, 0xd2, 0xbb, 0xaf, 0x77, 0x42, 0xe1, 0xb2, 0x1f, 0xd1, 0x5f, 0x89, 0xec, - 0x8f, 0x59, 0x1e, 0x75, 0x09, 0x4e, 0x39, 0xb8, 0x8b, 0xdb, 0x2e, 0xee, 0x78, 0x4d, 0x57, 0x1b, - 0xda, 0x29, 0x1c, 0xce, 0x8e, 0x7e, 0x87, 0x07, 0xf0, 0x3e, 0x11, 0xc0, 0xdb, 0x06, 0x88, 0xd2, - 0xab, 0x50, 0xb4, 0xad, 0xec, 0x55, 0xa3, 0xd1, 0xb5, 0x82, 0x45, 0x71, 0xff, 0xdd, 0xfb, 0xb6, - 0xeb, 0xee, 0x75, 0xc9, 0x37, 0x76, 0x3c, 0xc1, 0x7f, 0x57, 0x17, 0x61, 0x4a, 0x37, 0x0f, 0xc8, - 0xa7, 0x5c, 0x4c, 0xad, 0xfd, 0x4c, 0xe8, 0xb5, 0x01, 0xf2, 0x0f, 0x08, 0xc8, 0x3f, 0x49, 0x8e, - 0xdd, 0xf4, 0x81, 0xff, 0xce, 0x29, 0xc8, 0x6f, 0xea, 0x8e, 0x8b, 0xd1, 0xff, 0xa3, 0xc8, 0x22, - 0x7f, 0x1b, 0x2c, 0x6c, 0x5b, 0xed, 0x7d, 0x07, 0x77, 0xc4, 0x46, 0xd9, 0x97, 0x3a, 0x0e, 0xcc, - 0xd5, 0x3b, 0xa0, 0xe8, 0x27, 0x32, 0xb2, 0xfe, 0x36, 0xfc, 0xa1, 0x74, 0x72, 0x69, 0x88, 0xb3, - 0xa9, 0xdb, 0x6e, 0x7d, 0x9b, 0xa4, 0x05, 0x97, 0x86, 0xf0, 0x89, 0x02, 0xf4, 0x85, 0x18, 0xe8, - 0xa7, 0xa2, 0xa1, 0x9f, 0x96, 0x80, 0x5e, 0x2d, 0xc1, 0xf4, 0xb6, 0xd1, 0xc5, 0xe4, 0x87, 0x19, - 0xf2, 0xc3, 0xa0, 0x31, 0x89, 0xc8, 0x3e, 0x18, 0x93, 0x56, 0x8c, 0x2e, 0xd6, 0x82, 0xdf, 0xfc, - 0x89, 0x0c, 0x84, 0x13, 0x99, 0x75, 0xea, 0x8d, 0xeb, 0x19, 0x5e, 0xa6, 0xbe, 0x87, 0xfd, 0xc5, - 0x37, 0x93, 0x1d, 0x8d, 0xe9, 0xe8, 0xae, 0x4e, 0xc0, 0x98, 0xd3, 0xc8, 0xb3, 0xe8, 0x17, 0xa2, - 0xf4, 0xfb, 0x85, 0xbc, 0x44, 0x49, 0xd6, 0x23, 0xfa, 0xcc, 0x46, 0xb4, 0xa8, 0xcb, 0x3e, 0x40, - 0xd4, 0x52, 0x0c, 0xde, 0x3d, 0x60, 0xda, 0xba, 0x8d, 0xdd, 0x4d, 0xde, 0x13, 0x23, 0xaf, 0x89, - 0x89, 0xc4, 0x11, 0xd0, 0x69, 0xe8, 0x7b, 0xf4, 0x52, 0x90, 0xb2, 0xf7, 0x8d, 0x39, 0x78, 0x1d, - 0x4a, 0x0f, 0xfb, 0xdf, 0xfc, 0xb8, 0xfb, 0xdf, 0x41, 0x75, 0x4c, 0xbf, 0x19, 0xbe, 0x3e, 0x07, - 0x4a, 0x79, 0xdf, 0x7d, 0x4c, 0x77, 0xbf, 0xff, 0x26, 0xed, 0xe7, 0xc2, 0xfa, 0xb3, 0x7d, 0xf7, - 0x78, 0x7b, 0xdf, 0x84, 0x5a, 0x22, 0xe7, 0x4f, 0x13, 0x55, 0xb7, 0xf4, 0x75, 0xe4, 0xe7, 0x95, - 0xc0, 0x3d, 0xf3, 0xc5, 0x99, 0xa3, 0x9b, 0xe6, 0x88, 0xf6, 0x4f, 0x5c, 0xcf, 0x10, 0xbc, 0xfb, - 0x1d, 0x4f, 0x4e, 0x88, 0x8e, 0x4a, 0xb6, 0xd7, 0x89, 0x28, 0xe7, 0x34, 0xfa, 0x82, 0x7e, 0x5c, - 0xda, 0x69, 0x9d, 0x8a, 0x2d, 0xd6, 0x95, 0x30, 0x99, 0x4d, 0x25, 0x77, 0x6f, 0x7a, 0x4c, 0xb1, - 0xe9, 0x03, 0xf6, 0x77, 0xbc, 0xab, 0x60, 0xe9, 0xc8, 0x88, 0xa1, 0xd7, 0x49, 0x6f, 0x47, 0xd1, - 0x6a, 0x0f, 0x59, 0x2f, 0x4c, 0x26, 0x6f, 0xb9, 0xcd, 0xaa, 0xd8, 0x82, 0x27, 0x70, 0xcb, 0x99, - 0x02, 0x05, 0xba, 0x05, 0x89, 0xde, 0x2a, 0xdd, 0x44, 0xbc, 0xde, 0x48, 0x74, 0x21, 0x0c, 0xde, - 0x93, 0xac, 0x39, 0x08, 0xae, 0x86, 0xb9, 0x44, 0xae, 0x86, 0xe2, 0x29, 0x50, 0x89, 0x76, 0x44, - 0xeb, 0x98, 0xf2, 0x74, 0x32, 0x49, 0x0b, 0x1b, 0xc8, 0x50, 0xfa, 0x78, 0x7f, 0x77, 0x1e, 0xe6, - 0x68, 0xd1, 0xd4, 0xc7, 0x19, 0xbd, 0x3b, 0xfb, 0x1f, 0x07, 0x75, 0xb5, 0x06, 0x73, 0xd7, 0x08, - 0xdb, 0xf4, 0xf6, 0x32, 0xb6, 0x72, 0x71, 0x47, 0xec, 0xba, 0x07, 0xad, 0xa7, 0x7f, 0xdf, 0x99, - 0xf0, 0xbf, 0x27, 0x63, 0xba, 0xe0, 0x4f, 0x1d, 0xb8, 0x0a, 0xc4, 0xc8, 0xe2, 0x93, 0xd4, 0xb3, - 0x50, 0xb8, 0x6a, 0xe0, 0x6b, 0xd5, 0x0e, 0xb3, 0x6e, 0xd9, 0x1b, 0xfa, 0x65, 0xe9, 0x7d, 0x5b, - 0x1e, 0x6e, 0xc6, 0x4b, 0xba, 0x5a, 0x28, 0xb7, 0x7b, 0x3b, 0x94, 0xad, 0x09, 0x9c, 0x48, 0x16, - 0xef, 0x25, 0x2f, 0x27, 0x50, 0xc4, 0x28, 0xc3, 0x59, 0x0c, 0x04, 0x12, 0x7b, 0xde, 0x85, 0x0a, - 0x60, 0xcc, 0x57, 0x96, 0xcb, 0x45, 0xa7, 0x18, 0x52, 0x74, 0xfa, 0x92, 0x7f, 0xa3, 0x02, 0x33, - 0x0d, 0xec, 0xae, 0x18, 0xb8, 0xdb, 0x71, 0x90, 0x7d, 0x74, 0xd3, 0xe8, 0x2e, 0x28, 0x6c, 0x13, - 0x62, 0xc3, 0xce, 0x2d, 0xb0, 0x6c, 0xe8, 0xf5, 0x59, 0xd9, 0x1d, 0x61, 0xb6, 0xfa, 0xe6, 0x73, - 0x3b, 0x16, 0x98, 0xe4, 0x3c, 0x7a, 0xe3, 0x4b, 0x9e, 0x40, 0x28, 0x71, 0x05, 0xe6, 0xd8, 0x45, - 0xc6, 0xa5, 0xae, 0xb1, 0x63, 0xf2, 0xf7, 0x02, 0x8e, 0xdc, 0x42, 0xd4, 0xa7, 0x40, 0x5e, 0xf7, - 0xa8, 0xb1, 0xad, 0x57, 0x34, 0xb0, 0xf3, 0x24, 0xe5, 0x69, 0x34, 0x63, 0x82, 0xc0, 0xbd, 0xa1, - 0x62, 0xfb, 0x3c, 0x4f, 0x30, 0x70, 0xef, 0xd0, 0xc2, 0xd3, 0x47, 0xec, 0x8b, 0x0a, 0x9c, 0x66, - 0x0c, 0x5c, 0xc4, 0xb6, 0x6b, 0xb4, 0xf5, 0x2e, 0x45, 0xee, 0xe5, 0x99, 0x71, 0x40, 0xb7, 0x06, - 0xf3, 0x57, 0x79, 0xb2, 0x0c, 0xc2, 0x0b, 0x03, 0x21, 0x14, 0x18, 0xd0, 0xc4, 0x1f, 0x13, 0x04, - 0x40, 0x15, 0xa4, 0x2a, 0xd0, 0x9c, 0x60, 0x00, 0x54, 0x69, 0x26, 0xd2, 0x87, 0xf8, 0x55, 0x2c, - 0xb0, 0x4f, 0xd8, 0x7d, 0xfe, 0xa1, 0x34, 0xb6, 0x5b, 0x30, 0x4b, 0xb0, 0xa4, 0x3f, 0xb2, 0x65, - 0x88, 0x18, 0x25, 0x0e, 0xfa, 0x1d, 0x76, 0x45, 0x63, 0xf0, 0xaf, 0xc6, 0xd3, 0x41, 0x97, 0x00, - 0xc2, 0x4f, 0x7c, 0x27, 0x9d, 0x89, 0xea, 0xa4, 0xb3, 0x72, 0x9d, 0xf4, 0x5b, 0xa4, 0x43, 0xad, - 0x0c, 0x66, 0xfb, 0xe8, 0xea, 0x21, 0x17, 0x64, 0x63, 0x78, 0xe9, 0xe9, 0xeb, 0xc5, 0x6b, 0x99, - 0x5e, 0x2c, 0xef, 0xf7, 0xba, 0x46, 0xdb, 0x9b, 0x4f, 0x7d, 0x74, 0x2c, 0xf3, 0x29, 0xbe, 0x3f, - 0x50, 0xfa, 0xfa, 0x83, 0x23, 0x58, 0xd2, 0xb7, 0xc3, 0x49, 0x5a, 0x44, 0x39, 0x60, 0x2b, 0x4f, - 0x03, 0x49, 0xf4, 0x25, 0x8b, 0x51, 0x0d, 0x25, 0x95, 0x20, 0x10, 0xc2, 0x08, 0x4b, 0x9f, 0xc9, - 0x8c, 0xdd, 0xa4, 0x0a, 0x12, 0xc5, 0xd9, 0x04, 0xdc, 0x42, 0x73, 0xd4, 0xda, 0xdd, 0x22, 0xb7, - 0x68, 0xa2, 0xcf, 0xe5, 0xc6, 0x31, 0x22, 0x3c, 0x07, 0x72, 0xc4, 0xc5, 0x5d, 0x89, 0x5c, 0xd2, - 0x08, 0x8b, 0x0c, 0xaf, 0x38, 0xc5, 0x8f, 0xba, 0x6b, 0x27, 0x34, 0xf2, 0xa7, 0x7a, 0x07, 0x9c, - 0xbc, 0xac, 0xb7, 0xaf, 0xec, 0xd8, 0xd6, 0x3e, 0xb9, 0x6f, 0xd0, 0x62, 0x17, 0x17, 0x92, 0x0b, - 0x60, 0xc5, 0x0f, 0xea, 0xdd, 0xbe, 0xe9, 0x90, 0x1f, 0x66, 0x3a, 0xac, 0x9d, 0x60, 0xc6, 0x83, - 0xfa, 0xd4, 0xa0, 0xd3, 0x29, 0xc4, 0x76, 0x3a, 0x6b, 0x27, 0xfc, 0x6e, 0x47, 0x5d, 0x86, 0xe9, - 0x8e, 0x71, 0x95, 0x6c, 0x55, 0x93, 0x59, 0xd7, 0xb0, 0x83, 0xcf, 0xcb, 0xc6, 0x55, 0xba, 0xb1, - 0xbd, 0x76, 0x42, 0x0b, 0xfe, 0x54, 0x57, 0x61, 0x86, 0x6c, 0x0b, 0x10, 0x32, 0xd3, 0x89, 0x0e, - 0x35, 0xaf, 0x9d, 0xd0, 0xc2, 0x7f, 0x3d, 0xeb, 0x23, 0x47, 0xce, 0x7e, 0x3c, 0xe0, 0x6f, 0xb7, - 0x67, 0x12, 0x6d, 0xb7, 0x7b, 0xb2, 0xa0, 0x1b, 0xee, 0x67, 0x21, 0xdf, 0x26, 0x12, 0xce, 0x32, - 0x09, 0xd3, 0x57, 0xf5, 0x3e, 0xc8, 0xed, 0xe9, 0xb6, 0x3f, 0x79, 0xbe, 0x6d, 0x38, 0xdd, 0x0d, - 0xdd, 0xbe, 0xe2, 0x21, 0xe8, 0xfd, 0xb5, 0x34, 0x05, 0x79, 0x22, 0xb8, 0xe0, 0x01, 0xfd, 0x7c, - 0x8e, 0x9a, 0x21, 0x65, 0xcb, 0xf4, 0x86, 0xfd, 0xa6, 0xe5, 0x1f, 0x90, 0xf9, 0xe5, 0xcc, 0x78, - 0x2c, 0xc8, 0xeb, 0xb8, 0x70, 0xc3, 0xa6, 0xf1, 0xfc, 0x7d, 0xfc, 0x10, 0x3e, 0x60, 0x4b, 0xa2, - 0x83, 0x3e, 0xa9, 0xe7, 0x01, 0x5c, 0xe6, 0x2d, 0x1c, 0x04, 0x52, 0xe2, 0x52, 0xc2, 0xe5, 0x83, - 0xfc, 0x70, 0x47, 0x95, 0xdf, 0x19, 0xc1, 0x74, 0xe9, 0x17, 0x44, 0xf4, 0x0c, 0xbc, 0x6b, 0x98, - 0x5c, 0x9d, 0xfd, 0xd7, 0x84, 0x9d, 0x52, 0x52, 0xa3, 0x66, 0x08, 0x7b, 0xe9, 0xf7, 0x4d, 0x3f, - 0x9b, 0xa3, 0x11, 0x57, 0xe9, 0x29, 0x0c, 0xf1, 0x86, 0x5f, 0xf4, 0xa9, 0xb1, 0x28, 0xcd, 0x80, - 0x01, 0x47, 0x19, 0x38, 0xe0, 0x1c, 0x3a, 0xa4, 0x9c, 0x1b, 0x72, 0x48, 0x39, 0x9f, 0x6c, 0xe5, - 0xf0, 0xc3, 0xbc, 0xfe, 0x6c, 0x8a, 0xfa, 0x73, 0x6f, 0x04, 0x40, 0x83, 0xe4, 0x32, 0x16, 0xfb, - 0xe6, 0x9d, 0x81, 0xa6, 0x34, 0x04, 0x4d, 0x79, 0x60, 0x74, 0x46, 0xd2, 0xd7, 0x96, 0x0f, 0xe6, - 0xe0, 0xba, 0x90, 0x99, 0x1a, 0xbe, 0xc6, 0x14, 0xe5, 0xf7, 0xc7, 0xa2, 0x28, 0xc9, 0x63, 0x20, - 0xa4, 0xad, 0x31, 0xbf, 0x29, 0x7d, 0x76, 0xa8, 0x1f, 0xa8, 0x40, 0x36, 0xd1, 0x77, 0xe4, 0xd3, - 0x1e, 0xc6, 0xbf, 0x23, 0x9f, 0xbe, 0x25, 0xec, 0x6e, 0xe4, 0x4e, 0x1c, 0xc9, 0xf2, 0x36, 0x01, - 0xfd, 0x61, 0xeb, 0x1a, 0xcd, 0x7d, 0xdb, 0xac, 0x9a, 0xae, 0x85, 0xbe, 0x63, 0x2c, 0x8a, 0x13, - 0x78, 0xc3, 0x29, 0xa3, 0x78, 0xc3, 0x8d, 0xb4, 0xca, 0xe1, 0xd7, 0xe0, 0x58, 0x56, 0x39, 0x22, - 0x0a, 0x4f, 0x1f, 0xbf, 0x77, 0x28, 0x70, 0x96, 0x4d, 0xb6, 0x96, 0x44, 0x0b, 0x11, 0x3d, 0x3c, - 0x0e, 0x20, 0x4f, 0xfb, 0x66, 0x12, 0xbb, 0x57, 0x92, 0xbc, 0x88, 0x27, 0xa5, 0x62, 0x6f, 0xd4, - 0x11, 0xa6, 0x83, 0x7d, 0x1c, 0x8e, 0x05, 0x29, 0xb9, 0x8b, 0x74, 0x12, 0xb0, 0x91, 0x3e, 0x66, - 0xaf, 0x54, 0xa0, 0x40, 0xcf, 0x69, 0xa1, 0xad, 0x54, 0x1c, 0x26, 0xc4, 0x18, 0xd1, 0x12, 0x3b, - 0x72, 0x94, 0x9b, 0xd4, 0xce, 0xb0, 0x25, 0xd9, 0x8b, 0x1b, 0xc8, 0xca, 0x04, 0x5c, 0x08, 0xb3, - 0x30, 0xdb, 0xc0, 0x6e, 0x59, 0xb7, 0x6d, 0x43, 0xdf, 0x19, 0x97, 0xc7, 0xb7, 0xac, 0xf7, 0x30, - 0xfa, 0x6a, 0x46, 0xf6, 0x3c, 0x4d, 0xb0, 0x10, 0xee, 0xb3, 0x1a, 0x11, 0x89, 0xf0, 0x4d, 0x52, - 0x67, 0x66, 0x86, 0x51, 0x9b, 0x80, 0xc7, 0x76, 0x16, 0xa6, 0xfc, 0xb3, 0x78, 0x77, 0x09, 0xe7, - 0x33, 0x77, 0xdd, 0x3d, 0xff, 0x18, 0x0c, 0x79, 0x3e, 0x7c, 0x06, 0x0c, 0xbd, 0x26, 0xa1, 0xa3, - 0x7c, 0xfc, 0x41, 0xc2, 0x64, 0x6d, 0x2c, 0x89, 0x3b, 0xfc, 0x71, 0x1d, 0x1d, 0xfc, 0xc5, 0x29, - 0xb6, 0x1c, 0xb9, 0xae, 0xbb, 0xf8, 0x51, 0xf4, 0x87, 0x0a, 0x4c, 0x35, 0xb0, 0xeb, 0x8d, 0xb7, - 0xc2, 0x75, 0xd2, 0xa3, 0x6a, 0xb8, 0xca, 0xad, 0x78, 0xcc, 0xb0, 0x35, 0x8c, 0x07, 0x61, 0xa6, - 0x67, 0x5b, 0x6d, 0xec, 0x38, 0x6c, 0xf5, 0x82, 0x77, 0x54, 0x1b, 0x34, 0xfa, 0x13, 0xd6, 0x16, - 0x37, 0xfd, 0x7f, 0xb4, 0xf0, 0xf7, 0xa4, 0x66, 0x00, 0xa5, 0xc4, 0x2a, 0x38, 0x69, 0x33, 0x20, - 0xae, 0xf0, 0xf4, 0x81, 0xfe, 0x5d, 0x05, 0xe6, 0x1a, 0xd8, 0x0d, 0xa4, 0x98, 0x60, 0x93, 0x23, - 0x1a, 0x5e, 0x01, 0x4a, 0xe5, 0x68, 0x50, 0xca, 0x5f, 0xc6, 0x2a, 0x4a, 0x33, 0x20, 0x36, 0xc1, - 0xcb, 0x58, 0xe5, 0x38, 0x98, 0xc0, 0xf1, 0xb5, 0x27, 0xc0, 0x0c, 0xe1, 0x85, 0x34, 0xd8, 0xef, - 0xcd, 0x85, 0x8d, 0xf7, 0xb3, 0x29, 0x35, 0xde, 0xfb, 0x21, 0xbf, 0xa7, 0xdb, 0x57, 0x1c, 0xd2, - 0x70, 0x67, 0x65, 0xcc, 0xf6, 0x0d, 0x2f, 0xbb, 0x46, 0xff, 0x1a, 0xec, 0xa7, 0x99, 0x4f, 0xe6, - 0xa7, 0xf9, 0xa6, 0x6c, 0xa2, 0x91, 0x90, 0xce, 0x1d, 0xc6, 0xd8, 0xe4, 0x13, 0x8c, 0x9b, 0x31, - 0x65, 0xa7, 0xaf, 0x1c, 0x2f, 0x57, 0x60, 0xda, 0x1b, 0xb7, 0x89, 0x3d, 0x7e, 0xe9, 0xe8, 0xea, - 0x30, 0xd8, 0xd0, 0x4f, 0xd8, 0x03, 0xfb, 0x12, 0x19, 0x9f, 0x79, 0x9f, 0xa0, 0x07, 0x8e, 0x2b, - 0x3c, 0x7d, 0x3c, 0xde, 0x45, 0xf1, 0x20, 0xed, 0x01, 0xfd, 0xb4, 0x02, 0xca, 0x2a, 0x76, 0x27, - 0x6d, 0x45, 0xbe, 0x5d, 0x3a, 0xc4, 0x91, 0x20, 0x30, 0xc2, 0xf3, 0xe2, 0x2a, 0x1e, 0x4f, 0x03, - 0x92, 0x8b, 0x6d, 0x24, 0xc5, 0x40, 0xfa, 0xa8, 0xbd, 0x8f, 0xa2, 0x46, 0x37, 0x17, 0xbe, 0x7d, - 0x0c, 0xbd, 0xea, 0x64, 0x17, 0x3e, 0x7c, 0x01, 0x12, 0x1a, 0xc7, 0xd5, 0xde, 0x06, 0x15, 0x3e, - 0x91, 0xcb, 0x4f, 0xc1, 0x6b, 0xec, 0xbb, 0xb8, 0x7d, 0x05, 0x77, 0xf8, 0xcb, 0xe4, 0x46, 0x85, - 0xee, 0x1c, 0x4c, 0xb5, 0x29, 0x35, 0x02, 0xde, 0xb4, 0xe6, 0xbf, 0x26, 0xb8, 0xc9, 0x5f, 0xec, - 0x88, 0xe8, 0xef, 0x13, 0xbc, 0xc9, 0x5f, 0xa2, 0xf8, 0x09, 0x98, 0x2d, 0x74, 0x96, 0x51, 0x6d, - 0x5b, 0x26, 0xfa, 0xaf, 0x47, 0x87, 0xe5, 0x26, 0x98, 0x31, 0xda, 0x96, 0x49, 0xc2, 0x50, 0xf8, - 0x87, 0x80, 0x82, 0x04, 0xff, 0x6b, 0x65, 0xcf, 0x7a, 0xc4, 0x60, 0xbb, 0xe6, 0x61, 0xc2, 0xa8, - 0xc6, 0x84, 0xc7, 0xfa, 0x71, 0x19, 0x13, 0x03, 0xca, 0x4e, 0x1f, 0xb2, 0x8f, 0x85, 0xde, 0x6d, - 0xb4, 0x2b, 0x7c, 0x4c, 0xac, 0x02, 0x8f, 0x32, 0x9c, 0xf1, 0xb5, 0x38, 0x96, 0xe1, 0x2c, 0x86, - 0x81, 0x09, 0xdc, 0x86, 0x12, 0xe2, 0x98, 0xfa, 0x1a, 0xf0, 0x11, 0xd0, 0x19, 0x9f, 0x79, 0x38, - 0x22, 0x3a, 0xc7, 0x63, 0x22, 0x7e, 0x88, 0x85, 0xc8, 0x64, 0x16, 0x0f, 0xfa, 0x6f, 0xe3, 0x00, - 0xe7, 0xde, 0x51, 0xfc, 0x15, 0xa8, 0xb7, 0x02, 0x7a, 0x5b, 0x56, 0x36, 0x04, 0xca, 0x21, 0x09, - 0x7a, 0x54, 0xc6, 0x82, 0xe0, 0x5b, 0xa4, 0x62, 0x93, 0xc8, 0x94, 0x9f, 0x3e, 0x80, 0x2f, 0x53, - 0x60, 0x81, 0xf8, 0x08, 0x74, 0xb1, 0x6e, 0xd3, 0x8e, 0x72, 0x2c, 0x8e, 0xf2, 0xef, 0x92, 0x0e, - 0xf0, 0x23, 0xca, 0x21, 0xe4, 0x63, 0x2c, 0x50, 0xc8, 0x45, 0xf7, 0x91, 0x64, 0x61, 0x22, 0xdb, - 0x28, 0xc5, 0x80, 0x05, 0xa6, 0xe2, 0xe3, 0xc1, 0x23, 0xa1, 0x47, 0xae, 0x28, 0x0c, 0xbf, 0xb1, - 0x4d, 0xd8, 0x23, 0x57, 0x86, 0x89, 0xf4, 0x31, 0xf9, 0xe9, 0xa7, 0xb0, 0x05, 0xe7, 0xa6, 0x7e, - 0xb9, 0x8b, 0xd1, 0xeb, 0x72, 0xc1, 0x89, 0xb6, 0xdf, 0x1d, 0x8b, 0x07, 0xe6, 0x11, 0x02, 0xe2, - 0xab, 0x90, 0xb3, 0xad, 0x6b, 0x74, 0x69, 0x6b, 0x5e, 0x23, 0xcf, 0xf4, 0x72, 0xcb, 0xee, 0xfe, - 0x9e, 0x49, 0x4f, 0x86, 0xce, 0x6b, 0xfe, 0xab, 0x7a, 0x2b, 0xcc, 0x5f, 0x33, 0xdc, 0xdd, 0x35, - 0xac, 0x77, 0xb0, 0xad, 0x59, 0xd7, 0x88, 0xc7, 0xdc, 0xb4, 0x26, 0x26, 0x8a, 0xfe, 0x2b, 0x12, - 0xf6, 0xa5, 0x27, 0x94, 0xc9, 0x1c, 0x7f, 0x4b, 0x62, 0x79, 0x46, 0x73, 0x95, 0xbe, 0xc2, 0xbc, - 0x5f, 0x81, 0x19, 0xcd, 0xba, 0xc6, 0x94, 0xe4, 0xff, 0x3c, 0x5e, 0x1d, 0x49, 0x3c, 0xd1, 0x23, - 0x92, 0x0b, 0xd8, 0x9f, 0xf8, 0x44, 0x2f, 0xb6, 0xf8, 0x89, 0x9c, 0x5c, 0x9a, 0xd3, 0xac, 0x6b, - 0x0d, 0xec, 0xd2, 0x16, 0x81, 0x5a, 0x63, 0x72, 0xb2, 0x36, 0x1c, 0x4a, 0x90, 0xcd, 0xc3, 0x83, - 0xf7, 0xa4, 0xbb, 0x08, 0x81, 0x80, 0x02, 0x16, 0x27, 0xbd, 0x8b, 0x30, 0x94, 0x83, 0x09, 0xc4, - 0x48, 0x51, 0x60, 0x56, 0xb3, 0xae, 0x79, 0x43, 0xc3, 0x8a, 0xd1, 0xed, 0x8e, 0x67, 0x84, 0x4c, - 0x6a, 0xfc, 0xfb, 0x62, 0xf0, 0xb9, 0x98, 0xb8, 0xf1, 0x3f, 0x84, 0x81, 0xf4, 0x61, 0x78, 0x09, - 0x6d, 0x2c, 0xfe, 0x08, 0x6d, 0x8e, 0x07, 0x87, 0x51, 0x1b, 0x44, 0xc0, 0xc6, 0xb1, 0x35, 0x88, - 0x28, 0x0e, 0x26, 0xb2, 0x73, 0xb2, 0x50, 0x26, 0xc3, 0xfc, 0x78, 0xdb, 0xc4, 0x7b, 0x92, 0xb9, - 0x26, 0xb2, 0x61, 0x57, 0x60, 0x64, 0x2c, 0x68, 0x24, 0x70, 0x41, 0x94, 0xe0, 0x21, 0x7d, 0x3c, - 0x7e, 0x45, 0x81, 0x39, 0xca, 0xc2, 0x63, 0xc4, 0x0a, 0x18, 0xa9, 0x51, 0xf1, 0x35, 0x38, 0x9e, - 0x46, 0x15, 0xc3, 0xc1, 0x44, 0xee, 0x14, 0xf5, 0xec, 0xb8, 0x11, 0x8e, 0x8f, 0x47, 0x21, 0x38, - 0xb2, 0x31, 0x36, 0xc6, 0x23, 0xe4, 0xa3, 0x18, 0x63, 0xc7, 0x74, 0x8c, 0xfc, 0x25, 0x41, 0x2b, - 0x1a, 0x27, 0x06, 0x47, 0x68, 0x0a, 0x63, 0x84, 0x61, 0xc4, 0xa6, 0x70, 0x4c, 0x48, 0x7c, 0x49, - 0x01, 0xa0, 0x0c, 0x6c, 0x58, 0x57, 0xc9, 0x65, 0x3e, 0x63, 0xe8, 0xce, 0xfa, 0xdd, 0xea, 0x95, - 0x21, 0x6e, 0xf5, 0x09, 0x43, 0xb8, 0x24, 0x5d, 0x09, 0xe4, 0xa4, 0xec, 0x55, 0x72, 0xe2, 0x2b, - 0x81, 0xf1, 0xe5, 0xa7, 0x8f, 0xf1, 0x17, 0xa8, 0x35, 0x17, 0x1e, 0x30, 0xfd, 0xd1, 0xb1, 0xa0, - 0xcc, 0xcd, 0xfe, 0x15, 0x71, 0xf6, 0x7f, 0x04, 0x6c, 0x47, 0xb5, 0x11, 0x87, 0x1d, 0x1c, 0x4d, - 0xdf, 0x46, 0x3c, 0xbe, 0x03, 0xa2, 0xdf, 0x9e, 0x83, 0x93, 0xac, 0x13, 0xf9, 0x8f, 0x00, 0x71, - 0xc2, 0x73, 0x78, 0x42, 0x27, 0x39, 0x04, 0xe5, 0x71, 0x2d, 0x48, 0x25, 0x59, 0xca, 0x94, 0x60, - 0x6f, 0x22, 0xab, 0x1b, 0x85, 0xca, 0xa3, 0x3d, 0xdd, 0xec, 0xc8, 0x87, 0xfb, 0x1d, 0x02, 0xbc, - 0xbf, 0xd6, 0xa8, 0x88, 0x6b, 0x8d, 0x03, 0x56, 0x26, 0x13, 0xef, 0x5c, 0x13, 0x91, 0x51, 0x76, - 0x27, 0xbe, 0x73, 0x1d, 0x5d, 0x76, 0xfa, 0x28, 0xbd, 0x47, 0x81, 0x5c, 0xc3, 0xb2, 0x5d, 0xf4, - 0xd2, 0x24, 0xad, 0x93, 0x4a, 0x3e, 0x04, 0xc9, 0x7f, 0x57, 0xcb, 0xc2, 0x1d, 0xcf, 0x77, 0xc5, - 0x1f, 0x75, 0xd6, 0x5d, 0x9d, 0x78, 0x75, 0x7b, 0xe5, 0x73, 0x97, 0x3d, 0x27, 0x8d, 0xa7, 0x43, - 0xe5, 0xd7, 0x88, 0x3e, 0x80, 0x91, 0x5a, 0x3c, 0x9d, 0xc8, 0x92, 0xd3, 0xc7, 0xed, 0x0d, 0x27, - 0x99, 0x6f, 0xeb, 0x8a, 0xd1, 0xc5, 0xe8, 0xa5, 0xd4, 0x65, 0xa4, 0xa6, 0xef, 0x61, 0xf9, 0x23, - 0x31, 0xb1, 0xae, 0xad, 0x24, 0xbe, 0xac, 0x12, 0xc6, 0x97, 0x4d, 0xda, 0xa0, 0xe8, 0x01, 0x74, - 0xca, 0xd2, 0xa4, 0x1b, 0x54, 0x4c, 0xd9, 0x13, 0x89, 0xd3, 0x79, 0xaa, 0x81, 0x5d, 0x6a, 0x54, - 0xd6, 0xfd, 0x1b, 0x58, 0xbe, 0x75, 0x2c, 0x11, 0x3b, 0x83, 0x0b, 0x5e, 0x94, 0xbe, 0x0b, 0x5e, - 0xde, 0xcf, 0x83, 0xb3, 0x21, 0x82, 0xf3, 0xcd, 0xd1, 0x02, 0x12, 0x99, 0x1c, 0x0b, 0x4c, 0x6f, - 0x0f, 0x60, 0xda, 0x14, 0x60, 0xba, 0x6f, 0x44, 0x2e, 0xd2, 0x07, 0xec, 0xfb, 0xf3, 0x70, 0x92, - 0x4e, 0xfa, 0x4b, 0x66, 0x87, 0x45, 0x58, 0x7d, 0x6b, 0xf6, 0x98, 0x37, 0xdb, 0x0e, 0x87, 0x60, - 0x15, 0x62, 0x39, 0xe7, 0xfb, 0xef, 0xd6, 0x5f, 0xa2, 0xe1, 0x5c, 0xbd, 0x4e, 0x94, 0xec, 0xb4, - 0xc9, 0xdf, 0xaf, 0x1f, 0xfc, 0x27, 0xde, 0x65, 0x34, 0x25, 0x7f, 0x97, 0xd1, 0x6f, 0x27, 0x5b, - 0xb7, 0x23, 0x45, 0xf7, 0x09, 0x3c, 0x65, 0xdb, 0x29, 0xc1, 0x8a, 0x9e, 0x04, 0x77, 0x5f, 0x1f, - 0xee, 0x64, 0x61, 0x04, 0x91, 0x11, 0xdd, 0xc9, 0x08, 0x81, 0xe3, 0x74, 0x27, 0x1b, 0xc6, 0xc0, - 0x04, 0x6e, 0xb5, 0xcf, 0xb3, 0xdd, 0x7c, 0xd2, 0x6e, 0xd0, 0x1f, 0x67, 0x53, 0x1f, 0xa5, 0xbf, - 0x96, 0x49, 0xe4, 0xff, 0x4c, 0xf8, 0x8a, 0x1f, 0xa6, 0x93, 0x78, 0x34, 0xc7, 0x91, 0x9b, 0xc0, - 0xba, 0x51, 0x96, 0xf8, 0xa2, 0x5f, 0x32, 0x3a, 0xee, 0xee, 0x98, 0x4e, 0x74, 0x5c, 0xf3, 0x68, - 0xf9, 0xd7, 0x23, 0x93, 0x17, 0xf4, 0x3f, 0x33, 0x89, 0x42, 0x48, 0x05, 0x22, 0x21, 0x6c, 0x45, - 0x88, 0x38, 0x41, 0xe0, 0xa7, 0x58, 0x7a, 0x13, 0xd4, 0xe8, 0x8b, 0x46, 0x07, 0x5b, 0x8f, 0x41, - 0x8d, 0x26, 0x7c, 0x8d, 0x4f, 0xa3, 0xe3, 0xc8, 0x7d, 0x9d, 0x6a, 0x74, 0x20, 0x92, 0x31, 0x69, - 0x74, 0x2c, 0xbd, 0xf4, 0x65, 0xfc, 0x9a, 0x39, 0x36, 0x91, 0x5a, 0x37, 0xcc, 0x2b, 0xe8, 0x9f, - 0x0a, 0xfe, 0xc5, 0xcc, 0x97, 0x0c, 0x77, 0x97, 0xc5, 0x82, 0xf9, 0xa0, 0xf4, 0xdd, 0x28, 0x23, - 0xc4, 0x7b, 0x11, 0xc3, 0x49, 0xe5, 0x0f, 0x85, 0x93, 0x2a, 0xc1, 0xbc, 0x61, 0xba, 0xd8, 0x36, - 0xf5, 0xee, 0x4a, 0x57, 0xdf, 0x71, 0xce, 0x4d, 0x0d, 0xbc, 0xbc, 0xae, 0xca, 0xe5, 0xd1, 0xc4, - 0x3f, 0xf8, 0xeb, 0x2b, 0xa7, 0xc5, 0xeb, 0x2b, 0x23, 0xa2, 0x5f, 0xcd, 0x44, 0x47, 0xbf, 0x0a, - 0xa2, 0x5b, 0xc1, 0xf0, 0xe0, 0xd8, 0xb2, 0xb6, 0x71, 0xc2, 0x70, 0x7f, 0x77, 0x49, 0x46, 0x61, - 0x0b, 0x42, 0x3f, 0xfe, 0xa4, 0x92, 0x68, 0x75, 0xcf, 0x53, 0x84, 0xc5, 0x7e, 0x25, 0x48, 0x6c, - 0xa1, 0xf2, 0x95, 0x57, 0xfa, 0x2a, 0x1f, 0x98, 0x3c, 0x39, 0x09, 0x93, 0x87, 0x57, 0xaa, 0xbc, - 0x9c, 0x52, 0x25, 0x59, 0x2c, 0x94, 0xa9, 0xed, 0x04, 0x4e, 0x23, 0xe5, 0xe1, 0x94, 0x1f, 0xed, - 0xb6, 0xd7, 0xc3, 0xba, 0xad, 0x9b, 0x6d, 0x8c, 0x3e, 0x96, 0x1d, 0x87, 0xd9, 0xbb, 0x02, 0xd3, - 0x46, 0xdb, 0x32, 0x1b, 0xc6, 0x0b, 0xfc, 0xcb, 0xe5, 0xe2, 0x83, 0xac, 0x13, 0x89, 0x54, 0xd9, - 0x1f, 0x5a, 0xf0, 0xaf, 0x5a, 0x85, 0x99, 0xb6, 0x6e, 0x77, 0x68, 0x10, 0xbe, 0x7c, 0xdf, 0x45, - 0x4e, 0x91, 0x84, 0xca, 0xfe, 0x2f, 0x5a, 0xf8, 0xb7, 0x5a, 0x17, 0x85, 0x58, 0xe8, 0x8b, 0xe6, - 0x11, 0x49, 0x6c, 0x39, 0xfc, 0x49, 0x90, 0xb9, 0x27, 0x1d, 0x1b, 0x77, 0xc9, 0x1d, 0xf4, 0xb4, - 0x87, 0x98, 0xd1, 0xc2, 0x84, 0xa4, 0xcb, 0x03, 0xa4, 0xa8, 0x43, 0x68, 0x4c, 0x7a, 0x79, 0x40, - 0x8a, 0x8b, 0xf4, 0x35, 0xf3, 0x9d, 0x05, 0x98, 0xa7, 0xbd, 0x1a, 0x13, 0x27, 0x7a, 0x19, 0xb9, - 0x42, 0xda, 0x7d, 0x08, 0x1f, 0xa0, 0xc6, 0xd1, 0xc7, 0xe4, 0x22, 0x28, 0x57, 0x82, 0x80, 0x83, - 0xde, 0x63, 0xd2, 0x7d, 0x7b, 0x9f, 0xaf, 0x45, 0xca, 0xd3, 0xa4, 0xf7, 0xed, 0xe3, 0x8b, 0x4f, - 0x1f, 0x9f, 0x1f, 0x50, 0x40, 0x29, 0x75, 0x3a, 0xa8, 0x7d, 0x74, 0x28, 0x6e, 0x81, 0x59, 0xbf, - 0xcd, 0x84, 0x31, 0x20, 0xf9, 0xa4, 0xa4, 0x8b, 0xa0, 0x81, 0x6c, 0x4a, 0x9d, 0x89, 0xef, 0x2a, - 0xc4, 0x94, 0x9d, 0x3e, 0x28, 0x9f, 0x9d, 0x62, 0x8d, 0x66, 0xc9, 0xb2, 0xae, 0x90, 0xa3, 0x32, - 0x3f, 0xa3, 0x40, 0x7e, 0x05, 0xbb, 0xed, 0x5d, 0xe4, 0x8c, 0xa5, 0xcd, 0xec, 0xdb, 0x5d, 0xbf, - 0xcd, 0xec, 0xdb, 0xdd, 0x61, 0x41, 0x39, 0x93, 0x46, 0x7f, 0xf6, 0xd9, 0x5e, 0x24, 0x2c, 0x4f, - 0x3a, 0xfa, 0x73, 0x6c, 0xe9, 0x13, 0x38, 0x04, 0x97, 0x83, 0x85, 0x60, 0x05, 0x8c, 0x62, 0xf6, - 0x0b, 0x99, 0xc7, 0xdc, 0x7a, 0xe8, 0x10, 0xbb, 0x19, 0xfd, 0x7e, 0xb2, 0x10, 0x6b, 0x81, 0xcc, - 0xc5, 0x9a, 0xa7, 0xbc, 0x30, 0x99, 0x20, 0xf8, 0x9a, 0x1c, 0x83, 0x13, 0x58, 0x01, 0x50, 0x60, - 0x9a, 0x30, 0xb4, 0x6c, 0x5c, 0x25, 0xae, 0x87, 0xc2, 0x42, 0xe5, 0x0b, 0xc7, 0xb2, 0x50, 0x79, - 0x9f, 0xb8, 0x50, 0x29, 0x19, 0x31, 0xd9, 0x5f, 0xa7, 0x4c, 0xe8, 0x8b, 0xe3, 0xfd, 0x3f, 0xf6, - 0x65, 0xca, 0x04, 0xbe, 0x38, 0x43, 0xca, 0x9f, 0x80, 0xeb, 0xe1, 0xf3, 0x58, 0x67, 0xed, 0x6f, - 0xc8, 0xa2, 0xff, 0x71, 0x0a, 0x72, 0x17, 0xbd, 0x87, 0x7f, 0x0c, 0x6f, 0xd4, 0x7a, 0xf5, 0x18, - 0x82, 0x3b, 0x3c, 0x1b, 0x72, 0x1e, 0x7d, 0x36, 0xed, 0xb9, 0x43, 0x6e, 0x77, 0xd8, 0x63, 0x44, - 0x23, 0xff, 0xa9, 0x67, 0xa1, 0xe0, 0x58, 0xfb, 0x76, 0xdb, 0x33, 0xbf, 0x3d, 0x8d, 0x61, 0x6f, - 0x49, 0x83, 0x9a, 0x0a, 0xa4, 0x17, 0xc7, 0xe7, 0x72, 0xca, 0x5d, 0xb0, 0xa4, 0x08, 0x17, 0x2c, - 0x25, 0xd8, 0x7f, 0x90, 0xe0, 0x2d, 0x7d, 0x8d, 0xf8, 0x63, 0x72, 0xd7, 0x60, 0x67, 0x5c, 0xb0, - 0x47, 0x88, 0xe5, 0xa8, 0xea, 0x90, 0xd4, 0x61, 0x5c, 0x14, 0x6d, 0x10, 0x47, 0x7e, 0xa2, 0x0e, - 0xe3, 0x12, 0x3c, 0x4c, 0xe4, 0x94, 0x7b, 0x81, 0x39, 0xb9, 0x3e, 0x3c, 0x4e, 0x74, 0x73, 0x82, - 0xd2, 0x1f, 0x09, 0x9d, 0x31, 0x3a, 0xbf, 0x8e, 0x8c, 0xce, 0x31, 0xb9, 0xbf, 0xfe, 0x9a, 0x42, - 0x22, 0x69, 0xfa, 0x46, 0x90, 0xfc, 0x45, 0x49, 0x89, 0x21, 0xf2, 0xc6, 0x60, 0x21, 0x8e, 0xf4, - 0xfc, 0xe8, 0xa1, 0xc5, 0x45, 0xd1, 0x71, 0xfc, 0x4f, 0x3a, 0xb4, 0xb8, 0x2c, 0x23, 0xe9, 0x03, - 0xf9, 0x53, 0xf4, 0x62, 0xb2, 0x52, 0xdb, 0x35, 0xae, 0x8e, 0xb9, 0xa5, 0x89, 0xc3, 0x4b, 0xc2, - 0x68, 0xc2, 0x87, 0x24, 0x44, 0x39, 0x9c, 0x74, 0x34, 0x61, 0x39, 0x36, 0xd2, 0x87, 0xe9, 0x2f, - 0x0a, 0x9e, 0xf4, 0xd8, 0xda, 0xce, 0x4f, 0xb3, 0xd5, 0x04, 0x7c, 0x74, 0xb4, 0x2e, 0xc0, 0x1c, - 0xb7, 0x74, 0xe0, 0x5f, 0x78, 0x23, 0xa4, 0x25, 0x3d, 0x28, 0x1f, 0x88, 0x6c, 0xec, 0x0b, 0x0b, - 0x09, 0x16, 0x8c, 0x65, 0x98, 0x98, 0xc8, 0x7d, 0x72, 0xfe, 0x18, 0x36, 0x21, 0xac, 0x3e, 0xc8, - 0x63, 0x55, 0x17, 0xb1, 0xba, 0x47, 0x46, 0x4c, 0x72, 0x63, 0x9a, 0xd4, 0xbc, 0xf1, 0x1d, 0x01, - 0x5c, 0x9a, 0x00, 0xd7, 0xb3, 0x47, 0xe6, 0x23, 0x7d, 0xc4, 0x7e, 0x8c, 0x76, 0x87, 0x0d, 0x6a, - 0xb2, 0x8f, 0xa7, 0x3b, 0x64, 0xb3, 0x01, 0x45, 0x98, 0x0d, 0x24, 0xf4, 0xd7, 0x0f, 0xdd, 0x50, - 0x7d, 0xe6, 0x86, 0x41, 0x94, 0x1b, 0xb3, 0xbf, 0xfe, 0x50, 0x0e, 0xd2, 0x07, 0xe7, 0xef, 0x15, - 0x80, 0x55, 0xdb, 0xda, 0xef, 0xd5, 0xed, 0x0e, 0xb6, 0xd1, 0x9f, 0x86, 0x13, 0x80, 0x1f, 0x1c, - 0xc3, 0x04, 0x60, 0x13, 0x60, 0x27, 0x20, 0xce, 0x34, 0xfc, 0x29, 0x72, 0xe6, 0x7e, 0xc8, 0x94, - 0xc6, 0xd1, 0x10, 0xaf, 0xac, 0x7d, 0xae, 0x88, 0x71, 0x5c, 0x9f, 0x15, 0x92, 0x1b, 0xe7, 0x04, - 0xe0, 0x5d, 0x01, 0xd6, 0x4d, 0x01, 0xeb, 0xe7, 0x1c, 0x81, 0x93, 0xf4, 0x31, 0xff, 0x87, 0x29, - 0x98, 0xa5, 0xdb, 0x7d, 0x54, 0xa6, 0x7f, 0x1d, 0x82, 0xfe, 0xa3, 0x63, 0x00, 0x7d, 0x0b, 0xe6, - 0xac, 0x90, 0x3a, 0xed, 0x53, 0xf9, 0x05, 0x98, 0x58, 0xd8, 0x39, 0xbe, 0x34, 0x81, 0x0c, 0xfa, - 0x55, 0x1e, 0x79, 0x4d, 0x44, 0xfe, 0xbe, 0x18, 0x79, 0x73, 0x14, 0xc7, 0x09, 0xfd, 0xbb, 0x03, - 0xe8, 0xb7, 0x04, 0xe8, 0x4b, 0x47, 0x61, 0x65, 0x02, 0xe1, 0xfa, 0x15, 0xc8, 0x91, 0xd3, 0x75, - 0x3f, 0x9b, 0xe2, 0xfc, 0xfe, 0x1c, 0x4c, 0x91, 0x26, 0x1b, 0xcc, 0x3b, 0xfc, 0x57, 0xef, 0x8b, - 0xbe, 0xed, 0x62, 0x3b, 0x58, 0xb9, 0xf5, 0x5f, 0x3d, 0x1e, 0x7c, 0xaf, 0x66, 0xe7, 0x5c, 0x81, - 0x6e, 0x64, 0x06, 0x09, 0x23, 0x4f, 0x4a, 0x78, 0x89, 0x8f, 0xed, 0xbc, 0xdd, 0x28, 0x93, 0x92, - 0x21, 0x8c, 0xa4, 0x0f, 0xfc, 0xe7, 0x72, 0x70, 0x8e, 0xae, 0x2a, 0xad, 0xd8, 0xd6, 0x5e, 0xdf, - 0xed, 0x58, 0xc6, 0xd1, 0x75, 0xe1, 0x36, 0x58, 0x70, 0x05, 0x7f, 0x6e, 0xa6, 0x13, 0x7d, 0xa9, - 0xe8, 0x77, 0x78, 0x9f, 0x8c, 0xe7, 0x89, 0x48, 0x2e, 0xc5, 0x08, 0x30, 0x8a, 0xf7, 0xc4, 0x0b, - 0xf5, 0x92, 0x8c, 0x72, 0x8b, 0x54, 0xca, 0x48, 0x6b, 0x96, 0x81, 0x4e, 0xe5, 0x65, 0x74, 0xea, - 0x03, 0x81, 0x4e, 0xfd, 0x17, 0x41, 0xa7, 0x56, 0x8f, 0x2e, 0x92, 0x09, 0xac, 0x5c, 0x2c, 0x40, - 0x61, 0xc5, 0xe8, 0xba, 0xd8, 0x46, 0x5f, 0x60, 0xf3, 0xa8, 0xd7, 0xa5, 0xd8, 0xbd, 0x2c, 0x43, - 0x61, 0x9b, 0x94, 0xc6, 0x0c, 0xb2, 0x3b, 0xe5, 0xb0, 0xa1, 0x1c, 0x6a, 0xec, 0xdf, 0xa4, 0xb1, - 0xe3, 0xfa, 0xc8, 0x8c, 0x6d, 0x02, 0x96, 0x20, 0x76, 0xdc, 0x70, 0x16, 0x26, 0x72, 0x6d, 0x52, - 0x41, 0xc3, 0x7b, 0xde, 0x08, 0x72, 0x25, 0x3d, 0x84, 0x8b, 0xa0, 0x18, 0x1d, 0x87, 0x34, 0xbd, - 0x19, 0xcd, 0x7b, 0x4c, 0xea, 0xc9, 0xd2, 0x2f, 0x2a, 0xca, 0xf2, 0xa4, 0x3d, 0x59, 0xa4, 0xb8, - 0x48, 0x1f, 0xb3, 0xaf, 0x11, 0x37, 0xc6, 0x5e, 0x57, 0x6f, 0x63, 0x8f, 0xfb, 0xd4, 0x50, 0x5b, - 0x80, 0xac, 0xe1, 0x8f, 0xf8, 0x59, 0x83, 0x6f, 0xa7, 0xf9, 0x23, 0xb4, 0xd3, 0x51, 0x17, 0xb9, - 0x02, 0x99, 0x93, 0x8a, 0x1f, 0xdb, 0x22, 0x57, 0x2c, 0x1b, 0x13, 0xb8, 0x14, 0xd3, 0x3f, 0xe6, - 0x39, 0xd1, 0xd6, 0x3a, 0xea, 0x16, 0x00, 0x13, 0xd6, 0xd8, 0x8e, 0x74, 0x8e, 0xb2, 0x05, 0x10, - 0xcd, 0xc3, 0x04, 0xd0, 0x5a, 0x60, 0x68, 0x7d, 0x86, 0x0d, 0xa3, 0x29, 0xef, 0xc2, 0x39, 0x96, - 0xed, 0x26, 0xdb, 0x85, 0xf3, 0xb8, 0xd3, 0xc8, 0x7f, 0x49, 0x8f, 0x05, 0x89, 0xa7, 0x7e, 0xc7, - 0x35, 0x7c, 0x26, 0x38, 0x16, 0x34, 0x8c, 0x81, 0xf4, 0xe1, 0x7d, 0xdb, 0x31, 0x0d, 0x9e, 0xa3, - 0x36, 0x47, 0xd6, 0x06, 0xc6, 0x36, 0x74, 0x8e, 0xd2, 0x1c, 0xa3, 0x79, 0x48, 0x1f, 0xaf, 0xbf, - 0xe3, 0x06, 0xce, 0xb7, 0x4c, 0x70, 0xe0, 0xf4, 0x5b, 0x66, 0x7e, 0xc4, 0x96, 0x39, 0xea, 0xee, - 0x02, 0x93, 0xf5, 0xf8, 0x06, 0xcc, 0x51, 0x76, 0x17, 0x62, 0x98, 0x48, 0x1f, 0xf1, 0xb7, 0x2a, - 0x90, 0x6f, 0x4c, 0x7e, 0xbc, 0x1c, 0x75, 0x2e, 0x42, 0x64, 0xd5, 0x18, 0xdb, 0x70, 0x39, 0xca, - 0x5c, 0x24, 0x92, 0x85, 0x09, 0x84, 0x85, 0x3f, 0x09, 0x73, 0x64, 0xc2, 0xed, 0x6f, 0xe2, 0xfd, - 0x1d, 0x1b, 0x35, 0xdf, 0x94, 0x62, 0x5b, 0x7d, 0x10, 0xa6, 0xfd, 0xdd, 0x21, 0x36, 0x72, 0x2e, - 0xca, 0xb5, 0x4f, 0x9f, 0x4b, 0x2d, 0xf8, 0xff, 0x48, 0x5b, 0xed, 0x63, 0xdf, 0x09, 0x1c, 0x75, - 0xab, 0xfd, 0x58, 0x77, 0x03, 0x7f, 0x3b, 0x1c, 0x51, 0xff, 0x6b, 0x7a, 0x98, 0xf7, 0xef, 0x12, - 0xe6, 0x06, 0xec, 0x12, 0x7e, 0x8c, 0xc7, 0xb2, 0x21, 0x62, 0x79, 0xbf, 0xac, 0x08, 0xc7, 0x38, - 0xd6, 0xbe, 0x27, 0x80, 0xf3, 0xa2, 0x00, 0xe7, 0xd2, 0x91, 0x78, 0x99, 0xc0, 0xb1, 0xbc, 0x5c, - 0x38, 0xe6, 0x7e, 0x3c, 0xc5, 0x76, 0xdc, 0xe7, 0xf3, 0x9f, 0x3b, 0xe4, 0xf3, 0x2f, 0xb4, 0xf4, - 0xfc, 0x11, 0x5b, 0xfa, 0xc7, 0x79, 0xed, 0x68, 0x8a, 0xda, 0xf1, 0x6c, 0x79, 0x44, 0xc6, 0x37, - 0x32, 0xbf, 0x37, 0x50, 0x8f, 0x4b, 0x82, 0x7a, 0x94, 0x8f, 0xc6, 0x4c, 0xfa, 0xfa, 0xf1, 0xeb, - 0xfe, 0x84, 0xf6, 0x98, 0xdb, 0xfb, 0xa8, 0x1b, 0x91, 0x82, 0x10, 0xc7, 0x36, 0x72, 0x8f, 0xb2, - 0x11, 0x39, 0x8c, 0x93, 0x09, 0x44, 0x0a, 0x9b, 0x87, 0x59, 0xc2, 0xd3, 0x25, 0xa3, 0xb3, 0x83, - 0x5d, 0xf4, 0x93, 0xd4, 0x03, 0xce, 0x8f, 0xcb, 0x38, 0xa6, 0xe0, 0x39, 0x51, 0xa7, 0x31, 0x93, - 0xfa, 0x0b, 0x50, 0x26, 0x17, 0x39, 0x06, 0x27, 0x1d, 0xdf, 0x6f, 0x28, 0x07, 0xe9, 0x43, 0xf6, - 0xab, 0xd4, 0x99, 0x63, 0x5d, 0x3f, 0xb0, 0xf6, 0x5d, 0xf4, 0xe2, 0x31, 0x74, 0xd0, 0x4b, 0x50, - 0xe8, 0x12, 0x6a, 0xcc, 0xe9, 0x3f, 0x7e, 0xba, 0xc3, 0x44, 0x40, 0xcb, 0xd7, 0xd8, 0x9f, 0x49, - 0x3d, 0xff, 0x43, 0x39, 0x52, 0x3a, 0x93, 0xf6, 0xfc, 0x1f, 0x52, 0xfe, 0x44, 0x6e, 0x80, 0x99, - 0xf6, 0x4a, 0x37, 0xf6, 0x0c, 0x77, 0x4c, 0xf1, 0x05, 0xba, 0x1e, 0x2d, 0x3f, 0xbe, 0x00, 0x79, - 0x49, 0x7a, 0x9e, 0x91, 0x93, 0x8a, 0xf7, 0xfb, 0xa4, 0xcf, 0x33, 0xc6, 0x17, 0x9f, 0x3e, 0x26, - 0x3f, 0x4c, 0x5b, 0xd6, 0x45, 0xea, 0xda, 0x99, 0xa2, 0xd7, 0xe8, 0xc8, 0x8d, 0x85, 0xb2, 0x76, - 0x7c, 0x8d, 0x65, 0x60, 0xf9, 0xe9, 0x03, 0xf3, 0x33, 0xdf, 0x08, 0xf9, 0x65, 0x7c, 0x79, 0x7f, - 0x07, 0xdd, 0x07, 0xd3, 0x4d, 0x1b, 0xe3, 0xaa, 0xb9, 0x6d, 0x79, 0xd2, 0x75, 0xbd, 0x67, 0x1f, - 0x12, 0xf6, 0xe6, 0xe1, 0xb1, 0x8b, 0xf5, 0x4e, 0x78, 0xba, 0xc9, 0x7f, 0x45, 0xaf, 0xce, 0x42, - 0xae, 0xe1, 0xea, 0x2e, 0x9a, 0x09, 0xb0, 0x45, 0x2f, 0xe6, 0xb1, 0xb8, 0x4f, 0xc4, 0xe2, 0x36, - 0x41, 0x16, 0x84, 0x83, 0x45, 0xef, 0xff, 0x08, 0x00, 0x10, 0x4c, 0x3f, 0xe2, 0x58, 0xa6, 0x97, - 0xc3, 0x3f, 0x80, 0xe7, 0xbf, 0xa3, 0xd7, 0x06, 0xe2, 0x7e, 0x40, 0x10, 0xf7, 0x93, 0xe4, 0x8a, - 0x98, 0xc0, 0x4a, 0x5b, 0x16, 0x66, 0x3c, 0xd1, 0xae, 0x61, 0xbd, 0xe3, 0xa0, 0x6f, 0x08, 0x95, - 0x3f, 0x42, 0xcc, 0xe8, 0x43, 0xd2, 0xa1, 0x22, 0x69, 0xad, 0x02, 0xe2, 0xd1, 0xfe, 0x02, 0x7e, - 0xa8, 0x8c, 0xac, 0x18, 0x2a, 0xe3, 0x2e, 0xc8, 0x19, 0xe6, 0xb6, 0xc5, 0xbc, 0xd7, 0x6e, 0x8c, - 0xa0, 0xed, 0xe9, 0x84, 0x46, 0x32, 0x4a, 0xc6, 0x91, 0x8c, 0x67, 0x6b, 0x22, 0x57, 0xb2, 0xe5, - 0xbc, 0xd2, 0xd1, 0xff, 0x31, 0x54, 0xd8, 0xaa, 0x0a, 0xb9, 0x9e, 0xee, 0xee, 0xb2, 0xa2, 0xc9, - 0xb3, 0x67, 0x23, 0xef, 0x9b, 0xba, 0x69, 0x99, 0x07, 0x7b, 0xc6, 0x0b, 0x82, 0x9b, 0x5f, 0x85, - 0x34, 0x8f, 0xf3, 0x1d, 0x6c, 0x62, 0x5b, 0x77, 0x71, 0xe3, 0xea, 0x0e, 0x99, 0x63, 0x4d, 0x6b, - 0x7c, 0x52, 0x62, 0xfd, 0xf7, 0x38, 0x8e, 0xd6, 0xff, 0x6d, 0xa3, 0x8b, 0x49, 0x1c, 0x21, 0xa6, - 0xff, 0xfe, 0x7b, 0x22, 0xfd, 0x1f, 0x50, 0x44, 0xfa, 0x68, 0xfc, 0x6b, 0x16, 0xe6, 0x1a, 0x9e, - 0xc2, 0x35, 0xf6, 0xf7, 0xf6, 0x74, 0xfb, 0x00, 0x3d, 0x3e, 0x44, 0x85, 0x53, 0xcd, 0x8c, 0xa0, - 0x9a, 0xe8, 0xd7, 0xa4, 0x2f, 0x3d, 0x66, 0x4d, 0x9b, 0x2b, 0x21, 0x71, 0x3b, 0x78, 0x2a, 0xe4, - 0x3d, 0xf5, 0xf6, 0xfd, 0xf9, 0x62, 0x1b, 0x02, 0xcd, 0x29, 0x19, 0x6f, 0x69, 0x28, 0x6f, 0x13, - 0x88, 0xf5, 0x90, 0x85, 0x93, 0x0d, 0x57, 0x6f, 0x5f, 0x59, 0xb5, 0x6c, 0x6b, 0xdf, 0x35, 0x4c, - 0xec, 0xa0, 0xc7, 0x85, 0x08, 0xf8, 0xfa, 0x9f, 0x09, 0xf5, 0x1f, 0xfd, 0x7b, 0x46, 0x76, 0x14, - 0x0d, 0xba, 0x55, 0x9e, 0x7c, 0x44, 0xf8, 0x24, 0xb9, 0x71, 0x51, 0x86, 0x62, 0xfa, 0x42, 0x7b, - 0x8b, 0x02, 0xc5, 0xca, 0xa3, 0x3d, 0xcb, 0x76, 0xd7, 0xad, 0xb6, 0xde, 0x75, 0x5c, 0xcb, 0xc6, - 0xa8, 0x1e, 0x2b, 0x35, 0xaf, 0x87, 0xe9, 0x58, 0xed, 0x70, 0x70, 0x64, 0x6f, 0xbc, 0xda, 0x29, - 0xa2, 0x8e, 0xff, 0xaa, 0xf4, 0x2e, 0x23, 0x95, 0x4a, 0x3f, 0x47, 0x11, 0x7a, 0x3e, 0xa8, 0x4b, - 0x4b, 0xe6, 0x8a, 0x2f, 0xb7, 0xf3, 0x28, 0xc5, 0xd4, 0x04, 0x96, 0xca, 0xb3, 0x30, 0xdf, 0xd8, - 0xbf, 0x1c, 0x10, 0x71, 0x78, 0x23, 0xe4, 0xf5, 0xd2, 0x31, 0x12, 0x98, 0xe2, 0xf1, 0x84, 0x22, - 0xe4, 0x7b, 0x2b, 0xcc, 0x3b, 0x7c, 0x36, 0x86, 0xb7, 0x98, 0x28, 0x19, 0x1b, 0x61, 0x78, 0xa9, - 0xe9, 0x0b, 0xf0, 0xbd, 0x59, 0x98, 0xaf, 0xf7, 0xb0, 0x89, 0x3b, 0xd4, 0xc7, 0x4e, 0x10, 0xe0, - 0xab, 0x13, 0x0a, 0x50, 0x20, 0x14, 0x21, 0xc0, 0xd0, 0x1f, 0x76, 0xd9, 0x17, 0x5e, 0x98, 0x90, - 0x48, 0x70, 0x71, 0xa5, 0xa5, 0x2f, 0xb8, 0xcf, 0x67, 0x61, 0x56, 0xdb, 0x37, 0x37, 0x6d, 0xcb, - 0x1b, 0x8d, 0x6d, 0x74, 0x7f, 0xd8, 0x41, 0xdc, 0x09, 0xa7, 0x3a, 0xfb, 0x36, 0x59, 0x7f, 0xaa, - 0x9a, 0x0d, 0xdc, 0xb6, 0xcc, 0x8e, 0x43, 0xea, 0x91, 0xd7, 0x0e, 0x7f, 0xb8, 0x37, 0xf7, 0xd2, - 0xbf, 0x54, 0x32, 0xe8, 0x65, 0xd2, 0x81, 0x58, 0x68, 0xe5, 0xb9, 0xa2, 0xe5, 0x7b, 0x02, 0xc9, - 0x70, 0x2b, 0xc3, 0x4a, 0x48, 0x5f, 0xb8, 0x9f, 0xc9, 0x82, 0x5a, 0x6a, 0xb7, 0xad, 0x7d, 0xd3, - 0x6d, 0xe0, 0x2e, 0x6e, 0xbb, 0x4d, 0x5b, 0x6f, 0x63, 0xde, 0x7e, 0x2e, 0x82, 0xd2, 0x31, 0x6c, - 0xd6, 0x07, 0x7b, 0x8f, 0x4c, 0x8e, 0xaf, 0x96, 0xde, 0x71, 0xa4, 0xb5, 0x3c, 0x5c, 0x4a, 0x02, - 0x71, 0xca, 0xed, 0x2b, 0x4a, 0x16, 0x94, 0xbe, 0x54, 0x3f, 0x9e, 0x85, 0x19, 0xbf, 0xc7, 0xde, - 0x91, 0x11, 0xe6, 0x0f, 0x27, 0x9c, 0x8c, 0x04, 0xc4, 0x13, 0xc8, 0xf0, 0x9d, 0x09, 0x66, 0x15, - 0x51, 0xf4, 0x93, 0x89, 0xae, 0x94, 0x5c, 0x74, 0xde, 0x6b, 0xad, 0xde, 0x5a, 0xa9, 0xaf, 0x2f, - 0x57, 0xb4, 0xa2, 0x82, 0xbe, 0x90, 0x85, 0xdc, 0xa6, 0x61, 0xee, 0xf0, 0xf1, 0xb2, 0x4e, 0x7b, - 0x76, 0x64, 0x07, 0x3f, 0xca, 0x5a, 0x3a, 0x7d, 0x51, 0xef, 0x86, 0xd3, 0xe6, 0xfe, 0xde, 0x65, - 0x6c, 0xd7, 0xb7, 0xc9, 0x28, 0xeb, 0x34, 0xad, 0x06, 0x36, 0xa9, 0x11, 0x9a, 0xd7, 0x06, 0x7e, - 0x13, 0x4d, 0x30, 0x89, 0xc9, 0x83, 0xc7, 0x49, 0x84, 0xc4, 0x03, 0xa6, 0xb2, 0x1c, 0x53, 0x89, - 0xa6, 0x0d, 0x03, 0x88, 0xa7, 0xaf, 0xa9, 0xbf, 0x91, 0x87, 0x33, 0x25, 0xf3, 0x80, 0xd8, 0x14, - 0xb4, 0x83, 0x2f, 0xef, 0xea, 0xe6, 0x0e, 0x26, 0x03, 0x44, 0x20, 0x71, 0x3e, 0x80, 0x7c, 0x46, - 0x0c, 0x20, 0xaf, 0x6a, 0x30, 0x65, 0xd9, 0x1d, 0x6c, 0x2f, 0x1d, 0x10, 0x9e, 0xfa, 0x97, 0x9d, - 0x59, 0x9b, 0x1c, 0x54, 0xc4, 0x22, 0x23, 0xbf, 0x58, 0xa7, 0xff, 0x6b, 0x3e, 0xa1, 0x0b, 0x77, - 0xc2, 0x14, 0x4b, 0x53, 0xe7, 0x60, 0xba, 0xae, 0x2d, 0x57, 0xb4, 0x56, 0x75, 0xb9, 0x78, 0x42, - 0xbd, 0x0e, 0x4e, 0x56, 0x9b, 0x15, 0xad, 0xd4, 0xac, 0xd6, 0x6b, 0x2d, 0x92, 0x5e, 0xcc, 0xa0, - 0x97, 0xe4, 0x64, 0x3d, 0x7b, 0xe3, 0x99, 0x19, 0x04, 0xab, 0x06, 0x53, 0x6d, 0x9a, 0x81, 0x0c, - 0xa1, 0xb3, 0x89, 0x6a, 0xc7, 0x08, 0xd2, 0x04, 0xcd, 0x27, 0xa4, 0x9e, 0x07, 0xb8, 0x66, 0x5b, - 0xe6, 0x4e, 0x78, 0xa6, 0x6d, 0x5a, 0xe3, 0x52, 0xd0, 0x8b, 0x33, 0x50, 0xa0, 0xff, 0x90, 0x0b, - 0x33, 0xc8, 0x53, 0x28, 0x78, 0xff, 0xdd, 0xb3, 0x78, 0x89, 0xbc, 0xc2, 0x89, 0x16, 0x7b, 0xf5, - 0x74, 0x91, 0xca, 0x80, 0x5a, 0xc2, 0xac, 0x2a, 0x77, 0x41, 0x81, 0xfe, 0xcb, 0xbc, 0x0e, 0xa2, - 0x83, 0x5f, 0xd2, 0x6c, 0x92, 0x7e, 0xca, 0xf2, 0x32, 0x4d, 0x5f, 0x9b, 0x3f, 0x9c, 0x85, 0xe9, - 0x1a, 0x76, 0xcb, 0xbb, 0xb8, 0x7d, 0x05, 0x3d, 0x51, 0x5c, 0x00, 0xed, 0x1a, 0xd8, 0x74, 0x1f, - 0xde, 0xeb, 0x06, 0x0b, 0xa0, 0x7e, 0x02, 0xfa, 0x6e, 0xbe, 0xf3, 0x7d, 0x8e, 0xa8, 0x3f, 0x77, - 0x0c, 0xa8, 0xab, 0x5f, 0x42, 0x84, 0xca, 0x9c, 0x85, 0x82, 0x8d, 0x9d, 0xfd, 0xae, 0xbf, 0x88, - 0xc6, 0xde, 0xd0, 0x1b, 0x02, 0x71, 0x96, 0x05, 0x71, 0xde, 0x25, 0x5f, 0xc4, 0x04, 0xa2, 0x69, - 0xe6, 0x60, 0xaa, 0x6a, 0x1a, 0xae, 0xa1, 0x77, 0xd1, 0xcb, 0x72, 0x30, 0xdf, 0xc0, 0xee, 0xa6, - 0x6e, 0xeb, 0x7b, 0xd8, 0xc5, 0xb6, 0x83, 0xbe, 0x2a, 0xf6, 0x09, 0xbd, 0xae, 0xee, 0x6e, 0x5b, - 0xf6, 0x9e, 0xaf, 0x9a, 0xfe, 0xbb, 0xa7, 0x9a, 0x57, 0xb1, 0xed, 0x84, 0x7c, 0xf9, 0xaf, 0xde, - 0x97, 0x6b, 0x96, 0x7d, 0xc5, 0x1b, 0x04, 0xd9, 0x34, 0x8d, 0xbd, 0x7a, 0xf4, 0xba, 0xd6, 0xce, - 0x3a, 0xbe, 0x8a, 0xfd, 0x60, 0x5d, 0xc1, 0xbb, 0x37, 0x17, 0xe8, 0x58, 0x35, 0xcb, 0xf5, 0x3a, - 0xed, 0x75, 0x6b, 0x87, 0x46, 0x33, 0x9d, 0xd6, 0xc4, 0xc4, 0x30, 0x97, 0x7e, 0x15, 0x93, 0x5c, - 0x05, 0x3e, 0x17, 0x4b, 0x54, 0x17, 0x41, 0x0d, 0x7e, 0x6b, 0xe2, 0x2e, 0xde, 0xc3, 0xae, 0x7d, - 0x40, 0x2e, 0x2d, 0x98, 0xd6, 0x06, 0x7c, 0x61, 0x03, 0xb4, 0xfc, 0x64, 0x9d, 0x49, 0x6f, 0x51, - 0x90, 0xdc, 0x91, 0x26, 0xeb, 0x32, 0x14, 0x27, 0x72, 0x29, 0x93, 0xe2, 0x59, 0x33, 0x3f, 0xae, - 0x40, 0x8e, 0x0c, 0x9e, 0x6f, 0xcd, 0x08, 0x2b, 0x4c, 0x7b, 0xd8, 0x71, 0xf4, 0x1d, 0xec, 0xaf, - 0x30, 0xb1, 0x57, 0xf5, 0x1e, 0xc8, 0x77, 0x09, 0xa6, 0x74, 0x70, 0x78, 0xbc, 0x50, 0x33, 0xcf, - 0xc0, 0xf0, 0x68, 0x05, 0x23, 0x01, 0x81, 0x5b, 0xa3, 0x7f, 0x5c, 0x78, 0x10, 0xf2, 0x14, 0xfe, - 0x19, 0xc8, 0x2f, 0x57, 0x96, 0xb6, 0x56, 0x8b, 0x27, 0xbc, 0x47, 0x9f, 0xbf, 0x19, 0xc8, 0xaf, - 0x94, 0x9a, 0xa5, 0xf5, 0x62, 0xd6, 0xab, 0x47, 0xb5, 0xb6, 0x52, 0x2f, 0x2a, 0x5e, 0xe2, 0x66, - 0xa9, 0x56, 0x2d, 0x17, 0x73, 0xea, 0x2c, 0x4c, 0x5d, 0x2a, 0x69, 0xb5, 0x6a, 0x6d, 0xb5, 0x98, - 0x47, 0x7f, 0xc1, 0xe3, 0x77, 0xaf, 0x88, 0xdf, 0xad, 0x51, 0x3c, 0x0d, 0x82, 0xec, 0x27, 0x02, - 0xc8, 0xee, 0x17, 0x20, 0xfb, 0x46, 0x19, 0x22, 0x13, 0x70, 0x67, 0x2a, 0xc0, 0xd4, 0xa6, 0x6d, - 0xb5, 0xb1, 0xe3, 0xa0, 0x1f, 0xc9, 0x42, 0xa1, 0xac, 0x9b, 0x6d, 0xdc, 0x45, 0x37, 0x84, 0x50, - 0x51, 0x57, 0xd1, 0x8c, 0xef, 0x2a, 0x8a, 0xfe, 0x3e, 0x23, 0xdb, 0xfb, 0x31, 0xba, 0x8b, 0x94, - 0x66, 0x84, 0x7c, 0xe4, 0x7a, 0xb9, 0x58, 0x52, 0x13, 0xb8, 0xb8, 0x25, 0x0b, 0x33, 0x6c, 0x35, - 0xe0, 0x32, 0xe6, 0xe7, 0xe1, 0x5f, 0xcd, 0xc8, 0x4e, 0x0e, 0xfd, 0x1a, 0x04, 0x64, 0x22, 0xe4, - 0x21, 0x37, 0x11, 0x1c, 0x46, 0x6d, 0x02, 0x9b, 0x87, 0x59, 0x98, 0xdd, 0x32, 0x9d, 0x41, 0x42, - 0x91, 0x8f, 0xf2, 0xee, 0x57, 0x83, 0x23, 0x74, 0xa4, 0x28, 0xef, 0xc3, 0xe9, 0xa5, 0x2f, 0x98, - 0xaf, 0x66, 0xe0, 0xf4, 0x2a, 0x36, 0xb1, 0x6d, 0xb4, 0x69, 0x0d, 0x7c, 0x49, 0xdc, 0x2f, 0x4a, - 0xe2, 0x89, 0x02, 0xe7, 0x83, 0xfe, 0x10, 0x25, 0xf0, 0xba, 0x40, 0x02, 0xcf, 0x11, 0x24, 0x70, - 0xa7, 0x24, 0x9d, 0x09, 0xdc, 0xd6, 0x3d, 0x03, 0x73, 0x35, 0xcb, 0x35, 0xb6, 0x8d, 0x36, 0xf5, - 0x41, 0xfb, 0x31, 0x05, 0x72, 0xeb, 0x86, 0xe3, 0xa2, 0x52, 0xd8, 0x9d, 0xdc, 0x02, 0xb3, 0x86, - 0xd9, 0xee, 0xee, 0x77, 0xb0, 0x86, 0x75, 0xda, 0xaf, 0x4c, 0x6b, 0x7c, 0x52, 0xb8, 0xb5, 0xef, - 0xb1, 0xa5, 0xf8, 0x5b, 0xfb, 0xbf, 0x25, 0xbd, 0x0c, 0xc3, 0xb3, 0x40, 0xc2, 0x1d, 0x46, 0xd8, - 0x5d, 0x25, 0x98, 0x37, 0xb9, 0xac, 0xbe, 0xc1, 0xde, 0x1f, 0xee, 0x9e, 0x27, 0xa7, 0x89, 0x7f, - 0xa0, 0xf7, 0x4b, 0x35, 0xd6, 0x61, 0x0c, 0x25, 0x43, 0x66, 0x65, 0x84, 0x49, 0xb2, 0x0a, 0x0b, - 0xd5, 0x5a, 0xb3, 0xa2, 0xd5, 0x4a, 0xeb, 0x2c, 0x8b, 0x82, 0xfe, 0x35, 0x0b, 0x79, 0x0d, 0xf7, - 0xba, 0x07, 0x7c, 0x3c, 0x63, 0xe6, 0x28, 0x9e, 0x09, 0x1c, 0xc5, 0xd5, 0x15, 0x00, 0xbd, 0xed, - 0x15, 0x4c, 0x2e, 0x7c, 0xca, 0x0e, 0x8c, 0x92, 0x29, 0x54, 0xb0, 0x14, 0xe4, 0xd6, 0xb8, 0x3f, - 0xd1, 0xcb, 0xa5, 0x77, 0x8e, 0x04, 0x6a, 0x84, 0xc3, 0x88, 0x3e, 0xe1, 0x03, 0x52, 0x9b, 0x3d, - 0x43, 0xc9, 0x1d, 0x8f, 0xf8, 0xbf, 0x98, 0x85, 0x5c, 0xd3, 0xeb, 0x2d, 0xb9, 0x8e, 0xf3, 0x53, - 0xa3, 0xe9, 0xb8, 0x47, 0x26, 0x42, 0xc7, 0x1f, 0x80, 0x39, 0x5e, 0x63, 0x99, 0xab, 0x44, 0xac, - 0x8a, 0x0b, 0x3f, 0x8c, 0xa2, 0xe1, 0x03, 0xd8, 0x39, 0x1e, 0x11, 0x7f, 0xe2, 0x49, 0x00, 0x1b, - 0x78, 0xef, 0x32, 0xb6, 0x9d, 0x5d, 0xa3, 0x87, 0xfe, 0x4a, 0x81, 0x99, 0x55, 0xec, 0x36, 0x5c, - 0xdd, 0xdd, 0x77, 0xfa, 0xb6, 0x3b, 0x4d, 0xab, 0xac, 0xb7, 0x77, 0x31, 0xeb, 0x8e, 0xfc, 0x57, - 0xf4, 0x6e, 0x45, 0xd6, 0x9f, 0x28, 0x2c, 0x67, 0x31, 0x28, 0x23, 0x02, 0x93, 0x27, 0x43, 0xae, - 0xa3, 0xbb, 0x3a, 0xc3, 0xe2, 0x86, 0x3e, 0x2c, 0x42, 0x42, 0x1a, 0xc9, 0x86, 0x7e, 0x21, 0x2b, - 0xe3, 0x50, 0x24, 0x51, 0x7e, 0x32, 0x10, 0xde, 0x9f, 0x19, 0x01, 0x85, 0x53, 0x30, 0x5f, 0xab, - 0x37, 0x5b, 0xeb, 0xf5, 0xd5, 0xd5, 0x8a, 0x97, 0x5a, 0x54, 0xd4, 0xb3, 0xa0, 0x6e, 0x96, 0x1e, - 0xde, 0xa8, 0xd4, 0x9a, 0xad, 0x5a, 0x7d, 0xb9, 0xc2, 0xfe, 0xcc, 0xa9, 0x27, 0x61, 0xb6, 0x5c, - 0x2a, 0xaf, 0xf9, 0x09, 0x79, 0xf5, 0x1c, 0x9c, 0xde, 0xa8, 0x6c, 0x2c, 0x55, 0xb4, 0xc6, 0x5a, - 0x75, 0xb3, 0xe5, 0x91, 0x59, 0xa9, 0x6f, 0xd5, 0x96, 0x8b, 0x05, 0x15, 0xc1, 0x59, 0xee, 0xcb, - 0x25, 0xad, 0x5e, 0x5b, 0x6d, 0x35, 0x9a, 0xa5, 0x66, 0xa5, 0x38, 0xa5, 0x5e, 0x07, 0x27, 0xcb, - 0xa5, 0x1a, 0xc9, 0x5e, 0xae, 0xd7, 0x6a, 0x95, 0x72, 0xb3, 0x38, 0x8d, 0xfe, 0x3d, 0x07, 0xb3, - 0x55, 0xa7, 0xa6, 0xef, 0xe1, 0x8b, 0x7a, 0xd7, 0xe8, 0xa0, 0x97, 0x71, 0x33, 0x8f, 0x5b, 0x61, - 0xde, 0xa6, 0x8f, 0xb8, 0xd3, 0x34, 0x30, 0x45, 0x73, 0x5e, 0x13, 0x13, 0xbd, 0x39, 0xb9, 0x49, - 0x08, 0xf8, 0x73, 0x72, 0xfa, 0xa6, 0x2e, 0x01, 0xd0, 0xa7, 0x66, 0x78, 0xf5, 0xe8, 0x85, 0xfe, - 0xd6, 0xa4, 0xef, 0x61, 0x07, 0xdb, 0x57, 0x8d, 0x36, 0xf6, 0x73, 0x6a, 0xdc, 0x5f, 0xe8, 0x4b, - 0x8a, 0xec, 0xfe, 0x22, 0x07, 0x2a, 0x57, 0x9d, 0x88, 0xde, 0xf0, 0x7b, 0x14, 0x99, 0xdd, 0x41, - 0x29, 0x92, 0xc9, 0x34, 0xe5, 0x95, 0xd9, 0xd1, 0x96, 0x6d, 0x9b, 0xf5, 0x7a, 0xab, 0xb1, 0x56, - 0xd7, 0x9a, 0x45, 0x45, 0x9d, 0x83, 0x69, 0xef, 0x75, 0xbd, 0x5e, 0x5b, 0x2d, 0xe6, 0xd4, 0x33, - 0x70, 0x6a, 0xad, 0xd4, 0x68, 0x55, 0x6b, 0x17, 0x4b, 0xeb, 0xd5, 0xe5, 0x56, 0x79, 0xad, 0xa4, - 0x35, 0x8a, 0x79, 0xf5, 0x06, 0x38, 0xd3, 0xac, 0x56, 0xb4, 0xd6, 0x4a, 0xa5, 0xd4, 0xdc, 0xd2, - 0x2a, 0x8d, 0x56, 0xad, 0xde, 0xaa, 0x95, 0x36, 0x2a, 0xc5, 0x82, 0xd7, 0xfc, 0xc9, 0xa7, 0x50, - 0x6d, 0xa6, 0x0e, 0x2b, 0xe3, 0x74, 0x84, 0x32, 0xce, 0xf4, 0x2b, 0x23, 0xf0, 0x6a, 0xa5, 0x55, - 0x1a, 0x15, 0xed, 0x62, 0xa5, 0x38, 0x3b, 0x48, 0xd7, 0xe6, 0xd4, 0xd3, 0x50, 0xf4, 0x78, 0x68, - 0x55, 0x1b, 0x7e, 0xce, 0xe5, 0xe2, 0x3c, 0xfa, 0x78, 0x01, 0xce, 0x6a, 0x78, 0xc7, 0x70, 0x5c, - 0x6c, 0x6f, 0xea, 0x07, 0x7b, 0xd8, 0x74, 0xfd, 0x4e, 0xfe, 0x9f, 0x13, 0x2b, 0xe3, 0x06, 0xcc, - 0xf7, 0x28, 0x8d, 0x0d, 0xec, 0xee, 0x5a, 0x1d, 0x36, 0x0a, 0x3f, 0x31, 0xb2, 0xe7, 0x58, 0xdc, - 0xe4, 0xb3, 0x6b, 0xe2, 0xdf, 0x9c, 0x6e, 0x2b, 0x31, 0xba, 0x9d, 0x1b, 0x45, 0xb7, 0xd5, 0x9b, - 0x60, 0x66, 0xdf, 0xc1, 0x76, 0x65, 0x4f, 0x37, 0xba, 0xfe, 0xd5, 0x91, 0x41, 0x02, 0x7a, 0x47, - 0x4e, 0xf6, 0xc4, 0x0a, 0x57, 0x97, 0xc1, 0x62, 0x8c, 0xe8, 0x5b, 0xcf, 0x03, 0xb0, 0xca, 0x6e, - 0xd9, 0x5d, 0xa6, 0xac, 0x5c, 0x8a, 0xc7, 0xdf, 0x65, 0xa3, 0xdb, 0x35, 0xcc, 0x9d, 0x60, 0xdf, - 0x3f, 0x4c, 0x40, 0xaf, 0x54, 0x64, 0x4e, 0xb0, 0x24, 0xe5, 0x2d, 0x59, 0x6b, 0x7a, 0x79, 0x76, - 0xc2, 0xfd, 0xee, 0xe1, 0xa6, 0x53, 0x50, 0x8b, 0x30, 0x47, 0xd2, 0x58, 0x0b, 0x2c, 0x4e, 0x79, - 0x7d, 0xb0, 0x4f, 0x6e, 0xa3, 0xd2, 0x5c, 0xab, 0x2f, 0x07, 0xdf, 0xa6, 0x3d, 0x92, 0x1e, 0x33, - 0xa5, 0xda, 0xc3, 0xa4, 0x35, 0xce, 0xa8, 0x8f, 0x83, 0x1b, 0xb8, 0x0e, 0xbb, 0xb4, 0xae, 0x55, - 0x4a, 0xcb, 0x0f, 0xb7, 0x2a, 0xcf, 0xab, 0x36, 0x9a, 0x0d, 0xb1, 0x71, 0xf9, 0xed, 0x68, 0xd6, - 0xe3, 0xb7, 0xb2, 0x51, 0xaa, 0xae, 0xb3, 0xfe, 0x7d, 0xa5, 0xae, 0x6d, 0x94, 0x9a, 0xc5, 0x39, - 0xf4, 0xe3, 0x0a, 0x14, 0x57, 0xb1, 0xbb, 0x69, 0xd9, 0xae, 0xde, 0x5d, 0x37, 0xcc, 0x2b, 0x5b, - 0x76, 0x57, 0x98, 0x6c, 0x4a, 0x87, 0xe9, 0x10, 0x87, 0x48, 0x81, 0x60, 0xf4, 0x8e, 0x78, 0x8f, - 0x64, 0x0b, 0x95, 0x29, 0x4c, 0x40, 0x2f, 0xcc, 0xca, 0x2c, 0x77, 0xcb, 0x97, 0x9a, 0x4c, 0x4f, - 0x5e, 0x34, 0xe9, 0xf1, 0x79, 0x00, 0x6a, 0x05, 0xf4, 0xd2, 0x1c, 0x4c, 0xaf, 0x18, 0xa6, 0xde, - 0x35, 0x5e, 0x20, 0x44, 0xc7, 0x0c, 0xfb, 0x98, 0x4c, 0x4c, 0x1f, 0x93, 0x1d, 0x69, 0xfc, 0xfc, - 0x21, 0x45, 0x76, 0x79, 0x81, 0x93, 0xbd, 0xcf, 0x64, 0xc4, 0xe0, 0xf9, 0x91, 0xac, 0xcc, 0xf2, - 0xc2, 0x70, 0x7a, 0xc9, 0x30, 0xfc, 0xe4, 0x7f, 0x0c, 0x1b, 0xab, 0xaf, 0x7d, 0x4f, 0x0f, 0x52, - 0x85, 0x19, 0xf4, 0x7b, 0x0a, 0xa0, 0x55, 0xec, 0x5e, 0xc4, 0x76, 0x30, 0x15, 0x20, 0xbd, 0x3e, - 0xb3, 0xb7, 0xb9, 0x26, 0xfb, 0x56, 0x1e, 0xc0, 0x4b, 0x22, 0x80, 0xa5, 0x98, 0xc6, 0x13, 0x41, - 0x3a, 0xa2, 0xf1, 0x56, 0xa1, 0xe0, 0x90, 0xef, 0x4c, 0xcd, 0x9e, 0x1a, 0x3d, 0x5c, 0x12, 0x62, - 0x3c, 0x75, 0x4a, 0x58, 0x63, 0x04, 0xd0, 0xd7, 0x82, 0x49, 0xd0, 0xb7, 0x08, 0xda, 0xb1, 0x72, - 0x64, 0x66, 0x93, 0xe9, 0x8b, 0x9d, 0xae, 0xba, 0x0c, 0xb2, 0x6f, 0xd0, 0x47, 0xf2, 0x70, 0x7a, - 0x50, 0x75, 0xd0, 0x2f, 0x66, 0x84, 0x1d, 0x76, 0x4c, 0x86, 0xfc, 0x0c, 0xdb, 0x40, 0xf4, 0x5e, - 0xd4, 0xa7, 0xc3, 0x99, 0x60, 0x19, 0xae, 0x69, 0xd5, 0xf0, 0x35, 0xa7, 0x8b, 0x5d, 0x17, 0xdb, - 0xa4, 0x6a, 0xd3, 0xda, 0xe0, 0x8f, 0xea, 0x33, 0xe1, 0x7a, 0xc3, 0x74, 0x8c, 0x0e, 0xb6, 0x9b, - 0x46, 0xcf, 0x29, 0x99, 0x9d, 0xe6, 0xbe, 0x6b, 0xd9, 0x86, 0xce, 0x2e, 0x3a, 0x9c, 0xd6, 0xa2, - 0x3e, 0xab, 0x77, 0x40, 0xd1, 0x70, 0xea, 0xe6, 0x65, 0x4b, 0xb7, 0x3b, 0x86, 0xb9, 0xb3, 0x6e, - 0x38, 0x2e, 0xf3, 0x00, 0x3e, 0x94, 0x8e, 0xfe, 0x5a, 0x91, 0x3d, 0x4c, 0x37, 0x04, 0xd6, 0x88, - 0x0e, 0xe5, 0xbb, 0x15, 0x99, 0xe3, 0x71, 0xc9, 0x68, 0x27, 0x53, 0x96, 0x97, 0x4c, 0xda, 0x90, - 0x18, 0x3c, 0x82, 0x93, 0xae, 0x85, 0xa6, 0xfb, 0x86, 0xc0, 0xc5, 0x8a, 0x56, 0x5d, 0xa9, 0x56, - 0x3c, 0xb3, 0xe2, 0x0c, 0x9c, 0x0a, 0xbf, 0x2d, 0x3f, 0xdc, 0x6a, 0x54, 0x6a, 0xcd, 0xe2, 0xb4, - 0xd7, 0x4f, 0xd1, 0xe4, 0x95, 0x52, 0x75, 0xbd, 0xb2, 0xdc, 0x6a, 0xd6, 0xbd, 0x2f, 0xcb, 0xa3, - 0x99, 0x16, 0xe8, 0xc5, 0x39, 0x38, 0x49, 0x64, 0x7b, 0x40, 0xa4, 0xea, 0x09, 0xa5, 0xcf, 0xd7, - 0x36, 0x00, 0x68, 0x86, 0x8a, 0x17, 0xfd, 0xae, 0xf4, 0x3d, 0x8e, 0x1c, 0x84, 0x7d, 0x65, 0x44, - 0x68, 0xc6, 0x57, 0xb3, 0x32, 0x11, 0x2a, 0xa4, 0xc9, 0x26, 0x53, 0x8a, 0x7f, 0x99, 0xf4, 0x88, - 0x13, 0x0d, 0x3e, 0xb1, 0x32, 0xcb, 0xe4, 0xe7, 0xe7, 0x6d, 0x56, 0x35, 0xa2, 0x0e, 0x0b, 0x00, - 0x24, 0x85, 0x68, 0x10, 0xd5, 0x83, 0x81, 0xe3, 0x55, 0x94, 0x1e, 0x94, 0xca, 0xcd, 0xea, 0xc5, - 0x4a, 0x94, 0x1e, 0x7c, 0x5a, 0x81, 0xe9, 0x55, 0xec, 0x7a, 0x73, 0x2a, 0x07, 0x3d, 0x4b, 0x62, - 0xfd, 0xc7, 0x33, 0x63, 0xc8, 0xc5, 0xf7, 0xc1, 0x32, 0x00, 0x7d, 0x43, 0xdf, 0x35, 0x8a, 0x09, - 0xe2, 0x17, 0x1d, 0x31, 0x5e, 0x7d, 0x33, 0xe4, 0x5d, 0xef, 0x33, 0x5b, 0x86, 0xfe, 0x86, 0xc8, - 0xe1, 0xca, 0x23, 0xb2, 0xac, 0xbb, 0xba, 0x46, 0xf3, 0x73, 0xa3, 0x93, 0xa4, 0xed, 0x12, 0xc1, - 0xc8, 0x7f, 0x44, 0xfb, 0xf3, 0x2f, 0x14, 0x38, 0x43, 0xdb, 0x47, 0xa9, 0xd7, 0x6b, 0xb8, 0x96, - 0x8d, 0x35, 0xdc, 0xc6, 0x46, 0xcf, 0xed, 0x5b, 0xdf, 0xb3, 0x69, 0xaa, 0xbf, 0xd9, 0xcc, 0x5e, - 0xd1, 0x4f, 0x2b, 0xb2, 0x11, 0x7e, 0x0f, 0xb5, 0xc7, 0xbe, 0xf2, 0x22, 0x1a, 0xfb, 0xc7, 0xb2, - 0x32, 0x31, 0x7b, 0x13, 0x12, 0x4f, 0x06, 0xd4, 0xaf, 0x1c, 0x03, 0x50, 0xfe, 0xca, 0x8d, 0x56, - 0x29, 0x57, 0xaa, 0x9b, 0xde, 0x20, 0x70, 0x33, 0xdc, 0xb8, 0xb9, 0xa5, 0x95, 0xd7, 0x4a, 0x8d, - 0x4a, 0x4b, 0xab, 0xac, 0x56, 0x1b, 0x4d, 0xe6, 0x94, 0x45, 0xff, 0x9a, 0x52, 0x6f, 0x82, 0x73, - 0x8d, 0xad, 0xa5, 0x46, 0x59, 0xab, 0x6e, 0x92, 0x74, 0xad, 0x52, 0xab, 0x5c, 0x62, 0x5f, 0xa7, - 0xd1, 0x87, 0x8a, 0x30, 0xeb, 0x4d, 0x00, 0x1a, 0x74, 0x5e, 0x80, 0xfe, 0x36, 0x07, 0xb3, 0x1a, - 0x76, 0xac, 0xee, 0x55, 0x32, 0x47, 0x98, 0xd4, 0xd4, 0xe3, 0x2b, 0x8a, 0xec, 0xf9, 0x6d, 0x8e, - 0xd9, 0x45, 0x8e, 0xd1, 0xe8, 0x89, 0xa6, 0x7e, 0x55, 0x37, 0xba, 0xfa, 0x65, 0xd6, 0xd5, 0x4c, - 0x6b, 0x61, 0x82, 0xba, 0x08, 0xaa, 0x75, 0xcd, 0xc4, 0x76, 0xa3, 0x7d, 0xad, 0xe2, 0xee, 0x96, - 0x3a, 0x1d, 0x1b, 0x3b, 0x0e, 0x5b, 0xbd, 0x18, 0xf0, 0x45, 0xbd, 0x1d, 0x4e, 0x92, 0x54, 0x2e, - 0x33, 0x75, 0x90, 0xe9, 0x4f, 0x0e, 0x72, 0x96, 0xcc, 0x03, 0x3f, 0x67, 0x9e, 0xcb, 0x19, 0x26, - 0xf3, 0xc7, 0x25, 0x0a, 0xe2, 0x29, 0x9d, 0x5b, 0x60, 0xd6, 0xd4, 0xf7, 0x70, 0xe5, 0xd1, 0x9e, - 0x61, 0x63, 0x87, 0x38, 0xc6, 0x28, 0x1a, 0x9f, 0x84, 0x3e, 0x22, 0x75, 0xde, 0x5c, 0x4e, 0x62, - 0xc9, 0x74, 0x7f, 0x75, 0x04, 0xd5, 0x1f, 0xd0, 0xcf, 0x28, 0xe8, 0x43, 0x0a, 0xcc, 0x31, 0xa6, - 0x4a, 0xe6, 0x41, 0xb5, 0x83, 0x6e, 0x16, 0x8c, 0x5f, 0xdd, 0x4b, 0xf3, 0x8d, 0x5f, 0xf2, 0x82, - 0xbe, 0x57, 0x91, 0x75, 0x77, 0x1e, 0x50, 0x71, 0x52, 0x46, 0xb4, 0xe3, 0xe8, 0xb6, 0xb5, 0xcf, - 0x1c, 0x55, 0xa7, 0x35, 0xfa, 0x92, 0xe6, 0xa2, 0x1e, 0xfa, 0x65, 0x29, 0x67, 0x6a, 0xc9, 0x6a, - 0x1c, 0x13, 0x80, 0x9f, 0x50, 0x60, 0x81, 0x71, 0xd5, 0x60, 0xe7, 0x7c, 0xa4, 0x0e, 0xbc, 0x7d, - 0xbf, 0xb4, 0x21, 0x38, 0xa0, 0xfe, 0xac, 0xa4, 0xc7, 0x0c, 0x90, 0xbf, 0x2a, 0x15, 0x1c, 0x4d, - 0xba, 0x22, 0xc7, 0x04, 0xe5, 0x3b, 0x73, 0x30, 0xbb, 0xe5, 0x60, 0x9b, 0xf9, 0xed, 0xa3, 0x37, - 0xe4, 0x40, 0x59, 0xc5, 0xc2, 0x46, 0xea, 0x2b, 0xa4, 0x3d, 0x7c, 0xf9, 0xca, 0x72, 0x44, 0x3d, - 0x1b, 0x29, 0x02, 0xb6, 0xdb, 0x60, 0x81, 0x8a, 0xb4, 0xe4, 0xba, 0x9e, 0x91, 0xe8, 0x7b, 0xd3, - 0xf6, 0xa5, 0x8e, 0x63, 0xab, 0x88, 0x94, 0xe5, 0x65, 0x29, 0x7b, 0x3c, 0xad, 0xe3, 0x6d, 0x3a, - 0x9f, 0xcd, 0x69, 0x7d, 0xa9, 0xe4, 0x72, 0xfd, 0x1e, 0xa6, 0xe7, 0x57, 0xb8, 0xcc, 0x79, 0x92, - 0x79, 0xd0, 0x27, 0xf4, 0xb7, 0x52, 0xbe, 0xba, 0xf2, 0xd2, 0x49, 0xa6, 0x0b, 0xbd, 0xf1, 0x98, - 0x24, 0xa7, 0xa1, 0xe8, 0xe5, 0x20, 0xfb, 0x2f, 0x5a, 0xa5, 0x51, 0x5f, 0xbf, 0x58, 0x19, 0xbc, - 0x8c, 0x91, 0x47, 0x2f, 0x51, 0x60, 0x66, 0xc9, 0xb6, 0xf4, 0x4e, 0x5b, 0x77, 0x5c, 0xf4, 0xb5, - 0x2c, 0xcc, 0x6d, 0xea, 0x07, 0x5d, 0x4b, 0xef, 0x10, 0xff, 0xfe, 0xbe, 0xbe, 0xa0, 0x47, 0x3f, - 0xf9, 0x7d, 0x01, 0x7b, 0x15, 0x0f, 0x06, 0x06, 0x47, 0xf7, 0x32, 0x32, 0xd7, 0x35, 0x06, 0xdb, - 0x7c, 0xd9, 0x41, 0xc1, 0x4a, 0x7d, 0xbe, 0x16, 0x79, 0x9e, 0x22, 0x2c, 0xca, 0x0f, 0xc9, 0x85, - 0x1f, 0x95, 0x21, 0x79, 0x3c, 0xbb, 0xf2, 0x2f, 0x9d, 0x86, 0xc2, 0x32, 0x26, 0x56, 0xdc, 0x7f, - 0xcf, 0xc2, 0x54, 0x03, 0xbb, 0xc4, 0x82, 0xbb, 0x47, 0xf0, 0x14, 0xee, 0x90, 0x0c, 0xa1, 0x13, - 0xbb, 0xff, 0xee, 0x4d, 0xd6, 0xb9, 0xf3, 0xd6, 0xe4, 0x39, 0x81, 0x47, 0x22, 0x2d, 0x77, 0x91, - 0x95, 0x79, 0x24, 0x8f, 0xc4, 0x58, 0x52, 0xe9, 0xfb, 0x5a, 0xbd, 0x3b, 0xcb, 0x5c, 0xab, 0xb8, - 0x5e, 0xef, 0x27, 0x79, 0xfd, 0x8c, 0xf5, 0x36, 0x63, 0xcc, 0xc7, 0x38, 0x47, 0x3d, 0x0d, 0xa6, - 0xa8, 0xcc, 0xfd, 0xf9, 0x68, 0xbf, 0x9f, 0x02, 0x25, 0x41, 0xce, 0x5e, 0xfb, 0x39, 0x25, 0x5d, - 0xd4, 0xa2, 0x0b, 0x9f, 0x48, 0x0c, 0x82, 0xb9, 0x1a, 0x76, 0xaf, 0x59, 0xf6, 0x95, 0x86, 0xab, - 0xbb, 0x18, 0xfd, 0x4b, 0x16, 0x94, 0x06, 0x76, 0xf9, 0xe8, 0x27, 0x35, 0x38, 0x45, 0x2b, 0xc4, - 0x32, 0x92, 0xfe, 0x9b, 0x56, 0xe4, 0x96, 0x81, 0x42, 0xe0, 0xf2, 0x69, 0x87, 0x7f, 0x45, 0x3f, - 0x32, 0x30, 0xe8, 0x53, 0x76, 0xc0, 0xa4, 0x81, 0x49, 0x86, 0x67, 0xd0, 0x53, 0xb0, 0x08, 0x3d, - 0xfd, 0xb0, 0x94, 0x59, 0x2d, 0x47, 0xf3, 0x78, 0xba, 0x82, 0x77, 0x3e, 0x01, 0x72, 0xe5, 0x5d, - 0xdd, 0x45, 0xef, 0x52, 0x00, 0x4a, 0x9d, 0xce, 0x06, 0xf5, 0x01, 0xe7, 0x1d, 0xd2, 0x2e, 0xc0, - 0x5c, 0x7b, 0x57, 0x0f, 0x6f, 0xce, 0xa0, 0xfd, 0x81, 0x90, 0xa6, 0x3e, 0x3d, 0x74, 0x26, 0xa7, - 0x52, 0x45, 0x7d, 0x30, 0x79, 0x65, 0x30, 0xda, 0x81, 0xa3, 0xb9, 0x18, 0x0a, 0x33, 0xf6, 0x08, - 0x9d, 0xf7, 0xfb, 0x62, 0xc8, 0x5e, 0xf4, 0x1c, 0x8e, 0x91, 0x0e, 0x0e, 0xd8, 0x84, 0x09, 0x09, - 0x4f, 0x7a, 0xcb, 0x05, 0xf4, 0x88, 0xe7, 0x6b, 0x22, 0xa1, 0x6b, 0xd5, 0x4a, 0xc7, 0xf0, 0x45, - 0xcb, 0x02, 0x66, 0xa1, 0x97, 0x67, 0x92, 0xc1, 0x17, 0x2f, 0xb8, 0xe7, 0xc0, 0x3c, 0xee, 0x18, - 0x2e, 0xf6, 0x6b, 0xc9, 0x04, 0x18, 0x07, 0xb1, 0xf8, 0x03, 0x7a, 0x91, 0x74, 0xd0, 0x35, 0x22, - 0xd0, 0xc3, 0x35, 0x8a, 0x68, 0x7f, 0x72, 0x61, 0xd4, 0xe4, 0x68, 0xa6, 0x0f, 0xd6, 0x77, 0x29, - 0x70, 0xa6, 0x69, 0xed, 0xec, 0x74, 0xb1, 0x2f, 0x26, 0x4c, 0xbd, 0x33, 0x91, 0x3e, 0x4e, 0xb8, - 0xc8, 0x4e, 0x90, 0xf5, 0x88, 0x11, 0x1c, 0x25, 0xf3, 0x5e, 0xc4, 0x13, 0x53, 0xb1, 0xb3, 0x28, - 0x22, 0xae, 0x81, 0x7c, 0x46, 0xa0, 0x20, 0x17, 0xf0, 0x59, 0x9a, 0x6c, 0xfa, 0x40, 0x7c, 0x36, - 0x0b, 0xf3, 0xf4, 0x5e, 0x44, 0x5f, 0x41, 0x1f, 0x1a, 0x23, 0x00, 0xe8, 0x6b, 0x19, 0x59, 0x3f, - 0x5b, 0x22, 0x13, 0x81, 0x93, 0x08, 0x11, 0xcb, 0x05, 0x55, 0x19, 0x4a, 0x6e, 0x02, 0x37, 0x75, - 0xe6, 0x60, 0x76, 0x15, 0xfb, 0x2d, 0xcd, 0x41, 0xef, 0x4b, 0xd8, 0x13, 0x5d, 0x80, 0x39, 0x72, - 0x39, 0x58, 0x9d, 0x1d, 0x93, 0xa4, 0xab, 0x66, 0x42, 0x9a, 0x7a, 0x2b, 0xcc, 0x5f, 0xc6, 0xdb, - 0x96, 0x8d, 0xeb, 0xc2, 0x59, 0x4a, 0x31, 0x71, 0x70, 0x78, 0x3a, 0xf5, 0x76, 0x38, 0xc9, 0x1c, - 0xdd, 0x97, 0xbc, 0xb9, 0xbe, 0x6e, 0x1f, 0xb0, 0x83, 0x69, 0xfd, 0xc9, 0xe8, 0x2f, 0xf8, 0x06, - 0xb3, 0x24, 0xa2, 0x78, 0xe7, 0x61, 0xb1, 0x73, 0x95, 0x8e, 0x18, 0x9d, 0x9e, 0x01, 0xd3, 0x4c, - 0x47, 0x7c, 0x83, 0x2e, 0xae, 0x07, 0x0d, 0xf2, 0xaa, 0xcf, 0x80, 0x19, 0x4f, 0x44, 0xc4, 0x6e, - 0x60, 0x5d, 0xef, 0xb9, 0x01, 0x3f, 0x92, 0xef, 0x5a, 0x98, 0x15, 0xfd, 0x54, 0xa0, 0x33, 0x15, - 0x41, 0x67, 0x9e, 0x9a, 0x84, 0xf9, 0x89, 0xdc, 0x4f, 0x5e, 0xe4, 0xca, 0x5f, 0x3a, 0xa8, 0x76, - 0x1c, 0xb4, 0x91, 0x4c, 0x6b, 0xce, 0x03, 0x04, 0xcd, 0xcf, 0x0f, 0x9c, 0xc1, 0xa5, 0x88, 0xb1, - 0xf1, 0x63, 0x8f, 0x02, 0xf6, 0x8b, 0x83, 0xb0, 0x33, 0x5e, 0x40, 0x25, 0x8f, 0x10, 0xca, 0x70, - 0x92, 0x3e, 0x3a, 0x3f, 0x91, 0x83, 0x33, 0xc1, 0x09, 0xa7, 0x75, 0xdd, 0x09, 0x5b, 0xf6, 0xc3, - 0xc9, 0x20, 0x12, 0x8e, 0x94, 0x04, 0xcd, 0xf1, 0x34, 0xe4, 0x9d, 0xfd, 0xcb, 0x81, 0x23, 0x20, - 0x7d, 0x41, 0x6f, 0x56, 0x12, 0x8d, 0x55, 0x03, 0xf9, 0x1b, 0x73, 0x23, 0xbc, 0x13, 0x4e, 0x99, - 0xfb, 0x7b, 0x01, 0x16, 0xa4, 0xa7, 0x61, 0x3d, 0xcb, 0xe1, 0x0f, 0x62, 0x93, 0xcd, 0xc9, 0x37, - 0xd9, 0x04, 0x23, 0xa9, 0x4c, 0xa5, 0xd3, 0x57, 0x8f, 0x4f, 0xf6, 0x1d, 0x41, 0x2b, 0x27, 0x56, - 0x0a, 0x0a, 0x7f, 0x96, 0x87, 0xff, 0x9f, 0x32, 0x89, 0x7a, 0xde, 0xe1, 0x27, 0xd7, 0x12, 0xf4, - 0x84, 0xc7, 0x79, 0x6c, 0xed, 0x33, 0x59, 0x40, 0x8d, 0xd0, 0x21, 0x87, 0x81, 0xba, 0x69, 0xe3, - 0xab, 0x06, 0xbe, 0x26, 0xb8, 0x6f, 0xbd, 0x45, 0x3a, 0x0e, 0xb5, 0xa8, 0x2b, 0x87, 0x88, 0x46, - 0xaf, 0x8b, 0x0f, 0xc0, 0x45, 0x2e, 0xde, 0x74, 0xb2, 0x12, 0xd3, 0x97, 0xea, 0x1f, 0xe4, 0x60, - 0x4e, 0xc3, 0x7a, 0x27, 0xe8, 0xb8, 0xfe, 0x2f, 0xce, 0x24, 0x79, 0x16, 0xe4, 0xdc, 0x70, 0x6d, - 0xe1, 0x89, 0x87, 0x2b, 0xc2, 0xff, 0x49, 0x5e, 0xc8, 0x12, 0x03, 0xf9, 0xe9, 0x90, 0x86, 0x67, - 0x25, 0xec, 0x19, 0x45, 0xc6, 0x9e, 0xc9, 0x0d, 0xb2, 0x67, 0x6e, 0x87, 0x93, 0x5d, 0xdd, 0x71, - 0x97, 0x2f, 0x37, 0x8d, 0x3d, 0xec, 0xb8, 0xfa, 0x5e, 0x8f, 0x58, 0x2e, 0x8a, 0xd6, 0x9f, 0x2c, - 0xde, 0x5d, 0x1e, 0x7b, 0x86, 0x69, 0x50, 0x15, 0x8f, 0x1e, 0xe7, 0xf5, 0x83, 0x52, 0x07, 0x96, - 0x86, 0x95, 0x9d, 0x4c, 0x33, 0x1e, 0x1c, 0x61, 0x3d, 0xe4, 0x2c, 0xa8, 0x1b, 0x95, 0x46, 0xa3, - 0xb4, 0x4a, 0xce, 0x31, 0xf8, 0x8e, 0x2d, 0x9d, 0x0b, 0x4f, 0xf0, 0xc4, 0x47, 0x91, 0x56, 0xe7, - 0xc2, 0xf1, 0xa2, 0x78, 0x42, 0x9d, 0x85, 0x29, 0x1b, 0xf7, 0xba, 0x06, 0x76, 0x8a, 0x19, 0xf4, - 0xd5, 0x2c, 0x14, 0xb6, 0x4c, 0x1b, 0xeb, 0x1d, 0xf4, 0xdc, 0xe8, 0x6e, 0x6f, 0x44, 0xa5, 0x10, - 0x63, 0x35, 0xc5, 0xae, 0x24, 0xb2, 0x7e, 0xcb, 0x63, 0x64, 0x2c, 0xf0, 0xc9, 0x2d, 0x21, 0x46, - 0x97, 0x9a, 0x7a, 0x93, 0xbe, 0x30, 0x05, 0xf9, 0xca, 0x5e, 0xcf, 0x3d, 0xb8, 0xf0, 0x04, 0x98, - 0x6f, 0xb8, 0x36, 0xd6, 0xf7, 0xb8, 0x8d, 0x60, 0xd7, 0xba, 0x82, 0x4d, 0x7f, 0x23, 0x98, 0xbc, - 0xdc, 0x7b, 0x0f, 0x4c, 0x99, 0x56, 0x4b, 0xdf, 0x77, 0x77, 0xd5, 0x9b, 0x0f, 0x45, 0x50, 0x61, - 0xea, 0x57, 0x67, 0x21, 0xeb, 0xbe, 0x74, 0x1f, 0x99, 0x0e, 0x14, 0x4c, 0xab, 0xb4, 0xef, 0xee, - 0x2e, 0xdd, 0xf4, 0x89, 0x3f, 0x3d, 0x9f, 0xf9, 0xf4, 0x9f, 0x9e, 0xcf, 0x7c, 0xf1, 0x4f, 0xcf, - 0x67, 0xbe, 0xff, 0xcf, 0xce, 0x9f, 0xf8, 0xf4, 0x9f, 0x9d, 0x3f, 0xf1, 0xd9, 0x3f, 0x3b, 0x7f, - 0xe2, 0x5b, 0xb2, 0xbd, 0xcb, 0x97, 0x0b, 0x84, 0xca, 0xd3, 0xfe, 0xbf, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x1c, 0x26, 0x7f, 0xb9, 0x4c, 0x1c, 0x02, 0x00, + // 21542 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7b, 0x98, 0x24, 0x49, + 0x59, 0x37, 0x3a, 0x95, 0x59, 0x55, 0xdd, 0x1d, 0x7d, 0x99, 0x9c, 0xdc, 0xd9, 0x61, 0x36, 0x77, + 0x99, 0x5d, 0x67, 0x97, 0x65, 0x5d, 0x96, 0xde, 0x65, 0x41, 0x64, 0x97, 0x5d, 0x96, 0xea, 0xaa, + 0xec, 0xee, 0xda, 0xad, 0xae, 0x6a, 0xb2, 0xaa, 0x67, 0x18, 0xfd, 0x3c, 0x6d, 0x4e, 0x55, 0x74, + 0x77, 0xee, 0x54, 0x67, 0x16, 0x99, 0xd9, 0x33, 0xdb, 0x9c, 0xe7, 0x3b, 0x9f, 0x88, 0x2b, 0x20, + 0x22, 0xa2, 0xa2, 0x22, 0x72, 0x17, 0x10, 0x90, 0xfb, 0xed, 0x03, 0xe5, 0x22, 0x17, 0x41, 0x44, + 0x45, 0xf1, 0x02, 0x28, 0x47, 0xbc, 0xe3, 0x77, 0xf4, 0xf8, 0xe1, 0x51, 0x10, 0x3f, 0xd1, 0xf3, + 0xc4, 0x25, 0x33, 0x23, 0xaa, 0x2b, 0xb3, 0x22, 0xab, 0x2b, 0xab, 0x17, 0xfd, 0xfe, 0xaa, 0xca, + 0xc8, 0xc8, 0x37, 0xde, 0x78, 0x7f, 0x6f, 0x44, 0xbc, 0x11, 0xf1, 0xc6, 0x1b, 0xe0, 0x74, 0xef, + 0xe2, 0xed, 0x3d, 0xd7, 0xf1, 0x1d, 0xef, 0xf6, 0xb6, 0xb3, 0xbb, 0x6b, 0xda, 0x1d, 0x6f, 0x11, + 0x3f, 0xab, 0x53, 0xa6, 0xbd, 0xef, 0xef, 0xf7, 0xa0, 0x76, 0x53, 0xef, 0xd2, 0xf6, 0xed, 0x5d, + 0xeb, 0xe2, 0xed, 0xbd, 0x8b, 0xb7, 0xef, 0x3a, 0x1d, 0xd8, 0x0d, 0x3e, 0xc0, 0x0f, 0x34, 0xbb, + 0x76, 0x4b, 0x5c, 0xae, 0xae, 0xd3, 0x36, 0xbb, 0x9e, 0xef, 0xb8, 0x90, 0xe6, 0x3c, 0x15, 0x15, + 0x09, 0x2f, 0x43, 0xdb, 0x0f, 0x28, 0x5c, 0xb7, 0xed, 0x38, 0xdb, 0x5d, 0x48, 0xde, 0x5d, 0xdc, + 0xdb, 0xba, 0xdd, 0xf3, 0xdd, 0xbd, 0xb6, 0x4f, 0xdf, 0xde, 0xd0, 0xff, 0xb6, 0x03, 0xbd, 0xb6, + 0x6b, 0xf5, 0x7c, 0xc7, 0x25, 0x39, 0xce, 0xbe, 0xe2, 0x0b, 0xd3, 0x40, 0x36, 0x7a, 0x6d, 0xed, + 0xeb, 0x53, 0x40, 0x2e, 0xf5, 0x7a, 0xda, 0x27, 0x25, 0x00, 0x56, 0xa0, 0x7f, 0x0e, 0xba, 0x9e, + 0xe5, 0xd8, 0xda, 0x71, 0x30, 0x65, 0xc0, 0x67, 0xed, 0x41, 0xcf, 0xbf, 0x3b, 0xff, 0xfc, 0xbf, + 0x92, 0x73, 0xda, 0xeb, 0x25, 0x30, 0x6d, 0x40, 0xaf, 0xe7, 0xd8, 0x1e, 0x54, 0x9f, 0x0e, 0x0a, + 0xd0, 0x75, 0x1d, 0xf7, 0x74, 0xee, 0x86, 0xdc, 0x2d, 0xb3, 0x77, 0xde, 0xba, 0x48, 0xab, 0xbf, + 0x68, 0xf4, 0xda, 0x8b, 0xa5, 0x5e, 0x6f, 0x31, 0xa2, 0xb4, 0x18, 0x7c, 0xb4, 0xa8, 0xa3, 0x2f, + 0x0c, 0xf2, 0xa1, 0x7a, 0x1a, 0x4c, 0x5d, 0x26, 0x19, 0x4e, 0x4b, 0x37, 0xe4, 0x6e, 0x99, 0x31, + 0x82, 0x47, 0xf4, 0xa6, 0x03, 0x7d, 0xd3, 0xea, 0x7a, 0xa7, 0x65, 0xf2, 0x86, 0x3e, 0x6a, 0xaf, + 0xcd, 0x81, 0x02, 0x26, 0xa2, 0x96, 0x41, 0xbe, 0xed, 0x74, 0x20, 0x2e, 0x7e, 0xe1, 0xce, 0xdb, + 0xc5, 0x8b, 0x5f, 0x2c, 0x3b, 0x1d, 0x68, 0xe0, 0x8f, 0xd5, 0x1b, 0xc0, 0x6c, 0x20, 0x96, 0x88, + 0x0d, 0x36, 0xe9, 0xec, 0x9d, 0x20, 0x8f, 0xf2, 0xab, 0xd3, 0x20, 0x5f, 0xdf, 0xa8, 0xd5, 0x94, + 0x63, 0xea, 0x09, 0x30, 0xbf, 0x51, 0x7f, 0xa0, 0xde, 0x38, 0x5f, 0xdf, 0xd4, 0x0d, 0xa3, 0x61, + 0x28, 0x39, 0x75, 0x1e, 0xcc, 0x2c, 0x95, 0x2a, 0x9b, 0xd5, 0xfa, 0xfa, 0x46, 0x4b, 0x91, 0xb4, + 0x57, 0xca, 0x60, 0xa1, 0x09, 0xfd, 0x0a, 0xbc, 0x6c, 0xb5, 0x61, 0xd3, 0x37, 0x7d, 0xa8, 0xbd, + 0x38, 0x17, 0x0a, 0x53, 0xdd, 0x40, 0x85, 0x86, 0xaf, 0x68, 0x05, 0x9e, 0x78, 0xa0, 0x02, 0x3c, + 0x85, 0x45, 0xfa, 0xf5, 0x22, 0x93, 0x66, 0xb0, 0x74, 0xce, 0x3e, 0x1e, 0xcc, 0x32, 0xef, 0xd4, + 0x05, 0x00, 0x96, 0x4a, 0xe5, 0x07, 0x56, 0x8c, 0xc6, 0x46, 0xbd, 0xa2, 0x1c, 0x43, 0xcf, 0xcb, + 0x0d, 0x43, 0xa7, 0xcf, 0x39, 0xed, 0x9b, 0x39, 0x06, 0xcc, 0x0a, 0x0f, 0xe6, 0xe2, 0x70, 0x66, + 0x06, 0x00, 0xaa, 0xbd, 0x21, 0x04, 0x67, 0x85, 0x03, 0xe7, 0x89, 0xe9, 0xc8, 0x65, 0x0f, 0xd0, + 0xc3, 0x12, 0x98, 0x6e, 0xee, 0xec, 0xf9, 0x1d, 0xe7, 0x8a, 0xad, 0xcd, 0x84, 0xc8, 0x68, 0x7f, + 0xc7, 0xca, 0xe4, 0x69, 0xbc, 0x4c, 0x6e, 0x39, 0x58, 0x09, 0x4a, 0x21, 0x46, 0x1a, 0xaf, 0x0e, + 0xa5, 0x51, 0xe2, 0xa4, 0xf1, 0x78, 0x51, 0x42, 0xd9, 0xcb, 0xe1, 0x0b, 0xf7, 0x80, 0x42, 0xb3, + 0x67, 0xb6, 0xa1, 0xf6, 0x59, 0x19, 0xcc, 0xd5, 0xa0, 0x79, 0x19, 0x96, 0x7a, 0x3d, 0xd7, 0xb9, + 0x0c, 0xb5, 0x72, 0xa4, 0xaf, 0xa7, 0xc1, 0x94, 0x87, 0x32, 0x55, 0x3b, 0xb8, 0x06, 0x33, 0x46, + 0xf0, 0xa8, 0x9e, 0x01, 0xc0, 0xea, 0x40, 0xdb, 0xb7, 0x7c, 0x0b, 0x7a, 0xa7, 0xa5, 0x1b, 0xe4, + 0x5b, 0x66, 0x0c, 0x26, 0x45, 0xfb, 0xba, 0x24, 0xaa, 0x63, 0x98, 0x8b, 0x45, 0x96, 0x83, 0x18, + 0xa9, 0xbe, 0x4e, 0x12, 0xd1, 0xb1, 0xa1, 0xe4, 0xd2, 0xc9, 0xf6, 0x6d, 0xb9, 0xf4, 0xc2, 0x45, + 0x39, 0xea, 0x8d, 0xcd, 0xe6, 0x46, 0x79, 0x75, 0xb3, 0xb9, 0x5e, 0x2a, 0xeb, 0x0a, 0x54, 0x4f, + 0x02, 0x05, 0xff, 0xdd, 0xac, 0x36, 0x37, 0x2b, 0x7a, 0x4d, 0x6f, 0xe9, 0x15, 0x65, 0x4b, 0x55, + 0xc1, 0x82, 0xa1, 0x3f, 0x63, 0x43, 0x6f, 0xb6, 0x36, 0x97, 0x4b, 0xd5, 0x9a, 0x5e, 0x51, 0xb6, + 0xd1, 0xc7, 0xb5, 0xea, 0x5a, 0xb5, 0xb5, 0x69, 0xe8, 0xa5, 0xf2, 0xaa, 0x5e, 0x51, 0x76, 0xd4, + 0x47, 0x81, 0xab, 0xea, 0x8d, 0xcd, 0xd2, 0xfa, 0xba, 0xd1, 0x38, 0xa7, 0x6f, 0xd2, 0x2f, 0x9a, + 0x8a, 0x45, 0x0a, 0x6a, 0x6d, 0x36, 0x57, 0x4b, 0x86, 0x5e, 0x5a, 0xaa, 0xe9, 0xca, 0x83, 0xda, + 0x73, 0x65, 0x30, 0xbf, 0x66, 0x5e, 0x82, 0xcd, 0x1d, 0xd3, 0x85, 0xe6, 0xc5, 0x2e, 0xd4, 0x6e, + 0x14, 0xc0, 0x53, 0xfb, 0x2c, 0x8b, 0x97, 0xce, 0xe3, 0x75, 0xfb, 0x00, 0x01, 0x73, 0x45, 0xc4, + 0x00, 0xf6, 0xcf, 0x61, 0x33, 0x58, 0xe5, 0x00, 0x7b, 0x52, 0x4a, 0x7a, 0xe9, 0x10, 0xfb, 0xc1, + 0x47, 0x00, 0x62, 0xda, 0x17, 0xf3, 0x60, 0xa1, 0x6a, 0x5f, 0xb6, 0x7c, 0xb8, 0x02, 0x6d, 0xe8, + 0xa2, 0x71, 0xe0, 0x95, 0x39, 0x91, 0x76, 0xd5, 0x02, 0xc0, 0xc2, 0xdf, 0xb5, 0xf6, 0x7b, 0x10, + 0x57, 0x6f, 0xb0, 0xbc, 0x78, 0xe2, 0xe1, 0x10, 0x51, 0x0d, 0xbf, 0x35, 0x18, 0x3a, 0x67, 0x6f, + 0x04, 0x20, 0x7a, 0xa3, 0x02, 0x50, 0x5c, 0x83, 0xbb, 0x17, 0xa1, 0xab, 0x1c, 0x53, 0x67, 0x40, + 0x61, 0x05, 0x7d, 0xa9, 0xe4, 0xb4, 0xd7, 0xcb, 0x8c, 0x0a, 0x2c, 0xf3, 0x2a, 0x70, 0x87, 0x08, + 0x0b, 0x83, 0x46, 0xfa, 0xeb, 0xc0, 0x0c, 0xe1, 0xa3, 0x6c, 0x75, 0x28, 0x5a, 0x51, 0x82, 0x7a, + 0x13, 0x98, 0x27, 0x0f, 0xcb, 0x56, 0x17, 0x3e, 0x00, 0xf7, 0xe9, 0x98, 0xcf, 0x27, 0x6a, 0x3f, + 0x1a, 0x36, 0xfc, 0x2a, 0xa7, 0x47, 0xdf, 0x95, 0x96, 0xa9, 0x74, 0x8a, 0xf4, 0xd2, 0x47, 0x42, + 0xd3, 0x3f, 0xd0, 0xc2, 0x2d, 0xed, 0x5b, 0x12, 0x98, 0x6d, 0xfa, 0x4e, 0x0f, 0x35, 0x17, 0xcb, + 0xde, 0x16, 0x6b, 0xdf, 0x9f, 0x66, 0xdb, 0x77, 0x99, 0x07, 0xf7, 0xf1, 0x03, 0xe4, 0xc8, 0x14, + 0x10, 0xd3, 0xba, 0xbf, 0x1e, 0xb6, 0xee, 0x65, 0x0e, 0x95, 0x3b, 0x53, 0x51, 0xfb, 0x36, 0x6c, + 0xdb, 0x2f, 0x95, 0x81, 0x12, 0xa8, 0x99, 0x5f, 0xde, 0x73, 0x5d, 0x68, 0xfb, 0x62, 0x20, 0xfc, + 0x11, 0x0b, 0xc2, 0x2a, 0x0f, 0xc2, 0x9d, 0x09, 0xca, 0x1c, 0x94, 0x92, 0x61, 0x1b, 0xfb, 0x68, + 0x88, 0xe6, 0x03, 0x1c, 0x9a, 0xdf, 0x9d, 0x9e, 0xad, 0x74, 0x90, 0xae, 0x8e, 0x80, 0xe8, 0x49, + 0xa0, 0xa0, 0xf1, 0xb0, 0xdc, 0xaa, 0x9e, 0xd3, 0x37, 0xab, 0xf5, 0x73, 0xd5, 0x96, 0xae, 0x40, + 0xed, 0x25, 0x72, 0xd4, 0xe7, 0xfa, 0xb8, 0x53, 0x13, 0x43, 0xe5, 0x8b, 0xd2, 0x68, 0xfd, 0x1e, + 0x29, 0x63, 0x22, 0x98, 0x88, 0xf7, 0x7b, 0x03, 0x99, 0x4a, 0x87, 0xc8, 0xfd, 0x23, 0x20, 0x72, + 0x0a, 0xa8, 0xd5, 0xfa, 0xb9, 0x52, 0xad, 0x5a, 0x21, 0x6d, 0x6c, 0xb3, 0x75, 0x61, 0x1d, 0x61, + 0xf2, 0x93, 0x32, 0x98, 0x23, 0xac, 0x19, 0xf0, 0xb2, 0x73, 0x49, 0xd0, 0x18, 0xf9, 0x72, 0x4a, + 0xe3, 0x91, 0x2d, 0x21, 0xa6, 0xb7, 0xfa, 0x91, 0x14, 0xc6, 0x63, 0x02, 0xb9, 0x47, 0xd2, 0x08, + 0x72, 0xa0, 0x6b, 0xda, 0x1e, 0xd0, 0x83, 0x0d, 0x1c, 0x41, 0x3e, 0x9e, 0x0f, 0xec, 0x81, 0x73, + 0x16, 0xbc, 0xa2, 0xad, 0x45, 0x98, 0x70, 0x6a, 0x9b, 0x1b, 0xaa, 0xb6, 0xd2, 0x20, 0xb5, 0xfd, + 0x4b, 0xd6, 0x8e, 0x58, 0xe2, 0xd1, 0xbb, 0x2d, 0x56, 0xdc, 0x88, 0x93, 0xf8, 0xd5, 0x82, 0x40, + 0x51, 0x24, 0xde, 0x5a, 0xba, 0x0e, 0xcc, 0xe0, 0xbf, 0x75, 0x73, 0x17, 0xd2, 0x36, 0x14, 0x25, + 0xa8, 0x67, 0xc1, 0x1c, 0xc9, 0xd8, 0x76, 0x6c, 0x54, 0x9f, 0x3c, 0xce, 0xc0, 0xa5, 0x21, 0x10, + 0xdb, 0x2e, 0x34, 0x7d, 0xc7, 0xc5, 0x34, 0x0a, 0x04, 0x44, 0x26, 0x49, 0xbd, 0x0d, 0x9c, 0xb0, + 0x3c, 0xdc, 0xaa, 0x36, 0x3c, 0xe8, 0x12, 0x66, 0x4f, 0x17, 0x6f, 0xc8, 0xdd, 0x32, 0x6d, 0x1c, + 0x7c, 0xa1, 0x7d, 0x35, 0x6c, 0xb3, 0x3a, 0xa7, 0x67, 0x4f, 0x48, 0x53, 0xf1, 0x74, 0x5a, 0x76, + 0x79, 0xb4, 0x1e, 0x94, 0xf4, 0x9b, 0x9b, 0x48, 0x37, 0x96, 0xf1, 0xc2, 0x00, 0xa4, 0xad, 0x18, + 0xa5, 0xa2, 0xbc, 0xe5, 0x46, 0xbd, 0xa5, 0xd7, 0x5b, 0xca, 0xd6, 0x40, 0xfd, 0xdb, 0xd6, 0x5e, + 0x97, 0x07, 0xf9, 0xfb, 0x1d, 0xcb, 0xd6, 0x1e, 0xce, 0x71, 0x0a, 0x64, 0x43, 0xff, 0x8a, 0xe3, + 0x5e, 0x0a, 0x9b, 0x75, 0x94, 0x90, 0x8c, 0x64, 0xa4, 0x78, 0xf2, 0x50, 0xc5, 0xcb, 0x0f, 0x52, + 0xbc, 0x9f, 0x60, 0x15, 0xef, 0x1e, 0x5e, 0xf1, 0x6e, 0x1e, 0x20, 0x7f, 0xc4, 0x7c, 0x4c, 0x77, + 0xf1, 0xa9, 0xb0, 0xbb, 0xb8, 0x8f, 0x83, 0xf1, 0x71, 0x62, 0x64, 0xd2, 0x01, 0xf8, 0xa5, 0x4c, + 0xbb, 0x89, 0x41, 0x50, 0x6f, 0xc7, 0x40, 0xbd, 0x33, 0xa0, 0x07, 0xb1, 0x0e, 0x76, 0x34, 0x0f, + 0x1e, 0xec, 0x54, 0x2e, 0xa9, 0x57, 0x83, 0x13, 0x95, 0xea, 0xf2, 0xb2, 0x6e, 0xe8, 0xf5, 0xd6, + 0x66, 0x5d, 0x6f, 0x9d, 0x6f, 0x18, 0x0f, 0x28, 0x5d, 0xed, 0xb5, 0x32, 0x00, 0x48, 0x42, 0x65, + 0xd3, 0x6e, 0xc3, 0xae, 0x58, 0xff, 0xff, 0xff, 0x4a, 0xe9, 0x7a, 0x90, 0x88, 0x7e, 0x0c, 0x9c, + 0xaf, 0x90, 0xc4, 0x5b, 0x65, 0x2c, 0xb1, 0x74, 0xa0, 0xbe, 0xf9, 0x91, 0x30, 0x7b, 0xb8, 0x0a, + 0x1c, 0x0f, 0xe8, 0xd1, 0xec, 0x83, 0x17, 0x0d, 0xde, 0x9e, 0x07, 0x0b, 0x14, 0x96, 0x60, 0x15, + 0xe8, 0xf9, 0x42, 0xd3, 0x55, 0x0d, 0x4c, 0xd3, 0x45, 0x9f, 0x60, 0x30, 0x08, 0x9f, 0xd5, 0x15, + 0x30, 0xdb, 0x83, 0xee, 0xae, 0xe5, 0x79, 0x96, 0x63, 0x93, 0xe5, 0xdc, 0x85, 0x3b, 0x1f, 0x13, + 0x4a, 0x1c, 0xaf, 0x7c, 0x2f, 0xae, 0x9b, 0xae, 0x6f, 0xb5, 0xad, 0x9e, 0x69, 0xfb, 0xeb, 0x51, + 0x66, 0x83, 0xfd, 0x12, 0x19, 0x76, 0xa9, 0x0c, 0x34, 0xbe, 0x26, 0x31, 0x2a, 0xf1, 0x2b, 0x29, + 0x26, 0x95, 0x89, 0x04, 0xd3, 0xa9, 0xc5, 0x27, 0x33, 0x55, 0x8b, 0x01, 0x78, 0x6f, 0xab, 0xd7, + 0x80, 0xab, 0xab, 0xf5, 0x72, 0xc3, 0x30, 0xf4, 0x72, 0x6b, 0x73, 0x5d, 0x37, 0xd6, 0xaa, 0xcd, + 0x66, 0xb5, 0x51, 0x6f, 0x1e, 0xa6, 0xb5, 0x6b, 0x9f, 0x91, 0x43, 0x8d, 0xa9, 0xc0, 0x76, 0xd7, + 0xb2, 0xa1, 0x76, 0xdf, 0x21, 0x15, 0x86, 0x5f, 0x33, 0x14, 0xc7, 0x99, 0x96, 0x1f, 0x83, 0xf3, + 0x6b, 0xd2, 0xe3, 0x3c, 0x98, 0xe0, 0x7f, 0xe0, 0xe6, 0xff, 0x65, 0x19, 0x9c, 0x60, 0x1a, 0xa2, + 0x01, 0x77, 0xc7, 0xb6, 0x0e, 0xfc, 0x83, 0x6c, 0xdb, 0xad, 0xf2, 0x98, 0x0e, 0xb2, 0xbd, 0x0f, + 0xb0, 0x11, 0x03, 0xeb, 0x9b, 0x43, 0x58, 0x6b, 0x1c, 0xac, 0x4f, 0x19, 0x81, 0x66, 0x3a, 0x64, + 0xdf, 0x91, 0x29, 0xb2, 0xd7, 0x80, 0xab, 0xd7, 0x4b, 0x46, 0xab, 0x5a, 0xae, 0xae, 0x97, 0xd0, + 0x38, 0xca, 0x0c, 0xd9, 0x31, 0xc6, 0x3d, 0x0f, 0xfa, 0x40, 0x7c, 0x3f, 0x92, 0x07, 0xd7, 0x0d, + 0xee, 0x68, 0xcb, 0x3b, 0xa6, 0xbd, 0x0d, 0x35, 0x4b, 0x04, 0xea, 0x0a, 0x98, 0x6a, 0xe3, 0xec, + 0x04, 0x67, 0x76, 0xe3, 0x2f, 0xa1, 0x2f, 0x27, 0x25, 0x18, 0xc1, 0xa7, 0xda, 0xbb, 0x59, 0x85, + 0x68, 0xf1, 0x0a, 0xf1, 0xb4, 0x64, 0xf0, 0x0e, 0xf0, 0x1d, 0xa3, 0x1b, 0x9f, 0x0b, 0x75, 0xe3, + 0x3c, 0xa7, 0x1b, 0xe5, 0xc3, 0x91, 0x4f, 0xa7, 0x26, 0xbf, 0xf1, 0x48, 0xe8, 0x00, 0x62, 0xb5, + 0xc9, 0x8a, 0x1f, 0x15, 0x06, 0x76, 0xf7, 0xaf, 0x92, 0x41, 0xb1, 0x02, 0xbb, 0xd0, 0x17, 0x9c, + 0xc1, 0xff, 0xbd, 0x24, 0xba, 0x9d, 0x46, 0x60, 0x20, 0xb4, 0xe3, 0xd7, 0x52, 0x7c, 0x6b, 0x17, + 0x7a, 0xbe, 0xb9, 0xdb, 0xc3, 0xa2, 0x96, 0x8d, 0x28, 0x41, 0xfb, 0x21, 0x49, 0x64, 0xb3, 0x2d, + 0xa1, 0x98, 0xff, 0x18, 0xab, 0xc2, 0x9f, 0x97, 0xc0, 0x74, 0x13, 0xfa, 0x0d, 0xb7, 0x03, 0x5d, + 0xad, 0x19, 0x61, 0x74, 0x03, 0x98, 0xc5, 0xa0, 0xa0, 0x69, 0x66, 0x88, 0x13, 0x9b, 0xa4, 0xde, + 0x0c, 0x16, 0xc2, 0x47, 0xfc, 0x39, 0xed, 0xc6, 0xfb, 0x52, 0xb5, 0xaf, 0xe5, 0x44, 0x7d, 0x00, + 0xe8, 0xa2, 0x2f, 0xe5, 0x26, 0xa6, 0x95, 0x8a, 0xed, 0xe7, 0x27, 0x92, 0xca, 0x7e, 0x9b, 0xf4, + 0x9d, 0x12, 0x00, 0x1b, 0xb6, 0x17, 0xc8, 0xf5, 0x71, 0x29, 0xe4, 0xaa, 0xfd, 0x53, 0x2e, 0xdd, + 0x2c, 0x26, 0x2a, 0x27, 0x46, 0x62, 0xbf, 0x90, 0x62, 0x6d, 0x21, 0x96, 0xd8, 0x04, 0xb6, 0x96, + 0x8f, 0x83, 0xe2, 0x79, 0xb3, 0xdb, 0x85, 0xbe, 0xf6, 0x4a, 0x19, 0x14, 0xcb, 0x2e, 0x34, 0x7d, + 0xa8, 0xc1, 0x48, 0x74, 0x1a, 0x98, 0x76, 0x1d, 0xc7, 0x5f, 0x37, 0xfd, 0x1d, 0x2a, 0xb7, 0xf0, + 0x59, 0x7d, 0x0a, 0x78, 0xd4, 0xd6, 0x5e, 0xb7, 0xeb, 0xc3, 0x87, 0xfc, 0x75, 0xd7, 0xda, 0x35, + 0xdd, 0xfd, 0x9a, 0x69, 0x6f, 0xef, 0x99, 0xdb, 0x90, 0xb2, 0x17, 0xf7, 0x9a, 0x3a, 0xaa, 0xfc, + 0x12, 0xdb, 0xf1, 0xdc, 0xc7, 0x0b, 0xfd, 0x3b, 0x39, 0x39, 0x11, 0x16, 0x17, 0x09, 0x7b, 0x31, + 0x3d, 0x8f, 0x06, 0xa6, 0x77, 0x6d, 0xb8, 0xeb, 0xd8, 0x56, 0x3b, 0xb0, 0x56, 0x83, 0x67, 0xed, + 0x63, 0x21, 0x1a, 0x4b, 0x1c, 0x1a, 0x8b, 0xc2, 0xa5, 0xa4, 0x83, 0xa2, 0x39, 0x42, 0xbf, 0x73, + 0x3d, 0xb8, 0x96, 0x74, 0x23, 0x9b, 0xad, 0xc6, 0x66, 0xd9, 0xd0, 0x4b, 0x2d, 0x7d, 0xb3, 0xd6, + 0x28, 0x97, 0x6a, 0x9b, 0x86, 0xbe, 0xde, 0x50, 0x20, 0x9a, 0x9d, 0x4f, 0x19, 0xb0, 0xed, 0x5c, + 0x86, 0xae, 0xf6, 0x9c, 0x9c, 0x18, 0x44, 0x09, 0x42, 0x49, 0x82, 0x4f, 0x16, 0x81, 0xef, 0x27, + 0x84, 0xfd, 0x8c, 0xa8, 0x60, 0x29, 0xf3, 0x31, 0x2d, 0xe6, 0xe3, 0x42, 0x7d, 0x4c, 0x22, 0xa9, + 0x47, 0x00, 0x48, 0xff, 0x28, 0x81, 0xa9, 0xb2, 0x63, 0x5f, 0x86, 0xae, 0xcf, 0x4e, 0xb2, 0x58, + 0x1c, 0x72, 0x7d, 0x38, 0x9c, 0x06, 0x53, 0xd0, 0xf6, 0x5d, 0xa7, 0x17, 0xcc, 0xb2, 0x82, 0x47, + 0xed, 0x8d, 0x69, 0x25, 0x4c, 0x4b, 0x8e, 0x5f, 0x9b, 0x1d, 0x5c, 0x10, 0xc7, 0x9e, 0xdc, 0xd7, + 0x76, 0x5e, 0x9b, 0x06, 0x97, 0xc1, 0x0c, 0x64, 0xdf, 0x8f, 0x7d, 0x45, 0x06, 0xf3, 0xa4, 0xdd, + 0x36, 0x21, 0x36, 0x0b, 0xb5, 0x06, 0xbb, 0xce, 0xd9, 0x27, 0xfc, 0xd5, 0x63, 0x9c, 0xf8, 0x8b, + 0x66, 0xaf, 0x17, 0xae, 0x90, 0xaf, 0x1e, 0x33, 0xe8, 0x33, 0x51, 0xf3, 0xa5, 0x22, 0xc8, 0x9b, + 0x7b, 0xfe, 0x8e, 0xf6, 0x2d, 0xe1, 0x19, 0x2f, 0xd7, 0x8f, 0x50, 0x7e, 0x62, 0x20, 0x39, 0x09, + 0x0a, 0xbe, 0x73, 0x09, 0x06, 0x72, 0x20, 0x0f, 0x08, 0x0e, 0xb3, 0xd7, 0x6b, 0xe1, 0x17, 0x14, + 0x8e, 0xe0, 0x19, 0x19, 0x58, 0x66, 0xbb, 0xed, 0xec, 0xd9, 0x7e, 0x35, 0x58, 0x25, 0x8f, 0x12, + 0xb4, 0x2f, 0x08, 0x6d, 0x43, 0x09, 0x30, 0x98, 0x0e, 0xb2, 0x8b, 0x23, 0x34, 0xa5, 0x45, 0x70, + 0x6b, 0x69, 0x7d, 0x7d, 0xb3, 0xd5, 0x78, 0x40, 0xaf, 0x47, 0xd6, 0xee, 0x66, 0xb5, 0xbe, 0xd9, + 0x5a, 0xd5, 0x37, 0xcb, 0x1b, 0x06, 0x5e, 0x9c, 0x2c, 0x95, 0xcb, 0x8d, 0x8d, 0x7a, 0x4b, 0x81, + 0xda, 0x5b, 0x25, 0x30, 0x57, 0xee, 0x3a, 0x5e, 0x88, 0xf0, 0xf5, 0x11, 0xc2, 0xa1, 0x18, 0x73, + 0x8c, 0x18, 0xb5, 0xff, 0x95, 0x13, 0xf5, 0x93, 0x09, 0x04, 0xc2, 0x90, 0x8f, 0xe9, 0xa5, 0xde, + 0x28, 0xe4, 0x27, 0x33, 0x9c, 0x5e, 0xf6, 0x4d, 0xe2, 0xb3, 0xcb, 0x60, 0xaa, 0x44, 0x14, 0x43, + 0xfb, 0x93, 0x1c, 0x28, 0x96, 0x1d, 0x7b, 0xcb, 0xda, 0x46, 0x16, 0x24, 0xb4, 0xcd, 0x8b, 0x5d, + 0x58, 0x31, 0x7d, 0xf3, 0xb2, 0x05, 0xaf, 0xe0, 0x0a, 0x4c, 0x1b, 0x7d, 0xa9, 0x88, 0x29, 0x9a, + 0x02, 0x2f, 0xee, 0x6d, 0x63, 0xa6, 0xa6, 0x0d, 0x36, 0x09, 0x8d, 0x1f, 0xe4, 0x71, 0xdd, 0x85, + 0x2e, 0xec, 0x42, 0xd3, 0x83, 0x68, 0x2e, 0x66, 0xc3, 0x2e, 0x56, 0xda, 0x69, 0x23, 0xee, 0xb5, + 0x7a, 0x16, 0xcc, 0x91, 0x57, 0xd8, 0xfe, 0xf1, 0xb0, 0x1a, 0x4f, 0x1b, 0x5c, 0x9a, 0xfa, 0x78, + 0x50, 0x80, 0x0f, 0xf9, 0xae, 0x79, 0xba, 0x83, 0xf1, 0x7a, 0xd4, 0x22, 0x71, 0x94, 0x5d, 0x0c, + 0x1c, 0x65, 0x17, 0x9b, 0xd8, 0x8d, 0xd6, 0x20, 0xb9, 0xb4, 0xff, 0x39, 0x1d, 0x5a, 0x2f, 0x9f, + 0x97, 0x23, 0xc5, 0x50, 0x41, 0xde, 0x36, 0x77, 0x21, 0xd5, 0x0b, 0xfc, 0x5f, 0xbd, 0x15, 0x1c, + 0x37, 0x2f, 0x9b, 0xbe, 0xe9, 0xd6, 0x9c, 0xb6, 0xd9, 0xc5, 0xc3, 0x66, 0xd0, 0xf2, 0xfb, 0x5f, + 0xe0, 0x4d, 0x2b, 0xdf, 0x71, 0x21, 0xce, 0x15, 0x6c, 0x5a, 0x05, 0x09, 0x88, 0xba, 0xd5, 0x76, + 0x6c, 0xcc, 0xbf, 0x6c, 0xe0, 0xff, 0x48, 0x2a, 0x1d, 0xcb, 0x43, 0x15, 0xc1, 0x54, 0xea, 0x64, + 0x3f, 0xa5, 0xb9, 0x6f, 0xb7, 0xf1, 0x86, 0xd5, 0xb4, 0x11, 0xf7, 0x5a, 0x5d, 0x02, 0xb3, 0x74, + 0xf7, 0x65, 0x0d, 0xe9, 0x55, 0x11, 0xeb, 0xd5, 0x0d, 0xbc, 0x1b, 0x22, 0xc1, 0x73, 0xb1, 0x1e, + 0xe5, 0x33, 0xd8, 0x8f, 0xd4, 0xa7, 0x83, 0x6b, 0xe9, 0x63, 0x79, 0xcf, 0xf3, 0x9d, 0x5d, 0x02, + 0xfa, 0xb2, 0xd5, 0x25, 0x35, 0x98, 0xc2, 0x35, 0x48, 0xca, 0xa2, 0xde, 0x09, 0x4e, 0xf6, 0x5c, + 0xb8, 0x05, 0xdd, 0x0b, 0xe6, 0xee, 0xde, 0x43, 0x2d, 0xd7, 0xb4, 0xbd, 0x9e, 0xe3, 0xfa, 0xa7, + 0xa7, 0x31, 0xf3, 0x03, 0xdf, 0xa9, 0xb7, 0x81, 0x13, 0x0f, 0x7a, 0x8e, 0x5d, 0xea, 0x59, 0x35, + 0xcb, 0xf3, 0xa1, 0x5d, 0xea, 0x74, 0xdc, 0xd3, 0x33, 0xb8, 0xac, 0x83, 0x2f, 0xd4, 0x9b, 0xc0, + 0xfc, 0x83, 0x8e, 0x65, 0x37, 0x7d, 0x17, 0x9a, 0xbb, 0x1b, 0x6e, 0xf7, 0x34, 0x20, 0x1b, 0x44, + 0x5c, 0x22, 0xed, 0x7c, 0xa7, 0x41, 0x91, 0x40, 0xa2, 0xbd, 0xb8, 0x20, 0xec, 0xd5, 0x4c, 0x85, + 0x94, 0x68, 0x2d, 0xde, 0x01, 0xa6, 0x68, 0xaf, 0x89, 0xc1, 0x9f, 0xbd, 0xf3, 0x54, 0xdf, 0x02, + 0x09, 0xa5, 0x62, 0x04, 0xd9, 0xd4, 0x27, 0x82, 0x62, 0x1b, 0x8b, 0x0a, 0xeb, 0xc1, 0xec, 0x9d, + 0xd7, 0x0e, 0x2e, 0x14, 0x67, 0x31, 0x68, 0x56, 0xed, 0x8b, 0xb2, 0x90, 0x23, 0x74, 0x12, 0xc7, + 0xe9, 0x7a, 0x8a, 0xaf, 0x4a, 0x23, 0x74, 0xc5, 0xb7, 0x81, 0x5b, 0x68, 0x3f, 0x4b, 0x6d, 0x9a, + 0xca, 0xe6, 0xd2, 0x46, 0x30, 0xab, 0x45, 0x96, 0x4e, 0xb3, 0x55, 0x32, 0x5a, 0x9b, 0xf5, 0x46, + 0x05, 0xcd, 0x86, 0x6f, 0x05, 0x37, 0x0f, 0xc9, 0xad, 0xb7, 0x36, 0xeb, 0xa5, 0x35, 0x5d, 0xd9, + 0xe2, 0xed, 0xa5, 0x66, 0xab, 0xb1, 0xbe, 0x69, 0x6c, 0xd4, 0xeb, 0xd5, 0xfa, 0x0a, 0x21, 0x86, + 0x0c, 0xd4, 0x53, 0x51, 0x86, 0xf3, 0x46, 0xb5, 0xa5, 0x6f, 0x96, 0x1b, 0xf5, 0xe5, 0xea, 0x8a, + 0x62, 0x0d, 0x33, 0xb6, 0x1e, 0x54, 0x6f, 0x00, 0xd7, 0x71, 0x9c, 0x54, 0x1b, 0x75, 0x34, 0x45, + 0x2f, 0x97, 0xea, 0x65, 0x1d, 0xcd, 0xc7, 0x2f, 0xa9, 0x1a, 0xb8, 0x9a, 0x90, 0xdb, 0x5c, 0xae, + 0xd6, 0xd8, 0x5d, 0xb5, 0x4f, 0xe7, 0xd4, 0xd3, 0xe0, 0x2a, 0xf6, 0x1d, 0xf5, 0x89, 0x50, 0x7e, + 0x3d, 0xa7, 0xde, 0x04, 0xae, 0xe7, 0xbe, 0x22, 0x1b, 0x64, 0x9b, 0xd5, 0xca, 0xe6, 0x5a, 0xb5, + 0xb9, 0x56, 0x6a, 0x95, 0x57, 0x95, 0xcf, 0xe0, 0xe9, 0x4b, 0x68, 0x8f, 0x33, 0xde, 0xc9, 0x2f, + 0x65, 0xed, 0x84, 0x12, 0xaf, 0xa8, 0x8f, 0x1b, 0x08, 0x7b, 0xb2, 0x5d, 0xfc, 0xc9, 0x70, 0xc4, + 0xa9, 0x70, 0x2a, 0x74, 0x47, 0x0a, 0x5a, 0xe9, 0x74, 0xa8, 0x35, 0x82, 0x0a, 0xdd, 0x00, 0xae, + 0xab, 0xeb, 0x04, 0x29, 0x43, 0x2f, 0x37, 0xce, 0xe9, 0xc6, 0xe6, 0xf9, 0x52, 0xad, 0xa6, 0xb7, + 0x36, 0x97, 0xab, 0x46, 0xb3, 0xa5, 0x6c, 0x69, 0xff, 0x24, 0x85, 0xcb, 0x52, 0x8c, 0xb4, 0xfe, + 0x44, 0x4a, 0xdb, 0xac, 0x13, 0x97, 0x9f, 0xbe, 0x0b, 0x14, 0x3d, 0xdf, 0xf4, 0xf7, 0x3c, 0xda, + 0xaa, 0x1f, 0x3d, 0xb8, 0x55, 0x2f, 0x36, 0x71, 0x26, 0x83, 0x66, 0xd6, 0xbe, 0x98, 0x4b, 0xd3, + 0x4c, 0xc7, 0xb0, 0x32, 0x65, 0x8d, 0x20, 0xe2, 0x33, 0x40, 0x0b, 0xb4, 0xbd, 0xda, 0xdc, 0x2c, + 0xd5, 0x0c, 0xbd, 0x54, 0xb9, 0x10, 0xae, 0x47, 0x41, 0xf5, 0x6a, 0x70, 0x62, 0xa3, 0x5e, 0x5a, + 0xaa, 0xe9, 0xb8, 0xb9, 0x34, 0xea, 0x75, 0xbd, 0x8c, 0xe4, 0xfe, 0x43, 0x78, 0xf7, 0x07, 0x59, + 0xe5, 0x98, 0x6f, 0x64, 0x39, 0x31, 0xf2, 0xff, 0x2b, 0x61, 0x37, 0xb7, 0x48, 0xc3, 0x58, 0x5a, + 0xe3, 0xc5, 0xe1, 0x0b, 0x42, 0x9e, 0x6d, 0x42, 0x9c, 0xa4, 0xc3, 0xe3, 0xfb, 0x47, 0xc0, 0xe3, + 0x6a, 0x70, 0x82, 0xc5, 0x03, 0x7b, 0xb8, 0xc5, 0xc3, 0xf0, 0xc7, 0x32, 0x98, 0x5a, 0xb3, 0xb6, + 0xb1, 0x7b, 0xf1, 0x5e, 0x64, 0xa0, 0x2c, 0x00, 0x29, 0xf4, 0xde, 0x91, 0xac, 0x0e, 0x37, 0x99, + 0x97, 0xc4, 0xd7, 0x5b, 0x84, 0x26, 0xec, 0x5f, 0x4c, 0xdd, 0x33, 0x51, 0x86, 0x63, 0x7a, 0xa6, + 0x17, 0x48, 0x69, 0x7a, 0xa6, 0xc1, 0xb4, 0x52, 0xc1, 0x84, 0x4c, 0x07, 0x17, 0x3e, 0x6b, 0xcf, + 0x72, 0x61, 0x07, 0x9b, 0x89, 0xb8, 0xde, 0xb2, 0xc1, 0x27, 0x9e, 0x75, 0x0f, 0x07, 0x26, 0xeb, + 0x65, 0x33, 0x07, 0xa6, 0xc3, 0xd1, 0x04, 0x6f, 0xf8, 0xa0, 0x97, 0x7a, 0xbd, 0xb1, 0xb1, 0xb2, + 0xba, 0xb9, 0x6c, 0xe8, 0x3a, 0x5d, 0x22, 0xde, 0xd6, 0xde, 0x25, 0x81, 0x79, 0x5a, 0x43, 0xea, + 0x3d, 0x71, 0x7d, 0x2c, 0xc8, 0x14, 0x8e, 0x7f, 0x67, 0xa7, 0x27, 0x2b, 0x3c, 0x1c, 0x4f, 0x48, + 0x12, 0x61, 0xa2, 0xfb, 0xc4, 0x9b, 0xc2, 0x26, 0x74, 0x3f, 0x07, 0xca, 0x93, 0x53, 0x53, 0xcc, + 0x7e, 0x8a, 0xf2, 0x62, 0x00, 0x8a, 0x4d, 0xd8, 0x85, 0x6d, 0x5f, 0xfb, 0x90, 0x3c, 0x72, 0x9b, + 0x88, 0x33, 0xb7, 0xe5, 0x54, 0xe6, 0x76, 0x3e, 0x03, 0x73, 0xbb, 0x30, 0xba, 0xb9, 0x5d, 0x4c, + 0x6b, 0x6e, 0x4f, 0xc5, 0x99, 0xdb, 0x09, 0xbd, 0xc6, 0x74, 0x62, 0xaf, 0xd1, 0x67, 0xa8, 0x1b, + 0x35, 0x6a, 0xd2, 0xf3, 0x89, 0x54, 0x99, 0x3f, 0x51, 0x4c, 0x3b, 0x8e, 0x13, 0xe0, 0x8f, 0xd6, + 0x3c, 0xff, 0xb1, 0x42, 0x9a, 0x71, 0x7f, 0x20, 0xc7, 0xe9, 0x5a, 0xc9, 0x2b, 0xf2, 0x19, 0x2c, + 0x3a, 0xaa, 0x37, 0x82, 0xeb, 0xa3, 0xe7, 0x4d, 0xfd, 0x99, 0xd5, 0x66, 0xab, 0x89, 0x6d, 0xf2, + 0x72, 0xc3, 0x30, 0x36, 0xd6, 0xc9, 0x76, 0xd5, 0x29, 0xa0, 0x46, 0x54, 0x8c, 0x8d, 0x3a, 0xb1, + 0xc0, 0xb7, 0x79, 0xea, 0xcb, 0xd5, 0x7a, 0x65, 0x33, 0x1c, 0xd5, 0xea, 0xcb, 0x0d, 0x65, 0x47, + 0x5d, 0x04, 0xb7, 0x32, 0xd4, 0x71, 0x07, 0x48, 0x4a, 0x28, 0xd5, 0x2b, 0x9b, 0x6b, 0x75, 0x7d, + 0xad, 0x51, 0xaf, 0x96, 0x71, 0x7a, 0x53, 0x6f, 0x29, 0x16, 0x32, 0x05, 0xfb, 0x6c, 0xfe, 0xa6, + 0x5e, 0x32, 0xca, 0xab, 0xba, 0x41, 0x8a, 0x7c, 0x50, 0xbd, 0x19, 0x9c, 0x2d, 0xd5, 0x1b, 0x2d, + 0x94, 0x52, 0xaa, 0x5f, 0x68, 0x5d, 0x58, 0xd7, 0x37, 0xd7, 0x8d, 0x46, 0x59, 0x6f, 0x36, 0xd1, + 0x48, 0x4a, 0x67, 0x08, 0x4a, 0x57, 0x7d, 0x1a, 0xb8, 0x9b, 0x61, 0x4d, 0x6f, 0x61, 0xdf, 0x88, + 0xb5, 0x06, 0x76, 0x8f, 0xab, 0xe8, 0x9b, 0xab, 0xa5, 0xe6, 0x66, 0xb5, 0x5e, 0x6e, 0xac, 0xad, + 0x97, 0x5a, 0x55, 0x34, 0xe0, 0xae, 0x1b, 0x8d, 0x56, 0x63, 0xf3, 0x9c, 0x6e, 0x34, 0xab, 0x8d, + 0xba, 0x62, 0xa3, 0x2a, 0x33, 0x23, 0x74, 0x60, 0x29, 0x39, 0xea, 0x75, 0xe0, 0x74, 0x90, 0x5e, + 0x6b, 0x20, 0x41, 0x33, 0x73, 0x86, 0x1e, 0x6b, 0x67, 0x35, 0x5b, 0x0d, 0x83, 0xcc, 0x1a, 0xd6, + 0xaa, 0x2b, 0x06, 0x9a, 0xea, 0x28, 0xcf, 0xca, 0x74, 0x4e, 0xf1, 0x2f, 0x12, 0xc8, 0x37, 0x7d, + 0xa7, 0xa7, 0x7d, 0x67, 0xd4, 0x1d, 0x9e, 0x01, 0xc0, 0xc5, 0xae, 0x10, 0x15, 0xd3, 0x37, 0xe9, + 0x6a, 0x0d, 0x93, 0xa2, 0xfd, 0x9a, 0xf0, 0xfe, 0x6d, 0x64, 0x75, 0x39, 0xbd, 0x98, 0xe1, 0xe3, + 0x9b, 0x62, 0xc7, 0x21, 0xe3, 0x09, 0xa5, 0x6b, 0x0f, 0x3f, 0x32, 0xca, 0x0e, 0xad, 0x06, 0x4e, + 0x31, 0xb0, 0x22, 0xf9, 0x07, 0x2a, 0x03, 0xd5, 0x47, 0x81, 0xab, 0xfa, 0x94, 0x0f, 0xeb, 0xdc, + 0x96, 0xfa, 0x1d, 0xe0, 0xd1, 0x8c, 0xfa, 0xeb, 0x6b, 0x8d, 0x73, 0x7a, 0xa8, 0xe8, 0x95, 0x52, + 0xab, 0xa4, 0x6c, 0x6b, 0x9f, 0x97, 0x41, 0x7e, 0xcd, 0xb9, 0xdc, 0xbf, 0x6d, 0x6e, 0xc3, 0x2b, + 0xcc, 0xde, 0x4a, 0xf0, 0xc8, 0x1f, 0xc1, 0x12, 0x12, 0xfb, 0x5a, 0xbc, 0x8b, 0xcc, 0x17, 0xa4, + 0x34, 0x62, 0x5f, 0x3b, 0xac, 0x5f, 0xcc, 0xdf, 0x8c, 0x22, 0xf6, 0x18, 0xd1, 0x42, 0xf5, 0x2c, + 0x38, 0x13, 0xbd, 0xa8, 0x56, 0xf4, 0x7a, 0xab, 0xba, 0x7c, 0x21, 0x12, 0x6e, 0xd5, 0x10, 0x12, + 0xff, 0xb0, 0x6e, 0x2e, 0x79, 0xad, 0xe0, 0x34, 0x38, 0x19, 0xbd, 0x5b, 0xd1, 0x5b, 0xc1, 0x9b, + 0x07, 0xb5, 0x87, 0x0b, 0x60, 0x8e, 0x74, 0xfb, 0x1b, 0xbd, 0x0e, 0xb2, 0xbe, 0x9f, 0x18, 0xa1, + 0x7b, 0x0b, 0x38, 0x5e, 0x5d, 0x5f, 0x6e, 0x36, 0x7d, 0xc7, 0x35, 0xb7, 0x21, 0x1e, 0x47, 0x89, + 0xb4, 0xfa, 0x93, 0xb5, 0xf7, 0x0a, 0xaf, 0xfe, 0xf3, 0x43, 0x0d, 0x29, 0x33, 0x06, 0xf5, 0xaf, + 0x08, 0xad, 0xd6, 0x0b, 0x10, 0x4c, 0x87, 0xfe, 0x83, 0x63, 0x6e, 0x73, 0xf1, 0xb8, 0x6c, 0x9d, + 0x7d, 0x9e, 0x04, 0x66, 0x5a, 0xd6, 0x2e, 0x7c, 0xb6, 0x63, 0x43, 0x4f, 0x9d, 0x02, 0xf2, 0xca, + 0x5a, 0x4b, 0x39, 0x86, 0xfe, 0xa0, 0x69, 0x51, 0x0e, 0xff, 0xd1, 0x51, 0x01, 0xe8, 0x4f, 0xa9, + 0xa5, 0xc8, 0xe8, 0xcf, 0x9a, 0xde, 0x52, 0xf2, 0xe8, 0x4f, 0x5d, 0x6f, 0x29, 0x05, 0xf4, 0x67, + 0xbd, 0xd6, 0x52, 0x8a, 0xe8, 0x4f, 0xb5, 0xd9, 0x52, 0xa6, 0xd0, 0x9f, 0xa5, 0x66, 0x4b, 0x99, + 0x46, 0x7f, 0xce, 0x35, 0x5b, 0xca, 0x0c, 0xfa, 0x53, 0x6e, 0xb5, 0x14, 0x80, 0xfe, 0xdc, 0xdf, + 0x6c, 0x29, 0xb3, 0xe8, 0x4f, 0xa9, 0xdc, 0x52, 0xe6, 0xf0, 0x1f, 0xbd, 0xa5, 0xcc, 0xa3, 0x3f, + 0xcd, 0x66, 0x4b, 0x59, 0xc0, 0x94, 0x9b, 0x2d, 0xe5, 0x38, 0x2e, 0xab, 0xda, 0x52, 0x14, 0xf4, + 0x67, 0xb5, 0xd9, 0x52, 0x4e, 0xe0, 0xcc, 0xcd, 0x96, 0xa2, 0xe2, 0x42, 0x9b, 0x2d, 0xe5, 0x2a, + 0x9c, 0xa7, 0xd9, 0x52, 0x4e, 0xe2, 0x22, 0x9a, 0x2d, 0xe5, 0x6a, 0xcc, 0x86, 0xde, 0x52, 0x4e, + 0xe1, 0x3c, 0x46, 0x4b, 0x79, 0x14, 0x7e, 0x55, 0x6f, 0x29, 0xa7, 0x31, 0x63, 0x7a, 0x4b, 0xb9, + 0x06, 0xff, 0x31, 0x5a, 0x8a, 0x86, 0x5f, 0x95, 0x5a, 0xca, 0xb5, 0xda, 0xa3, 0xc1, 0xcc, 0x0a, + 0xf4, 0x09, 0x88, 0x9a, 0x02, 0xe4, 0x15, 0xe8, 0xb3, 0x13, 0xf1, 0x57, 0xe6, 0xc1, 0xa3, 0xe8, + 0xe2, 0xcd, 0xb2, 0xeb, 0xec, 0xd6, 0xe0, 0xb6, 0xd9, 0xde, 0xd7, 0x1f, 0x42, 0x06, 0x9f, 0xf6, + 0xa2, 0x1c, 0xb7, 0xa2, 0xdd, 0x8b, 0x7a, 0x23, 0xfc, 0x3f, 0xd1, 0x40, 0x0e, 0xd6, 0xa8, 0x65, + 0x7e, 0x8d, 0x3a, 0xce, 0x24, 0xcc, 0x8b, 0x4c, 0x24, 0xff, 0x81, 0x6d, 0x0c, 0xdc, 0x86, 0x54, + 0xae, 0x6f, 0x43, 0x0a, 0xb5, 0xb0, 0x1e, 0x74, 0x3d, 0xc7, 0x36, 0xbb, 0x4d, 0xea, 0x7e, 0x44, + 0xe6, 0xaa, 0xfd, 0xc9, 0xea, 0x33, 0x82, 0x46, 0x45, 0x0c, 0xbe, 0xa7, 0x26, 0x2d, 0x6f, 0xf5, + 0x4b, 0x28, 0xa6, 0x7d, 0x7d, 0x26, 0x6c, 0x5f, 0x2d, 0xae, 0x7d, 0x3d, 0xfd, 0x10, 0xb4, 0xd3, + 0x35, 0xb5, 0xea, 0x68, 0x53, 0xd1, 0xc8, 0x39, 0x3f, 0xd8, 0xff, 0x92, 0xb5, 0xcf, 0x4b, 0xe0, + 0x94, 0x6e, 0x0f, 0x9a, 0xca, 0xb0, 0x6a, 0xf4, 0x56, 0x16, 0x9a, 0x75, 0x5e, 0xa4, 0x77, 0x0f, + 0xac, 0xf6, 0x60, 0x9a, 0x31, 0x12, 0xfd, 0xad, 0x50, 0xa2, 0x4d, 0x4e, 0xa2, 0xf7, 0x8d, 0x4e, + 0x3a, 0x9d, 0x40, 0xeb, 0x63, 0xed, 0xbb, 0xf2, 0xda, 0x5f, 0x48, 0xe0, 0x04, 0xf1, 0x20, 0xbc, + 0x9f, 0xcc, 0x9c, 0x70, 0x6f, 0xcf, 0x5b, 0x5f, 0xdd, 0x68, 0x96, 0x45, 0xf4, 0x9b, 0x49, 0xd1, + 0x5e, 0xc7, 0x0a, 0xfc, 0x01, 0x5e, 0xe0, 0x31, 0xfd, 0x78, 0x7f, 0x71, 0x31, 0xb2, 0xfe, 0xf5, + 0x50, 0xd6, 0x75, 0x4e, 0xd6, 0x77, 0x8f, 0x44, 0xf5, 0x68, 0xc5, 0xfc, 0xd5, 0x3c, 0x78, 0x34, + 0xe1, 0x90, 0x2a, 0x02, 0xe9, 0x07, 0x4b, 0x76, 0xc7, 0x80, 0x9e, 0x6f, 0xba, 0x3e, 0x17, 0x7a, + 0xa5, 0x6f, 0x6a, 0x9e, 0xcb, 0x60, 0x6a, 0x2e, 0x0d, 0x9d, 0x9a, 0x6b, 0xef, 0x61, 0x0d, 0xbc, + 0xf3, 0x3c, 0xb2, 0xa5, 0x04, 0x0c, 0x62, 0x6a, 0x18, 0xd7, 0xa2, 0x42, 0xcb, 0xef, 0x7b, 0x38, + 0x94, 0x97, 0x0f, 0x5d, 0x42, 0x3a, 0xc4, 0x7f, 0x6d, 0xbc, 0x96, 0x78, 0x9e, 0x7d, 0xc7, 0x9b, + 0x8d, 0x4a, 0x27, 0xd3, 0x29, 0xd4, 0x4b, 0xa6, 0xc1, 0x0c, 0xee, 0x72, 0x6a, 0x96, 0x7d, 0x49, + 0xfb, 0x73, 0x19, 0xcc, 0xd5, 0xe1, 0x95, 0xf2, 0x8e, 0xd9, 0xed, 0x42, 0x7b, 0x1b, 0x6a, 0x0f, + 0x72, 0xb6, 0xbd, 0xd9, 0xeb, 0xd5, 0xa3, 0xfd, 0xe1, 0xe0, 0x51, 0xbd, 0x0f, 0x14, 0xbc, 0xb6, + 0x13, 0x06, 0x75, 0xf8, 0xce, 0x98, 0xd5, 0xeb, 0xd2, 0x9e, 0xbf, 0xb3, 0x88, 0xcb, 0x2a, 0xf5, + 0xac, 0x26, 0xfa, 0xc0, 0x20, 0xdf, 0xd1, 0x71, 0xf2, 0xaf, 0x06, 0x76, 0xc6, 0xb9, 0x84, 0xce, + 0x38, 0x64, 0x7c, 0x91, 0x65, 0x3a, 0x66, 0x91, 0xe4, 0x06, 0x30, 0xdb, 0x0e, 0xb2, 0x84, 0xa7, + 0xf4, 0xd8, 0x24, 0xed, 0x2f, 0x53, 0x75, 0xd7, 0x42, 0x85, 0xa7, 0xd3, 0x2a, 0x38, 0x66, 0x53, + 0xf3, 0x6a, 0x70, 0xa2, 0xd5, 0x68, 0x6c, 0xae, 0x95, 0xea, 0x17, 0xa2, 0xd8, 0x2a, 0x5b, 0xda, + 0x2b, 0xf2, 0x60, 0xa1, 0xe9, 0x74, 0x2f, 0xc3, 0x08, 0xe7, 0x2a, 0xe7, 0xfe, 0xc9, 0xca, 0x29, + 0x77, 0x40, 0x4e, 0xea, 0x29, 0x50, 0x34, 0x6d, 0xef, 0x0a, 0x0c, 0xcc, 0x7f, 0xfa, 0x44, 0x61, + 0xfc, 0x08, 0xdb, 0x11, 0x18, 0x3c, 0x8c, 0xf7, 0x0c, 0x91, 0x24, 0xcf, 0x55, 0x0c, 0x90, 0x67, + 0xc1, 0x9c, 0x47, 0xbc, 0x44, 0x5a, 0x8c, 0x33, 0x10, 0x97, 0x86, 0x59, 0x24, 0x6e, 0x4a, 0x32, + 0x65, 0x11, 0x3f, 0x69, 0xaf, 0x0d, 0xfb, 0x8f, 0x0d, 0x0e, 0xe2, 0xd2, 0x61, 0x18, 0x4b, 0x07, + 0xf2, 0xab, 0xc6, 0x3d, 0x89, 0x3f, 0x0d, 0x4e, 0x06, 0x27, 0xd4, 0xcb, 0xab, 0xa5, 0x5a, 0x4d, + 0xaf, 0xaf, 0xe8, 0x9b, 0xd5, 0x0a, 0xd9, 0x4f, 0x8e, 0x52, 0x4a, 0xad, 0x96, 0xbe, 0xb6, 0xde, + 0x6a, 0x6e, 0xea, 0xcf, 0x2c, 0xeb, 0x7a, 0x05, 0x3b, 0x60, 0xe3, 0x13, 0x94, 0x81, 0xab, 0x7c, + 0xa9, 0xde, 0x3c, 0xaf, 0x1b, 0xca, 0xce, 0xd9, 0x12, 0x98, 0x65, 0x06, 0x0a, 0xc4, 0x5d, 0x05, + 0x6e, 0x99, 0x7b, 0x5d, 0x6a, 0x8e, 0x2b, 0xc7, 0x10, 0x77, 0x58, 0x36, 0x0d, 0xbb, 0xbb, 0xaf, + 0xe4, 0x54, 0x05, 0xcc, 0xb1, 0x63, 0x82, 0x22, 0x69, 0xef, 0xbc, 0x0e, 0xcc, 0x9c, 0x77, 0xdc, + 0x4b, 0xd8, 0x6b, 0x58, 0xfb, 0x00, 0x89, 0xc1, 0x16, 0x44, 0x94, 0x60, 0x0c, 0xb0, 0x57, 0x89, + 0xbb, 0x89, 0x05, 0xd4, 0x16, 0x87, 0x46, 0x8d, 0xb8, 0x01, 0xcc, 0x5e, 0x09, 0x72, 0x47, 0x2d, + 0x9d, 0x49, 0xd2, 0x7e, 0x51, 0xcc, 0xf1, 0x6b, 0x78, 0x91, 0xd9, 0xaf, 0xfa, 0xbf, 0x5d, 0x02, + 0xc5, 0x15, 0xe8, 0x97, 0xba, 0x5d, 0x56, 0x6e, 0x2f, 0x13, 0x3e, 0x47, 0xca, 0x55, 0xa2, 0xd4, + 0xed, 0xc6, 0x37, 0x2a, 0x46, 0x40, 0xc1, 0x79, 0x27, 0x2e, 0x4d, 0xd0, 0x4b, 0x7b, 0x48, 0x81, + 0xd9, 0x4b, 0xec, 0x63, 0x91, 0x6b, 0xf6, 0xeb, 0x19, 0x33, 0xe9, 0x09, 0x51, 0xfc, 0xbd, 0x5c, + 0xb2, 0x93, 0x54, 0x90, 0x4f, 0x7d, 0x00, 0x4c, 0xed, 0x79, 0xb0, 0x6c, 0x7a, 0xc1, 0xd0, 0xc6, + 0xd7, 0xb4, 0x71, 0xf1, 0x41, 0xd8, 0xf6, 0x17, 0xab, 0xbb, 0x68, 0xe2, 0xb3, 0x41, 0x32, 0x86, + 0xf1, 0x8a, 0xe8, 0xb3, 0x11, 0x50, 0x40, 0xd3, 0xce, 0x2b, 0x96, 0xbf, 0x53, 0xde, 0x31, 0x7d, + 0xba, 0xd9, 0x12, 0x3e, 0x6b, 0x2f, 0x1e, 0x01, 0xce, 0x44, 0x87, 0x9d, 0xd8, 0xe3, 0xe8, 0xa9, + 0x41, 0x1c, 0x83, 0x97, 0xcd, 0x28, 0x20, 0xfe, 0xad, 0x04, 0xf2, 0x8d, 0x1e, 0xb4, 0x85, 0xcf, + 0x5e, 0x86, 0xb2, 0x95, 0xfa, 0x64, 0xfb, 0x5a, 0x71, 0xb7, 0xe0, 0xb0, 0xd2, 0xa8, 0xe4, 0x18, + 0xc9, 0xde, 0x0e, 0xf2, 0x96, 0xbd, 0xe5, 0x50, 0xcb, 0xf6, 0xda, 0x18, 0x5b, 0xa7, 0x6a, 0x6f, + 0x39, 0x06, 0xce, 0x28, 0xea, 0x11, 0x9c, 0x54, 0x76, 0xf6, 0xe2, 0xfe, 0xbb, 0x69, 0x50, 0x24, + 0xea, 0xac, 0xbd, 0x54, 0x06, 0x72, 0xa9, 0xd3, 0x89, 0x11, 0xbc, 0x74, 0x40, 0xf0, 0x0e, 0xfe, + 0x2c, 0xc4, 0x24, 0x7c, 0xe6, 0x03, 0xaf, 0x09, 0xf6, 0xed, 0xb4, 0x49, 0x95, 0x3a, 0x9d, 0xf8, + 0x73, 0x0b, 0x61, 0x81, 0x12, 0x5f, 0x20, 0xdb, 0xc2, 0x65, 0xb1, 0x16, 0x9e, 0x7a, 0x20, 0x88, + 0xe5, 0x2f, 0x7b, 0x88, 0xfe, 0x41, 0x02, 0x53, 0x35, 0xcb, 0xf3, 0x11, 0x36, 0x25, 0x11, 0x6c, + 0xae, 0x03, 0x33, 0x81, 0x68, 0x50, 0x97, 0x87, 0xfa, 0xf3, 0x28, 0x81, 0x9f, 0x89, 0xdf, 0xcf, + 0xa3, 0xf3, 0xa4, 0xe4, 0xda, 0x53, 0x2e, 0xe2, 0xcf, 0xb4, 0x45, 0xc5, 0x4a, 0xfd, 0xc5, 0xfe, + 0x52, 0x28, 0xf0, 0x35, 0x4e, 0xe0, 0x77, 0x8d, 0x52, 0x64, 0xf6, 0x42, 0xff, 0x7d, 0x09, 0x00, + 0x54, 0x36, 0x3d, 0x38, 0xfc, 0x58, 0x2e, 0x1c, 0x48, 0x82, 0x74, 0x5f, 0xc1, 0x4a, 0x77, 0x8d, + 0x97, 0xee, 0x77, 0x0f, 0xaf, 0x6a, 0xd2, 0x01, 0x61, 0x55, 0x01, 0xb2, 0x15, 0x8a, 0x16, 0xfd, + 0xd5, 0xde, 0x1e, 0x0a, 0x75, 0x9d, 0x13, 0xea, 0x3d, 0x23, 0x96, 0x94, 0xbd, 0x5c, 0xff, 0x48, + 0x02, 0x53, 0x4d, 0xe8, 0xa3, 0x6e, 0x52, 0x3b, 0x27, 0xd2, 0xc3, 0x33, 0x6d, 0x5b, 0x12, 0x6c, + 0xdb, 0xdf, 0xc8, 0x89, 0x06, 0x86, 0x8b, 0x24, 0x43, 0x79, 0x8a, 0x59, 0x7d, 0x78, 0xbd, 0x50, + 0x60, 0xb8, 0x61, 0xd4, 0xb2, 0x97, 0xee, 0x5b, 0xa5, 0xd0, 0x53, 0x84, 0x3f, 0xd7, 0xc7, 0x9a, + 0xc5, 0xb9, 0x83, 0x66, 0xb1, 0xf8, 0xb9, 0x3e, 0xb6, 0x8e, 0xf1, 0x8e, 0x09, 0xa9, 0x8d, 0x8d, + 0x31, 0xf8, 0x0c, 0x8c, 0x22, 0xaf, 0xe7, 0xca, 0xa0, 0x48, 0x37, 0x0f, 0xee, 0x4b, 0xde, 0x3b, + 0x18, 0x3e, 0xb5, 0x78, 0xff, 0x08, 0xa6, 0x5c, 0xd2, 0xb2, 0x7c, 0xc8, 0x86, 0xc4, 0xb0, 0x71, + 0x1b, 0x28, 0xe0, 0xa8, 0xd9, 0x74, 0x9c, 0x8b, 0xdc, 0x3d, 0x02, 0x12, 0x3a, 0x7a, 0x6b, 0x90, + 0x4c, 0xa9, 0x51, 0x18, 0xc3, 0x4a, 0xfe, 0x28, 0x28, 0x7c, 0x55, 0x05, 0x60, 0x7d, 0xef, 0x62, + 0xd7, 0xf2, 0x76, 0x2c, 0x1b, 0xfb, 0x88, 0xcd, 0xd1, 0x47, 0x12, 0xfc, 0x39, 0xd1, 0xfc, 0x8b, + 0x35, 0x0a, 0x14, 0x20, 0xef, 0xb9, 0x16, 0x5d, 0x06, 0x40, 0x7f, 0xd5, 0x7b, 0x43, 0x6f, 0xcb, + 0x7c, 0x5f, 0xe0, 0x16, 0x24, 0x86, 0x88, 0x83, 0x45, 0xa6, 0xf4, 0xc8, 0xeb, 0x92, 0x8d, 0xf0, + 0x5d, 0xe0, 0x23, 0x7c, 0x73, 0xa7, 0xb9, 0x8b, 0x7d, 0xa7, 0xb9, 0x11, 0x8e, 0x9e, 0xf5, 0x6c, + 0x88, 0x5d, 0x8f, 0x64, 0x03, 0xff, 0x47, 0x5f, 0x60, 0xf7, 0x20, 0xec, 0x9d, 0x47, 0xce, 0x0c, + 0x44, 0x09, 0x6c, 0x9f, 0x37, 0x23, 0xd8, 0xe7, 0x7d, 0x34, 0x9a, 0xfb, 0x38, 0x82, 0x86, 0x73, + 0x0a, 0xc9, 0x71, 0xec, 0xe6, 0xfb, 0xd8, 0xd5, 0x3e, 0x21, 0x1c, 0x88, 0x93, 0x91, 0x71, 0xe2, + 0x2c, 0x86, 0x72, 0x20, 0x85, 0x1c, 0x30, 0x7b, 0xc0, 0x49, 0x3d, 0xf0, 0x30, 0xfa, 0xe9, 0x74, + 0x79, 0x77, 0x84, 0xf5, 0x1a, 0x15, 0x2c, 0x04, 0xc7, 0xe2, 0x1b, 0x4b, 0xf7, 0xeb, 0xe5, 0x96, + 0x02, 0x0f, 0x1e, 0x95, 0xc7, 0x87, 0xe2, 0xc9, 0x01, 0xf8, 0x68, 0x4d, 0x46, 0xfb, 0x1f, 0x12, + 0x28, 0x52, 0x73, 0xe3, 0xbe, 0x43, 0x42, 0xa8, 0xbd, 0x72, 0x14, 0x48, 0x12, 0xa3, 0x93, 0x7c, + 0x36, 0x2d, 0x00, 0x63, 0x30, 0x30, 0x2e, 0x64, 0x06, 0x80, 0xf6, 0xcf, 0x12, 0xc8, 0x23, 0x33, + 0x48, 0x2c, 0xf6, 0xc3, 0x67, 0x84, 0x5d, 0x82, 0x19, 0x01, 0x20, 0xf2, 0x31, 0xfa, 0xbd, 0x04, + 0x66, 0x7a, 0x24, 0x63, 0x18, 0x79, 0xe4, 0x26, 0x81, 0xce, 0x08, 0x1a, 0xd1, 0x67, 0xda, 0xfb, + 0x84, 0x0e, 0x3c, 0x24, 0xf3, 0x93, 0x0e, 0x0e, 0x7d, 0x1c, 0x61, 0x22, 0xb6, 0xb4, 0x7f, 0x95, + 0x00, 0x30, 0xa0, 0xe7, 0x74, 0x2f, 0xc3, 0x0d, 0xd7, 0xd2, 0xae, 0x8d, 0x00, 0xa0, 0xcd, 0x3e, + 0x17, 0x35, 0xfb, 0xcf, 0x49, 0xa2, 0xce, 0xbf, 0x9c, 0xe6, 0x05, 0xc4, 0x63, 0xc4, 0xff, 0x34, + 0x30, 0x45, 0xe5, 0x48, 0x6d, 0x4a, 0x31, 0xe1, 0x07, 0x1f, 0x69, 0x1f, 0x14, 0x72, 0x1e, 0x16, + 0xe1, 0x28, 0x1d, 0x00, 0xe5, 0x11, 0x00, 0x38, 0x0e, 0x66, 0x03, 0x00, 0x36, 0x8c, 0xaa, 0x02, + 0xb5, 0x77, 0xcb, 0xd8, 0xc3, 0x82, 0x0c, 0x6e, 0x87, 0xef, 0x69, 0xfe, 0x42, 0x78, 0xb2, 0xcf, + 0xc8, 0x23, 0x2c, 0x3f, 0x23, 0x80, 0x7e, 0x5b, 0x68, 0x76, 0x2f, 0xc0, 0xd0, 0x23, 0xa5, 0xbf, + 0x3a, 0xab, 0x83, 0x79, 0xce, 0x2a, 0x51, 0x4f, 0x83, 0x93, 0x5c, 0x02, 0x19, 0xef, 0x3a, 0xca, + 0x31, 0x55, 0x03, 0xa7, 0xb8, 0x37, 0xf4, 0x01, 0x76, 0x94, 0x9c, 0xf6, 0xc7, 0x7f, 0x94, 0x0b, + 0xd7, 0x7b, 0xde, 0x9f, 0xa7, 0x2b, 0x6d, 0x9f, 0xe2, 0x83, 0x5d, 0xb6, 0x1d, 0xdb, 0x87, 0x0f, + 0x31, 0x6e, 0x2a, 0x61, 0x42, 0xa2, 0xd5, 0x70, 0x1a, 0x4c, 0xf9, 0x2e, 0xeb, 0xba, 0x12, 0x3c, + 0xb2, 0x8a, 0x55, 0xe0, 0x15, 0xab, 0x0e, 0xce, 0x5a, 0x76, 0xbb, 0xbb, 0xd7, 0x81, 0x06, 0xec, + 0x9a, 0x48, 0x86, 0x5e, 0xc9, 0xab, 0xc0, 0x1e, 0xb4, 0x3b, 0xd0, 0xf6, 0x09, 0x9f, 0xc1, 0xb9, + 0x57, 0x81, 0x9c, 0xbc, 0x32, 0xde, 0xcb, 0x2b, 0xe3, 0x63, 0x07, 0x2d, 0xe1, 0x26, 0xac, 0xf7, + 0xdd, 0x05, 0x00, 0xa9, 0xdb, 0x39, 0x0b, 0x5e, 0xa1, 0x6a, 0x78, 0x4d, 0xdf, 0xaa, 0x5f, 0x23, + 0xcc, 0x60, 0x30, 0x99, 0xb5, 0x2f, 0x87, 0xea, 0xf7, 0x74, 0x4e, 0xfd, 0x6e, 0x13, 0x64, 0x21, + 0x9d, 0xd6, 0xf5, 0x46, 0xd0, 0xba, 0x79, 0x30, 0x13, 0xed, 0x26, 0xcb, 0xea, 0x35, 0xe0, 0xea, + 0xc0, 0xc3, 0xb8, 0xae, 0xeb, 0x95, 0xe6, 0xe6, 0xc6, 0xfa, 0x8a, 0x51, 0xaa, 0xe8, 0x0a, 0x40, + 0xfa, 0x49, 0xf4, 0x32, 0x74, 0x0c, 0xce, 0x6b, 0x7f, 0x20, 0x81, 0x02, 0x3e, 0xb4, 0xad, 0x7d, + 0xdf, 0x98, 0x34, 0xc7, 0xe3, 0x9c, 0x9e, 0xc2, 0x71, 0x57, 0xfc, 0x0a, 0x13, 0x2a, 0x4c, 0xcc, + 0xd5, 0xa1, 0xae, 0x30, 0x49, 0x20, 0x94, 0xfd, 0x4c, 0x08, 0x35, 0xc9, 0xe6, 0x8e, 0x73, 0xe5, + 0x3f, 0x73, 0x93, 0x44, 0xf5, 0x3f, 0xe2, 0x26, 0x39, 0x80, 0x85, 0x89, 0x37, 0xc9, 0x01, 0xed, + 0x2e, 0xa1, 0x99, 0x6a, 0x1f, 0x29, 0x84, 0xf3, 0xbf, 0x4f, 0x4a, 0x87, 0xda, 0xfb, 0x2a, 0x81, + 0x79, 0xcb, 0xf6, 0xa1, 0x6b, 0x9b, 0xdd, 0xe5, 0xae, 0xb9, 0x1d, 0xd8, 0xa7, 0xfd, 0x1b, 0x1e, + 0x55, 0x26, 0x8f, 0xc1, 0x7f, 0xa1, 0x9e, 0x01, 0xc0, 0x87, 0xbb, 0xbd, 0xae, 0xe9, 0x47, 0xaa, + 0xc7, 0xa4, 0xb0, 0xda, 0x97, 0xe7, 0xb5, 0xef, 0x0e, 0x70, 0x15, 0x01, 0xad, 0xb5, 0xdf, 0x83, + 0x1b, 0xb6, 0xf5, 0xac, 0x3d, 0x1c, 0x1b, 0x99, 0xe8, 0xe8, 0xa0, 0x57, 0xdc, 0x0e, 0x50, 0x91, + 0xdf, 0x01, 0x52, 0xef, 0x01, 0xd7, 0xe0, 0xb0, 0xd7, 0xf8, 0x8e, 0x90, 0xf3, 0x56, 0x67, 0x1b, + 0xfa, 0xd5, 0xad, 0x35, 0xcb, 0xf3, 0x2c, 0x7b, 0x1b, 0x4f, 0xc7, 0xa7, 0x8d, 0xf8, 0x0c, 0xda, + 0xdf, 0x0a, 0xc7, 0x5d, 0x0a, 0xfa, 0x8c, 0x21, 0x71, 0x97, 0xc2, 0x76, 0x2a, 0xf7, 0xb5, 0xd3, + 0x70, 0x55, 0x27, 0x2f, 0xb0, 0xaa, 0xc3, 0x62, 0x5a, 0x10, 0x5c, 0x1d, 0x78, 0x8d, 0x50, 0x60, + 0xa7, 0xa4, 0x6a, 0x64, 0xdf, 0xf7, 0x7d, 0x5d, 0x06, 0x0b, 0xa4, 0xe8, 0x25, 0xc7, 0xb9, 0xb4, + 0x6b, 0xba, 0x97, 0xb4, 0x9f, 0x38, 0xdc, 0x2e, 0x6e, 0xe2, 0xee, 0x55, 0xdc, 0x96, 0x6c, 0x9f, + 0xf2, 0xe6, 0xfb, 0x95, 0x57, 0xfb, 0x2d, 0xe1, 0x29, 0x09, 0x27, 0xcf, 0xa0, 0x52, 0x93, 0xd9, + 0xde, 0x12, 0x3b, 0xde, 0x28, 0xc2, 0x60, 0xf6, 0xc0, 0xff, 0x46, 0x08, 0x7c, 0x30, 0x8e, 0xb0, + 0x3b, 0x03, 0xe3, 0xc4, 0x5d, 0xfb, 0xca, 0x68, 0xd8, 0x05, 0x7c, 0x8d, 0x80, 0x9d, 0x02, 0xe4, + 0x4b, 0xa1, 0x33, 0x12, 0xfa, 0xcb, 0x56, 0x28, 0x9f, 0x1d, 0x9a, 0x31, 0x2c, 0x4f, 0x04, 0xcd, + 0x93, 0x3c, 0x0b, 0x8d, 0x5e, 0xa6, 0x98, 0x7e, 0x49, 0x78, 0xc7, 0x6d, 0xa0, 0x80, 0x08, 0x77, + 0x93, 0x69, 0x95, 0x62, 0xdb, 0x75, 0xe2, 0x6c, 0x66, 0x8f, 0xe6, 0x8b, 0x0a, 0x60, 0x26, 0x88, + 0x7f, 0x85, 0x6f, 0x14, 0x0c, 0x31, 0x3c, 0x05, 0x8a, 0x9e, 0xb3, 0xe7, 0xb6, 0x21, 0xdd, 0x03, + 0xa5, 0x4f, 0x23, 0xec, 0xd7, 0x0d, 0x35, 0x17, 0x0e, 0x58, 0x24, 0xf9, 0xd4, 0x16, 0x49, 0xbc, + 0xbd, 0x9b, 0x60, 0x3f, 0x68, 0x2f, 0x16, 0xbe, 0xf6, 0x83, 0xc3, 0xac, 0x09, 0xfd, 0x47, 0xa2, + 0x11, 0xf0, 0xab, 0x42, 0xbb, 0x41, 0x43, 0x6a, 0x92, 0x4e, 0xe5, 0x1a, 0x23, 0xd8, 0xc1, 0xd7, + 0x82, 0x47, 0x05, 0x39, 0xa8, 0x01, 0x8c, 0x0d, 0xde, 0x0d, 0xa3, 0xa6, 0xc8, 0xda, 0x73, 0xf3, + 0x40, 0x21, 0xac, 0x35, 0x42, 0x5b, 0x50, 0x7b, 0x59, 0xee, 0xa8, 0x0d, 0xde, 0xf8, 0x19, 0xec, + 0xef, 0x4a, 0xa2, 0xc1, 0xc2, 0x39, 0xc1, 0x47, 0xb5, 0x8b, 0xd1, 0xa4, 0x11, 0x9a, 0x59, 0x82, + 0xf2, 0x69, 0x6f, 0xc9, 0x89, 0xc4, 0x1e, 0x17, 0x63, 0x31, 0xfb, 0x5e, 0xe9, 0x1b, 0xf9, 0x20, + 0x8c, 0xe1, 0xb2, 0xeb, 0xec, 0x6e, 0xb8, 0x5d, 0xed, 0xdf, 0x84, 0xae, 0x76, 0x88, 0x99, 0x5d, + 0x48, 0xf1, 0xb3, 0x0b, 0xbc, 0x22, 0xdd, 0x8d, 0xb6, 0xc2, 0xba, 0x23, 0x0c, 0xdf, 0xea, 0xcd, + 0x60, 0xc1, 0xec, 0x74, 0xd6, 0xcd, 0x6d, 0x58, 0x46, 0xd3, 0x76, 0xdb, 0xa7, 0x21, 0xce, 0xfa, + 0x52, 0x13, 0xa7, 0x32, 0x7c, 0x1f, 0x39, 0x75, 0xc0, 0x2a, 0x15, 0x5f, 0x86, 0xe5, 0x40, 0xa4, + 0xf2, 0x9b, 0xc8, 0xf0, 0x87, 0x86, 0x8c, 0xf6, 0x8e, 0x19, 0x05, 0x64, 0xa4, 0x4f, 0x82, 0xbe, + 0x58, 0x02, 0x7c, 0x67, 0xaf, 0x79, 0xbf, 0x22, 0x81, 0x29, 0x84, 0x47, 0xa9, 0xd3, 0xd1, 0x1e, + 0xc3, 0xc5, 0x2d, 0x8d, 0xf5, 0x86, 0x7b, 0x81, 0xb0, 0x1b, 0x62, 0x50, 0x43, 0x42, 0x3f, 0x06, + 0x93, 0x48, 0x88, 0x12, 0x27, 0x44, 0x31, 0x6f, 0xc3, 0xc4, 0x22, 0xb2, 0x17, 0xdf, 0x67, 0x24, + 0x30, 0x1f, 0xcc, 0x33, 0x96, 0xa1, 0xdf, 0xde, 0xd1, 0xee, 0x12, 0x5d, 0xe7, 0xa2, 0x2d, 0x31, + 0xdc, 0x12, 0xee, 0x6a, 0xdf, 0xca, 0xa5, 0x54, 0x79, 0xae, 0xe4, 0x98, 0x45, 0xc2, 0x54, 0xba, + 0x98, 0x44, 0x30, 0x7b, 0x61, 0x7e, 0x59, 0x02, 0xa0, 0xe5, 0x84, 0x93, 0xe5, 0x43, 0x48, 0xf2, + 0x27, 0x85, 0x77, 0x8b, 0x69, 0xc5, 0xa3, 0x62, 0xd3, 0xf7, 0x1c, 0x82, 0xce, 0x54, 0xc3, 0x4a, + 0x9a, 0x48, 0x5b, 0x9f, 0xa9, 0xec, 0xf5, 0xba, 0x56, 0xdb, 0xf4, 0xfb, 0x3d, 0x00, 0xe3, 0xc5, + 0x8b, 0xaf, 0xe3, 0x4e, 0x65, 0x34, 0x86, 0x65, 0xc4, 0xc8, 0x92, 0xc4, 0xf9, 0x91, 0x82, 0x38, + 0x3f, 0x82, 0x5e, 0x3d, 0x43, 0x88, 0x4f, 0x40, 0x3d, 0x65, 0x70, 0xbc, 0xd1, 0x83, 0xf6, 0x92, + 0x0b, 0xcd, 0x4e, 0xdb, 0xdd, 0xdb, 0xbd, 0xe8, 0xb1, 0xee, 0xab, 0xc9, 0x3a, 0xca, 0xac, 0x5c, + 0x4b, 0xdc, 0xca, 0xb5, 0xf6, 0xc3, 0xb2, 0x68, 0x24, 0x36, 0x66, 0x7f, 0x85, 0xe1, 0x61, 0x84, + 0xa1, 0x2e, 0x95, 0xd3, 0x55, 0xdf, 0x22, 0x75, 0x3e, 0xcd, 0x22, 0xf5, 0x9b, 0x85, 0xe2, 0xba, + 0x09, 0xd5, 0x6b, 0x22, 0xbe, 0x73, 0x0b, 0x4d, 0xe8, 0xc7, 0xc0, 0x7b, 0x13, 0x98, 0xbf, 0x18, + 0xbd, 0x09, 0x21, 0xe6, 0x13, 0x07, 0x78, 0xb4, 0xbe, 0x35, 0xed, 0x0a, 0x0d, 0xcf, 0x42, 0x0c, + 0xba, 0x21, 0x82, 0x92, 0x88, 0xdb, 0x5c, 0xaa, 0xe5, 0x96, 0xc4, 0xf2, 0xb3, 0x47, 0xe1, 0x13, + 0x12, 0x98, 0xc5, 0x97, 0x8c, 0x2f, 0xed, 0xe3, 0x83, 0x9c, 0x82, 0x46, 0xc9, 0x8b, 0x58, 0x31, + 0xab, 0x20, 0xdf, 0xb5, 0xec, 0x4b, 0x81, 0xbf, 0x23, 0xfa, 0x1f, 0x5d, 0x51, 0x2a, 0x0d, 0xb8, + 0xa2, 0x34, 0xdc, 0x26, 0x09, 0xcb, 0x8d, 0x19, 0x4d, 0xdf, 0x90, 0x13, 0xb9, 0xa2, 0x74, 0x28, + 0xb9, 0xec, 0xc5, 0xf8, 0xd7, 0x79, 0x50, 0x6c, 0x42, 0xd3, 0x6d, 0xef, 0x68, 0xef, 0x97, 0x06, + 0x4e, 0x25, 0xa6, 0xf9, 0xa9, 0xc4, 0x32, 0x98, 0xda, 0xb2, 0xba, 0x3e, 0x74, 0x89, 0x0f, 0x38, + 0xdb, 0xb5, 0x93, 0x26, 0xbe, 0xd4, 0x75, 0xda, 0x97, 0x16, 0xa9, 0x69, 0xbf, 0x18, 0xc4, 0x8b, + 0x5e, 0x5c, 0xc6, 0x1f, 0x19, 0xc1, 0xc7, 0xc8, 0x20, 0xf4, 0x1c, 0xd7, 0x8f, 0xbb, 0x7f, 0x28, + 0x86, 0x4a, 0xd3, 0x71, 0x7d, 0x83, 0x7c, 0x88, 0x60, 0xde, 0xda, 0xeb, 0x76, 0x5b, 0xf0, 0x21, + 0x3f, 0x98, 0xd6, 0x05, 0xcf, 0xc8, 0x58, 0x74, 0xb6, 0xb6, 0x3c, 0x48, 0x16, 0x15, 0x0a, 0x06, + 0x7d, 0x52, 0x4f, 0x82, 0x42, 0xd7, 0xda, 0xb5, 0xc8, 0x44, 0xa4, 0x60, 0x90, 0x07, 0xf5, 0x56, + 0xa0, 0x44, 0x73, 0x20, 0xc2, 0xe8, 0xe9, 0x22, 0x6e, 0x9a, 0x07, 0xd2, 0x91, 0xce, 0x5c, 0x82, + 0xfb, 0xde, 0xe9, 0x29, 0xfc, 0x1e, 0xff, 0xe7, 0x0f, 0xdc, 0x88, 0x6c, 0x98, 0x10, 0x89, 0xc7, + 0xcf, 0x70, 0x5d, 0xd8, 0x76, 0xdc, 0x4e, 0x20, 0x9b, 0xf8, 0x09, 0x06, 0xcd, 0x97, 0x6e, 0x9b, + 0x63, 0x60, 0xe1, 0xd9, 0x6b, 0xda, 0x7b, 0x8a, 0xa8, 0xdb, 0x44, 0x45, 0x9f, 0xb7, 0xfc, 0x9d, + 0x35, 0xe8, 0x9b, 0xda, 0x5f, 0xcb, 0x03, 0x35, 0x6e, 0xf6, 0x7f, 0x6b, 0xdc, 0x10, 0x8d, 0x23, + 0x31, 0xbf, 0xfc, 0x3d, 0xd7, 0x46, 0x72, 0xa4, 0x7e, 0xb4, 0x4c, 0x8a, 0x7a, 0x0f, 0xb8, 0x26, + 0x7a, 0x0a, 0x96, 0x52, 0x2b, 0x8c, 0x6b, 0xed, 0xb4, 0x11, 0x9f, 0x41, 0x5d, 0x07, 0x37, 0x92, + 0x97, 0xab, 0xad, 0xb5, 0xda, 0xaa, 0xb5, 0xbd, 0xd3, 0xb5, 0xb6, 0x77, 0x7c, 0xaf, 0x6a, 0x7b, + 0x3e, 0x34, 0x3b, 0x8d, 0x2d, 0x83, 0xdc, 0x1c, 0x06, 0x30, 0x1d, 0x91, 0xac, 0xbc, 0x8f, 0xb8, + 0xd8, 0xe8, 0xc6, 0x6a, 0x4a, 0x4c, 0x4b, 0x79, 0x32, 0x6a, 0x29, 0xde, 0x5e, 0x37, 0xc4, 0xf4, + 0xba, 0x3e, 0x4c, 0x23, 0x55, 0xdf, 0xeb, 0xe2, 0xe6, 0x82, 0x33, 0xa7, 0x1d, 0xe7, 0x12, 0x38, + 0xc9, 0xbe, 0xd9, 0xfc, 0x5b, 0x11, 0x14, 0x56, 0x5c, 0xb3, 0xb7, 0xa3, 0x3d, 0x97, 0xe9, 0x9f, + 0xc7, 0xd5, 0x26, 0x42, 0xed, 0x94, 0x86, 0x69, 0xa7, 0x3c, 0x44, 0x3b, 0xf3, 0x8c, 0x76, 0xc6, + 0x2f, 0x3a, 0x9f, 0x05, 0x73, 0x6d, 0xa7, 0xdb, 0x85, 0x6d, 0x24, 0x8f, 0x6a, 0x07, 0xaf, 0xf6, + 0xcc, 0x18, 0x5c, 0x1a, 0x8e, 0xa9, 0x0f, 0xfd, 0x26, 0x59, 0x63, 0x27, 0x4a, 0x1f, 0x25, 0x68, + 0x2f, 0x93, 0x40, 0x5e, 0xef, 0x6c, 0x43, 0x6e, 0x1d, 0x3e, 0xc7, 0xac, 0xc3, 0x9f, 0x02, 0x45, + 0xdf, 0x74, 0xb7, 0xa1, 0x1f, 0xac, 0x13, 0x90, 0xa7, 0x30, 0xd4, 0xbf, 0xcc, 0x84, 0xfa, 0xff, + 0x6e, 0x90, 0x47, 0x32, 0xa3, 0x6e, 0xf1, 0x37, 0x0e, 0x82, 0x1f, 0xcb, 0x7e, 0x11, 0x95, 0xb8, + 0x88, 0x6a, 0x6d, 0xe0, 0x0f, 0xfa, 0xb1, 0x2e, 0x1c, 0x0c, 0x45, 0x7b, 0x1d, 0x98, 0xb1, 0xda, + 0x8e, 0x5d, 0xdd, 0x35, 0xb7, 0x21, 0xad, 0x66, 0x94, 0x10, 0xbc, 0xd5, 0x77, 0x9d, 0x07, 0x2d, + 0xba, 0xa8, 0x15, 0x25, 0xa0, 0x2a, 0xec, 0x58, 0x9d, 0x0e, 0xb4, 0x69, 0xcb, 0xa6, 0x4f, 0x67, + 0xcf, 0x80, 0x3c, 0xe2, 0x01, 0xe9, 0x0f, 0x32, 0x16, 0x94, 0x63, 0xea, 0x1c, 0x6a, 0x56, 0xa4, + 0xf1, 0x2a, 0x39, 0x7e, 0xcd, 0x55, 0xc4, 0x6b, 0x88, 0x54, 0x6e, 0x70, 0xe3, 0x7a, 0x3c, 0x28, + 0xd8, 0x4e, 0x07, 0x0e, 0x1d, 0x84, 0x48, 0x2e, 0xf5, 0x49, 0xa0, 0x00, 0x3b, 0xa8, 0x57, 0x90, + 0x71, 0xf6, 0x33, 0xc9, 0xb2, 0x34, 0x48, 0xe6, 0x74, 0xae, 0x49, 0x83, 0xb8, 0xcd, 0xbe, 0x01, + 0xfe, 0xe8, 0x14, 0x38, 0x4e, 0xfa, 0x80, 0xe6, 0xde, 0x45, 0x44, 0xea, 0x22, 0xd4, 0x5e, 0x3f, + 0x78, 0xe0, 0x3a, 0xce, 0x2b, 0xfb, 0x49, 0x50, 0xf0, 0xf6, 0x2e, 0x86, 0x46, 0x28, 0x79, 0x60, + 0x9b, 0xae, 0x34, 0x96, 0xe1, 0x4c, 0x1e, 0x75, 0x38, 0xe3, 0x86, 0x26, 0x39, 0x68, 0xfc, 0xd1, + 0x40, 0x46, 0x0e, 0x74, 0x04, 0x03, 0xd9, 0xa0, 0x61, 0xe8, 0x34, 0x98, 0x32, 0xb7, 0x7c, 0xe8, + 0x46, 0x66, 0x22, 0x7d, 0x44, 0x43, 0xe5, 0x45, 0xb8, 0xe5, 0xb8, 0x48, 0x2c, 0x24, 0x2c, 0x6c, + 0xf8, 0xcc, 0xb4, 0x5c, 0xc0, 0xed, 0xa0, 0xdd, 0x06, 0x4e, 0xd8, 0x4e, 0x05, 0xf6, 0xa8, 0x9c, + 0x09, 0x8a, 0xf3, 0xe4, 0x76, 0xf6, 0x03, 0x2f, 0x0e, 0x74, 0x25, 0x0b, 0x07, 0xbb, 0x12, 0xed, + 0x73, 0x69, 0xe7, 0xcc, 0x7d, 0x40, 0x8f, 0xcd, 0x42, 0x53, 0x9f, 0x0a, 0xe6, 0x3a, 0xd4, 0x43, + 0xac, 0x6d, 0x85, 0xad, 0x24, 0xf6, 0x3b, 0x2e, 0x73, 0xa4, 0x48, 0x79, 0x56, 0x91, 0x56, 0xc0, + 0x34, 0x3e, 0x7a, 0x8d, 0x34, 0xa9, 0xd0, 0xe7, 0x91, 0x8f, 0xa7, 0x75, 0x61, 0xa5, 0x18, 0xb1, + 0x2d, 0x96, 0xe9, 0x27, 0x46, 0xf8, 0x71, 0xba, 0xd9, 0x77, 0xb2, 0x84, 0xb2, 0x6f, 0x8e, 0xbf, + 0x54, 0x04, 0xd7, 0x94, 0x5d, 0xc7, 0xf3, 0xf0, 0x11, 0x9c, 0xfe, 0x86, 0xf9, 0x46, 0x89, 0xbb, + 0xf4, 0xe7, 0x11, 0xdd, 0xfc, 0x06, 0x35, 0xa8, 0xc9, 0x35, 0x8d, 0xbf, 0x10, 0x0e, 0x5a, 0x13, + 0xee, 0x3f, 0xc4, 0x08, 0xfd, 0x3f, 0x47, 0x23, 0x79, 0x4f, 0x4e, 0x24, 0x8e, 0x4e, 0x4a, 0x59, + 0x65, 0xdf, 0x5c, 0xbe, 0x24, 0x81, 0x6b, 0xfb, 0xb9, 0xd9, 0xb0, 0xbd, 0xb0, 0xc1, 0x5c, 0x3f, + 0xa4, 0xbd, 0xf0, 0x71, 0x57, 0x12, 0xef, 0xf8, 0x8d, 0xa9, 0x3b, 0x53, 0x5a, 0xcc, 0x62, 0x49, + 0x74, 0xa0, 0x27, 0xe9, 0x8e, 0xdf, 0xd4, 0xe4, 0xb3, 0x17, 0xee, 0xef, 0xe6, 0xc1, 0xf1, 0x15, + 0xd7, 0xd9, 0xeb, 0x79, 0x51, 0x0f, 0xf4, 0x27, 0x83, 0x37, 0x64, 0x8b, 0x22, 0xa6, 0xc1, 0x0d, + 0x60, 0xd6, 0xa5, 0xd6, 0x5c, 0xb4, 0x3d, 0xcb, 0x26, 0xb1, 0xbd, 0x97, 0x7c, 0x98, 0xde, 0x2b, + 0xea, 0x67, 0xf2, 0x5c, 0x3f, 0xd3, 0xdf, 0x73, 0x14, 0x06, 0xf4, 0x1c, 0x7f, 0x2c, 0xa5, 0x1c, + 0x54, 0xfb, 0x44, 0x14, 0xd3, 0x5f, 0x94, 0x41, 0x71, 0x1b, 0x67, 0xa4, 0xdd, 0xc5, 0xe3, 0xc4, + 0x6a, 0x86, 0x89, 0x1b, 0xf4, 0xd3, 0x48, 0xae, 0x32, 0xab, 0xc3, 0xa9, 0x06, 0xb8, 0x64, 0x6e, + 0xb3, 0x57, 0xaa, 0xd7, 0xe6, 0xc1, 0x5c, 0x58, 0x7a, 0xb5, 0xe3, 0x71, 0xd1, 0x5d, 0x19, 0x8d, + 0x9a, 0x17, 0xd1, 0xa8, 0x03, 0xeb, 0xcc, 0xe1, 0xa8, 0x23, 0x33, 0xa3, 0xce, 0xc0, 0xd1, 0x65, + 0x2e, 0x66, 0x74, 0xd1, 0x9e, 0x23, 0x8b, 0x5e, 0x9b, 0xc7, 0x77, 0xad, 0xb8, 0x36, 0x8f, 0xe4, + 0xc1, 0x42, 0xf0, 0xf2, 0xbe, 0xe1, 0xb5, 0xca, 0x5e, 0x49, 0x3e, 0x2c, 0x81, 0x13, 0x07, 0x3b, + 0xf3, 0xef, 0xe0, 0xbd, 0xd4, 0x50, 0x9d, 0xbc, 0xd0, 0x4b, 0x0d, 0x3f, 0xf1, 0x9b, 0x74, 0x89, + 0x41, 0x50, 0x38, 0x7b, 0x6f, 0x78, 0x27, 0x2e, 0x16, 0xe6, 0x44, 0x90, 0x68, 0xf6, 0x02, 0xfc, + 0x29, 0x19, 0xcc, 0x34, 0xa1, 0x5f, 0x33, 0xf7, 0x9d, 0x3d, 0x5f, 0x33, 0x45, 0xb7, 0xe7, 0x9e, + 0x02, 0x8a, 0x5d, 0xfc, 0x09, 0xee, 0x60, 0xd8, 0xa0, 0xa3, 0xec, 0xfe, 0x16, 0xf6, 0x0d, 0x22, + 0xa4, 0x0d, 0x9a, 0x9f, 0x8f, 0x3e, 0x23, 0xb2, 0x3b, 0x1a, 0x72, 0x37, 0x96, 0xad, 0x9d, 0x54, + 0x7b, 0xa7, 0x71, 0x45, 0x67, 0x0f, 0xcb, 0x0f, 0xcb, 0x60, 0xbe, 0x09, 0xfd, 0xaa, 0xb7, 0x6c, + 0x5e, 0x76, 0x5c, 0xcb, 0x87, 0xda, 0x8a, 0x28, 0x34, 0x67, 0x00, 0xb0, 0xc2, 0xcf, 0x68, 0x4c, + 0x2c, 0x26, 0x45, 0x7b, 0x4b, 0x5a, 0x47, 0x21, 0x8e, 0x8f, 0xb1, 0x80, 0x90, 0xca, 0xc7, 0x22, + 0xa9, 0xf8, 0x09, 0x5c, 0xfc, 0x2d, 0x51, 0x20, 0x4a, 0x6e, 0x7b, 0xc7, 0xba, 0x0c, 0x3b, 0x29, + 0x81, 0x08, 0x3e, 0x8b, 0x80, 0x08, 0x09, 0xa5, 0x76, 0x5f, 0xe1, 0xf8, 0x18, 0x87, 0xfb, 0x4a, + 0x12, 0xc1, 0x89, 0x84, 0xb5, 0x42, 0x5d, 0x0f, 0x5d, 0xcf, 0xbc, 0x4f, 0x54, 0xac, 0x91, 0xc9, + 0x26, 0xb1, 0x26, 0xdb, 0x48, 0x1d, 0x0b, 0x29, 0x7b, 0x98, 0x4e, 0xe7, 0xb3, 0xe8, 0x58, 0x06, + 0x16, 0x9d, 0xbd, 0xd0, 0xdf, 0x27, 0x83, 0xab, 0xc3, 0x78, 0x2f, 0x4d, 0xe8, 0x57, 0x4c, 0x6f, + 0xe7, 0xa2, 0x63, 0xba, 0x1d, 0xad, 0x3c, 0x86, 0x03, 0x87, 0xda, 0x1f, 0xb2, 0x20, 0xd4, 0x79, + 0x10, 0x06, 0xba, 0x92, 0x0e, 0xe4, 0x65, 0x1c, 0x9d, 0x4c, 0xa2, 0xb7, 0xeb, 0x3b, 0x42, 0xb0, + 0x9e, 0xc1, 0x81, 0x75, 0xef, 0xa8, 0x2c, 0x66, 0x0f, 0xdc, 0xcf, 0x92, 0x11, 0x81, 0xf1, 0x7a, + 0xbe, 0x20, 0x0a, 0x58, 0x8c, 0xd7, 0xab, 0x1c, 0xeb, 0xf5, 0x3a, 0xd2, 0x18, 0x31, 0xd4, 0x63, + 0x39, 0xdb, 0x31, 0xe2, 0x08, 0xbd, 0x91, 0xdf, 0x25, 0x03, 0x05, 0x07, 0xfc, 0x62, 0x3c, 0xc2, + 0xd9, 0xf8, 0xd9, 0xc9, 0xe8, 0x1c, 0xf0, 0x3e, 0x9f, 0x4a, 0xeb, 0x7d, 0xae, 0xbd, 0x33, 0xad, + 0x8f, 0x79, 0x3f, 0xb7, 0x63, 0x41, 0x2c, 0x95, 0x0b, 0xf9, 0x10, 0x0e, 0xb2, 0x07, 0xed, 0xc7, + 0x64, 0x00, 0x50, 0x83, 0xa6, 0x67, 0x23, 0x9e, 0x29, 0x0a, 0xd7, 0xed, 0xac, 0xdf, 0x3d, 0x02, + 0xea, 0xea, 0x3e, 0xa0, 0x08, 0xc5, 0xe8, 0xd4, 0xc5, 0xeb, 0xd3, 0xfa, 0x56, 0x46, 0x5c, 0x8d, + 0x05, 0x96, 0x54, 0xde, 0x96, 0xb1, 0x65, 0x67, 0x0f, 0xc8, 0x7f, 0x97, 0x40, 0xa1, 0xe5, 0x34, + 0xa1, 0x7f, 0x78, 0x53, 0x20, 0x75, 0xd4, 0x00, 0x5c, 0xee, 0x38, 0xa2, 0x06, 0x0c, 0x22, 0x94, + 0xbd, 0xe8, 0xde, 0x2b, 0x81, 0xb9, 0x96, 0x53, 0x0e, 0x17, 0xa7, 0xc4, 0x7d, 0x55, 0xc5, 0xaf, + 0xfe, 0x0f, 0x2b, 0x18, 0x15, 0x73, 0xa8, 0xab, 0xff, 0x87, 0xd3, 0xcb, 0x5e, 0x6e, 0x77, 0x81, + 0xe3, 0x1b, 0x76, 0xc7, 0x31, 0x60, 0xc7, 0xa1, 0x2b, 0xdd, 0xaa, 0x0a, 0xf2, 0x7b, 0x76, 0xc7, + 0xc1, 0x2c, 0x17, 0x0c, 0xfc, 0x1f, 0xa5, 0xb9, 0xb0, 0xe3, 0x50, 0xdf, 0x00, 0xfc, 0x5f, 0xfb, + 0x0b, 0x19, 0xe4, 0xd1, 0xb7, 0xe2, 0xa2, 0x7e, 0x97, 0x9c, 0x32, 0x0e, 0x02, 0x22, 0x3f, 0x16, + 0x4b, 0xe8, 0x3e, 0x66, 0xed, 0x9f, 0x78, 0xb0, 0xde, 0x18, 0x57, 0x1e, 0x23, 0x8a, 0x68, 0xcd, + 0x5f, 0x3d, 0x0d, 0xa6, 0x2e, 0x76, 0x9d, 0xf6, 0xa5, 0xe8, 0xb8, 0x3e, 0x7d, 0x54, 0x6f, 0x05, + 0x05, 0xd7, 0xb4, 0xb7, 0x21, 0xdd, 0x53, 0x38, 0xd9, 0xd7, 0x17, 0x62, 0xaf, 0x17, 0x83, 0x64, + 0xd1, 0xde, 0x99, 0x26, 0x02, 0xc3, 0x80, 0xca, 0xa7, 0xd3, 0x87, 0xca, 0x08, 0x27, 0xcf, 0x14, + 0x30, 0x57, 0x2e, 0xd5, 0xc9, 0x3d, 0x86, 0x8d, 0x73, 0xba, 0x22, 0x63, 0x98, 0x91, 0x4c, 0x32, + 0x84, 0x19, 0x91, 0xff, 0x4f, 0x0b, 0xf3, 0x80, 0xca, 0x1f, 0x05, 0xcc, 0x9f, 0x91, 0xc0, 0x7c, + 0xcd, 0xf2, 0xfc, 0x38, 0x6f, 0xff, 0x84, 0x78, 0xbf, 0x2f, 0x4e, 0x6b, 0x2a, 0x73, 0xe5, 0x08, + 0x07, 0xfa, 0x4d, 0x65, 0x0e, 0x27, 0x15, 0x31, 0x99, 0x63, 0x29, 0x98, 0x03, 0x72, 0x89, 0xbd, + 0xb0, 0x24, 0x53, 0x1b, 0x4a, 0x51, 0x21, 0x93, 0x37, 0x94, 0x62, 0xcb, 0xce, 0x5e, 0xbe, 0x7f, + 0x21, 0x81, 0x13, 0xa8, 0xf8, 0xa4, 0x65, 0xa9, 0x78, 0x31, 0x0f, 0x5d, 0x96, 0x4a, 0xbd, 0x32, + 0x7e, 0x80, 0x97, 0x71, 0xac, 0x8c, 0x0f, 0x23, 0x3a, 0x61, 0x31, 0xc7, 0x2c, 0xc3, 0x0e, 0x13, + 0x73, 0xc2, 0x32, 0xec, 0xe8, 0x62, 0x4e, 0x5e, 0x8a, 0x1d, 0x51, 0xcc, 0x47, 0xb6, 0xc0, 0xfa, + 0x0b, 0x72, 0x28, 0xe6, 0xd8, 0xb5, 0x8d, 0x04, 0x31, 0xa7, 0x3e, 0xd1, 0xab, 0xbd, 0x7b, 0x44, + 0xc1, 0x8f, 0x79, 0x7d, 0x63, 0x14, 0x98, 0x8e, 0x70, 0x8d, 0xe3, 0xe7, 0x64, 0xb0, 0x40, 0xb9, + 0x18, 0x3c, 0x65, 0x4e, 0xc0, 0x28, 0xf5, 0x94, 0x39, 0xf5, 0x19, 0x20, 0x9e, 0xb3, 0xc9, 0x9f, + 0x01, 0x4a, 0x2c, 0x3f, 0x7b, 0x70, 0xfe, 0x2a, 0x0f, 0x4e, 0x21, 0x16, 0xd6, 0x9c, 0x8e, 0xb5, + 0xb5, 0x4f, 0xb8, 0x38, 0x67, 0x76, 0xf7, 0xa0, 0xa7, 0x7d, 0x40, 0x12, 0x45, 0xe9, 0xbf, 0x00, + 0xe0, 0xf4, 0xa0, 0x4b, 0xe2, 0xb8, 0x51, 0xa0, 0xee, 0x89, 0xab, 0xec, 0xc1, 0x92, 0xc2, 0xeb, + 0x6f, 0x1a, 0x01, 0x11, 0x83, 0xa1, 0x87, 0xac, 0xc2, 0x99, 0xf0, 0x4d, 0xbf, 0x83, 0x47, 0xee, + 0xa0, 0x83, 0xc7, 0x2d, 0x40, 0x36, 0x3b, 0x9d, 0x10, 0xaa, 0xfe, 0xcd, 0x6c, 0x5c, 0xa6, 0x81, + 0xb2, 0xa0, 0x9c, 0x1e, 0x8c, 0x8e, 0xe6, 0xc5, 0xe4, 0xf4, 0xa0, 0xaf, 0x2e, 0x82, 0x22, 0xb9, + 0x0e, 0x3c, 0x5c, 0xd1, 0x1f, 0x9c, 0x99, 0xe6, 0xe2, 0x4d, 0xbb, 0x06, 0xaf, 0x86, 0x77, 0xa5, + 0x92, 0xcc, 0xa0, 0x7e, 0x3a, 0xb2, 0x93, 0x0d, 0x4e, 0xc1, 0x9e, 0x36, 0x32, 0xe5, 0xc9, 0xec, + 0x86, 0x95, 0x7a, 0xbd, 0xee, 0x7e, 0x8b, 0x06, 0x1e, 0x48, 0xb5, 0x1b, 0xc6, 0xc4, 0x2f, 0x90, + 0x0e, 0xc4, 0x2f, 0x48, 0xbd, 0x1b, 0xc6, 0xf1, 0x31, 0x8e, 0xdd, 0xb0, 0x24, 0x82, 0x13, 0xb9, + 0x87, 0x07, 0x5b, 0xcd, 0xf4, 0x36, 0x82, 0x7f, 0x1c, 0xec, 0x59, 0x0d, 0x78, 0x67, 0x97, 0x41, + 0x17, 0x15, 0x24, 0xde, 0xc2, 0xa2, 0x3e, 0x09, 0x14, 0xb7, 0x1c, 0x77, 0xd7, 0x0c, 0x36, 0xee, + 0xfb, 0x4f, 0x8a, 0xd0, 0x1b, 0x00, 0x96, 0x71, 0x1e, 0x83, 0xe6, 0x45, 0xf3, 0x91, 0x67, 0x5b, + 0x3d, 0x1a, 0xf4, 0x11, 0xfd, 0x55, 0x6f, 0x02, 0xf3, 0x34, 0xf6, 0x63, 0x1d, 0x7a, 0x3e, 0xec, + 0xd0, 0x88, 0x16, 0x7c, 0xa2, 0x7a, 0x16, 0xcc, 0xd1, 0x84, 0x65, 0xab, 0x0b, 0x3d, 0x1a, 0xd4, + 0x82, 0x4b, 0x53, 0x4f, 0x81, 0xa2, 0xe5, 0xdd, 0xef, 0x39, 0x36, 0x0d, 0xc8, 0x47, 0x9f, 0xd4, + 0x5b, 0xc0, 0x71, 0x9a, 0x2f, 0x34, 0x56, 0xc9, 0x81, 0x9d, 0xfe, 0x64, 0xa4, 0x5a, 0xb6, 0xb3, + 0xee, 0x3a, 0xdb, 0x2e, 0xf4, 0x3c, 0x7c, 0x6a, 0x6a, 0xda, 0x60, 0x52, 0xd4, 0x0b, 0xe0, 0x44, + 0xd7, 0xb2, 0x2f, 0x79, 0x38, 0x46, 0xf0, 0x32, 0x75, 0x1b, 0x9b, 0x1b, 0x10, 0xbb, 0x9b, 0x69, + 0x6c, 0x54, 0x0e, 0xec, 0x27, 0xc6, 0x41, 0x2a, 0xea, 0xad, 0x40, 0xa1, 0xdc, 0x2c, 0x99, 0xed, + 0x4b, 0xf8, 0x3d, 0x75, 0x47, 0x3d, 0x90, 0xce, 0x08, 0x83, 0x84, 0xd1, 0x5f, 0xe0, 0x84, 0x41, + 0x22, 0xe9, 0xbf, 0x34, 0x07, 0xe6, 0xb8, 0x02, 0x4c, 0xa0, 0x06, 0xdd, 0xa2, 0x77, 0x7e, 0xc7, + 0xf2, 0x21, 0x62, 0x8e, 0x9e, 0x75, 0x79, 0xc2, 0x10, 0xe6, 0x8d, 0x03, 0x1f, 0x1a, 0x03, 0x88, + 0x21, 0xbe, 0x48, 0x87, 0x87, 0x3d, 0xcb, 0x3c, 0x6a, 0xab, 0x72, 0x69, 0xda, 0xb3, 0x81, 0x7a, + 0x90, 0x1a, 0xe3, 0x05, 0x92, 0x4b, 0xe7, 0x05, 0x82, 0xe4, 0x66, 0x76, 0xbb, 0xce, 0x15, 0xd8, + 0x09, 0xc9, 0x52, 0x5d, 0x3d, 0x90, 0xae, 0x7d, 0x7e, 0x94, 0x79, 0x61, 0xea, 0x8b, 0x35, 0x50, + 0x23, 0xdb, 0x6b, 0xb7, 0x21, 0xec, 0xd0, 0x83, 0x6b, 0xc1, 0x63, 0xca, 0x2b, 0x37, 0x52, 0xcf, + 0x22, 0x8f, 0xe8, 0xce, 0x8d, 0xf7, 0x47, 0x37, 0x9f, 0xec, 0x89, 0x74, 0x35, 0x49, 0xe7, 0xe3, + 0x47, 0xea, 0x54, 0xb4, 0xf7, 0xa6, 0x3d, 0x2d, 0x9a, 0x88, 0xe9, 0x29, 0x34, 0xb8, 0x7b, 0x7b, + 0xdd, 0xf0, 0xb8, 0x13, 0x79, 0x4a, 0x89, 0x5e, 0xaa, 0x03, 0xa4, 0x47, 0x84, 0xdc, 0xc7, 0xae, + 0x06, 0x45, 0x72, 0xf3, 0xa0, 0xf6, 0xd2, 0x85, 0x81, 0xd0, 0x2d, 0xf0, 0xd0, 0x6d, 0x80, 0x39, + 0xdb, 0x41, 0xc5, 0xad, 0x9b, 0xae, 0xb9, 0xeb, 0x25, 0x2d, 0xef, 0x13, 0xba, 0xa1, 0x2d, 0x57, + 0x67, 0x3e, 0x5b, 0x3d, 0x66, 0x70, 0x64, 0xd4, 0xff, 0x03, 0x1c, 0xbf, 0x48, 0x43, 0x73, 0x78, + 0x94, 0xb2, 0x14, 0xef, 0xfc, 0xda, 0x47, 0x79, 0x89, 0xff, 0x72, 0xf5, 0x98, 0xd1, 0x4f, 0x4c, + 0xfd, 0x5e, 0xb0, 0x80, 0x1e, 0x3b, 0xce, 0x95, 0x80, 0x71, 0x39, 0x7e, 0x06, 0xd0, 0x47, 0x7e, + 0x8d, 0xfb, 0x70, 0xf5, 0x98, 0xd1, 0x47, 0x4a, 0x6d, 0x00, 0xb0, 0xe3, 0xef, 0x76, 0x29, 0xe1, + 0x7c, 0x7c, 0x67, 0xd2, 0x47, 0x78, 0x35, 0xfc, 0x68, 0xf5, 0x98, 0xc1, 0x90, 0x50, 0x6b, 0x60, + 0xc6, 0x7f, 0xc8, 0xa7, 0xf4, 0x0a, 0xf1, 0x5e, 0x27, 0x7d, 0xf4, 0x5a, 0xc1, 0x37, 0xab, 0xc7, + 0x8c, 0x88, 0x80, 0x5a, 0x05, 0xd3, 0xbd, 0x8b, 0x94, 0x58, 0x31, 0x7e, 0xa4, 0xea, 0x23, 0xb6, + 0x7e, 0x31, 0xa4, 0x15, 0x7e, 0x8e, 0x18, 0x6b, 0x7b, 0x97, 0x29, 0xad, 0x29, 0x61, 0xc6, 0xca, + 0xc1, 0x37, 0x88, 0xb1, 0x90, 0x80, 0x5a, 0x05, 0x33, 0x9e, 0x6d, 0xf6, 0xbc, 0x1d, 0xc7, 0xf7, + 0x4e, 0x4f, 0xf7, 0x39, 0x28, 0xc7, 0x53, 0x6b, 0xd2, 0x6f, 0x8c, 0xe8, 0x6b, 0xf5, 0x49, 0xe0, + 0xea, 0xbd, 0x5e, 0xc7, 0xf4, 0xa1, 0xfe, 0x90, 0xe5, 0xf9, 0x96, 0xbd, 0x1d, 0xc4, 0x96, 0x26, + 0xc3, 0xfc, 0xe0, 0x97, 0xea, 0x22, 0x3d, 0xaa, 0x08, 0x70, 0xbb, 0xd4, 0xfa, 0x77, 0xc9, 0x49, + 0xb1, 0xcc, 0x09, 0xc5, 0xa7, 0x82, 0x3c, 0x7a, 0x85, 0xcd, 0x82, 0x85, 0xc1, 0x2b, 0xf0, 0xfd, + 0xba, 0x83, 0x1b, 0x30, 0xfa, 0xa8, 0xcf, 0xb2, 0x98, 0x3b, 0x60, 0x59, 0xdc, 0x00, 0x66, 0x2d, + 0x6f, 0xcd, 0xda, 0x26, 0xd3, 0x1a, 0x3a, 0xf2, 0xb3, 0x49, 0x64, 0x19, 0xa8, 0x0e, 0xaf, 0x90, + 0x21, 0xff, 0x78, 0xb0, 0x0c, 0x14, 0xa4, 0x68, 0x37, 0x83, 0x39, 0xb6, 0x91, 0x91, 0xeb, 0x8b, + 0xad, 0x68, 0x52, 0x44, 0x9f, 0xb4, 0x9b, 0xc0, 0x02, 0xaf, 0xd3, 0x8c, 0xed, 0x27, 0x07, 0x83, + 0x98, 0x76, 0x23, 0x38, 0xde, 0xd7, 0xb0, 0x82, 0x60, 0x3f, 0xb9, 0x28, 0xd8, 0xcf, 0x0d, 0x00, + 0x44, 0x5a, 0x3c, 0x90, 0xcc, 0xf5, 0x60, 0x26, 0xd4, 0xcb, 0x81, 0x19, 0xfe, 0x34, 0x07, 0xa6, + 0x03, 0x65, 0x1b, 0x94, 0x01, 0xd9, 0x14, 0x36, 0xb3, 0xb3, 0x17, 0xd8, 0x14, 0x6c, 0x1a, 0x32, + 0xf0, 0x22, 0x7f, 0xfa, 0x96, 0xe5, 0x77, 0x83, 0x33, 0xa9, 0xfd, 0xc9, 0xea, 0x3a, 0x00, 0x16, + 0xc6, 0xa8, 0x15, 0x1d, 0x52, 0xbd, 0x23, 0x45, 0x7b, 0x20, 0xfa, 0xc0, 0xd0, 0x38, 0xfb, 0x1d, + 0xf4, 0x04, 0xe9, 0x0c, 0x28, 0x90, 0x0b, 0x16, 0x8e, 0xa9, 0x0b, 0x00, 0xe8, 0xcf, 0x5c, 0xd7, + 0x8d, 0xaa, 0x5e, 0x2f, 0xeb, 0x4a, 0x4e, 0x7b, 0xb9, 0x04, 0x66, 0xc2, 0x46, 0x30, 0xb0, 0x92, + 0x3a, 0x55, 0xad, 0xa1, 0x37, 0xc4, 0x1e, 0x6c, 0x54, 0xac, 0x92, 0x3d, 0x05, 0x3c, 0x6a, 0xcf, + 0x83, 0xcb, 0x96, 0xeb, 0xf9, 0x86, 0x73, 0x65, 0xd9, 0x71, 0x23, 0x93, 0x88, 0x84, 0x26, 0x8e, + 0x7b, 0x8d, 0x4c, 0xfd, 0x0e, 0xc4, 0xa7, 0x15, 0xa1, 0x4b, 0xb7, 0x6c, 0xa2, 0x04, 0x44, 0xd7, + 0x77, 0x4d, 0xdb, 0xeb, 0x39, 0x1e, 0x34, 0x9c, 0x2b, 0x5e, 0xc9, 0xee, 0x94, 0x9d, 0xee, 0xde, + 0xae, 0xed, 0x51, 0x63, 0x3d, 0xee, 0x35, 0x92, 0x0e, 0xbe, 0xff, 0x79, 0x01, 0x80, 0x72, 0xa3, + 0x56, 0xd3, 0xcb, 0xad, 0x6a, 0xa3, 0xae, 0x1c, 0x43, 0xd2, 0x6a, 0x95, 0x96, 0x6a, 0x48, 0x3a, + 0xdf, 0x07, 0xa6, 0x83, 0x36, 0x4d, 0xe3, 0x13, 0xe5, 0x82, 0xf8, 0x44, 0x6a, 0x09, 0x4c, 0x07, + 0xad, 0x9c, 0x8e, 0x08, 0x8f, 0xe9, 0x3f, 0x8f, 0xbe, 0x6b, 0xba, 0x3e, 0x36, 0x2d, 0x03, 0x22, + 0x4b, 0xa6, 0x07, 0x8d, 0xf0, 0xb3, 0xb3, 0x8f, 0xa7, 0x1c, 0xa8, 0x60, 0xa1, 0x54, 0xab, 0x6d, + 0x36, 0x8c, 0xcd, 0x7a, 0xa3, 0xb5, 0x5a, 0xad, 0xaf, 0x90, 0x11, 0xb2, 0xba, 0x52, 0x6f, 0x18, + 0x3a, 0x19, 0x20, 0x9b, 0x4a, 0x8e, 0xdc, 0x3f, 0xbe, 0x34, 0x0d, 0x8a, 0x3d, 0x2c, 0x5d, 0xed, + 0x4b, 0x72, 0x4a, 0xd3, 0x22, 0xc4, 0x29, 0xe6, 0x86, 0x64, 0xee, 0x30, 0x88, 0x34, 0xe0, 0xb0, + 0xf6, 0x59, 0x30, 0x47, 0xcc, 0x21, 0x0f, 0xef, 0xab, 0x61, 0xe4, 0x64, 0x83, 0x4b, 0xd3, 0x3e, + 0x21, 0xa5, 0x30, 0x2e, 0x06, 0x72, 0x94, 0xce, 0xb8, 0xf8, 0xbd, 0xdc, 0x68, 0xd7, 0x91, 0x54, + 0xeb, 0x2d, 0xdd, 0xa8, 0x97, 0x6a, 0x34, 0x8b, 0xac, 0x9e, 0x06, 0x27, 0xeb, 0x0d, 0x1a, 0x8c, + 0xb3, 0xb9, 0xd9, 0x6a, 0x6c, 0x56, 0xd7, 0xd6, 0x1b, 0x46, 0x4b, 0x29, 0xa8, 0xa7, 0x80, 0x4a, + 0xfe, 0x6f, 0x56, 0x9b, 0x9b, 0xe5, 0x52, 0xbd, 0xac, 0xd7, 0xf4, 0x8a, 0x52, 0x54, 0x1f, 0x0b, + 0x6e, 0x24, 0xd7, 0x5b, 0x35, 0x96, 0x37, 0x8d, 0xc6, 0xf9, 0x26, 0x42, 0xd0, 0xd0, 0x6b, 0x25, + 0xa4, 0x48, 0xcc, 0x3d, 0xe4, 0x53, 0xea, 0x55, 0xe0, 0xf8, 0x72, 0xb5, 0xa6, 0x6f, 0xd6, 0x1a, + 0xa5, 0x0a, 0x2d, 0x6f, 0x5a, 0xbd, 0x0e, 0x9c, 0xae, 0xd6, 0x9b, 0x1b, 0xcb, 0xcb, 0xd5, 0x72, + 0x55, 0xaf, 0xb7, 0x36, 0xd7, 0x75, 0x63, 0xad, 0xda, 0x6c, 0xa2, 0x6f, 0x95, 0x19, 0x7c, 0xcb, + 0x33, 0xe9, 0x33, 0x91, 0x11, 0x3b, 0x7f, 0xce, 0xec, 0x5a, 0x68, 0xa0, 0xc0, 0xd7, 0xbf, 0xf7, + 0x9d, 0xe3, 0xf2, 0xf1, 0x35, 0xf1, 0xf4, 0x24, 0x08, 0x7e, 0xd0, 0x7e, 0x48, 0x4e, 0x79, 0x8e, + 0x8b, 0x02, 0x41, 0x4a, 0x5c, 0xe4, 0x4a, 0x8b, 0x59, 0x75, 0x78, 0x8d, 0x94, 0xe2, 0x1c, 0x97, + 0x38, 0xf9, 0x74, 0xe0, 0xff, 0xfc, 0xb8, 0xc0, 0x57, 0xc0, 0xdc, 0x46, 0xbd, 0xb4, 0xd1, 0x5a, + 0x6d, 0x18, 0xd5, 0xef, 0xc1, 0xb7, 0x10, 0xcc, 0x83, 0x99, 0xe5, 0x86, 0xb1, 0x54, 0xad, 0x54, + 0xf4, 0xba, 0x52, 0x50, 0x1f, 0x05, 0xae, 0x6a, 0xea, 0xc6, 0xb9, 0x6a, 0x59, 0xdf, 0xdc, 0xa8, + 0x97, 0xce, 0x95, 0xaa, 0x35, 0xdc, 0x47, 0x14, 0x13, 0xae, 0xae, 0x9f, 0xd2, 0x7e, 0x20, 0x0f, + 0x00, 0xa9, 0x3a, 0xbe, 0x84, 0x8b, 0xb9, 0xe0, 0xfc, 0x0f, 0xd2, 0x4e, 0xf7, 0x22, 0x32, 0x31, + 0xed, 0xb7, 0x0a, 0xa6, 0x5d, 0xfa, 0x82, 0xae, 0x6b, 0x0e, 0xa3, 0x43, 0xfe, 0x06, 0xd4, 0x8c, + 0xf0, 0x73, 0xed, 0x03, 0x69, 0x66, 0x77, 0xb1, 0x8c, 0xa5, 0x43, 0x72, 0x79, 0x3c, 0x40, 0x6a, + 0x2f, 0xca, 0x81, 0x05, 0xbe, 0x62, 0xa8, 0x12, 0xd8, 0x98, 0x12, 0xab, 0x04, 0xff, 0x31, 0x63, + 0x64, 0x9d, 0x7d, 0x22, 0x1d, 0x4e, 0x41, 0xd0, 0x32, 0x49, 0x48, 0x86, 0xc0, 0x62, 0x51, 0x72, + 0x88, 0x79, 0x64, 0x74, 0x28, 0x92, 0x3a, 0x05, 0xe4, 0xd6, 0x43, 0xbe, 0x22, 0x6b, 0x5f, 0x93, + 0xc1, 0x3c, 0x77, 0x83, 0xba, 0xf6, 0xce, 0x9c, 0xc8, 0xed, 0xc6, 0xcc, 0xdd, 0xec, 0xb9, 0xc3, + 0xde, 0xcd, 0x7e, 0xf6, 0x3e, 0x30, 0x45, 0xd3, 0xb0, 0x7c, 0x1b, 0x75, 0x64, 0x0a, 0x1c, 0x07, + 0xb3, 0x2b, 0x7a, 0x6b, 0xb3, 0xd9, 0x2a, 0x19, 0x2d, 0xbd, 0xa2, 0xe4, 0xd0, 0xc0, 0xa7, 0xaf, + 0xad, 0xb7, 0x2e, 0x28, 0x12, 0x1a, 0x13, 0x57, 0x36, 0xaa, 0x15, 0x7d, 0xb3, 0x51, 0xaf, 0x5d, + 0x50, 0xe4, 0xf4, 0xae, 0xb2, 0xfd, 0x8c, 0x4d, 0xd8, 0x55, 0x36, 0xa9, 0xf8, 0xec, 0xe7, 0xae, + 0x9f, 0x93, 0x81, 0x42, 0x38, 0xd0, 0x1f, 0xea, 0x41, 0xd7, 0x82, 0x76, 0x1b, 0x6a, 0x97, 0x44, + 0x42, 0xf7, 0x1e, 0x08, 0x5a, 0x89, 0xfb, 0x77, 0xc6, 0x6a, 0x24, 0x0f, 0x7d, 0x06, 0x77, 0xfe, + 0x80, 0xc1, 0xfd, 0x5b, 0x69, 0x7d, 0x65, 0xfb, 0xd9, 0x1d, 0x0b, 0x64, 0x9f, 0x4e, 0xe3, 0x2b, + 0x3b, 0x84, 0x83, 0x89, 0x44, 0xe4, 0x8e, 0x19, 0x8f, 0x15, 0x59, 0x7b, 0xa1, 0x0c, 0x8e, 0x57, + 0x4c, 0x1f, 0x2e, 0xed, 0xb7, 0x82, 0x1b, 0x4f, 0x63, 0x6e, 0x29, 0xcf, 0x1d, 0xb8, 0xa5, 0x3c, + 0xba, 0x34, 0x55, 0xea, 0xbb, 0x34, 0x55, 0x7b, 0x4f, 0xda, 0xd3, 0xb5, 0x7d, 0x3c, 0x8c, 0x2d, + 0x6c, 0x76, 0xba, 0x53, 0xb3, 0xc9, 0x5c, 0x64, 0xdf, 0xc0, 0xde, 0x3e, 0x03, 0x14, 0xc2, 0x0a, + 0xe3, 0x0e, 0xfa, 0x53, 0xf4, 0x62, 0xff, 0xcd, 0x14, 0xd1, 0x37, 0x83, 0x78, 0x26, 0x12, 0x1f, + 0xcf, 0x84, 0xdb, 0x5d, 0x90, 0xfb, 0x5d, 0x78, 0xd2, 0x76, 0x86, 0x8c, 0xef, 0x67, 0x7c, 0xc0, + 0xe3, 0xec, 0x3a, 0xc3, 0xc4, 0xe2, 0x27, 0x73, 0xf9, 0x34, 0xbd, 0xef, 0x55, 0x17, 0x45, 0x26, + 0xf9, 0x8e, 0xfd, 0xb4, 0x07, 0x01, 0x38, 0xdf, 0xdb, 0x84, 0x8b, 0xe7, 0xb3, 0x3b, 0x08, 0x30, + 0x8c, 0x83, 0xec, 0x51, 0xf8, 0x96, 0x04, 0xf2, 0x4d, 0xc7, 0xf5, 0xc7, 0x85, 0x41, 0x5a, 0xe7, + 0x05, 0x46, 0x02, 0xcd, 0xf8, 0x39, 0x68, 0x76, 0xce, 0x0b, 0xc9, 0xe5, 0x4f, 0x20, 0x80, 0xe9, + 0x71, 0xb0, 0x40, 0x38, 0x09, 0x6f, 0xff, 0xf9, 0x57, 0x89, 0xf4, 0x57, 0x0f, 0x88, 0x22, 0x82, + 0xb7, 0xb0, 0x42, 0xe7, 0x81, 0x00, 0x14, 0x2e, 0x4d, 0x7b, 0x23, 0x8b, 0x4b, 0x85, 0xc7, 0x65, + 0xd0, 0x0c, 0x3c, 0xbc, 0x40, 0x67, 0x5c, 0x3d, 0x53, 0x9a, 0x58, 0xa8, 0x09, 0x85, 0x67, 0x8f, + 0xc8, 0xc3, 0x32, 0x28, 0x52, 0xe7, 0xcd, 0xb1, 0x22, 0x90, 0xb6, 0x65, 0x84, 0x42, 0x10, 0x73, + 0xf2, 0x94, 0xc7, 0xdd, 0x32, 0x92, 0xcb, 0xcf, 0x1e, 0x87, 0x7f, 0xa7, 0x5e, 0xc9, 0xa5, 0xcb, + 0xa6, 0xd5, 0x35, 0x2f, 0x76, 0x53, 0xc4, 0x20, 0xff, 0x44, 0xca, 0x73, 0x98, 0x61, 0x55, 0xb9, + 0xf2, 0x62, 0x24, 0xfe, 0x5d, 0x60, 0xc6, 0xe5, 0x76, 0x6d, 0x91, 0x15, 0xd5, 0xe7, 0x11, 0x4e, + 0xdf, 0x1b, 0x51, 0xce, 0x54, 0x87, 0x2e, 0x85, 0xf8, 0x99, 0xc8, 0x21, 0xb1, 0xd9, 0x52, 0xa7, + 0xb3, 0x0c, 0x4d, 0x7f, 0xcf, 0x85, 0x9d, 0x54, 0x43, 0x84, 0xdb, 0xb7, 0xb1, 0xcd, 0x48, 0x82, + 0x8b, 0x02, 0x5a, 0xe3, 0xd1, 0x79, 0xf2, 0x90, 0xde, 0x20, 0xe0, 0x65, 0x2c, 0x5d, 0xd2, 0xdb, + 0x42, 0x48, 0x1a, 0x1c, 0x24, 0x4f, 0x1d, 0x8d, 0x89, 0xec, 0x01, 0xf9, 0x19, 0x19, 0x2c, 0x10, + 0x3b, 0x61, 0xdc, 0x98, 0x7c, 0x28, 0xa5, 0xb3, 0x17, 0x73, 0xbf, 0x1a, 0xcb, 0xce, 0x58, 0x60, + 0x49, 0xe3, 0x1a, 0x26, 0xc6, 0x47, 0xf6, 0xc8, 0x3c, 0xef, 0x04, 0x00, 0x8c, 0x03, 0xef, 0x27, + 0x8a, 0x51, 0x44, 0x4e, 0xed, 0x9d, 0x74, 0xfe, 0xd1, 0xe4, 0xc2, 0xc3, 0x33, 0xce, 0xb9, 0xe1, + 0x06, 0x15, 0x9f, 0x28, 0x34, 0xaa, 0xfc, 0x5e, 0x4a, 0x9b, 0x97, 0xba, 0xcf, 0x0e, 0x1d, 0xdc, + 0x47, 0xec, 0xe5, 0x3e, 0x99, 0xc2, 0xf8, 0x1d, 0xc6, 0x4a, 0x3a, 0xd4, 0x6a, 0x23, 0xcc, 0xec, + 0x4f, 0x83, 0x93, 0x86, 0x5e, 0xaa, 0x34, 0xea, 0xb5, 0x0b, 0xec, 0x65, 0x5b, 0x8a, 0xcc, 0x4e, + 0x4e, 0x32, 0x81, 0xed, 0x75, 0x29, 0xfb, 0x40, 0x5e, 0x56, 0x49, 0xb3, 0x15, 0x66, 0x71, 0x65, + 0x78, 0xaf, 0x26, 0x40, 0xf6, 0x28, 0x51, 0xf8, 0x5a, 0x11, 0xcc, 0x1a, 0xb0, 0xed, 0xec, 0xee, + 0x42, 0xbb, 0x03, 0x3b, 0xda, 0xeb, 0x64, 0x30, 0x17, 0xee, 0xff, 0x35, 0xa1, 0xaf, 0x7d, 0x6f, + 0x84, 0xcd, 0x59, 0x30, 0x87, 0x2a, 0xd7, 0xe0, 0x43, 0xfe, 0x73, 0x69, 0xea, 0x6d, 0xe0, 0x44, + 0x80, 0x42, 0xa3, 0x6f, 0x0a, 0x73, 0xf0, 0x05, 0xef, 0xa1, 0xb3, 0xc1, 0x63, 0x74, 0x5f, 0xbc, + 0x30, 0x43, 0x76, 0x17, 0x59, 0x56, 0x63, 0xc0, 0xfa, 0x9d, 0x10, 0xac, 0x67, 0x72, 0x60, 0x55, + 0x0e, 0x49, 0xff, 0x28, 0x51, 0xfb, 0x65, 0x19, 0x9c, 0x0c, 0x3a, 0xe2, 0xc9, 0xa1, 0xf5, 0x49, + 0x16, 0xad, 0xef, 0xe3, 0xd1, 0x5a, 0x11, 0x91, 0xe6, 0x20, 0x96, 0x63, 0x50, 0xfb, 0x62, 0x88, + 0xda, 0xf7, 0x73, 0xa8, 0xd5, 0xc6, 0x54, 0xce, 0x51, 0xa2, 0xf7, 0x21, 0x19, 0x9c, 0x46, 0x66, + 0x67, 0xd9, 0xb1, 0xb7, 0xba, 0x56, 0xdb, 0xb7, 0xec, 0xed, 0xc8, 0x19, 0x71, 0x45, 0x64, 0x65, + 0xb3, 0x1f, 0x5b, 0xe9, 0x20, 0xb6, 0x7c, 0xa4, 0x14, 0xd1, 0xb6, 0x15, 0xc7, 0x56, 0xcc, 0x10, + 0xc6, 0xb8, 0xd9, 0x47, 0x9a, 0xc3, 0x26, 0xa5, 0x6f, 0x7d, 0x82, 0x1c, 0x1c, 0x25, 0x7e, 0x0f, + 0x03, 0xc6, 0xf4, 0x78, 0x81, 0x0c, 0x14, 0xec, 0xf9, 0x8a, 0x7b, 0x76, 0x7a, 0x13, 0x6d, 0x83, + 0x3f, 0x13, 0xd1, 0x0b, 0x04, 0x14, 0x9c, 0x89, 0x08, 0x12, 0xd4, 0x9b, 0xc1, 0x42, 0x7b, 0x07, + 0xb6, 0x2f, 0x55, 0xed, 0xc0, 0x37, 0x89, 0x38, 0xb2, 0xf4, 0xa5, 0xf2, 0x83, 0xd9, 0x03, 0x3c, + 0x98, 0xfc, 0xc2, 0x23, 0x37, 0xb1, 0x61, 0x99, 0x8a, 0x69, 0x68, 0xbf, 0x1e, 0x02, 0x54, 0xe7, + 0x00, 0xba, 0x7b, 0x24, 0xaa, 0xe9, 0x60, 0xa9, 0x8f, 0x00, 0x8b, 0x06, 0x4e, 0x35, 0xd6, 0x5b, + 0xd5, 0x46, 0x7d, 0x73, 0xa3, 0xa9, 0x57, 0x36, 0x97, 0x02, 0x70, 0x9a, 0x8a, 0xac, 0x7d, 0x55, + 0x02, 0x53, 0x84, 0x2d, 0x4f, 0x7b, 0x5c, 0x04, 0xc1, 0xd0, 0xc3, 0x20, 0xda, 0xdb, 0x85, 0x43, + 0x3b, 0x85, 0x82, 0xa0, 0xe5, 0xc4, 0x34, 0x8c, 0xa7, 0x80, 0x29, 0x02, 0x72, 0xb0, 0x0b, 0x70, + 0x26, 0xc6, 0xb2, 0xa3, 0x64, 0x8c, 0x20, 0xbb, 0x60, 0x98, 0xa7, 0x21, 0x6c, 0x64, 0x6f, 0x8d, + 0x3f, 0x27, 0x4f, 0x96, 0x0e, 0xce, 0x5b, 0xfe, 0x0e, 0x3e, 0x2b, 0xa2, 0x3d, 0x43, 0xa4, 0xe3, + 0xba, 0x0d, 0x14, 0x2e, 0xa3, 0xdc, 0x43, 0xce, 0xdd, 0x90, 0x4c, 0xda, 0xcf, 0x0b, 0x47, 0x15, + 0xe7, 0xf4, 0x33, 0xe4, 0x29, 0x06, 0x9c, 0x35, 0x90, 0xef, 0x5a, 0x9e, 0x4f, 0x6d, 0xee, 0xbb, + 0x52, 0x11, 0x0a, 0xfe, 0x54, 0x7d, 0xb8, 0x6b, 0x60, 0x32, 0xda, 0xfd, 0xc8, 0x62, 0x8a, 0x52, + 0x05, 0xce, 0x1e, 0x9d, 0x06, 0x53, 0xf4, 0x4c, 0x3c, 0xdd, 0x96, 0x0a, 0x1e, 0x05, 0xb7, 0x82, + 0x84, 0x6a, 0x9b, 0xbd, 0x0e, 0xfc, 0x7f, 0xc7, 0xc1, 0xd4, 0xaa, 0xe5, 0xf9, 0x8e, 0xbb, 0xaf, + 0xbd, 0x3e, 0x07, 0xa6, 0xce, 0x41, 0xd7, 0xb3, 0x1c, 0xfb, 0x80, 0xbb, 0xd6, 0x0d, 0x60, 0xb6, + 0xe7, 0xc2, 0xcb, 0x96, 0xb3, 0xe7, 0x31, 0xa3, 0x04, 0x93, 0xa4, 0x6a, 0x60, 0xda, 0xdc, 0xf3, + 0x77, 0x1c, 0x37, 0x0a, 0xa5, 0x15, 0x3c, 0xab, 0x67, 0x00, 0x20, 0xff, 0xeb, 0xe6, 0x2e, 0x0c, + 0x6e, 0xcb, 0x8f, 0x52, 0x54, 0x15, 0xe4, 0x7d, 0x6b, 0x17, 0xd2, 0xd8, 0xfa, 0xf8, 0x3f, 0x12, + 0x30, 0x8e, 0x53, 0x4b, 0xe3, 0x01, 0xcb, 0x46, 0xf0, 0xa8, 0xfd, 0xa1, 0x0c, 0x66, 0x57, 0xa0, + 0x4f, 0x59, 0xf5, 0xb4, 0x17, 0xe7, 0x84, 0xae, 0xb3, 0x42, 0xf3, 0x92, 0xae, 0xe9, 0x05, 0xdf, + 0x85, 0x43, 0x2e, 0x9f, 0x18, 0x05, 0xfa, 0x97, 0xd9, 0x5b, 0x3e, 0x70, 0xd4, 0x57, 0xbf, 0x4a, + 0x8e, 0x61, 0xd0, 0xcc, 0x74, 0xe3, 0xf8, 0xe0, 0x0b, 0xde, 0x26, 0x4e, 0x8c, 0x98, 0x42, 0x65, + 0xbf, 0xc8, 0xd4, 0x27, 0xb6, 0x3b, 0x9a, 0xbe, 0x4c, 0x73, 0x1c, 0xb8, 0xc0, 0x85, 0xa5, 0x44, + 0xc9, 0x18, 0x61, 0x6e, 0xc1, 0x58, 0x2b, 0xc3, 0x39, 0x99, 0xc0, 0x95, 0xbd, 0x32, 0x98, 0x6d, + 0xee, 0x38, 0x57, 0x02, 0x39, 0x7e, 0x9f, 0x18, 0xb0, 0xd7, 0x81, 0x99, 0xcb, 0x7d, 0xa0, 0x46, + 0x09, 0xec, 0x2d, 0x81, 0x32, 0x7f, 0x4b, 0xe0, 0xf3, 0xe5, 0xb4, 0x30, 0x31, 0xcc, 0xc5, 0xc0, + 0xc4, 0x5f, 0xec, 0x27, 0xa5, 0xb8, 0xd8, 0x4f, 0x7d, 0x32, 0x98, 0xa2, 0x5c, 0xd3, 0x65, 0xea, + 0x64, 0x80, 0x83, 0xcc, 0x6c, 0x05, 0xf3, 0x7c, 0x05, 0xd3, 0x21, 0x1f, 0x5f, 0xb9, 0xec, 0x91, + 0xff, 0x4d, 0x09, 0x47, 0xda, 0x0a, 0x80, 0x2f, 0x8f, 0x01, 0x78, 0xed, 0x9b, 0x39, 0xd1, 0xcd, + 0x9c, 0x50, 0x02, 0x21, 0x07, 0x87, 0xba, 0xaa, 0x6e, 0x28, 0xb9, 0xec, 0xe5, 0xf9, 0xf2, 0x3c, + 0x98, 0xab, 0x58, 0x5b, 0x5b, 0x61, 0x27, 0xf9, 0x12, 0xc1, 0x4e, 0x32, 0xde, 0xa5, 0x0a, 0xd9, + 0xb9, 0x7b, 0xae, 0x0b, 0xed, 0xa0, 0x52, 0xb4, 0x39, 0xf5, 0xa5, 0xaa, 0xb7, 0x80, 0xe3, 0xc1, + 0xb8, 0xc0, 0x76, 0x94, 0x33, 0x46, 0x7f, 0xb2, 0xf6, 0x75, 0x61, 0x4f, 0x80, 0x40, 0xa2, 0x6c, + 0x95, 0x62, 0x1a, 0xe0, 0x3d, 0x60, 0x7e, 0x87, 0xe4, 0xc6, 0xcb, 0xa5, 0x41, 0x67, 0x79, 0xaa, + 0xef, 0x26, 0x83, 0x35, 0xe8, 0x79, 0xe6, 0x36, 0x34, 0xf8, 0xcc, 0x7d, 0xcd, 0x57, 0x4e, 0x73, + 0x2f, 0xa7, 0x98, 0x53, 0x81, 0x40, 0x4d, 0xb2, 0xd7, 0x8e, 0x2f, 0x9e, 0x05, 0xf9, 0x65, 0xab, + 0x0b, 0xb5, 0x1f, 0x91, 0xc0, 0x0c, 0x9a, 0x75, 0xdb, 0x6d, 0xf4, 0xc4, 0x38, 0x58, 0x7e, 0x2d, + 0x27, 0x7a, 0x1f, 0x35, 0xa2, 0xb3, 0x18, 0xd2, 0x88, 0x69, 0x37, 0x62, 0xf7, 0x4e, 0x27, 0x92, + 0x9a, 0xc0, 0xed, 0x61, 0x68, 0xea, 0xb1, 0xb5, 0xd5, 0x75, 0x4c, 0x6e, 0xc3, 0xa0, 0xdf, 0x14, + 0x8a, 0x8e, 0x73, 0xd6, 0x1d, 0x7f, 0xdd, 0xb2, 0xed, 0x30, 0x42, 0xca, 0x81, 0x74, 0xde, 0xd7, + 0x25, 0x31, 0xc8, 0x1c, 0xae, 0x3b, 0x2d, 0x3d, 0x46, 0xb3, 0x6f, 0x06, 0x0b, 0x17, 0xf7, 0x7d, + 0xe8, 0xd1, 0x5c, 0xb4, 0xd8, 0xbc, 0xd1, 0x97, 0xca, 0x5c, 0x11, 0x91, 0x14, 0x8c, 0x2e, 0xa1, + 0xc0, 0x74, 0xa2, 0x5e, 0x1d, 0x61, 0x06, 0x78, 0x12, 0x28, 0xf5, 0x46, 0x45, 0xc7, 0xfe, 0xbe, + 0x81, 0x07, 0xe5, 0xb6, 0xf6, 0x93, 0x32, 0x98, 0xc3, 0x0e, 0x78, 0x01, 0x0a, 0x37, 0x0a, 0xcc, + 0x47, 0xb4, 0x2f, 0x0b, 0xfb, 0x02, 0xe3, 0x2a, 0xb3, 0x05, 0xc4, 0x0b, 0x7a, 0xcb, 0xea, 0xf6, + 0x0b, 0xba, 0x60, 0xf4, 0xa5, 0x0e, 0x00, 0x44, 0x1e, 0x08, 0xc8, 0x2f, 0x0b, 0x39, 0x04, 0x0f, + 0xe3, 0xee, 0xa8, 0x50, 0xf9, 0x15, 0x19, 0xcc, 0xa2, 0x49, 0x4a, 0x00, 0x4a, 0x83, 0x03, 0xc5, + 0xb1, 0xbb, 0xfb, 0xd1, 0xb2, 0x48, 0xf0, 0x98, 0xaa, 0x91, 0xfc, 0x91, 0xf0, 0xcc, 0x1d, 0x8b, + 0x88, 0xe1, 0x65, 0x42, 0xf8, 0x7d, 0x50, 0x68, 0x3e, 0x3f, 0x84, 0xb9, 0xa3, 0x82, 0xef, 0xb5, + 0x45, 0x50, 0xdc, 0xe8, 0x61, 0xe4, 0xbe, 0x24, 0x8b, 0x5c, 0xb7, 0x72, 0xe0, 0x30, 0x18, 0x32, + 0xb3, 0xba, 0x4e, 0xdb, 0xec, 0xae, 0x47, 0xe7, 0xa1, 0xa3, 0x04, 0xf5, 0x6e, 0xea, 0x1f, 0x4e, + 0x8e, 0xf5, 0xde, 0x9c, 0x78, 0x13, 0x09, 0x96, 0x11, 0x73, 0xf0, 0xee, 0x36, 0x70, 0xa2, 0x63, + 0x79, 0xe6, 0xc5, 0x2e, 0xd4, 0xed, 0xb6, 0xbb, 0x4f, 0xc4, 0x41, 0xa7, 0x55, 0x07, 0x5e, 0xa8, + 0xf7, 0x82, 0x82, 0xe7, 0xef, 0x77, 0xc9, 0x3c, 0x91, 0x3d, 0xa7, 0x17, 0x5b, 0x54, 0x13, 0x65, + 0x37, 0xc8, 0x57, 0xac, 0x5b, 0xe7, 0x94, 0x98, 0x5b, 0xa7, 0xfa, 0x44, 0x50, 0x74, 0x5c, 0x6b, + 0xdb, 0x22, 0x97, 0x0b, 0x2e, 0x1c, 0x08, 0xb8, 0x4b, 0x4c, 0x81, 0x06, 0xce, 0x62, 0xd0, 0xac, + 0xea, 0x93, 0xc1, 0x8c, 0xb5, 0x6b, 0x6e, 0xc3, 0x07, 0x2c, 0x9b, 0x84, 0x23, 0x58, 0xb8, 0xf3, + 0xf4, 0x81, 0x23, 0x88, 0xf4, 0xbd, 0x11, 0x65, 0x55, 0xef, 0x01, 0xd7, 0xb4, 0x5d, 0x68, 0xfa, + 0x10, 0x09, 0xe8, 0xbc, 0xd5, 0xd9, 0x86, 0x7e, 0x75, 0x6b, 0xcd, 0xf2, 0x3c, 0xcb, 0xde, 0xa6, + 0xf7, 0x87, 0xc6, 0x67, 0xd0, 0x3e, 0x28, 0x89, 0xc6, 0x14, 0xc4, 0x92, 0x21, 0x2a, 0x31, 0xc2, + 0x3d, 0xe7, 0x8c, 0x14, 0x65, 0x41, 0xe7, 0xd8, 0x57, 0x09, 0x45, 0xfb, 0x8b, 0x67, 0x2b, 0xfb, + 0xa1, 0xff, 0xf7, 0x25, 0x30, 0x5d, 0x71, 0xae, 0xd8, 0xb8, 0x99, 0xdc, 0x25, 0x66, 0x29, 0x0f, + 0x08, 0x10, 0xc0, 0xdf, 0x98, 0x9d, 0x78, 0xa6, 0x0c, 0xd7, 0x36, 0x28, 0x32, 0x06, 0x86, 0xc4, + 0x76, 0x27, 0x78, 0x0c, 0x3d, 0xa9, 0x9c, 0xec, 0xe5, 0xfa, 0xdb, 0x32, 0xc8, 0x57, 0x5c, 0xa7, + 0xa7, 0xbd, 0x2d, 0x97, 0xc2, 0x49, 0xac, 0xe3, 0x3a, 0xbd, 0x16, 0xbe, 0x88, 0x34, 0xda, 0x17, + 0x61, 0xd3, 0xd4, 0xbb, 0xc0, 0x74, 0xcf, 0xf1, 0x2c, 0x3f, 0x98, 0x84, 0x2c, 0xdc, 0xf9, 0xe8, + 0x81, 0x7d, 0xc1, 0x3a, 0xcd, 0x64, 0x84, 0xd9, 0x51, 0x9f, 0x8f, 0x45, 0x88, 0xe4, 0x82, 0xc4, + 0x18, 0x5c, 0xc6, 0xda, 0x97, 0xaa, 0xbd, 0x94, 0x45, 0xf2, 0xa9, 0x3c, 0x92, 0x8f, 0x19, 0x20, + 0x61, 0xd7, 0xe9, 0x8d, 0xc5, 0xad, 0xe3, 0x15, 0x21, 0xaa, 0x4f, 0xe3, 0x50, 0xbd, 0x55, 0xa8, + 0xcc, 0xec, 0x11, 0xfd, 0x60, 0x1e, 0x00, 0x6c, 0xa4, 0x6c, 0xa0, 0xe9, 0x93, 0x98, 0x85, 0xf6, + 0xc3, 0x79, 0x46, 0x96, 0x25, 0x5e, 0x96, 0x8f, 0x8b, 0xb1, 0x81, 0x30, 0xf9, 0x18, 0x89, 0x96, + 0x40, 0x61, 0x0f, 0xbd, 0xa6, 0x12, 0x15, 0x24, 0x81, 0x1f, 0x0d, 0xf2, 0xa5, 0xf6, 0x9b, 0x39, + 0x50, 0xc0, 0x09, 0xea, 0x19, 0x00, 0xb0, 0x59, 0x40, 0x8e, 0x64, 0xe6, 0xb0, 0x01, 0xc0, 0xa4, + 0x60, 0x6d, 0xb5, 0x3a, 0xf4, 0x35, 0x31, 0xb8, 0xa3, 0x04, 0xf4, 0x35, 0x36, 0x16, 0x30, 0x2d, + 0x6a, 0x3e, 0x30, 0x29, 0xe8, 0x6b, 0xfc, 0x54, 0x83, 0x5b, 0xe4, 0x8e, 0x88, 0xbc, 0x11, 0x25, + 0x84, 0x5f, 0xd7, 0xc2, 0x9b, 0x45, 0x83, 0xaf, 0x71, 0x0a, 0x9a, 0x4a, 0x63, 0xb5, 0x5c, 0x8a, + 0x8a, 0x28, 0xe2, 0x4c, 0xfd, 0xc9, 0xda, 0xeb, 0x42, 0xb5, 0xa9, 0x70, 0x6a, 0x73, 0x47, 0x0a, + 0xf1, 0x66, 0xaf, 0x3c, 0x7f, 0x5a, 0x00, 0x33, 0x75, 0xa7, 0x43, 0x75, 0x87, 0x99, 0x6e, 0x7e, + 0xba, 0x90, 0x6a, 0xba, 0x19, 0xd2, 0x88, 0x51, 0x90, 0xa7, 0xf3, 0x0a, 0x22, 0x46, 0x81, 0xd5, + 0x0f, 0x75, 0x09, 0x14, 0xb1, 0xf6, 0x1e, 0xbc, 0xb2, 0x32, 0x89, 0x04, 0x16, 0xad, 0x41, 0xbf, + 0xfc, 0x0f, 0xa7, 0x63, 0xff, 0x0d, 0x14, 0x70, 0x05, 0x13, 0xf6, 0x86, 0xf8, 0x8a, 0x4a, 0xc9, + 0x15, 0x95, 0x93, 0x2b, 0x9a, 0xef, 0xaf, 0x68, 0x9a, 0x55, 0x84, 0x38, 0x0d, 0xc9, 0x5e, 0xc7, + 0xff, 0x76, 0x0a, 0x80, 0xba, 0x79, 0xd9, 0xda, 0x26, 0x7b, 0xcb, 0x7f, 0x18, 0xcc, 0x9e, 0xe8, + 0x2e, 0xf0, 0x8f, 0x31, 0x03, 0xe1, 0x5d, 0x60, 0x8a, 0x8e, 0x7b, 0xb4, 0x22, 0xd7, 0x73, 0x15, + 0x89, 0xa8, 0x10, 0xa3, 0xf6, 0x21, 0xdf, 0x08, 0xf2, 0x73, 0xb7, 0xeb, 0x4b, 0x7d, 0xb7, 0xeb, + 0x0f, 0xde, 0xc1, 0x88, 0xb9, 0x73, 0x5f, 0x7b, 0x9f, 0xf0, 0x19, 0x2a, 0x86, 0x1f, 0xa6, 0x46, + 0x31, 0x4d, 0xf0, 0x89, 0x60, 0xca, 0x09, 0xb7, 0xc3, 0xe5, 0xd8, 0x55, 0xb4, 0xaa, 0xbd, 0xe5, + 0x18, 0x41, 0x4e, 0xc1, 0xad, 0x33, 0x21, 0x3e, 0x26, 0x72, 0x4c, 0xf1, 0xd4, 0x4a, 0x10, 0x6f, + 0x13, 0xd5, 0xe3, 0xbc, 0xe5, 0xef, 0xd4, 0x2c, 0xfb, 0x92, 0xa7, 0x7d, 0xbf, 0x98, 0x05, 0xc9, + 0xe0, 0x2f, 0xa5, 0xc3, 0x9f, 0x8f, 0x77, 0xd5, 0xe4, 0x51, 0xbb, 0x37, 0x8e, 0xca, 0x60, 0x6e, + 0x63, 0x00, 0xbc, 0x1b, 0x14, 0x09, 0xa3, 0xb4, 0x13, 0x3d, 0x1b, 0x8b, 0x5f, 0x48, 0xc9, 0xa0, + 0x5f, 0x68, 0xef, 0x0d, 0x71, 0x3c, 0xc7, 0xe1, 0xb8, 0x74, 0x28, 0xce, 0x32, 0x87, 0xf4, 0xec, + 0x13, 0xc0, 0x14, 0x95, 0xb4, 0xba, 0xc0, 0xb6, 0x62, 0xe5, 0x98, 0x0a, 0x40, 0x71, 0xcd, 0xb9, + 0x0c, 0x5b, 0x8e, 0x92, 0x43, 0xff, 0x11, 0x7f, 0x2d, 0x47, 0x91, 0xb4, 0x57, 0x4e, 0x83, 0xe9, + 0x30, 0xd0, 0xe1, 0xef, 0x4b, 0x40, 0x29, 0xe3, 0x19, 0xda, 0xb2, 0xeb, 0xec, 0x92, 0x1a, 0x89, + 0xfb, 0xe3, 0xff, 0x8c, 0xb0, 0x83, 0x48, 0x18, 0x80, 0xb0, 0xbf, 0xb0, 0x18, 0x2c, 0xc9, 0x12, + 0xa6, 0x14, 0x2c, 0x61, 0x6a, 0x6f, 0x15, 0x72, 0x18, 0x11, 0x2d, 0x25, 0xfb, 0xa6, 0xf6, 0x5b, + 0x12, 0x28, 0x94, 0xbb, 0x8e, 0x0d, 0xd9, 0x43, 0xa3, 0x43, 0x4f, 0x27, 0x0e, 0xde, 0xc7, 0xd0, + 0x9e, 0x23, 0x89, 0xda, 0x1a, 0x91, 0x00, 0x50, 0xd9, 0x82, 0xb2, 0x15, 0x1b, 0xa4, 0x12, 0x49, + 0x67, 0x2f, 0xd0, 0xaf, 0x4a, 0x60, 0x86, 0x44, 0x26, 0x2b, 0x75, 0xbb, 0xda, 0xa3, 0x23, 0xa1, + 0x0e, 0x08, 0x16, 0xa9, 0xfd, 0xb2, 0xf0, 0xa1, 0xa8, 0xb0, 0x56, 0x21, 0xed, 0x14, 0xc1, 0xf5, + 0xd2, 0x9d, 0xd1, 0x11, 0xdb, 0x89, 0x1b, 0xca, 0x50, 0xf6, 0xa2, 0xfe, 0x03, 0x09, 0x19, 0x00, + 0xf6, 0xa5, 0x75, 0x17, 0x5e, 0xb6, 0xe0, 0x15, 0xed, 0xda, 0x48, 0xd8, 0x07, 0xc3, 0x2e, 0xbd, + 0x49, 0x78, 0x11, 0x87, 0x21, 0x19, 0xbb, 0x11, 0x36, 0xdb, 0x8d, 0x32, 0xd1, 0x5e, 0xbc, 0x3f, + 0x16, 0x16, 0x43, 0xc6, 0x60, 0xb3, 0x0b, 0xae, 0xd9, 0xc4, 0x73, 0x91, 0xbd, 0x60, 0x3f, 0x3a, + 0x05, 0xa6, 0x37, 0x6c, 0xaf, 0xd7, 0x35, 0xbd, 0x1d, 0xed, 0x5f, 0x65, 0x50, 0x24, 0x17, 0xa5, + 0x6a, 0xdf, 0xc5, 0x45, 0x77, 0x79, 0xd6, 0x1e, 0x74, 0x03, 0x07, 0x1e, 0xf2, 0x10, 0xd9, 0x47, + 0x12, 0x63, 0x1f, 0x69, 0x1f, 0x94, 0x45, 0x27, 0xa9, 0x41, 0xa1, 0xf4, 0x66, 0xd6, 0xf8, 0x80, + 0x22, 0x3d, 0xab, 0xed, 0xef, 0xb9, 0xd0, 0x1b, 0x18, 0x50, 0x24, 0x96, 0xca, 0x3a, 0xf9, 0xca, + 0x08, 0x3f, 0xd7, 0x4c, 0x30, 0x45, 0x13, 0x0f, 0x6c, 0x46, 0x1d, 0x8c, 0x78, 0x70, 0x0a, 0x14, + 0x4d, 0xd7, 0xb7, 0x3c, 0x9f, 0x6e, 0xcf, 0xd2, 0x27, 0xd4, 0x5d, 0x92, 0x7f, 0x1b, 0x6e, 0x37, + 0x88, 0x03, 0x15, 0x26, 0x68, 0xbf, 0x22, 0x34, 0x7f, 0x4c, 0xae, 0x79, 0x3a, 0xc8, 0x1f, 0x18, + 0x61, 0x85, 0xfb, 0x51, 0xe0, 0x2a, 0xa3, 0xd4, 0xd2, 0x37, 0x49, 0xd8, 0xa0, 0x30, 0x42, 0x50, + 0x47, 0x7b, 0x8f, 0xcc, 0xac, 0xdf, 0xed, 0x73, 0x63, 0x04, 0x95, 0x62, 0x34, 0x46, 0x84, 0x09, + 0x09, 0x7b, 0xdd, 0xdc, 0x12, 0xae, 0x2c, 0xbc, 0x84, 0xab, 0xfd, 0x92, 0xf0, 0x5e, 0x54, 0x28, + 0xca, 0x21, 0x6b, 0x80, 0x49, 0x17, 0x29, 0x7e, 0x58, 0x68, 0x5f, 0x69, 0x58, 0x49, 0x47, 0x08, + 0xdb, 0x37, 0x4f, 0x01, 0xa9, 0x54, 0xd5, 0x7e, 0x74, 0x0a, 0xcc, 0x9d, 0x77, 0x2d, 0xdf, 0xb2, + 0xb7, 0x5b, 0x8e, 0xd3, 0xf5, 0xb4, 0x6f, 0x30, 0x1b, 0x15, 0x4f, 0x06, 0xc5, 0xb6, 0x63, 0x6f, + 0x59, 0xdb, 0x54, 0x8c, 0x67, 0xb8, 0xca, 0x95, 0xaa, 0x8b, 0xeb, 0xae, 0x73, 0xd9, 0xea, 0x40, + 0xb7, 0x8c, 0x73, 0x19, 0x34, 0x37, 0xd2, 0x63, 0x26, 0xf0, 0xda, 0x1d, 0xfd, 0x5f, 0xb1, 0xe5, + 0x85, 0x91, 0x5f, 0x68, 0x22, 0x13, 0x77, 0xad, 0x0a, 0xa6, 0xbb, 0xa6, 0xbd, 0xbd, 0x17, 0xcc, + 0xbc, 0xfb, 0x77, 0x51, 0xe3, 0x28, 0xd5, 0xe8, 0x47, 0x46, 0xf8, 0x39, 0x76, 0x72, 0x43, 0xa6, + 0x3e, 0x69, 0x7b, 0xf8, 0xff, 0xd9, 0x8f, 0xe5, 0xc0, 0x2c, 0x53, 0xa8, 0x3a, 0x0b, 0xa6, 0x2a, + 0xfa, 0x72, 0x69, 0xa3, 0xd6, 0x52, 0x8e, 0x21, 0x29, 0x36, 0x37, 0xd6, 0xd6, 0x4a, 0x46, 0xf5, + 0x7b, 0x74, 0x25, 0x87, 0xde, 0xad, 0x18, 0x25, 0xf4, 0xac, 0x48, 0xe8, 0xa1, 0xb9, 0xda, 0x30, + 0x5a, 0x7a, 0x5d, 0x91, 0x91, 0x3d, 0xaa, 0x3f, 0x73, 0xbd, 0x54, 0xaf, 0x28, 0x79, 0xf4, 0x7f, + 0x69, 0xa3, 0x56, 0xd3, 0x5b, 0x4a, 0x21, 0x0a, 0xc5, 0x56, 0x44, 0xc9, 0xe5, 0x52, 0x73, 0xa3, + 0x54, 0x53, 0xa6, 0x50, 0xf2, 0xf2, 0x46, 0xbd, 0x7e, 0x41, 0x99, 0x46, 0x45, 0x94, 0x1b, 0xf5, + 0xe5, 0x6a, 0x45, 0xaf, 0xb7, 0x94, 0x19, 0xf5, 0x2a, 0x70, 0xbc, 0xd9, 0x32, 0x4a, 0xd5, 0x95, + 0xd5, 0xd6, 0x72, 0xc3, 0x38, 0x5f, 0x32, 0x2a, 0x0a, 0x50, 0x15, 0x30, 0xb7, 0x6e, 0x34, 0x96, + 0x75, 0x1c, 0xcb, 0xa3, 0x54, 0x53, 0x66, 0xd1, 0x57, 0x2d, 0xa3, 0x54, 0x6f, 0xd6, 0x4a, 0x2d, + 0x5d, 0x99, 0x3b, 0x7b, 0x3f, 0x98, 0x0e, 0xaa, 0xab, 0x16, 0x81, 0xa4, 0xd7, 0x95, 0x63, 0xf8, + 0xb7, 0xa9, 0xe4, 0xd0, 0xef, 0x32, 0xe2, 0xb7, 0x08, 0xa4, 0x8a, 0xae, 0xc8, 0xe8, 0xb7, 0xda, + 0x52, 0xf2, 0xe8, 0x77, 0x1d, 0xb1, 0x58, 0x04, 0xd2, 0x6a, 0x55, 0x29, 0xa2, 0xdf, 0xd6, 0xaa, + 0x32, 0xc5, 0xdf, 0x97, 0x9e, 0xd8, 0x0b, 0x1f, 0x94, 0x7c, 0x8c, 0xa1, 0xe1, 0x47, 0x73, 0x64, + 0xfc, 0x5f, 0x7b, 0x85, 0x24, 0xd2, 0xd7, 0x25, 0xd3, 0x4f, 0xd7, 0x68, 0xde, 0x92, 0x1b, 0x63, + 0xab, 0x51, 0x35, 0x70, 0x4a, 0xaf, 0x57, 0xd6, 0x1b, 0xd5, 0x7a, 0x8b, 0x04, 0xcc, 0xd2, 0x4b, + 0xe5, 0x55, 0x8c, 0x33, 0x44, 0x08, 0xae, 0x35, 0x2a, 0x7a, 0x0d, 0xbf, 0x58, 0x6e, 0x6c, 0xd4, + 0x2b, 0xca, 0x16, 0x2a, 0xab, 0xb4, 0xd1, 0x5a, 0xdd, 0x34, 0xf4, 0x67, 0x6c, 0x54, 0x0d, 0xbd, + 0xa2, 0x6c, 0x23, 0x1a, 0xb5, 0x52, 0x7d, 0x65, 0xa3, 0xb4, 0x42, 0xf7, 0x0b, 0x37, 0xd6, 0xd7, + 0x1b, 0x78, 0xc7, 0x70, 0x47, 0xfb, 0x87, 0x3c, 0x98, 0x2e, 0xed, 0xf9, 0xce, 0x96, 0xd5, 0xed, + 0x6a, 0x0f, 0x4b, 0x87, 0x6f, 0x8a, 0x25, 0xae, 0x29, 0x1e, 0x68, 0x40, 0x41, 0x59, 0x61, 0xe3, + 0x09, 0x12, 0x98, 0x76, 0x78, 0x3a, 0x72, 0xc6, 0x96, 0xe9, 0x4e, 0x33, 0x79, 0x24, 0x8e, 0xb8, + 0x36, 0x6d, 0x59, 0xf8, 0x0d, 0x7d, 0x3c, 0xfb, 0x00, 0x98, 0x63, 0x29, 0xe1, 0xa0, 0x52, 0xa5, + 0x15, 0x12, 0x75, 0x2a, 0x88, 0x33, 0x47, 0xa2, 0x4e, 0xe1, 0x43, 0x01, 0x12, 0x6e, 0x2f, 0xd5, + 0x56, 0x0d, 0xe9, 0xe9, 0x71, 0x30, 0x5b, 0xd1, 0x9b, 0x65, 0xa3, 0x8a, 0xfd, 0xd4, 0x95, 0x3c, + 0xef, 0x65, 0x90, 0x68, 0x99, 0xf1, 0x35, 0x12, 0x55, 0xca, 0x6f, 0x09, 0xd9, 0x5b, 0xf1, 0xb4, + 0xd3, 0x29, 0xe4, 0x8b, 0x1f, 0x69, 0x0a, 0xa9, 0xbd, 0x38, 0x4f, 0xd6, 0xc9, 0x9a, 0x7b, 0xbb, + 0xbb, 0xa6, 0xbb, 0xcf, 0xf9, 0xab, 0x8d, 0xaa, 0x77, 0xf1, 0xe3, 0x7b, 0x62, 0x84, 0x1a, 0x64, + 0x42, 0xf5, 0x5c, 0x67, 0xb7, 0x17, 0xf4, 0xd5, 0xf4, 0x49, 0xfb, 0x7f, 0x84, 0x67, 0x8e, 0xa5, + 0xea, 0x22, 0x53, 0x99, 0x11, 0x86, 0xf6, 0x1f, 0x90, 0x44, 0x66, 0x91, 0x89, 0xc5, 0x7c, 0xbb, + 0x6b, 0xc4, 0xdf, 0xe4, 0xc1, 0x55, 0x34, 0xfa, 0x48, 0xb8, 0xfe, 0x80, 0x4c, 0xd5, 0x57, 0x67, + 0xaa, 0x19, 0xd4, 0xa0, 0x96, 0x23, 0x83, 0x9a, 0xd9, 0xf0, 0xce, 0x0b, 0x6e, 0x78, 0xbf, 0x4d, + 0xf8, 0xd0, 0x43, 0xa9, 0xba, 0x38, 0xa0, 0x8e, 0x93, 0xd9, 0x96, 0x7f, 0xbe, 0x24, 0xb2, 0xda, + 0x2a, 0xc4, 0xe1, 0xb7, 0xbb, 0xae, 0xbd, 0x23, 0x07, 0x16, 0x78, 0x55, 0x51, 0x9f, 0x04, 0xa6, + 0x7b, 0x34, 0x85, 0xca, 0xe5, 0x74, 0x9c, 0x72, 0x19, 0x61, 0x4e, 0x04, 0x11, 0xb4, 0x3b, 0x3d, + 0xc7, 0xb2, 0xc3, 0x75, 0xf9, 0xe0, 0x19, 0xcd, 0x3b, 0xf1, 0xd4, 0x21, 0x88, 0x45, 0x87, 0x1f, + 0xa2, 0x08, 0xa4, 0x79, 0x26, 0x02, 0x29, 0x12, 0xa2, 0x0f, 0x77, 0xf1, 0x5d, 0x38, 0x7b, 0x2e, + 0x71, 0x78, 0x91, 0x0c, 0x36, 0xe9, 0xec, 0xd3, 0xc0, 0x74, 0x50, 0x3e, 0xb2, 0xee, 0x1a, 0xb5, + 0x5a, 0x69, 0xad, 0x44, 0x16, 0x2a, 0x1b, 0xeb, 0x7a, 0xbd, 0x54, 0x55, 0x72, 0x68, 0xa0, 0xab, + 0xad, 0x35, 0x5b, 0x1b, 0x95, 0x6a, 0x43, 0x91, 0xf0, 0x13, 0xca, 0x54, 0x5e, 0x5f, 0x57, 0x64, + 0xed, 0x8d, 0x53, 0x60, 0x6a, 0xc5, 0xec, 0x76, 0xa1, 0xbb, 0xaf, 0x7d, 0x55, 0x02, 0x4a, 0x30, + 0x3b, 0x58, 0x33, 0x6d, 0x6b, 0x0b, 0x7a, 0x7e, 0xf2, 0x42, 0xc5, 0xfb, 0x84, 0x2f, 0xc8, 0xa2, + 0x65, 0x2c, 0xf6, 0xd3, 0x8f, 0xd1, 0xf1, 0xdb, 0x41, 0xde, 0xb2, 0xb7, 0x1c, 0xba, 0x5c, 0xd1, + 0xef, 0x6f, 0x13, 0x7c, 0x8c, 0xb7, 0x0d, 0x70, 0x46, 0xc1, 0x3b, 0xb2, 0x04, 0xb9, 0xc8, 0x7e, + 0xd5, 0xe2, 0x1d, 0x79, 0x30, 0x1f, 0x30, 0x51, 0xb5, 0x3b, 0xf0, 0x21, 0x76, 0x1b, 0xf4, 0x27, + 0xf3, 0xa2, 0xc1, 0x6f, 0xfa, 0xeb, 0x83, 0x49, 0xc5, 0x88, 0xb4, 0x05, 0x40, 0xdb, 0xf4, 0xe1, + 0xb6, 0xe3, 0x5a, 0xe1, 0x5a, 0xc4, 0x93, 0xd2, 0x50, 0x2b, 0x93, 0xaf, 0xf7, 0x0d, 0x86, 0x8e, + 0x7a, 0x2f, 0x98, 0x85, 0x61, 0xb4, 0xc1, 0x60, 0x9b, 0x34, 0x11, 0x2f, 0x36, 0xbf, 0xf6, 0x07, + 0x42, 0x31, 0x76, 0x44, 0xaa, 0x99, 0x0e, 0xb3, 0xcd, 0xd1, 0xba, 0x9e, 0x8d, 0xfa, 0x5a, 0xc9, + 0x68, 0xae, 0x96, 0x6a, 0xb5, 0x6a, 0x7d, 0x25, 0x0c, 0x7b, 0xab, 0x82, 0x85, 0x4a, 0xe3, 0x7c, + 0x9d, 0x89, 0x4b, 0x9c, 0xd7, 0xd6, 0xc1, 0x74, 0x20, 0xaf, 0x41, 0xa7, 0xa8, 0x58, 0x99, 0xd1, + 0x53, 0x54, 0x4c, 0x12, 0x32, 0x0d, 0xad, 0x76, 0xe8, 0x5a, 0x8f, 0xff, 0x6b, 0xbf, 0x61, 0x82, + 0x02, 0xf6, 0x67, 0xd1, 0xde, 0x85, 0xe7, 0xc5, 0xbd, 0xae, 0xd9, 0x86, 0xda, 0x6e, 0x8a, 0x95, + 0xf0, 0xe0, 0xc6, 0x56, 0xe9, 0xc0, 0x8d, 0xad, 0xf8, 0x2f, 0x1d, 0x31, 0x4e, 0x0e, 0xf2, 0xa1, + 0x31, 0x48, 0x16, 0x3e, 0x1c, 0x4d, 0xa2, 0x67, 0x13, 0x71, 0xbd, 0xa1, 0x6c, 0xc6, 0xa8, 0x64, + 0x3c, 0x4f, 0x59, 0x5c, 0xc5, 0x91, 0xc4, 0x51, 0xf6, 0x2d, 0xfe, 0x4b, 0x79, 0x50, 0x68, 0xf6, + 0xba, 0x96, 0xaf, 0xfd, 0x9c, 0x34, 0x16, 0xcc, 0xc8, 0x2d, 0xbb, 0xf2, 0xd0, 0x5b, 0x76, 0x23, + 0x7f, 0xc9, 0xbc, 0x80, 0xbf, 0x64, 0x0b, 0x3e, 0xe4, 0xf3, 0xfe, 0x92, 0x77, 0xd1, 0x69, 0x1b, + 0xf1, 0xb6, 0x7c, 0xcc, 0x00, 0x91, 0xe2, 0x6a, 0x0d, 0xb8, 0x13, 0xe1, 0xec, 0x13, 0x68, 0x68, + 0x76, 0x00, 0x8a, 0x4b, 0x8d, 0x56, 0xab, 0xb1, 0xa6, 0x1c, 0xc3, 0xd3, 0xaf, 0xc6, 0x3a, 0x09, + 0x94, 0x5b, 0xad, 0xd7, 0x75, 0x83, 0x9b, 0x71, 0xf1, 0x57, 0x2e, 0x26, 0x4e, 0xb0, 0xf8, 0xb2, + 0xb3, 0x54, 0x2f, 0xb1, 0x45, 0xf0, 0x78, 0x7e, 0xb2, 0x57, 0xae, 0x9f, 0x96, 0x41, 0x61, 0x0d, + 0xba, 0xdb, 0x50, 0x7b, 0x56, 0x0a, 0x07, 0xbb, 0x2d, 0xcb, 0xf5, 0x48, 0x68, 0xfd, 0xc8, 0xc1, + 0x8e, 0x4d, 0x53, 0x6f, 0x02, 0xf3, 0x1e, 0x6c, 0x3b, 0x76, 0x27, 0xc8, 0x44, 0xfa, 0x23, 0x3e, + 0x51, 0x7b, 0x59, 0x4a, 0xc8, 0x30, 0xa3, 0x63, 0xf1, 0x92, 0x4b, 0x03, 0xcc, 0xa0, 0x52, 0xb3, + 0x07, 0xe6, 0xeb, 0x32, 0xfa, 0xa8, 0xb7, 0xaf, 0xbd, 0x4c, 0xd8, 0xf3, 0xf1, 0x36, 0x50, 0xbc, + 0x18, 0xdc, 0xae, 0x25, 0xc7, 0xf6, 0xc7, 0x34, 0x8f, 0xba, 0x04, 0x4e, 0x78, 0xb0, 0x0b, 0xdb, + 0x3e, 0xec, 0xa0, 0xa6, 0x6b, 0x0c, 0xed, 0x14, 0x0e, 0x66, 0xd7, 0x7e, 0x87, 0x05, 0xf0, 0x1e, + 0x1e, 0xc0, 0x9b, 0x07, 0x88, 0x12, 0x55, 0x28, 0x7e, 0x6e, 0x82, 0xaa, 0xd1, 0xec, 0x3a, 0xa1, + 0xe1, 0x1b, 0x3c, 0xa3, 0x77, 0x3b, 0xfe, 0x6e, 0x17, 0xbf, 0xa3, 0x47, 0x83, 0x83, 0x67, 0x75, + 0x11, 0x4c, 0x99, 0xf6, 0x3e, 0x7e, 0x95, 0x4f, 0xa8, 0x75, 0x90, 0x49, 0x7b, 0x65, 0x88, 0xfc, + 0x7d, 0x1c, 0xf2, 0x8f, 0x13, 0x63, 0x37, 0x7b, 0xe0, 0x7f, 0x68, 0x0a, 0x14, 0xd6, 0x4d, 0xcf, + 0x87, 0xda, 0xff, 0x94, 0x45, 0x91, 0xbf, 0x19, 0x2c, 0x6c, 0x39, 0xed, 0x3d, 0x0f, 0x76, 0xf8, + 0x46, 0xd9, 0x97, 0x3a, 0x0e, 0xcc, 0xd5, 0x5b, 0x81, 0x12, 0x24, 0x52, 0xb2, 0x81, 0x0b, 0xec, + 0x81, 0x74, 0x7c, 0x81, 0x9f, 0xb7, 0x6e, 0xba, 0x7e, 0x63, 0x0b, 0xa7, 0x85, 0x17, 0xf8, 0xb1, + 0x89, 0x1c, 0xf4, 0xc5, 0x04, 0xe8, 0xa7, 0xe2, 0xa1, 0x9f, 0x16, 0x80, 0x5e, 0x2d, 0x81, 0xe9, + 0x2d, 0xab, 0x0b, 0xf1, 0x07, 0x33, 0xf8, 0x83, 0x41, 0x63, 0x12, 0x96, 0x7d, 0x38, 0x26, 0x2d, + 0x5b, 0x5d, 0x68, 0x84, 0x9f, 0x05, 0x13, 0x19, 0x10, 0x4d, 0x64, 0x6a, 0xe4, 0x24, 0x1c, 0x32, + 0xbc, 0x6c, 0x73, 0x17, 0x06, 0x1b, 0xdf, 0x36, 0x3d, 0x96, 0xde, 0x31, 0x7d, 0x13, 0x83, 0x31, + 0x67, 0xe0, 0xff, 0xbc, 0x4f, 0xb6, 0xdc, 0xef, 0x93, 0xfd, 0x3c, 0x39, 0x5d, 0x8f, 0x18, 0x30, + 0x1b, 0xd3, 0xa2, 0x2e, 0x06, 0x00, 0x11, 0x4b, 0x31, 0x7c, 0x46, 0xc0, 0xb4, 0x4d, 0x17, 0xfa, + 0xeb, 0xac, 0x17, 0x74, 0xc1, 0xe0, 0x13, 0xf1, 0x21, 0x1c, 0xaf, 0x69, 0xee, 0x92, 0x0b, 0xfa, + 0xca, 0xe8, 0x1d, 0x3d, 0x5c, 0x71, 0x20, 0x3d, 0xea, 0x7f, 0x0b, 0xe3, 0xee, 0x7f, 0x07, 0xd5, + 0x31, 0xfb, 0x66, 0xf8, 0x9a, 0x3c, 0x90, 0xcb, 0x7b, 0xfe, 0x23, 0xba, 0xfb, 0xfd, 0x96, 0xb0, + 0x8f, 0x39, 0xed, 0xcf, 0xf6, 0xfc, 0xa3, 0xed, 0x7d, 0x53, 0x6a, 0x89, 0x98, 0x2f, 0x7b, 0x5c, + 0xdd, 0xb2, 0xd7, 0x91, 0xb7, 0xc9, 0xe1, 0xd1, 0xa8, 0x87, 0x73, 0x87, 0x37, 0xcd, 0x35, 0xd2, + 0x3f, 0x31, 0x3d, 0x43, 0xf8, 0x1c, 0x74, 0x3c, 0x79, 0xee, 0x66, 0x02, 0xec, 0xda, 0x8a, 0x45, + 0x39, 0x67, 0x90, 0x07, 0xed, 0xe5, 0xc2, 0x07, 0x46, 0x89, 0xd8, 0x12, 0x8f, 0xf1, 0xa4, 0xb3, + 0xa9, 0x5e, 0x2d, 0x74, 0x6c, 0x34, 0xa1, 0xd8, 0xec, 0x01, 0xfb, 0x7b, 0xf6, 0x98, 0x4e, 0xe9, + 0xd0, 0x88, 0x69, 0xaf, 0x12, 0x5e, 0xd0, 0x27, 0xd5, 0x1e, 0xb2, 0x57, 0x9f, 0x4e, 0xde, 0x62, + 0x8e, 0x62, 0x89, 0x05, 0x4f, 0xe0, 0xc6, 0x61, 0x19, 0x14, 0xc9, 0xc2, 0xaf, 0xf6, 0x66, 0xe1, + 0x26, 0x82, 0x7a, 0x23, 0xfe, 0xf8, 0x4e, 0xf8, 0x9c, 0x66, 0xcd, 0x81, 0x3b, 0xe6, 0x93, 0x4f, + 0x75, 0xcc, 0x87, 0x8f, 0xc0, 0x22, 0xd0, 0x8e, 0x48, 0x1d, 0x33, 0x9e, 0x4e, 0xa6, 0x69, 0x61, + 0x03, 0x19, 0xca, 0x1e, 0xef, 0x17, 0x14, 0xc0, 0x1c, 0x29, 0x9a, 0x9c, 0x2f, 0xd4, 0xde, 0x23, + 0x7d, 0xfb, 0xa0, 0xae, 0xd6, 0xc1, 0xdc, 0x15, 0xcc, 0x36, 0xb9, 0x49, 0x98, 0xae, 0x5c, 0xdc, + 0x9a, 0xb8, 0xee, 0x41, 0xea, 0x19, 0xdc, 0x3d, 0xcc, 0x7d, 0x8f, 0x64, 0x4c, 0x36, 0x58, 0xc8, + 0xe1, 0x89, 0x22, 0x36, 0xb2, 0xd8, 0x24, 0xf5, 0x14, 0x28, 0x5e, 0xb6, 0xe0, 0x95, 0x6a, 0x87, + 0x5a, 0xb7, 0xf4, 0x49, 0xfb, 0x55, 0x61, 0x9f, 0x49, 0x16, 0x6e, 0xca, 0x4b, 0xb6, 0x5a, 0x28, + 0xe6, 0x39, 0x39, 0x94, 0xad, 0x09, 0x44, 0x03, 0x92, 0xc8, 0x6d, 0xe7, 0x34, 0xcc, 0x7c, 0x39, + 0x85, 0x22, 0xc6, 0x19, 0xce, 0x7c, 0x10, 0xbe, 0xc4, 0xb3, 0xe6, 0x44, 0x00, 0x51, 0xf9, 0x63, + 0xe9, 0xf3, 0xc5, 0x22, 0xc3, 0x0d, 0x29, 0x3a, 0x7b, 0xc9, 0xbf, 0x4e, 0x06, 0x33, 0x4d, 0xe8, + 0x2f, 0x5b, 0xb0, 0xdb, 0xf1, 0x34, 0xf7, 0xf0, 0xa6, 0xd1, 0xed, 0xa0, 0xb8, 0x85, 0x89, 0x0d, + 0xdb, 0x9c, 0xa4, 0xd9, 0xb4, 0xd7, 0x48, 0xa2, 0x7e, 0x40, 0x74, 0xf5, 0x2d, 0xe0, 0x76, 0x2c, + 0x30, 0x89, 0x9d, 0xa6, 0x4b, 0x2e, 0x79, 0x02, 0xd7, 0xf8, 0xc8, 0x60, 0x0e, 0x6f, 0xff, 0x43, + 0xbf, 0xd4, 0xb5, 0xb6, 0x6d, 0xf6, 0x8e, 0xee, 0x91, 0x5b, 0x88, 0x7a, 0x07, 0x28, 0x98, 0x88, + 0x1a, 0x75, 0x77, 0xd3, 0x06, 0x76, 0x9e, 0xb8, 0x3c, 0x83, 0x64, 0x4c, 0x71, 0x69, 0x46, 0xa4, + 0xd8, 0x01, 0xcf, 0x13, 0xbc, 0x34, 0x63, 0x68, 0xe1, 0xd9, 0x23, 0xf6, 0x15, 0x19, 0x9c, 0xa4, + 0x0c, 0x9c, 0x83, 0xae, 0x6f, 0xb5, 0xcd, 0x2e, 0x41, 0xee, 0x45, 0xb9, 0x71, 0x40, 0xb7, 0x0a, + 0xe6, 0x2f, 0xb3, 0x64, 0x29, 0x84, 0x67, 0x07, 0x42, 0xc8, 0x31, 0x60, 0xf0, 0x1f, 0xa6, 0xb8, + 0x7c, 0x80, 0x93, 0x2a, 0x47, 0x73, 0x82, 0x97, 0x0f, 0x08, 0x33, 0x91, 0x3d, 0xc4, 0x2f, 0xa5, + 0x41, 0x35, 0xa3, 0xee, 0xf3, 0x0f, 0x85, 0xb1, 0xdd, 0x00, 0xb3, 0x18, 0x4b, 0xf2, 0x21, 0x5d, + 0x86, 0x48, 0x50, 0xe2, 0xb0, 0xdf, 0xa1, 0xd7, 0xa5, 0x87, 0xdf, 0x1a, 0x2c, 0x1d, 0xed, 0x3c, + 0x00, 0xd1, 0x2b, 0xb6, 0x93, 0xce, 0xc5, 0x75, 0xd2, 0x92, 0x58, 0x27, 0xfd, 0x26, 0xe1, 0x30, + 0x87, 0x83, 0xd9, 0x3e, 0xbc, 0x7a, 0x88, 0x05, 0xb8, 0x1b, 0x5e, 0x7a, 0xf6, 0x7a, 0xf1, 0x4a, + 0xaa, 0x17, 0x95, 0xbd, 0x5e, 0xd7, 0x6a, 0xa3, 0xf9, 0xd4, 0x27, 0xc6, 0x32, 0x9f, 0x62, 0xfb, + 0x03, 0xb9, 0xaf, 0x3f, 0x38, 0x84, 0x25, 0x7d, 0x0b, 0x38, 0x4e, 0x8a, 0x28, 0x87, 0x6c, 0x15, + 0x48, 0x10, 0xb7, 0xbe, 0x64, 0x3e, 0xa2, 0xb8, 0xa0, 0x12, 0x84, 0x42, 0x18, 0x61, 0xe9, 0x33, + 0x9d, 0xb1, 0x9b, 0x56, 0x41, 0xe2, 0x38, 0x9b, 0xc0, 0x91, 0xac, 0x3c, 0xb1, 0x76, 0x37, 0xf0, + 0x8d, 0xf6, 0xda, 0x17, 0xf3, 0xe3, 0x18, 0x11, 0x9e, 0x4e, 0x3d, 0x4d, 0xe5, 0xd8, 0x25, 0x8d, + 0xa8, 0xc8, 0xb0, 0x1f, 0x69, 0xc1, 0x87, 0xfc, 0xd5, 0x63, 0xc4, 0x2f, 0x55, 0xbd, 0x15, 0x1c, + 0xbf, 0x68, 0xb6, 0x2f, 0x6d, 0xbb, 0xce, 0x1e, 0xbe, 0xfb, 0xdb, 0xa1, 0x97, 0x88, 0xaf, 0x1e, + 0x33, 0xfa, 0x5f, 0xa8, 0x77, 0x06, 0xa6, 0x43, 0x61, 0x98, 0xe9, 0xb0, 0x7a, 0x8c, 0x1a, 0x0f, + 0xea, 0x13, 0xc2, 0x4e, 0xa7, 0x98, 0xd8, 0xe9, 0xac, 0x1e, 0x0b, 0xba, 0x1d, 0xb5, 0x02, 0xa6, + 0x3b, 0xd6, 0x65, 0xbc, 0x55, 0x8d, 0x67, 0x5d, 0xc3, 0x82, 0x0e, 0x55, 0xac, 0xcb, 0x64, 0x63, + 0x7b, 0xf5, 0x98, 0x11, 0x7e, 0xa9, 0xae, 0x80, 0x19, 0xbc, 0x2d, 0x80, 0xc9, 0x4c, 0xa7, 0x0a, + 0x28, 0xb4, 0x7a, 0xcc, 0x88, 0xbe, 0x45, 0xd6, 0x47, 0x1e, 0x9f, 0xbb, 0xbe, 0x2f, 0xd8, 0x6e, + 0xcf, 0xa5, 0xda, 0x6e, 0x47, 0xb2, 0x20, 0x1b, 0xee, 0xa7, 0x40, 0xa1, 0x8d, 0x25, 0x2c, 0x51, + 0x09, 0x93, 0x47, 0xf5, 0x1e, 0x90, 0xdf, 0x35, 0xdd, 0x60, 0xf2, 0x7c, 0xf3, 0x70, 0xba, 0x6b, + 0xa6, 0x7b, 0x09, 0x21, 0x88, 0xbe, 0x5a, 0x9a, 0x02, 0x05, 0x2c, 0xb8, 0xf0, 0x8f, 0xf6, 0xb6, + 0x3c, 0x31, 0x43, 0xca, 0x8e, 0x8d, 0x86, 0xfd, 0x96, 0x13, 0x1c, 0x4e, 0xff, 0xd5, 0xdc, 0x78, + 0x2c, 0xc8, 0xab, 0x98, 0xab, 0x3e, 0x6c, 0xeb, 0x59, 0x7b, 0xf0, 0x01, 0xb8, 0x4f, 0x97, 0x44, + 0x07, 0xbd, 0x52, 0xcf, 0x00, 0xe0, 0xd3, 0x93, 0x7a, 0x61, 0x10, 0x53, 0x26, 0x25, 0x5a, 0x3e, + 0x28, 0x0c, 0x77, 0x54, 0xf9, 0x9d, 0x11, 0x4c, 0x97, 0x7e, 0x41, 0xc4, 0xcf, 0xc0, 0xbb, 0x96, + 0xcd, 0xd4, 0x39, 0x78, 0x4c, 0xd9, 0x29, 0xa5, 0x35, 0x6a, 0x86, 0xb0, 0x97, 0x7d, 0xdf, 0xf4, + 0x96, 0x3c, 0xb9, 0xed, 0x80, 0x9c, 0x80, 0xd6, 0x1f, 0xb2, 0x3c, 0xdf, 0xb2, 0xb7, 0xe9, 0xf9, + 0xe6, 0xcf, 0x8e, 0x45, 0x69, 0x06, 0x0c, 0x38, 0xf2, 0xc0, 0x01, 0xe7, 0x40, 0x80, 0xa0, 0xfc, + 0x90, 0x00, 0x41, 0x85, 0x74, 0x2b, 0x87, 0x1f, 0x61, 0xf5, 0x67, 0x9d, 0xd7, 0x9f, 0xbb, 0x63, + 0x00, 0x1a, 0x24, 0x97, 0xb1, 0xd8, 0x37, 0xef, 0x0a, 0x35, 0xa5, 0xc9, 0x69, 0xca, 0x7d, 0xa3, + 0x33, 0x92, 0xbd, 0xb6, 0x7c, 0x28, 0x0f, 0xae, 0x8a, 0x98, 0xa9, 0xc3, 0x2b, 0x54, 0x51, 0x7e, + 0x7f, 0x2c, 0x8a, 0x92, 0xde, 0xd1, 0x39, 0x6b, 0x8d, 0xf9, 0x4d, 0xe1, 0x73, 0xfb, 0xfd, 0x40, + 0x85, 0xb2, 0x89, 0x51, 0x96, 0x53, 0xa0, 0x48, 0x7a, 0x18, 0x0a, 0x0d, 0x7d, 0x4a, 0xd9, 0xdd, + 0x88, 0x9d, 0xf6, 0x17, 0xe5, 0x6d, 0x02, 0xfa, 0x43, 0xd7, 0x35, 0x5a, 0x7b, 0xae, 0x5d, 0xb5, + 0x7d, 0x47, 0xfb, 0xc1, 0xb1, 0x28, 0x4e, 0xe8, 0x0d, 0x27, 0x8f, 0xe2, 0x0d, 0x37, 0xd2, 0x2a, + 0x47, 0x50, 0x83, 0x23, 0x59, 0xe5, 0x88, 0x29, 0x3c, 0x7b, 0xfc, 0xde, 0x29, 0x83, 0x53, 0x74, + 0xb2, 0xb5, 0xc4, 0x5b, 0x88, 0xda, 0x85, 0x71, 0x00, 0x79, 0x32, 0x30, 0x93, 0xa8, 0x1f, 0x3d, + 0x7e, 0xe0, 0xa3, 0x14, 0x24, 0xde, 0x66, 0xc9, 0x4d, 0x07, 0xfb, 0x38, 0x1c, 0x0b, 0x52, 0x62, + 0x97, 0x58, 0xa6, 0x60, 0x23, 0x7b, 0xcc, 0x5e, 0x22, 0x83, 0x22, 0x89, 0x91, 0xa0, 0x6d, 0x64, + 0xe2, 0x30, 0xc1, 0xdf, 0xcf, 0x22, 0xb0, 0x23, 0x47, 0xb8, 0xc9, 0x2c, 0x7e, 0x44, 0x9a, 0xbd, + 0xb8, 0x81, 0xac, 0x4c, 0xc0, 0x85, 0x50, 0x02, 0xb3, 0x4d, 0xe8, 0x97, 0x4d, 0xd7, 0xb5, 0xcc, + 0xed, 0x71, 0x79, 0x7c, 0x8b, 0x7a, 0x0f, 0x6b, 0xdf, 0xc8, 0x89, 0x9e, 0x65, 0x0f, 0x17, 0xc2, + 0x03, 0x56, 0x63, 0xa2, 0x80, 0xbf, 0x5e, 0xe8, 0xbc, 0xfa, 0x30, 0x6a, 0x13, 0xf0, 0xd8, 0x96, + 0xc0, 0x54, 0x10, 0x07, 0xe3, 0x76, 0x2e, 0x36, 0xca, 0x8e, 0xbf, 0x1b, 0x1c, 0x83, 0xc1, 0xff, + 0x0f, 0xc6, 0x5f, 0xd0, 0x5e, 0x91, 0xd2, 0x51, 0x3e, 0x39, 0x88, 0x47, 0xba, 0x36, 0x96, 0xc6, + 0x1d, 0xfe, 0xa8, 0xc2, 0x76, 0xfc, 0xf2, 0x14, 0x5d, 0x8e, 0xac, 0x99, 0x3e, 0x7c, 0x48, 0xfb, + 0x43, 0x19, 0x4c, 0x35, 0xa1, 0x8f, 0xc6, 0x5b, 0xc4, 0xfe, 0xa1, 0x35, 0x5c, 0x65, 0x56, 0x3c, + 0xe8, 0xd9, 0x5a, 0xf5, 0x7e, 0x30, 0xd3, 0x73, 0x9d, 0x36, 0xf4, 0x3c, 0xba, 0x7a, 0xc1, 0x3a, + 0xaa, 0x0d, 0x1a, 0xfd, 0x31, 0x6b, 0x8b, 0xeb, 0xc1, 0x37, 0x46, 0xf4, 0x79, 0x5a, 0x33, 0x80, + 0x50, 0xa2, 0x15, 0x9c, 0xb4, 0x19, 0x90, 0x54, 0x78, 0xf6, 0x40, 0xff, 0xae, 0x0c, 0xe6, 0x9a, + 0xd0, 0x0f, 0xa5, 0x98, 0x62, 0x93, 0x23, 0x1e, 0x5e, 0x0e, 0x4a, 0xf9, 0x70, 0x50, 0xbe, 0x53, + 0xf8, 0x52, 0x58, 0x5e, 0x9a, 0x21, 0xb1, 0xb1, 0xe0, 0xf9, 0x16, 0xa1, 0xbb, 0x60, 0xc5, 0x38, + 0x98, 0xc0, 0xf1, 0xb5, 0xc7, 0x80, 0x19, 0xcc, 0x0b, 0x6e, 0xb0, 0x3f, 0x9a, 0x8f, 0x1a, 0xef, + 0x17, 0x32, 0x6a, 0xbc, 0xf7, 0x82, 0xc2, 0xae, 0xe9, 0x5e, 0x0a, 0x0e, 0xdf, 0x3e, 0x56, 0x6c, + 0xf5, 0xcb, 0x33, 0xc8, 0x57, 0x83, 0xfd, 0x34, 0x0b, 0xe9, 0xfc, 0x34, 0x5f, 0x2f, 0xa5, 0x1a, + 0x09, 0xc9, 0xdc, 0x61, 0x8c, 0x4d, 0x3e, 0xc5, 0xb8, 0x99, 0x50, 0x76, 0xf6, 0xca, 0xf1, 0x22, + 0x19, 0x4c, 0xa3, 0x71, 0x1b, 0xdb, 0xe3, 0xe7, 0x0f, 0xaf, 0x0e, 0x83, 0x0d, 0xfd, 0x94, 0x3d, + 0x70, 0x20, 0x91, 0xf1, 0x99, 0xf7, 0x29, 0x7a, 0xe0, 0xa4, 0xc2, 0xb3, 0xc7, 0xe3, 0xdd, 0x04, + 0x0f, 0xdc, 0x1e, 0xb4, 0x37, 0xc8, 0x40, 0x5e, 0x81, 0xfe, 0xa4, 0xad, 0xc8, 0xb7, 0x0b, 0x87, + 0x17, 0xe5, 0x04, 0x86, 0x79, 0x5e, 0x5c, 0x81, 0xe3, 0x69, 0x40, 0x62, 0x71, 0x45, 0x85, 0x18, + 0xc8, 0x1e, 0xb5, 0xf7, 0x13, 0xd4, 0xc8, 0xe6, 0xc2, 0x0f, 0x8c, 0xa1, 0x57, 0x9d, 0xec, 0xc2, + 0x47, 0x20, 0x40, 0x4c, 0xe3, 0xa8, 0xda, 0xdb, 0xa0, 0xc2, 0xb3, 0x47, 0xee, 0x67, 0x64, 0x7c, + 0x89, 0x59, 0x79, 0x07, 0xb6, 0x2f, 0xc1, 0x0e, 0x7b, 0x91, 0xf3, 0xa8, 0xd0, 0x9d, 0x06, 0x53, + 0x6d, 0x42, 0x0d, 0x83, 0x37, 0x6d, 0x04, 0x8f, 0xfc, 0xcd, 0x42, 0x89, 0x77, 0x67, 0xf1, 0x1d, + 0x11, 0xf9, 0x7c, 0x2c, 0xb8, 0x88, 0x5d, 0x78, 0x25, 0x50, 0xfc, 0x04, 0xcc, 0x16, 0x32, 0xcb, + 0xa8, 0xb6, 0x1d, 0x5b, 0xfb, 0xaf, 0x87, 0x87, 0xe5, 0x3a, 0x30, 0x63, 0xb5, 0x1d, 0x1b, 0x87, + 0x80, 0x0b, 0x0e, 0x01, 0x85, 0x09, 0xc1, 0x5b, 0x7d, 0xd7, 0x79, 0xd0, 0xa2, 0xbb, 0xe6, 0x51, + 0xc2, 0xa8, 0xc6, 0x04, 0x62, 0xfd, 0xa8, 0x8c, 0x89, 0x01, 0x65, 0x67, 0x0f, 0xd9, 0x27, 0x23, + 0xef, 0x36, 0xd2, 0x15, 0x3e, 0x22, 0x56, 0x81, 0x47, 0x19, 0xce, 0xd8, 0x5a, 0x1c, 0xc9, 0x70, + 0x96, 0xc0, 0xc0, 0x04, 0x6e, 0x22, 0x8c, 0x70, 0xcc, 0x7c, 0x0d, 0xf8, 0x10, 0xe8, 0x8c, 0xcf, + 0x3c, 0x1c, 0x11, 0x9d, 0xa3, 0x31, 0x11, 0x3f, 0x4c, 0xc3, 0xd3, 0x53, 0x8b, 0x47, 0xfb, 0x6f, + 0xe3, 0x00, 0xe7, 0xee, 0x51, 0xfc, 0x15, 0x88, 0xb7, 0x82, 0xf6, 0x56, 0x49, 0x34, 0x04, 0xca, + 0x01, 0x09, 0x22, 0x2a, 0x63, 0x41, 0xf0, 0x4d, 0x42, 0xb1, 0x49, 0x44, 0xca, 0xcf, 0x1e, 0xc0, + 0x17, 0xca, 0x60, 0x01, 0xfb, 0x08, 0x74, 0xa1, 0xe9, 0x92, 0x8e, 0x72, 0x2c, 0x8e, 0xf2, 0xef, + 0x16, 0x0e, 0xf0, 0xc3, 0xcb, 0x21, 0xe2, 0x63, 0x2c, 0x50, 0x88, 0x45, 0xf7, 0x11, 0x64, 0x61, + 0x22, 0xdb, 0x28, 0x4a, 0xc8, 0x02, 0x55, 0xf1, 0xf1, 0xe0, 0x91, 0xd2, 0x23, 0x97, 0x17, 0x46, + 0xd0, 0xd8, 0x26, 0xec, 0x91, 0x2b, 0xc2, 0x44, 0xf6, 0x98, 0xbc, 0xe1, 0x0e, 0xba, 0xe0, 0xdc, + 0x32, 0x2f, 0x76, 0xa1, 0xf6, 0xaa, 0x7c, 0x78, 0xa2, 0xed, 0x77, 0xc7, 0xe2, 0x81, 0x79, 0x88, + 0xcb, 0xa8, 0x54, 0x90, 0x77, 0x9d, 0x2b, 0x64, 0x69, 0x6b, 0xde, 0xc0, 0xff, 0x49, 0x3c, 0xcb, + 0xee, 0xde, 0xae, 0x4d, 0x4e, 0x86, 0xce, 0x1b, 0xc1, 0xa3, 0x7a, 0x13, 0x98, 0xbf, 0x62, 0xf9, + 0x3b, 0xab, 0xd0, 0xec, 0x40, 0xd7, 0x70, 0xae, 0x60, 0x8f, 0xb9, 0x69, 0x83, 0x4f, 0xe4, 0xfd, + 0x57, 0x04, 0xec, 0x4b, 0x24, 0x94, 0xc9, 0x1c, 0x7f, 0x4b, 0x63, 0x79, 0xc6, 0x73, 0x95, 0xbd, + 0xc2, 0x7c, 0x40, 0x06, 0x33, 0x86, 0x73, 0x85, 0x2a, 0xc9, 0xff, 0x75, 0xb4, 0x3a, 0x92, 0x7a, + 0xa2, 0x87, 0x25, 0x17, 0xb2, 0x3f, 0xf1, 0x89, 0x5e, 0x62, 0xf1, 0x13, 0x39, 0xb9, 0x34, 0x67, + 0x38, 0x57, 0x9a, 0xd0, 0x27, 0x2d, 0x42, 0xdb, 0x1c, 0x93, 0x93, 0xb5, 0xe5, 0x11, 0x82, 0x74, + 0x1e, 0x1e, 0x3e, 0xa7, 0xdd, 0x45, 0x08, 0x05, 0x14, 0xb2, 0x38, 0xe9, 0x5d, 0x84, 0xa1, 0x1c, + 0x4c, 0x20, 0x46, 0x8a, 0x0c, 0x66, 0x0d, 0xe7, 0x0a, 0x1a, 0x1a, 0x96, 0xad, 0x6e, 0x77, 0x3c, + 0x23, 0x64, 0x5a, 0xe3, 0x3f, 0x10, 0x43, 0xc0, 0xc5, 0xc4, 0x8d, 0xff, 0x21, 0x0c, 0x64, 0x0f, + 0xc3, 0xf3, 0x48, 0x63, 0x09, 0x46, 0x68, 0x7b, 0x3c, 0x38, 0x8c, 0xda, 0x20, 0x42, 0x36, 0x8e, + 0xac, 0x41, 0xc4, 0x71, 0x30, 0x91, 0x9d, 0x93, 0x85, 0x32, 0x1e, 0xe6, 0xc7, 0xdb, 0x26, 0xde, + 0x9b, 0xce, 0x35, 0x91, 0x0e, 0xbb, 0x1c, 0x23, 0x63, 0x41, 0x23, 0x85, 0x0b, 0xa2, 0x00, 0x0f, + 0xd9, 0xe3, 0xf1, 0x31, 0x19, 0xcc, 0x11, 0x16, 0x1e, 0x21, 0x56, 0xc0, 0x48, 0x8d, 0x8a, 0xad, + 0xc1, 0xd1, 0x34, 0xaa, 0x04, 0x0e, 0x26, 0x72, 0x9f, 0x3f, 0xb2, 0xe3, 0x46, 0x38, 0x3e, 0x1e, + 0x87, 0xe0, 0xc8, 0xc6, 0xd8, 0x18, 0x8f, 0x90, 0x8f, 0x62, 0x8c, 0x1d, 0xd1, 0x31, 0xf2, 0xe7, + 0x85, 0xad, 0x68, 0x9c, 0x18, 0x1c, 0xa2, 0x29, 0x8c, 0x11, 0x86, 0x11, 0x9b, 0xc2, 0x11, 0x21, + 0xf1, 0xa7, 0x32, 0x00, 0x84, 0x81, 0x35, 0xe7, 0x32, 0xbe, 0x48, 0x73, 0x0c, 0xdd, 0x59, 0xbf, + 0x5b, 0xbd, 0x3c, 0xc4, 0xad, 0x3e, 0x65, 0x08, 0x97, 0xb4, 0x2b, 0x81, 0x8c, 0x94, 0x51, 0x25, + 0x27, 0xbe, 0x12, 0x98, 0x5c, 0x7e, 0xf6, 0x18, 0x7f, 0x99, 0x58, 0x73, 0xd1, 0x01, 0xd3, 0x9f, + 0x1d, 0x0b, 0xca, 0xcc, 0xec, 0x5f, 0xe6, 0x67, 0xff, 0x87, 0xc0, 0x76, 0x54, 0x1b, 0x71, 0xd8, + 0xc1, 0xd1, 0xec, 0x6d, 0xc4, 0xa3, 0x3b, 0x20, 0xfa, 0x03, 0x79, 0x70, 0x9c, 0x76, 0x22, 0xdf, + 0x0e, 0x10, 0xa7, 0x3c, 0x87, 0xc7, 0x75, 0x92, 0x43, 0x50, 0x1e, 0xd7, 0x82, 0x54, 0x9a, 0xa5, + 0x4c, 0x01, 0xf6, 0x26, 0xb2, 0xba, 0x51, 0xd4, 0x1f, 0xea, 0x99, 0x76, 0x47, 0x3c, 0xdc, 0xef, + 0x10, 0xe0, 0x83, 0xb5, 0x46, 0x99, 0x5f, 0x6b, 0x1c, 0xb0, 0x32, 0x99, 0x7a, 0xe7, 0x1a, 0x8b, + 0x8c, 0xb0, 0x3b, 0xf1, 0x9d, 0xeb, 0xf8, 0xb2, 0xb3, 0x47, 0xe9, 0xbd, 0x32, 0xc8, 0x37, 0x1d, + 0xd7, 0xd7, 0x9e, 0x9f, 0xa6, 0x75, 0x12, 0xc9, 0x47, 0x20, 0x05, 0xcf, 0x6a, 0x19, 0xe4, 0x51, + 0xe5, 0xe8, 0x8c, 0xe1, 0xf6, 0xe4, 0xa3, 0xce, 0xa6, 0x6f, 0x62, 0xaf, 0x6e, 0x54, 0xfe, 0x62, + 0x6b, 0xbf, 0x07, 0x0d, 0xfc, 0x71, 0xda, 0x78, 0x3a, 0x44, 0x7e, 0xcd, 0xf8, 0x03, 0x18, 0x99, + 0xc5, 0xd3, 0x89, 0x2d, 0x39, 0x7b, 0xdc, 0x5e, 0x7b, 0x9c, 0xfa, 0xb6, 0x2e, 0x5b, 0x5d, 0xa8, + 0x3d, 0x9f, 0xb8, 0x8c, 0xd4, 0xcd, 0x5d, 0x28, 0x7e, 0x24, 0x26, 0xd1, 0xb5, 0x15, 0xc7, 0x97, + 0x95, 0xa3, 0xf8, 0xb2, 0x69, 0x1b, 0x14, 0x39, 0x80, 0x4e, 0x58, 0x9a, 0x74, 0x83, 0x4a, 0x28, + 0x7b, 0x22, 0x71, 0x3a, 0x4f, 0x34, 0xa1, 0x4f, 0x8c, 0xca, 0x46, 0x70, 0x45, 0xd2, 0xf7, 0x8d, + 0x25, 0x62, 0x67, 0x78, 0xa1, 0x8e, 0xdc, 0x77, 0x03, 0xd3, 0x07, 0x58, 0x70, 0xd6, 0x78, 0x70, + 0xbe, 0x3b, 0x5e, 0x40, 0x3c, 0x93, 0x63, 0x81, 0xe9, 0xed, 0x21, 0x4c, 0xeb, 0x1c, 0x4c, 0xf7, + 0x8c, 0xc8, 0x45, 0xf6, 0x80, 0xfd, 0x78, 0x01, 0x1c, 0x27, 0x93, 0xfe, 0x92, 0xdd, 0xa1, 0x11, + 0x56, 0xdf, 0x2c, 0x1d, 0xf1, 0x66, 0xdb, 0xc1, 0x10, 0xac, 0x5c, 0x2c, 0xe7, 0x42, 0x5f, 0x2c, + 0x67, 0x75, 0x89, 0x84, 0x73, 0x45, 0x9d, 0x28, 0xde, 0x69, 0x1b, 0x16, 0x66, 0x02, 0xcb, 0x1e, + 0x77, 0xb9, 0xe1, 0x77, 0xfc, 0x3d, 0xa2, 0x53, 0xe2, 0xf7, 0x88, 0xfe, 0x76, 0xba, 0x75, 0x3b, + 0x5c, 0x74, 0x9f, 0xc0, 0x33, 0xb6, 0x9d, 0x52, 0xac, 0xe8, 0x09, 0x70, 0xf7, 0x9f, 0xc3, 0x9d, + 0x2c, 0x8a, 0x20, 0x32, 0xa2, 0x3b, 0x19, 0x26, 0x70, 0x94, 0xee, 0x64, 0xc3, 0x18, 0xc8, 0x1e, + 0xc7, 0xdf, 0x2e, 0xd0, 0xdd, 0x7c, 0xdc, 0x6e, 0xb4, 0x3f, 0x96, 0x32, 0x1f, 0xa5, 0xbf, 0x99, + 0x4b, 0xe5, 0xff, 0x8c, 0xf9, 0x4a, 0x1e, 0xa6, 0xd3, 0x78, 0x34, 0x27, 0x91, 0x9b, 0xc0, 0xba, + 0x91, 0x84, 0x7d, 0xd1, 0xcf, 0x5b, 0x1d, 0x7f, 0x67, 0x4c, 0x27, 0x3a, 0xae, 0x20, 0x5a, 0x34, + 0x5e, 0x3d, 0x79, 0xd0, 0xfe, 0x57, 0x2e, 0x55, 0x08, 0xa9, 0x50, 0x24, 0x98, 0xad, 0x18, 0x11, + 0xa7, 0x08, 0xfc, 0x94, 0x48, 0x6f, 0x82, 0x1a, 0x7d, 0xce, 0xea, 0x40, 0xe7, 0x11, 0xa8, 0xd1, + 0x98, 0xaf, 0xf1, 0x69, 0x74, 0x12, 0xb9, 0xff, 0xa4, 0x1a, 0x1d, 0x8a, 0x64, 0x4c, 0x1a, 0x9d, + 0x48, 0x2f, 0x7b, 0x19, 0xbf, 0x62, 0x8e, 0x4e, 0xa4, 0x6a, 0x96, 0x7d, 0x49, 0xfb, 0xa7, 0x22, + 0x50, 0x82, 0x38, 0xc2, 0xfe, 0x0e, 0x8d, 0x05, 0xf3, 0x21, 0xe1, 0xbb, 0x51, 0x46, 0x88, 0xf7, + 0xc2, 0x87, 0x93, 0x2a, 0x1c, 0x08, 0x27, 0x55, 0x02, 0xf3, 0x96, 0xed, 0x43, 0xd7, 0x36, 0xbb, + 0xcb, 0x5d, 0x73, 0xdb, 0x3b, 0x3d, 0x35, 0xf0, 0xf2, 0xba, 0x2a, 0x93, 0xc7, 0xe0, 0xbf, 0x60, + 0x2f, 0x10, 0x9d, 0xe6, 0x2f, 0x10, 0x8d, 0x89, 0x7e, 0x35, 0x13, 0x1f, 0xfd, 0x2a, 0x8c, 0x6e, + 0x05, 0x86, 0x07, 0xc7, 0x16, 0xb5, 0x8d, 0x53, 0x86, 0xfb, 0xbb, 0x5d, 0x30, 0x0a, 0x5b, 0x18, + 0xfa, 0xf1, 0xd5, 0x72, 0xaa, 0xd5, 0x3d, 0xa4, 0x08, 0x8b, 0xfd, 0x4a, 0x90, 0xda, 0x42, 0x65, + 0x2b, 0x2f, 0xf7, 0x55, 0x3e, 0x34, 0x79, 0xf2, 0x02, 0x26, 0x0f, 0xab, 0x54, 0x05, 0xd1, 0x3b, + 0x5d, 0xc5, 0x17, 0x0b, 0x45, 0x6a, 0x3b, 0x81, 0xd3, 0x48, 0x05, 0x70, 0x22, 0x88, 0x76, 0xdb, + 0xeb, 0x41, 0xd3, 0x35, 0xed, 0x36, 0xd4, 0x3e, 0x29, 0x8d, 0xc3, 0xec, 0x5d, 0x06, 0xd3, 0x56, + 0xdb, 0xb1, 0x9b, 0xd6, 0xb3, 0x83, 0xcb, 0xe5, 0x92, 0x83, 0xac, 0x63, 0x89, 0x54, 0xe9, 0x17, + 0x46, 0xf8, 0xad, 0x5a, 0x05, 0x33, 0x6d, 0xd3, 0xed, 0x90, 0x20, 0x7c, 0x85, 0xbe, 0x8b, 0x9c, + 0x62, 0x09, 0x95, 0x83, 0x4f, 0x8c, 0xe8, 0x6b, 0xb5, 0xc1, 0x0b, 0xb1, 0xd8, 0x17, 0xcd, 0x23, + 0x96, 0x58, 0x25, 0xfa, 0x88, 0x93, 0x39, 0x92, 0x8e, 0x0b, 0xbb, 0x26, 0xb9, 0x74, 0x7c, 0x8a, + 0xdc, 0x11, 0x1d, 0x26, 0xa4, 0x5d, 0x1e, 0xc0, 0x45, 0x1d, 0x40, 0x63, 0xd2, 0xcb, 0x03, 0x42, + 0x5c, 0x64, 0xaf, 0x99, 0xef, 0x2a, 0x82, 0x79, 0xd2, 0xab, 0x51, 0x71, 0x6a, 0x2f, 0x94, 0x41, + 0xb1, 0x09, 0xfd, 0x07, 0xe0, 0xbe, 0xd6, 0x3c, 0xfc, 0x98, 0xac, 0x00, 0xf9, 0x52, 0x18, 0x70, + 0x10, 0xfd, 0x4d, 0xbb, 0x6f, 0x1f, 0xf0, 0xb5, 0x48, 0x78, 0x9a, 0xf4, 0xbe, 0x7d, 0x72, 0xf1, + 0xd9, 0xe3, 0xf3, 0x13, 0x32, 0x90, 0x4b, 0x9d, 0x8e, 0xd6, 0x3e, 0x3c, 0x14, 0x37, 0x80, 0xd9, + 0xa0, 0xcd, 0x44, 0x31, 0x20, 0xd9, 0xa4, 0xb4, 0x8b, 0xa0, 0xa1, 0x6c, 0x4a, 0x9d, 0x89, 0xef, + 0x2a, 0x24, 0x94, 0x9d, 0x3d, 0x28, 0x5f, 0x98, 0xa2, 0x8d, 0x66, 0xc9, 0x71, 0x2e, 0xe1, 0xa3, + 0x32, 0xbf, 0x28, 0x83, 0xc2, 0x32, 0xf4, 0xdb, 0x3b, 0x9a, 0x37, 0x96, 0x36, 0xd3, 0x77, 0xef, + 0xf9, 0x90, 0xa0, 0x9c, 0x69, 0xa3, 0x3f, 0x07, 0x6c, 0x2f, 0x62, 0x96, 0x27, 0x1d, 0xfd, 0x39, + 0xb1, 0xf4, 0x09, 0x1c, 0x82, 0xcb, 0x83, 0x85, 0x70, 0x05, 0x8c, 0x60, 0xf6, 0x8e, 0xdc, 0x23, + 0x6e, 0x3d, 0x74, 0x88, 0xdd, 0xac, 0xfd, 0x7e, 0xba, 0x10, 0x6b, 0xa1, 0xcc, 0xf9, 0x9a, 0x67, + 0xbc, 0x30, 0x99, 0x22, 0xf8, 0x9a, 0x18, 0x83, 0x13, 0x58, 0x01, 0x90, 0xc1, 0x34, 0x66, 0xa8, + 0x62, 0x5d, 0xc6, 0xae, 0x87, 0xdc, 0x42, 0xe5, 0x73, 0xc6, 0xb2, 0x50, 0x79, 0x0f, 0xbf, 0x50, + 0x29, 0x18, 0x31, 0x39, 0x58, 0xa7, 0x4c, 0xe9, 0x8b, 0x83, 0xbe, 0x1f, 0xfb, 0x32, 0x65, 0x0a, + 0x5f, 0x9c, 0x21, 0xe5, 0x67, 0x8f, 0xe8, 0x1b, 0xff, 0x0b, 0xed, 0xac, 0x83, 0x0d, 0x59, 0xed, + 0x7f, 0x9c, 0x00, 0xf9, 0x73, 0xe8, 0xcf, 0x3f, 0x46, 0x37, 0x6a, 0xbd, 0x6c, 0x0c, 0xc1, 0x1d, + 0x9e, 0x06, 0xf2, 0x88, 0x3e, 0x9d, 0xf6, 0xdc, 0x2a, 0xb6, 0x3b, 0x8c, 0x18, 0x31, 0xf0, 0x77, + 0xea, 0x29, 0x50, 0xf4, 0x9c, 0x3d, 0xb7, 0x8d, 0xcc, 0x6f, 0xa4, 0x31, 0xf4, 0x29, 0x6d, 0x50, + 0x53, 0x8e, 0xf4, 0xe2, 0xf8, 0x5c, 0x4e, 0x99, 0x0b, 0x96, 0x64, 0xee, 0x82, 0xa5, 0x14, 0xfb, + 0x0f, 0x02, 0xbc, 0x65, 0xaf, 0x11, 0x7f, 0x8c, 0xef, 0x1a, 0xec, 0x8c, 0x0b, 0xf6, 0x18, 0xb1, + 0x1c, 0x56, 0x1d, 0xd2, 0x3a, 0x8c, 0xf3, 0xa2, 0x0d, 0xe3, 0xc8, 0x4f, 0xd4, 0x61, 0x5c, 0x80, + 0x87, 0x89, 0x9c, 0x72, 0x2f, 0x52, 0x27, 0xd7, 0x0b, 0xe3, 0x44, 0x37, 0xcf, 0x29, 0xfd, 0xa1, + 0xd0, 0x19, 0xa3, 0xf3, 0xeb, 0xc8, 0xe8, 0x1c, 0x91, 0xfb, 0xeb, 0xaf, 0xc9, 0x38, 0x92, 0x66, + 0x60, 0x04, 0x89, 0x5f, 0x94, 0x94, 0x1a, 0x22, 0x34, 0x06, 0x73, 0x71, 0xa4, 0xe7, 0x47, 0x0f, + 0x2d, 0xce, 0x8b, 0x8e, 0xe1, 0x7f, 0xd2, 0xa1, 0xc5, 0x45, 0x19, 0xc9, 0x1e, 0xc8, 0x5f, 0x20, + 0x17, 0x93, 0x95, 0xda, 0xbe, 0x75, 0x79, 0xcc, 0x2d, 0x8d, 0x1f, 0x5e, 0x52, 0x46, 0x13, 0x3e, + 0x20, 0x21, 0xc2, 0xe1, 0xa4, 0xa3, 0x09, 0x8b, 0xb1, 0x91, 0x3d, 0x4c, 0x3f, 0x06, 0x90, 0xf4, + 0xe8, 0xda, 0xce, 0x1b, 0x64, 0x20, 0x37, 0xa1, 0xaf, 0xc1, 0xc3, 0xa3, 0x75, 0x16, 0xcc, 0x31, + 0x4b, 0x07, 0xc1, 0x85, 0x37, 0x5c, 0x5a, 0xda, 0x83, 0xf2, 0xa1, 0xc8, 0xd8, 0x45, 0x97, 0x49, + 0x1f, 0x94, 0x17, 0x61, 0x62, 0x02, 0x07, 0xe5, 0xe9, 0xb2, 0xcf, 0xb7, 0x0b, 0x50, 0xe3, 0x5a, + 0x01, 0x3a, 0x14, 0x50, 0x47, 0xb1, 0x14, 0xf4, 0xf6, 0xc8, 0xd8, 0x98, 0x10, 0x56, 0x1f, 0x62, + 0xb1, 0x6a, 0xf0, 0x58, 0xdd, 0x25, 0x22, 0x26, 0x31, 0xe3, 0x43, 0x68, 0x82, 0xff, 0xce, 0x10, + 0x2e, 0x83, 0x83, 0xeb, 0x69, 0x23, 0xf3, 0x91, 0x3d, 0x62, 0x3f, 0x47, 0xc6, 0xad, 0x26, 0x99, + 0x5b, 0x8d, 0x67, 0xdc, 0xa2, 0xd3, 0x36, 0x99, 0x9b, 0xb6, 0xa5, 0x3c, 0x58, 0x11, 0xf9, 0x0b, + 0x07, 0xcc, 0x0d, 0x83, 0x28, 0x3f, 0xe6, 0x83, 0x15, 0x43, 0x39, 0xc8, 0x1e, 0x9c, 0xaf, 0xc9, + 0x00, 0xac, 0xb8, 0xce, 0x5e, 0xaf, 0xe1, 0x76, 0xa0, 0xab, 0xfd, 0x59, 0x34, 0x53, 0xfb, 0xc9, + 0x31, 0xcc, 0xd4, 0xd6, 0x01, 0xd8, 0x0e, 0x89, 0x53, 0x0d, 0xbf, 0x43, 0x6c, 0x5e, 0x16, 0x31, + 0x65, 0x30, 0x34, 0xf8, 0xbb, 0x85, 0x9f, 0xc1, 0x63, 0x9c, 0xd4, 0x67, 0x45, 0xe4, 0xc6, 0x39, + 0x53, 0x7b, 0x77, 0x88, 0x75, 0x8b, 0xc3, 0xfa, 0xe9, 0x87, 0xe0, 0x24, 0x7b, 0xcc, 0xff, 0x61, + 0x0a, 0xcc, 0x92, 0x7d, 0x59, 0x22, 0xd3, 0xbf, 0x89, 0x40, 0xff, 0xd9, 0x31, 0x80, 0xbe, 0x01, + 0xe6, 0x9c, 0x88, 0x3a, 0xe9, 0x53, 0xd9, 0x95, 0xb2, 0x44, 0xd8, 0x19, 0xbe, 0x0c, 0x8e, 0x8c, + 0xf6, 0x71, 0x16, 0x79, 0x83, 0x47, 0xfe, 0x9e, 0x04, 0x79, 0x33, 0x14, 0xc7, 0x09, 0xfd, 0x7b, + 0x42, 0xe8, 0x37, 0x38, 0xe8, 0x4b, 0x87, 0x61, 0x65, 0x02, 0xf7, 0x2a, 0xc8, 0x20, 0x8f, 0x8f, + 0x41, 0xbe, 0x25, 0xc3, 0x85, 0x98, 0xd3, 0x60, 0x0a, 0x37, 0xd9, 0x70, 0x82, 0x18, 0x3c, 0xa2, + 0x37, 0xe6, 0x96, 0x0f, 0xdd, 0x70, 0x89, 0x3d, 0x78, 0x44, 0x3c, 0x04, 0xee, 0xe7, 0xde, 0xe9, + 0x22, 0xd9, 0x71, 0x0e, 0x13, 0x46, 0x9e, 0x3d, 0xb2, 0x12, 0x1f, 0xdb, 0xc1, 0xc8, 0x51, 0x66, + 0x8f, 0x43, 0x18, 0xc9, 0x1e, 0xf8, 0x2f, 0xe6, 0xc1, 0x69, 0xb2, 0xfc, 0xb7, 0xec, 0x3a, 0xbb, + 0x7d, 0xd7, 0x98, 0x59, 0x87, 0xd7, 0x85, 0x9b, 0xc1, 0x82, 0xcf, 0x39, 0xde, 0x53, 0x9d, 0xe8, + 0x4b, 0xd5, 0x7e, 0x87, 0x75, 0x9e, 0x79, 0x26, 0x8f, 0xe4, 0x52, 0x82, 0x00, 0xe3, 0x78, 0x4f, + 0xbd, 0xa3, 0x22, 0xc8, 0x28, 0xb3, 0x9a, 0x28, 0x8f, 0xb4, 0xb8, 0x1c, 0xea, 0x54, 0x41, 0x44, + 0xa7, 0x3e, 0x18, 0xea, 0xd4, 0xf7, 0x72, 0x3a, 0xb5, 0x72, 0x78, 0x91, 0x4c, 0x60, 0x89, 0x69, + 0x01, 0x14, 0x97, 0xad, 0xae, 0x0f, 0x5d, 0xed, 0xcb, 0x74, 0x1e, 0xf5, 0xaa, 0x0c, 0xbb, 0x97, + 0x0a, 0x28, 0x6e, 0xe1, 0xd2, 0xa8, 0x41, 0x76, 0x9b, 0x18, 0x36, 0x84, 0x43, 0x83, 0x7e, 0x9b, + 0x36, 0xc8, 0x5f, 0x1f, 0x99, 0xb1, 0x4d, 0xc0, 0x52, 0x04, 0xf9, 0x1b, 0xce, 0xc2, 0x44, 0xee, + 0xb7, 0x2a, 0x1a, 0x70, 0x17, 0x8d, 0x20, 0x97, 0xb2, 0x43, 0x58, 0x01, 0xb2, 0xd5, 0xf1, 0x70, + 0xd3, 0x9b, 0x31, 0xd0, 0xdf, 0xb4, 0x2e, 0x47, 0xfd, 0xa2, 0x22, 0x2c, 0x4f, 0xda, 0xe5, 0x48, + 0x88, 0x8b, 0xec, 0x31, 0xfb, 0x26, 0xf6, 0x37, 0xed, 0x75, 0xcd, 0x36, 0x44, 0xdc, 0x67, 0x86, + 0xda, 0x02, 0x90, 0xac, 0x60, 0xc4, 0x97, 0x2c, 0xb6, 0x9d, 0x16, 0x0e, 0xd1, 0x4e, 0x47, 0x5d, + 0x8d, 0x0c, 0x65, 0x8e, 0x2b, 0x7e, 0x64, 0xab, 0x91, 0x89, 0x6c, 0x4c, 0xe0, 0xf6, 0xd2, 0xe0, + 0x3c, 0xee, 0x44, 0x5b, 0xeb, 0xa8, 0x7b, 0x35, 0x54, 0x58, 0x63, 0x3b, 0x7b, 0x3b, 0xca, 0x5e, + 0x4d, 0x3c, 0x0f, 0x13, 0x40, 0x6b, 0x81, 0xa2, 0xf5, 0x79, 0x3a, 0x8c, 0x66, 0xbc, 0x5d, 0xea, + 0x39, 0xae, 0x9f, 0x6e, 0xbb, 0x14, 0x71, 0x67, 0xe0, 0xef, 0xd2, 0x9e, 0xdf, 0xe2, 0x8f, 0x67, + 0x8f, 0x6b, 0xf8, 0x4c, 0x71, 0x7e, 0x6b, 0x18, 0x03, 0xd9, 0xc3, 0xfb, 0xd6, 0x23, 0x1a, 0x3c, + 0x47, 0x6d, 0x8e, 0xb4, 0x0d, 0x8c, 0x6d, 0xe8, 0x1c, 0xa5, 0x39, 0xc6, 0xf3, 0x90, 0x3d, 0x5e, + 0x7f, 0xcf, 0x0c, 0x9c, 0x6f, 0x9a, 0xe0, 0xc0, 0x19, 0xb4, 0xcc, 0xc2, 0x88, 0x2d, 0x73, 0xd4, + 0xdd, 0x05, 0x2a, 0xeb, 0xf1, 0x0d, 0x98, 0xa3, 0xec, 0x2e, 0x24, 0x30, 0x91, 0x3d, 0xe2, 0x6f, + 0x96, 0x41, 0xa1, 0x39, 0xf9, 0xf1, 0x72, 0xd4, 0xb9, 0x08, 0x96, 0x55, 0x73, 0x6c, 0xc3, 0xe5, + 0x28, 0x73, 0x91, 0x58, 0x16, 0x26, 0x10, 0xbf, 0xff, 0x38, 0x98, 0xc3, 0x13, 0xee, 0x60, 0xb7, + 0xf5, 0xef, 0xe9, 0xa8, 0xf9, 0xfa, 0x0c, 0xdb, 0xea, 0xfd, 0x60, 0x3a, 0xd8, 0x1d, 0xa2, 0x23, + 0xe7, 0xa2, 0x58, 0xfb, 0x0c, 0xb8, 0x34, 0xc2, 0xef, 0x0f, 0xe5, 0x13, 0x31, 0xf6, 0x9d, 0xc0, + 0x51, 0x7d, 0x22, 0x8e, 0x74, 0x37, 0xf0, 0xb7, 0xa3, 0x11, 0xf5, 0xbf, 0x66, 0x87, 0x79, 0xff, + 0x2e, 0x61, 0x7e, 0xc0, 0x2e, 0xe1, 0x27, 0x59, 0x2c, 0x9b, 0x3c, 0x96, 0xf7, 0x8a, 0x8a, 0x70, + 0x8c, 0x63, 0xed, 0x7b, 0x43, 0x38, 0xcf, 0x71, 0x70, 0x2e, 0x1d, 0x8a, 0x97, 0x09, 0x9c, 0x9f, + 0xcc, 0x47, 0x63, 0xee, 0xa7, 0x32, 0x6c, 0xc7, 0x7d, 0x87, 0x33, 0xf2, 0x07, 0x0e, 0x67, 0x70, + 0x2d, 0xbd, 0x70, 0xc8, 0x96, 0xfe, 0x29, 0x56, 0x3b, 0x5a, 0xbc, 0x76, 0x3c, 0x4d, 0x1c, 0x91, + 0xf1, 0x8d, 0xcc, 0xef, 0x0b, 0xd5, 0xe3, 0x3c, 0xa7, 0x1e, 0xe5, 0xc3, 0x31, 0x93, 0xbd, 0x7e, + 0xfc, 0x7a, 0x30, 0xa1, 0x3d, 0xe2, 0xf6, 0x3e, 0xea, 0x46, 0x24, 0x27, 0xc4, 0xb1, 0x8d, 0xdc, + 0xa3, 0x6c, 0x44, 0x0e, 0xe3, 0x64, 0x02, 0x21, 0xdd, 0xe6, 0xc1, 0x2c, 0xe6, 0xe9, 0xbc, 0xd5, + 0xd9, 0x86, 0xbe, 0xf6, 0x6a, 0xe2, 0xaa, 0x18, 0x04, 0xd0, 0x1c, 0x53, 0x94, 0xa3, 0xb8, 0x63, + 0xb3, 0x69, 0xfd, 0x05, 0x08, 0x93, 0x8b, 0x0c, 0x83, 0x93, 0x0e, 0xc4, 0x38, 0x94, 0x83, 0xec, + 0x21, 0xfb, 0x38, 0x71, 0xe6, 0xa8, 0x99, 0xfb, 0xce, 0x9e, 0xaf, 0x3d, 0x3c, 0x86, 0x0e, 0x7a, + 0x09, 0x14, 0xbb, 0x98, 0x1a, 0x3d, 0x9d, 0x91, 0x3c, 0xdd, 0xa1, 0x22, 0x20, 0xe5, 0x1b, 0xf4, + 0xcb, 0xb4, 0x47, 0x34, 0x22, 0x39, 0x12, 0x3a, 0x93, 0x3e, 0xa2, 0x31, 0xa4, 0xfc, 0x89, 0x5c, + 0xd5, 0x33, 0x8d, 0x4a, 0xb7, 0x76, 0x2d, 0x7f, 0x4c, 0x81, 0x20, 0xba, 0x88, 0x56, 0x10, 0x08, + 0x02, 0x3f, 0xa4, 0x3d, 0x78, 0xca, 0x48, 0x05, 0x7d, 0x3e, 0xe9, 0x83, 0xa7, 0xc9, 0xc5, 0x67, + 0x8f, 0xc9, 0x4f, 0x93, 0x96, 0x75, 0x8e, 0xf8, 0xe0, 0x66, 0xe8, 0xde, 0x3b, 0x72, 0x63, 0x21, + 0xac, 0x1d, 0x5d, 0x63, 0x19, 0x58, 0x7e, 0xf6, 0xc0, 0xfc, 0xe2, 0x77, 0x82, 0x42, 0x05, 0x5e, + 0xdc, 0xdb, 0xd6, 0xee, 0x01, 0xd3, 0x2d, 0x17, 0xc2, 0xaa, 0xbd, 0xe5, 0x20, 0xe9, 0xfa, 0xe8, + 0x7f, 0x00, 0x09, 0x7d, 0x42, 0x78, 0xec, 0x40, 0xb3, 0x13, 0x1d, 0x43, 0x0b, 0x1e, 0xb5, 0x97, + 0x49, 0x20, 0xdf, 0xf4, 0x4d, 0x5f, 0x9b, 0x09, 0xb1, 0xd5, 0x1e, 0x66, 0xb1, 0xb8, 0x87, 0xc7, + 0xe2, 0x66, 0x4e, 0x16, 0x98, 0x83, 0x45, 0xf4, 0x7d, 0x0c, 0x00, 0x1a, 0x98, 0x7e, 0xd0, 0x73, + 0x6c, 0x94, 0x23, 0x38, 0x29, 0x19, 0x3c, 0x6b, 0xaf, 0x0c, 0xc5, 0x7d, 0x1f, 0x27, 0xee, 0xc7, + 0x89, 0x15, 0x31, 0x81, 0x95, 0x36, 0x09, 0xcc, 0x20, 0xd1, 0xae, 0x42, 0xb3, 0xe3, 0x69, 0xdf, + 0x11, 0x29, 0x7f, 0x8c, 0x98, 0xb5, 0x0f, 0x0b, 0xc7, 0xf4, 0x24, 0xb5, 0x0a, 0x89, 0xc7, 0xfb, + 0x0b, 0x04, 0x31, 0x4d, 0x24, 0x3e, 0xa6, 0xc9, 0xed, 0x20, 0x6f, 0xd9, 0x5b, 0x0e, 0xf5, 0x5e, + 0xbb, 0x36, 0x86, 0x36, 0xd2, 0x09, 0x03, 0x67, 0x14, 0x0c, 0xf8, 0x99, 0xcc, 0xd6, 0x44, 0xee, + 0xce, 0xcb, 0xa3, 0xd2, 0xb5, 0xff, 0x73, 0xa8, 0xb0, 0x55, 0x15, 0xe4, 0x7b, 0xa6, 0xbf, 0x43, + 0x8b, 0xc6, 0xff, 0x91, 0x8d, 0xbc, 0x67, 0x9b, 0xb6, 0x63, 0xef, 0xef, 0x5a, 0xcf, 0x0e, 0xaf, + 0xe8, 0xe5, 0xd2, 0x10, 0xe7, 0xdb, 0xd0, 0x86, 0xae, 0xe9, 0xc3, 0xe6, 0xe5, 0x6d, 0x3c, 0xc7, + 0x9a, 0x36, 0xd8, 0xa4, 0xd4, 0xfa, 0x8f, 0x38, 0x8e, 0xd7, 0xff, 0x2d, 0xab, 0x0b, 0x71, 0xc0, + 0x27, 0xaa, 0xff, 0xc1, 0x73, 0x2a, 0xfd, 0x1f, 0x50, 0x44, 0xf6, 0x68, 0xfc, 0xab, 0x04, 0xe6, + 0x9a, 0x48, 0xe1, 0x9a, 0x7b, 0xbb, 0xbb, 0xa6, 0xbb, 0xaf, 0xdd, 0x18, 0xa1, 0xc2, 0xa8, 0x66, + 0x8e, 0x53, 0x4d, 0xed, 0xd7, 0x84, 0x6f, 0xa7, 0xa6, 0x4d, 0x9b, 0x29, 0x21, 0x75, 0x3b, 0x78, + 0x02, 0x28, 0x20, 0xf5, 0x0e, 0xfc, 0xf9, 0x12, 0x1b, 0x02, 0xc9, 0x29, 0x18, 0x18, 0x6b, 0x28, + 0x6f, 0x13, 0x08, 0xca, 0x21, 0x81, 0xe3, 0x4d, 0xdf, 0x6c, 0x5f, 0x5a, 0x71, 0x5c, 0x67, 0xcf, + 0xb7, 0x6c, 0xe8, 0x69, 0x8f, 0x8e, 0x10, 0x08, 0xf4, 0x3f, 0x17, 0xe9, 0xbf, 0xf6, 0xef, 0x39, + 0xd1, 0x51, 0x34, 0xec, 0x56, 0x59, 0xf2, 0x31, 0x71, 0xae, 0xc4, 0xc6, 0x45, 0x11, 0x8a, 0xd9, + 0x0b, 0xed, 0x4d, 0x32, 0x50, 0xf4, 0x87, 0x7a, 0x8e, 0xeb, 0xd7, 0x9c, 0xb6, 0xd9, 0xf5, 0x7c, + 0xc7, 0x85, 0x5a, 0x23, 0x51, 0x6a, 0xa8, 0x87, 0xe9, 0x38, 0xed, 0x68, 0x70, 0xa4, 0x4f, 0xac, + 0xda, 0xc9, 0xbc, 0x8e, 0x7f, 0x5c, 0x78, 0x97, 0x91, 0x48, 0xa5, 0x9f, 0xa3, 0x18, 0x3d, 0x1f, + 0xd4, 0xa5, 0xa5, 0x73, 0xc5, 0x17, 0xdb, 0x79, 0x14, 0x62, 0x6a, 0x02, 0x4b, 0xe5, 0x12, 0x98, + 0x6f, 0xee, 0x5d, 0x0c, 0x89, 0x78, 0xac, 0x11, 0xf2, 0x1a, 0xe1, 0x60, 0x16, 0x54, 0xf1, 0x58, + 0x42, 0x31, 0xf2, 0xbd, 0x09, 0xcc, 0x7b, 0x6c, 0x36, 0x8a, 0x37, 0x9f, 0x28, 0x18, 0xc4, 0x62, + 0x78, 0xa9, 0xd9, 0x0b, 0xf0, 0x7d, 0x12, 0x98, 0x6f, 0xf4, 0xa0, 0x0d, 0x3b, 0xc4, 0xc7, 0x8e, + 0x13, 0xe0, 0xcb, 0x52, 0x0a, 0x90, 0x23, 0x14, 0x23, 0xc0, 0xc8, 0x1f, 0xb6, 0x12, 0x08, 0x2f, + 0x4a, 0x48, 0x25, 0xb8, 0xa4, 0xd2, 0xb2, 0x17, 0xdc, 0x97, 0x24, 0x30, 0x6b, 0xec, 0xd9, 0xeb, + 0xae, 0x83, 0x46, 0x63, 0x57, 0xbb, 0x37, 0xea, 0x20, 0x6e, 0x03, 0x27, 0x3a, 0x7b, 0x2e, 0x5e, + 0x7f, 0xaa, 0xda, 0x4d, 0xd8, 0x76, 0xec, 0x8e, 0x87, 0xeb, 0x51, 0x30, 0x0e, 0xbe, 0xb8, 0x3b, + 0xff, 0xfc, 0xbf, 0x92, 0x73, 0xda, 0x0b, 0x85, 0x23, 0xe6, 0x90, 0xca, 0x33, 0x45, 0x8b, 0xf7, + 0x04, 0x82, 0x71, 0x71, 0x86, 0x95, 0x90, 0xbd, 0x70, 0x3f, 0x2f, 0x01, 0xb5, 0xd4, 0x6e, 0x3b, + 0x7b, 0xb6, 0xdf, 0x84, 0x5d, 0xd8, 0xf6, 0x5b, 0xae, 0xd9, 0x86, 0xac, 0xfd, 0xac, 0x00, 0xb9, + 0x63, 0xb9, 0xb4, 0x0f, 0x46, 0x7f, 0xa9, 0x1c, 0x5f, 0x26, 0xbc, 0xe3, 0x48, 0x6a, 0x79, 0xb0, + 0x94, 0x14, 0xe2, 0x14, 0xdb, 0x57, 0x14, 0x2c, 0x28, 0x7b, 0xa9, 0x7e, 0x4a, 0x02, 0x33, 0x41, + 0x8f, 0xbd, 0x2d, 0x22, 0xcc, 0x9f, 0x4e, 0x39, 0x19, 0x09, 0x89, 0xa7, 0x90, 0xe1, 0xbb, 0x52, + 0xcc, 0x2a, 0xe2, 0xe8, 0xa7, 0x13, 0x5d, 0x29, 0xbd, 0xe8, 0xd0, 0x63, 0xbd, 0xb1, 0xb9, 0xdc, + 0xa8, 0x55, 0x74, 0x43, 0x91, 0xb5, 0x2f, 0x4b, 0x20, 0xbf, 0x6e, 0xd9, 0xdb, 0x6c, 0x60, 0xb3, + 0x93, 0xc8, 0x8e, 0xec, 0xc0, 0x87, 0x68, 0x4b, 0x27, 0x0f, 0xea, 0x9d, 0xe0, 0xa4, 0xbd, 0xb7, + 0x7b, 0x11, 0xba, 0x8d, 0x2d, 0x3c, 0xca, 0x7a, 0x2d, 0xa7, 0x09, 0x6d, 0x62, 0x84, 0x16, 0x8c, + 0x81, 0xef, 0x78, 0x13, 0x4c, 0x60, 0xf2, 0x80, 0x38, 0x89, 0x91, 0x78, 0xc8, 0x94, 0xc4, 0x30, + 0x95, 0x6a, 0xda, 0x30, 0x80, 0x78, 0xf6, 0x9a, 0xfa, 0x1b, 0x05, 0x70, 0x75, 0xc9, 0xde, 0xc7, + 0x36, 0x05, 0xe9, 0xe0, 0xcb, 0x3b, 0xa6, 0xbd, 0x0d, 0xf1, 0x00, 0x11, 0x4a, 0x9c, 0x8d, 0xf4, + 0x9f, 0xe3, 0x23, 0xfd, 0xab, 0x06, 0x98, 0x72, 0xdc, 0x0e, 0x74, 0x97, 0xf6, 0x31, 0x4f, 0xfd, + 0xcb, 0xce, 0xb4, 0x4d, 0x0e, 0x2a, 0x62, 0x91, 0x92, 0x5f, 0x6c, 0x90, 0xef, 0x8d, 0x80, 0xd0, + 0xd9, 0xdb, 0xc0, 0x14, 0x4d, 0x53, 0xe7, 0xc0, 0x74, 0xc3, 0xa8, 0xe8, 0xc6, 0x66, 0xb5, 0xa2, + 0x1c, 0x53, 0xaf, 0x02, 0xc7, 0xab, 0x2d, 0xdd, 0x28, 0xb5, 0xaa, 0x8d, 0xfa, 0x26, 0x4e, 0x57, + 0x72, 0xda, 0xf3, 0xf2, 0xa2, 0x9e, 0xbd, 0xc9, 0xcc, 0x0c, 0x82, 0xd5, 0x00, 0x53, 0x6d, 0x92, + 0x01, 0x0f, 0xa1, 0xb3, 0xa9, 0x6a, 0x47, 0x09, 0x92, 0x04, 0x23, 0x20, 0xa4, 0x9e, 0x01, 0xe0, + 0x8a, 0xeb, 0xd8, 0xdb, 0xd1, 0x99, 0xb6, 0x69, 0x83, 0x49, 0xd1, 0x1e, 0xce, 0x81, 0x22, 0xf9, + 0x06, 0xdf, 0x6c, 0x82, 0xff, 0x45, 0x82, 0x0f, 0x9e, 0x91, 0xc5, 0x8b, 0xe5, 0x15, 0x4d, 0xb4, + 0xe8, 0x23, 0xd2, 0x45, 0x22, 0x03, 0x62, 0x09, 0xd3, 0xaa, 0xdc, 0x0e, 0x8a, 0xe4, 0x5b, 0xea, + 0x75, 0x10, 0x1f, 0xa5, 0x94, 0x64, 0x13, 0xf4, 0x53, 0x16, 0x97, 0x69, 0xf6, 0xda, 0xfc, 0x11, + 0x09, 0x4c, 0xd7, 0xa1, 0x5f, 0xde, 0x81, 0xed, 0x4b, 0xda, 0x63, 0xf9, 0x05, 0xd0, 0xae, 0x05, + 0x6d, 0xff, 0xc2, 0x6e, 0x37, 0x5c, 0x00, 0x0d, 0x12, 0xb4, 0x17, 0xb0, 0x9d, 0xef, 0xd3, 0x79, + 0xfd, 0xb9, 0x75, 0x40, 0x5d, 0x83, 0x12, 0x62, 0x54, 0xe6, 0x14, 0x28, 0xba, 0xd0, 0xdb, 0xeb, + 0x06, 0x8b, 0x68, 0xf4, 0x49, 0x7b, 0x6d, 0x28, 0xce, 0x32, 0x27, 0xce, 0xdb, 0xc5, 0x8b, 0x98, + 0x40, 0xd8, 0xd3, 0x3c, 0x98, 0xaa, 0xda, 0x96, 0x6f, 0x99, 0x5d, 0xed, 0x85, 0x79, 0x30, 0xdf, + 0x84, 0xfe, 0xba, 0xe9, 0x9a, 0xbb, 0xd0, 0x87, 0xae, 0xa7, 0x7d, 0x83, 0xef, 0x13, 0x7a, 0x5d, + 0xd3, 0xdf, 0x72, 0xdc, 0xdd, 0x40, 0x35, 0x83, 0x67, 0xa4, 0x9a, 0x97, 0xa1, 0xeb, 0x45, 0x7c, + 0x05, 0x8f, 0xe8, 0xcd, 0x15, 0xc7, 0xbd, 0x84, 0x06, 0x41, 0x3a, 0x4d, 0xa3, 0x8f, 0x88, 0x5e, + 0xd7, 0xd9, 0xae, 0xc1, 0xcb, 0x30, 0x88, 0xaa, 0x16, 0x3e, 0xa3, 0xb9, 0x40, 0xc7, 0xa9, 0x3b, + 0x3e, 0xea, 0xb4, 0x6b, 0xce, 0x36, 0x09, 0x3b, 0x3b, 0x6d, 0xf0, 0x89, 0x51, 0x2e, 0xf3, 0x32, + 0xc4, 0xb9, 0x8a, 0x6c, 0x2e, 0x9a, 0xa8, 0x2e, 0x02, 0x35, 0xfc, 0xac, 0x05, 0xbb, 0x70, 0x17, + 0xfa, 0xee, 0x3e, 0xbe, 0x5d, 0x62, 0xda, 0x18, 0xf0, 0x86, 0x0e, 0xd0, 0xe2, 0x93, 0x75, 0x2a, + 0xbd, 0x45, 0x4e, 0x72, 0x87, 0x9a, 0xac, 0x8b, 0x50, 0x9c, 0xc8, 0xed, 0x59, 0x32, 0xb2, 0x66, + 0x5e, 0x2e, 0x83, 0x3c, 0x1e, 0x3c, 0xdf, 0x9c, 0xe3, 0x56, 0x98, 0x76, 0xa1, 0xe7, 0x99, 0xdb, + 0x30, 0x58, 0x61, 0xa2, 0x8f, 0xea, 0x5d, 0xa0, 0xd0, 0xc5, 0x98, 0x92, 0xc1, 0xe1, 0x46, 0xae, + 0x66, 0xc8, 0xc0, 0x40, 0xb4, 0xc2, 0x91, 0x00, 0xc3, 0x6d, 0x90, 0x2f, 0xce, 0xde, 0x0f, 0x0a, + 0x04, 0xfe, 0x19, 0x50, 0xa8, 0xe8, 0x4b, 0x1b, 0x2b, 0xca, 0x31, 0xf4, 0x37, 0xe0, 0x6f, 0x06, + 0x14, 0x96, 0x4b, 0xad, 0x52, 0x4d, 0x91, 0x50, 0x3d, 0xaa, 0xf5, 0xe5, 0x86, 0x22, 0xa3, 0xc4, + 0xf5, 0x52, 0xbd, 0x5a, 0x56, 0xf2, 0xea, 0x2c, 0x98, 0x3a, 0x5f, 0x32, 0xea, 0xd5, 0xfa, 0x8a, + 0x52, 0xd0, 0xfe, 0x92, 0xc5, 0xef, 0x6e, 0x1e, 0xbf, 0x9b, 0xe2, 0x78, 0x1a, 0x04, 0xd9, 0xcf, + 0x87, 0x90, 0xdd, 0xcb, 0x41, 0xf6, 0x9d, 0x22, 0x44, 0x26, 0xe0, 0xce, 0x54, 0x04, 0x53, 0xeb, + 0xae, 0xd3, 0x86, 0x9e, 0xa7, 0xfd, 0x8c, 0x04, 0x8a, 0x65, 0xd3, 0x6e, 0xc3, 0xae, 0x76, 0x4d, + 0x04, 0x15, 0x71, 0x15, 0xcd, 0x05, 0xae, 0xa2, 0xda, 0xd7, 0x72, 0xa2, 0xbd, 0x1f, 0xa5, 0xbb, + 0x48, 0x68, 0xc6, 0xc8, 0x47, 0xac, 0x97, 0x4b, 0x24, 0x35, 0x81, 0x1b, 0x76, 0x24, 0x30, 0x43, + 0x57, 0x03, 0x2e, 0x42, 0x76, 0x1e, 0xfe, 0x8d, 0x9c, 0xe8, 0xe4, 0x30, 0xa8, 0x41, 0x48, 0x26, + 0x46, 0x1e, 0x62, 0x13, 0xc1, 0x61, 0xd4, 0x26, 0xb0, 0x79, 0x28, 0x81, 0xd9, 0x0d, 0xdb, 0x1b, + 0x24, 0x14, 0xf1, 0x70, 0xfc, 0x41, 0x35, 0x18, 0x42, 0x87, 0x0a, 0xc7, 0x3f, 0x9c, 0x5e, 0xf6, + 0x82, 0xf9, 0x46, 0x0e, 0x9c, 0x5c, 0x81, 0x36, 0x74, 0xad, 0x36, 0xa9, 0x41, 0x20, 0x89, 0x7b, + 0x79, 0x49, 0x3c, 0x96, 0xe3, 0x7c, 0xd0, 0x17, 0xbc, 0x04, 0x5e, 0x15, 0x4a, 0xe0, 0xe9, 0x9c, + 0x04, 0x6e, 0x13, 0xa4, 0x33, 0x81, 0x6b, 0xd5, 0x67, 0xc0, 0x5c, 0xdd, 0xf1, 0xad, 0x2d, 0xab, + 0x4d, 0x7c, 0xd0, 0x7e, 0x4e, 0x06, 0xf9, 0x9a, 0xe5, 0xf9, 0x5a, 0x29, 0xea, 0x4e, 0x6e, 0x00, + 0xb3, 0x96, 0xdd, 0xee, 0xee, 0x75, 0xa0, 0x01, 0x4d, 0xd2, 0xaf, 0x4c, 0x1b, 0x6c, 0x52, 0xb4, + 0xb5, 0x8f, 0xd8, 0x92, 0x83, 0xad, 0xfd, 0xdf, 0x12, 0x5e, 0x86, 0x61, 0x59, 0xc0, 0x71, 0x29, + 0x63, 0xec, 0xae, 0x12, 0x98, 0xb7, 0x99, 0xac, 0x81, 0xc1, 0xde, 0x7f, 0x2f, 0x01, 0x4b, 0xce, + 0xe0, 0xbf, 0xd0, 0x3e, 0x20, 0xd4, 0x58, 0x87, 0x31, 0x94, 0x0e, 0x99, 0xe5, 0x11, 0x26, 0xc9, + 0x2a, 0x58, 0xa8, 0xd6, 0x5b, 0xba, 0x51, 0x2f, 0xd5, 0x68, 0x16, 0x59, 0xfb, 0x57, 0x09, 0x14, + 0x0c, 0xd8, 0xeb, 0xee, 0xb3, 0x81, 0xa7, 0xa9, 0xa3, 0x78, 0x2e, 0x74, 0x14, 0x57, 0x97, 0x01, + 0x30, 0xdb, 0xa8, 0x60, 0x7c, 0x33, 0x97, 0x34, 0x30, 0x9c, 0x29, 0x57, 0xc1, 0x52, 0x98, 0xdb, + 0x60, 0xbe, 0xd4, 0x5e, 0x24, 0xbc, 0x73, 0xc4, 0x51, 0xc3, 0x1c, 0xc6, 0xf4, 0x09, 0x1f, 0x14, + 0xda, 0xec, 0x19, 0x4a, 0xee, 0x68, 0xc4, 0xff, 0x15, 0x09, 0xe4, 0x5b, 0xa8, 0xb7, 0x64, 0x3a, + 0xce, 0xcf, 0x8e, 0xa6, 0xe3, 0x88, 0x4c, 0x8c, 0x8e, 0xdf, 0x07, 0xe6, 0x58, 0x8d, 0xa5, 0xae, + 0x12, 0x89, 0x2a, 0xce, 0x7d, 0x30, 0x8a, 0x86, 0x0f, 0x60, 0xe7, 0x68, 0x44, 0xfc, 0xe9, 0xc7, + 0x01, 0xb0, 0x06, 0x77, 0x2f, 0x42, 0xd7, 0xdb, 0xb1, 0x7a, 0xda, 0x5f, 0xcb, 0x60, 0x66, 0x05, + 0xfa, 0x4d, 0xdf, 0xf4, 0xf7, 0xbc, 0xbe, 0xed, 0x4e, 0xdb, 0x29, 0x9b, 0xed, 0x1d, 0x48, 0xbb, + 0xa3, 0xe0, 0x51, 0x7b, 0x8f, 0x2c, 0xea, 0x4f, 0x14, 0x95, 0xb3, 0x18, 0x96, 0x11, 0x83, 0xc9, + 0xe3, 0x41, 0xbe, 0x63, 0xfa, 0x26, 0xc5, 0xe2, 0x9a, 0x3e, 0x2c, 0x22, 0x42, 0x06, 0xce, 0xa6, + 0xbd, 0x43, 0x12, 0x71, 0x28, 0x12, 0x28, 0x3f, 0x1d, 0x08, 0x1f, 0xc8, 0x8d, 0x80, 0xc2, 0x09, + 0x30, 0x5f, 0x6f, 0xb4, 0x36, 0x6b, 0x8d, 0x95, 0x15, 0x1d, 0xa5, 0x2a, 0xb2, 0x7a, 0x0a, 0xa8, + 0xeb, 0xa5, 0x0b, 0x6b, 0x7a, 0xbd, 0xb5, 0x59, 0x6f, 0x54, 0x74, 0xfa, 0x65, 0x5e, 0x3d, 0x0e, + 0x66, 0xcb, 0xa5, 0xf2, 0x6a, 0x90, 0x50, 0x50, 0x4f, 0x83, 0x93, 0x6b, 0xfa, 0xda, 0x92, 0x6e, + 0x34, 0x57, 0xab, 0xeb, 0x9b, 0x88, 0xcc, 0x72, 0x63, 0xa3, 0x5e, 0x51, 0x8a, 0xaa, 0x06, 0x4e, + 0x31, 0x6f, 0xce, 0x1b, 0x8d, 0xfa, 0xca, 0x66, 0xb3, 0x55, 0x6a, 0xe9, 0xca, 0x94, 0x7a, 0x15, + 0x38, 0x5e, 0x2e, 0xd5, 0x71, 0xf6, 0x72, 0xa3, 0x5e, 0xd7, 0xcb, 0x2d, 0x65, 0x5a, 0xfb, 0xf7, + 0x3c, 0x98, 0xad, 0x7a, 0x75, 0x73, 0x17, 0x9e, 0x33, 0xbb, 0x56, 0x47, 0x7b, 0x21, 0x33, 0xf3, + 0xb8, 0x09, 0xcc, 0xbb, 0xe4, 0x2f, 0xec, 0xb4, 0x2c, 0x48, 0xd0, 0x9c, 0x37, 0xf8, 0x44, 0x34, + 0x27, 0xb7, 0x31, 0x81, 0x60, 0x4e, 0x4e, 0x9e, 0xd4, 0x25, 0x00, 0xc8, 0xbf, 0x56, 0x74, 0x47, + 0xec, 0xd9, 0xfe, 0xd6, 0x64, 0xee, 0x42, 0x0f, 0xba, 0x97, 0xad, 0x36, 0x0c, 0x72, 0x1a, 0xcc, + 0x57, 0xda, 0x9f, 0xca, 0xa2, 0xfb, 0x8b, 0x0c, 0xa8, 0x4c, 0x75, 0x62, 0x7a, 0xc3, 0x1f, 0x91, + 0x45, 0x76, 0x07, 0x85, 0x48, 0xa6, 0xd3, 0x94, 0x97, 0x48, 0xa3, 0x2d, 0xdb, 0xb6, 0x1a, 0x8d, + 0xcd, 0xe6, 0x6a, 0xc3, 0x68, 0x29, 0xb2, 0x3a, 0x07, 0xa6, 0xd1, 0x63, 0xad, 0x51, 0x5f, 0x51, + 0xf2, 0xea, 0xd5, 0xe0, 0xc4, 0x6a, 0xa9, 0xb9, 0x59, 0xad, 0x9f, 0x2b, 0xd5, 0xaa, 0x95, 0xcd, + 0xf2, 0x6a, 0xc9, 0x68, 0x2a, 0x05, 0xf5, 0x1a, 0x70, 0x75, 0xab, 0xaa, 0x1b, 0x9b, 0xcb, 0x7a, + 0xa9, 0xb5, 0x61, 0xe8, 0xcd, 0xcd, 0x7a, 0x63, 0xb3, 0x5e, 0x5a, 0xd3, 0x95, 0x22, 0x6a, 0xfe, + 0xf8, 0x55, 0xa4, 0x36, 0x53, 0x07, 0x95, 0x71, 0x3a, 0x46, 0x19, 0x67, 0xfa, 0x95, 0x11, 0xb0, + 0x6a, 0x65, 0xe8, 0x4d, 0xdd, 0x38, 0xa7, 0x2b, 0xb3, 0x83, 0x74, 0x6d, 0x4e, 0x3d, 0x09, 0x14, + 0xc4, 0xc3, 0x66, 0xb5, 0x19, 0xe4, 0xac, 0x28, 0xf3, 0xda, 0xa7, 0x8a, 0xe0, 0x94, 0x01, 0xb7, + 0x2d, 0xcf, 0x87, 0xee, 0xba, 0xb9, 0xbf, 0x0b, 0x6d, 0x3f, 0xe8, 0xe4, 0xff, 0x39, 0xb5, 0x32, + 0xae, 0x81, 0xf9, 0x1e, 0xa1, 0xb1, 0x06, 0xfd, 0x1d, 0xa7, 0x43, 0x47, 0xe1, 0xc7, 0xc6, 0xf6, + 0x1c, 0x8b, 0xeb, 0x6c, 0x76, 0x83, 0xff, 0x9a, 0xd1, 0x6d, 0x39, 0x41, 0xb7, 0xf3, 0xa3, 0xe8, + 0xb6, 0x7a, 0x1d, 0x98, 0xd9, 0xf3, 0xa0, 0xab, 0xef, 0x9a, 0x56, 0x37, 0xb8, 0xe3, 0x33, 0x4c, + 0xd0, 0xde, 0x99, 0x17, 0x3d, 0xb1, 0xc2, 0xd4, 0x65, 0xb0, 0x18, 0x63, 0xfa, 0xd6, 0x33, 0x00, + 0xd0, 0xca, 0x6e, 0xb8, 0x5d, 0xaa, 0xac, 0x4c, 0x0a, 0xe2, 0xef, 0xa2, 0xd5, 0xed, 0x5a, 0xf6, + 0x76, 0xb8, 0xef, 0x1f, 0x25, 0x68, 0x2f, 0x91, 0x45, 0x4e, 0xb0, 0xa4, 0xe5, 0x2d, 0x5d, 0x6b, + 0x7a, 0x91, 0x34, 0xe1, 0x7e, 0xf7, 0x60, 0xd3, 0x29, 0xaa, 0x0a, 0x98, 0xc3, 0x69, 0xb4, 0x05, + 0x2a, 0x53, 0xa8, 0x0f, 0x0e, 0xc8, 0xad, 0xe9, 0xad, 0xd5, 0x46, 0x25, 0x7c, 0x37, 0x8d, 0x48, + 0x22, 0x66, 0x4a, 0xf5, 0x0b, 0xb8, 0x35, 0xce, 0xa8, 0x8f, 0x06, 0xd7, 0x30, 0x1d, 0x76, 0xa9, + 0x66, 0xe8, 0xa5, 0xca, 0x85, 0x4d, 0xfd, 0x99, 0xd5, 0x66, 0xab, 0xc9, 0x37, 0xae, 0xa0, 0x1d, + 0xcd, 0x22, 0x7e, 0xf5, 0xb5, 0x52, 0xb5, 0x46, 0xfb, 0xf7, 0xe5, 0x86, 0xb1, 0x56, 0x6a, 0x29, + 0x73, 0xda, 0xcb, 0x65, 0xa0, 0xac, 0x40, 0x7f, 0xdd, 0x71, 0x7d, 0xb3, 0x5b, 0xb3, 0xec, 0x4b, + 0x1b, 0x6e, 0x97, 0x9b, 0x6c, 0x0a, 0x87, 0xe9, 0xe0, 0x87, 0x48, 0x8e, 0x60, 0xfc, 0x8e, 0x78, + 0x0f, 0x67, 0x8b, 0x94, 0x29, 0x4a, 0xd0, 0x9e, 0x23, 0x89, 0x2c, 0x77, 0x8b, 0x97, 0x9a, 0x4e, + 0x4f, 0x9e, 0x3b, 0xe9, 0xf1, 0x79, 0x00, 0x6a, 0x45, 0xed, 0xf9, 0x79, 0x30, 0xbd, 0x6c, 0xd9, + 0x66, 0xd7, 0x7a, 0x36, 0x17, 0x1d, 0x33, 0xea, 0x63, 0x72, 0x09, 0x7d, 0x8c, 0x34, 0xd2, 0xf8, + 0xf9, 0x53, 0xb2, 0xe8, 0xf2, 0x02, 0x23, 0xfb, 0x80, 0xc9, 0x98, 0xc1, 0xf3, 0xa3, 0x92, 0xc8, + 0xf2, 0xc2, 0x70, 0x7a, 0xe9, 0x30, 0xfc, 0xcc, 0xb7, 0x87, 0x8d, 0xd5, 0xd7, 0xbe, 0xa7, 0x07, + 0xa9, 0xc2, 0x8c, 0xf6, 0x7b, 0x32, 0xd0, 0x56, 0xa0, 0x7f, 0x0e, 0xba, 0xe1, 0x54, 0x00, 0xf7, + 0xfa, 0xd4, 0xde, 0x66, 0x9a, 0xec, 0x9b, 0x59, 0x00, 0xcf, 0xf3, 0x00, 0x96, 0x12, 0x1a, 0x4f, + 0x0c, 0xe9, 0x98, 0xc6, 0x5b, 0x05, 0x45, 0x0f, 0xbf, 0xa7, 0x6a, 0xf6, 0x84, 0xf8, 0xe1, 0x12, + 0x13, 0x63, 0xa9, 0x13, 0xc2, 0x06, 0x25, 0xa0, 0x7d, 0x33, 0x9c, 0x04, 0x7d, 0x0f, 0xa7, 0x1d, + 0xcb, 0x87, 0x66, 0x36, 0x9d, 0xbe, 0xb8, 0xd9, 0xaa, 0xcb, 0x20, 0xfb, 0x46, 0xfb, 0x68, 0x01, + 0x9c, 0x1c, 0x54, 0x1d, 0xed, 0x97, 0x73, 0xdc, 0x0e, 0x3b, 0xc4, 0x43, 0x7e, 0x8e, 0x6e, 0x20, + 0xa2, 0x07, 0xf5, 0x49, 0xe0, 0xea, 0x70, 0x19, 0xae, 0xe5, 0xd4, 0xe1, 0x15, 0xaf, 0x0b, 0x7d, + 0x1f, 0xba, 0xb8, 0x6a, 0xd3, 0xc6, 0xe0, 0x97, 0xea, 0x53, 0xc0, 0xa3, 0x2c, 0xdb, 0xb3, 0x3a, + 0xd0, 0x6d, 0x59, 0x3d, 0xaf, 0x64, 0x77, 0x5a, 0x7b, 0xbe, 0xe3, 0x5a, 0x26, 0xbd, 0x91, 0x72, + 0xda, 0x88, 0x7b, 0xad, 0xde, 0x0a, 0x14, 0xcb, 0x6b, 0xd8, 0x17, 0x1d, 0xd3, 0xed, 0x58, 0xf6, + 0x76, 0xcd, 0xf2, 0x7c, 0xea, 0x01, 0x7c, 0x20, 0x5d, 0xfb, 0x1b, 0x59, 0xf4, 0x30, 0xdd, 0x10, + 0x58, 0x63, 0x3a, 0x94, 0x17, 0xc8, 0x22, 0xc7, 0xe3, 0xd2, 0xd1, 0x4e, 0xa7, 0x2c, 0xcf, 0x9b, + 0xb4, 0x21, 0x31, 0x78, 0x04, 0xc7, 0x5d, 0x0b, 0x49, 0x0f, 0x0c, 0x81, 0x73, 0xba, 0x51, 0x5d, + 0xae, 0xea, 0xc8, 0xac, 0xb8, 0x1a, 0x9c, 0x88, 0xde, 0x55, 0x2e, 0x6c, 0x36, 0xf5, 0x7a, 0x4b, + 0x99, 0x46, 0xfd, 0x14, 0x49, 0x5e, 0x2e, 0x55, 0x6b, 0x7a, 0x65, 0xb3, 0xd5, 0x40, 0x6f, 0x2a, + 0xa3, 0x99, 0x16, 0xda, 0xc3, 0x79, 0x70, 0x1c, 0xcb, 0x76, 0x1f, 0x4b, 0x15, 0x09, 0xa5, 0xcf, + 0xd7, 0x36, 0x04, 0x68, 0x86, 0x88, 0x57, 0xfb, 0x5d, 0xe1, 0x0b, 0x37, 0x19, 0x08, 0xfb, 0xca, + 0x88, 0xd1, 0x8c, 0x6f, 0x48, 0x22, 0x11, 0x2a, 0x84, 0xc9, 0xa6, 0x53, 0x8a, 0x7f, 0x99, 0xf4, + 0x88, 0x13, 0x0f, 0x3e, 0xb6, 0x32, 0xcb, 0xf8, 0xe3, 0x67, 0xae, 0x57, 0x0d, 0xac, 0x0e, 0x0b, + 0x00, 0xe0, 0x14, 0xac, 0x41, 0x44, 0x0f, 0x06, 0x8e, 0x57, 0x71, 0x7a, 0x50, 0x2a, 0xb7, 0xaa, + 0xe7, 0xf4, 0x38, 0x3d, 0xf8, 0x9c, 0x0c, 0xa6, 0x57, 0xa0, 0x8f, 0xe6, 0x54, 0x9e, 0xf6, 0x54, + 0x81, 0xf5, 0x1f, 0x64, 0xc6, 0x74, 0x9d, 0xb6, 0xd9, 0x0d, 0x97, 0x01, 0xc8, 0x93, 0xf6, 0xc3, + 0xa3, 0x98, 0x20, 0x41, 0xd1, 0x31, 0xe3, 0xd5, 0x77, 0x83, 0x82, 0x8f, 0x5e, 0xd3, 0x65, 0xe8, + 0xef, 0x88, 0x1d, 0xae, 0x10, 0x91, 0x8a, 0xe9, 0x9b, 0x06, 0xc9, 0xcf, 0x8c, 0x4e, 0x82, 0xb6, + 0x4b, 0x0c, 0x23, 0xdf, 0x8e, 0xf6, 0xe7, 0x5f, 0xca, 0xe0, 0x6a, 0xd2, 0x3e, 0x4a, 0xbd, 0x5e, + 0xd3, 0x77, 0x5c, 0x68, 0xc0, 0x36, 0xb4, 0x7a, 0x7e, 0xdf, 0xfa, 0x9e, 0x4b, 0x52, 0x83, 0xcd, + 0x66, 0xfa, 0xa8, 0xbd, 0x41, 0x16, 0x8d, 0xf0, 0x7b, 0xa0, 0x3d, 0xf6, 0x95, 0x17, 0xd3, 0xd8, + 0x3f, 0x29, 0x89, 0xc4, 0xec, 0x4d, 0x49, 0x3c, 0x1d, 0x50, 0x1f, 0x3b, 0x02, 0xa0, 0x82, 0x95, + 0x1b, 0x43, 0x2f, 0xeb, 0xd5, 0x75, 0x34, 0x08, 0x5c, 0x0f, 0xae, 0x5d, 0xdf, 0x30, 0xca, 0xab, + 0xa5, 0xa6, 0xbe, 0x69, 0xe8, 0x2b, 0xd5, 0x66, 0x8b, 0x3a, 0x65, 0x91, 0xaf, 0xa6, 0xd4, 0xeb, + 0xc0, 0xe9, 0xe6, 0xc6, 0x52, 0xb3, 0x6c, 0x54, 0xd7, 0x71, 0xba, 0xa1, 0xd7, 0xf5, 0xf3, 0xf4, + 0xed, 0xb4, 0xf6, 0x61, 0x05, 0xcc, 0xa2, 0x09, 0x40, 0x93, 0xcc, 0x0b, 0xb4, 0xbf, 0xcb, 0x83, + 0x59, 0x03, 0x7a, 0x4e, 0xf7, 0x32, 0x9e, 0x23, 0x4c, 0x6a, 0xea, 0xf1, 0x75, 0x59, 0xf4, 0xfc, + 0x36, 0xc3, 0xec, 0x22, 0xc3, 0x68, 0xfc, 0x44, 0xd3, 0xbc, 0x6c, 0x5a, 0x5d, 0xf3, 0x22, 0xed, + 0x6a, 0xa6, 0x8d, 0x28, 0x41, 0x5d, 0x04, 0xaa, 0x73, 0xc5, 0x86, 0x6e, 0xb3, 0x7d, 0x45, 0xf7, + 0x77, 0x4a, 0x9d, 0x8e, 0x0b, 0x3d, 0x8f, 0xae, 0x5e, 0x0c, 0x78, 0xa3, 0xde, 0x02, 0x8e, 0xe3, + 0x54, 0x26, 0x33, 0x71, 0x90, 0xe9, 0x4f, 0x0e, 0x73, 0x96, 0xec, 0xfd, 0x20, 0x67, 0x81, 0xc9, + 0x19, 0x25, 0xb3, 0xc7, 0x25, 0x8a, 0xfc, 0x29, 0x9d, 0x1b, 0xc0, 0xac, 0x6d, 0xee, 0x42, 0xfd, + 0xa1, 0x9e, 0xe5, 0x42, 0x0f, 0x3b, 0xc6, 0xc8, 0x06, 0x9b, 0xa4, 0x7d, 0x54, 0xe8, 0xbc, 0xb9, + 0x98, 0xc4, 0xd2, 0xe9, 0xfe, 0xca, 0x08, 0xaa, 0x3f, 0xa0, 0x9f, 0x91, 0xb5, 0x0f, 0xcb, 0x60, + 0x8e, 0x32, 0x55, 0xb2, 0xf7, 0xab, 0x1d, 0xed, 0x7a, 0xce, 0xf8, 0x35, 0x51, 0x5a, 0x60, 0xfc, + 0xe2, 0x07, 0xed, 0x47, 0x65, 0x51, 0x77, 0xe7, 0x01, 0x15, 0xc7, 0x65, 0xc4, 0x3b, 0x8e, 0x6e, + 0x39, 0x7b, 0xd4, 0x51, 0x75, 0xda, 0x20, 0x0f, 0x59, 0x2e, 0xea, 0x69, 0xbf, 0x2a, 0xe4, 0x4c, + 0x2d, 0x58, 0x8d, 0x23, 0x02, 0xf0, 0xd3, 0x32, 0x58, 0xa0, 0x5c, 0x35, 0xe9, 0x39, 0x1f, 0xa1, + 0x03, 0x6f, 0x3f, 0x2e, 0x6c, 0x08, 0x0e, 0xa8, 0x3f, 0x2d, 0xe9, 0x11, 0x03, 0xe4, 0xc7, 0x85, + 0x82, 0xa3, 0x09, 0x57, 0xe4, 0x88, 0xa0, 0x7c, 0x57, 0x1e, 0xcc, 0x6e, 0x78, 0xd0, 0xa5, 0x7e, + 0xfb, 0xda, 0x6b, 0xf3, 0x40, 0x5e, 0x81, 0xdc, 0x46, 0xea, 0x8b, 0x85, 0x3d, 0x7c, 0xd9, 0xca, + 0x32, 0x44, 0x91, 0x8d, 0x14, 0x03, 0xdb, 0xcd, 0x60, 0x81, 0x88, 0xb4, 0xe4, 0xfb, 0xc8, 0x48, + 0x0c, 0xbc, 0x69, 0xfb, 0x52, 0xc7, 0xb1, 0x55, 0x84, 0xcb, 0x42, 0x59, 0xca, 0x88, 0xa7, 0x1a, + 0xdc, 0x22, 0xf3, 0xd9, 0xbc, 0xd1, 0x97, 0xaa, 0xde, 0x01, 0xae, 0x72, 0x7a, 0x90, 0x9c, 0x5f, + 0x61, 0x32, 0x17, 0x70, 0xe6, 0x41, 0xaf, 0xb4, 0xbf, 0x13, 0xf2, 0xd5, 0x15, 0x97, 0x4e, 0x3a, + 0x5d, 0xe8, 0x8d, 0xc7, 0x24, 0x39, 0x09, 0x14, 0x94, 0x03, 0xef, 0xbf, 0x18, 0x7a, 0xb3, 0x51, + 0x3b, 0xa7, 0x0f, 0x5e, 0xc6, 0x28, 0x68, 0xcf, 0x93, 0xc1, 0xcc, 0x92, 0xeb, 0x98, 0x9d, 0xb6, + 0xe9, 0xf9, 0xda, 0x37, 0x25, 0x30, 0xb7, 0x6e, 0xee, 0x77, 0x1d, 0xb3, 0x83, 0xfd, 0xfb, 0xfb, + 0xfa, 0x82, 0x1e, 0x79, 0x15, 0xf4, 0x05, 0xf4, 0x91, 0x3f, 0x18, 0x18, 0x1e, 0xdd, 0xcb, 0x89, + 0xdc, 0xab, 0x19, 0x6e, 0xf3, 0x49, 0x83, 0x82, 0x95, 0x06, 0x7c, 0x2d, 0xb2, 0x3c, 0xc5, 0x58, + 0x94, 0x1f, 0x16, 0x0b, 0x3f, 0x2a, 0x42, 0xf2, 0x68, 0x76, 0xe5, 0x9f, 0x3f, 0x0d, 0x8a, 0x15, + 0x88, 0xad, 0xb8, 0xff, 0x2e, 0x81, 0xa9, 0x26, 0xf4, 0xb1, 0x05, 0x77, 0x17, 0xe7, 0x29, 0xdc, + 0xc1, 0x19, 0x22, 0x27, 0xf6, 0xe0, 0x19, 0x4d, 0xd6, 0x99, 0xf3, 0xd6, 0xf8, 0x7f, 0x0a, 0x8f, + 0x44, 0x52, 0xee, 0x22, 0x2d, 0xf3, 0x50, 0x1e, 0x89, 0x89, 0xa4, 0xb2, 0xf7, 0xb5, 0x7a, 0x8f, + 0x44, 0x5d, 0xab, 0x98, 0x5e, 0xef, 0xd5, 0xac, 0x7e, 0x26, 0x7a, 0x9b, 0x51, 0xe6, 0x13, 0x9c, + 0xa3, 0x9e, 0x08, 0xa6, 0x88, 0xcc, 0x83, 0xf9, 0x68, 0xbf, 0x9f, 0x02, 0x21, 0x81, 0xcf, 0x5e, + 0x07, 0x39, 0x05, 0x5d, 0xd4, 0xe2, 0x0b, 0x9f, 0x48, 0x0c, 0x82, 0xb9, 0x3a, 0xf4, 0xaf, 0x38, + 0xee, 0xa5, 0xa6, 0x6f, 0xfa, 0x50, 0xfb, 0x17, 0x89, 0x5c, 0x97, 0xc7, 0x44, 0x3f, 0xa9, 0x83, + 0x13, 0xa4, 0x42, 0x34, 0x23, 0xee, 0xbf, 0x49, 0x45, 0x6e, 0x18, 0x28, 0x04, 0x26, 0x9f, 0x71, + 0xf0, 0x53, 0xed, 0x67, 0x06, 0x06, 0x7d, 0x92, 0x06, 0x4c, 0x1a, 0xa8, 0x64, 0x58, 0x06, 0xe3, + 0xef, 0xc7, 0xd3, 0x3e, 0x22, 0x64, 0x56, 0x8b, 0xd1, 0x3c, 0x9a, 0xae, 0xe0, 0xdf, 0x1e, 0x0b, + 0xf2, 0xe5, 0x1d, 0xd3, 0xd7, 0xde, 0x2d, 0x03, 0x50, 0xea, 0x74, 0xd6, 0x88, 0x0f, 0x38, 0xeb, + 0x90, 0x76, 0x16, 0xcc, 0xb5, 0x77, 0xcc, 0xe8, 0xe6, 0x0c, 0xd2, 0x1f, 0x70, 0x69, 0xea, 0x93, + 0x22, 0x67, 0x72, 0x22, 0x55, 0xad, 0x0f, 0x26, 0x54, 0x06, 0xa5, 0x1d, 0x3a, 0x9a, 0xf3, 0xa1, + 0x30, 0x13, 0x8f, 0xd0, 0xa1, 0xcf, 0x17, 0x23, 0xf6, 0xe2, 0xe7, 0x70, 0x94, 0x74, 0x78, 0xc0, + 0x26, 0x4a, 0x48, 0x79, 0xd2, 0x5b, 0x2c, 0xa0, 0x47, 0x32, 0x5f, 0x13, 0x09, 0x5d, 0xab, 0xea, + 0x1d, 0x2b, 0x10, 0x2d, 0x0d, 0x98, 0xa5, 0xbd, 0x28, 0x97, 0x0e, 0xbe, 0x64, 0xc1, 0x3d, 0x1d, + 0xcc, 0xc3, 0x8e, 0xe5, 0xc3, 0xa0, 0x96, 0x54, 0x80, 0x49, 0x10, 0xf3, 0x1f, 0x68, 0xcf, 0x15, + 0x0e, 0xba, 0x86, 0x05, 0x7a, 0xb0, 0x46, 0x31, 0xed, 0x4f, 0x2c, 0x8c, 0x9a, 0x18, 0xcd, 0xec, + 0xc1, 0xfa, 0x61, 0x19, 0x5c, 0xdd, 0x72, 0xb6, 0xb7, 0xbb, 0x30, 0x10, 0x13, 0x24, 0xde, 0x99, + 0x9a, 0x39, 0x4e, 0xb8, 0xf0, 0x4e, 0x90, 0xf3, 0xa0, 0x15, 0x1e, 0x25, 0x43, 0x0f, 0xfc, 0x89, + 0xa9, 0xc4, 0x59, 0x14, 0x16, 0xd7, 0x40, 0x3e, 0x63, 0x50, 0x10, 0x0b, 0xf8, 0x2c, 0x4c, 0x36, + 0x7b, 0x20, 0xbe, 0x20, 0x81, 0x79, 0x72, 0x2f, 0x62, 0xa0, 0xa0, 0x0f, 0x8c, 0x11, 0x00, 0xed, + 0x9b, 0x39, 0x51, 0x3f, 0x5b, 0x2c, 0x13, 0x8e, 0x93, 0x18, 0x11, 0x8b, 0x05, 0x55, 0x19, 0x4a, + 0x6e, 0x02, 0x37, 0x75, 0xe6, 0xc1, 0xec, 0x0a, 0x0c, 0x5a, 0x9a, 0xa7, 0xbd, 0x3f, 0x65, 0x4f, + 0x74, 0x16, 0xcc, 0xe1, 0xcb, 0xc1, 0x1a, 0xf4, 0x98, 0x24, 0x59, 0x35, 0xe3, 0xd2, 0xd4, 0x9b, + 0xc0, 0xfc, 0x45, 0xb8, 0xe5, 0xb8, 0xb0, 0xc1, 0x9d, 0xa5, 0xe4, 0x13, 0x07, 0x87, 0xa7, 0x53, + 0x6f, 0x01, 0xc7, 0xa9, 0xa3, 0xfb, 0x12, 0x9a, 0xeb, 0x9b, 0xee, 0x3e, 0x3d, 0x98, 0xd6, 0x9f, + 0xac, 0xfd, 0x25, 0xdb, 0x60, 0x96, 0x78, 0x14, 0x6f, 0x3b, 0x28, 0x76, 0xa6, 0xd2, 0x31, 0xa3, + 0xd3, 0x93, 0xc1, 0x34, 0xd5, 0x91, 0xc0, 0xa0, 0x4b, 0xea, 0x41, 0xc3, 0xbc, 0xea, 0x93, 0xc1, + 0x0c, 0x12, 0x11, 0xb6, 0x1b, 0x68, 0xd7, 0x7b, 0x7a, 0xc0, 0x87, 0xf8, 0xbd, 0x11, 0x65, 0xd5, + 0x7e, 0x21, 0xd4, 0x19, 0x9d, 0xd3, 0x99, 0x27, 0xa4, 0x61, 0x7e, 0x22, 0x17, 0xc9, 0x2b, 0x4c, + 0xf9, 0x4b, 0xfb, 0xd5, 0x8e, 0xa7, 0xad, 0xa5, 0xd3, 0x9a, 0x33, 0x00, 0x84, 0xcd, 0x2f, 0x08, + 0x9c, 0xc1, 0xa4, 0xf0, 0xb1, 0xf1, 0x13, 0x8f, 0x02, 0xf6, 0x8b, 0x03, 0xb3, 0x33, 0x5e, 0x40, + 0x05, 0x8f, 0x10, 0x8a, 0x70, 0x92, 0x3d, 0x3a, 0x3f, 0x9f, 0x07, 0x57, 0x87, 0x27, 0x9c, 0x6a, + 0xa6, 0x17, 0xb5, 0xec, 0x0b, 0xe9, 0x20, 0xe2, 0x8e, 0x94, 0x84, 0xcd, 0xf1, 0x24, 0x28, 0x78, + 0x7b, 0x17, 0x43, 0x47, 0x40, 0xf2, 0xa0, 0xbd, 0x51, 0x4e, 0x35, 0x56, 0x0d, 0xe4, 0x6f, 0xcc, + 0x8d, 0xf0, 0x36, 0x70, 0xc2, 0xde, 0xdb, 0x0d, 0xb1, 0xc0, 0x3d, 0x0d, 0xed, 0x59, 0x0e, 0xbe, + 0xe0, 0x9b, 0x6c, 0x5e, 0xbc, 0xc9, 0xa6, 0x18, 0x49, 0x45, 0x2a, 0x9d, 0xbd, 0x7a, 0x7c, 0xa6, + 0xef, 0x08, 0x5a, 0x39, 0xb5, 0x52, 0x10, 0xf8, 0x25, 0x16, 0xfe, 0x7f, 0xca, 0xa5, 0xea, 0x79, + 0x87, 0x9f, 0x5c, 0x4b, 0xd1, 0x13, 0x1e, 0xe5, 0xb1, 0xb5, 0xcf, 0x4b, 0x40, 0x6b, 0x46, 0x0e, + 0x39, 0x14, 0xd4, 0x75, 0x17, 0x5e, 0xb6, 0xe0, 0x15, 0xce, 0x7d, 0xeb, 0x4d, 0xc2, 0x71, 0xa8, + 0x79, 0x5d, 0x39, 0x40, 0x34, 0x7e, 0x5d, 0x7c, 0x00, 0x2e, 0x62, 0xf1, 0xa6, 0xd3, 0x95, 0x38, + 0x81, 0xd8, 0xe1, 0x12, 0x38, 0xc3, 0xa0, 0xba, 0xec, 0x3a, 0xbb, 0x09, 0x92, 0x7d, 0x39, 0x2b, + 0xd9, 0x0d, 0x5e, 0xb2, 0xf7, 0x25, 0xaa, 0xcb, 0x00, 0xc2, 0x31, 0xea, 0xf8, 0xfe, 0x50, 0x8e, + 0xcf, 0xe4, 0xe4, 0x58, 0x39, 0x24, 0xfd, 0xec, 0x65, 0xf9, 0x07, 0x79, 0x30, 0x67, 0x40, 0xb3, + 0x13, 0x0e, 0x02, 0xff, 0x37, 0x63, 0xde, 0x3d, 0x15, 0xe4, 0xfd, 0x68, 0x9d, 0xe6, 0xb1, 0x07, + 0x2b, 0xc3, 0x7e, 0x89, 0x1f, 0xf0, 0x72, 0x0d, 0xfe, 0xe8, 0x40, 0x6f, 0x21, 0x09, 0xd8, 0x86, + 0xb2, 0x88, 0x6d, 0x98, 0x1f, 0x64, 0x1b, 0xde, 0x02, 0x8e, 0x77, 0x4d, 0xcf, 0xaf, 0x5c, 0x6c, + 0x59, 0xbb, 0xd0, 0xf3, 0xcd, 0xdd, 0x1e, 0xb6, 0x02, 0x65, 0xa3, 0x3f, 0x99, 0xbf, 0x07, 0x3e, + 0xf1, 0x3c, 0xd8, 0xa0, 0x2a, 0x1e, 0x3e, 0x66, 0xee, 0x87, 0x84, 0x0e, 0x7f, 0x0d, 0x2b, 0x3b, + 0x9d, 0x66, 0xdc, 0x3f, 0xc2, 0xda, 0xd2, 0x29, 0xa0, 0xae, 0xe9, 0xcd, 0x66, 0x69, 0x05, 0x9f, + 0x09, 0x09, 0x9c, 0x84, 0x3a, 0x67, 0x1f, 0x83, 0xc4, 0x47, 0x90, 0x56, 0xe7, 0xa2, 0xb1, 0x57, + 0x39, 0xa6, 0xce, 0x82, 0x29, 0x17, 0xf6, 0xba, 0x16, 0xf4, 0x94, 0x9c, 0xf6, 0x0d, 0x09, 0x14, + 0x37, 0x6c, 0x17, 0x9a, 0x1d, 0xed, 0x19, 0xf1, 0x43, 0xc8, 0x88, 0x4a, 0xc1, 0xc7, 0xbd, 0x4a, + 0x5c, 0x95, 0xa5, 0x8d, 0x0e, 0x31, 0x32, 0x16, 0xf8, 0xc4, 0x96, 0x63, 0xe3, 0x4b, 0xcd, 0xbc, + 0x49, 0x9f, 0x9d, 0x02, 0x05, 0x7d, 0xb7, 0xe7, 0xef, 0x9f, 0x7d, 0x0c, 0x98, 0x6f, 0xfa, 0x2e, + 0x34, 0x77, 0x99, 0x4d, 0x75, 0xdf, 0xb9, 0x04, 0xed, 0x60, 0x53, 0x1d, 0x3f, 0xdc, 0x7d, 0x17, + 0x98, 0xb2, 0x9d, 0x4d, 0x73, 0xcf, 0xdf, 0x51, 0xaf, 0x3f, 0x10, 0x8d, 0x86, 0xaa, 0x5f, 0x83, + 0x86, 0xff, 0xfb, 0xd3, 0x7b, 0xf0, 0xd4, 0xaa, 0x68, 0x3b, 0xa5, 0x3d, 0x7f, 0x67, 0xe9, 0xba, + 0x4f, 0xff, 0xd9, 0x99, 0xdc, 0xe7, 0xfe, 0xec, 0x4c, 0xee, 0x2b, 0x7f, 0x76, 0x26, 0xf7, 0xe3, + 0x7f, 0x7e, 0xe6, 0xd8, 0xe7, 0xfe, 0xfc, 0xcc, 0xb1, 0x2f, 0xfc, 0xf9, 0x99, 0x63, 0xdf, 0x23, + 0xf5, 0x2e, 0x5e, 0x2c, 0x62, 0x2a, 0x4f, 0xfc, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0xb3, 0x2f, + 0x5e, 0xe5, 0x7d, 0x2d, 0x02, 0x00, } func (m *Rpc) Marshal() (dAtA []byte, err error) { @@ -76519,6 +78635,11 @@ func (m *RpcSpaceInviteGenerateRequest) MarshalToSizedBuffer(dAtA []byte) (int, _ = i var l int _ = l + if m.InviteType != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.InviteType)) + i-- + dAtA[i] = 0x10 + } if len(m.SpaceId) > 0 { i -= len(m.SpaceId) copy(dAtA[i:], m.SpaceId) @@ -76873,6 +78994,143 @@ func (m *RpcSpaceInviteGetCurrentResponseError) MarshalToSizedBuffer(dAtA []byte return len(dAtA) - i, nil } +func (m *RpcSpaceInviteGetGuest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcSpaceInviteGetGuest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcSpaceInviteGetGuest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *RpcSpaceInviteGetGuestRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcSpaceInviteGetGuestRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcSpaceInviteGetGuestRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.SpaceId) > 0 { + i -= len(m.SpaceId) + copy(dAtA[i:], m.SpaceId) + i = encodeVarintCommands(dAtA, i, uint64(len(m.SpaceId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RpcSpaceInviteGetGuestResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcSpaceInviteGetGuestResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcSpaceInviteGetGuestResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.InviteFileKey) > 0 { + i -= len(m.InviteFileKey) + copy(dAtA[i:], m.InviteFileKey) + i = encodeVarintCommands(dAtA, i, uint64(len(m.InviteFileKey))) + i-- + dAtA[i] = 0x1a + } + if len(m.InviteCid) > 0 { + i -= len(m.InviteCid) + copy(dAtA[i:], m.InviteCid) + i = encodeVarintCommands(dAtA, i, uint64(len(m.InviteCid))) + i-- + dAtA[i] = 0x12 + } + if m.Error != nil { + { + size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RpcSpaceInviteGetGuestResponseError) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcSpaceInviteGetGuestResponseError) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcSpaceInviteGetGuestResponseError) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if m.Code != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Code)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *RpcSpaceInviteRevoke) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -77076,6 +79334,16 @@ func (m *RpcSpaceInviteViewResponse) MarshalToSizedBuffer(dAtA []byte) (int, err _ = i var l int _ = l + if m.IsGuestUserInvite { + i-- + if m.IsGuestUserInvite { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x30 + } if len(m.CreatorName) > 0 { i -= len(m.CreatorName) copy(dAtA[i:], m.CreatorName) @@ -79219,6 +81487,13 @@ func (m *RpcAccountCreateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) _ = i var l int _ = l + if len(m.JoinStreamUrl) > 0 { + i -= len(m.JoinStreamUrl) + copy(dAtA[i:], m.JoinStreamUrl) + i = encodeVarintCommands(dAtA, i, uint64(len(m.JoinStreamUrl))) + i-- + dAtA[i] = 0x52 + } if len(m.JsonApiListenAddr) > 0 { i -= len(m.JsonApiListenAddr) copy(dAtA[i:], m.JsonApiListenAddr) @@ -79891,6 +82166,11 @@ func (m *RpcAccountMigrateResponseError) MarshalToSizedBuffer(dAtA []byte) (int, _ = i var l int _ = l + if m.RequiredSpace != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.RequiredSpace)) + i-- + dAtA[i] = 0x18 + } if len(m.Description) > 0 { i -= len(m.Description) copy(dAtA[i:], m.Description) @@ -80072,6 +82352,13 @@ func (m *RpcAccountSelectRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) _ = i var l int _ = l + if len(m.JoinStreamURL) > 0 { + i -= len(m.JoinStreamURL) + copy(dAtA[i:], m.JoinStreamURL) + i = encodeVarintCommands(dAtA, i, uint64(len(m.JoinStreamURL))) + i-- + dAtA[i] = 0x4a + } if len(m.FulltextPrimaryLanguage) > 0 { i -= len(m.FulltextPrimaryLanguage) copy(dAtA[i:], m.FulltextPrimaryLanguage) @@ -99010,6 +101297,725 @@ func (m *RpcUnsplashDownloadResponseError) MarshalToSizedBuffer(dAtA []byte) (in return len(dAtA) - i, nil } +func (m *RpcAI) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcAI) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAI) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *RpcAIWritingTools) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcAIWritingTools) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAIWritingTools) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *RpcAIWritingToolsRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcAIWritingToolsRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAIWritingToolsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Text) > 0 { + i -= len(m.Text) + copy(dAtA[i:], m.Text) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Text))) + i-- + dAtA[i] = 0x22 + } + if m.Language != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Language)) + i-- + dAtA[i] = 0x18 + } + if m.Mode != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Mode)) + i-- + dAtA[i] = 0x10 + } + if m.Config != nil { + { + size, err := m.Config.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RpcAIWritingToolsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcAIWritingToolsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAIWritingToolsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Text) > 0 { + i -= len(m.Text) + copy(dAtA[i:], m.Text) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Text))) + i-- + dAtA[i] = 0x12 + } + if m.Error != nil { + { + size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RpcAIWritingToolsResponseError) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcAIWritingToolsResponseError) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAIWritingToolsResponseError) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if m.Code != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Code)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *RpcAIAutofill) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcAIAutofill) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAIAutofill) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *RpcAIAutofillRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcAIAutofillRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAIAutofillRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Context) > 0 { + for iNdEx := len(m.Context) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Context[iNdEx]) + copy(dAtA[i:], m.Context[iNdEx]) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Context[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } + if len(m.Options) > 0 { + for iNdEx := len(m.Options) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Options[iNdEx]) + copy(dAtA[i:], m.Options[iNdEx]) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Options[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } + if m.Mode != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Mode)) + i-- + dAtA[i] = 0x10 + } + if m.Config != nil { + { + size, err := m.Config.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RpcAIAutofillResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcAIAutofillResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAIAutofillResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Text) > 0 { + i -= len(m.Text) + copy(dAtA[i:], m.Text) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Text))) + i-- + dAtA[i] = 0x12 + } + if m.Error != nil { + { + size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RpcAIAutofillResponseError) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcAIAutofillResponseError) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAIAutofillResponseError) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if m.Code != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Code)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *RpcAIListSummary) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcAIListSummary) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAIListSummary) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *RpcAIListSummaryRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcAIListSummaryRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAIListSummaryRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Prompt) > 0 { + i -= len(m.Prompt) + copy(dAtA[i:], m.Prompt) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Prompt))) + i-- + dAtA[i] = 0x22 + } + if len(m.ObjectIds) > 0 { + for iNdEx := len(m.ObjectIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ObjectIds[iNdEx]) + copy(dAtA[i:], m.ObjectIds[iNdEx]) + i = encodeVarintCommands(dAtA, i, uint64(len(m.ObjectIds[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } + if len(m.SpaceId) > 0 { + i -= len(m.SpaceId) + copy(dAtA[i:], m.SpaceId) + i = encodeVarintCommands(dAtA, i, uint64(len(m.SpaceId))) + i-- + dAtA[i] = 0x12 + } + if m.Config != nil { + { + size, err := m.Config.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RpcAIListSummaryResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcAIListSummaryResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAIListSummaryResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ObjectId) > 0 { + i -= len(m.ObjectId) + copy(dAtA[i:], m.ObjectId) + i = encodeVarintCommands(dAtA, i, uint64(len(m.ObjectId))) + i-- + dAtA[i] = 0x12 + } + if m.Error != nil { + { + size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RpcAIListSummaryResponseError) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcAIListSummaryResponseError) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAIListSummaryResponseError) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if m.Code != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Code)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *RpcAIObjectCreateFromUrl) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcAIObjectCreateFromUrl) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAIObjectCreateFromUrl) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *RpcAIObjectCreateFromUrlRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcAIObjectCreateFromUrlRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAIObjectCreateFromUrlRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Details != nil { + { + size, err := m.Details.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + if len(m.Url) > 0 { + i -= len(m.Url) + copy(dAtA[i:], m.Url) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Url))) + i-- + dAtA[i] = 0x1a + } + if len(m.SpaceId) > 0 { + i -= len(m.SpaceId) + copy(dAtA[i:], m.SpaceId) + i = encodeVarintCommands(dAtA, i, uint64(len(m.SpaceId))) + i-- + dAtA[i] = 0x12 + } + if m.Config != nil { + { + size, err := m.Config.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RpcAIObjectCreateFromUrlResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcAIObjectCreateFromUrlResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAIObjectCreateFromUrlResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Details != nil { + { + size, err := m.Details.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if len(m.ObjectId) > 0 { + i -= len(m.ObjectId) + copy(dAtA[i:], m.ObjectId) + i = encodeVarintCommands(dAtA, i, uint64(len(m.ObjectId))) + i-- + dAtA[i] = 0x12 + } + if m.Error != nil { + { + size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RpcAIObjectCreateFromUrlResponseError) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcAIObjectCreateFromUrlResponseError) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAIObjectCreateFromUrlResponseError) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if m.Code != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Code)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *RpcAIProviderConfig) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcAIProviderConfig) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAIProviderConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Temperature != 0 { + i -= 4 + encoding_binary.LittleEndian.PutUint32(dAtA[i:], uint32(math.Float32bits(float32(m.Temperature)))) + i-- + dAtA[i] = 0x2d + } + if len(m.Token) > 0 { + i -= len(m.Token) + copy(dAtA[i:], m.Token) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Token))) + i-- + dAtA[i] = 0x22 + } + if len(m.Model) > 0 { + i -= len(m.Model) + copy(dAtA[i:], m.Model) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Model))) + i-- + dAtA[i] = 0x1a + } + if len(m.Endpoint) > 0 { + i -= len(m.Endpoint) + copy(dAtA[i:], m.Endpoint) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Endpoint))) + i-- + dAtA[i] = 0x12 + } + if m.Provider != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Provider)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *RpcGallery) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -111169,6 +114175,157 @@ func (m *RpcBlockDataviewRelation) MarshalToSizedBuffer(dAtA []byte) (int, error return len(dAtA) - i, nil } +func (m *RpcBlockDataviewRelationSet) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcBlockDataviewRelationSet) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcBlockDataviewRelationSet) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *RpcBlockDataviewRelationSetRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcBlockDataviewRelationSetRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcBlockDataviewRelationSetRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.RelationKeys) > 0 { + for iNdEx := len(m.RelationKeys) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.RelationKeys[iNdEx]) + copy(dAtA[i:], m.RelationKeys[iNdEx]) + i = encodeVarintCommands(dAtA, i, uint64(len(m.RelationKeys[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } + if len(m.BlockId) > 0 { + i -= len(m.BlockId) + copy(dAtA[i:], m.BlockId) + i = encodeVarintCommands(dAtA, i, uint64(len(m.BlockId))) + i-- + dAtA[i] = 0x12 + } + if len(m.ContextId) > 0 { + i -= len(m.ContextId) + copy(dAtA[i:], m.ContextId) + i = encodeVarintCommands(dAtA, i, uint64(len(m.ContextId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RpcBlockDataviewRelationSetResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcBlockDataviewRelationSetResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcBlockDataviewRelationSetResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Event != nil { + { + size, err := m.Event.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.Error != nil { + { + size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RpcBlockDataviewRelationSetResponseError) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcBlockDataviewRelationSetResponseError) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcBlockDataviewRelationSetResponseError) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if m.Code != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Code)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *RpcBlockDataviewRelationAdd) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -122114,6 +125271,122 @@ func (m *RpcChatSubscribeToMessagePreviewsResponseError) MarshalToSizedBuffer(dA return len(dAtA) - i, nil } +func (m *RpcChatUnsubscribeFromMessagePreviews) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcChatUnsubscribeFromMessagePreviews) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcChatUnsubscribeFromMessagePreviews) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *RpcChatUnsubscribeFromMessagePreviewsRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcChatUnsubscribeFromMessagePreviewsRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcChatUnsubscribeFromMessagePreviewsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *RpcChatUnsubscribeFromMessagePreviewsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcChatUnsubscribeFromMessagePreviewsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcChatUnsubscribeFromMessagePreviewsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Error != nil { + { + size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RpcChatUnsubscribeFromMessagePreviewsResponseError) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RpcChatUnsubscribeFromMessagePreviewsResponseError) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcChatUnsubscribeFromMessagePreviewsResponseError) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if m.Code != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Code)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *RpcChatReadMessages) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -122785,6 +126058,9 @@ func (m *RpcSpaceInviteGenerateRequest) Size() (n int) { if l > 0 { n += 1 + l + sovCommands(uint64(l)) } + if m.InviteType != 0 { + n += 1 + sovCommands(uint64(m.InviteType)) + } return n } @@ -122935,6 +126211,65 @@ func (m *RpcSpaceInviteGetCurrentResponseError) Size() (n int) { return n } +func (m *RpcSpaceInviteGetGuest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *RpcSpaceInviteGetGuestRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.SpaceId) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcSpaceInviteGetGuestResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Error != nil { + l = m.Error.Size() + n += 1 + l + sovCommands(uint64(l)) + } + l = len(m.InviteCid) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + l = len(m.InviteFileKey) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcSpaceInviteGetGuestResponseError) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Code != 0 { + n += 1 + sovCommands(uint64(m.Code)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + func (m *RpcSpaceInviteRevoke) Size() (n int) { if m == nil { return 0 @@ -123038,6 +126373,9 @@ func (m *RpcSpaceInviteViewResponse) Size() (n int) { if l > 0 { n += 1 + l + sovCommands(uint64(l)) } + if m.IsGuestUserInvite { + n += 2 + } return n } @@ -123963,6 +127301,10 @@ func (m *RpcAccountCreateRequest) Size() (n int) { if l > 0 { n += 1 + l + sovCommands(uint64(l)) } + l = len(m.JoinStreamUrl) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } return n } @@ -124218,6 +127560,9 @@ func (m *RpcAccountMigrateResponseError) Size() (n int) { if l > 0 { n += 1 + l + sovCommands(uint64(l)) } + if m.RequiredSpace != 0 { + n += 1 + sovCommands(uint64(m.RequiredSpace)) + } return n } @@ -124316,6 +127661,10 @@ func (m *RpcAccountSelectRequest) Size() (n int) { if l > 0 { n += 1 + l + sovCommands(uint64(l)) } + l = len(m.JoinStreamURL) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } return n } @@ -132327,6 +135676,317 @@ func (m *RpcUnsplashDownloadResponseError) Size() (n int) { return n } +func (m *RpcAI) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *RpcAIWritingTools) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *RpcAIWritingToolsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Config != nil { + l = m.Config.Size() + n += 1 + l + sovCommands(uint64(l)) + } + if m.Mode != 0 { + n += 1 + sovCommands(uint64(m.Mode)) + } + if m.Language != 0 { + n += 1 + sovCommands(uint64(m.Language)) + } + l = len(m.Text) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcAIWritingToolsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Error != nil { + l = m.Error.Size() + n += 1 + l + sovCommands(uint64(l)) + } + l = len(m.Text) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcAIWritingToolsResponseError) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Code != 0 { + n += 1 + sovCommands(uint64(m.Code)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcAIAutofill) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *RpcAIAutofillRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Config != nil { + l = m.Config.Size() + n += 1 + l + sovCommands(uint64(l)) + } + if m.Mode != 0 { + n += 1 + sovCommands(uint64(m.Mode)) + } + if len(m.Options) > 0 { + for _, s := range m.Options { + l = len(s) + n += 1 + l + sovCommands(uint64(l)) + } + } + if len(m.Context) > 0 { + for _, s := range m.Context { + l = len(s) + n += 1 + l + sovCommands(uint64(l)) + } + } + return n +} + +func (m *RpcAIAutofillResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Error != nil { + l = m.Error.Size() + n += 1 + l + sovCommands(uint64(l)) + } + l = len(m.Text) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcAIAutofillResponseError) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Code != 0 { + n += 1 + sovCommands(uint64(m.Code)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcAIListSummary) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *RpcAIListSummaryRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Config != nil { + l = m.Config.Size() + n += 1 + l + sovCommands(uint64(l)) + } + l = len(m.SpaceId) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + if len(m.ObjectIds) > 0 { + for _, s := range m.ObjectIds { + l = len(s) + n += 1 + l + sovCommands(uint64(l)) + } + } + l = len(m.Prompt) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcAIListSummaryResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Error != nil { + l = m.Error.Size() + n += 1 + l + sovCommands(uint64(l)) + } + l = len(m.ObjectId) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcAIListSummaryResponseError) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Code != 0 { + n += 1 + sovCommands(uint64(m.Code)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcAIObjectCreateFromUrl) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *RpcAIObjectCreateFromUrlRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Config != nil { + l = m.Config.Size() + n += 1 + l + sovCommands(uint64(l)) + } + l = len(m.SpaceId) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + l = len(m.Url) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + if m.Details != nil { + l = m.Details.Size() + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcAIObjectCreateFromUrlResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Error != nil { + l = m.Error.Size() + n += 1 + l + sovCommands(uint64(l)) + } + l = len(m.ObjectId) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + if m.Details != nil { + l = m.Details.Size() + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcAIObjectCreateFromUrlResponseError) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Code != 0 { + n += 1 + sovCommands(uint64(m.Code)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcAIProviderConfig) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Provider != 0 { + n += 1 + sovCommands(uint64(m.Provider)) + } + l = len(m.Endpoint) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + l = len(m.Model) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + l = len(m.Token) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + if m.Temperature != 0 { + n += 5 + } + return n +} + func (m *RpcGallery) Size() (n int) { if m == nil { return 0 @@ -137528,6 +141188,71 @@ func (m *RpcBlockDataviewRelation) Size() (n int) { return n } +func (m *RpcBlockDataviewRelationSet) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *RpcBlockDataviewRelationSetRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ContextId) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + l = len(m.BlockId) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + if len(m.RelationKeys) > 0 { + for _, s := range m.RelationKeys { + l = len(s) + n += 1 + l + sovCommands(uint64(l)) + } + } + return n +} + +func (m *RpcBlockDataviewRelationSetResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Error != nil { + l = m.Error.Size() + n += 1 + l + sovCommands(uint64(l)) + } + if m.Event != nil { + l = m.Event.Size() + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcBlockDataviewRelationSetResponseError) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Code != 0 { + n += 1 + sovCommands(uint64(m.Code)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + func (m *RpcBlockDataviewRelationAdd) Size() (n int) { if m == nil { return 0 @@ -142137,6 +145862,53 @@ func (m *RpcChatSubscribeToMessagePreviewsResponseError) Size() (n int) { return n } +func (m *RpcChatUnsubscribeFromMessagePreviews) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *RpcChatUnsubscribeFromMessagePreviewsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *RpcChatUnsubscribeFromMessagePreviewsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Error != nil { + l = m.Error.Size() + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcChatUnsubscribeFromMessagePreviewsResponseError) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Code != 0 { + n += 1 + sovCommands(uint64(m.Code)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + func (m *RpcChatReadMessages) Size() (n int) { if m == nil { return 0 @@ -144168,6 +147940,25 @@ func (m *RpcSpaceInviteGenerateRequest) Unmarshal(dAtA []byte) error { } m.SpaceId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InviteType", wireType) + } + m.InviteType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.InviteType |= RpcSpaceInviteGenerateRequestInviteType(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) @@ -145142,6 +148933,389 @@ func (m *RpcSpaceInviteGetCurrentResponseError) Unmarshal(dAtA []byte) error { } return nil } +func (m *RpcSpaceInviteGetGuest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: InviteGetGuest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: InviteGetGuest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcSpaceInviteGetGuestRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Request: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SpaceId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SpaceId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcSpaceInviteGetGuestResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Response: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Error == nil { + m.Error = &RpcSpaceInviteGetGuestResponseError{} + } + if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InviteCid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InviteCid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InviteFileKey", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InviteFileKey = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcSpaceInviteGetGuestResponseError) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Error: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Error: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + m.Code = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Code |= RpcSpaceInviteGetGuestResponseErrorCode(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *RpcSpaceInviteRevoke) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -145818,6 +149992,26 @@ func (m *RpcSpaceInviteViewResponse) Unmarshal(dAtA []byte) error { } m.CreatorName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IsGuestUserInvite", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IsGuestUserInvite = bool(v != 0) default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) @@ -151637,6 +155831,38 @@ func (m *RpcAccountCreateRequest) Unmarshal(dAtA []byte) error { } m.JsonApiListenAddr = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field JoinStreamUrl", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.JoinStreamUrl = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) @@ -153212,6 +157438,25 @@ func (m *RpcAccountMigrateResponseError) Unmarshal(dAtA []byte) error { } m.Description = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RequiredSpace", wireType) + } + m.RequiredSpace = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.RequiredSpace |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) @@ -153850,6 +158095,38 @@ func (m *RpcAccountSelectRequest) Unmarshal(dAtA []byte) error { } m.FulltextPrimaryLanguage = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field JoinStreamURL", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.JoinStreamURL = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) @@ -204665,6 +208942,2037 @@ func (m *RpcUnsplashDownloadResponseError) Unmarshal(dAtA []byte) error { } return nil } +func (m *RpcAI) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AI: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AI: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAIWritingTools) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: WritingTools: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WritingTools: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAIWritingToolsRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Request: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Config", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Config == nil { + m.Config = &RpcAIProviderConfig{} + } + if err := m.Config.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Mode", wireType) + } + m.Mode = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Mode |= RpcAIWritingToolsRequestWritingMode(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Language", wireType) + } + m.Language = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Language |= RpcAIWritingToolsRequestLanguage(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Text", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Text = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAIWritingToolsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Response: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Error == nil { + m.Error = &RpcAIWritingToolsResponseError{} + } + if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Text", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Text = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAIWritingToolsResponseError) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Error: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Error: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + m.Code = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Code |= RpcAIWritingToolsResponseErrorCode(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAIAutofill) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Autofill: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Autofill: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAIAutofillRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Request: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Config", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Config == nil { + m.Config = &RpcAIProviderConfig{} + } + if err := m.Config.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Mode", wireType) + } + m.Mode = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Mode |= RpcAIAutofillRequestAutofillMode(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Options = append(m.Options, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Context", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Context = append(m.Context, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAIAutofillResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Response: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Error == nil { + m.Error = &RpcAIAutofillResponseError{} + } + if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Text", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Text = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAIAutofillResponseError) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Error: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Error: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + m.Code = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Code |= RpcAIAutofillResponseErrorCode(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAIListSummary) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ListSummary: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ListSummary: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAIListSummaryRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Request: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Config", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Config == nil { + m.Config = &RpcAIProviderConfig{} + } + if err := m.Config.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SpaceId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SpaceId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectIds", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ObjectIds = append(m.ObjectIds, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Prompt", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Prompt = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAIListSummaryResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Response: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Error == nil { + m.Error = &RpcAIListSummaryResponseError{} + } + if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ObjectId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAIListSummaryResponseError) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Error: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Error: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + m.Code = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Code |= RpcAIListSummaryResponseErrorCode(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAIObjectCreateFromUrl) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ObjectCreateFromUrl: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ObjectCreateFromUrl: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAIObjectCreateFromUrlRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Request: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Config", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Config == nil { + m.Config = &RpcAIProviderConfig{} + } + if err := m.Config.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SpaceId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SpaceId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Url", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Url = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Details", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Details == nil { + m.Details = &types.Struct{} + } + if err := m.Details.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAIObjectCreateFromUrlResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Response: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Error == nil { + m.Error = &RpcAIObjectCreateFromUrlResponseError{} + } + if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ObjectId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Details", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Details == nil { + m.Details = &types.Struct{} + } + if err := m.Details.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAIObjectCreateFromUrlResponseError) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Error: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Error: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + m.Code = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Code |= RpcAIObjectCreateFromUrlResponseErrorCode(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAIProviderConfig) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ProviderConfig: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ProviderConfig: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Provider", wireType) + } + m.Provider = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Provider |= RpcAIProvider(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Endpoint", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Endpoint = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Model", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Model = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Token", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Token = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 5 { + return fmt.Errorf("proto: wrong wireType = %d for field Temperature", wireType) + } + var v uint32 + if (iNdEx + 4) > l { + return io.ErrUnexpectedEOF + } + v = uint32(encoding_binary.LittleEndian.Uint32(dAtA[iNdEx:])) + iNdEx += 4 + m.Temperature = float32(math.Float32frombits(v)) + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *RpcGallery) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -238268,6 +244576,425 @@ func (m *RpcBlockDataviewRelation) Unmarshal(dAtA []byte) error { } return nil } +func (m *RpcBlockDataviewRelationSet) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Set: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Set: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcBlockDataviewRelationSetRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Request: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContextId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ContextId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BlockId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BlockId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RelationKeys", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RelationKeys = append(m.RelationKeys, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcBlockDataviewRelationSetResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Response: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Error == nil { + m.Error = &RpcBlockDataviewRelationSetResponseError{} + } + if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Event", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Event == nil { + m.Event = &ResponseEvent{} + } + if err := m.Event.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcBlockDataviewRelationSetResponseError) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Error: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Error: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + m.Code = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Code |= RpcBlockDataviewRelationSetResponseErrorCode(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *RpcBlockDataviewRelationAdd) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -267811,6 +274538,293 @@ func (m *RpcChatSubscribeToMessagePreviewsResponseError) Unmarshal(dAtA []byte) } return nil } +func (m *RpcChatUnsubscribeFromMessagePreviews) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UnsubscribeFromMessagePreviews: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UnsubscribeFromMessagePreviews: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcChatUnsubscribeFromMessagePreviewsRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Request: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcChatUnsubscribeFromMessagePreviewsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Response: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Error == nil { + m.Error = &RpcChatUnsubscribeFromMessagePreviewsResponseError{} + } + if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcChatUnsubscribeFromMessagePreviewsResponseError) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Error: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Error: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + m.Code = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Code |= RpcChatUnsubscribeFromMessagePreviewsResponseErrorCode(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *RpcChatReadMessages) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 From a7c4acb9350ccada9f47f9b468009d0d7392ce03 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Mar 2025 12:19:05 +0100 Subject: [PATCH 105/132] Bump golang.org/x/net from 0.37.0 to 0.38.0 (#2273) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 +++- go.sum | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 0b74d6d00..1c5cc2ed2 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,8 @@ module github.com/anyproto/anytype-heart go 1.23.2 +toolchain go1.24.1 + require ( github.com/JohannesKaufmann/html-to-markdown v1.4.0 github.com/PuerkitoBio/goquery v1.10.2 @@ -108,7 +110,7 @@ require ( golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 golang.org/x/image v0.25.0 golang.org/x/mobile v0.0.0-20250218173827-cd096645fcd3 - golang.org/x/net v0.37.0 + golang.org/x/net v0.38.0 golang.org/x/oauth2 v0.28.0 golang.org/x/sys v0.31.0 golang.org/x/text v0.23.0 diff --git a/go.sum b/go.sum index d17f90317..cc79e314e 100644 --- a/go.sum +++ b/go.sum @@ -1303,8 +1303,8 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= -golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c= -golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= From 40e775cf77668844afdc026867d499dd41fea8c6 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Fri, 28 Mar 2025 15:02:32 +0100 Subject: [PATCH 106/132] GO-5320: remove fileKeys Signed-off-by: AnastasiaShemyakinskaya --- core/block/import/common/collection.go | 12 +----------- core/block/import/pb/gallery.go | 17 ++--------------- 2 files changed, 3 insertions(+), 26 deletions(-) diff --git a/core/block/import/common/collection.go b/core/block/import/common/collection.go index badf05f5b..c4bd53a49 100644 --- a/core/block/import/common/collection.go +++ b/core/block/import/common/collection.go @@ -13,7 +13,6 @@ import ( "github.com/anyproto/anytype-heart/core/block/simple" simpleDataview "github.com/anyproto/anytype-heart/core/block/simple/dataview" "github.com/anyproto/anytype-heart/core/domain" - "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" sb "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" @@ -25,7 +24,6 @@ type ImportCollectionSetting struct { collectionName string targetObjects []string icon string - fileKeys []*pb.ChangeFileKeys needToAddDate, shouldBeFavorite, shouldAddRelations bool widgetSnapshot *Snapshot } @@ -58,12 +56,6 @@ func WithIcon(icon string) ImportCollectionOption { } } -func WithFileKeys(keys []*pb.ChangeFileKeys) ImportCollectionOption { - return func(s *ImportCollectionSetting) { - s.fileKeys = keys - } -} - func WithAddDate() ImportCollectionOption { return func(s *ImportCollectionSetting) { s.needToAddDate = true @@ -119,7 +111,7 @@ func (r *ImportCollection) MakeImportCollection(req *ImportCollectionSetting) (* detailsStruct = st.CombinedDetails().Merge(detailsStruct) st.UpdateStoreSlice(template.CollectionStoreKey, req.targetObjects) - rootCollectionSnapshot := r.getRootCollectionSnapshot(req.collectionName, st, detailsStruct, req.fileKeys) + rootCollectionSnapshot := r.getRootCollectionSnapshot(req.collectionName, st, detailsStruct) widgetSnapshot := r.makeWidgetSnapshot(req, rootCollectionSnapshot) return rootCollectionSnapshot, widgetSnapshot, nil } @@ -206,7 +198,6 @@ func (r *ImportCollection) getRootCollectionSnapshot( collectionName string, st *state.State, detailsStruct *domain.Details, - fileKeys []*pb.ChangeFileKeys, ) *Snapshot { if detailsStruct == nil { detailsStruct = domain.NewDetails() @@ -224,7 +215,6 @@ func (r *ImportCollection) getRootCollectionSnapshot( RelationLinks: st.GetRelationLinks(), Collections: st.Store(), }, - FileKeys: fileKeys, }, } } diff --git a/core/block/import/pb/gallery.go b/core/block/import/pb/gallery.go index 8faf42561..17f4a5e72 100644 --- a/core/block/import/pb/gallery.go +++ b/core/block/import/pb/gallery.go @@ -1,8 +1,6 @@ package pb import ( - "github.com/samber/lo" - "github.com/anyproto/anytype-heart/core/block/collection" "github.com/anyproto/anytype-heart/core/block/editor/state" widgets "github.com/anyproto/anytype-heart/core/block/editor/widget" @@ -40,12 +38,10 @@ func (g *GalleryImport) ProvideCollection(snapshots []*common.Snapshot, } var ( icon string - fileKeys []*pb.ChangeFileKeys widgetSnapshot *common.Snapshot ) if workspaceSnapshot != nil { // we use space icon for import collection icon = workspaceSnapshot.Snapshot.Data.Details.GetString(bundle.RelationKeyIconImage) - fileKeys = lo.Filter(workspaceSnapshot.Snapshot.FileKeys, func(item *pb.ChangeFileKeys, index int) bool { return item.Hash == icon }) } collectionName := params.GetCollectionTitle() // collection name should be the name of experience if collectionName == "" { @@ -53,7 +49,7 @@ func (g *GalleryImport) ProvideCollection(snapshots []*common.Snapshot, } rootCollection := common.NewImportCollection(g.service) if len(widgetObjects) > 0 { - resultSnapshots, widgetSnapshot, err = g.getWidgetsCollection(collectionName, rootCollection, widgetObjects, icon, fileKeys, resultSnapshots) + resultSnapshots, widgetSnapshot, err = g.getWidgetsCollection(collectionName, rootCollection, widgetObjects, icon, resultSnapshots) if err != nil { return nil, err } @@ -64,7 +60,6 @@ func (g *GalleryImport) ProvideCollection(snapshots []*common.Snapshot, common.WithTargetObjects(objectsIDs), common.WithIcon(icon), common.WithRelations(), - common.WithFileKeys(fileKeys), common.WithWidgetSnapshot(widgetSnapshot), ) objectsCollection, widgetSnapshot, err := rootCollection.MakeImportCollection(settings) @@ -75,21 +70,13 @@ func (g *GalleryImport) ProvideCollection(snapshots []*common.Snapshot, return resultSnapshots, nil } -func (g *GalleryImport) getWidgetsCollection( - collectionName string, - rootCollection *common.ImportCollection, - widgetObjects []string, - icon string, - fileKeys []*pb.ChangeFileKeys, - collectionsSnapshots []*common.Snapshot, -) ([]*common.Snapshot, *common.Snapshot, error) { +func (g *GalleryImport) getWidgetsCollection(collectionName string, rootCollection *common.ImportCollection, widgetObjects []string, icon string, collectionsSnapshots []*common.Snapshot) ([]*common.Snapshot, *common.Snapshot, error) { widgetCollectionName := collectionName + widgetCollectionPattern settings := common.NewImportCollectionSetting( common.WithCollectionName(widgetCollectionName), common.WithTargetObjects(widgetObjects), common.WithIcon(icon), common.WithRelations(), - common.WithFileKeys(fileKeys), ) widgetsCollectionSnapshot, widget, err := rootCollection.MakeImportCollection(settings) if err != nil { From 9c05f3febd6fb7173f55e3216920f093f09cc732 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 28 Mar 2025 17:15:19 +0100 Subject: [PATCH 107/132] GO-4459: Update API version and license in swagger --- core/api/docs/docs.go | 4 ++-- core/api/docs/swagger.json | 2 +- core/api/docs/swagger.yaml | 4 ++-- core/api/service.go | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 9df39a837..8b13e380e 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -7,7 +7,7 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"markdown":{"example":"# This is the title\n...","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, - "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, + "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-api/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects associated with a specific list (query or collection) within a space. When a view ID is provided, the objects are filtered and sorted according to the view's configuration. If no view ID is specified, all list objects are returned without filtering and sorting. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. The member_id path parameter can be provided as either the member's ID (starting with ` + "`" + `_participant` + "`" + `) or the member's identity. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/{format}":{"get":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” only). The endpoint calls the export service which converts the object’s content into the requested format. It is useful for sharing, or displaying the markdown representation of the objecte externally.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, "openapi": "3.1.0", @@ -18,7 +18,7 @@ const docTemplate = `{ // SwaggerInfo holds exported Swagger Info so clients can modify it var SwaggerInfo = &swag.Spec{ - Version: "1.0", + Version: "2025-03-17", Title: "Anytype API", Description: "This API allows interaction with Anytype resources such as spaces, objects and types.", InfoInstanceName: "swagger", diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 1e920c083..e25d58240 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,6 +1,6 @@ { "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"markdown":{"example":"# This is the title\n...","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, - "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"1.0"}, + "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-api/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"2025-03-17"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects associated with a specific list (query or collection) within a space. When a view ID is provided, the objects are filtered and sorted according to the view's configuration. If no view ID is specified, all list objects are returned without filtering and sorting. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. The member_id path parameter can be provided as either the member's ID (starting with `_participant`) or the member's identity. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/{format}":{"get":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” only). The endpoint calls the export service which converts the object’s content into the requested format. It is useful for sharing, or displaying the markdown representation of the objecte externally.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, "openapi": "3.1.0", diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 49af7b2fa..cf5d69d2d 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -819,10 +819,10 @@ info: objects and types. license: name: Any Source Available License 1.0 - url: https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md + url: https://github.com/anyproto/anytype-api/blob/main/LICENSE.md termsOfService: https://anytype.io/terms_of_use title: Anytype API - version: "1.0" + version: "2025-03-17" openapi: 3.1.0 paths: /auth/display_code: diff --git a/core/api/service.go b/core/api/service.go index 893580cb8..1a5fbe090 100644 --- a/core/api/service.go +++ b/core/api/service.go @@ -52,14 +52,14 @@ func (s *apiService) Name() (name string) { // Init initializes the API service. // // @title Anytype API -// @version 1.0 +// @version 2025-03-17 // @description This API allows interaction with Anytype resources such as spaces, objects and types. // @termsOfService https://anytype.io/terms_of_use // @contact.name Anytype Support // @contact.url https://anytype.io/contact // @contact.email support@anytype.io // @license.name Any Source Available License 1.0 -// @license.url https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md +// @license.url https://github.com/anyproto/anytype-api/blob/main/LICENSE.md // @host http://localhost:31009 // @BasePath /v1 // @securitydefinitions.bearerauth BearerAuth From 0e8cd67a202d4a4c3a6861829e3b1a4e63e427c5 Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Fri, 28 Mar 2025 17:36:22 +0100 Subject: [PATCH 108/132] GO-5303 Event added: spaceAutoWidgetAdded --- core/block/detailservice/set_details.go | 2 +- core/block/editor/archive.go | 2 +- core/block/editor/smartblock/detailsinject.go | 5 + core/block/editor/widget/widget.go | 34 +- core/block/widget.go | 14 +- docs/proto.md | 39 +- pb/events.pb.go | 1173 ++++++++----- pb/protos/events.proto | 7 + pkg/lib/pb/model/models.pb.go | 1561 +++++++---------- pkg/lib/pb/model/protos/models.proto | 8 +- util/builtinobjects/builtinobjects.go | 2 +- 11 files changed, 1462 insertions(+), 1385 deletions(-) diff --git a/core/block/detailservice/set_details.go b/core/block/detailservice/set_details.go index 0b8f0b326..d1b38a66f 100644 --- a/core/block/detailservice/set_details.go +++ b/core/block/detailservice/set_details.go @@ -273,6 +273,6 @@ func (s *service) createFavoriteWidget(spc clientspace.Space) error { } return cache.DoState(s.objectGetter, widgetObjectId, func(st *state.State, w widget.Widget) (err error) { - return w.AddAutoWidget(st, widget.DefaultWidgetFavorite, widget.DefaultWidgetFavorite, "", model.BlockContentWidget_CompactList) + return w.AddAutoWidget(st, widget.DefaultWidgetFavorite, widget.DefaultWidgetFavorite, "", model.BlockContentWidget_CompactList, "Favorites") }) } diff --git a/core/block/editor/archive.go b/core/block/editor/archive.go index 42b65c018..2806d8b20 100644 --- a/core/block/editor/archive.go +++ b/core/block/editor/archive.go @@ -100,7 +100,7 @@ func (p *Archive) autoInstallBinWidget() error { st := sb.NewState() if w, ok := sb.(widget.Widget); ok { // We rely on AddAutoWidget to check if the widget was already installed/removed before - err = w.AddAutoWidget(st, widget.DefaultWidgetBin, widget.DefaultWidgetBin, "", model.BlockContentWidget_Link) + err = w.AddAutoWidget(st, widget.DefaultWidgetBin, widget.DefaultWidgetBin, "", model.BlockContentWidget_Link, "Bin") if err != nil { return err } diff --git a/core/block/editor/smartblock/detailsinject.go b/core/block/editor/smartblock/detailsinject.go index 7afc67721..cde641403 100644 --- a/core/block/editor/smartblock/detailsinject.go +++ b/core/block/editor/smartblock/detailsinject.go @@ -385,6 +385,11 @@ func (sb *smartBlock) changeResolvedLayoutForObjects(msgs []simple.EventMessage, return nil } +func (sb *smartBlock) getTypeDetails() (*domain.Details, error) { + typeId := sb.LocalDetails().GetString(bundle.RelationKeyType) + return sb.spaceIndex.GetDetails(typeId) +} + func getLayoutFromMessages(msgs []simple.EventMessage) (layout int64, found bool) { for _, ev := range msgs { if amend := ev.Msg.GetObjectDetailsAmend(); amend != nil { diff --git a/core/block/editor/widget/widget.go b/core/block/editor/widget/widget.go index c3e3b1451..252320577 100644 --- a/core/block/editor/widget/widget.go +++ b/core/block/editor/widget/widget.go @@ -8,6 +8,7 @@ import ( "github.com/anyproto/anytype-heart/core/block/editor/state" "github.com/anyproto/anytype-heart/core/block/simple" "github.com/anyproto/anytype-heart/core/domain" + "github.com/anyproto/anytype-heart/core/event" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" @@ -27,7 +28,8 @@ type Widget interface { CreateBlock(s *state.State, req *pb.RpcBlockCreateWidgetRequest) (string, error) // AddAutoWidget adds a widget block. If widget with the same targetId was installed/removed before, it will not be added again. // blockId is optional and used to protect from multi-device conflicts. - AddAutoWidget(s *state.State, targetId, blockId, viewId string, layout model.BlockContentWidgetLayout) error + // if eventName is empty no event is produced + AddAutoWidget(s *state.State, targetId, blockId, viewId string, layout model.BlockContentWidgetLayout, eventName string) error } type widget struct { @@ -71,7 +73,7 @@ func NewWidget(sb smartblock.SmartBlock) Widget { } } -func (w *widget) AddAutoWidget(st *state.State, targetId, widgetBlockId, viewId string, layout model.BlockContentWidgetLayout) error { +func (w *widget) AddAutoWidget(st *state.State, targetId, widgetBlockId, viewId string, layout model.BlockContentWidgetLayout, eventName string) error { targets := st.Details().Get(bundle.RelationKeyAutoWidgetTargets).StringList() if slices.Contains(targets, targetId) { return nil @@ -125,7 +127,7 @@ func (w *widget) AddAutoWidget(st *state.State, targetId, widgetBlockId, viewId position = model.Block_Bottom } - _, err = w.CreateBlock(st, &pb.RpcBlockCreateWidgetRequest{ + _, err = w.createBlock(st, &pb.RpcBlockCreateWidgetRequest{ ContextId: st.RootId(), ObjectLimit: 6, WidgetLayout: layout, @@ -138,11 +140,28 @@ func (w *widget) AddAutoWidget(st *state.State, targetId, widgetBlockId, viewId TargetBlockId: targetId, }}, }, + }, true) + if err != nil { + return err + } + + msg := event.NewMessage(w.SpaceID(), &pb.EventMessageValueOfSpaceAutoWidgetAdded{ + SpaceAutoWidgetAdded: &pb.EventSpaceAutoWidgetAdded{ + TargetId: targetId, + TargetName: eventName, + WidgetBlockId: widgetBlockId, + }, }) - return err + w.SendEvent([]*pb.EventMessage{msg}) + + return nil } func (w *widget) CreateBlock(s *state.State, req *pb.RpcBlockCreateWidgetRequest) (string, error) { + return w.createBlock(s, req, false) +} + +func (w *widget) createBlock(s *state.State, req *pb.RpcBlockCreateWidgetRequest, isAutoAdded bool) (string, error) { if req.Block.Content == nil { return "", fmt.Errorf("block has no content") } @@ -169,9 +188,10 @@ func (w *widget) CreateBlock(s *state.State, req *pb.RpcBlockCreateWidgetRequest }, Content: &model.BlockContentOfWidget{ Widget: &model.BlockContentWidget{ - Layout: req.WidgetLayout, - Limit: req.ObjectLimit, - ViewId: req.ViewId, + Layout: req.WidgetLayout, + Limit: req.ObjectLimit, + ViewId: req.ViewId, + AutoAdded: isAutoAdded, }, }, }) diff --git a/core/block/widget.go b/core/block/widget.go index 00bded508..3f3e70b14 100644 --- a/core/block/widget.go +++ b/core/block/widget.go @@ -5,8 +5,6 @@ import ( "fmt" "slices" - "github.com/google/uuid" - "github.com/anyproto/anytype-heart/core/block/cache" "github.com/anyproto/anytype-heart/core/block/editor/basic" "github.com/anyproto/anytype-heart/core/block/editor/smartblock" @@ -97,6 +95,7 @@ func (s *Service) CreateTypeWidgetIfMissing(ctx context.Context, spaceId string, return err } widgetObjectId := space.DerivedIDs().Widgets + spaceIndex := s.objectStore.SpaceIndex(space.Id()) widgetDetails, err := s.objectStore.SpaceIndex(space.Id()).GetDetails(widgetObjectId) if err == nil { keys := widgetDetails.Get(bundle.RelationKeyAutoWidgetTargets).StringList() @@ -130,8 +129,17 @@ func (s *Service) CreateTypeWidgetIfMissing(ctx context.Context, spaceId string, // only create widget if this was the first object of this type created return nil } + + var targetName string + typeDetails, err := spaceIndex.GetDetails(typeId) + if err == nil { + targetName = typeDetails.Get(bundle.RelationKeyPluralName).String() + if targetName == "" { + targetName = typeDetails.Get(bundle.RelationKeyName).String() + } + } return cache.DoState(s, widgetObjectId, func(st *state.State, w widget.Widget) (err error) { - return w.AddAutoWidget(st, typeId, key.String(), addr.ObjectTypeAllViewId, model.BlockContentWidget_View) + return w.AddAutoWidget(st, typeId, key.String(), addr.ObjectTypeAllViewId, model.BlockContentWidget_View, targetName) }) return err } diff --git a/docs/proto.md b/docs/proto.md index 73d9bdb1d..d985af57e 100644 --- a/docs/proto.md +++ b/docs/proto.md @@ -1850,6 +1850,7 @@ - [Event.Process.New](#anytype-Event-Process-New) - [Event.Process.Update](#anytype-Event-Process-Update) - [Event.Space](#anytype-Event-Space) + - [Event.Space.AutoWidgetAdded](#anytype-Event-Space-AutoWidgetAdded) - [Event.Space.SyncStatus](#anytype-Event-Space-SyncStatus) - [Event.Space.SyncStatus.Update](#anytype-Event-Space-SyncStatus-Update) - [Event.Status](#anytype-Event-Status) @@ -1966,7 +1967,6 @@ - [Metadata.Payload](#anytype-model-Metadata-Payload) - [Metadata.Payload.IdentityPayload](#anytype-model-Metadata-Payload-IdentityPayload) - [Notification](#anytype-model-Notification) - - [Notification.AutoTypeWidgetAdded](#anytype-model-Notification-AutoTypeWidgetAdded) - [Notification.Export](#anytype-model-Notification-Export) - [Notification.GalleryImport](#anytype-model-Notification-GalleryImport) - [Notification.Import](#anytype-model-Notification-Import) @@ -28761,6 +28761,7 @@ Precondition: user A opened a block | payloadBroadcast | [Event.Payload.Broadcast](#anytype-Event-Payload-Broadcast) | | | | membershipUpdate | [Event.Membership.Update](#anytype-Event-Membership-Update) | | | | spaceSyncStatusUpdate | [Event.Space.SyncStatus.Update](#anytype-Event-Space-SyncStatus-Update) | | | +| spaceAutoWidgetAdded | [Event.Space.AutoWidgetAdded](#anytype-Event-Space-AutoWidgetAdded) | | | | p2pStatusUpdate | [Event.P2PStatus.Update](#anytype-Event-P2PStatus-Update) | | | | importFinish | [Event.Import.Finish](#anytype-Event-Import-Finish) | | | | chatAdd | [Event.Chat.Add](#anytype-Event-Chat-Add) | | | @@ -29227,6 +29228,23 @@ Removes document from subscription + + +### Event.Space.AutoWidgetAdded + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| targetId | [string](#string) | | | +| targetName | [string](#string) | | pluralName (if exists) for types, fallback to name. Special cases for "bin" and "favorites" | +| widgetBlockId | [string](#string) | | | + + + + + + ### Event.Space.SyncStatus @@ -30591,6 +30609,7 @@ Link: block to link some content from an external sources. | layout | [Block.Content.Widget.Layout](#anytype-model-Block-Content-Widget-Layout) | | | | limit | [int32](#int32) | | | | viewId | [string](#string) | | | +| autoAdded | [bool](#bool) | | | @@ -31111,7 +31130,6 @@ Used to decode block meta only, without the content itself | participantRemove | [Notification.ParticipantRemove](#anytype-model-Notification-ParticipantRemove) | | | | participantRequestDecline | [Notification.ParticipantRequestDecline](#anytype-model-Notification-ParticipantRequestDecline) | | | | participantPermissionsChange | [Notification.ParticipantPermissionsChange](#anytype-model-Notification-ParticipantPermissionsChange) | | | -| autoTypeWidgetAdded | [Notification.AutoTypeWidgetAdded](#anytype-model-Notification-AutoTypeWidgetAdded) | | | | space | [string](#string) | | | | aclHeadId | [string](#string) | | | @@ -31120,23 +31138,6 @@ Used to decode block meta only, without the content itself - - -### Notification.AutoTypeWidgetAdded - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| spaceId | [string](#string) | | | -| typePluralName | [string](#string) | | fallback to singular if missing | -| widgetBlockId | [string](#string) | | | - - - - - - ### Notification.Export diff --git a/pb/events.pb.go b/pb/events.pb.go index ab2072f03..f5d99e673 100644 --- a/pb/events.pb.go +++ b/pb/events.pb.go @@ -397,6 +397,7 @@ type EventMessage struct { // *EventMessageValueOfPayloadBroadcast // *EventMessageValueOfMembershipUpdate // *EventMessageValueOfSpaceSyncStatusUpdate + // *EventMessageValueOfSpaceAutoWidgetAdded // *EventMessageValueOfP2PStatusUpdate // *EventMessageValueOfImportFinish // *EventMessageValueOfChatAdd @@ -654,6 +655,9 @@ type EventMessageValueOfMembershipUpdate struct { type EventMessageValueOfSpaceSyncStatusUpdate struct { SpaceSyncStatusUpdate *EventSpaceSyncStatusUpdate `protobuf:"bytes,119,opt,name=spaceSyncStatusUpdate,proto3,oneof" json:"spaceSyncStatusUpdate,omitempty"` } +type EventMessageValueOfSpaceAutoWidgetAdded struct { + SpaceAutoWidgetAdded *EventSpaceAutoWidgetAdded `protobuf:"bytes,122,opt,name=spaceAutoWidgetAdded,proto3,oneof" json:"spaceAutoWidgetAdded,omitempty"` +} type EventMessageValueOfP2PStatusUpdate struct { P2PStatusUpdate *EventP2PStatusUpdate `protobuf:"bytes,120,opt,name=p2pStatusUpdate,proto3,oneof" json:"p2pStatusUpdate,omitempty"` } @@ -748,6 +752,7 @@ func (*EventMessageValueOfNotificationUpdate) IsEventMessageValue() func (*EventMessageValueOfPayloadBroadcast) IsEventMessageValue() {} func (*EventMessageValueOfMembershipUpdate) IsEventMessageValue() {} func (*EventMessageValueOfSpaceSyncStatusUpdate) IsEventMessageValue() {} +func (*EventMessageValueOfSpaceAutoWidgetAdded) IsEventMessageValue() {} func (*EventMessageValueOfP2PStatusUpdate) IsEventMessageValue() {} func (*EventMessageValueOfImportFinish) IsEventMessageValue() {} func (*EventMessageValueOfChatAdd) IsEventMessageValue() {} @@ -1254,6 +1259,13 @@ func (m *EventMessage) GetSpaceSyncStatusUpdate() *EventSpaceSyncStatusUpdate { return nil } +func (m *EventMessage) GetSpaceAutoWidgetAdded() *EventSpaceAutoWidgetAdded { + if x, ok := m.GetValue().(*EventMessageValueOfSpaceAutoWidgetAdded); ok { + return x.SpaceAutoWidgetAdded + } + return nil +} + func (m *EventMessage) GetP2PStatusUpdate() *EventP2PStatusUpdate { if x, ok := m.GetValue().(*EventMessageValueOfP2PStatusUpdate); ok { return x.P2PStatusUpdate @@ -1382,6 +1394,7 @@ func (*EventMessage) XXX_OneofWrappers() []interface{} { (*EventMessageValueOfPayloadBroadcast)(nil), (*EventMessageValueOfMembershipUpdate)(nil), (*EventMessageValueOfSpaceSyncStatusUpdate)(nil), + (*EventMessageValueOfSpaceAutoWidgetAdded)(nil), (*EventMessageValueOfP2PStatusUpdate)(nil), (*EventMessageValueOfImportFinish)(nil), (*EventMessageValueOfChatAdd)(nil), @@ -11613,6 +11626,66 @@ func (m *EventSpaceSyncStatusUpdate) GetSyncingObjectsCounter() int64 { return 0 } +type EventSpaceAutoWidgetAdded struct { + TargetId string `protobuf:"bytes,1,opt,name=targetId,proto3" json:"targetId,omitempty"` + TargetName string `protobuf:"bytes,2,opt,name=targetName,proto3" json:"targetName,omitempty"` + WidgetBlockId string `protobuf:"bytes,3,opt,name=widgetBlockId,proto3" json:"widgetBlockId,omitempty"` +} + +func (m *EventSpaceAutoWidgetAdded) Reset() { *m = EventSpaceAutoWidgetAdded{} } +func (m *EventSpaceAutoWidgetAdded) String() string { return proto.CompactTextString(m) } +func (*EventSpaceAutoWidgetAdded) ProtoMessage() {} +func (*EventSpaceAutoWidgetAdded) Descriptor() ([]byte, []int) { + return fileDescriptor_a966342d378ae5f5, []int{0, 13, 1} +} +func (m *EventSpaceAutoWidgetAdded) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EventSpaceAutoWidgetAdded) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EventSpaceAutoWidgetAdded.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *EventSpaceAutoWidgetAdded) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventSpaceAutoWidgetAdded.Merge(m, src) +} +func (m *EventSpaceAutoWidgetAdded) XXX_Size() int { + return m.Size() +} +func (m *EventSpaceAutoWidgetAdded) XXX_DiscardUnknown() { + xxx_messageInfo_EventSpaceAutoWidgetAdded.DiscardUnknown(m) +} + +var xxx_messageInfo_EventSpaceAutoWidgetAdded proto.InternalMessageInfo + +func (m *EventSpaceAutoWidgetAdded) GetTargetId() string { + if m != nil { + return m.TargetId + } + return "" +} + +func (m *EventSpaceAutoWidgetAdded) GetTargetName() string { + if m != nil { + return m.TargetName + } + return "" +} + +func (m *EventSpaceAutoWidgetAdded) GetWidgetBlockId() string { + if m != nil { + return m.WidgetBlockId + } + return "" +} + type EventP2PStatus struct { } @@ -12512,6 +12585,7 @@ func init() { proto.RegisterType((*EventSpace)(nil), "anytype.Event.Space") proto.RegisterType((*EventSpaceSyncStatus)(nil), "anytype.Event.Space.SyncStatus") proto.RegisterType((*EventSpaceSyncStatusUpdate)(nil), "anytype.Event.Space.SyncStatus.Update") + proto.RegisterType((*EventSpaceAutoWidgetAdded)(nil), "anytype.Event.Space.AutoWidgetAdded") proto.RegisterType((*EventP2PStatus)(nil), "anytype.Event.P2PStatus") proto.RegisterType((*EventP2PStatusUpdate)(nil), "anytype.Event.P2PStatus.Update") proto.RegisterType((*EventImport)(nil), "anytype.Event.Import") @@ -12530,404 +12604,408 @@ func init() { func init() { proto.RegisterFile("pb/protos/events.proto", fileDescriptor_a966342d378ae5f5) } var fileDescriptor_a966342d378ae5f5 = []byte{ - // 6345 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x49, 0x8c, 0x1d, 0xc7, - 0x79, 0xff, 0xdb, 0x97, 0x6f, 0x86, 0xc3, 0xc7, 0x22, 0x45, 0xb5, 0x5a, 0x14, 0x45, 0x0d, 0x17, - 0xd1, 0x12, 0xf5, 0x28, 0x91, 0x14, 0x29, 0x53, 0xe2, 0x32, 0x1b, 0xf5, 0x1e, 0x97, 0xe1, 0xb8, - 0x86, 0xa4, 0x65, 0xd9, 0xf8, 0xc3, 0x3d, 0xaf, 0x6b, 0x66, 0xda, 0x7c, 0xd3, 0xfd, 0xdc, 0xdd, - 0x33, 0xe4, 0x78, 0xfb, 0x3b, 0x5e, 0x12, 0x04, 0x48, 0x90, 0x1c, 0x82, 0x24, 0xc8, 0x25, 0x40, - 0x10, 0x03, 0x39, 0x04, 0x41, 0x80, 0x5c, 0x92, 0x4b, 0x12, 0x20, 0x09, 0xb2, 0x03, 0xf6, 0x2d, - 0x17, 0xc7, 0x86, 0x9c, 0x43, 0x0e, 0xc9, 0xc1, 0x49, 0x10, 0xe4, 0x18, 0xd4, 0xd2, 0xd5, 0x55, - 0xbd, 0xbc, 0x7e, 0xcf, 0x92, 0xb3, 0x20, 0x3e, 0xcd, 0xab, 0xea, 0xef, 0xfb, 0xd5, 0xf2, 0x2d, - 0x55, 0xf5, 0xd5, 0x32, 0x70, 0x74, 0xb4, 0x71, 0x7e, 0xe4, 0x7b, 0xa1, 0x17, 0x9c, 0x27, 0x7b, - 0xc4, 0x0d, 0x83, 0x2e, 0x4b, 0xa1, 0xa6, 0xe5, 0xee, 0x87, 0xfb, 0x23, 0x62, 0x9e, 0x1a, 0x3d, - 0xde, 0x3a, 0x3f, 0x74, 0x36, 0xce, 0x8f, 0x36, 0xce, 0xef, 0x78, 0x36, 0x19, 0x46, 0xe4, 0x2c, - 0x21, 0xc8, 0xcd, 0x63, 0x5b, 0x9e, 0xb7, 0x35, 0x24, 0xfc, 0xdb, 0xc6, 0xee, 0xe6, 0xf9, 0x20, - 0xf4, 0x77, 0x07, 0x21, 0xff, 0x3a, 0xff, 0x0f, 0x7f, 0x5a, 0x86, 0xfa, 0x0a, 0x85, 0x47, 0x17, - 0xa0, 0xb5, 0x43, 0x82, 0xc0, 0xda, 0x22, 0x81, 0x51, 0x3e, 0x51, 0x3d, 0x3b, 0x73, 0xe1, 0x68, - 0x57, 0x14, 0xd5, 0x65, 0x14, 0xdd, 0x7b, 0xfc, 0x33, 0x96, 0x74, 0xe8, 0x18, 0xb4, 0x07, 0x9e, - 0x1b, 0x92, 0xa7, 0x61, 0xdf, 0x36, 0x2a, 0x27, 0xca, 0x67, 0xdb, 0x38, 0xce, 0x40, 0x97, 0xa0, - 0xed, 0xb8, 0x4e, 0xe8, 0x58, 0xa1, 0xe7, 0x1b, 0xd5, 0x13, 0x65, 0x0d, 0x92, 0x55, 0xb2, 0xbb, - 0x30, 0x18, 0x78, 0xbb, 0x6e, 0x88, 0x63, 0x42, 0x64, 0x40, 0x33, 0xf4, 0xad, 0x01, 0xe9, 0xdb, - 0x46, 0x8d, 0x21, 0x46, 0x49, 0xf3, 0xdf, 0x2e, 0x40, 0x53, 0xd4, 0x01, 0x3d, 0x07, 0xcd, 0x60, - 0xc4, 0xa9, 0xbe, 0x51, 0xe6, 0x64, 0x22, 0x8d, 0x6e, 0xc0, 0x8c, 0xc5, 0x61, 0xd7, 0xb7, 0xbd, - 0x27, 0x46, 0x99, 0x15, 0xfc, 0x7c, 0xa2, 0x2d, 0xa2, 0xe0, 0x2e, 0x25, 0xe9, 0x95, 0xb0, 0xca, - 0x81, 0xfa, 0x30, 0x27, 0x92, 0xcb, 0x24, 0xb4, 0x9c, 0x61, 0x60, 0xfc, 0x25, 0x07, 0x39, 0x9e, - 0x03, 0x22, 0xc8, 0x7a, 0x25, 0x9c, 0x60, 0x44, 0x9f, 0x82, 0xc3, 0x22, 0x67, 0xc9, 0x73, 0x37, - 0x9d, 0xad, 0x87, 0x23, 0xdb, 0x0a, 0x89, 0xf1, 0x57, 0x1c, 0xef, 0x54, 0x0e, 0x1e, 0xa7, 0xed, - 0x72, 0xe2, 0x5e, 0x09, 0x67, 0x61, 0xa0, 0x5b, 0x70, 0x40, 0x64, 0x0b, 0xd0, 0xbf, 0xe6, 0xa0, - 0x2f, 0xe4, 0x80, 0x4a, 0x34, 0x9d, 0x0d, 0x7d, 0x1a, 0x8e, 0x88, 0x8c, 0xbb, 0x8e, 0xfb, 0x78, - 0x69, 0xdb, 0x1a, 0x0e, 0x89, 0xbb, 0x45, 0x8c, 0xbf, 0x19, 0x5f, 0x47, 0x8d, 0xb8, 0x57, 0xc2, - 0x99, 0x20, 0x68, 0x0b, 0x8c, 0xac, 0xfc, 0x9e, 0x63, 0x13, 0xe3, 0x6f, 0x79, 0x01, 0x67, 0x27, - 0x2a, 0xc0, 0xb1, 0x69, 0x21, 0xb9, 0x60, 0xe8, 0x3e, 0x74, 0xbc, 0x8d, 0xcf, 0x91, 0x41, 0xd4, - 0xf3, 0xeb, 0x24, 0x34, 0x3a, 0x0c, 0xff, 0xa5, 0x04, 0xfe, 0x7d, 0x46, 0x16, 0xc9, 0xac, 0xbb, - 0x4e, 0xc2, 0x5e, 0x09, 0xa7, 0x98, 0xd1, 0x43, 0x40, 0x5a, 0xde, 0xc2, 0x0e, 0x71, 0x6d, 0xe3, - 0x02, 0x83, 0x3c, 0x39, 0x1e, 0x92, 0x91, 0xf6, 0x4a, 0x38, 0x03, 0x20, 0x05, 0xfb, 0xd0, 0x0d, - 0x48, 0x68, 0x5c, 0x9c, 0x04, 0x96, 0x91, 0xa6, 0x60, 0x59, 0x2e, 0x15, 0x22, 0xcf, 0xc5, 0x64, - 0x68, 0x85, 0x8e, 0xe7, 0x8a, 0xfa, 0x5e, 0x62, 0xc0, 0xa7, 0xb3, 0x81, 0x25, 0xad, 0xac, 0x71, - 0x26, 0x08, 0xfa, 0x7f, 0xf0, 0x4c, 0x22, 0x1f, 0x93, 0x1d, 0x6f, 0x8f, 0x18, 0x6f, 0x32, 0xf4, - 0x33, 0x45, 0xe8, 0x9c, 0xba, 0x57, 0xc2, 0xd9, 0x30, 0x68, 0x11, 0x66, 0xa3, 0x0f, 0x0c, 0xf6, - 0x32, 0x83, 0x3d, 0x96, 0x07, 0x2b, 0xc0, 0x34, 0x1e, 0x6a, 0xf4, 0x3c, 0xbd, 0x34, 0xf4, 0x02, - 0x62, 0x2c, 0x64, 0x1a, 0xbd, 0x80, 0x60, 0x24, 0xd4, 0xe8, 0x15, 0x0e, 0xb5, 0x91, 0x41, 0xe8, - 0x3b, 0x03, 0x56, 0x41, 0xaa, 0x45, 0x57, 0xc6, 0x37, 0x32, 0x26, 0x16, 0xaa, 0x94, 0x0d, 0x83, - 0x30, 0x1c, 0x0c, 0x76, 0x37, 0x82, 0x81, 0xef, 0x8c, 0x68, 0xde, 0x82, 0x6d, 0x1b, 0xef, 0x8c, - 0x43, 0x5e, 0x57, 0x88, 0xbb, 0x0b, 0x36, 0x95, 0x4e, 0x12, 0x00, 0x7d, 0x1a, 0x90, 0x9a, 0x25, - 0xba, 0xef, 0x1a, 0x83, 0xfd, 0xd8, 0x04, 0xb0, 0xb2, 0x2f, 0x33, 0x60, 0x90, 0x05, 0x47, 0xd4, - 0xdc, 0x35, 0x2f, 0x70, 0xe8, 0x5f, 0xe3, 0x3a, 0x83, 0x7f, 0x75, 0x02, 0xf8, 0x88, 0x85, 0x2a, - 0x56, 0x16, 0x54, 0xb2, 0x88, 0x25, 0x6a, 0xda, 0xc4, 0x0f, 0x8c, 0x1b, 0x13, 0x17, 0x11, 0xb1, - 0x24, 0x8b, 0x88, 0xf2, 0x93, 0x5d, 0xf4, 0xae, 0xef, 0xed, 0x8e, 0x02, 0xe3, 0xe6, 0xc4, 0x5d, - 0xc4, 0x19, 0x92, 0x5d, 0xc4, 0x73, 0xd1, 0x65, 0x68, 0x6d, 0x0c, 0xbd, 0xc1, 0x63, 0x2a, 0xcc, - 0x0a, 0x83, 0x34, 0x12, 0x90, 0x8b, 0xf4, 0xb3, 0x10, 0x9f, 0xa4, 0xa5, 0xca, 0xca, 0x7e, 0x2f, - 0x93, 0x21, 0x09, 0x89, 0x18, 0x1a, 0x9f, 0xcf, 0x64, 0xe5, 0x24, 0x54, 0x59, 0x15, 0x0e, 0xb4, - 0x0c, 0x33, 0x9b, 0xce, 0x90, 0x04, 0x0f, 0x47, 0x43, 0xcf, 0xe2, 0xe3, 0xe4, 0xcc, 0x85, 0x13, - 0x99, 0x00, 0xb7, 0x62, 0x3a, 0x8a, 0xa2, 0xb0, 0xa1, 0xeb, 0xd0, 0xde, 0xb1, 0xfc, 0xc7, 0x41, - 0xdf, 0xdd, 0xf4, 0x8c, 0x7a, 0xe6, 0x08, 0xc7, 0x31, 0xee, 0x45, 0x54, 0xbd, 0x12, 0x8e, 0x59, - 0xe8, 0x38, 0xc9, 0x2a, 0xb5, 0x4e, 0xc2, 0x5b, 0x0e, 0x19, 0xda, 0x81, 0xd1, 0x60, 0x20, 0x2f, - 0x66, 0x82, 0xac, 0x93, 0xb0, 0xcb, 0xc9, 0xe8, 0x38, 0xa9, 0x33, 0xa2, 0xf7, 0xe0, 0x70, 0x94, - 0xb3, 0xb4, 0xed, 0x0c, 0x6d, 0x9f, 0xb8, 0x7d, 0x3b, 0x30, 0x9a, 0x99, 0x43, 0x50, 0x8c, 0xa7, - 0xd0, 0xd2, 0x61, 0x32, 0x03, 0x82, 0x7a, 0xc6, 0x28, 0x5b, 0x35, 0x49, 0xa3, 0x95, 0xe9, 0x19, - 0x63, 0x68, 0x95, 0x98, 0x6a, 0x57, 0x16, 0x08, 0xb2, 0xe1, 0xd9, 0x28, 0x7f, 0xd1, 0x1a, 0x3c, - 0xde, 0xf2, 0xbd, 0x5d, 0xd7, 0x5e, 0xf2, 0x86, 0x9e, 0x6f, 0xb4, 0x33, 0x07, 0xb7, 0x18, 0x3f, - 0x41, 0xdf, 0x2b, 0xe1, 0x3c, 0x28, 0xb4, 0x04, 0xb3, 0xd1, 0xa7, 0x07, 0xe4, 0x69, 0x68, 0x40, - 0xe6, 0x38, 0x1f, 0x43, 0x53, 0x22, 0xea, 0x20, 0x55, 0x26, 0x15, 0x84, 0xaa, 0x84, 0x31, 0x53, - 0x00, 0x42, 0x89, 0x54, 0x10, 0x9a, 0x56, 0x41, 0xe8, 0x10, 0x6c, 0x1c, 0x28, 0x00, 0xa1, 0x44, - 0x2a, 0x08, 0x4d, 0xd3, 0xa1, 0x5a, 0xb6, 0xd4, 0xf3, 0x1e, 0x53, 0x7d, 0x32, 0xe6, 0x32, 0x87, - 0x6a, 0xa5, 0xb7, 0x04, 0x21, 0x1d, 0xaa, 0x93, 0xcc, 0x74, 0x26, 0x14, 0xe5, 0x2d, 0x0c, 0x9d, - 0x2d, 0xd7, 0x38, 0x38, 0x46, 0x97, 0x29, 0x1a, 0xa3, 0xa2, 0x33, 0x21, 0x8d, 0x0d, 0xdd, 0x14, - 0x66, 0xb9, 0x4e, 0xc2, 0x65, 0x67, 0xcf, 0x38, 0x94, 0x39, 0x0c, 0xc5, 0x28, 0xcb, 0xce, 0x9e, - 0xb4, 0x4b, 0xce, 0xa2, 0x36, 0x2d, 0x1a, 0xe4, 0x8c, 0x67, 0x0a, 0x9a, 0x16, 0x11, 0xaa, 0x4d, - 0x8b, 0xf2, 0xd4, 0xa6, 0xdd, 0xb5, 0x42, 0xf2, 0xd4, 0x78, 0xae, 0xa0, 0x69, 0x8c, 0x4a, 0x6d, - 0x1a, 0xcb, 0xa0, 0xa3, 0x5b, 0x94, 0xf1, 0x88, 0xf8, 0xa1, 0x33, 0xb0, 0x86, 0xbc, 0xab, 0x4e, - 0x65, 0x8e, 0x41, 0x31, 0x9e, 0x46, 0x4d, 0x47, 0xb7, 0x4c, 0x18, 0xb5, 0xe1, 0x0f, 0xac, 0x8d, - 0x21, 0xc1, 0xde, 0x13, 0xe3, 0x74, 0x41, 0xc3, 0x23, 0x42, 0xb5, 0xe1, 0x51, 0x9e, 0xea, 0x5b, - 0x3e, 0xe9, 0xd8, 0x5b, 0x24, 0x34, 0xce, 0x16, 0xf8, 0x16, 0x4e, 0xa6, 0xfa, 0x16, 0x9e, 0x23, - 0x3d, 0xc0, 0xb2, 0x15, 0x5a, 0x7b, 0x0e, 0x79, 0xf2, 0xc8, 0x21, 0x4f, 0xe8, 0xc0, 0x7e, 0x78, - 0x8c, 0x07, 0x88, 0x68, 0xbb, 0x82, 0x58, 0x7a, 0x80, 0x04, 0x88, 0xf4, 0x00, 0x6a, 0xbe, 0x70, - 0xeb, 0x47, 0xc6, 0x78, 0x00, 0x0d, 0x5f, 0xfa, 0xf8, 0x3c, 0x28, 0x64, 0xc1, 0xd1, 0xd4, 0xa7, - 0xfb, 0xbe, 0x4d, 0x7c, 0xe3, 0x05, 0x56, 0xc8, 0xcb, 0xc5, 0x85, 0x30, 0xf2, 0x5e, 0x09, 0xe7, - 0x00, 0xa5, 0x8a, 0x58, 0xf7, 0x76, 0xfd, 0x01, 0xa1, 0xfd, 0x74, 0x72, 0x92, 0x22, 0x24, 0x79, - 0xaa, 0x08, 0xf9, 0x05, 0xed, 0xc1, 0x0b, 0xf2, 0x0b, 0x2d, 0x98, 0x8d, 0xa2, 0xac, 0x74, 0xb1, - 0x82, 0x39, 0xc3, 0x4a, 0xea, 0x8e, 0x2f, 0x29, 0xc9, 0xd5, 0x2b, 0xe1, 0xf1, 0xb0, 0x68, 0x1f, - 0x8e, 0x6b, 0x04, 0x7c, 0x9c, 0x57, 0x0b, 0x7e, 0x99, 0x15, 0x7c, 0x7e, 0x7c, 0xc1, 0x29, 0xb6, - 0x5e, 0x09, 0x17, 0x00, 0xa3, 0x11, 0x3c, 0xaf, 0x75, 0x46, 0x64, 0xd8, 0x42, 0x45, 0xbe, 0xc4, - 0xca, 0x3d, 0x37, 0xbe, 0x5c, 0x9d, 0xa7, 0x57, 0xc2, 0xe3, 0x20, 0xe9, 0x8a, 0x2b, 0xf3, 0x33, - 0x95, 0xe4, 0x17, 0x33, 0xa7, 0x3d, 0x39, 0xc5, 0x71, 0x59, 0xe6, 0x82, 0x65, 0x6a, 0xbe, 0xe8, - 0xce, 0x2f, 0x4f, 0xaa, 0xf9, 0xb2, 0x1f, 0xf3, 0xa0, 0x34, 0xd9, 0xd1, 0x4f, 0x0f, 0x2c, 0x7f, - 0x8b, 0x84, 0xbc, 0xa3, 0xfb, 0x36, 0x6d, 0xd4, 0x57, 0x26, 0x91, 0x5d, 0x8a, 0x4d, 0x93, 0x5d, - 0x26, 0x30, 0x0a, 0xe0, 0x98, 0x46, 0xd1, 0x0f, 0x96, 0xbc, 0xe1, 0x90, 0x0c, 0xa2, 0xde, 0xfc, - 0xff, 0xac, 0xe0, 0xd7, 0xc6, 0x17, 0x9c, 0x60, 0xea, 0x95, 0xf0, 0x58, 0xd0, 0x54, 0x7b, 0xef, - 0x0f, 0xed, 0x84, 0xce, 0x18, 0x13, 0xe9, 0x6a, 0x92, 0x2d, 0xd5, 0xde, 0x14, 0x45, 0x4a, 0x57, - 0x15, 0x0a, 0xda, 0xdc, 0x67, 0x27, 0xd1, 0x55, 0x9d, 0x27, 0xa5, 0xab, 0xfa, 0x67, 0x3a, 0xba, - 0xed, 0x06, 0xc4, 0x67, 0x18, 0xb7, 0x3d, 0xc7, 0x35, 0x5e, 0xcc, 0x1c, 0xdd, 0x1e, 0x06, 0xc4, - 0x17, 0x05, 0x51, 0x2a, 0x3a, 0xba, 0x69, 0x6c, 0x1a, 0xce, 0x5d, 0xb2, 0x19, 0x1a, 0x27, 0x8a, - 0x70, 0x28, 0x95, 0x86, 0x43, 0x33, 0xe8, 0x48, 0x21, 0x33, 0xd6, 0x09, 0x95, 0x0a, 0xb6, 0xdc, - 0x2d, 0x62, 0xbc, 0x94, 0x39, 0x52, 0x28, 0x70, 0x0a, 0x31, 0x1d, 0x29, 0xb2, 0x40, 0xe8, 0xca, - 0x5f, 0xe6, 0xd3, 0x19, 0x19, 0x87, 0x9e, 0xcf, 0x5c, 0xf9, 0x2b, 0xd0, 0x92, 0x94, 0xae, 0x41, - 0xd2, 0x00, 0xe8, 0x63, 0x50, 0x1b, 0x39, 0xee, 0x96, 0x61, 0x33, 0xa0, 0xc3, 0x09, 0xa0, 0x35, - 0xc7, 0xdd, 0xea, 0x95, 0x30, 0x23, 0x41, 0xef, 0x00, 0x8c, 0x7c, 0x6f, 0x40, 0x82, 0x60, 0x95, - 0x3c, 0x31, 0x08, 0x63, 0x30, 0x93, 0x0c, 0x9c, 0xa0, 0xbb, 0x4a, 0xe8, 0xb8, 0xac, 0xd0, 0xa3, - 0x15, 0x38, 0x20, 0x52, 0xc2, 0xca, 0x37, 0x33, 0x27, 0x7f, 0x11, 0x40, 0x1c, 0x6e, 0xd2, 0xb8, - 0xe8, 0xda, 0x47, 0x64, 0x2c, 0x7b, 0x2e, 0x31, 0xb6, 0x32, 0xd7, 0x3e, 0x11, 0x08, 0x25, 0xa1, - 0x73, 0x2c, 0x85, 0x03, 0x2d, 0xc2, 0x6c, 0xb8, 0xed, 0x13, 0xcb, 0x5e, 0x0f, 0xad, 0x70, 0x37, - 0x30, 0xdc, 0xcc, 0x69, 0x1a, 0xff, 0xd8, 0x7d, 0xc0, 0x28, 0xe9, 0x14, 0x54, 0xe5, 0x41, 0xab, - 0xd0, 0xa1, 0x0b, 0xa1, 0xbb, 0xce, 0x8e, 0x13, 0x62, 0x62, 0x0d, 0xb6, 0x89, 0x6d, 0x78, 0x99, - 0x8b, 0x28, 0x3a, 0xed, 0xed, 0xaa, 0x74, 0x74, 0xb6, 0x92, 0xe4, 0x45, 0x3d, 0x98, 0xa3, 0x79, - 0xeb, 0x23, 0x6b, 0x40, 0x1e, 0x06, 0xd6, 0x16, 0x31, 0x46, 0x99, 0x1a, 0xc8, 0xd0, 0x62, 0x2a, - 0x3a, 0x59, 0xd1, 0xf9, 0x22, 0xa4, 0xbb, 0xde, 0xc0, 0x1a, 0x72, 0xa4, 0xcf, 0xe7, 0x23, 0xc5, - 0x54, 0x11, 0x52, 0x9c, 0xa3, 0xb5, 0x91, 0xf7, 0xbd, 0x6d, 0xec, 0x15, 0xb4, 0x51, 0xd0, 0x69, - 0x6d, 0x14, 0x79, 0x14, 0xcf, 0xf5, 0x42, 0x67, 0xd3, 0x19, 0x08, 0xfb, 0x75, 0x6d, 0xc3, 0xcf, - 0xc4, 0x5b, 0x55, 0xc8, 0xba, 0xeb, 0x3c, 0xb2, 0x94, 0xe2, 0x45, 0x0f, 0x00, 0xa9, 0x79, 0x42, - 0xa9, 0x02, 0x86, 0x38, 0x3f, 0x0e, 0x51, 0x6a, 0x56, 0x06, 0x3f, 0xad, 0xe5, 0xc8, 0xda, 0xa7, - 0xcb, 0xdb, 0x45, 0xdf, 0xb3, 0xec, 0x81, 0x15, 0x84, 0x46, 0x98, 0x59, 0xcb, 0x35, 0x4e, 0xd6, - 0x95, 0x74, 0xb4, 0x96, 0x49, 0x5e, 0x8a, 0xb7, 0x43, 0x76, 0x36, 0x88, 0x1f, 0x6c, 0x3b, 0x23, - 0x51, 0xc7, 0xdd, 0x4c, 0xbc, 0x7b, 0x92, 0x2c, 0xae, 0x61, 0x8a, 0x97, 0x4e, 0xc4, 0x59, 0x9c, - 0x7a, 0x7d, 0xdf, 0x1d, 0x70, 0x65, 0x14, 0xa0, 0x4f, 0x32, 0x27, 0xe2, 0x4c, 0x33, 0xba, 0x31, - 0x71, 0x0c, 0x9d, 0x0d, 0x83, 0xee, 0xc0, 0xc1, 0xd1, 0x85, 0x91, 0x86, 0xfc, 0x34, 0x73, 0xe2, - 0xbc, 0x76, 0x61, 0x2d, 0x09, 0x99, 0xe4, 0xa4, 0xa6, 0xe6, 0xec, 0x8c, 0x3c, 0x3f, 0xbc, 0xe5, - 0xb8, 0x4e, 0xb0, 0x6d, 0xec, 0x67, 0x9a, 0x5a, 0x9f, 0x91, 0x74, 0x39, 0x0d, 0x35, 0x35, 0x95, - 0x07, 0x5d, 0x82, 0xe6, 0x60, 0xdb, 0x0a, 0x17, 0x6c, 0xdb, 0xf8, 0x2a, 0x0f, 0xf8, 0x3e, 0x9b, - 0xe0, 0x5f, 0xda, 0xb6, 0x42, 0x11, 0x22, 0x89, 0x48, 0xd1, 0x35, 0x00, 0xfa, 0x53, 0xb4, 0xe0, - 0xa7, 0xca, 0x99, 0xbe, 0x8a, 0x31, 0xca, 0xda, 0x2b, 0x0c, 0xe8, 0x3d, 0x38, 0x1c, 0xa7, 0xa8, - 0x91, 0xf2, 0x35, 0xff, 0xd7, 0xca, 0x99, 0xde, 0x56, 0xc1, 0x91, 0xb4, 0xbd, 0x12, 0xce, 0x82, - 0xa0, 0x43, 0x84, 0x96, 0x1d, 0x79, 0xa1, 0x9f, 0xce, 0x8e, 0x96, 0xeb, 0xd0, 0x82, 0x98, 0x0e, - 0x11, 0x59, 0x20, 0x51, 0xab, 0xc5, 0x40, 0xff, 0xf5, 0x31, 0xad, 0x96, 0x83, 0xba, 0xc2, 0x80, - 0xee, 0xc2, 0x41, 0x9a, 0xa2, 0x60, 0x44, 0xf4, 0xdc, 0x37, 0xcb, 0x99, 0xc2, 0x57, 0xaa, 0xc5, - 0xa8, 0xa9, 0xf0, 0x13, 0xac, 0x8b, 0x4d, 0xa8, 0xef, 0x59, 0xc3, 0x5d, 0x62, 0x7e, 0xb7, 0x0e, - 0x35, 0xca, 0x60, 0xfe, 0x7d, 0x19, 0xaa, 0x54, 0x38, 0x73, 0x50, 0x71, 0x6c, 0x83, 0xef, 0xba, - 0x54, 0x1c, 0x1b, 0x19, 0xd0, 0xf4, 0xe8, 0x9c, 0x57, 0xee, 0x01, 0x45, 0x49, 0x34, 0x0f, 0xb3, - 0xd6, 0x66, 0x48, 0xfc, 0xfb, 0xe2, 0x73, 0x83, 0x7d, 0xd6, 0xf2, 0xa8, 0x82, 0x88, 0xfd, 0x24, - 0x11, 0x08, 0x33, 0x13, 0x7b, 0x44, 0xb4, 0xec, 0x68, 0xeb, 0x29, 0x22, 0x45, 0x47, 0xa1, 0x11, - 0xec, 0x6e, 0xf4, 0xed, 0xc0, 0xa8, 0x9d, 0xa8, 0x9e, 0x6d, 0x63, 0x91, 0x42, 0x6f, 0xc3, 0xac, - 0x4d, 0x46, 0xc4, 0xb5, 0x89, 0x3b, 0x70, 0x48, 0x60, 0xd4, 0xd9, 0x4e, 0xd6, 0xb3, 0x5d, 0xbe, - 0x0b, 0xd6, 0x8d, 0x76, 0xc1, 0xba, 0xeb, 0x6c, 0x17, 0x0c, 0x6b, 0xc4, 0xe6, 0x67, 0xa1, 0x21, - 0xba, 0x32, 0xd9, 0xc4, 0xb8, 0xb8, 0x8a, 0x56, 0x5c, 0x17, 0xea, 0x01, 0xed, 0x33, 0x51, 0x75, - 0x23, 0xa3, 0xea, 0xac, 0x4f, 0x31, 0x27, 0x33, 0x37, 0xa1, 0x21, 0x54, 0x34, 0x59, 0x82, 0xd2, - 0x0d, 0x95, 0x1f, 0xa5, 0x1b, 0xaa, 0x6a, 0xbd, 0xcc, 0x2f, 0xc3, 0xc1, 0xa4, 0xe6, 0x26, 0x0b, - 0x5c, 0x84, 0xb6, 0x2f, 0x2d, 0xa3, 0x92, 0xd0, 0xde, 0x54, 0x91, 0x5d, 0x09, 0x84, 0x63, 0xb6, - 0xdc, 0xe2, 0x1f, 0x40, 0x27, 0xa5, 0xdc, 0x1d, 0xa8, 0x3a, 0x36, 0xdf, 0x5a, 0x6c, 0x63, 0xfa, - 0x93, 0x72, 0x3b, 0x01, 0xa5, 0x60, 0xc5, 0xb7, 0xb0, 0x48, 0xe5, 0xa2, 0x3e, 0x84, 0x19, 0x45, - 0x67, 0xe3, 0xbe, 0x2f, 0x4f, 0xd4, 0xf7, 0x79, 0x32, 0x34, 0xbf, 0xd5, 0x80, 0xa6, 0xd8, 0x74, - 0x32, 0x57, 0xa1, 0xc6, 0xb6, 0x00, 0x8f, 0x40, 0xdd, 0x71, 0x6d, 0xf2, 0x94, 0x61, 0xd7, 0x31, - 0x4f, 0xa0, 0xd7, 0xa1, 0x29, 0x36, 0xa0, 0x44, 0x87, 0xe5, 0x6d, 0x67, 0x46, 0x64, 0xe6, 0xfb, - 0xd0, 0x8c, 0xb6, 0x02, 0x8f, 0x41, 0x7b, 0xe4, 0x7b, 0x74, 0x58, 0xed, 0x47, 0x62, 0x88, 0x33, - 0xd0, 0x1b, 0xd0, 0xb4, 0xc5, 0x66, 0x63, 0x45, 0x78, 0xc9, 0x1c, 0x95, 0x8d, 0xe8, 0xcc, 0xaf, - 0x96, 0xa1, 0xc1, 0x77, 0x04, 0xcd, 0x3d, 0xa9, 0x56, 0x6f, 0x42, 0x63, 0xc0, 0xf2, 0x8c, 0xe4, - 0x6e, 0xa0, 0x56, 0x43, 0xb1, 0xc5, 0x88, 0x05, 0x31, 0x65, 0x0b, 0xb8, 0x23, 0xab, 0x8c, 0x65, - 0xe3, 0xb2, 0xc4, 0x82, 0xf8, 0xbf, 0xad, 0xdc, 0x3f, 0xaa, 0xc0, 0x01, 0x7d, 0xa3, 0xf1, 0x18, - 0xb4, 0x07, 0x72, 0xeb, 0x52, 0xf4, 0xae, 0xcc, 0x40, 0xf7, 0x01, 0x06, 0x43, 0x87, 0xb8, 0x21, - 0x0b, 0x75, 0x57, 0x32, 0x57, 0x50, 0x99, 0xfb, 0x8e, 0xdd, 0x25, 0xc9, 0x86, 0x15, 0x08, 0x74, - 0x03, 0xea, 0xc1, 0xc0, 0x1b, 0x71, 0xbb, 0x9f, 0x53, 0x96, 0xd4, 0x7a, 0xb5, 0x17, 0x76, 0xc3, - 0x6d, 0x3e, 0x4b, 0x5b, 0x18, 0x39, 0xeb, 0x94, 0x01, 0x73, 0x3e, 0xf3, 0x2b, 0x00, 0x31, 0x34, - 0x3a, 0x21, 0x27, 0xc5, 0xab, 0xd6, 0x4e, 0x54, 0x7f, 0x35, 0x4b, 0xa1, 0x58, 0xb3, 0xc2, 0x6d, - 0xe1, 0x67, 0xd5, 0x2c, 0x74, 0x0e, 0x0e, 0x05, 0xce, 0x96, 0x6b, 0x85, 0xbb, 0x3e, 0x79, 0x44, - 0x7c, 0x67, 0xd3, 0x21, 0x36, 0xab, 0x5e, 0x0b, 0xa7, 0x3f, 0x98, 0x6f, 0xc0, 0xa1, 0xf4, 0x26, - 0xea, 0xd8, 0x4e, 0x34, 0x7f, 0xb6, 0x0d, 0x0d, 0xbe, 0x3e, 0x36, 0xff, 0xbd, 0x22, 0xf5, 0xda, - 0xfc, 0x93, 0x32, 0xd4, 0xf9, 0x3e, 0x61, 0xd2, 0xc3, 0xdc, 0x52, 0x75, 0xba, 0x9a, 0xb1, 0x78, - 0xcc, 0xda, 0x37, 0xed, 0xde, 0x21, 0xfb, 0x8f, 0xe8, 0xb8, 0x23, 0x15, 0x3d, 0xd7, 0x1f, 0xdc, - 0x86, 0x56, 0x44, 0x4c, 0xbd, 0xcb, 0x63, 0xb2, 0x2f, 0x0a, 0xa7, 0x3f, 0xd1, 0x39, 0x31, 0x7e, - 0x49, 0x53, 0x4d, 0xda, 0x13, 0x2f, 0x45, 0x0c, 0x72, 0x9f, 0x85, 0x2a, 0x5d, 0x91, 0x26, 0x9b, - 0x30, 0xbd, 0x59, 0xe6, 0xd6, 0x76, 0x09, 0xea, 0x7c, 0xaf, 0x36, 0x59, 0x06, 0x82, 0xda, 0x63, - 0xb2, 0x1f, 0x79, 0x25, 0xf6, 0x3b, 0x17, 0xe4, 0x8f, 0xab, 0x30, 0xab, 0xee, 0x4f, 0x99, 0x2b, - 0xb9, 0x43, 0x32, 0x1b, 0x64, 0xe3, 0x21, 0x59, 0x24, 0xa9, 0x67, 0x63, 0x58, 0x4c, 0x35, 0xda, - 0x98, 0x27, 0xcc, 0x2e, 0x34, 0xc4, 0xb6, 0x5f, 0x12, 0x49, 0xd2, 0x57, 0x54, 0xfa, 0xdb, 0xd0, - 0x92, 0xbb, 0x78, 0x1f, 0xb6, 0x6c, 0x1f, 0x5a, 0x72, 0xbb, 0xee, 0x08, 0xd4, 0x43, 0x2f, 0xb4, - 0x86, 0x0c, 0xae, 0x8a, 0x79, 0x82, 0xea, 0xa5, 0x4b, 0x9e, 0x86, 0x4b, 0xd2, 0xf3, 0x56, 0x71, - 0x9c, 0xc1, 0x1d, 0x2b, 0xd9, 0xe3, 0x5f, 0xab, 0xfc, 0xab, 0xcc, 0x88, 0xcb, 0xac, 0xa9, 0x65, - 0xee, 0x43, 0x43, 0xec, 0xe1, 0xc9, 0xef, 0x65, 0xe5, 0x3b, 0x5a, 0x80, 0xfa, 0x16, 0xfd, 0x2e, - 0xa4, 0xfe, 0x6a, 0xc2, 0xbe, 0xf9, 0xd2, 0x7c, 0xc9, 0x73, 0x43, 0xaa, 0xc6, 0x7a, 0x68, 0x12, - 0x73, 0x4e, 0x2a, 0x42, 0x9f, 0x6f, 0xc8, 0x72, 0x23, 0x14, 0x29, 0xf3, 0x5b, 0x65, 0x68, 0xcb, - 0x1d, 0x70, 0xf3, 0xfd, 0x3c, 0xe3, 0x59, 0x80, 0x03, 0xbe, 0xa0, 0xa2, 0x86, 0x1a, 0x99, 0xd0, - 0xf3, 0x89, 0x9a, 0x60, 0x85, 0x06, 0xeb, 0x1c, 0xe6, 0x3b, 0xb9, 0x42, 0x9d, 0x87, 0xd9, 0x88, - 0xf4, 0x4e, 0xac, 0x7a, 0x5a, 0x9e, 0x69, 0x4a, 0xee, 0xd4, 0xc8, 0x6d, 0x6e, 0xc2, 0xac, 0xba, - 0x0f, 0x66, 0x3e, 0xca, 0xb6, 0x9e, 0x1b, 0xb4, 0x18, 0x65, 0xcf, 0xad, 0x92, 0x58, 0xec, 0x47, - 0x4d, 0x88, 0x49, 0xb0, 0xc6, 0x60, 0x3e, 0x0b, 0x75, 0xbe, 0x3b, 0x9f, 0x40, 0x36, 0x7f, 0x6d, - 0x00, 0x75, 0x26, 0x04, 0xf3, 0x22, 0x37, 0x80, 0x73, 0xd0, 0x60, 0x91, 0xa6, 0xe8, 0xec, 0xd2, - 0x91, 0x2c, 0x89, 0x61, 0x41, 0x63, 0x2e, 0xc1, 0x8c, 0xb2, 0x2f, 0x4a, 0x35, 0x96, 0x7d, 0x90, - 0x5a, 0x10, 0x25, 0x91, 0x09, 0x2d, 0x3a, 0x40, 0x0b, 0x9f, 0x4b, 0xdb, 0x2f, 0xd3, 0xe6, 0x29, - 0x39, 0x5b, 0x34, 0xc5, 0x3e, 0x70, 0x5f, 0xf6, 0x92, 0x4c, 0x9b, 0x9f, 0x81, 0xb6, 0xdc, 0x3e, - 0x45, 0xf7, 0x61, 0x56, 0x6c, 0x9f, 0xf2, 0xe8, 0x0f, 0x25, 0x9e, 0x2b, 0xd0, 0xae, 0x07, 0xe4, - 0x69, 0xc8, 0x76, 0x60, 0xbb, 0x0f, 0xf6, 0x47, 0x04, 0x6b, 0x00, 0xe6, 0x37, 0xcf, 0xb2, 0x9e, - 0x37, 0x47, 0xd0, 0x92, 0x7b, 0x46, 0x49, 0x29, 0x5c, 0xe1, 0xae, 0xb1, 0x52, 0xb8, 0xe1, 0xc9, - 0xf9, 0xa9, 0x03, 0x66, 0x1e, 0xd4, 0x7c, 0x1e, 0xaa, 0x77, 0xc8, 0x3e, 0xb5, 0x10, 0xee, 0x48, - 0x85, 0x85, 0x70, 0x87, 0xd9, 0x87, 0x86, 0xd8, 0xbb, 0x4d, 0x96, 0x77, 0x1e, 0x1a, 0x9b, 0x7c, - 0x3b, 0xb8, 0xc0, 0x65, 0x0a, 0x32, 0xf3, 0x06, 0xcc, 0xa8, 0x3b, 0xb6, 0x49, 0xbc, 0x13, 0x30, - 0x33, 0x50, 0xf6, 0x84, 0xb9, 0x18, 0xd4, 0x2c, 0x93, 0xe8, 0xea, 0x98, 0x42, 0x58, 0xc9, 0xd4, - 0xc3, 0x97, 0x32, 0xbb, 0x7d, 0x8c, 0x36, 0xde, 0x81, 0x83, 0xc9, 0xad, 0xd9, 0x64, 0x49, 0x67, - 0xe1, 0xe0, 0x46, 0x62, 0x23, 0x98, 0xfb, 0xc0, 0x64, 0xb6, 0xd9, 0x87, 0x3a, 0xdf, 0x3a, 0x4b, - 0x42, 0xbc, 0x0e, 0x75, 0x8b, 0x6d, 0xcd, 0x55, 0xd8, 0xd4, 0xc2, 0xcc, 0xac, 0x25, 0x63, 0xc5, - 0x9c, 0xd0, 0x74, 0xe0, 0x80, 0xbe, 0x1b, 0x97, 0x84, 0xec, 0xc1, 0x81, 0x3d, 0x6d, 0xd7, 0x8f, - 0x43, 0xcf, 0x67, 0x42, 0x6b, 0x50, 0x58, 0x67, 0x34, 0xbf, 0xd6, 0x80, 0x1a, 0xdb, 0x4e, 0x4e, - 0x16, 0x71, 0x19, 0x6a, 0x21, 0x79, 0x1a, 0xcd, 0x8b, 0xe7, 0xc7, 0xee, 0x4d, 0xf3, 0x98, 0x26, - 0xa3, 0x47, 0x1f, 0xa7, 0x93, 0xf8, 0xfd, 0x61, 0xb4, 0x80, 0x3a, 0x39, 0x9e, 0x71, 0x9d, 0x92, - 0x62, 0xce, 0x41, 0x59, 0x99, 0x2d, 0x88, 0xe3, 0x0f, 0x05, 0xac, 0xcc, 0x08, 0x31, 0xe7, 0x40, - 0x37, 0xa0, 0x39, 0xd8, 0x26, 0x83, 0xc7, 0xc4, 0x16, 0xe7, 0x1e, 0x4e, 0x8f, 0x67, 0x5e, 0xe2, - 0xc4, 0x38, 0xe2, 0xa2, 0x65, 0x0f, 0x98, 0x74, 0x1b, 0x93, 0x94, 0xcd, 0x24, 0x8e, 0x39, 0x07, - 0x5a, 0x81, 0xb6, 0x33, 0xf0, 0xdc, 0x95, 0x1d, 0xef, 0x73, 0x8e, 0x38, 0xe0, 0xf0, 0xf2, 0x78, - 0xf6, 0x7e, 0x44, 0x8e, 0x63, 0xce, 0x08, 0xa6, 0xbf, 0x43, 0x57, 0x8c, 0xad, 0x49, 0x61, 0x18, - 0x39, 0x8e, 0x39, 0xcd, 0x63, 0x42, 0x9e, 0xd9, 0x46, 0x7e, 0x0b, 0xea, 0xac, 0xcb, 0xd1, 0x35, - 0xf5, 0xf3, 0x9c, 0x52, 0x52, 0xae, 0xc7, 0x12, 0xa2, 0x92, 0x38, 0xac, 0xff, 0x75, 0x9c, 0x99, - 0x49, 0x70, 0x84, 0xdc, 0x38, 0xce, 0x8b, 0xd0, 0x14, 0xa2, 0xd0, 0x2b, 0xdc, 0x8a, 0x08, 0x5e, - 0x80, 0x3a, 0x37, 0xcc, 0xec, 0xf6, 0xbc, 0x04, 0x6d, 0xd9, 0x99, 0xe3, 0x49, 0x58, 0xef, 0xe4, - 0x90, 0xfc, 0x4c, 0x05, 0xea, 0x7c, 0x5b, 0x3d, 0xed, 0x6a, 0x55, 0x2b, 0x38, 0x39, 0x7e, 0x97, - 0x5e, 0x35, 0x83, 0x5b, 0x6c, 0x71, 0x48, 0xe7, 0xf2, 0xf2, 0xa8, 0xec, 0xd9, 0x02, 0xee, 0xb5, - 0x88, 0x1e, 0xc7, 0xac, 0x05, 0xe2, 0xbc, 0x0f, 0x6d, 0xc9, 0x85, 0x16, 0x75, 0x91, 0x9e, 0x1b, - 0x2b, 0x8a, 0x64, 0x91, 0x02, 0xf0, 0x97, 0xcb, 0x50, 0x5d, 0x76, 0xf6, 0x52, 0xfd, 0xf0, 0x56, - 0x64, 0xd5, 0x45, 0xee, 0x60, 0xd9, 0xd9, 0xd3, 0x8c, 0xda, 0x5c, 0x89, 0x34, 0xee, 0x1d, 0xbd, - 0x7a, 0x67, 0xc6, 0xcf, 0xc0, 0x62, 0x18, 0x5e, 0xb1, 0x5f, 0x68, 0x42, 0x8d, 0x9d, 0x58, 0xc9, - 0xf2, 0x53, 0xfb, 0xa3, 0xe2, 0x8a, 0xb1, 0x98, 0x38, 0x1b, 0x70, 0x19, 0x3d, 0xf7, 0x53, 0x71, - 0xa0, 0xe7, 0xe4, 0x78, 0x46, 0x2d, 0xee, 0x70, 0x19, 0x6a, 0x3b, 0xce, 0x0e, 0x11, 0x6e, 0xaa, - 0xa0, 0xc8, 0x7b, 0xce, 0x0e, 0xc1, 0x8c, 0x9e, 0xf2, 0x6d, 0x5b, 0xc1, 0xb6, 0xf0, 0x50, 0x05, - 0x7c, 0x3d, 0x2b, 0xd8, 0xc6, 0x8c, 0x9e, 0xf2, 0xb9, 0x74, 0x15, 0xd9, 0x98, 0x84, 0x8f, 0x2e, - 0x2e, 0x31, 0xa3, 0xa7, 0x7c, 0x81, 0xf3, 0x05, 0x22, 0x7c, 0x52, 0x01, 0xdf, 0xba, 0xf3, 0x05, - 0x82, 0x19, 0x7d, 0xec, 0xc2, 0x5b, 0x93, 0x75, 0x8d, 0xe2, 0xc2, 0x1f, 0xc0, 0x5c, 0xa8, 0xed, - 0xbb, 0x8a, 0x63, 0x53, 0xe7, 0x0a, 0xe4, 0xa2, 0xf1, 0xe0, 0x04, 0x06, 0x35, 0x02, 0xb6, 0x66, - 0xce, 0x36, 0x82, 0x17, 0xa0, 0xfe, 0x49, 0xc7, 0x0e, 0xb7, 0xf5, 0xcf, 0x75, 0xcd, 0xe5, 0x51, - 0xb1, 0x4d, 0xe5, 0xf2, 0x54, 0xa9, 0x73, 0x9c, 0x65, 0xa8, 0x51, 0xf5, 0x99, 0x4e, 0x8f, 0x63, - 0xad, 0xfb, 0x50, 0x0e, 0x58, 0xed, 0x68, 0x8e, 0x73, 0x0c, 0x6a, 0x54, 0x43, 0x72, 0xba, 0xe4, - 0x18, 0xd4, 0xa8, 0xde, 0xe5, 0x7f, 0xa5, 0xd2, 0xd6, 0xbf, 0x56, 0xa3, 0xaf, 0x67, 0x60, 0x4e, - 0x17, 0x47, 0x0e, 0xca, 0x1f, 0x36, 0xa1, 0xc6, 0x8e, 0x7f, 0x25, 0x2d, 0xf2, 0x13, 0x70, 0x80, - 0xcb, 0x6f, 0x51, 0x4c, 0xc1, 0x2b, 0x99, 0xa7, 0x3f, 0xf5, 0x43, 0x65, 0x42, 0x05, 0x04, 0x0b, - 0xd6, 0x11, 0x26, 0x9f, 0x54, 0x30, 0x28, 0x4d, 0x23, 0xdf, 0x91, 0x93, 0xd7, 0x5a, 0xc1, 0xd9, - 0x43, 0xc6, 0xcb, 0xa7, 0xc0, 0xd1, 0x4c, 0x16, 0x2d, 0x42, 0x8b, 0x0e, 0xad, 0xb4, 0xbb, 0x84, - 0xd9, 0x9e, 0x19, 0xcf, 0xdf, 0x17, 0xd4, 0x58, 0xf2, 0xd1, 0x81, 0x7d, 0x60, 0xf9, 0x36, 0xab, - 0x95, 0xb0, 0xe1, 0x97, 0xc7, 0x83, 0x2c, 0x45, 0xe4, 0x38, 0xe6, 0x44, 0x77, 0x60, 0xc6, 0x26, - 0x32, 0x4e, 0x20, 0x8c, 0xfa, 0x63, 0xe3, 0x81, 0x96, 0x63, 0x06, 0xac, 0x72, 0xd3, 0x3a, 0x45, - 0x6b, 0xc3, 0xa0, 0x70, 0xb2, 0xc1, 0xa0, 0xe2, 0x33, 0xde, 0x31, 0xa7, 0x79, 0x1a, 0x0e, 0x68, - 0x72, 0xfb, 0x48, 0x67, 0x1d, 0xaa, 0x2c, 0x39, 0xce, 0x15, 0xb9, 0x44, 0x79, 0x4d, 0x9f, 0x76, - 0xe4, 0xae, 0x48, 0x04, 0xe3, 0x5d, 0x68, 0x45, 0x82, 0x41, 0x37, 0xf5, 0x3a, 0xbc, 0x52, 0x5c, - 0x07, 0x29, 0x53, 0x81, 0xb6, 0x0a, 0x6d, 0x29, 0x21, 0xb4, 0xa0, 0xc3, 0xbd, 0x5a, 0x0c, 0x17, - 0x4b, 0x57, 0xe0, 0x61, 0x98, 0x51, 0x04, 0x85, 0x96, 0x74, 0xc4, 0xd7, 0x8a, 0x11, 0x55, 0x31, - 0xc7, 0xb3, 0x1e, 0x29, 0x31, 0x55, 0x2a, 0xd5, 0x58, 0x2a, 0xbf, 0xdb, 0x84, 0x96, 0x3c, 0x72, - 0x99, 0xb1, 0xc6, 0xdc, 0xf5, 0x87, 0x85, 0x6b, 0xcc, 0x88, 0xbf, 0xfb, 0xd0, 0x1f, 0x62, 0xca, - 0x41, 0x45, 0x1c, 0x3a, 0xa1, 0x34, 0xd5, 0x97, 0x8b, 0x59, 0x1f, 0x50, 0x72, 0xcc, 0xb9, 0xd0, - 0x7d, 0x5d, 0xcb, 0x6b, 0x63, 0x8e, 0xe4, 0x68, 0x20, 0xb9, 0x9a, 0xde, 0x87, 0xb6, 0x43, 0xa7, - 0x7e, 0xbd, 0x78, 0xe4, 0x7d, 0xb5, 0x18, 0xae, 0x1f, 0xb1, 0xe0, 0x98, 0x9b, 0xd6, 0x6d, 0xd3, - 0xda, 0xa3, 0x76, 0xcd, 0xc0, 0x1a, 0x93, 0xd6, 0xed, 0x56, 0xcc, 0x84, 0x55, 0x04, 0x74, 0x55, - 0xcc, 0x5d, 0x9a, 0x05, 0x9e, 0x25, 0xee, 0xaa, 0x78, 0xfe, 0xf2, 0x5e, 0x6a, 0xa4, 0xe5, 0x66, - 0xfc, 0xfa, 0x04, 0x28, 0x63, 0x47, 0x5b, 0x2a, 0x41, 0x3e, 0x33, 0x6a, 0x4f, 0x2a, 0x41, 0x6d, - 0x47, 0xec, 0x79, 0xa8, 0x3e, 0xf4, 0x87, 0xf9, 0x63, 0x35, 0x13, 0x77, 0xce, 0xe7, 0x93, 0xba, - 0x25, 0xe4, 0x4f, 0xe8, 0xa5, 0x4c, 0x72, 0x71, 0x94, 0x4e, 0xcf, 0x21, 0xba, 0x26, 0x06, 0xf4, - 0x37, 0x75, 0x7b, 0x7b, 0x31, 0x61, 0x6f, 0xd4, 0xc2, 0xd6, 0x7c, 0xc2, 0x4f, 0x9d, 0x29, 0x23, - 0xf9, 0xa4, 0xe3, 0xe4, 0xed, 0x68, 0xfe, 0x31, 0x95, 0xa7, 0x48, 0xf6, 0x2d, 0xc7, 0xfa, 0x46, - 0x19, 0x5a, 0xf2, 0x44, 0x6d, 0x3a, 0x3a, 0xdf, 0x72, 0x82, 0x1e, 0xb1, 0x6c, 0xe2, 0x0b, 0xbb, - 0x7d, 0xa5, 0xf0, 0xa8, 0x6e, 0xb7, 0x2f, 0x38, 0xb0, 0xe4, 0x35, 0x4f, 0x40, 0x2b, 0xca, 0xcd, - 0x59, 0x94, 0x7d, 0xbf, 0x02, 0x0d, 0x71, 0x16, 0x37, 0x59, 0x89, 0xeb, 0xd0, 0x18, 0x5a, 0xfb, - 0xde, 0x6e, 0xb4, 0x64, 0x3a, 0x53, 0x70, 0xbc, 0xb7, 0x7b, 0x97, 0x51, 0x63, 0xc1, 0x85, 0xde, - 0x86, 0xfa, 0xd0, 0xd9, 0x71, 0x42, 0xe1, 0x3e, 0x4e, 0x17, 0xb2, 0xb3, 0x53, 0x3b, 0x9c, 0x87, - 0x16, 0xce, 0x8e, 0xe0, 0x45, 0x17, 0x28, 0x0a, 0x0b, 0x7f, 0xc4, 0xa8, 0xb1, 0xe0, 0x32, 0x6f, - 0x43, 0x83, 0x57, 0x67, 0xba, 0x41, 0x42, 0x6f, 0x49, 0xac, 0xe9, 0xac, 0x6e, 0x39, 0xb3, 0xd2, - 0xe3, 0xd0, 0xe0, 0x85, 0xe7, 0x68, 0xcd, 0xf7, 0x9e, 0x63, 0xeb, 0x9d, 0xa1, 0x79, 0x37, 0xde, - 0x70, 0xfc, 0xf0, 0x7b, 0x19, 0xe6, 0x03, 0x38, 0xb8, 0x6c, 0x85, 0xd6, 0x86, 0x15, 0x10, 0x4c, - 0x06, 0x9e, 0x6f, 0x67, 0xa2, 0xfa, 0xfc, 0x93, 0x88, 0x50, 0xe7, 0xa3, 0x0a, 0xba, 0x9f, 0x84, - 0x0e, 0xff, 0xe7, 0x84, 0x0e, 0x7f, 0xaf, 0x96, 0x13, 0xcf, 0x9b, 0x24, 0x92, 0x41, 0x15, 0x2e, - 0x15, 0xd0, 0xbb, 0xaa, 0xcf, 0xbd, 0x4f, 0x15, 0x70, 0x6a, 0x93, 0xef, 0xab, 0x7a, 0x44, 0xaf, - 0x88, 0x57, 0x0b, 0xe9, 0xdd, 0x4c, 0x86, 0xf4, 0xce, 0x14, 0x70, 0xa7, 0x62, 0x7a, 0x57, 0xf5, - 0x98, 0x5e, 0x51, 0xe9, 0x6a, 0x50, 0xef, 0xff, 0x58, 0x18, 0xed, 0x57, 0x72, 0xc2, 0x3e, 0x1f, - 0xd7, 0xc3, 0x3e, 0x63, 0xb4, 0xe6, 0xc7, 0x15, 0xf7, 0xf9, 0xd5, 0x46, 0x4e, 0xdc, 0xe7, 0x8a, - 0x16, 0xf7, 0x19, 0x53, 0xb3, 0x64, 0xe0, 0xe7, 0xaa, 0x1e, 0xf8, 0x39, 0x55, 0xc0, 0xa9, 0x45, - 0x7e, 0xae, 0x68, 0x91, 0x9f, 0xa2, 0x42, 0x95, 0xd0, 0xcf, 0x15, 0x2d, 0xf4, 0x53, 0xc4, 0xa8, - 0xc4, 0x7e, 0xae, 0x68, 0xb1, 0x9f, 0x22, 0x46, 0x25, 0xf8, 0x73, 0x45, 0x0b, 0xfe, 0x14, 0x31, - 0x2a, 0xd1, 0x9f, 0xab, 0x7a, 0xf4, 0xa7, 0xb8, 0x7f, 0x14, 0xa1, 0xff, 0x24, 0x50, 0xf3, 0x5f, - 0x18, 0xa8, 0xf9, 0xf9, 0x6a, 0x4e, 0x00, 0x06, 0x67, 0x07, 0x60, 0xce, 0xe5, 0x4b, 0xb2, 0x38, - 0x02, 0x33, 0xf9, 0x28, 0x90, 0x0e, 0xc1, 0x5c, 0x4b, 0x84, 0x60, 0x4e, 0x17, 0x30, 0xeb, 0x31, - 0x98, 0xff, 0x35, 0x41, 0x86, 0xdf, 0x6e, 0x8c, 0x59, 0x4f, 0xbf, 0xa5, 0xae, 0xa7, 0xc7, 0x8c, - 0x64, 0xe9, 0x05, 0xf5, 0x75, 0x7d, 0x41, 0x7d, 0x76, 0x02, 0x5e, 0x6d, 0x45, 0xbd, 0x96, 0xb5, - 0xa2, 0xee, 0x4e, 0x80, 0x92, 0xbb, 0xa4, 0xbe, 0x9d, 0x5e, 0x52, 0x9f, 0x9b, 0x00, 0x2f, 0x73, - 0x4d, 0xbd, 0x96, 0xb5, 0xa6, 0x9e, 0xa4, 0x76, 0xb9, 0x8b, 0xea, 0xb7, 0xb5, 0x45, 0xf5, 0xcb, - 0x93, 0x74, 0x57, 0x3c, 0x38, 0x7c, 0x2a, 0x67, 0x55, 0xfd, 0xc6, 0x24, 0x30, 0xe3, 0x83, 0xd8, - 0x3f, 0x59, 0x17, 0xeb, 0xc5, 0xfc, 0xd6, 0x8b, 0xd0, 0x8a, 0x0e, 0xda, 0x98, 0x9f, 0x87, 0x66, - 0x74, 0x01, 0x33, 0xe3, 0xa4, 0xae, 0x58, 0xd4, 0xf1, 0xd9, 0xb3, 0x48, 0xa1, 0xeb, 0x50, 0xa3, - 0xbf, 0x84, 0x59, 0xbc, 0x32, 0xd9, 0x81, 0x1e, 0x5a, 0x08, 0x66, 0x7c, 0xe6, 0xbf, 0x1e, 0x01, - 0x50, 0xee, 0xa5, 0x4d, 0x5a, 0xec, 0xbb, 0xd4, 0x99, 0x0d, 0x43, 0xe2, 0xb3, 0x83, 0x5c, 0x85, - 0xf7, 0xb6, 0xe2, 0x12, 0xa8, 0xb6, 0x84, 0xc4, 0xc7, 0x82, 0x1d, 0xdd, 0x83, 0x56, 0x14, 0x48, - 0x65, 0x47, 0x9e, 0xf3, 0x94, 0x2c, 0x0b, 0x2a, 0x0a, 0xed, 0x61, 0x09, 0x81, 0x16, 0xa0, 0x16, - 0x78, 0x7e, 0x28, 0xce, 0x47, 0xbf, 0x36, 0x31, 0xd4, 0xba, 0xe7, 0x87, 0x98, 0xb1, 0xf2, 0xa6, - 0x29, 0xd7, 0xfe, 0xa7, 0x69, 0x9a, 0xe6, 0xb1, 0xff, 0xa5, 0x2a, 0x7d, 0xe8, 0x92, 0xb0, 0x46, - 0xae, 0x43, 0xe7, 0x27, 0x97, 0x92, 0x6a, 0x95, 0x48, 0x4c, 0x82, 0xb8, 0x24, 0xf8, 0xfc, 0xe6, - 0x15, 0xe8, 0x0c, 0xbc, 0x3d, 0xe2, 0xe3, 0xf8, 0x88, 0x93, 0x38, 0x85, 0x96, 0xca, 0x47, 0x26, - 0xb4, 0xb6, 0x1d, 0x9b, 0xf4, 0x07, 0xc2, 0xff, 0xb5, 0xb0, 0x4c, 0xa3, 0x3b, 0xd0, 0x62, 0x31, - 0xf6, 0x28, 0xc2, 0x3f, 0x5d, 0x25, 0x79, 0xa8, 0x3f, 0x02, 0xa0, 0x05, 0xb1, 0xc2, 0x6f, 0x39, - 0x21, 0xeb, 0xc3, 0x16, 0x96, 0x69, 0x5a, 0x61, 0x76, 0x8e, 0x4c, 0xad, 0x70, 0x93, 0x57, 0x38, - 0x99, 0x8f, 0x2e, 0xc1, 0x33, 0x2c, 0x2f, 0xb1, 0xc4, 0xe4, 0xa1, 0xfa, 0x16, 0xce, 0xfe, 0xc8, - 0xce, 0xcd, 0x59, 0x5b, 0xfc, 0x92, 0x0f, 0x0b, 0xde, 0xd5, 0x71, 0x9c, 0x81, 0xce, 0xc1, 0x21, - 0x9b, 0x6c, 0x5a, 0xbb, 0xc3, 0xf0, 0x01, 0xd9, 0x19, 0x0d, 0xad, 0x90, 0xf4, 0x6d, 0xf6, 0xf2, - 0x40, 0x1b, 0xa7, 0x3f, 0xa0, 0xd7, 0xe1, 0xb0, 0xc8, 0xe4, 0x66, 0x4c, 0xa5, 0xd1, 0xb7, 0xd9, - 0x45, 0xfc, 0x36, 0xce, 0xfa, 0x64, 0x7e, 0xaf, 0x46, 0x85, 0xce, 0x54, 0xfb, 0x5d, 0xa8, 0x5a, - 0xb6, 0x2d, 0x86, 0xcd, 0x8b, 0x53, 0x1a, 0x88, 0xb8, 0x39, 0x42, 0x11, 0xd0, 0x9a, 0x3c, 0x72, - 0xc7, 0x07, 0xce, 0xcb, 0xd3, 0x62, 0xc9, 0x07, 0x51, 0x04, 0x0e, 0x45, 0xdc, 0xe5, 0x37, 0x29, - 0xaa, 0x3f, 0x1a, 0xa2, 0xbc, 0x9e, 0x22, 0x70, 0xd0, 0x6d, 0xa8, 0xb1, 0x1a, 0xf2, 0x81, 0xf5, - 0xd2, 0xb4, 0x78, 0xf7, 0x78, 0xfd, 0x18, 0x86, 0x39, 0xe0, 0x67, 0xdf, 0x94, 0x03, 0x97, 0x65, - 0xfd, 0xc0, 0xe5, 0x22, 0xd4, 0x9d, 0x90, 0xec, 0xa4, 0xcf, 0xdf, 0x8e, 0x55, 0x55, 0xe1, 0x79, - 0x38, 0xeb, 0xd8, 0x73, 0x80, 0xef, 0xe7, 0x5e, 0x67, 0xb8, 0x09, 0x35, 0xca, 0x9e, 0x9a, 0x4b, - 0x4e, 0x52, 0x30, 0xe3, 0x34, 0x2f, 0x40, 0x8d, 0x36, 0x76, 0x4c, 0xeb, 0x44, 0x7d, 0x2a, 0xb2, - 0x3e, 0x8b, 0x33, 0xd0, 0xf6, 0x46, 0xc4, 0x67, 0x86, 0x61, 0xfe, 0x73, 0x4d, 0x39, 0x14, 0xd7, - 0x57, 0x75, 0xec, 0xcd, 0xa9, 0x3d, 0xa7, 0xaa, 0x65, 0x38, 0xa1, 0x65, 0x6f, 0x4d, 0x8f, 0x96, - 0xd2, 0x33, 0x9c, 0xd0, 0xb3, 0x1f, 0x01, 0x33, 0xa5, 0x69, 0x77, 0x35, 0x4d, 0xbb, 0x3c, 0x3d, - 0xa2, 0xa6, 0x6b, 0xa4, 0x48, 0xd7, 0x96, 0x75, 0x5d, 0xeb, 0x4e, 0x26, 0x72, 0x39, 0x34, 0x4d, - 0xa0, 0x6d, 0x9f, 0xc9, 0xd5, 0xb6, 0x45, 0x4d, 0xdb, 0xa6, 0x2d, 0xfa, 0x23, 0xd2, 0xb7, 0xef, - 0xd4, 0xa0, 0x46, 0x87, 0x47, 0xb4, 0xa2, 0xea, 0xda, 0x1b, 0x53, 0x0d, 0xad, 0xaa, 0x9e, 0xad, - 0x26, 0xf4, 0xec, 0xd2, 0x74, 0x48, 0x29, 0x1d, 0x5b, 0x4d, 0xe8, 0xd8, 0x94, 0x78, 0x29, 0xfd, - 0xea, 0x69, 0xfa, 0x75, 0x61, 0x3a, 0x34, 0x4d, 0xb7, 0xac, 0x22, 0xdd, 0xba, 0xa9, 0xeb, 0xd6, - 0x84, 0xb3, 0x37, 0x36, 0x57, 0x99, 0x40, 0xaf, 0xde, 0xcb, 0xd5, 0xab, 0xeb, 0x9a, 0x5e, 0x4d, - 0x53, 0xec, 0x47, 0xa4, 0x53, 0x97, 0xf8, 0xa4, 0x33, 0xff, 0x56, 0x5a, 0xd6, 0xa4, 0xd3, 0x7c, - 0x13, 0xda, 0xf1, 0xc3, 0x1e, 0x19, 0xc7, 0xf3, 0x39, 0x59, 0x54, 0x6a, 0x94, 0x34, 0x2f, 0x42, - 0x3b, 0x7e, 0xac, 0x23, 0xeb, 0x06, 0x1c, 0xfb, 0x28, 0x6f, 0x4f, 0xb1, 0x94, 0xb9, 0x02, 0x87, - 0xd2, 0x4f, 0x09, 0x64, 0xc4, 0xe1, 0x95, 0xb3, 0xe5, 0xd1, 0xed, 0x15, 0x25, 0xcb, 0x7c, 0x02, - 0x73, 0x89, 0xc7, 0x01, 0xa6, 0xc6, 0x40, 0x17, 0x95, 0x29, 0x72, 0x35, 0x71, 0xd5, 0x54, 0x3f, - 0x2d, 0x1f, 0x4f, 0x84, 0xcd, 0x65, 0x98, 0x2b, 0xa8, 0xfc, 0x24, 0x87, 0xe5, 0x3f, 0x0b, 0x33, - 0xe3, 0xea, 0xfe, 0x11, 0x1c, 0xe6, 0x0f, 0xa1, 0x93, 0x7a, 0xd8, 0x24, 0x59, 0xcc, 0x1a, 0xc0, - 0x96, 0xa4, 0x11, 0x4a, 0xfb, 0xfa, 0x14, 0x57, 0x17, 0x18, 0x1f, 0x56, 0x30, 0xcc, 0xdf, 0x2c, - 0xc3, 0xa1, 0xf4, 0xab, 0x26, 0x93, 0x2e, 0x7e, 0x0c, 0x68, 0x32, 0x2c, 0x79, 0xe3, 0x23, 0x4a, - 0xa2, 0x7b, 0x30, 0x1b, 0x0c, 0x9d, 0x01, 0x59, 0xda, 0xb6, 0xdc, 0x2d, 0x12, 0x88, 0x15, 0x4d, - 0xc1, 0xcb, 0x24, 0xeb, 0x31, 0x07, 0xd6, 0xd8, 0xcd, 0x27, 0x30, 0xa3, 0x7c, 0x44, 0xef, 0x40, - 0xc5, 0x1b, 0xa5, 0xce, 0x35, 0xe6, 0x63, 0xde, 0x8f, 0xec, 0x0d, 0x57, 0xbc, 0x51, 0xda, 0x24, - 0x55, 0xf3, 0xad, 0x6a, 0xe6, 0x6b, 0xde, 0x81, 0x43, 0xe9, 0x87, 0x43, 0x92, 0xdd, 0x73, 0x26, - 0x15, 0x25, 0xe0, 0xdd, 0x94, 0x5c, 0xf2, 0x5f, 0x81, 0x83, 0xc9, 0xe7, 0x40, 0x32, 0x6e, 0xe3, - 0xc4, 0x97, 0x9a, 0xa2, 0x70, 0xfd, 0xfc, 0xcf, 0x95, 0x61, 0x4e, 0x6f, 0x08, 0x3a, 0x0a, 0x48, - 0xcf, 0x59, 0xf5, 0x5c, 0xd2, 0x29, 0xa1, 0x67, 0xe0, 0x90, 0x9e, 0xbf, 0x60, 0xdb, 0x9d, 0x72, - 0x9a, 0x9c, 0xba, 0xad, 0x4e, 0x05, 0x19, 0x70, 0x24, 0xd1, 0x43, 0xcc, 0x89, 0x76, 0xaa, 0xe8, - 0x39, 0x78, 0x26, 0xf9, 0x65, 0x34, 0xb4, 0x06, 0xa4, 0x53, 0x33, 0x7f, 0x58, 0x81, 0xda, 0xc3, - 0x80, 0xf8, 0xe6, 0x3f, 0x56, 0xa2, 0x5b, 0x1a, 0x6f, 0x41, 0x8d, 0xbd, 0xd4, 0xa1, 0xdc, 0xa0, - 0x2c, 0x27, 0x6e, 0x50, 0x6a, 0xb7, 0xf0, 0xe2, 0x1b, 0x94, 0x6f, 0x41, 0x8d, 0xbd, 0xcd, 0x31, - 0x3d, 0xe7, 0xd7, 0xcb, 0xd0, 0x8e, 0xdf, 0xc9, 0x98, 0x9a, 0x5f, 0xbd, 0x15, 0x52, 0xd1, 0x6f, - 0x85, 0xbc, 0x02, 0x75, 0x9f, 0xdd, 0xdf, 0xe0, 0x5e, 0x26, 0x79, 0xd7, 0x84, 0x15, 0x88, 0x39, - 0x89, 0x49, 0x60, 0x46, 0x7d, 0x05, 0x64, 0xfa, 0x6a, 0x9c, 0x12, 0x4f, 0x80, 0xf5, 0xed, 0x60, - 0xc1, 0xf7, 0xad, 0x7d, 0xa1, 0x98, 0x7a, 0xa6, 0x79, 0x0c, 0x6a, 0x6b, 0x8e, 0xbb, 0x95, 0x7d, - 0x71, 0xd5, 0xfc, 0xfd, 0x32, 0x34, 0xc5, 0xe1, 0x5d, 0xf3, 0x0a, 0x54, 0x57, 0xc9, 0x13, 0x5a, - 0x11, 0x71, 0x6c, 0x38, 0x55, 0x91, 0x7b, 0xac, 0x15, 0x82, 0x1e, 0x47, 0x64, 0xe6, 0x55, 0x39, - 0x4c, 0x4e, 0xcf, 0xfb, 0x16, 0xd4, 0xd8, 0xe3, 0x1d, 0xd3, 0x73, 0xfe, 0x41, 0x0b, 0x1a, 0xfc, - 0xf6, 0xa7, 0xf9, 0x3b, 0x2d, 0x68, 0xf0, 0x07, 0x3d, 0xd0, 0x75, 0x68, 0x06, 0xbb, 0x3b, 0x3b, - 0x96, 0xbf, 0x6f, 0x64, 0x5f, 0xbc, 0xd7, 0xde, 0xff, 0xe8, 0xae, 0x73, 0x5a, 0x1c, 0x31, 0xa1, - 0x37, 0xa1, 0x36, 0xb0, 0x36, 0x49, 0x6a, 0x3b, 0x37, 0x8b, 0x79, 0xc9, 0xda, 0x24, 0x98, 0x91, - 0xa3, 0x9b, 0xd0, 0x12, 0x62, 0x09, 0x44, 0x3c, 0x67, 0x7c, 0xb9, 0x91, 0x30, 0x25, 0x97, 0x79, - 0x1b, 0x9a, 0xa2, 0x32, 0xe8, 0x86, 0xbc, 0xfb, 0x9a, 0x8c, 0x3c, 0x67, 0x36, 0x41, 0xbe, 0xf4, - 0x20, 0x6f, 0xc1, 0xfe, 0x59, 0x05, 0x6a, 0xb4, 0x72, 0x1f, 0x1a, 0x09, 0x1d, 0x07, 0x18, 0x5a, - 0x41, 0xb8, 0xb6, 0x3b, 0x1c, 0x12, 0x5b, 0xdc, 0xb0, 0x53, 0x72, 0xd0, 0x59, 0x38, 0xc8, 0x53, - 0xc1, 0xf6, 0xfa, 0xee, 0x60, 0x40, 0xe4, 0xcd, 0xd2, 0x64, 0x36, 0x5a, 0x80, 0x3a, 0x7b, 0x62, - 0x52, 0xcc, 0x0a, 0x5f, 0x2d, 0xec, 0xd9, 0xee, 0x9a, 0xe3, 0x8a, 0xda, 0x70, 0x4e, 0xd3, 0x83, - 0xb6, 0xcc, 0xa3, 0x46, 0x38, 0x72, 0x5c, 0xd7, 0x71, 0xb7, 0x84, 0x46, 0x47, 0x49, 0x3a, 0xe8, - 0xd0, 0x9f, 0xa2, 0xbe, 0x75, 0x2c, 0x52, 0x34, 0x7f, 0xd3, 0x72, 0x86, 0xa2, 0x8a, 0x75, 0x2c, - 0x52, 0x14, 0x69, 0x57, 0x3c, 0x83, 0x52, 0x63, 0x0d, 0x8c, 0x92, 0xe6, 0x07, 0x65, 0x79, 0x01, - 0x3c, 0xeb, 0x72, 0x66, 0x2a, 0x96, 0x74, 0x4c, 0x0d, 0x68, 0xf3, 0x01, 0x41, 0x09, 0x51, 0x1f, - 0x85, 0x86, 0xe7, 0x0e, 0x1d, 0x97, 0x88, 0xd8, 0x91, 0x48, 0x25, 0xfa, 0xb8, 0x9e, 0xea, 0x63, - 0xf1, 0x7d, 0xc5, 0x76, 0x68, 0x15, 0x1b, 0xf1, 0x77, 0x9e, 0x83, 0xae, 0x41, 0xd3, 0x26, 0x7b, - 0xce, 0x80, 0x04, 0x46, 0x93, 0xa9, 0xde, 0xc9, 0xb1, 0x7d, 0xbb, 0xcc, 0x68, 0x71, 0xc4, 0x63, - 0x86, 0xd0, 0xe0, 0x59, 0xb2, 0x49, 0x65, 0xa5, 0x49, 0x71, 0xa5, 0x2b, 0x63, 0x2a, 0x5d, 0x2d, - 0xa8, 0x74, 0x2d, 0x59, 0xe9, 0xf9, 0x2f, 0x01, 0xc4, 0xea, 0x86, 0x66, 0xa0, 0xf9, 0xd0, 0x7d, - 0xec, 0x7a, 0x4f, 0xdc, 0x4e, 0x89, 0x26, 0xee, 0x6f, 0x6e, 0xd2, 0x52, 0x3a, 0x65, 0x9a, 0xa0, - 0x74, 0x8e, 0xbb, 0xd5, 0xa9, 0x20, 0x80, 0x06, 0x4d, 0x10, 0xbb, 0x53, 0xa5, 0xbf, 0x6f, 0x31, - 0xf9, 0x75, 0x6a, 0xe8, 0x59, 0x38, 0xdc, 0x77, 0x07, 0xde, 0xce, 0xc8, 0x0a, 0x9d, 0x8d, 0x21, - 0x79, 0x44, 0xfc, 0xc0, 0xf1, 0xdc, 0x4e, 0x9d, 0x8e, 0x5e, 0xab, 0x24, 0x7c, 0xe2, 0xf9, 0x8f, - 0x57, 0x09, 0xb1, 0xc5, 0xeb, 0x25, 0x9d, 0x86, 0xf9, 0x1f, 0x65, 0xbe, 0x1b, 0x6c, 0xde, 0x84, - 0x59, 0xed, 0xbd, 0x1e, 0x23, 0x7e, 0x3d, 0x3c, 0xf1, 0x78, 0xf8, 0x51, 0x16, 0xaf, 0x25, 0xf1, - 0x54, 0x86, 0xa7, 0xcc, 0x5b, 0x00, 0xca, 0x2b, 0x3d, 0xc7, 0x01, 0x36, 0xf6, 0x43, 0x12, 0xf0, - 0x17, 0x7a, 0x28, 0x44, 0x0d, 0x2b, 0x39, 0x2a, 0x7e, 0x45, 0xc3, 0x37, 0x2f, 0x03, 0x28, 0x6f, - 0xf4, 0x50, 0xbb, 0xa2, 0xa9, 0xc5, 0x24, 0x58, 0x32, 0xdb, 0xec, 0x8a, 0x16, 0x44, 0xaf, 0xf1, - 0x44, 0x35, 0xe0, 0xd1, 0x3b, 0xb5, 0x06, 0x2c, 0xc7, 0x5c, 0x01, 0x88, 0x1f, 0xa4, 0x31, 0xaf, - 0x48, 0xd7, 0xfd, 0x1a, 0xd4, 0x6c, 0x2b, 0xb4, 0x84, 0xd7, 0x7c, 0x2e, 0x31, 0x72, 0xc5, 0x2c, - 0x98, 0x91, 0x99, 0xbf, 0x51, 0x86, 0x59, 0xf5, 0xf1, 0x1d, 0xf3, 0x5d, 0xa8, 0xb1, 0xd7, 0x7b, - 0x6e, 0xc0, 0xac, 0xfa, 0xfa, 0x4e, 0xea, 0x95, 0x75, 0x8e, 0xa7, 0xb2, 0x62, 0x8d, 0xc1, 0xec, - 0xcb, 0x2a, 0x7d, 0x68, 0xa8, 0xd7, 0xa1, 0x29, 0x1e, 0xf3, 0x31, 0x4f, 0x43, 0x3b, 0x7e, 0xbb, - 0x87, 0xfa, 0x0e, 0x9e, 0x1f, 0x49, 0x59, 0x24, 0xcd, 0x7f, 0xaa, 0x42, 0x9d, 0x89, 0xd3, 0xfc, - 0x6a, 0x45, 0xd5, 0x50, 0xf3, 0x87, 0xe5, 0xdc, 0xb5, 0xe0, 0x45, 0xed, 0xa9, 0x82, 0xb9, 0xd4, - 0x9b, 0x55, 0xe2, 0xa9, 0x1e, 0xdd, 0xb1, 0x5e, 0x86, 0xa6, 0xcb, 0x35, 0x53, 0xbc, 0x14, 0x70, - 0x2c, 0x93, 0x4b, 0x68, 0x2f, 0x8e, 0x88, 0xd1, 0x25, 0xa8, 0x13, 0xdf, 0xf7, 0x7c, 0x66, 0x52, - 0x73, 0xa9, 0xd7, 0x9f, 0xe2, 0x67, 0x81, 0x56, 0x28, 0x15, 0xe6, 0xc4, 0xe8, 0x12, 0x3c, 0x13, - 0x70, 0x2b, 0xe2, 0x73, 0xca, 0x40, 0xdc, 0xab, 0x16, 0xde, 0x26, 0xfb, 0xe3, 0xfc, 0x27, 0xa2, - 0x01, 0x56, 0x31, 0xbc, 0x92, 0x6a, 0x91, 0x65, 0xd4, 0x86, 0x3a, 0x2b, 0xa8, 0x53, 0x51, 0xcd, - 0xb6, 0x9a, 0x63, 0x78, 0xb5, 0xf9, 0x8b, 0xd0, 0x14, 0xf9, 0x94, 0x7e, 0x81, 0xd7, 0xbd, 0x53, - 0x42, 0xb3, 0xd0, 0x5a, 0x27, 0xc3, 0xcd, 0x9e, 0x17, 0x84, 0x9d, 0x32, 0x3a, 0x00, 0x6d, 0x66, - 0x0b, 0xf7, 0xdd, 0xe1, 0x7e, 0xa7, 0x32, 0xff, 0x1e, 0xb4, 0x65, 0x8b, 0x50, 0x0b, 0x6a, 0xab, - 0xbb, 0xc3, 0x61, 0xa7, 0xc4, 0xa6, 0xa6, 0xa1, 0xe7, 0x47, 0x81, 0xe9, 0x95, 0xa7, 0x74, 0x9c, - 0xe9, 0x94, 0xf3, 0xbc, 0x41, 0x05, 0x75, 0x60, 0x56, 0x14, 0xce, 0xeb, 0x5c, 0x35, 0xbf, 0x5b, - 0x86, 0xb6, 0x7c, 0xef, 0x88, 0xce, 0x0b, 0x23, 0x19, 0xe7, 0xfb, 0x81, 0x2b, 0x09, 0x69, 0xe7, - 0x3f, 0x9f, 0x94, 0x90, 0xf8, 0x19, 0x98, 0x13, 0x2e, 0x37, 0xea, 0x7c, 0xee, 0x35, 0x13, 0xb9, - 0xf3, 0xb7, 0x65, 0xaf, 0x77, 0x98, 0x89, 0x2d, 0x79, 0xae, 0x4b, 0x06, 0x21, 0xeb, 0xfb, 0x83, - 0x30, 0xb3, 0xea, 0x85, 0x6b, 0x5e, 0x10, 0xd0, 0x96, 0xf1, 0x9e, 0x8a, 0xbf, 0x57, 0xd0, 0x1c, - 0x40, 0x74, 0xd6, 0x8c, 0x3a, 0x49, 0xf3, 0xd7, 0xcb, 0xd0, 0xe0, 0xaf, 0x30, 0x99, 0xbf, 0x54, - 0x86, 0x86, 0x78, 0x79, 0xe9, 0x15, 0xe8, 0xf8, 0x1e, 0x05, 0x8e, 0x16, 0x14, 0xfd, 0x65, 0xd1, - 0xca, 0x54, 0x3e, 0x5d, 0xe3, 0x7a, 0x8a, 0x56, 0x88, 0x29, 0x80, 0x96, 0x87, 0xae, 0x02, 0xf0, - 0x97, 0x9d, 0x1e, 0xec, 0xcb, 0x87, 0x2f, 0x92, 0x47, 0xcc, 0xc4, 0x5b, 0x50, 0x6c, 0x33, 0x46, - 0xa1, 0x9e, 0xff, 0x22, 0x1c, 0xc0, 0x24, 0x18, 0x79, 0x6e, 0x40, 0x7e, 0x5c, 0xff, 0x6d, 0x22, - 0xf7, 0xff, 0x46, 0xcc, 0x7f, 0xa7, 0x0e, 0x75, 0x36, 0xbb, 0x34, 0xff, 0xbc, 0x2e, 0xe7, 0xc1, - 0x29, 0xfb, 0xbe, 0xa0, 0x1e, 0xf4, 0x51, 0x0d, 0x55, 0x9b, 0x98, 0xea, 0x07, 0x7c, 0xde, 0x86, - 0xd6, 0xc8, 0xf7, 0xb6, 0x7c, 0x3a, 0x9f, 0xad, 0x25, 0x5e, 0x5a, 0xd2, 0xd9, 0xd6, 0x04, 0x19, - 0x96, 0x0c, 0xaa, 0xf2, 0xd5, 0x75, 0xe5, 0xbb, 0x09, 0x6d, 0xdb, 0xf7, 0x46, 0xec, 0x8a, 0xba, - 0xd8, 0x5c, 0x3b, 0x91, 0x83, 0xbb, 0x1c, 0xd1, 0xf5, 0x4a, 0x38, 0x66, 0xa2, 0xea, 0xcb, 0x7b, - 0x5f, 0xec, 0x6b, 0xbf, 0x90, 0xc3, 0xce, 0xe5, 0xd5, 0x2b, 0x61, 0x41, 0x4e, 0x19, 0xc9, 0x53, - 0xc6, 0xd8, 0x1a, 0xcb, 0xb8, 0xf2, 0x34, 0x62, 0xe4, 0xe4, 0xe8, 0x1a, 0xb4, 0x02, 0x6b, 0x8f, - 0xb0, 0xb7, 0xa5, 0xdb, 0x63, 0xbb, 0x62, 0x5d, 0x90, 0xf5, 0x4a, 0x58, 0xb2, 0xd0, 0x26, 0xef, - 0x38, 0x5b, 0x7c, 0x25, 0x29, 0x1e, 0xb8, 0xce, 0x6b, 0xf2, 0xbd, 0x88, 0x8e, 0xbd, 0x46, 0x1e, - 0x25, 0xe8, 0xca, 0x87, 0xbb, 0xcc, 0x19, 0xbe, 0x6d, 0xcc, 0x12, 0xe6, 0x0c, 0xb4, 0x65, 0x17, - 0x99, 0x2d, 0x69, 0x26, 0x2d, 0x68, 0xf0, 0x16, 0x98, 0x00, 0xad, 0xa8, 0x42, 0x94, 0x58, 0x82, - 0x9b, 0xab, 0xd0, 0x8a, 0x84, 0x96, 0xf3, 0x2c, 0x05, 0x82, 0x9a, 0xed, 0x89, 0x29, 0x53, 0x15, - 0xb3, 0xdf, 0x54, 0xa8, 0xea, 0x6b, 0x56, 0x6d, 0xf9, 0x54, 0xd3, 0xfc, 0x42, 0x74, 0x5e, 0x89, - 0xba, 0x36, 0xbe, 0x18, 0x9f, 0x81, 0x26, 0xde, 0x65, 0xb3, 0xd9, 0x4e, 0x99, 0x66, 0xd3, 0x25, - 0x52, 0xa7, 0x42, 0xbd, 0xe4, 0x92, 0xe5, 0x0e, 0xc8, 0x90, 0xcd, 0x80, 0xa4, 0xef, 0xad, 0x2d, - 0xb6, 0x25, 0xf8, 0xe2, 0xb1, 0xbf, 0xf8, 0xe0, 0x78, 0xf9, 0xdb, 0x1f, 0x1c, 0x2f, 0x7f, 0xff, - 0x83, 0xe3, 0xe5, 0x5f, 0xfc, 0xc1, 0xf1, 0xd2, 0xb7, 0x7f, 0x70, 0xbc, 0xf4, 0x77, 0x3f, 0x38, - 0x5e, 0x7a, 0xbf, 0x32, 0xda, 0xd8, 0x68, 0xb0, 0x33, 0x27, 0x17, 0xff, 0x33, 0x00, 0x00, 0xff, - 0xff, 0x44, 0x23, 0x56, 0xe9, 0x44, 0x66, 0x00, 0x00, + // 6409 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5d, 0x59, 0x8c, 0x1c, 0xc7, + 0x79, 0x9e, 0xfb, 0xf8, 0x77, 0xb9, 0x1c, 0x16, 0x29, 0xaa, 0xd5, 0xa2, 0x28, 0x6a, 0x79, 0x88, + 0x96, 0xa8, 0xa1, 0x44, 0x52, 0xa4, 0x4c, 0x89, 0xc7, 0x5e, 0xd4, 0x0c, 0x8f, 0xe5, 0xba, 0x96, + 0xa4, 0x65, 0xd9, 0x08, 0xdc, 0x3b, 0x5d, 0xbb, 0xdb, 0xe6, 0x6c, 0xf7, 0xb8, 0xbb, 0x77, 0xc9, + 0xf5, 0x15, 0xc7, 0x47, 0x82, 0x00, 0x09, 0x92, 0x87, 0x20, 0x09, 0xf2, 0x12, 0x20, 0x88, 0x81, + 0x3c, 0x04, 0x41, 0x80, 0x20, 0x40, 0xf2, 0x92, 0x04, 0x08, 0x72, 0x27, 0x80, 0xfd, 0x96, 0x17, + 0xc7, 0x8e, 0xfc, 0x92, 0x97, 0x3c, 0x38, 0x01, 0x82, 0x3c, 0x06, 0x75, 0x74, 0x75, 0x55, 0x1f, + 0xd3, 0x33, 0x96, 0x9c, 0x03, 0xf1, 0xd3, 0x4e, 0x55, 0xfd, 0xdf, 0x57, 0xd7, 0x5f, 0x7f, 0x55, + 0xfd, 0x55, 0x5d, 0x0b, 0x47, 0x47, 0x1b, 0xe7, 0x47, 0xbe, 0x17, 0x7a, 0xc1, 0x79, 0xb2, 0x47, + 0xdc, 0x30, 0xe8, 0xb2, 0x10, 0x6a, 0x5a, 0xee, 0x7e, 0xb8, 0x3f, 0x22, 0xe6, 0xa9, 0xd1, 0xe3, + 0xad, 0xf3, 0x43, 0x67, 0xe3, 0xfc, 0x68, 0xe3, 0xfc, 0x8e, 0x67, 0x93, 0x61, 0x24, 0xce, 0x02, + 0x42, 0xdc, 0x3c, 0xb6, 0xe5, 0x79, 0x5b, 0x43, 0xc2, 0xd3, 0x36, 0x76, 0x37, 0xcf, 0x07, 0xa1, + 0xbf, 0x3b, 0x08, 0x79, 0xea, 0xfc, 0x1f, 0xfe, 0x65, 0x19, 0xea, 0x2b, 0x94, 0x1e, 0x5d, 0x80, + 0xd6, 0x0e, 0x09, 0x02, 0x6b, 0x8b, 0x04, 0x46, 0xf9, 0x44, 0xf5, 0xec, 0xcc, 0x85, 0xa3, 0x5d, + 0x91, 0x55, 0x97, 0x49, 0x74, 0xef, 0xf1, 0x64, 0x2c, 0xe5, 0xd0, 0x31, 0x68, 0x0f, 0x3c, 0x37, + 0x24, 0x4f, 0xc3, 0xbe, 0x6d, 0x54, 0x4e, 0x94, 0xcf, 0xb6, 0x71, 0x1c, 0x81, 0x2e, 0x41, 0xdb, + 0x71, 0x9d, 0xd0, 0xb1, 0x42, 0xcf, 0x37, 0xaa, 0x27, 0xca, 0x1a, 0x25, 0x2b, 0x64, 0x77, 0x61, + 0x30, 0xf0, 0x76, 0xdd, 0x10, 0xc7, 0x82, 0xc8, 0x80, 0x66, 0xe8, 0x5b, 0x03, 0xd2, 0xb7, 0x8d, + 0x1a, 0x63, 0x8c, 0x82, 0xe6, 0xb7, 0x2f, 0x42, 0x53, 0x94, 0x01, 0x3d, 0x07, 0xcd, 0x60, 0xc4, + 0xa5, 0xbe, 0x51, 0xe6, 0x62, 0x22, 0x8c, 0x6e, 0xc0, 0x8c, 0xc5, 0x69, 0xd7, 0xb7, 0xbd, 0x27, + 0x46, 0x99, 0x65, 0xfc, 0x7c, 0xa2, 0x2e, 0x22, 0xe3, 0x2e, 0x15, 0xe9, 0x95, 0xb0, 0x8a, 0x40, + 0x7d, 0x98, 0x13, 0xc1, 0x65, 0x12, 0x5a, 0xce, 0x30, 0x30, 0xfe, 0x86, 0x93, 0x1c, 0xcf, 0x21, + 0x11, 0x62, 0xbd, 0x12, 0x4e, 0x00, 0xd1, 0xa7, 0xe0, 0xb0, 0x88, 0x59, 0xf2, 0xdc, 0x4d, 0x67, + 0xeb, 0xe1, 0xc8, 0xb6, 0x42, 0x62, 0xfc, 0x2d, 0xe7, 0x3b, 0x95, 0xc3, 0xc7, 0x65, 0xbb, 0x5c, + 0xb8, 0x57, 0xc2, 0x59, 0x1c, 0xe8, 0x16, 0x1c, 0x10, 0xd1, 0x82, 0xf4, 0xef, 0x38, 0xe9, 0x0b, + 0x39, 0xa4, 0x92, 0x4d, 0x87, 0xa1, 0x4f, 0xc3, 0x11, 0x11, 0x71, 0xd7, 0x71, 0x1f, 0x2f, 0x6d, + 0x5b, 0xc3, 0x21, 0x71, 0xb7, 0x88, 0xf1, 0xf7, 0xe3, 0xcb, 0xa8, 0x09, 0xf7, 0x4a, 0x38, 0x93, + 0x04, 0x6d, 0x81, 0x91, 0x15, 0xdf, 0x73, 0x6c, 0x62, 0xfc, 0x03, 0xcf, 0xe0, 0xec, 0x44, 0x19, + 0x38, 0x36, 0xcd, 0x24, 0x97, 0x0c, 0xdd, 0x87, 0x8e, 0xb7, 0xf1, 0x39, 0x32, 0x88, 0x5a, 0x7e, + 0x9d, 0x84, 0x46, 0x87, 0xf1, 0xbf, 0x94, 0xe0, 0xbf, 0xcf, 0xc4, 0xa2, 0x3e, 0xeb, 0xae, 0x93, + 0xb0, 0x57, 0xc2, 0x29, 0x30, 0x7a, 0x08, 0x48, 0x8b, 0x5b, 0xd8, 0x21, 0xae, 0x6d, 0x5c, 0x60, + 0x94, 0x27, 0xc7, 0x53, 0x32, 0xd1, 0x5e, 0x09, 0x67, 0x10, 0xa4, 0x68, 0x1f, 0xba, 0x01, 0x09, + 0x8d, 0x8b, 0x93, 0xd0, 0x32, 0xd1, 0x14, 0x2d, 0x8b, 0xa5, 0x9d, 0xc8, 0x63, 0x31, 0x19, 0x5a, + 0xa1, 0xe3, 0xb9, 0xa2, 0xbc, 0x97, 0x18, 0xf1, 0xe9, 0x6c, 0x62, 0x29, 0x2b, 0x4b, 0x9c, 0x49, + 0x82, 0x7e, 0x0a, 0x9e, 0x49, 0xc4, 0x63, 0xb2, 0xe3, 0xed, 0x11, 0xe3, 0x4d, 0xc6, 0x7e, 0xa6, + 0x88, 0x9d, 0x4b, 0xf7, 0x4a, 0x38, 0x9b, 0x06, 0x2d, 0xc2, 0x6c, 0x94, 0xc0, 0x68, 0x2f, 0x33, + 0xda, 0x63, 0x79, 0xb4, 0x82, 0x4c, 0xc3, 0xd0, 0x41, 0xcf, 0xc3, 0x4b, 0x43, 0x2f, 0x20, 0xc6, + 0x42, 0xe6, 0xa0, 0x17, 0x14, 0x4c, 0x84, 0x0e, 0x7a, 0x05, 0xa1, 0x56, 0x32, 0x08, 0x7d, 0x67, + 0xc0, 0x0a, 0x48, 0xb5, 0xe8, 0xca, 0xf8, 0x4a, 0xc6, 0xc2, 0x42, 0x95, 0xb2, 0x69, 0x10, 0x86, + 0x83, 0xc1, 0xee, 0x46, 0x30, 0xf0, 0x9d, 0x11, 0x8d, 0x5b, 0xb0, 0x6d, 0xe3, 0x9d, 0x71, 0xcc, + 0xeb, 0x8a, 0x70, 0x77, 0xc1, 0xa6, 0xbd, 0x93, 0x24, 0x40, 0x9f, 0x06, 0xa4, 0x46, 0x89, 0xe6, + 0xbb, 0xc6, 0x68, 0x3f, 0x36, 0x01, 0xad, 0x6c, 0xcb, 0x0c, 0x1a, 0x64, 0xc1, 0x11, 0x35, 0x76, + 0xcd, 0x0b, 0x1c, 0xfa, 0xd7, 0xb8, 0xce, 0xe8, 0x5f, 0x9d, 0x80, 0x3e, 0x82, 0x50, 0xc5, 0xca, + 0xa2, 0x4a, 0x66, 0xb1, 0x44, 0x87, 0x36, 0xf1, 0x03, 0xe3, 0xc6, 0xc4, 0x59, 0x44, 0x90, 0x64, + 0x16, 0x51, 0x7c, 0xb2, 0x89, 0xde, 0xf5, 0xbd, 0xdd, 0x51, 0x60, 0xdc, 0x9c, 0xb8, 0x89, 0x38, + 0x20, 0xd9, 0x44, 0x3c, 0x16, 0x5d, 0x86, 0xd6, 0xc6, 0xd0, 0x1b, 0x3c, 0xa6, 0x9d, 0x59, 0x61, + 0x94, 0x46, 0x82, 0x72, 0x91, 0x26, 0x8b, 0xee, 0x93, 0xb2, 0x54, 0x59, 0xd9, 0xef, 0x65, 0x32, + 0x24, 0x21, 0x11, 0x53, 0xe3, 0xf3, 0x99, 0x50, 0x2e, 0x42, 0x95, 0x55, 0x41, 0xa0, 0x65, 0x98, + 0xd9, 0x74, 0x86, 0x24, 0x78, 0x38, 0x1a, 0x7a, 0x16, 0x9f, 0x27, 0x67, 0x2e, 0x9c, 0xc8, 0x24, + 0xb8, 0x15, 0xcb, 0x51, 0x16, 0x05, 0x86, 0xae, 0x43, 0x7b, 0xc7, 0xf2, 0x1f, 0x07, 0x7d, 0x77, + 0xd3, 0x33, 0xea, 0x99, 0x33, 0x1c, 0xe7, 0xb8, 0x17, 0x49, 0xf5, 0x4a, 0x38, 0x86, 0xd0, 0x79, + 0x92, 0x15, 0x6a, 0x9d, 0x84, 0xb7, 0x1c, 0x32, 0xb4, 0x03, 0xa3, 0xc1, 0x48, 0x5e, 0xcc, 0x24, + 0x59, 0x27, 0x61, 0x97, 0x8b, 0xd1, 0x79, 0x52, 0x07, 0xa2, 0xf7, 0xe0, 0x70, 0x14, 0xb3, 0xb4, + 0xed, 0x0c, 0x6d, 0x9f, 0xb8, 0x7d, 0x3b, 0x30, 0x9a, 0x99, 0x53, 0x50, 0xcc, 0xa7, 0xc8, 0xd2, + 0x69, 0x32, 0x83, 0x82, 0x5a, 0xc6, 0x28, 0x5a, 0x1d, 0x92, 0x46, 0x2b, 0xd3, 0x32, 0xc6, 0xd4, + 0xaa, 0x30, 0xd5, 0xae, 0x2c, 0x12, 0x64, 0xc3, 0xb3, 0x51, 0xfc, 0xa2, 0x35, 0x78, 0xbc, 0xe5, + 0x7b, 0xbb, 0xae, 0xbd, 0xe4, 0x0d, 0x3d, 0xdf, 0x68, 0x67, 0x4e, 0x6e, 0x31, 0x7f, 0x42, 0xbe, + 0x57, 0xc2, 0x79, 0x54, 0x68, 0x09, 0x66, 0xa3, 0xa4, 0x07, 0xe4, 0x69, 0x68, 0x40, 0xe6, 0x3c, + 0x1f, 0x53, 0x53, 0x21, 0x6a, 0x20, 0x55, 0x90, 0x4a, 0x42, 0x55, 0xc2, 0x98, 0x29, 0x20, 0xa1, + 0x42, 0x2a, 0x09, 0x0d, 0xab, 0x24, 0x74, 0x0a, 0x36, 0x0e, 0x14, 0x90, 0x50, 0x21, 0x95, 0x84, + 0x86, 0xe9, 0x54, 0x2d, 0x6b, 0xea, 0x79, 0x8f, 0xa9, 0x3e, 0x19, 0x73, 0x99, 0x53, 0xb5, 0xd2, + 0x5a, 0x42, 0x90, 0x4e, 0xd5, 0x49, 0x30, 0x5d, 0x09, 0x45, 0x71, 0x0b, 0x43, 0x67, 0xcb, 0x35, + 0x0e, 0x8e, 0xd1, 0x65, 0xca, 0xc6, 0xa4, 0xe8, 0x4a, 0x48, 0x83, 0xa1, 0x9b, 0x62, 0x58, 0xae, + 0x93, 0x70, 0xd9, 0xd9, 0x33, 0x0e, 0x65, 0x4e, 0x43, 0x31, 0xcb, 0xb2, 0xb3, 0x27, 0xc7, 0x25, + 0x87, 0xa8, 0x55, 0x8b, 0x26, 0x39, 0xe3, 0x99, 0x82, 0xaa, 0x45, 0x82, 0x6a, 0xd5, 0xa2, 0x38, + 0xb5, 0x6a, 0x77, 0xad, 0x90, 0x3c, 0x35, 0x9e, 0x2b, 0xa8, 0x1a, 0x93, 0x52, 0xab, 0xc6, 0x22, + 0xe8, 0xec, 0x16, 0x45, 0x3c, 0x22, 0x7e, 0xe8, 0x0c, 0xac, 0x21, 0x6f, 0xaa, 0x53, 0x99, 0x73, + 0x50, 0xcc, 0xa7, 0x49, 0xd3, 0xd9, 0x2d, 0x93, 0x46, 0xad, 0xf8, 0x03, 0x6b, 0x63, 0x48, 0xb0, + 0xf7, 0xc4, 0x38, 0x5d, 0x50, 0xf1, 0x48, 0x50, 0xad, 0x78, 0x14, 0xa7, 0xda, 0x96, 0x4f, 0x3a, + 0xf6, 0x16, 0x09, 0x8d, 0xb3, 0x05, 0xb6, 0x85, 0x8b, 0xa9, 0xb6, 0x85, 0xc7, 0x48, 0x0b, 0xb0, + 0x6c, 0x85, 0xd6, 0x9e, 0x43, 0x9e, 0x3c, 0x72, 0xc8, 0x13, 0x3a, 0xb1, 0x1f, 0x1e, 0x63, 0x01, + 0x22, 0xd9, 0xae, 0x10, 0x96, 0x16, 0x20, 0x41, 0x22, 0x2d, 0x80, 0x1a, 0x2f, 0xcc, 0xfa, 0x91, + 0x31, 0x16, 0x40, 0xe3, 0x97, 0x36, 0x3e, 0x8f, 0x0a, 0x59, 0x70, 0x34, 0x95, 0x74, 0xdf, 0xb7, + 0x89, 0x6f, 0xbc, 0xc0, 0x32, 0x79, 0xb9, 0x38, 0x13, 0x26, 0xde, 0x2b, 0xe1, 0x1c, 0xa2, 0x54, + 0x16, 0xeb, 0xde, 0xae, 0x3f, 0x20, 0xb4, 0x9d, 0x4e, 0x4e, 0x92, 0x85, 0x14, 0x4f, 0x65, 0x21, + 0x53, 0xd0, 0x1e, 0xbc, 0x20, 0x53, 0x68, 0xc6, 0x6c, 0x16, 0x65, 0xb9, 0x8b, 0x1d, 0xcc, 0x19, + 0x96, 0x53, 0x77, 0x7c, 0x4e, 0x49, 0x54, 0xaf, 0x84, 0xc7, 0xd3, 0xa2, 0x7d, 0x38, 0xae, 0x09, + 0xf0, 0x79, 0x5e, 0xcd, 0xf8, 0x65, 0x96, 0xf1, 0xf9, 0xf1, 0x19, 0xa7, 0x60, 0xbd, 0x12, 0x2e, + 0x20, 0x46, 0x23, 0x78, 0x5e, 0x6b, 0x8c, 0x68, 0x60, 0x0b, 0x15, 0xf9, 0x12, 0xcb, 0xf7, 0xdc, + 0xf8, 0x7c, 0x75, 0x4c, 0xaf, 0x84, 0xc7, 0x51, 0xd2, 0x1d, 0x57, 0x66, 0x32, 0xed, 0xc9, 0x2f, + 0x66, 0x2e, 0x7b, 0x72, 0xb2, 0xe3, 0x7d, 0x99, 0x4b, 0x96, 0xa9, 0xf9, 0xa2, 0x39, 0xbf, 0x3c, + 0xa9, 0xe6, 0xcb, 0x76, 0xcc, 0xa3, 0xd2, 0xfa, 0x8e, 0x26, 0x3d, 0xb0, 0xfc, 0x2d, 0x12, 0xf2, + 0x86, 0xee, 0xdb, 0xb4, 0x52, 0x5f, 0x99, 0xa4, 0xef, 0x52, 0x30, 0xad, 0xef, 0x32, 0x89, 0x51, + 0x00, 0xc7, 0x34, 0x89, 0x7e, 0xb0, 0xe4, 0x0d, 0x87, 0x64, 0x10, 0xb5, 0xe6, 0x4f, 0xb3, 0x8c, + 0x5f, 0x1b, 0x9f, 0x71, 0x02, 0xd4, 0x2b, 0xe1, 0xb1, 0xa4, 0xa9, 0xfa, 0xde, 0x1f, 0xda, 0x09, + 0x9d, 0x31, 0x26, 0xd2, 0xd5, 0x24, 0x2c, 0x55, 0xdf, 0x94, 0x44, 0x4a, 0x57, 0x15, 0x09, 0x5a, + 0xdd, 0x67, 0x27, 0xd1, 0x55, 0x1d, 0x93, 0xd2, 0x55, 0x3d, 0x99, 0xce, 0x6e, 0xbb, 0x01, 0xf1, + 0x19, 0xc7, 0x6d, 0xcf, 0x71, 0x8d, 0x17, 0x33, 0x67, 0xb7, 0x87, 0x01, 0xf1, 0x45, 0x46, 0x54, + 0x8a, 0xce, 0x6e, 0x1a, 0x4c, 0xe3, 0xb9, 0x4b, 0x36, 0x43, 0xe3, 0x44, 0x11, 0x0f, 0x95, 0xd2, + 0x78, 0x68, 0x04, 0x9d, 0x29, 0x64, 0xc4, 0x3a, 0xa1, 0xbd, 0x82, 0x2d, 0x77, 0x8b, 0x18, 0x2f, + 0x65, 0xce, 0x14, 0x0a, 0x9d, 0x22, 0x4c, 0x67, 0x8a, 0x2c, 0x12, 0xba, 0xf3, 0x97, 0xf1, 0x74, + 0x45, 0xc6, 0xa9, 0xe7, 0x33, 0x77, 0xfe, 0x0a, 0xb5, 0x14, 0xa5, 0x7b, 0x90, 0x34, 0x01, 0xfa, + 0x18, 0xd4, 0x46, 0x8e, 0xbb, 0x65, 0xd8, 0x8c, 0xe8, 0x70, 0x82, 0x68, 0xcd, 0x71, 0xb7, 0x7a, + 0x25, 0xcc, 0x44, 0xd0, 0x3b, 0x00, 0x23, 0xdf, 0x1b, 0x90, 0x20, 0x58, 0x25, 0x4f, 0x0c, 0xc2, + 0x00, 0x66, 0x12, 0xc0, 0x05, 0xba, 0xab, 0x84, 0xce, 0xcb, 0x8a, 0x3c, 0x5a, 0x81, 0x03, 0x22, + 0x24, 0x46, 0xf9, 0x66, 0xe6, 0xe2, 0x2f, 0x22, 0x88, 0xdd, 0x4d, 0x1a, 0x8a, 0xee, 0x7d, 0x44, + 0xc4, 0xb2, 0xe7, 0x12, 0x63, 0x2b, 0x73, 0xef, 0x13, 0x91, 0x50, 0x11, 0xba, 0xc6, 0x52, 0x10, + 0x68, 0x11, 0x66, 0xc3, 0x6d, 0x9f, 0x58, 0xf6, 0x7a, 0x68, 0x85, 0xbb, 0x81, 0xe1, 0x66, 0x2e, + 0xd3, 0x78, 0x62, 0xf7, 0x01, 0x93, 0xa4, 0x4b, 0x50, 0x15, 0x83, 0x56, 0xa1, 0x43, 0x37, 0x42, + 0x77, 0x9d, 0x1d, 0x27, 0xc4, 0xc4, 0x1a, 0x6c, 0x13, 0xdb, 0xf0, 0x32, 0x37, 0x51, 0x74, 0xd9, + 0xdb, 0x55, 0xe5, 0xe8, 0x6a, 0x25, 0x89, 0x45, 0x3d, 0x98, 0xa3, 0x71, 0xeb, 0x23, 0x6b, 0x40, + 0x1e, 0x06, 0xd6, 0x16, 0x31, 0x46, 0x99, 0x1a, 0xc8, 0xd8, 0x62, 0x29, 0xba, 0x58, 0xd1, 0x71, + 0x11, 0xd3, 0x5d, 0x6f, 0x60, 0x0d, 0x39, 0xd3, 0xe7, 0xf3, 0x99, 0x62, 0xa9, 0x88, 0x29, 0x8e, + 0xd1, 0xea, 0xc8, 0xdb, 0xde, 0x36, 0xf6, 0x0a, 0xea, 0x28, 0xe4, 0xb4, 0x3a, 0x8a, 0x38, 0xca, + 0xe7, 0x7a, 0xa1, 0xb3, 0xe9, 0x0c, 0xc4, 0xf8, 0x75, 0x6d, 0xc3, 0xcf, 0xe4, 0x5b, 0x55, 0xc4, + 0xba, 0xeb, 0xdc, 0xb3, 0x94, 0xc2, 0xa2, 0x07, 0x80, 0xd4, 0x38, 0xa1, 0x54, 0x01, 0x63, 0x9c, + 0x1f, 0xc7, 0x28, 0x35, 0x2b, 0x03, 0x4f, 0x4b, 0x39, 0xb2, 0xf6, 0xe9, 0xf6, 0x76, 0xd1, 0xf7, + 0x2c, 0x7b, 0x60, 0x05, 0xa1, 0x11, 0x66, 0x96, 0x72, 0x8d, 0x8b, 0x75, 0xa5, 0x1c, 0x2d, 0x65, + 0x12, 0x4b, 0xf9, 0x76, 0xc8, 0xce, 0x06, 0xf1, 0x83, 0x6d, 0x67, 0x24, 0xca, 0xb8, 0x9b, 0xc9, + 0x77, 0x4f, 0x8a, 0xc5, 0x25, 0x4c, 0x61, 0xe9, 0x42, 0x9c, 0xf9, 0xa9, 0xd7, 0xf7, 0xdd, 0x01, + 0x57, 0x46, 0x41, 0xfa, 0x24, 0x73, 0x21, 0xce, 0x34, 0xa3, 0x1b, 0x0b, 0xc7, 0xd4, 0xd9, 0x34, + 0xe8, 0x7d, 0x38, 0xc2, 0x12, 0x16, 0x76, 0x43, 0x8f, 0xaf, 0x7f, 0x17, 0x6c, 0x9b, 0xd8, 0xc6, + 0x17, 0x32, 0x77, 0xd2, 0x9c, 0x3e, 0x21, 0xcb, 0x7c, 0x29, 0x19, 0x1c, 0xe8, 0x0e, 0x1c, 0x1c, + 0x5d, 0x18, 0x69, 0xa5, 0x7e, 0x9a, 0xb9, 0x28, 0x5f, 0xbb, 0xb0, 0x96, 0x2c, 0x6e, 0x12, 0x49, + 0x87, 0xb1, 0xb3, 0x33, 0xf2, 0xfc, 0xf0, 0x96, 0xe3, 0x3a, 0xc1, 0xb6, 0xb1, 0x9f, 0x39, 0x8c, + 0xfb, 0x4c, 0xa4, 0xcb, 0x65, 0xe8, 0x30, 0x56, 0x31, 0xe8, 0x12, 0x34, 0x07, 0xdb, 0x16, 0x2d, + 0x9d, 0xf1, 0x55, 0xee, 0x4c, 0x7e, 0x36, 0x81, 0x5f, 0xda, 0xb6, 0x42, 0xe1, 0x7e, 0x89, 0x44, + 0xd1, 0x35, 0x00, 0xfa, 0x53, 0xd4, 0xe0, 0x67, 0xca, 0x99, 0x76, 0x90, 0x01, 0x65, 0xe9, 0x15, + 0x00, 0x7a, 0x0f, 0x0e, 0xc7, 0x21, 0x6a, 0x00, 0xb8, 0x3f, 0xe1, 0x6b, 0xe5, 0x4c, 0x4b, 0xae, + 0xf0, 0x48, 0xd9, 0x5e, 0x09, 0x67, 0x51, 0xd0, 0xe9, 0x47, 0x8b, 0x8e, 0x2c, 0xdc, 0xcf, 0x66, + 0x7b, 0xe2, 0x75, 0x6a, 0x21, 0x4c, 0x3b, 0x2f, 0x8b, 0x24, 0xaa, 0xb5, 0x58, 0x44, 0x7c, 0x7d, + 0x4c, 0xad, 0xe5, 0x82, 0x41, 0x01, 0xa0, 0xbb, 0x70, 0x90, 0x86, 0x28, 0x19, 0x11, 0x2d, 0xf7, + 0xcd, 0x72, 0x66, 0xe7, 0x2b, 0xc5, 0x62, 0xd2, 0xb4, 0xf3, 0x13, 0xd0, 0xc5, 0x26, 0xd4, 0xf7, + 0xac, 0xe1, 0x2e, 0x31, 0xbf, 0x5b, 0x87, 0x1a, 0x05, 0x98, 0xff, 0x54, 0x86, 0x2a, 0xed, 0x9c, + 0x39, 0xa8, 0x38, 0xb6, 0xc1, 0x4f, 0x74, 0x2a, 0x8e, 0x8d, 0x0c, 0x68, 0x7a, 0x74, 0x3d, 0x2d, + 0xcf, 0x97, 0xa2, 0x20, 0x9a, 0x87, 0x59, 0x6b, 0x33, 0x24, 0xfe, 0x7d, 0x91, 0xdc, 0x60, 0xc9, + 0x5a, 0x1c, 0x55, 0x10, 0x71, 0x56, 0x25, 0x9c, 0x6c, 0x66, 0xe2, 0xfc, 0x89, 0xe6, 0x1d, 0x1d, + 0x6b, 0x45, 0xa2, 0xe8, 0x28, 0x34, 0x82, 0xdd, 0x8d, 0xbe, 0x1d, 0x18, 0xb5, 0x13, 0xd5, 0xb3, + 0x6d, 0x2c, 0x42, 0xe8, 0x6d, 0x98, 0xb5, 0xc9, 0x88, 0xb8, 0x36, 0x71, 0x07, 0x0e, 0x09, 0x8c, + 0x3a, 0x3b, 0x25, 0x7b, 0xb6, 0xcb, 0x4f, 0xd8, 0xba, 0xd1, 0x09, 0x5b, 0x77, 0x9d, 0x9d, 0xb0, + 0x61, 0x4d, 0xd8, 0xfc, 0x2c, 0x34, 0x44, 0x53, 0x26, 0xab, 0x18, 0x67, 0x57, 0xd1, 0xb2, 0xeb, + 0x42, 0x3d, 0xa0, 0x6d, 0x26, 0x8a, 0x6e, 0x64, 0x14, 0x9d, 0xb5, 0x29, 0xe6, 0x62, 0xe6, 0x26, + 0x34, 0x84, 0x8a, 0x26, 0x73, 0x50, 0x9a, 0xa1, 0xf2, 0xa3, 0x34, 0x43, 0x55, 0x2d, 0x97, 0xf9, + 0x65, 0x38, 0x98, 0xd4, 0xdc, 0x64, 0x86, 0x8b, 0xd0, 0xf6, 0xe5, 0xc8, 0xa8, 0x24, 0xb4, 0x37, + 0x95, 0x65, 0x57, 0x12, 0xe1, 0x18, 0x96, 0x9b, 0xfd, 0x03, 0xe8, 0xa4, 0x94, 0xbb, 0x03, 0x55, + 0xc7, 0xe6, 0xc7, 0x96, 0x6d, 0x4c, 0x7f, 0x52, 0xb4, 0x13, 0x50, 0x09, 0x96, 0x7d, 0x0b, 0x8b, + 0x50, 0x2e, 0xeb, 0x43, 0x98, 0x51, 0x74, 0x36, 0x6e, 0xfb, 0xf2, 0x44, 0x6d, 0x9f, 0xd7, 0x87, + 0xe6, 0xb7, 0x1a, 0xd0, 0x14, 0x07, 0x5a, 0xe6, 0x2a, 0xd4, 0xd8, 0xf1, 0xe2, 0x11, 0xa8, 0x3b, + 0xae, 0x4d, 0x9e, 0x32, 0xee, 0x3a, 0xe6, 0x01, 0xf4, 0x3a, 0x34, 0xc5, 0xe1, 0x96, 0x68, 0xb0, + 0xbc, 0xa3, 0xd2, 0x48, 0xcc, 0x7c, 0x1f, 0x9a, 0xd1, 0x31, 0xe3, 0x31, 0x68, 0x8f, 0x7c, 0x8f, + 0x4e, 0xd9, 0xfd, 0xa8, 0x1b, 0xe2, 0x08, 0xf4, 0x06, 0x34, 0x6d, 0x71, 0x90, 0x59, 0x11, 0x56, + 0x32, 0x47, 0x65, 0x23, 0x39, 0xf3, 0xab, 0x65, 0x68, 0xf0, 0xd3, 0x46, 0x73, 0x4f, 0xaa, 0xd5, + 0x9b, 0xd0, 0x18, 0xb0, 0x38, 0x23, 0x79, 0xd2, 0xa8, 0x95, 0x50, 0x1c, 0x5f, 0x62, 0x21, 0x4c, + 0x61, 0x01, 0x37, 0x64, 0x95, 0xb1, 0x30, 0xde, 0x97, 0x58, 0x08, 0xff, 0x8f, 0xe5, 0xfb, 0xa7, + 0x15, 0x38, 0xa0, 0x1f, 0x62, 0x1e, 0x83, 0xf6, 0x40, 0x1e, 0x8b, 0x8a, 0xd6, 0x95, 0x11, 0xe8, + 0x3e, 0xc0, 0x60, 0xe8, 0x10, 0x37, 0x64, 0x6e, 0xf4, 0x4a, 0xe6, 0xee, 0x2c, 0xf3, 0x4c, 0xb3, + 0xbb, 0x24, 0x61, 0x58, 0xa1, 0x40, 0x37, 0xa0, 0x1e, 0x0c, 0xbc, 0x11, 0x1f, 0xf7, 0x73, 0xca, + 0x76, 0x5d, 0x2f, 0xf6, 0xc2, 0x6e, 0xb8, 0xcd, 0x57, 0x80, 0x0b, 0x23, 0x67, 0x9d, 0x02, 0x30, + 0xc7, 0x99, 0x5f, 0x01, 0x88, 0xa9, 0xd1, 0x09, 0xb9, 0xe0, 0x5e, 0xb5, 0x76, 0xa2, 0xf2, 0xab, + 0x51, 0x8a, 0xc4, 0x9a, 0x15, 0x6e, 0x0b, 0x3b, 0xab, 0x46, 0xa1, 0x73, 0x70, 0x28, 0x70, 0xb6, + 0x5c, 0x2b, 0xdc, 0xf5, 0xc9, 0x23, 0xe2, 0x3b, 0x9b, 0x0e, 0xb1, 0x59, 0xf1, 0x5a, 0x38, 0x9d, + 0x60, 0xbe, 0x01, 0x87, 0xd2, 0x07, 0xb4, 0x63, 0x1b, 0xd1, 0xfc, 0xf9, 0x36, 0x34, 0xf8, 0xde, + 0xdb, 0xfc, 0x8f, 0x8a, 0xd4, 0x6b, 0xf3, 0xcf, 0xcb, 0x50, 0xe7, 0x67, 0x90, 0x49, 0x0b, 0x73, + 0x4b, 0xd5, 0xe9, 0x6a, 0xc6, 0xc6, 0x34, 0xeb, 0x4c, 0xb6, 0x7b, 0x87, 0xec, 0x3f, 0xa2, 0xf3, + 0x8e, 0x54, 0xf4, 0x5c, 0x7b, 0x70, 0x1b, 0x5a, 0x91, 0x30, 0xb5, 0x2e, 0x8f, 0xc9, 0xbe, 0xc8, + 0x9c, 0xfe, 0x44, 0xe7, 0xc4, 0xfc, 0x25, 0x87, 0x6a, 0x72, 0x3c, 0xf1, 0x5c, 0xc4, 0x24, 0xf7, + 0x59, 0xa8, 0xd2, 0xdd, 0x6e, 0xb2, 0x0a, 0xd3, 0x0f, 0xcb, 0xdc, 0xd2, 0x2e, 0x41, 0x9d, 0x9f, + 0x03, 0x27, 0xf3, 0x40, 0x50, 0x7b, 0x4c, 0xf6, 0x23, 0xab, 0xc4, 0x7e, 0xe7, 0x92, 0xfc, 0x59, + 0x15, 0x66, 0xd5, 0xb3, 0x2f, 0x73, 0x25, 0x77, 0x4a, 0x66, 0x93, 0x6c, 0x3c, 0x25, 0x8b, 0x20, + 0xb5, 0x6c, 0x8c, 0x8b, 0xa9, 0x46, 0x1b, 0xf3, 0x80, 0xd9, 0x85, 0x86, 0x38, 0x52, 0x4c, 0x32, + 0x49, 0xf9, 0x8a, 0x2a, 0x7f, 0x1b, 0x5a, 0xf2, 0x84, 0xf0, 0xc3, 0xe6, 0xed, 0x43, 0x4b, 0x1e, + 0x05, 0x1e, 0x81, 0x7a, 0xe8, 0x85, 0xd6, 0x90, 0xd1, 0x55, 0x31, 0x0f, 0x50, 0xbd, 0x74, 0xc9, + 0xd3, 0x70, 0x49, 0x5a, 0xde, 0x2a, 0x8e, 0x23, 0xb8, 0x61, 0x25, 0x7b, 0x3c, 0xb5, 0xca, 0x53, + 0x65, 0x44, 0x9c, 0x67, 0x4d, 0xcd, 0x73, 0x1f, 0x1a, 0xe2, 0x7c, 0x50, 0xa6, 0x97, 0x95, 0x74, + 0xb4, 0x00, 0xf5, 0x2d, 0x9a, 0x2e, 0x7a, 0xfd, 0xd5, 0xc4, 0xf8, 0xe6, 0xdb, 0xfe, 0x25, 0xcf, + 0x0d, 0xa9, 0x1a, 0xeb, 0x6e, 0x4f, 0xcc, 0x91, 0xb4, 0x0b, 0x7d, 0x7e, 0xd8, 0xcb, 0x07, 0xa1, + 0x08, 0x99, 0xdf, 0x2a, 0x43, 0x5b, 0x9e, 0xae, 0x9b, 0xef, 0xe7, 0x0d, 0x9e, 0x05, 0x38, 0xe0, + 0x0b, 0x29, 0x3a, 0x50, 0xa3, 0x21, 0xf4, 0x7c, 0xa2, 0x24, 0x58, 0x91, 0xc1, 0x3a, 0xc2, 0x7c, + 0x27, 0xb7, 0x53, 0xe7, 0x61, 0x36, 0x12, 0xbd, 0x13, 0xab, 0x9e, 0x16, 0x67, 0x9a, 0x12, 0x9d, + 0x9a, 0xb9, 0xcd, 0x4d, 0x98, 0x55, 0xcf, 0xd8, 0xcc, 0x47, 0xd9, 0xa3, 0xe7, 0x06, 0xcd, 0x46, + 0x39, 0xcf, 0xab, 0x24, 0x1c, 0x09, 0x51, 0x15, 0x62, 0x11, 0xac, 0x01, 0xcc, 0x67, 0xa1, 0xce, + 0x4f, 0xfe, 0x13, 0xcc, 0xe6, 0x6f, 0x0c, 0xa0, 0xce, 0x3a, 0xc1, 0xbc, 0xc8, 0x07, 0xc0, 0x39, + 0x68, 0x30, 0x2f, 0x56, 0x74, 0x2f, 0xea, 0x48, 0x56, 0x8f, 0x61, 0x21, 0x63, 0x2e, 0xc1, 0x8c, + 0x72, 0xe6, 0x4a, 0x35, 0x96, 0x25, 0x48, 0x2d, 0x88, 0x82, 0xc8, 0x84, 0x16, 0x9d, 0xa0, 0x85, + 0xcd, 0xa5, 0xf5, 0x97, 0x61, 0xf3, 0x94, 0x5c, 0x2d, 0x9a, 0xe2, 0x8c, 0xb9, 0x2f, 0x5b, 0x49, + 0x86, 0xcd, 0xcf, 0x40, 0x5b, 0x1e, 0xcd, 0xa2, 0xfb, 0x30, 0x2b, 0x8e, 0x66, 0xb9, 0x67, 0x89, + 0x0a, 0xcf, 0x15, 0x68, 0xd7, 0x03, 0xf2, 0x34, 0x64, 0xa7, 0xbb, 0xdd, 0x07, 0xfb, 0x23, 0x82, + 0x35, 0x02, 0xf3, 0x9b, 0x67, 0x59, 0xcb, 0x9b, 0x23, 0x68, 0xc9, 0xf3, 0xa8, 0x64, 0x2f, 0x5c, + 0xe1, 0xa6, 0xb1, 0x52, 0x78, 0x98, 0xca, 0xf1, 0xd4, 0x00, 0x33, 0x0b, 0x6a, 0x3e, 0x0f, 0xd5, + 0x3b, 0x64, 0x9f, 0x8e, 0x10, 0x6e, 0x48, 0xc5, 0x08, 0xe1, 0x06, 0xb3, 0x0f, 0x0d, 0x71, 0x2e, + 0x9c, 0xcc, 0xef, 0x3c, 0x34, 0x36, 0xf9, 0x51, 0x73, 0x81, 0xc9, 0x14, 0x62, 0xe6, 0x0d, 0x98, + 0x51, 0x4f, 0x83, 0x93, 0x7c, 0x27, 0x60, 0x66, 0xa0, 0x9c, 0x37, 0xf3, 0x6e, 0x50, 0xa3, 0x4c, + 0xa2, 0xab, 0x63, 0x8a, 0x61, 0x25, 0x53, 0x0f, 0x5f, 0xca, 0x6c, 0xf6, 0x31, 0xda, 0x78, 0x07, + 0x0e, 0x26, 0x8f, 0x7d, 0x93, 0x39, 0x9d, 0x85, 0x83, 0x1b, 0x89, 0x43, 0x66, 0x6e, 0x03, 0x93, + 0xd1, 0x66, 0x1f, 0xea, 0xfc, 0x58, 0x2e, 0x49, 0xf1, 0x3a, 0xd4, 0x2d, 0x76, 0xec, 0x57, 0x61, + 0x4b, 0x0b, 0x33, 0xb3, 0x94, 0x0c, 0x8a, 0xb9, 0xa0, 0xe9, 0xc0, 0x01, 0xfd, 0xa4, 0x2f, 0x49, + 0xd9, 0x83, 0x03, 0x7b, 0xda, 0x89, 0x22, 0xa7, 0x9e, 0xcf, 0xa4, 0xd6, 0xa8, 0xb0, 0x0e, 0x34, + 0xbf, 0xd6, 0x80, 0x1a, 0x3b, 0xaa, 0x4e, 0x66, 0x71, 0x19, 0x6a, 0x21, 0x79, 0x1a, 0xad, 0x8b, + 0xe7, 0xc7, 0x9e, 0x7b, 0x73, 0x7f, 0x29, 0x93, 0x47, 0x1f, 0xa7, 0x8b, 0xf8, 0xfd, 0x61, 0xb4, + 0x81, 0x3a, 0x39, 0x1e, 0xb8, 0x4e, 0x45, 0x31, 0x47, 0x50, 0x28, 0x1b, 0x0b, 0xe2, 0x6a, 0x45, + 0x01, 0x94, 0x0d, 0x42, 0xcc, 0x11, 0xe8, 0x06, 0x34, 0x07, 0xdb, 0x64, 0xf0, 0x98, 0xd8, 0xe2, + 0x4e, 0xc5, 0xe9, 0xf1, 0xe0, 0x25, 0x2e, 0x8c, 0x23, 0x14, 0xcd, 0x7b, 0xc0, 0x7a, 0xb7, 0x31, + 0x49, 0xde, 0xac, 0xc7, 0x31, 0x47, 0xa0, 0x15, 0x68, 0x3b, 0x03, 0xcf, 0x5d, 0xd9, 0xf1, 0x3e, + 0xe7, 0x88, 0xcb, 0x13, 0x2f, 0x8f, 0x87, 0xf7, 0x23, 0x71, 0x1c, 0x23, 0x23, 0x9a, 0xfe, 0x0e, + 0xdd, 0x31, 0xb6, 0x26, 0xa5, 0x61, 0xe2, 0x38, 0x46, 0x9a, 0xc7, 0x44, 0x7f, 0x66, 0x0f, 0xf2, + 0x5b, 0x50, 0x67, 0x4d, 0x8e, 0xae, 0xa9, 0xc9, 0x73, 0x4a, 0x4e, 0xb9, 0x16, 0x4b, 0x74, 0x95, + 0xe4, 0x61, 0xed, 0xaf, 0xf3, 0xcc, 0x4c, 0xc2, 0x23, 0xfa, 0x8d, 0xf3, 0xbc, 0x08, 0x4d, 0xd1, + 0x15, 0x7a, 0x81, 0x5b, 0x91, 0xc0, 0x0b, 0x50, 0xe7, 0x03, 0x33, 0xbb, 0x3e, 0x2f, 0x41, 0x5b, + 0x36, 0xe6, 0x78, 0x11, 0xd6, 0x3a, 0x39, 0x22, 0x3f, 0x57, 0x81, 0x3a, 0x3f, 0xb2, 0x4f, 0x9b, + 0x5a, 0x75, 0x14, 0x9c, 0x1c, 0x7f, 0x03, 0x40, 0x1d, 0x06, 0xb7, 0xd8, 0xe6, 0x90, 0xae, 0xe5, + 0xe5, 0x35, 0xdc, 0xb3, 0x05, 0xe8, 0xb5, 0x48, 0x1e, 0xc7, 0xd0, 0x82, 0xee, 0xbc, 0x0f, 0x6d, + 0x89, 0x42, 0x8b, 0x7a, 0x97, 0x9e, 0x1b, 0xdb, 0x15, 0xc9, 0x2c, 0x05, 0xe1, 0xaf, 0x96, 0xa1, + 0xba, 0xec, 0xec, 0xa5, 0xda, 0xe1, 0xad, 0x68, 0x54, 0x17, 0x99, 0x83, 0x65, 0x67, 0x4f, 0x1b, + 0xd4, 0xe6, 0x4a, 0xa4, 0x71, 0xef, 0xe8, 0xc5, 0x3b, 0x33, 0x7e, 0x05, 0x16, 0xd3, 0xf0, 0x82, + 0xfd, 0x52, 0x13, 0x6a, 0xec, 0x36, 0x4c, 0x96, 0x9d, 0xda, 0x1f, 0x15, 0x17, 0x8c, 0xf9, 0xdb, + 0xd9, 0x84, 0xcb, 0xe4, 0xb9, 0x9d, 0x8a, 0x1d, 0x3d, 0x27, 0xc7, 0x03, 0x35, 0xbf, 0xc3, 0x65, + 0xa8, 0xed, 0x38, 0x3b, 0x44, 0x98, 0xa9, 0x82, 0x2c, 0xef, 0x39, 0x3b, 0x04, 0x33, 0x79, 0x8a, + 0xdb, 0xb6, 0x82, 0x6d, 0x61, 0xa1, 0x0a, 0x70, 0x3d, 0x2b, 0xd8, 0xc6, 0x4c, 0x9e, 0xe2, 0x5c, + 0xba, 0x8b, 0x6c, 0x4c, 0x82, 0xa3, 0x9b, 0x4b, 0xcc, 0xe4, 0x29, 0x2e, 0x70, 0xbe, 0x40, 0x84, + 0x4d, 0x2a, 0xc0, 0xad, 0x3b, 0x5f, 0x20, 0x98, 0xc9, 0xc7, 0x26, 0xbc, 0x35, 0x59, 0xd3, 0x28, + 0x26, 0xfc, 0x01, 0xcc, 0x85, 0xda, 0x99, 0xae, 0xb8, 0x92, 0x75, 0xae, 0xa0, 0x5f, 0x34, 0x0c, + 0x4e, 0x70, 0xd0, 0x41, 0xc0, 0xf6, 0xcc, 0xd9, 0x83, 0xe0, 0x05, 0xa8, 0x7f, 0xd2, 0xb1, 0xc3, + 0x6d, 0x3d, 0xb9, 0xae, 0x99, 0x3c, 0xda, 0x6d, 0x53, 0x99, 0x3c, 0xb5, 0xd7, 0x39, 0xcf, 0x32, + 0xd4, 0xa8, 0xfa, 0x4c, 0xa7, 0xc7, 0xb1, 0xd6, 0x7d, 0x28, 0x03, 0xac, 0x36, 0x34, 0xe7, 0x39, + 0x06, 0x35, 0xaa, 0x21, 0x39, 0x4d, 0x72, 0x0c, 0x6a, 0x54, 0xef, 0xf2, 0x53, 0x69, 0x6f, 0xeb, + 0xa9, 0xd5, 0x28, 0xf5, 0x0c, 0xcc, 0xe9, 0xdd, 0x91, 0xc3, 0xf2, 0x27, 0x4d, 0xa8, 0xb1, 0xab, + 0x65, 0xc9, 0x11, 0xf9, 0x09, 0x38, 0xc0, 0xfb, 0x6f, 0x51, 0x2c, 0xc1, 0x2b, 0x99, 0x37, 0x4b, + 0xf5, 0x0b, 0x6b, 0x42, 0x05, 0x04, 0x04, 0xeb, 0x0c, 0x93, 0x2f, 0x2a, 0x18, 0x95, 0xa6, 0x91, + 0xef, 0xc8, 0xc5, 0x6b, 0xad, 0xe0, 0x5e, 0x23, 0xc3, 0xf2, 0x25, 0x70, 0xb4, 0x92, 0x45, 0x8b, + 0xd0, 0xa2, 0x53, 0x2b, 0x6d, 0x2e, 0x31, 0x6c, 0xcf, 0x8c, 0xc7, 0xf7, 0x85, 0x34, 0x96, 0x38, + 0x3a, 0xb1, 0x0f, 0x2c, 0xdf, 0x66, 0xa5, 0x12, 0x63, 0xf8, 0xe5, 0xf1, 0x24, 0x4b, 0x91, 0x38, + 0x8e, 0x91, 0xe8, 0x0e, 0xcc, 0xd8, 0x44, 0xfa, 0x09, 0xc4, 0xa0, 0xfe, 0xd8, 0x78, 0xa2, 0xe5, + 0x18, 0x80, 0x55, 0x34, 0x2d, 0x53, 0xb4, 0x37, 0x0c, 0x0a, 0x17, 0x1b, 0x8c, 0x2a, 0xbe, 0x3f, + 0x1e, 0x23, 0xcd, 0xd3, 0x70, 0x40, 0xeb, 0xb7, 0x8f, 0x74, 0xd5, 0xa1, 0xf6, 0x25, 0xe7, 0xb9, + 0x22, 0xb7, 0x28, 0xaf, 0xe9, 0xcb, 0x8e, 0xdc, 0x1d, 0x89, 0x00, 0xde, 0x85, 0x56, 0xd4, 0x31, + 0xe8, 0xa6, 0x5e, 0x86, 0x57, 0x8a, 0xcb, 0x20, 0xfb, 0x54, 0xb0, 0xad, 0x42, 0x5b, 0xf6, 0x10, + 0x5a, 0xd0, 0xe9, 0x5e, 0x2d, 0xa6, 0x8b, 0x7b, 0x57, 0xf0, 0x61, 0x98, 0x51, 0x3a, 0x0a, 0x2d, + 0xe9, 0x8c, 0xaf, 0x15, 0x33, 0xaa, 0xdd, 0x1c, 0xaf, 0x7a, 0x64, 0x8f, 0xa9, 0xbd, 0x52, 0x8d, + 0x7b, 0xe5, 0xf7, 0x9b, 0xd0, 0x92, 0xd7, 0x39, 0x33, 0xf6, 0x98, 0xbb, 0xfe, 0xb0, 0x70, 0x8f, + 0x19, 0xe1, 0xbb, 0x0f, 0xfd, 0x21, 0xa6, 0x08, 0xda, 0xc5, 0xa1, 0x13, 0xca, 0xa1, 0xfa, 0x72, + 0x31, 0xf4, 0x01, 0x15, 0xc7, 0x1c, 0x85, 0xee, 0xeb, 0x5a, 0x5e, 0x1b, 0x73, 0xdd, 0x47, 0x23, + 0xc9, 0xd5, 0xf4, 0x3e, 0xb4, 0x1d, 0xba, 0xf4, 0xeb, 0xc5, 0x33, 0xef, 0xab, 0xc5, 0x74, 0xfd, + 0x08, 0x82, 0x63, 0x34, 0x2d, 0xdb, 0xa6, 0xb5, 0x47, 0xc7, 0x35, 0x23, 0x6b, 0x4c, 0x5a, 0xb6, + 0x5b, 0x31, 0x08, 0xab, 0x0c, 0xe8, 0xaa, 0x58, 0xbb, 0x34, 0x0b, 0x2c, 0x4b, 0xdc, 0x54, 0xf1, + 0xfa, 0xe5, 0xbd, 0xd4, 0x4c, 0xcb, 0x87, 0xf1, 0xeb, 0x13, 0xb0, 0x8c, 0x9d, 0x6d, 0x69, 0x0f, + 0xf2, 0x95, 0x51, 0x7b, 0xd2, 0x1e, 0xd4, 0x4e, 0xc4, 0x9e, 0x87, 0xea, 0x43, 0x7f, 0x98, 0x3f, + 0x57, 0xb3, 0xee, 0xce, 0x49, 0x3e, 0xa9, 0x8f, 0x84, 0xfc, 0x05, 0xbd, 0xec, 0x93, 0x5c, 0x1e, + 0xa5, 0xd1, 0x73, 0x84, 0xae, 0x89, 0x09, 0xfd, 0x4d, 0x7d, 0xbc, 0xbd, 0x98, 0x18, 0x6f, 0x74, + 0x84, 0xad, 0xf9, 0x84, 0xdf, 0x68, 0x53, 0x66, 0xf2, 0x49, 0xe7, 0xc9, 0xdb, 0xd1, 0xfa, 0x63, + 0x2a, 0x4b, 0x91, 0x6c, 0x5b, 0xce, 0xf5, 0x8d, 0x32, 0xb4, 0xe4, 0x6d, 0xdd, 0xb4, 0x77, 0xbe, + 0xe5, 0x04, 0x3d, 0x62, 0xd9, 0xc4, 0x17, 0xe3, 0xf6, 0x95, 0xc2, 0x6b, 0xc0, 0xdd, 0xbe, 0x40, + 0x60, 0x89, 0x35, 0x4f, 0x40, 0x2b, 0x8a, 0xcd, 0xd9, 0x94, 0x7d, 0xbf, 0x02, 0x0d, 0x71, 0xcf, + 0x37, 0x59, 0x88, 0xeb, 0xd0, 0x18, 0x5a, 0xfb, 0xde, 0x6e, 0xb4, 0x65, 0x3a, 0x53, 0x70, 0x75, + 0xb8, 0x7b, 0x97, 0x49, 0x63, 0x81, 0x42, 0x6f, 0x43, 0x7d, 0xe8, 0xec, 0x38, 0xa1, 0x30, 0x1f, + 0xa7, 0x0b, 0xe1, 0xec, 0x46, 0x10, 0xc7, 0xd0, 0xcc, 0xd9, 0xf5, 0xbe, 0xe8, 0xe3, 0x8c, 0xc2, + 0xcc, 0x1f, 0x31, 0x69, 0x2c, 0x50, 0xe6, 0x6d, 0x68, 0xf0, 0xe2, 0x4c, 0x37, 0x49, 0xe8, 0x35, + 0x89, 0x35, 0x9d, 0x95, 0x2d, 0x67, 0x55, 0x7a, 0x1c, 0x1a, 0x3c, 0xf3, 0x1c, 0xad, 0xf9, 0xde, + 0x73, 0x6c, 0xbf, 0x33, 0x34, 0xef, 0xc6, 0x07, 0x8e, 0x1f, 0xfe, 0x2c, 0xc3, 0x7c, 0x00, 0x07, + 0x97, 0xad, 0xd0, 0xda, 0xb0, 0x02, 0x82, 0xc9, 0xc0, 0xf3, 0xed, 0x4c, 0x56, 0x9f, 0x27, 0x09, + 0x0f, 0x75, 0x3e, 0xab, 0x90, 0xfb, 0x89, 0xeb, 0xf0, 0x7f, 0x8f, 0xeb, 0xf0, 0x0f, 0x6a, 0x39, + 0xfe, 0xbc, 0x49, 0x3c, 0x19, 0x54, 0xe1, 0x52, 0x0e, 0xbd, 0xab, 0xfa, 0xda, 0xfb, 0x54, 0x01, + 0x52, 0x5b, 0x7c, 0x5f, 0xd5, 0x3d, 0x7a, 0x45, 0x58, 0xcd, 0xa5, 0x77, 0x33, 0xe9, 0xd2, 0x3b, + 0x53, 0x80, 0x4e, 0xf9, 0xf4, 0xae, 0xea, 0x3e, 0xbd, 0xa2, 0xdc, 0x55, 0xa7, 0xde, 0xff, 0x33, + 0x37, 0xda, 0xaf, 0xe5, 0xb8, 0x7d, 0x3e, 0xae, 0xbb, 0x7d, 0xc6, 0x68, 0xcd, 0x8f, 0xcb, 0xef, + 0xf3, 0xeb, 0x8d, 0x1c, 0xbf, 0xcf, 0x15, 0xcd, 0xef, 0x33, 0xa6, 0x64, 0x49, 0xc7, 0xcf, 0x55, + 0xdd, 0xf1, 0x73, 0xaa, 0x00, 0xa9, 0x79, 0x7e, 0xae, 0x68, 0x9e, 0x9f, 0xa2, 0x4c, 0x15, 0xd7, + 0xcf, 0x15, 0xcd, 0xf5, 0x53, 0x04, 0x54, 0x7c, 0x3f, 0x57, 0x34, 0xdf, 0x4f, 0x11, 0x50, 0x71, + 0xfe, 0x5c, 0xd1, 0x9c, 0x3f, 0x45, 0x40, 0xc5, 0xfb, 0x73, 0x55, 0xf7, 0xfe, 0x14, 0xb7, 0x8f, + 0xd2, 0xe9, 0x3f, 0x71, 0xd4, 0xfc, 0x37, 0x3a, 0x6a, 0x7e, 0xb1, 0x9a, 0xe3, 0x80, 0xc1, 0xd9, + 0x0e, 0x98, 0x73, 0xf9, 0x3d, 0x59, 0xec, 0x81, 0x99, 0x7c, 0x16, 0x48, 0xbb, 0x60, 0xae, 0x25, + 0x5c, 0x30, 0xa7, 0x0b, 0xc0, 0xba, 0x0f, 0xe6, 0xff, 0x8c, 0x93, 0xe1, 0x77, 0x1b, 0x63, 0xf6, + 0xd3, 0x6f, 0xa9, 0xfb, 0xe9, 0x31, 0x33, 0x59, 0x7a, 0x43, 0x7d, 0x5d, 0xdf, 0x50, 0x9f, 0x9d, + 0x00, 0xab, 0xed, 0xa8, 0xd7, 0xb2, 0x76, 0xd4, 0xdd, 0x09, 0x58, 0x72, 0xb7, 0xd4, 0xb7, 0xd3, + 0x5b, 0xea, 0x73, 0x13, 0xf0, 0x65, 0xee, 0xa9, 0xd7, 0xb2, 0xf6, 0xd4, 0x93, 0x94, 0x2e, 0x77, + 0x53, 0xfd, 0xb6, 0xb6, 0xa9, 0x7e, 0x79, 0x92, 0xe6, 0x8a, 0x27, 0x87, 0x4f, 0xe5, 0xec, 0xaa, + 0xdf, 0x98, 0x84, 0x66, 0xbc, 0x13, 0xfb, 0x27, 0xfb, 0x62, 0x3d, 0x9b, 0xdf, 0x79, 0x11, 0x5a, + 0xd1, 0x45, 0x1b, 0xf3, 0xf3, 0xd0, 0x8c, 0x3e, 0xee, 0xcc, 0xb8, 0xa9, 0x2b, 0x36, 0x75, 0x7c, + 0xf5, 0x2c, 0x42, 0xe8, 0x3a, 0xd4, 0xe8, 0x2f, 0x31, 0x2c, 0x5e, 0x99, 0xec, 0x42, 0x0f, 0xcd, + 0x04, 0x33, 0x9c, 0xf9, 0xef, 0x47, 0x00, 0x94, 0x6f, 0xde, 0x26, 0xcd, 0xf6, 0x5d, 0x6a, 0xcc, + 0x86, 0x21, 0xf1, 0xd9, 0x45, 0xae, 0xc2, 0x6f, 0xc2, 0xe2, 0x1c, 0xa8, 0xb6, 0x84, 0xc4, 0xc7, + 0x02, 0x8e, 0xee, 0x41, 0x2b, 0x72, 0xa4, 0xb2, 0x2b, 0xcf, 0x79, 0x4a, 0x96, 0x45, 0x15, 0xb9, + 0xf6, 0xb0, 0xa4, 0x40, 0x0b, 0x50, 0x0b, 0x3c, 0x3f, 0x14, 0xf7, 0xa3, 0x5f, 0x9b, 0x98, 0x6a, + 0xdd, 0xf3, 0x43, 0xcc, 0xa0, 0xbc, 0x6a, 0xca, 0x93, 0x02, 0xd3, 0x54, 0x4d, 0xb3, 0xd8, 0xff, + 0x56, 0x95, 0x36, 0x74, 0x49, 0x8c, 0x46, 0xae, 0x43, 0xe7, 0x27, 0xef, 0x25, 0x75, 0x54, 0x22, + 0xb1, 0x08, 0xe2, 0x3d, 0xc1, 0xd7, 0x37, 0xaf, 0x40, 0x67, 0xe0, 0xed, 0x11, 0x1f, 0xc7, 0x57, + 0x9c, 0xc4, 0x2d, 0xb4, 0x54, 0x3c, 0x32, 0xa1, 0xb5, 0xed, 0xd8, 0xa4, 0x3f, 0x10, 0xf6, 0xaf, + 0x85, 0x65, 0x18, 0xdd, 0x81, 0x16, 0xf3, 0xb1, 0x47, 0x1e, 0xfe, 0xe9, 0x0a, 0xc9, 0x5d, 0xfd, + 0x11, 0x01, 0xcd, 0x88, 0x65, 0x7e, 0xcb, 0x09, 0x59, 0x1b, 0xb6, 0xb0, 0x0c, 0xd3, 0x02, 0xb3, + 0x7b, 0x64, 0x6a, 0x81, 0x9b, 0xbc, 0xc0, 0xc9, 0x78, 0x74, 0x09, 0x9e, 0x61, 0x71, 0x89, 0x2d, + 0x26, 0x77, 0xd5, 0xb7, 0x70, 0x76, 0x22, 0xbb, 0x37, 0x67, 0x6d, 0xf1, 0x0f, 0x88, 0x98, 0xf3, + 0xae, 0x8e, 0xe3, 0x08, 0x74, 0x0e, 0x0e, 0xd9, 0x64, 0xd3, 0xda, 0x1d, 0x86, 0x0f, 0xc8, 0xce, + 0x68, 0x68, 0x85, 0xa4, 0x6f, 0xb3, 0x57, 0x0d, 0xda, 0x38, 0x9d, 0x80, 0x5e, 0x87, 0xc3, 0x22, + 0x92, 0x0f, 0x63, 0xda, 0x1b, 0x7d, 0x9b, 0x7d, 0xe4, 0xdf, 0xc6, 0x59, 0x49, 0xe6, 0xf7, 0x6a, + 0xb4, 0xd3, 0x99, 0x6a, 0xbf, 0x0b, 0x55, 0xcb, 0xb6, 0xc5, 0xb4, 0x79, 0x71, 0xca, 0x01, 0x22, + 0xbe, 0x1c, 0xa1, 0x0c, 0x68, 0x4d, 0x5e, 0xb9, 0xe3, 0x13, 0xe7, 0xe5, 0x69, 0xb9, 0xe4, 0x63, + 0x2b, 0x82, 0x87, 0x32, 0xee, 0xf2, 0x2f, 0x29, 0xaa, 0x3f, 0x1a, 0xa3, 0xfc, 0x3c, 0x45, 0xf0, + 0xa0, 0xdb, 0x50, 0x63, 0x25, 0xe4, 0x13, 0xeb, 0xa5, 0x69, 0xf9, 0xee, 0xf1, 0xf2, 0x31, 0x0e, + 0x73, 0xc0, 0xef, 0xbe, 0x29, 0x17, 0x2e, 0xcb, 0xfa, 0x85, 0xcb, 0x45, 0xa8, 0x3b, 0x21, 0xd9, + 0x49, 0xdf, 0xbf, 0x1d, 0xab, 0xaa, 0xc2, 0xf2, 0x70, 0xe8, 0xd8, 0x7b, 0x80, 0xef, 0xe7, 0x7e, + 0xce, 0x70, 0x13, 0x6a, 0x14, 0x9e, 0x5a, 0x4b, 0x4e, 0x92, 0x31, 0x43, 0x9a, 0x17, 0xa0, 0x46, + 0x2b, 0x3b, 0xa6, 0x76, 0xa2, 0x3c, 0x15, 0x59, 0x9e, 0xc5, 0x19, 0x68, 0x7b, 0x23, 0xe2, 0xb3, + 0x81, 0x61, 0xfe, 0x6b, 0x4d, 0xb9, 0x14, 0xd7, 0x57, 0x75, 0xec, 0xcd, 0xa9, 0x2d, 0xa7, 0xaa, + 0x65, 0x38, 0xa1, 0x65, 0x6f, 0x4d, 0xcf, 0x96, 0xd2, 0x33, 0x9c, 0xd0, 0xb3, 0x1f, 0x81, 0x33, + 0xa5, 0x69, 0x77, 0x35, 0x4d, 0xbb, 0x3c, 0x3d, 0xa3, 0xa6, 0x6b, 0xa4, 0x48, 0xd7, 0x96, 0x75, + 0x5d, 0xeb, 0x4e, 0xd6, 0xe5, 0x72, 0x6a, 0x9a, 0x40, 0xdb, 0x3e, 0x93, 0xab, 0x6d, 0x8b, 0x9a, + 0xb6, 0x4d, 0x9b, 0xf5, 0x47, 0xa4, 0x6f, 0xdf, 0xa9, 0x41, 0x8d, 0x4e, 0x8f, 0x68, 0x45, 0xd5, + 0xb5, 0x37, 0xa6, 0x9a, 0x5a, 0x55, 0x3d, 0x5b, 0x4d, 0xe8, 0xd9, 0xa5, 0xe9, 0x98, 0x52, 0x3a, + 0xb6, 0x9a, 0xd0, 0xb1, 0x29, 0xf9, 0x52, 0xfa, 0xd5, 0xd3, 0xf4, 0xeb, 0xc2, 0x74, 0x6c, 0x9a, + 0x6e, 0x59, 0x45, 0xba, 0x75, 0x53, 0xd7, 0xad, 0x09, 0x57, 0x6f, 0x6c, 0xad, 0x32, 0x81, 0x5e, + 0xbd, 0x97, 0xab, 0x57, 0xd7, 0x35, 0xbd, 0x9a, 0x26, 0xdb, 0x8f, 0x48, 0xa7, 0x2e, 0xf1, 0x45, + 0x67, 0xfe, 0x57, 0x69, 0x59, 0x8b, 0x4e, 0xf3, 0x4d, 0x68, 0xc7, 0x8f, 0x86, 0x64, 0x5c, 0xcf, + 0xe7, 0x62, 0x51, 0xae, 0x51, 0xd0, 0xbc, 0x08, 0xed, 0xf8, 0x21, 0x90, 0xac, 0x2f, 0xe0, 0x58, + 0xa2, 0xfc, 0x7a, 0x8a, 0x85, 0xcc, 0x15, 0x38, 0x94, 0x7e, 0xa6, 0x20, 0xc3, 0x0f, 0xaf, 0xdc, + 0x2d, 0x8f, 0xbe, 0x5e, 0x51, 0xa2, 0xcc, 0x27, 0x30, 0x97, 0x78, 0x78, 0x60, 0x6a, 0x0e, 0x74, + 0x51, 0x59, 0x22, 0x57, 0x13, 0x9f, 0x9a, 0xea, 0xb7, 0xe5, 0xe3, 0x85, 0xb0, 0xb9, 0x0c, 0x73, + 0x05, 0x85, 0x9f, 0xe4, 0xb2, 0xfc, 0x67, 0x61, 0x66, 0x5c, 0xd9, 0x3f, 0x82, 0xcb, 0xfc, 0x21, + 0x74, 0x52, 0x8f, 0xa6, 0x24, 0xb3, 0x59, 0x03, 0xd8, 0x92, 0x32, 0x42, 0x69, 0x5f, 0x9f, 0xe2, + 0xd3, 0x05, 0x86, 0xc3, 0x0a, 0x87, 0xf9, 0xdb, 0x65, 0x38, 0x94, 0x7e, 0x31, 0x65, 0xd2, 0xcd, + 0x8f, 0x01, 0x4d, 0xc6, 0x25, 0xbf, 0xf8, 0x88, 0x82, 0xe8, 0x1e, 0xcc, 0x06, 0x43, 0x67, 0x40, + 0x96, 0xb6, 0x2d, 0x77, 0x8b, 0x04, 0x62, 0x47, 0x53, 0xf0, 0xea, 0xc9, 0x7a, 0x8c, 0xc0, 0x1a, + 0xdc, 0x7c, 0x02, 0x33, 0x4a, 0x22, 0x7a, 0x07, 0x2a, 0xde, 0x28, 0x75, 0xaf, 0x31, 0x9f, 0xf3, + 0x7e, 0x34, 0xde, 0x70, 0xc5, 0x1b, 0xa5, 0x87, 0xa4, 0x3a, 0x7c, 0xab, 0xda, 0xf0, 0x35, 0xef, + 0xc0, 0xa1, 0xf4, 0xa3, 0x24, 0xc9, 0xe6, 0x39, 0x93, 0xf2, 0x12, 0xf0, 0x66, 0x4a, 0x6e, 0xf9, + 0xaf, 0xc0, 0xc1, 0xe4, 0x53, 0x23, 0x19, 0x5f, 0xe3, 0xc4, 0x1f, 0x35, 0x45, 0xee, 0xfa, 0xf9, + 0x5f, 0x28, 0xc3, 0x9c, 0x5e, 0x11, 0x74, 0x14, 0x90, 0x1e, 0xb3, 0xea, 0xb9, 0xa4, 0x53, 0x42, + 0xcf, 0xc0, 0x21, 0x3d, 0x7e, 0xc1, 0xb6, 0x3b, 0xe5, 0xb4, 0x38, 0x35, 0x5b, 0x9d, 0x0a, 0x32, + 0xe0, 0x48, 0xa2, 0x85, 0x98, 0x11, 0xed, 0x54, 0xd1, 0x73, 0xf0, 0x4c, 0x32, 0x65, 0x34, 0xb4, + 0x06, 0xa4, 0x53, 0x33, 0x7f, 0x58, 0x81, 0xda, 0xc3, 0x80, 0xf8, 0xe6, 0xbf, 0x54, 0xa2, 0xaf, + 0x34, 0xde, 0x82, 0x1a, 0x7b, 0x05, 0x44, 0xf9, 0x82, 0xb2, 0x9c, 0xf8, 0x82, 0x52, 0xfb, 0x0a, + 0x2f, 0xfe, 0x82, 0xf2, 0x2d, 0xa8, 0xb1, 0x77, 0x3f, 0xa6, 0x47, 0x7e, 0xbd, 0x0c, 0xed, 0xf8, + 0x0d, 0x8e, 0xa9, 0xf1, 0xea, 0x57, 0x21, 0x15, 0xfd, 0xab, 0x90, 0x57, 0xa0, 0xee, 0xb3, 0xef, + 0x37, 0xb8, 0x95, 0x49, 0x7e, 0x6b, 0xc2, 0x32, 0xc4, 0x5c, 0xc4, 0x24, 0x30, 0xa3, 0xbe, 0x30, + 0x32, 0x7d, 0x31, 0x4e, 0x89, 0xe7, 0xc5, 0xfa, 0x76, 0xb0, 0xe0, 0xfb, 0xd6, 0xbe, 0x50, 0x4c, + 0x3d, 0xd2, 0x3c, 0x06, 0xb5, 0x35, 0xc7, 0xdd, 0xca, 0xfe, 0x70, 0xd5, 0xfc, 0xa3, 0x32, 0x34, + 0xc5, 0xe5, 0x5d, 0xf3, 0x0a, 0x54, 0x57, 0xc9, 0x13, 0x5a, 0x10, 0x71, 0x6d, 0x38, 0x55, 0x90, + 0x7b, 0xac, 0x16, 0x42, 0x1e, 0x47, 0x62, 0xe6, 0x55, 0x39, 0x4d, 0x4e, 0x8f, 0x7d, 0x0b, 0x6a, + 0xec, 0x61, 0x90, 0xe9, 0x91, 0x7f, 0xdc, 0x82, 0x06, 0xff, 0xfa, 0xd3, 0xfc, 0xbd, 0x16, 0x34, + 0xf8, 0x63, 0x21, 0xe8, 0x3a, 0x34, 0x83, 0xdd, 0x9d, 0x1d, 0xcb, 0xdf, 0x37, 0xb2, 0x3f, 0xbc, + 0xd7, 0xde, 0x16, 0xe9, 0xae, 0x73, 0x59, 0x1c, 0x81, 0xd0, 0x9b, 0x50, 0x1b, 0x58, 0x9b, 0x24, + 0x75, 0x9c, 0x9b, 0x05, 0x5e, 0xb2, 0x36, 0x09, 0x66, 0xe2, 0xe8, 0x26, 0xb4, 0x44, 0xb7, 0x04, + 0xc2, 0x9f, 0x33, 0x3e, 0xdf, 0xa8, 0x33, 0x25, 0xca, 0xbc, 0x0d, 0x4d, 0x51, 0x18, 0x74, 0x43, + 0x7e, 0xfb, 0x9a, 0xf4, 0x3c, 0x67, 0x56, 0x41, 0xbe, 0x22, 0x21, 0xbf, 0x82, 0xfd, 0x8b, 0x0a, + 0xd4, 0x68, 0xe1, 0x3e, 0x34, 0x13, 0x3a, 0x0e, 0x30, 0xb4, 0x82, 0x70, 0x6d, 0x77, 0x38, 0x24, + 0xb6, 0xf8, 0xc2, 0x4e, 0x89, 0x41, 0x67, 0xe1, 0x20, 0x0f, 0x05, 0xdb, 0xeb, 0xbb, 0x83, 0x01, + 0x91, 0x5f, 0x96, 0x26, 0xa3, 0xd1, 0x02, 0xd4, 0xd9, 0xf3, 0x95, 0x62, 0x55, 0xf8, 0x6a, 0x61, + 0xcb, 0x76, 0xd7, 0x1c, 0x57, 0x94, 0x86, 0x23, 0x4d, 0x0f, 0xda, 0x32, 0x8e, 0x0e, 0xc2, 0x91, + 0xe3, 0xba, 0x8e, 0xbb, 0x25, 0x34, 0x3a, 0x0a, 0xd2, 0x49, 0x87, 0xfe, 0x14, 0xe5, 0xad, 0x63, + 0x11, 0xa2, 0xf1, 0x9b, 0x96, 0x33, 0x14, 0x45, 0xac, 0x63, 0x11, 0xa2, 0x4c, 0xbb, 0xe2, 0x89, + 0x95, 0x1a, 0xab, 0x60, 0x14, 0x34, 0x3f, 0x28, 0xcb, 0x0f, 0xc0, 0xb3, 0x3e, 0xce, 0x4c, 0xf9, + 0x92, 0x8e, 0xa9, 0x0e, 0x6d, 0x3e, 0x21, 0x28, 0x2e, 0xea, 0xa3, 0xd0, 0xf0, 0xdc, 0xa1, 0xe3, + 0x12, 0xe1, 0x3b, 0x12, 0xa1, 0x44, 0x1b, 0xd7, 0x53, 0x6d, 0x2c, 0xd2, 0x57, 0x6c, 0x87, 0x16, + 0xb1, 0x11, 0xa7, 0xf3, 0x18, 0x74, 0x0d, 0x9a, 0x36, 0xd9, 0x73, 0x06, 0x24, 0x30, 0x9a, 0x4c, + 0xf5, 0x4e, 0x8e, 0x6d, 0xdb, 0x65, 0x26, 0x8b, 0x23, 0x8c, 0x19, 0x42, 0x83, 0x47, 0xc9, 0x2a, + 0x95, 0x95, 0x2a, 0xc5, 0x85, 0xae, 0x8c, 0x29, 0x74, 0xb5, 0xa0, 0xd0, 0xb5, 0x64, 0xa1, 0xe7, + 0xbf, 0x04, 0x10, 0xab, 0x1b, 0x9a, 0x81, 0xe6, 0x43, 0xf7, 0xb1, 0xeb, 0x3d, 0x71, 0x3b, 0x25, + 0x1a, 0xb8, 0xbf, 0xb9, 0x49, 0x73, 0xe9, 0x94, 0x69, 0x80, 0xca, 0x39, 0xee, 0x56, 0xa7, 0x82, + 0x00, 0x1a, 0x34, 0x40, 0xec, 0x4e, 0x95, 0xfe, 0xbe, 0xc5, 0xfa, 0xaf, 0x53, 0x43, 0xcf, 0xc2, + 0xe1, 0xbe, 0x3b, 0xf0, 0x76, 0x46, 0x56, 0xe8, 0x6c, 0x0c, 0xc9, 0x23, 0xe2, 0x07, 0x8e, 0xe7, + 0x76, 0xea, 0x74, 0xf6, 0x5a, 0x25, 0xe1, 0x13, 0xcf, 0x7f, 0xbc, 0x4a, 0x88, 0x2d, 0x5e, 0x2f, + 0xe9, 0x34, 0xcc, 0xff, 0x2c, 0xf3, 0xd3, 0x60, 0xf3, 0x26, 0xcc, 0x6a, 0x6f, 0x01, 0x19, 0xf1, + 0xcb, 0xe4, 0x89, 0x87, 0xc9, 0x8f, 0x32, 0x7f, 0x2d, 0x89, 0x97, 0x32, 0x3c, 0x64, 0xde, 0x02, + 0x50, 0x5e, 0x00, 0x3a, 0x0e, 0xb0, 0xb1, 0x1f, 0x92, 0x80, 0xbf, 0xfe, 0x43, 0x29, 0x6a, 0x58, + 0x89, 0x51, 0xf9, 0x2b, 0x1a, 0xbf, 0x79, 0x19, 0x40, 0x79, 0xff, 0x87, 0x8e, 0x2b, 0x1a, 0x5a, + 0x4c, 0x92, 0x25, 0xa3, 0xcd, 0xae, 0xa8, 0x41, 0xf4, 0xd2, 0x4f, 0x54, 0x02, 0xee, 0xbd, 0x53, + 0x4b, 0xc0, 0x62, 0xcc, 0x15, 0x80, 0xf8, 0xb1, 0x1b, 0xf3, 0x8a, 0x34, 0xdd, 0xaf, 0x41, 0xcd, + 0xb6, 0x42, 0x4b, 0x58, 0xcd, 0xe7, 0x12, 0x33, 0x57, 0x0c, 0xc1, 0x4c, 0xcc, 0xfc, 0xad, 0x32, + 0xcc, 0xaa, 0x0f, 0xfb, 0x98, 0xef, 0x42, 0x8d, 0xbd, 0x0c, 0x74, 0x03, 0x66, 0xd5, 0x97, 0x7d, + 0x52, 0x2f, 0xb8, 0x73, 0x3e, 0x15, 0x8a, 0x35, 0x80, 0xd9, 0x97, 0x45, 0xfa, 0xd0, 0x54, 0xaf, + 0x43, 0x53, 0x3c, 0x14, 0x64, 0x9e, 0x86, 0x76, 0xfc, 0x2e, 0x10, 0xb5, 0x1d, 0x3c, 0x3e, 0xea, + 0x65, 0x11, 0x34, 0xff, 0xb9, 0x06, 0x75, 0xd6, 0x9d, 0xe6, 0x57, 0x2b, 0xaa, 0x86, 0x9a, 0x3f, + 0x2c, 0xe7, 0xee, 0x05, 0x2f, 0x6a, 0x4f, 0x15, 0xcc, 0xa5, 0xde, 0xc3, 0x12, 0xcf, 0x00, 0xe9, + 0x86, 0xf5, 0x32, 0x34, 0x5d, 0xae, 0x99, 0xe2, 0xa5, 0x80, 0x63, 0x99, 0x28, 0xa1, 0xbd, 0x38, + 0x12, 0x46, 0x97, 0xa0, 0x4e, 0x7c, 0xdf, 0xf3, 0xd9, 0x90, 0x9a, 0x4b, 0xbd, 0x2c, 0x15, 0x3f, + 0x39, 0xb4, 0x42, 0xa5, 0x30, 0x17, 0x46, 0x97, 0xe0, 0x99, 0x80, 0x8f, 0x22, 0xbe, 0xa6, 0x0c, + 0xc4, 0x77, 0xd5, 0xc2, 0xda, 0x64, 0x27, 0x9a, 0x01, 0x1c, 0x4c, 0xbe, 0x22, 0x64, 0x42, 0x8b, + 0xaf, 0x4d, 0xe5, 0x00, 0x91, 0x61, 0xaa, 0x79, 0xfc, 0xf7, 0x6a, 0x6c, 0x17, 0x95, 0x18, 0xba, + 0x5e, 0x79, 0xc2, 0xa8, 0xa2, 0xe3, 0x64, 0x6e, 0x21, 0xf5, 0xc8, 0xf9, 0x4f, 0x44, 0xb3, 0xba, + 0x32, 0xda, 0x4b, 0xaa, 0x19, 0x28, 0xa3, 0x36, 0xd4, 0x59, 0xed, 0x3a, 0x15, 0xd5, 0x56, 0x54, + 0x73, 0x46, 0x7b, 0x6d, 0xfe, 0x22, 0x34, 0x45, 0x3c, 0x95, 0x5f, 0xe0, 0x0d, 0xd6, 0x29, 0xa1, + 0x59, 0x68, 0xad, 0x93, 0xe1, 0x66, 0xcf, 0x0b, 0xc2, 0x4e, 0x19, 0x1d, 0x80, 0x36, 0x1b, 0x80, + 0xf7, 0xdd, 0xe1, 0x7e, 0xa7, 0x32, 0xff, 0x1e, 0xb4, 0x65, 0x33, 0xa2, 0x16, 0xd4, 0x56, 0x77, + 0x87, 0xc3, 0x4e, 0x89, 0xad, 0x87, 0x43, 0xcf, 0x8f, 0xbc, 0xe1, 0x2b, 0x4f, 0xe9, 0xe4, 0xd6, + 0x29, 0xe7, 0x99, 0xa0, 0x0a, 0xea, 0xc0, 0xac, 0xc8, 0x9c, 0x97, 0xb9, 0x6a, 0x7e, 0xb7, 0x0c, + 0x6d, 0xf9, 0xc8, 0x12, 0x5d, 0x8c, 0x46, 0x8a, 0x95, 0x6f, 0x7c, 0xae, 0x24, 0x54, 0x2c, 0xff, + 0xcd, 0xa6, 0x84, 0x9a, 0x9d, 0x81, 0x39, 0x61, 0xe7, 0xa3, 0x1e, 0xe7, 0xa6, 0x3a, 0x11, 0x3b, + 0x7f, 0x5b, 0xb6, 0x7a, 0x87, 0x8d, 0xeb, 0x25, 0xcf, 0x75, 0xc9, 0x20, 0x64, 0x6d, 0x7f, 0x10, + 0x66, 0x56, 0xbd, 0x70, 0xcd, 0x0b, 0x02, 0x5a, 0x33, 0xde, 0x52, 0x71, 0x7a, 0x05, 0xcd, 0x01, + 0x44, 0x17, 0xdc, 0xa8, 0x65, 0x36, 0x7f, 0xb3, 0x0c, 0x0d, 0xfe, 0xf4, 0x93, 0xf9, 0x2b, 0x65, + 0x68, 0x88, 0xe7, 0x9e, 0x5e, 0x81, 0x8e, 0xef, 0x51, 0xe2, 0x68, 0x17, 0xd3, 0x5f, 0x16, 0xb5, + 0x4c, 0xc5, 0xd3, 0x8d, 0xb5, 0xa7, 0xa8, 0xa2, 0x58, 0x77, 0x68, 0x71, 0xe8, 0x2a, 0x00, 0x7f, + 0x4e, 0xea, 0xc1, 0xbe, 0x7c, 0x6d, 0x23, 0x79, 0xaf, 0x4d, 0x3c, 0x40, 0xc5, 0x4e, 0x80, 0x14, + 0xe9, 0xf9, 0x2f, 0xc2, 0x01, 0x4c, 0x82, 0x91, 0xe7, 0x06, 0xe4, 0xc7, 0xf5, 0xef, 0x33, 0x72, + 0xff, 0x11, 0xc6, 0xfc, 0x77, 0xea, 0x50, 0x67, 0x4b, 0x5a, 0xf3, 0xaf, 0xea, 0x72, 0xf1, 0x9d, + 0x32, 0x2a, 0x17, 0xd4, 0xdb, 0x45, 0xaa, 0x75, 0xd0, 0x56, 0xc3, 0xfa, 0xad, 0xa2, 0xb7, 0xa1, + 0x35, 0xf2, 0xbd, 0x2d, 0x9f, 0x2e, 0xa2, 0x6b, 0x89, 0xe7, 0x9d, 0x74, 0xd8, 0x9a, 0x10, 0xc3, + 0x12, 0xa0, 0x2a, 0x5f, 0x5d, 0x57, 0xbe, 0x9b, 0xd0, 0xb6, 0x7d, 0x6f, 0xc4, 0xbe, 0x8b, 0x17, + 0x27, 0x7a, 0x27, 0x72, 0x78, 0x97, 0x23, 0xb9, 0x5e, 0x09, 0xc7, 0x20, 0xaa, 0xbe, 0xbc, 0xf5, + 0xc5, 0x61, 0xfa, 0x0b, 0x39, 0x70, 0xde, 0x5f, 0xbd, 0x12, 0x16, 0xe2, 0x14, 0x48, 0x9e, 0x32, + 0x60, 0x6b, 0x2c, 0x70, 0xe5, 0x69, 0x04, 0xe4, 0xe2, 0xe8, 0x1a, 0xb4, 0x02, 0x6b, 0x8f, 0xb0, + 0xc7, 0xb2, 0xdb, 0x63, 0x9b, 0x62, 0x5d, 0x88, 0xf5, 0x4a, 0x58, 0x42, 0x68, 0x95, 0x77, 0x9c, + 0x2d, 0xbe, 0x7d, 0x15, 0x2f, 0x76, 0xe7, 0x55, 0xf9, 0x5e, 0x24, 0xc7, 0x9e, 0x57, 0x8f, 0x02, + 0x74, 0xbb, 0xc5, 0xed, 0xf4, 0x0c, 0x3f, 0xab, 0x66, 0x01, 0x73, 0x06, 0xda, 0xb2, 0x89, 0xcc, + 0x96, 0x1c, 0x26, 0x2d, 0x68, 0xf0, 0x1a, 0x98, 0x00, 0xad, 0xa8, 0x40, 0x54, 0x58, 0x92, 0x9b, + 0xab, 0xd0, 0x8a, 0x3a, 0x2d, 0xe7, 0x2d, 0x0c, 0x04, 0x35, 0xdb, 0x13, 0xeb, 0xb4, 0x2a, 0x66, + 0xbf, 0x69, 0xa7, 0xaa, 0x4f, 0x68, 0xb5, 0xe5, 0xfb, 0x50, 0xf3, 0x0b, 0xd1, 0x25, 0x29, 0x6a, + 0xda, 0xb8, 0x07, 0x60, 0x06, 0x9a, 0x78, 0x97, 0x2d, 0xa1, 0x3b, 0x65, 0x1a, 0x4d, 0xf7, 0x65, + 0x9d, 0x0a, 0xb5, 0x92, 0x4b, 0x96, 0x3b, 0x20, 0x43, 0xb6, 0xec, 0x92, 0xb6, 0xb7, 0xb6, 0xd8, + 0x96, 0xe4, 0x8b, 0xc7, 0xfe, 0xfa, 0x83, 0xe3, 0xe5, 0x6f, 0x7f, 0x70, 0xbc, 0xfc, 0xfd, 0x0f, + 0x8e, 0x97, 0x7f, 0xf9, 0x07, 0xc7, 0x4b, 0xdf, 0xfe, 0xc1, 0xf1, 0xd2, 0x3f, 0xfe, 0xe0, 0x78, + 0xe9, 0xfd, 0xca, 0x68, 0x63, 0xa3, 0xc1, 0x2e, 0xba, 0x5c, 0xfc, 0xaf, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x12, 0x2b, 0x47, 0xb9, 0x15, 0x67, 0x00, 0x00, } func (m *Event) Marshal() (dAtA []byte, err error) { @@ -14409,6 +14487,29 @@ func (m *EventMessageValueOfImportFinish) MarshalToSizedBuffer(dAtA []byte) (int } return len(dAtA) - i, nil } +func (m *EventMessageValueOfSpaceAutoWidgetAdded) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventMessageValueOfSpaceAutoWidgetAdded) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.SpaceAutoWidgetAdded != nil { + { + size, err := m.SpaceAutoWidgetAdded.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x7 + i-- + dAtA[i] = 0xd2 + } + return len(dAtA) - i, nil +} func (m *EventMessageValueOfBlockDataviewRelationSet) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) @@ -16343,20 +16444,20 @@ func (m *EventBlockMarksInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { var l int _ = l if len(m.MarksInRange) > 0 { - dAtA96 := make([]byte, len(m.MarksInRange)*10) - var j95 int + dAtA97 := make([]byte, len(m.MarksInRange)*10) + var j96 int for _, num := range m.MarksInRange { for num >= 1<<7 { - dAtA96[j95] = uint8(uint64(num)&0x7f | 0x80) + dAtA97[j96] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j95++ + j96++ } - dAtA96[j95] = uint8(num) - j95++ + dAtA97[j96] = uint8(num) + j96++ } - i -= j95 - copy(dAtA[i:], dAtA96[:j95]) - i = encodeVarintEvents(dAtA, i, uint64(j95)) + i -= j96 + copy(dAtA[i:], dAtA97[:j96]) + i = encodeVarintEvents(dAtA, i, uint64(j96)) i-- dAtA[i] = 0xa } @@ -22692,6 +22793,50 @@ func (m *EventSpaceSyncStatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, err return len(dAtA) - i, nil } +func (m *EventSpaceAutoWidgetAdded) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EventSpaceAutoWidgetAdded) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventSpaceAutoWidgetAdded) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.WidgetBlockId) > 0 { + i -= len(m.WidgetBlockId) + copy(dAtA[i:], m.WidgetBlockId) + i = encodeVarintEvents(dAtA, i, uint64(len(m.WidgetBlockId))) + i-- + dAtA[i] = 0x1a + } + if len(m.TargetName) > 0 { + i -= len(m.TargetName) + copy(dAtA[i:], m.TargetName) + i = encodeVarintEvents(dAtA, i, uint64(len(m.TargetName))) + i-- + dAtA[i] = 0x12 + } + if len(m.TargetId) > 0 { + i -= len(m.TargetId) + copy(dAtA[i:], m.TargetId) + i = encodeVarintEvents(dAtA, i, uint64(len(m.TargetId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *EventP2PStatus) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -24008,6 +24153,18 @@ func (m *EventMessageValueOfImportFinish) Size() (n int) { } return n } +func (m *EventMessageValueOfSpaceAutoWidgetAdded) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SpaceAutoWidgetAdded != nil { + l = m.SpaceAutoWidgetAdded.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} func (m *EventMessageValueOfBlockDataviewRelationSet) Size() (n int) { if m == nil { return 0 @@ -27563,6 +27720,27 @@ func (m *EventSpaceSyncStatusUpdate) Size() (n int) { return n } +func (m *EventSpaceAutoWidgetAdded) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.TargetId) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + l = len(m.TargetName) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + l = len(m.WidgetBlockId) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + return n +} + func (m *EventP2PStatus) Size() (n int) { if m == nil { return 0 @@ -30160,6 +30338,41 @@ func (m *EventMessage) Unmarshal(dAtA []byte) error { } m.Value = &EventMessageValueOfImportFinish{v} iNdEx = postIndex + case 122: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SpaceAutoWidgetAdded", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &EventSpaceAutoWidgetAdded{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &EventMessageValueOfSpaceAutoWidgetAdded{v} + iNdEx = postIndex case 123: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field BlockDataviewRelationSet", wireType) @@ -51996,6 +52209,152 @@ func (m *EventSpaceSyncStatusUpdate) Unmarshal(dAtA []byte) error { } return nil } +func (m *EventSpaceAutoWidgetAdded) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AutoWidgetAdded: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AutoWidgetAdded: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TargetId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TargetId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TargetName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TargetName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WidgetBlockId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.WidgetBlockId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *EventP2PStatus) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pb/protos/events.proto b/pb/protos/events.proto index 0b407d61e..ad930e121 100644 --- a/pb/protos/events.proto +++ b/pb/protos/events.proto @@ -108,6 +108,7 @@ message Event { Membership.Update membershipUpdate = 117; Space.SyncStatus.Update spaceSyncStatusUpdate = 119; + Space.AutoWidgetAdded spaceAutoWidgetAdded = 122; P2PStatus.Update p2pStatusUpdate = 120; @@ -1154,6 +1155,12 @@ message Event { IncompatibleVersion = 2; NetworkError = 3; } + + message AutoWidgetAdded { + string targetId = 1; + string targetName = 2; // pluralName (if exists) for types, fallback to name. Special cases for "bin" and "favorites" + string widgetBlockId = 3; + } } message P2PStatus { message Update { diff --git a/pkg/lib/pb/model/models.pb.go b/pkg/lib/pb/model/models.pb.go index 329c3b35c..67122633a 100644 --- a/pkg/lib/pb/model/models.pb.go +++ b/pkg/lib/pb/model/models.pb.go @@ -5166,9 +5166,10 @@ func (m *BlockContentTableRow) GetIsHeader() bool { } type BlockContentWidget struct { - Layout BlockContentWidgetLayout `protobuf:"varint,1,opt,name=layout,proto3,enum=anytype.model.BlockContentWidgetLayout" json:"layout,omitempty"` - Limit int32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` - ViewId string `protobuf:"bytes,3,opt,name=viewId,proto3" json:"viewId,omitempty"` + Layout BlockContentWidgetLayout `protobuf:"varint,1,opt,name=layout,proto3,enum=anytype.model.BlockContentWidgetLayout" json:"layout,omitempty"` + Limit int32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + ViewId string `protobuf:"bytes,3,opt,name=viewId,proto3" json:"viewId,omitempty"` + AutoAdded bool `protobuf:"varint,4,opt,name=autoAdded,proto3" json:"autoAdded,omitempty"` } func (m *BlockContentWidget) Reset() { *m = BlockContentWidget{} } @@ -5225,6 +5226,13 @@ func (m *BlockContentWidget) GetViewId() string { return "" } +func (m *BlockContentWidget) GetAutoAdded() bool { + if m != nil { + return m.AutoAdded + } + return false +} + type BlockContentChat struct { } @@ -7356,7 +7364,6 @@ type Notification struct { // *NotificationPayloadOfParticipantRemove // *NotificationPayloadOfParticipantRequestDecline // *NotificationPayloadOfParticipantPermissionsChange - // *NotificationPayloadOfAutoTypeWidgetAdded Payload IsNotificationPayload `protobuf_oneof:"payload"` Space string `protobuf:"bytes,7,opt,name=space,proto3" json:"space,omitempty"` AclHeadId string `protobuf:"bytes,14,opt,name=aclHeadId,proto3" json:"aclHeadId,omitempty"` @@ -7431,9 +7438,6 @@ type NotificationPayloadOfParticipantRequestDecline struct { type NotificationPayloadOfParticipantPermissionsChange struct { ParticipantPermissionsChange *NotificationParticipantPermissionsChange `protobuf:"bytes,18,opt,name=participantPermissionsChange,proto3,oneof" json:"participantPermissionsChange,omitempty"` } -type NotificationPayloadOfAutoTypeWidgetAdded struct { - AutoTypeWidgetAdded *NotificationAutoTypeWidgetAdded `protobuf:"bytes,19,opt,name=autoTypeWidgetAdded,proto3,oneof" json:"autoTypeWidgetAdded,omitempty"` -} func (*NotificationPayloadOfImport) IsNotificationPayload() {} func (*NotificationPayloadOfExport) IsNotificationPayload() {} @@ -7445,7 +7449,6 @@ func (*NotificationPayloadOfRequestToLeave) IsNotificationPayload() func (*NotificationPayloadOfParticipantRemove) IsNotificationPayload() {} func (*NotificationPayloadOfParticipantRequestDecline) IsNotificationPayload() {} func (*NotificationPayloadOfParticipantPermissionsChange) IsNotificationPayload() {} -func (*NotificationPayloadOfAutoTypeWidgetAdded) IsNotificationPayload() {} func (m *Notification) GetPayload() IsNotificationPayload { if m != nil { @@ -7559,13 +7562,6 @@ func (m *Notification) GetParticipantPermissionsChange() *NotificationParticipan return nil } -func (m *Notification) GetAutoTypeWidgetAdded() *NotificationAutoTypeWidgetAdded { - if x, ok := m.GetPayload().(*NotificationPayloadOfAutoTypeWidgetAdded); ok { - return x.AutoTypeWidgetAdded - } - return nil -} - func (m *Notification) GetSpace() string { if m != nil { return m.Space @@ -7593,7 +7589,6 @@ func (*Notification) XXX_OneofWrappers() []interface{} { (*NotificationPayloadOfParticipantRemove)(nil), (*NotificationPayloadOfParticipantRequestDecline)(nil), (*NotificationPayloadOfParticipantPermissionsChange)(nil), - (*NotificationPayloadOfAutoTypeWidgetAdded)(nil), } } @@ -8249,66 +8244,6 @@ func (m *NotificationParticipantPermissionsChange) GetSpaceName() string { return "" } -type NotificationAutoTypeWidgetAdded struct { - SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` - TypePluralName string `protobuf:"bytes,2,opt,name=typePluralName,proto3" json:"typePluralName,omitempty"` - WidgetBlockId string `protobuf:"bytes,3,opt,name=widgetBlockId,proto3" json:"widgetBlockId,omitempty"` -} - -func (m *NotificationAutoTypeWidgetAdded) Reset() { *m = NotificationAutoTypeWidgetAdded{} } -func (m *NotificationAutoTypeWidgetAdded) String() string { return proto.CompactTextString(m) } -func (*NotificationAutoTypeWidgetAdded) ProtoMessage() {} -func (*NotificationAutoTypeWidgetAdded) Descriptor() ([]byte, []int) { - return fileDescriptor_98a910b73321e591, []int{21, 10} -} -func (m *NotificationAutoTypeWidgetAdded) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *NotificationAutoTypeWidgetAdded) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NotificationAutoTypeWidgetAdded.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *NotificationAutoTypeWidgetAdded) XXX_Merge(src proto.Message) { - xxx_messageInfo_NotificationAutoTypeWidgetAdded.Merge(m, src) -} -func (m *NotificationAutoTypeWidgetAdded) XXX_Size() int { - return m.Size() -} -func (m *NotificationAutoTypeWidgetAdded) XXX_DiscardUnknown() { - xxx_messageInfo_NotificationAutoTypeWidgetAdded.DiscardUnknown(m) -} - -var xxx_messageInfo_NotificationAutoTypeWidgetAdded proto.InternalMessageInfo - -func (m *NotificationAutoTypeWidgetAdded) GetSpaceId() string { - if m != nil { - return m.SpaceId - } - return "" -} - -func (m *NotificationAutoTypeWidgetAdded) GetTypePluralName() string { - if m != nil { - return m.TypePluralName - } - return "" -} - -func (m *NotificationAutoTypeWidgetAdded) GetWidgetBlockId() string { - if m != nil { - return m.WidgetBlockId - } - return "" -} - type Export struct { } @@ -9875,7 +9810,6 @@ func init() { proto.RegisterType((*NotificationParticipantRemove)(nil), "anytype.model.Notification.ParticipantRemove") proto.RegisterType((*NotificationParticipantRequestDecline)(nil), "anytype.model.Notification.ParticipantRequestDecline") proto.RegisterType((*NotificationParticipantPermissionsChange)(nil), "anytype.model.Notification.ParticipantPermissionsChange") - proto.RegisterType((*NotificationAutoTypeWidgetAdded)(nil), "anytype.model.Notification.AutoTypeWidgetAdded") proto.RegisterType((*Export)(nil), "anytype.model.Export") proto.RegisterType((*Import)(nil), "anytype.model.Import") proto.RegisterType((*Invite)(nil), "anytype.model.Invite") @@ -9903,588 +9837,585 @@ func init() { } var fileDescriptor_98a910b73321e591 = []byte{ - // 9288 bytes of a gzipped FileDescriptorProto + // 9237 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x7d, 0x5b, 0x8c, 0x23, 0xc9, - 0x91, 0x58, 0xf3, 0x4d, 0x06, 0xfb, 0x91, 0x9d, 0xf3, 0xa2, 0xa8, 0xb9, 0xf1, 0x88, 0x5a, 0xed, - 0x8e, 0x46, 0xab, 0x9e, 0xdd, 0xd9, 0x5d, 0xed, 0x6a, 0xa5, 0x5d, 0x89, 0xcd, 0x66, 0x4f, 0x73, - 0xa7, 0x5f, 0x2a, 0x72, 0x66, 0xb4, 0x8b, 0x3b, 0xb7, 0xab, 0x59, 0xd9, 0x64, 0xa9, 0x8b, 0x55, - 0x54, 0x55, 0xb2, 0xa7, 0x5b, 0xf0, 0x19, 0xf2, 0xeb, 0xce, 0xf7, 0x27, 0x1b, 0x3e, 0xdb, 0x07, - 0xc3, 0x38, 0xe9, 0xc3, 0x80, 0xe1, 0x3b, 0xc3, 0x5f, 0x82, 0x7d, 0xb6, 0x0f, 0xb8, 0x33, 0x60, - 0xc0, 0x80, 0x7f, 0x64, 0x7f, 0xf9, 0xc3, 0x80, 0x8d, 0x15, 0xe0, 0x1f, 0xc3, 0x3e, 0x9c, 0x01, - 0x03, 0x82, 0xe1, 0x0f, 0x23, 0x22, 0xb3, 0x5e, 0x24, 0xbb, 0x87, 0xb3, 0x77, 0x67, 0xf8, 0xab, - 0x99, 0x51, 0x11, 0x91, 0xaf, 0xc8, 0xc8, 0x88, 0xc8, 0xc8, 0x6c, 0x78, 0x65, 0x7c, 0x3a, 0x78, - 0xe0, 0xd8, 0xc7, 0x0f, 0xc6, 0xc7, 0x0f, 0x46, 0x9e, 0x25, 0x9c, 0x07, 0x63, 0xdf, 0x93, 0x5e, - 0xa0, 0x0a, 0xc1, 0x06, 0x95, 0xf8, 0x8a, 0xe9, 0x5e, 0xc8, 0x8b, 0xb1, 0xd8, 0x20, 0x68, 0xfd, - 0xf6, 0xc0, 0xf3, 0x06, 0x8e, 0x50, 0xa8, 0xc7, 0x93, 0x93, 0x07, 0x81, 0xf4, 0x27, 0x7d, 0xa9, - 0x90, 0x1b, 0x3f, 0xcb, 0xc3, 0xcd, 0xee, 0xc8, 0xf4, 0xe5, 0xa6, 0xe3, 0xf5, 0x4f, 0xbb, 0xae, - 0x39, 0x0e, 0x86, 0x9e, 0xdc, 0x34, 0x03, 0xc1, 0x5f, 0x87, 0xe2, 0x31, 0x02, 0x83, 0x5a, 0xe6, - 0x6e, 0xee, 0x5e, 0xf5, 0xe1, 0xf5, 0x8d, 0x14, 0xe3, 0x0d, 0xa2, 0x30, 0x34, 0x0e, 0x7f, 0x13, - 0x4a, 0x96, 0x90, 0xa6, 0xed, 0x04, 0xb5, 0xec, 0xdd, 0xcc, 0xbd, 0xea, 0xc3, 0x5b, 0x1b, 0xaa, - 0xe2, 0x8d, 0xb0, 0xe2, 0x8d, 0x2e, 0x55, 0x6c, 0x84, 0x78, 0xfc, 0x5d, 0x28, 0x9f, 0xd8, 0x8e, - 0x78, 0x2c, 0x2e, 0x82, 0x5a, 0xee, 0x4a, 0x9a, 0xcd, 0x6c, 0x2d, 0x63, 0x44, 0xc8, 0xbc, 0x05, - 0xab, 0xe2, 0x5c, 0xfa, 0xa6, 0x21, 0x1c, 0x53, 0xda, 0x9e, 0x1b, 0xd4, 0xf2, 0xd4, 0xc2, 0x5b, - 0x53, 0x2d, 0x0c, 0xbf, 0x13, 0xf9, 0x14, 0x09, 0xbf, 0x0b, 0x55, 0xef, 0xf8, 0x7b, 0xa2, 0x2f, - 0x7b, 0x17, 0x63, 0x11, 0xd4, 0x0a, 0x77, 0x73, 0xf7, 0x2a, 0x46, 0x12, 0xc4, 0xbf, 0x0e, 0xd5, - 0xbe, 0xe7, 0x38, 0xa2, 0xaf, 0xea, 0x28, 0x5e, 0xdd, 0xad, 0x24, 0x2e, 0x7f, 0x1b, 0x6e, 0xf8, - 0x62, 0xe4, 0x9d, 0x09, 0xab, 0x15, 0x41, 0xa9, 0x9f, 0x65, 0xaa, 0x66, 0xfe, 0x47, 0xde, 0x84, - 0x15, 0x5f, 0xb7, 0x6f, 0xd7, 0x76, 0x4f, 0x83, 0x5a, 0x89, 0xba, 0xf5, 0xf9, 0x4b, 0xba, 0x85, - 0x38, 0x46, 0x9a, 0x82, 0x33, 0xc8, 0x9d, 0x8a, 0x8b, 0x5a, 0xe5, 0x6e, 0xe6, 0x5e, 0xc5, 0xc0, - 0x9f, 0xfc, 0x7d, 0xa8, 0x79, 0xbe, 0x3d, 0xb0, 0x5d, 0xd3, 0x69, 0xf9, 0xc2, 0x94, 0xc2, 0xea, - 0xd9, 0x23, 0x11, 0x48, 0x73, 0x34, 0xae, 0xc1, 0xdd, 0xcc, 0xbd, 0x9c, 0x71, 0xe9, 0x77, 0xfe, - 0x96, 0x9a, 0xa1, 0x8e, 0x7b, 0xe2, 0xd5, 0xaa, 0xba, 0xfb, 0xe9, 0xb6, 0x6c, 0xeb, 0xcf, 0x46, - 0x84, 0xd8, 0xf8, 0x45, 0x16, 0x8a, 0x5d, 0x61, 0xfa, 0xfd, 0x61, 0xfd, 0xd7, 0x33, 0x50, 0x34, - 0x44, 0x30, 0x71, 0x24, 0xaf, 0x43, 0x59, 0x8d, 0x6d, 0xc7, 0xaa, 0x65, 0xa8, 0x75, 0x51, 0xf9, - 0xb3, 0xc8, 0xce, 0x06, 0xe4, 0x47, 0x42, 0x9a, 0xb5, 0x1c, 0x8d, 0x50, 0x7d, 0xaa, 0x55, 0xaa, - 0xfa, 0x8d, 0x3d, 0x21, 0x4d, 0x83, 0xf0, 0xea, 0x3f, 0xcf, 0x40, 0x1e, 0x8b, 0xfc, 0x36, 0x54, - 0x86, 0xf6, 0x60, 0xe8, 0xd8, 0x83, 0xa1, 0xd4, 0x0d, 0x89, 0x01, 0xfc, 0x43, 0x58, 0x8b, 0x0a, - 0x86, 0xe9, 0x0e, 0x04, 0xb6, 0x68, 0x9e, 0xf0, 0xd3, 0x47, 0x63, 0x1a, 0x99, 0xd7, 0xa0, 0x44, - 0xeb, 0xa1, 0x63, 0x91, 0x44, 0x57, 0x8c, 0xb0, 0x88, 0xe2, 0x16, 0xce, 0xd4, 0x63, 0x71, 0x51, - 0xcb, 0xd3, 0xd7, 0x24, 0x88, 0x37, 0x61, 0x2d, 0x2c, 0x6e, 0xe9, 0xd1, 0x28, 0x5c, 0x3d, 0x1a, - 0xd3, 0xf8, 0x8d, 0x4f, 0x77, 0xa1, 0x40, 0xcb, 0x92, 0xaf, 0x42, 0xd6, 0x0e, 0x07, 0x3a, 0x6b, - 0x5b, 0xfc, 0x01, 0x14, 0x4f, 0x6c, 0xe1, 0x58, 0x2f, 0x1c, 0x61, 0x8d, 0xc6, 0xdb, 0xb0, 0xec, - 0x8b, 0x40, 0xfa, 0xb6, 0x96, 0x7e, 0xb5, 0x40, 0xbf, 0x30, 0x4f, 0x07, 0x6c, 0x18, 0x09, 0x44, - 0x23, 0x45, 0x86, 0xdd, 0xee, 0x0f, 0x6d, 0xc7, 0xf2, 0x85, 0xdb, 0xb1, 0xd4, 0x3a, 0xad, 0x18, - 0x49, 0x10, 0xbf, 0x07, 0x6b, 0xc7, 0x66, 0xff, 0x74, 0xe0, 0x7b, 0x13, 0x17, 0x17, 0x84, 0xe7, - 0x53, 0xb7, 0x2b, 0xc6, 0x34, 0x98, 0xbf, 0x01, 0x05, 0xd3, 0xb1, 0x07, 0x2e, 0xad, 0xc4, 0xd5, - 0x99, 0x49, 0x57, 0x6d, 0x69, 0x22, 0x86, 0xa1, 0x10, 0xf9, 0x0e, 0xac, 0x9c, 0x09, 0x5f, 0xda, - 0x7d, 0xd3, 0x21, 0x78, 0xad, 0x44, 0x94, 0x8d, 0xb9, 0x94, 0x4f, 0x93, 0x98, 0x46, 0x9a, 0x90, - 0x77, 0x00, 0x02, 0x54, 0x93, 0x34, 0x9d, 0x7a, 0x2d, 0xbc, 0x36, 0x97, 0x4d, 0xcb, 0x73, 0xa5, - 0x70, 0xe5, 0x46, 0x37, 0x42, 0xdf, 0x59, 0x32, 0x12, 0xc4, 0xfc, 0x5d, 0xc8, 0x4b, 0x71, 0x2e, - 0x6b, 0xab, 0x57, 0x8c, 0x68, 0xc8, 0xa4, 0x27, 0xce, 0xe5, 0xce, 0x92, 0x41, 0x04, 0x48, 0x88, - 0x8b, 0xac, 0xb6, 0xb6, 0x00, 0x21, 0xae, 0x4b, 0x24, 0x44, 0x02, 0xfe, 0x01, 0x14, 0x1d, 0xf3, - 0xc2, 0x9b, 0xc8, 0x1a, 0x23, 0xd2, 0x2f, 0x5e, 0x49, 0xba, 0x4b, 0xa8, 0x3b, 0x4b, 0x86, 0x26, - 0xe2, 0x6f, 0x43, 0xce, 0xb2, 0xcf, 0x6a, 0xeb, 0x44, 0x7b, 0xf7, 0x4a, 0xda, 0x2d, 0xfb, 0x6c, - 0x67, 0xc9, 0x40, 0x74, 0xde, 0x82, 0xf2, 0xb1, 0xe7, 0x9d, 0x8e, 0x4c, 0xff, 0xb4, 0xc6, 0x89, - 0xf4, 0x4b, 0x57, 0x92, 0x6e, 0x6a, 0xe4, 0x9d, 0x25, 0x23, 0x22, 0xc4, 0x2e, 0xdb, 0x7d, 0xcf, - 0xad, 0x5d, 0x5b, 0xa0, 0xcb, 0x9d, 0xbe, 0xe7, 0x62, 0x97, 0x91, 0x00, 0x09, 0x1d, 0xdb, 0x3d, - 0xad, 0x5d, 0x5f, 0x80, 0x10, 0x35, 0x27, 0x12, 0x22, 0x01, 0x36, 0xdb, 0x32, 0xa5, 0x79, 0x66, - 0x8b, 0xe7, 0xb5, 0x1b, 0x0b, 0x34, 0x7b, 0x4b, 0x23, 0x63, 0xb3, 0x43, 0x42, 0x64, 0x12, 0x2e, - 0xcd, 0xda, 0xcd, 0x05, 0x98, 0x84, 0x1a, 0x1d, 0x99, 0x84, 0x84, 0xfc, 0xcf, 0xc3, 0xfa, 0x89, - 0x30, 0xe5, 0xc4, 0x17, 0x56, 0xbc, 0xd1, 0xdd, 0x22, 0x6e, 0x1b, 0x57, 0xcf, 0xfd, 0x34, 0xd5, - 0xce, 0x92, 0x31, 0xcb, 0x8a, 0xbf, 0x0f, 0x05, 0xc7, 0x94, 0xe2, 0xbc, 0x56, 0x23, 0x9e, 0x8d, - 0x17, 0x08, 0x85, 0x14, 0xe7, 0x3b, 0x4b, 0x86, 0x22, 0xe1, 0xdf, 0x85, 0x35, 0x69, 0x1e, 0x3b, - 0xe2, 0xe0, 0x44, 0x23, 0x04, 0xb5, 0xcf, 0x11, 0x97, 0xd7, 0xaf, 0x16, 0xe7, 0x34, 0xcd, 0xce, - 0x92, 0x31, 0xcd, 0x06, 0x5b, 0x45, 0xa0, 0x5a, 0x7d, 0x81, 0x56, 0x11, 0x3f, 0x6c, 0x15, 0x91, - 0xf0, 0x5d, 0xa8, 0xd2, 0x8f, 0x96, 0xe7, 0x4c, 0x46, 0x6e, 0xed, 0xf3, 0xc4, 0xe1, 0xde, 0x8b, - 0x39, 0x28, 0xfc, 0x9d, 0x25, 0x23, 0x49, 0x8e, 0x93, 0x48, 0x45, 0xc3, 0x7b, 0x5e, 0xbb, 0xbd, - 0xc0, 0x24, 0xf6, 0x34, 0x32, 0x4e, 0x62, 0x48, 0x88, 0x4b, 0xef, 0xb9, 0x6d, 0x0d, 0x84, 0xac, - 0xfd, 0xd2, 0x02, 0x4b, 0xef, 0x19, 0xa1, 0xe2, 0xd2, 0x53, 0x44, 0x28, 0xc6, 0xfd, 0xa1, 0x29, - 0x6b, 0x77, 0x16, 0x10, 0xe3, 0xd6, 0xd0, 0x24, 0x5d, 0x81, 0x04, 0xf5, 0x1f, 0xc0, 0x72, 0x52, - 0x2b, 0x73, 0x0e, 0x79, 0x5f, 0x98, 0x6a, 0x47, 0x28, 0x1b, 0xf4, 0x1b, 0x61, 0xc2, 0xb2, 0x25, - 0xed, 0x08, 0x65, 0x83, 0x7e, 0xf3, 0x9b, 0x50, 0x54, 0xb6, 0x09, 0x29, 0xfc, 0xb2, 0xa1, 0x4b, - 0x88, 0x6b, 0xf9, 0xe6, 0x80, 0xf6, 0xad, 0xb2, 0x41, 0xbf, 0x11, 0xd7, 0xf2, 0xbd, 0xf1, 0x81, - 0x4b, 0x0a, 0xbb, 0x6c, 0xe8, 0x52, 0xfd, 0xdf, 0x7c, 0x00, 0x25, 0xdd, 0xa8, 0xfa, 0x3f, 0xc8, - 0x40, 0x51, 0x29, 0x14, 0xfe, 0x2d, 0x28, 0x04, 0xf2, 0xc2, 0x11, 0xd4, 0x86, 0xd5, 0x87, 0x5f, - 0x5e, 0x40, 0x09, 0x6d, 0x74, 0x91, 0xc0, 0x50, 0x74, 0x0d, 0x03, 0x0a, 0x54, 0xe6, 0x25, 0xc8, - 0x19, 0xde, 0x73, 0xb6, 0xc4, 0x01, 0x8a, 0x6a, 0xb2, 0x58, 0x06, 0x81, 0x5b, 0xf6, 0x19, 0xcb, - 0x22, 0x70, 0x47, 0x98, 0x96, 0xf0, 0x59, 0x8e, 0xaf, 0x40, 0x25, 0x9c, 0x96, 0x80, 0xe5, 0x39, - 0x83, 0xe5, 0xc4, 0x84, 0x07, 0xac, 0x50, 0xff, 0x9f, 0x79, 0xc8, 0xe3, 0xfa, 0xe7, 0xaf, 0xc0, - 0x8a, 0x34, 0xfd, 0x81, 0x50, 0x86, 0x70, 0x64, 0xa4, 0xa4, 0x81, 0xfc, 0x83, 0xb0, 0x0f, 0x59, - 0xea, 0xc3, 0x6b, 0x2f, 0xd4, 0x2b, 0xa9, 0x1e, 0x24, 0x76, 0xe1, 0xdc, 0x62, 0xbb, 0xf0, 0x36, - 0x94, 0x51, 0x9d, 0x75, 0xed, 0x1f, 0x08, 0x1a, 0xfa, 0xd5, 0x87, 0xf7, 0x5f, 0x5c, 0x65, 0x47, - 0x53, 0x18, 0x11, 0x2d, 0xef, 0x40, 0xa5, 0x6f, 0xfa, 0x16, 0x35, 0x86, 0x66, 0x6b, 0xf5, 0xe1, - 0x57, 0x5e, 0xcc, 0xa8, 0x15, 0x92, 0x18, 0x31, 0x35, 0x3f, 0x80, 0xaa, 0x25, 0x82, 0xbe, 0x6f, - 0x8f, 0x49, 0xbd, 0xa9, 0xbd, 0xf8, 0xab, 0x2f, 0x66, 0xb6, 0x15, 0x13, 0x19, 0x49, 0x0e, 0x68, - 0x91, 0xf9, 0x91, 0x7e, 0x2b, 0x91, 0x81, 0x10, 0x03, 0x1a, 0xef, 0x42, 0x39, 0xec, 0x0f, 0x5f, - 0x86, 0x32, 0xfe, 0xdd, 0xf7, 0x5c, 0xc1, 0x96, 0x70, 0x6e, 0xb1, 0xd4, 0x1d, 0x99, 0x8e, 0xc3, - 0x32, 0x7c, 0x15, 0x00, 0x8b, 0x7b, 0xc2, 0xb2, 0x27, 0x23, 0x96, 0x6d, 0x7c, 0x23, 0x94, 0x96, - 0x32, 0xe4, 0x0f, 0xcd, 0x01, 0x52, 0x2c, 0x43, 0x39, 0x54, 0xd7, 0x2c, 0x83, 0xf4, 0x5b, 0x66, - 0x30, 0x3c, 0xf6, 0x4c, 0xdf, 0x62, 0x59, 0x5e, 0x85, 0x52, 0xd3, 0xef, 0x0f, 0xed, 0x33, 0xc1, - 0x72, 0x8d, 0x07, 0x50, 0x4d, 0xb4, 0x17, 0x59, 0xe8, 0x4a, 0x2b, 0x50, 0x68, 0x5a, 0x96, 0xb0, - 0x58, 0x06, 0x09, 0x74, 0x07, 0x59, 0xb6, 0xf1, 0x15, 0xa8, 0x44, 0xa3, 0x85, 0xe8, 0xb8, 0x71, - 0xb3, 0x25, 0xfc, 0x85, 0x60, 0x96, 0x41, 0xa9, 0xec, 0xb8, 0x8e, 0xed, 0x0a, 0x96, 0xad, 0xff, - 0x05, 0x12, 0x55, 0xfe, 0xcd, 0xf4, 0x82, 0x78, 0xf5, 0x45, 0x3b, 0x6b, 0x7a, 0x35, 0x7c, 0x3e, - 0xd1, 0xbf, 0x5d, 0x9b, 0x1a, 0x57, 0x86, 0xfc, 0x96, 0x27, 0x03, 0x96, 0xa9, 0xff, 0xb7, 0x2c, - 0x94, 0xc3, 0x0d, 0x15, 0x7d, 0x82, 0x89, 0xef, 0x68, 0x81, 0xc6, 0x9f, 0xfc, 0x3a, 0x14, 0xa4, - 0x2d, 0xb5, 0x18, 0x57, 0x0c, 0x55, 0x40, 0x5b, 0x2d, 0x39, 0xb3, 0xca, 0x80, 0x9d, 0x9e, 0x2a, - 0x7b, 0x64, 0x0e, 0xc4, 0x8e, 0x19, 0x0c, 0xb5, 0x09, 0x1b, 0x03, 0x90, 0xfe, 0xc4, 0x3c, 0x43, - 0x99, 0xa3, 0xef, 0xca, 0x8a, 0x4b, 0x82, 0xf8, 0x5b, 0x90, 0xc7, 0x0e, 0x6a, 0xa1, 0xf9, 0x73, - 0x53, 0x1d, 0x46, 0x31, 0x39, 0xf4, 0x05, 0x4e, 0xcf, 0x06, 0x7a, 0x60, 0x06, 0x21, 0xf3, 0x57, - 0x61, 0x55, 0x2d, 0xc2, 0x83, 0xd0, 0x7f, 0x28, 0x11, 0xe7, 0x29, 0x28, 0x6f, 0xe2, 0x70, 0x9a, - 0x52, 0xd4, 0xca, 0x0b, 0xc8, 0x77, 0x38, 0x38, 0x1b, 0x5d, 0x24, 0x31, 0x14, 0x65, 0xe3, 0x1d, - 0x1c, 0x53, 0x53, 0x0a, 0x9c, 0xe6, 0xf6, 0x68, 0x2c, 0x2f, 0x94, 0xd0, 0x6c, 0x0b, 0xd9, 0x1f, - 0xda, 0xee, 0x80, 0x65, 0xd4, 0x10, 0xe3, 0x24, 0x12, 0x8a, 0xef, 0x7b, 0x3e, 0xcb, 0xd5, 0xeb, - 0x90, 0x47, 0x19, 0x45, 0x25, 0xe9, 0x9a, 0x23, 0xa1, 0x47, 0x9a, 0x7e, 0xd7, 0xaf, 0xc1, 0xfa, - 0xcc, 0x7e, 0x5c, 0xff, 0xbd, 0xa2, 0x92, 0x10, 0xa4, 0x20, 0x5b, 0x50, 0x53, 0x90, 0x99, 0xf7, - 0x52, 0x3a, 0x06, 0xb9, 0xa4, 0x75, 0xcc, 0x07, 0x50, 0xc0, 0x8e, 0x85, 0x2a, 0x66, 0x01, 0xf2, - 0x3d, 0x44, 0x37, 0x14, 0x15, 0x7a, 0x30, 0xfd, 0xa1, 0xe8, 0x9f, 0x0a, 0x4b, 0xeb, 0xfa, 0xb0, - 0x88, 0x42, 0xd3, 0x4f, 0x98, 0xe7, 0xaa, 0x40, 0x22, 0xd1, 0xf7, 0xdc, 0xf6, 0xc8, 0xfb, 0x9e, - 0x4d, 0xf3, 0x8a, 0x22, 0x11, 0x02, 0xc2, 0xaf, 0x1d, 0x94, 0x11, 0x3d, 0x6d, 0x31, 0xa0, 0xde, - 0x86, 0x02, 0xd5, 0x8d, 0x2b, 0x41, 0xb5, 0x59, 0x45, 0x1a, 0x5e, 0x5d, 0xac, 0xcd, 0xba, 0xc9, - 0xf5, 0xdf, 0xcd, 0x42, 0x1e, 0xcb, 0xfc, 0x3e, 0x14, 0x7c, 0xf4, 0xc3, 0x68, 0x38, 0x2f, 0xf3, - 0xd9, 0x14, 0x0a, 0xff, 0x96, 0x16, 0xc5, 0xec, 0x02, 0xc2, 0x12, 0xd5, 0x98, 0x14, 0xcb, 0xeb, - 0x50, 0x18, 0x9b, 0xbe, 0x39, 0xd2, 0xeb, 0x44, 0x15, 0x1a, 0x3f, 0xce, 0x40, 0x1e, 0x91, 0xf8, - 0x3a, 0xac, 0x74, 0xa5, 0x6f, 0x9f, 0x0a, 0x39, 0xf4, 0xbd, 0xc9, 0x60, 0xa8, 0x24, 0xe9, 0xb1, - 0xb8, 0x50, 0xfa, 0x46, 0x29, 0x04, 0x69, 0x3a, 0x76, 0x9f, 0x65, 0x51, 0xaa, 0x36, 0x3d, 0xc7, - 0x62, 0x39, 0xbe, 0x06, 0xd5, 0x27, 0xae, 0x25, 0xfc, 0xa0, 0xef, 0xf9, 0xc2, 0x62, 0x79, 0xbd, - 0xba, 0x4f, 0x59, 0x81, 0xf6, 0x32, 0x71, 0x2e, 0xc9, 0x17, 0x62, 0x45, 0x7e, 0x0d, 0xd6, 0x36, - 0xd3, 0x0e, 0x12, 0x2b, 0xa1, 0x4e, 0xda, 0x13, 0x2e, 0x0a, 0x19, 0x2b, 0x2b, 0x21, 0xf6, 0xbe, - 0x67, 0xb3, 0x0a, 0x56, 0xa6, 0xd6, 0x09, 0x83, 0xc6, 0xbf, 0xca, 0x84, 0x9a, 0x63, 0x05, 0x2a, - 0x87, 0xa6, 0x6f, 0x0e, 0x7c, 0x73, 0x8c, 0xed, 0xab, 0x42, 0x49, 0x6d, 0x9c, 0x6f, 0x2a, 0xed, - 0xa6, 0x0a, 0x0f, 0x95, 0x6e, 0x54, 0x85, 0xb7, 0x58, 0x2e, 0x2e, 0xbc, 0xcd, 0xf2, 0x58, 0xc7, - 0x77, 0x26, 0x9e, 0x14, 0xac, 0x40, 0xba, 0xce, 0xb3, 0x04, 0x2b, 0x22, 0xb0, 0x87, 0x1a, 0x85, - 0x95, 0xb0, 0xcf, 0x2d, 0x94, 0x9f, 0x63, 0xef, 0x9c, 0x95, 0xb1, 0x19, 0x38, 0x8c, 0xc2, 0x62, - 0x15, 0xfc, 0xb2, 0x3f, 0x19, 0x1d, 0x0b, 0xec, 0x26, 0xe0, 0x97, 0x9e, 0x37, 0x18, 0x38, 0x82, - 0x55, 0x71, 0x0c, 0x12, 0xca, 0x97, 0x2d, 0x93, 0xa6, 0x35, 0x1d, 0xc7, 0x9b, 0x48, 0xb6, 0x52, - 0xff, 0x45, 0x0e, 0xf2, 0xe8, 0xdd, 0xe0, 0xda, 0x19, 0xa2, 0x9e, 0xd1, 0x6b, 0x07, 0x7f, 0x47, - 0x2b, 0x30, 0x1b, 0xaf, 0x40, 0xfe, 0xbe, 0x9e, 0xe9, 0xdc, 0x02, 0x5a, 0x16, 0x19, 0x27, 0x27, - 0x99, 0x43, 0x7e, 0x64, 0x8f, 0x84, 0xd6, 0x75, 0xf4, 0x1b, 0x61, 0x01, 0xee, 0xc7, 0x05, 0x0a, - 0x9e, 0xd0, 0x6f, 0x5c, 0x35, 0x26, 0x6e, 0x0b, 0x4d, 0x49, 0x6b, 0x20, 0x67, 0x84, 0xc5, 0x39, - 0xda, 0xab, 0x32, 0x57, 0x7b, 0x7d, 0x10, 0x6a, 0xaf, 0xd2, 0x02, 0xab, 0x9e, 0x9a, 0x99, 0xd4, - 0x5c, 0xb1, 0xd2, 0x28, 0x2f, 0x4e, 0x9e, 0xd8, 0x4c, 0xb6, 0xb4, 0xd4, 0xc6, 0x1b, 0x5d, 0x59, - 0x8d, 0x32, 0xcb, 0xe0, 0x6c, 0xd2, 0x72, 0x55, 0x3a, 0xef, 0xa9, 0x6d, 0x09, 0x8f, 0xe5, 0x68, - 0x23, 0x9c, 0x58, 0xb6, 0xc7, 0xf2, 0x68, 0x79, 0x1d, 0x6e, 0x6d, 0xb3, 0x42, 0xe3, 0xd5, 0xc4, - 0x96, 0xd4, 0x9c, 0x48, 0x4f, 0xb1, 0x21, 0xf1, 0xcd, 0x28, 0x69, 0x3c, 0x16, 0x16, 0xcb, 0x36, - 0xbe, 0x36, 0x47, 0xcd, 0xae, 0x40, 0xe5, 0xc9, 0xd8, 0xf1, 0x4c, 0xeb, 0x0a, 0x3d, 0xbb, 0x0c, - 0x10, 0x7b, 0xd5, 0xf5, 0x5f, 0x34, 0xe2, 0xed, 0x1c, 0x6d, 0xd1, 0xc0, 0x9b, 0xf8, 0x7d, 0x41, - 0x2a, 0xa4, 0x62, 0xe8, 0x12, 0xff, 0x36, 0x14, 0xf0, 0x7b, 0x18, 0xc6, 0xb9, 0xbf, 0x90, 0x2f, - 0xb7, 0xf1, 0xd4, 0x16, 0xcf, 0x0d, 0x45, 0xc8, 0xef, 0x00, 0x98, 0x7d, 0x69, 0x9f, 0x09, 0x04, - 0xea, 0xc5, 0x9e, 0x80, 0xf0, 0x77, 0x92, 0xe6, 0xcb, 0xd5, 0x71, 0xc8, 0x84, 0x5d, 0xc3, 0x0d, - 0xa8, 0xe2, 0xd2, 0x1d, 0x1f, 0xf8, 0xb8, 0xda, 0x6b, 0xcb, 0x44, 0xf8, 0xc6, 0x62, 0xcd, 0x7b, - 0x14, 0x11, 0x1a, 0x49, 0x26, 0xfc, 0x09, 0x2c, 0xab, 0x98, 0x9a, 0x66, 0xba, 0x42, 0x4c, 0xdf, - 0x5c, 0x8c, 0xe9, 0x41, 0x4c, 0x69, 0xa4, 0xd8, 0xcc, 0x86, 0x25, 0x0b, 0x2f, 0x1d, 0x96, 0x7c, - 0x15, 0x56, 0x7b, 0xe9, 0x55, 0xa0, 0xb6, 0x8a, 0x29, 0x28, 0x6f, 0xc0, 0xb2, 0x1d, 0xc4, 0x51, - 0x51, 0x8a, 0x91, 0x94, 0x8d, 0x14, 0xac, 0xfe, 0xef, 0x8b, 0x90, 0xa7, 0x91, 0x9f, 0x8e, 0x71, - 0xb5, 0x52, 0x2a, 0xfd, 0xc1, 0xe2, 0x53, 0x3d, 0xb5, 0xe2, 0x49, 0x83, 0xe4, 0x12, 0x1a, 0xe4, - 0xdb, 0x50, 0x08, 0x3c, 0x5f, 0x86, 0xd3, 0xbb, 0xa0, 0x10, 0x75, 0x3d, 0x5f, 0x1a, 0x8a, 0x90, - 0x6f, 0x43, 0xe9, 0xc4, 0x76, 0x24, 0x4e, 0x8a, 0x1a, 0xbc, 0xd7, 0x17, 0xe3, 0xb1, 0x4d, 0x44, - 0x46, 0x48, 0xcc, 0x77, 0x93, 0xc2, 0x56, 0x24, 0x4e, 0x1b, 0x8b, 0x71, 0x9a, 0x27, 0x83, 0xf7, - 0x81, 0xf5, 0xbd, 0x33, 0xe1, 0x1b, 0x89, 0xc0, 0xa4, 0xda, 0xa4, 0x67, 0xe0, 0xbc, 0x0e, 0xe5, - 0xa1, 0x6d, 0x09, 0xb4, 0x73, 0x48, 0xc7, 0x94, 0x8d, 0xa8, 0xcc, 0x1f, 0x43, 0x99, 0xfc, 0x03, - 0xd4, 0x8a, 0x95, 0x97, 0x1e, 0x7c, 0xe5, 0xaa, 0x84, 0x0c, 0xb0, 0x22, 0xaa, 0x7c, 0xdb, 0x96, - 0x14, 0x9f, 0x2e, 0x1b, 0x51, 0x19, 0x1b, 0x4c, 0xf2, 0x9e, 0x6c, 0x70, 0x55, 0x35, 0x78, 0x1a, - 0xce, 0xdf, 0x86, 0x1b, 0x04, 0x9b, 0xda, 0x24, 0x71, 0xa9, 0x21, 0xd3, 0xf9, 0x1f, 0xd1, 0x60, - 0x19, 0x9b, 0x03, 0xb1, 0x6b, 0x8f, 0x6c, 0x59, 0x5b, 0xb9, 0x9b, 0xb9, 0x57, 0x30, 0x62, 0x00, - 0x7f, 0x1d, 0xd6, 0x2d, 0x71, 0x62, 0x4e, 0x1c, 0xd9, 0x13, 0xa3, 0xb1, 0x63, 0x4a, 0xd1, 0xb1, - 0x48, 0x46, 0x2b, 0xc6, 0xec, 0x07, 0xfe, 0x06, 0x5c, 0xd3, 0xc0, 0x83, 0xe8, 0x54, 0xa1, 0x63, - 0x51, 0xf8, 0xae, 0x62, 0xcc, 0xfb, 0xd4, 0xd8, 0xd3, 0x6a, 0x18, 0x37, 0x50, 0xf4, 0x53, 0x43, - 0x05, 0x1a, 0x48, 0xb5, 0x23, 0x3f, 0x32, 0x1d, 0x47, 0xf8, 0x17, 0xca, 0xc9, 0x7d, 0x6c, 0xba, - 0xc7, 0xa6, 0xcb, 0x72, 0xb4, 0xc7, 0x9a, 0x8e, 0x70, 0x2d, 0xd3, 0x57, 0x3b, 0xf2, 0x23, 0xda, - 0xd0, 0x0b, 0x8d, 0x7b, 0x90, 0xa7, 0x21, 0xad, 0x40, 0x41, 0x79, 0x49, 0xe4, 0x31, 0x6b, 0x0f, - 0x89, 0x34, 0xf2, 0x2e, 0x2e, 0x3f, 0x96, 0xad, 0xff, 0xc3, 0x22, 0x94, 0xc3, 0xc1, 0x0b, 0xcf, - 0x10, 0x32, 0xf1, 0x19, 0x02, 0x9a, 0x71, 0xc1, 0x53, 0x3b, 0xb0, 0x8f, 0xb5, 0x59, 0x5a, 0x36, - 0x62, 0x00, 0x5a, 0x42, 0xcf, 0x6d, 0x4b, 0x0e, 0x69, 0xcd, 0x14, 0x0c, 0x55, 0xe0, 0xf7, 0x60, - 0xcd, 0xc2, 0x71, 0x70, 0xfb, 0xce, 0xc4, 0x12, 0x3d, 0xdc, 0x45, 0x55, 0x98, 0x60, 0x1a, 0xcc, - 0x3f, 0x06, 0x90, 0xf6, 0x48, 0x6c, 0x7b, 0xfe, 0xc8, 0x94, 0xda, 0x37, 0xf8, 0xfa, 0xcb, 0x49, - 0xf5, 0x46, 0x2f, 0x62, 0x60, 0x24, 0x98, 0x21, 0x6b, 0xac, 0x4d, 0xb3, 0x2e, 0x7d, 0x26, 0xd6, - 0x5b, 0x11, 0x03, 0x23, 0xc1, 0x8c, 0xf7, 0xa0, 0x74, 0xe2, 0xf9, 0xa3, 0x89, 0x63, 0xea, 0x3d, - 0xf7, 0xfd, 0x97, 0xe4, 0xbb, 0xad, 0xa8, 0x49, 0xf7, 0x84, 0xac, 0xe2, 0x18, 0x77, 0x65, 0xc1, - 0x18, 0x77, 0xe3, 0x97, 0x01, 0xe2, 0x16, 0xf2, 0x9b, 0xc0, 0xf7, 0x3c, 0x57, 0x0e, 0x9b, 0xc7, - 0xc7, 0xfe, 0xa6, 0x38, 0xf1, 0x7c, 0xb1, 0x65, 0xe2, 0xf6, 0x7a, 0x03, 0xd6, 0x23, 0x78, 0xf3, - 0x44, 0x0a, 0x1f, 0xc1, 0x24, 0x02, 0xdd, 0xa1, 0xe7, 0x4b, 0x65, 0xe3, 0xd1, 0xcf, 0x27, 0x5d, - 0x96, 0xc3, 0x2d, 0xbd, 0xd3, 0x3d, 0x60, 0xf9, 0xc6, 0x3d, 0x80, 0x78, 0x68, 0xc9, 0x17, 0xa2, - 0x5f, 0x6f, 0x3e, 0xd4, 0x9e, 0x11, 0x95, 0x1e, 0xbe, 0xcd, 0x32, 0x8d, 0x4f, 0x33, 0x50, 0x4d, - 0x74, 0x29, 0xed, 0x33, 0xb7, 0xbc, 0x89, 0x2b, 0x95, 0x93, 0x4e, 0x3f, 0x9f, 0x9a, 0xce, 0x04, - 0x37, 0xf7, 0x75, 0x58, 0xa1, 0xf2, 0x96, 0x1d, 0x48, 0xdb, 0xed, 0x4b, 0x96, 0x8b, 0x50, 0x94, - 0x61, 0x90, 0x8f, 0x50, 0xf6, 0x3d, 0x0d, 0x2a, 0x70, 0x06, 0xcb, 0x87, 0xc2, 0xef, 0x8b, 0x10, - 0x89, 0x8c, 0x61, 0x0d, 0x89, 0xd0, 0x94, 0x31, 0x6c, 0xca, 0x61, 0x77, 0x32, 0x62, 0x65, 0x34, - 0x2a, 0xb1, 0xd0, 0x3c, 0x13, 0x3e, 0xda, 0x32, 0x15, 0xac, 0x07, 0x01, 0xb8, 0x1a, 0x4c, 0x97, - 0x41, 0x88, 0xbd, 0x67, 0xbb, 0xac, 0x1a, 0x15, 0xcc, 0x73, 0xb6, 0x8c, 0xed, 0x27, 0xd7, 0x81, - 0xad, 0xd4, 0xff, 0x6b, 0x0e, 0xf2, 0xa8, 0xd7, 0xd1, 0xd7, 0x4d, 0x2a, 0x21, 0xb5, 0x56, 0x92, - 0xa0, 0xcf, 0xb6, 0x1b, 0x21, 0xef, 0xe4, 0x6e, 0xf4, 0x1e, 0x54, 0xfb, 0x93, 0x40, 0x7a, 0x23, - 0xda, 0x8a, 0xf5, 0x69, 0xd7, 0xcd, 0x99, 0xa8, 0x11, 0x0d, 0xa7, 0x91, 0x44, 0xe5, 0xef, 0x40, - 0xf1, 0x44, 0x49, 0xbd, 0x8a, 0x1b, 0xfd, 0xd2, 0x25, 0xbb, 0xb5, 0x96, 0x6c, 0x8d, 0x8c, 0xfd, - 0xb2, 0x67, 0x56, 0x6c, 0x12, 0xa4, 0x77, 0xdd, 0x62, 0xb4, 0xeb, 0xfe, 0x32, 0xac, 0x0a, 0x1c, - 0xf0, 0x43, 0xc7, 0xec, 0x8b, 0x91, 0x70, 0xc3, 0x65, 0xf6, 0xf6, 0x4b, 0xf4, 0x98, 0x66, 0x8c, - 0xba, 0x3d, 0xc5, 0x0b, 0x35, 0x8f, 0xeb, 0xe1, 0xe6, 0x1f, 0x3a, 0xf6, 0x65, 0x23, 0x06, 0x34, - 0xbe, 0xa4, 0xf5, 0x65, 0x09, 0x72, 0xcd, 0xa0, 0xaf, 0x23, 0x20, 0x22, 0xe8, 0x2b, 0xf7, 0xaa, - 0x45, 0xc3, 0xc1, 0xb2, 0x8d, 0x37, 0xa1, 0x12, 0xd5, 0x80, 0xc2, 0xb3, 0xef, 0xc9, 0xee, 0x58, - 0xf4, 0xed, 0x13, 0x5b, 0x58, 0x4a, 0x3e, 0xbb, 0xd2, 0xf4, 0xa5, 0x0a, 0x22, 0xb6, 0x5d, 0x8b, - 0x65, 0xeb, 0xbf, 0x53, 0x86, 0xa2, 0xda, 0x7c, 0x75, 0x87, 0x2b, 0x51, 0x87, 0xbf, 0x03, 0x65, - 0x6f, 0x2c, 0x7c, 0x53, 0x7a, 0xbe, 0x8e, 0xdc, 0xbc, 0xf3, 0x32, 0x9b, 0xf9, 0xc6, 0x81, 0x26, - 0x36, 0x22, 0x36, 0xd3, 0xd2, 0x94, 0x9d, 0x95, 0xa6, 0xfb, 0xc0, 0xc2, 0x7d, 0xfb, 0xd0, 0x47, - 0x3a, 0x79, 0xa1, 0xfd, 0xf0, 0x19, 0x38, 0xef, 0x41, 0xa5, 0xef, 0xb9, 0x96, 0x1d, 0x45, 0x71, - 0x56, 0x1f, 0x7e, 0xed, 0xa5, 0x5a, 0xd8, 0x0a, 0xa9, 0x8d, 0x98, 0x11, 0x7f, 0x1d, 0x0a, 0x67, - 0x28, 0x66, 0x24, 0x4f, 0x97, 0x0b, 0xa1, 0x42, 0xe2, 0x9f, 0x40, 0xf5, 0xfb, 0x13, 0xbb, 0x7f, - 0x7a, 0x90, 0x8c, 0x12, 0xbe, 0xf7, 0x52, 0xad, 0xf8, 0x4e, 0x4c, 0x6f, 0x24, 0x99, 0x25, 0x44, - 0xbb, 0xf4, 0x27, 0x10, 0xed, 0xf2, 0xac, 0x68, 0x1b, 0xb0, 0xe2, 0x8a, 0x40, 0x0a, 0x6b, 0x5b, - 0xdb, 0x6a, 0xf0, 0x19, 0x6c, 0xb5, 0x34, 0x8b, 0xc6, 0x17, 0xa1, 0x1c, 0x4e, 0x38, 0x2f, 0x42, - 0x76, 0x1f, 0x9d, 0xa2, 0x22, 0x64, 0x0f, 0x7c, 0x25, 0x6d, 0x4d, 0x94, 0xb6, 0xc6, 0x1f, 0x65, - 0xa0, 0x12, 0x0d, 0x7a, 0x5a, 0x73, 0xb6, 0xbf, 0x3f, 0x31, 0x1d, 0x96, 0x21, 0x77, 0xd9, 0x93, - 0xaa, 0x44, 0xca, 0xfa, 0x11, 0x1d, 0xd6, 0xfb, 0x2c, 0x47, 0x26, 0x82, 0x08, 0x02, 0x96, 0xe7, - 0x1c, 0x56, 0x35, 0xf8, 0xc0, 0x57, 0xa8, 0x05, 0x54, 0x7c, 0xf8, 0x35, 0x04, 0x14, 0x95, 0x45, - 0x71, 0x2a, 0x94, 0x82, 0xdc, 0xf7, 0x24, 0x15, 0xca, 0xd8, 0xa8, 0x8e, 0xcb, 0x2a, 0x58, 0xe7, - 0xbe, 0x27, 0x3b, 0xa8, 0x12, 0x23, 0xf7, 0xac, 0x1a, 0x56, 0x4f, 0x25, 0xd2, 0x88, 0x4d, 0xc7, - 0xe9, 0xb8, 0x6c, 0x45, 0x7f, 0x50, 0xa5, 0x55, 0xe4, 0xd8, 0x3e, 0x37, 0xfb, 0x48, 0xbe, 0x86, - 0x1a, 0x16, 0x69, 0x74, 0x99, 0xe1, 0x92, 0x6c, 0x9f, 0xdb, 0x81, 0x0c, 0xd8, 0x7a, 0xe3, 0xdf, - 0x65, 0xa0, 0x9a, 0x98, 0x60, 0x74, 0xff, 0x08, 0x11, 0xb7, 0x32, 0xe5, 0x0d, 0x7e, 0x8c, 0xc3, - 0xe8, 0x5b, 0xe1, 0x36, 0xd5, 0xf3, 0xf0, 0x67, 0x16, 0xeb, 0xeb, 0x79, 0x23, 0xcf, 0xf7, 0xbd, - 0xe7, 0xca, 0xf4, 0xd9, 0x35, 0x03, 0xf9, 0x4c, 0x88, 0x53, 0x96, 0xc7, 0xae, 0xb6, 0x26, 0xbe, - 0x2f, 0x5c, 0x05, 0x28, 0x50, 0xe3, 0xc4, 0xb9, 0x2a, 0x15, 0x91, 0x29, 0x22, 0xd3, 0x3e, 0xc8, - 0x4a, 0xa8, 0x08, 0x34, 0xb6, 0x82, 0x94, 0x11, 0x01, 0xd1, 0x55, 0xb1, 0x82, 0x9b, 0x8a, 0x8a, - 0x50, 0x1c, 0x9c, 0x6c, 0x99, 0x17, 0x41, 0x73, 0xe0, 0x31, 0x98, 0x06, 0xee, 0x7b, 0xcf, 0x59, - 0xb5, 0x3e, 0x01, 0x88, 0x7d, 0x32, 0xf4, 0x45, 0x51, 0x20, 0xa2, 0x33, 0x04, 0x5d, 0xe2, 0x07, - 0x00, 0xf8, 0x8b, 0x30, 0x43, 0x87, 0xf4, 0x25, 0x0c, 0x65, 0xa2, 0x33, 0x12, 0x2c, 0xea, 0xbf, - 0x0a, 0x95, 0xe8, 0x03, 0xaf, 0x41, 0x89, 0x4c, 0xda, 0xa8, 0xda, 0xb0, 0x88, 0xf6, 0x99, 0xed, - 0x5a, 0xe2, 0x9c, 0xf4, 0x4a, 0xc1, 0x50, 0x05, 0x6c, 0xe5, 0xd0, 0xb6, 0x2c, 0xe1, 0x86, 0x27, - 0x3d, 0xaa, 0x34, 0xef, 0x3c, 0x3e, 0x3f, 0xf7, 0x3c, 0xbe, 0xfe, 0x2b, 0x50, 0x4d, 0x38, 0x8d, - 0x97, 0x76, 0x3b, 0xd1, 0xb0, 0x6c, 0xba, 0x61, 0xb7, 0xa1, 0x12, 0xe6, 0x80, 0x04, 0xb4, 0xb7, - 0x55, 0x8c, 0x18, 0x50, 0xff, 0x67, 0x59, 0xb4, 0x64, 0xb1, 0x6b, 0xd3, 0x8e, 0xde, 0x36, 0x14, - 0x03, 0x69, 0xca, 0x49, 0x98, 0xcc, 0xb0, 0xe0, 0x02, 0xed, 0x12, 0xcd, 0xce, 0x92, 0xa1, 0xa9, - 0xf9, 0x07, 0x90, 0x93, 0xe6, 0x40, 0x07, 0x4a, 0xbf, 0xbc, 0x18, 0x93, 0x9e, 0x39, 0xd8, 0x59, - 0x32, 0x90, 0x8e, 0xef, 0x42, 0xb9, 0xaf, 0x63, 0x5b, 0x5a, 0x29, 0x2e, 0xe8, 0x8b, 0x85, 0x11, - 0xb1, 0x9d, 0x25, 0x23, 0xe2, 0xc0, 0xbf, 0x0d, 0x79, 0xb4, 0x2e, 0x75, 0xce, 0xc7, 0x82, 0x3e, - 0x26, 0x2e, 0x97, 0x9d, 0x25, 0x83, 0x28, 0x37, 0x4b, 0x50, 0x20, 0x1d, 0x5c, 0xaf, 0x41, 0x51, - 0xf5, 0x75, 0x7a, 0xe4, 0xea, 0xb7, 0x20, 0xd7, 0x33, 0x07, 0x68, 0xe1, 0xdb, 0x56, 0xa0, 0x43, - 0x25, 0xf8, 0xb3, 0xfe, 0x4a, 0x1c, 0xa7, 0x4b, 0x86, 0x80, 0x33, 0xa9, 0x10, 0x70, 0xbd, 0x08, - 0x79, 0xac, 0xb1, 0x7e, 0xfb, 0x2a, 0x6f, 0xa1, 0xfe, 0x8f, 0x73, 0xe8, 0x58, 0x48, 0x71, 0x3e, - 0x37, 0xbc, 0xfd, 0x11, 0x54, 0xc6, 0xbe, 0xd7, 0x17, 0x41, 0xe0, 0xf9, 0xda, 0x38, 0x7a, 0xfd, - 0xc5, 0x47, 0xcf, 0x1b, 0x87, 0x21, 0x8d, 0x11, 0x93, 0x37, 0xfe, 0x20, 0x0b, 0x95, 0xe8, 0x83, - 0xf2, 0x67, 0xa4, 0x38, 0x57, 0xa1, 0xcc, 0x3d, 0xe1, 0x8f, 0x4c, 0xdb, 0x52, 0xda, 0xa3, 0x35, - 0x34, 0x43, 0x23, 0xf7, 0x63, 0x6f, 0x22, 0x27, 0xc7, 0x42, 0x85, 0xb0, 0x9e, 0xda, 0x23, 0xe1, - 0xb1, 0x3c, 0x1d, 0x1e, 0xa1, 0x60, 0xf7, 0x1d, 0x6f, 0x62, 0xb1, 0x02, 0x96, 0x1f, 0xd1, 0xf6, - 0xb6, 0x67, 0x8e, 0x03, 0xa5, 0x33, 0xf7, 0x6c, 0xdf, 0x63, 0x25, 0x24, 0xda, 0xb6, 0x07, 0x23, - 0x93, 0x95, 0x91, 0x59, 0xef, 0xb9, 0x2d, 0x51, 0x09, 0x57, 0xd0, 0x4c, 0x3d, 0x18, 0x0b, 0xb7, - 0x2b, 0x7d, 0x21, 0xe4, 0x9e, 0x39, 0x56, 0x31, 0x4d, 0x43, 0x58, 0x96, 0x2d, 0x95, 0xfe, 0xdc, - 0x36, 0xfb, 0xe2, 0xd8, 0xf3, 0x4e, 0xd9, 0x32, 0x2a, 0x9a, 0x8e, 0x1b, 0x48, 0x73, 0xe0, 0x9b, - 0x23, 0xa5, 0x43, 0x7b, 0xc2, 0x11, 0x54, 0x5a, 0xa5, 0xba, 0x6d, 0x39, 0x9c, 0x1c, 0x3f, 0x42, - 0xbf, 0x6f, 0x4d, 0x9d, 0x33, 0x59, 0x62, 0x2c, 0x50, 0x87, 0x2e, 0x43, 0x79, 0xd3, 0x76, 0xec, - 0x63, 0xdb, 0xb1, 0xd9, 0x3a, 0xa2, 0xb6, 0xcf, 0xfb, 0xa6, 0x63, 0x5b, 0xbe, 0xf9, 0x9c, 0x71, - 0x6c, 0xdc, 0x63, 0xdf, 0x3b, 0xb5, 0xd9, 0x35, 0x44, 0x24, 0x37, 0xf0, 0xcc, 0xfe, 0x01, 0xbb, - 0x4e, 0x67, 0x65, 0xa7, 0x42, 0xf6, 0x87, 0x27, 0xe6, 0x31, 0xbb, 0x11, 0x87, 0xf4, 0x6e, 0xd6, - 0xd7, 0x61, 0x6d, 0xea, 0x54, 0xbe, 0x5e, 0xd2, 0xde, 0x67, 0x7d, 0x05, 0xaa, 0x89, 0xe3, 0xd2, - 0xfa, 0xab, 0x50, 0x0e, 0x0f, 0x53, 0xd1, 0x4b, 0xb7, 0x03, 0x15, 0x06, 0xd6, 0x42, 0x12, 0x95, - 0xeb, 0xbf, 0x9f, 0x81, 0xa2, 0x3a, 0xc9, 0xe6, 0x9b, 0x51, 0xe6, 0x49, 0x66, 0x81, 0xd3, 0x4b, - 0x45, 0xa4, 0xcf, 0x7e, 0xa3, 0xf4, 0x93, 0xeb, 0x50, 0x70, 0xc8, 0x1d, 0xd7, 0xea, 0x8b, 0x0a, - 0x09, 0x6d, 0x93, 0x4b, 0x6a, 0x9b, 0x46, 0x33, 0x3a, 0x6f, 0x0e, 0x43, 0x8f, 0x64, 0x15, 0xf6, - 0x7c, 0x21, 0x54, 0x58, 0x91, 0xbc, 0xe9, 0x2c, 0xed, 0x15, 0xde, 0x68, 0x6c, 0xf6, 0x25, 0x01, - 0x68, 0x17, 0x45, 0x65, 0xca, 0xf2, 0x28, 0xe5, 0xad, 0xa1, 0x29, 0x1b, 0x27, 0x50, 0x3e, 0xf4, - 0x82, 0xe9, 0x3d, 0xb9, 0x04, 0xb9, 0x9e, 0x37, 0x56, 0x16, 0xe6, 0xa6, 0x27, 0xc9, 0xc2, 0x54, - 0x5b, 0xf0, 0x89, 0x54, 0x42, 0x65, 0xd8, 0x83, 0xa1, 0x54, 0x9e, 0x78, 0xc7, 0x75, 0x85, 0xcf, - 0x0a, 0x38, 0x87, 0x86, 0x18, 0xa3, 0x55, 0xcb, 0x8a, 0x38, 0x6b, 0x04, 0xdf, 0xb6, 0xfd, 0x40, - 0xb2, 0x52, 0xa3, 0x83, 0xbb, 0xa9, 0x3d, 0xa0, 0x4d, 0x90, 0x7e, 0x10, 0xab, 0x25, 0x6c, 0x22, - 0x15, 0x5b, 0xc2, 0x45, 0x19, 0x23, 0xef, 0x49, 0xb9, 0x7e, 0x54, 0x41, 0x16, 0x77, 0x30, 0x2a, - 0x7f, 0x34, 0x09, 0xa4, 0x7d, 0x72, 0xc1, 0x72, 0x8d, 0x67, 0xb0, 0x92, 0x4a, 0x63, 0xe2, 0xd7, - 0x81, 0xa5, 0x00, 0xd8, 0xf4, 0x25, 0x7e, 0x0b, 0xae, 0xa5, 0xa0, 0x7b, 0xb6, 0x65, 0x51, 0xac, - 0x77, 0xfa, 0x43, 0xd8, 0xc1, 0xcd, 0x0a, 0x94, 0xfa, 0x6a, 0x96, 0x1a, 0x87, 0xb0, 0x42, 0xd3, - 0xb6, 0x27, 0xa4, 0x79, 0xe0, 0x3a, 0x17, 0x7f, 0xe2, 0x5c, 0xb3, 0xc6, 0x57, 0xb4, 0x83, 0x85, - 0xfa, 0xe2, 0xc4, 0xf7, 0x46, 0xc4, 0xab, 0x60, 0xd0, 0x6f, 0xe4, 0x2e, 0x3d, 0x3d, 0xf7, 0x59, - 0xe9, 0x35, 0x7e, 0x51, 0x81, 0x52, 0xb3, 0xdf, 0x47, 0x97, 0x70, 0xa6, 0xe6, 0x77, 0xa0, 0xd8, - 0xf7, 0xdc, 0x13, 0x7b, 0xa0, 0xf5, 0xf1, 0xb4, 0x65, 0xa8, 0xe9, 0x50, 0xe0, 0x4e, 0xec, 0x81, - 0xa1, 0x91, 0x91, 0x4c, 0xef, 0x27, 0x85, 0x2b, 0xc9, 0x94, 0x52, 0x8d, 0xb6, 0x8f, 0x07, 0x90, - 0xb7, 0xdd, 0x13, 0x4f, 0x27, 0x86, 0x7e, 0xfe, 0x12, 0x22, 0xca, 0x8e, 0x24, 0xc4, 0xfa, 0x7f, - 0xce, 0x40, 0x51, 0x55, 0xcd, 0x5f, 0x85, 0x55, 0xe1, 0xe2, 0x62, 0x0a, 0x55, 0xb9, 0x5e, 0x45, - 0x53, 0x50, 0x34, 0x5a, 0x35, 0x44, 0x1c, 0x4f, 0x06, 0x3a, 0xf6, 0x92, 0x04, 0xf1, 0xf7, 0xe0, - 0x96, 0x2a, 0x1e, 0xfa, 0xc2, 0x17, 0x8e, 0x30, 0x03, 0xd1, 0x1a, 0x9a, 0xae, 0x2b, 0x1c, 0xbd, - 0xb1, 0x5f, 0xf6, 0x99, 0x37, 0x60, 0x59, 0x7d, 0xea, 0x8e, 0xcd, 0xbe, 0x08, 0xf4, 0x79, 0x5f, - 0x0a, 0xc6, 0xbf, 0x0a, 0x05, 0xca, 0x9b, 0xad, 0x59, 0x57, 0x4f, 0xa5, 0xc2, 0xaa, 0x7b, 0xd1, - 0xce, 0xd3, 0x04, 0x50, 0xc3, 0x84, 0x4e, 0x97, 0x5e, 0xfd, 0x5f, 0xb8, 0x72, 0x5c, 0xc9, 0xff, - 0x4b, 0x10, 0x61, 0xfb, 0x2c, 0xe1, 0x08, 0x4a, 0x70, 0xc4, 0x9d, 0x31, 0x4b, 0x27, 0x2b, 0x29, - 0x58, 0xfd, 0x3f, 0xe5, 0x21, 0x8f, 0x23, 0x8c, 0xc8, 0x43, 0x6f, 0x24, 0xa2, 0xf8, 0xb2, 0x32, - 0x35, 0x52, 0x30, 0x34, 0x6d, 0x4c, 0x75, 0xc4, 0x1f, 0xa1, 0x29, 0xe5, 0x31, 0x0d, 0x46, 0xcc, - 0xb1, 0xef, 0x9d, 0xd8, 0x4e, 0x8c, 0xa9, 0x8d, 0xa0, 0x29, 0x30, 0xff, 0x1a, 0xdc, 0x1c, 0x99, - 0xfe, 0xa9, 0x90, 0xb4, 0xba, 0x9f, 0x79, 0xfe, 0x69, 0x80, 0x23, 0xd7, 0xb1, 0x74, 0x60, 0xf2, - 0x92, 0xaf, 0xfc, 0x75, 0x58, 0x7f, 0x1e, 0x16, 0xa3, 0x3a, 0x54, 0x68, 0x70, 0xf6, 0x03, 0xaa, - 0x5b, 0x4b, 0x9c, 0xd9, 0xc4, 0xb7, 0xac, 0xb2, 0x67, 0xc3, 0x32, 0x8a, 0x92, 0xa9, 0x06, 0xb2, - 0xab, 0x6b, 0xd6, 0x27, 0x4c, 0x69, 0x28, 0x5a, 0x5b, 0x2a, 0xab, 0x28, 0xe8, 0x58, 0x14, 0x59, - 0xad, 0x18, 0x31, 0x00, 0x05, 0x8d, 0xaa, 0x7c, 0xaa, 0x94, 0xea, 0x8a, 0x72, 0x41, 0x13, 0x20, - 0xc4, 0x90, 0xa2, 0x3f, 0x0c, 0x2b, 0x51, 0x61, 0xcf, 0x24, 0x88, 0xdf, 0x01, 0x18, 0x98, 0x52, - 0x3c, 0x37, 0x2f, 0x9e, 0xf8, 0x4e, 0x4d, 0xa8, 0xa3, 0x92, 0x18, 0x82, 0x4e, 0xac, 0xe3, 0xf5, - 0x4d, 0xa7, 0x2b, 0x3d, 0xdf, 0x1c, 0x88, 0x43, 0x53, 0x0e, 0x6b, 0x03, 0xe5, 0xc4, 0x4e, 0xc3, - 0xb1, 0xc7, 0xd2, 0x1e, 0x89, 0x4f, 0x3c, 0x57, 0xd4, 0x86, 0xaa, 0xc7, 0x61, 0x19, 0x5b, 0x62, - 0xba, 0xa6, 0x73, 0x21, 0xed, 0x3e, 0xf6, 0xc5, 0x56, 0x2d, 0x49, 0x80, 0x28, 0x6c, 0x20, 0x24, - 0x8e, 0x63, 0xc7, 0xaa, 0x7d, 0x4f, 0xf5, 0x35, 0x02, 0xe0, 0xec, 0x0a, 0x39, 0x14, 0xbe, 0x98, - 0x8c, 0x9a, 0x96, 0xe5, 0x8b, 0x20, 0xa8, 0x9d, 0xaa, 0xd9, 0x9d, 0x02, 0xd7, 0xbf, 0x41, 0x07, - 0x59, 0xc3, 0xc6, 0x5b, 0xb0, 0xb2, 0x8b, 0x2d, 0x6c, 0x8e, 0xed, 0x6e, 0xdf, 0x1b, 0x0b, 0x54, - 0xe8, 0x14, 0x12, 0xa6, 0x00, 0x42, 0x15, 0x4a, 0x1f, 0x05, 0x9e, 0xdb, 0x3c, 0xec, 0xa8, 0x2d, - 0x66, 0x7b, 0xe2, 0x38, 0x2c, 0xdb, 0x38, 0x00, 0x88, 0x25, 0x1b, 0xb7, 0x8b, 0x26, 0x9d, 0x1a, - 0xb1, 0x25, 0x15, 0xae, 0x72, 0x2d, 0xdb, 0x1d, 0x6c, 0x69, 0x61, 0x66, 0x19, 0x04, 0x52, 0x18, - 0x42, 0x58, 0x11, 0x90, 0x0c, 0x16, 0x2a, 0x09, 0x8b, 0xe5, 0x1a, 0xff, 0x27, 0x03, 0xd5, 0x44, - 0x92, 0xc4, 0x9f, 0x62, 0x62, 0x07, 0x6e, 0xe7, 0x68, 0x10, 0xe0, 0xbc, 0x29, 0x41, 0x8f, 0xca, - 0x38, 0xab, 0x3a, 0x87, 0x03, 0xbf, 0xaa, 0xa0, 0x43, 0x02, 0xf2, 0x99, 0x92, 0x3a, 0x1a, 0x0f, - 0x75, 0xe4, 0xa6, 0x0a, 0xa5, 0x27, 0xee, 0xa9, 0xeb, 0x3d, 0x77, 0xd5, 0x3e, 0x4d, 0x99, 0x3a, - 0xa9, 0x33, 0xc7, 0x30, 0x99, 0x26, 0xd7, 0xf8, 0x97, 0xf9, 0xa9, 0xa4, 0xb6, 0x36, 0x14, 0x95, - 0xbb, 0x40, 0x96, 0xec, 0x6c, 0x16, 0x52, 0x12, 0x59, 0x9f, 0x6f, 0x25, 0x40, 0x86, 0x26, 0x46, - 0x3b, 0x3e, 0x4a, 0xf9, 0xcc, 0xce, 0x3d, 0x87, 0x4b, 0x31, 0x0a, 0x75, 0x73, 0x2a, 0xeb, 0x39, - 0xe2, 0x50, 0xff, 0xeb, 0x19, 0xb8, 0x3e, 0x0f, 0x25, 0x99, 0x1b, 0x9e, 0x49, 0xe7, 0x86, 0x77, - 0xa7, 0x72, 0xad, 0xb3, 0xd4, 0x9b, 0x07, 0x2f, 0xd9, 0x88, 0x74, 0xe6, 0x75, 0xe3, 0xf7, 0x32, - 0xb0, 0x3e, 0xd3, 0xe7, 0x84, 0x1d, 0x03, 0x50, 0x54, 0x92, 0xa5, 0x52, 0xa1, 0xa2, 0xe4, 0x14, - 0x75, 0xb8, 0x40, 0x3b, 0x7c, 0xa0, 0x4e, 0xfb, 0x75, 0x76, 0xb9, 0x32, 0x93, 0x71, 0xd6, 0x70, - 0x03, 0x19, 0x08, 0x15, 0x88, 0x55, 0xc6, 0x96, 0x86, 0x14, 0x95, 0x29, 0xab, 0x4e, 0x40, 0x58, - 0x89, 0x52, 0xac, 0x26, 0x63, 0xc7, 0xee, 0x63, 0xb1, 0xcc, 0xeb, 0x70, 0x53, 0x5d, 0x31, 0xd0, - 0x6e, 0xe3, 0x49, 0x6f, 0x68, 0xd3, 0xe2, 0x60, 0x15, 0xac, 0xe7, 0x70, 0x72, 0xec, 0xd8, 0xc1, - 0x90, 0x41, 0xc3, 0x80, 0x6b, 0x73, 0x3a, 0x48, 0x4d, 0x7e, 0xaa, 0x9b, 0xbf, 0x0a, 0xb0, 0xf5, - 0x34, 0x6c, 0x34, 0xcb, 0x70, 0x0e, 0xab, 0x5b, 0x4f, 0x93, 0xdc, 0xf5, 0xe2, 0x79, 0x8a, 0xda, - 0x2b, 0x60, 0xb9, 0xc6, 0xaf, 0x65, 0xc2, 0x1c, 0x88, 0xfa, 0x5f, 0x84, 0x15, 0xd5, 0xe0, 0x43, - 0xf3, 0xc2, 0xf1, 0x4c, 0x8b, 0xb7, 0x61, 0x35, 0x88, 0x2e, 0xc1, 0x24, 0x36, 0xac, 0x69, 0x43, - 0xa0, 0x9b, 0x42, 0x32, 0xa6, 0x88, 0x42, 0x57, 0x28, 0x1b, 0x1f, 0x9c, 0x70, 0x72, 0xea, 0x4c, - 0x5a, 0x72, 0xcb, 0xe4, 0xa6, 0x99, 0x8d, 0xaf, 0xc2, 0x7a, 0x37, 0x56, 0xee, 0xca, 0x66, 0x46, - 0xe1, 0x50, 0x3b, 0xc3, 0x56, 0x28, 0x1c, 0xba, 0xd8, 0xf8, 0x27, 0x25, 0x80, 0xf8, 0x90, 0x68, - 0xce, 0x9a, 0x9f, 0x97, 0xf3, 0x30, 0x73, 0x64, 0x9b, 0x7b, 0xe9, 0x23, 0xdb, 0xf7, 0x22, 0xd3, - 0x5d, 0x05, 0x90, 0xa7, 0x13, 0xbf, 0xe3, 0x36, 0x4d, 0x1b, 0xec, 0xa9, 0x94, 0xa0, 0xc2, 0x74, - 0x4a, 0xd0, 0xdd, 0xd9, 0xfc, 0xc1, 0x29, 0x65, 0x14, 0x47, 0x26, 0x4a, 0xa9, 0xc8, 0x44, 0x1d, - 0xca, 0xbe, 0x30, 0x2d, 0xcf, 0x75, 0x2e, 0xc2, 0x93, 0xc1, 0xb0, 0xcc, 0xdf, 0x82, 0x82, 0xa4, - 0x7b, 0x3c, 0x65, 0x5a, 0x3b, 0x2f, 0x98, 0x38, 0x85, 0x8b, 0x9a, 0xcd, 0x0e, 0x74, 0xd2, 0x9f, - 0xda, 0x35, 0xcb, 0x46, 0x02, 0xc2, 0x37, 0x80, 0xdb, 0xe8, 0xa6, 0x39, 0x8e, 0xb0, 0x36, 0x2f, - 0xb6, 0xd4, 0x81, 0x1d, 0xed, 0xeb, 0x65, 0x63, 0xce, 0x97, 0x70, 0xfe, 0x97, 0xe3, 0xf9, 0xa7, - 0x26, 0x9f, 0xd9, 0x01, 0xf6, 0x74, 0x85, 0xcc, 0x97, 0xa8, 0x8c, 0x96, 0x43, 0xb8, 0x60, 0xd5, - 0x58, 0x92, 0xf4, 0xc6, 0xa7, 0xde, 0x97, 0x7c, 0x0d, 0x87, 0x57, 0x85, 0x66, 0xd6, 0x88, 0x69, - 0x0c, 0x20, 0x4d, 0xde, 0xf7, 0xdc, 0x7d, 0x94, 0x08, 0xa6, 0x35, 0xb9, 0x2e, 0x63, 0x7f, 0xc7, - 0xce, 0xc4, 0x37, 0x1d, 0xfa, 0xba, 0xae, 0x34, 0x79, 0x0c, 0x69, 0xfc, 0xeb, 0x6c, 0xe4, 0x3c, - 0x55, 0xa0, 0x70, 0x6c, 0x06, 0x76, 0x5f, 0xed, 0x6e, 0xda, 0xe8, 0x51, 0xbb, 0x9b, 0xf4, 0x2c, - 0x8f, 0x65, 0xd1, 0x0f, 0x0a, 0x84, 0x3e, 0xb0, 0x89, 0x6f, 0x4d, 0xb1, 0x3c, 0xaa, 0x80, 0x50, - 0x92, 0x54, 0x56, 0x10, 0x91, 0x52, 0xf8, 0xcd, 0x8a, 0xf2, 0x2d, 0xc9, 0x91, 0xa6, 0x2d, 0x86, - 0x95, 0x11, 0xc7, 0xf5, 0xa4, 0x50, 0xc1, 0x47, 0x92, 0x7b, 0x06, 0xc8, 0x26, 0xbc, 0x06, 0xc0, - 0xaa, 0xe8, 0x98, 0x84, 0x4c, 0x55, 0xc4, 0x30, 0x20, 0xb7, 0x6d, 0x19, 0xd7, 0x7d, 0xfa, 0x03, - 0x5b, 0xc1, 0x16, 0xc5, 0x97, 0xb1, 0xd8, 0x2a, 0x72, 0x35, 0x29, 0x57, 0x65, 0x0d, 0x7f, 0x9e, - 0x51, 0x06, 0x0b, 0xc3, 0x5a, 0x2d, 0xd4, 0x4b, 0xeb, 0xd8, 0xb2, 0xc8, 0xd0, 0x61, 0x1c, 0xfd, - 0xae, 0xb1, 0x89, 0x4e, 0x90, 0x3d, 0x36, 0x5d, 0xc9, 0xae, 0x61, 0x57, 0xc7, 0xd6, 0x09, 0xbb, - 0x8e, 0x24, 0xfd, 0xa1, 0x29, 0xd9, 0x0d, 0xc4, 0xc1, 0x5f, 0x5b, 0xc2, 0x47, 0x49, 0x61, 0x37, - 0x11, 0x47, 0x9a, 0x03, 0x76, 0xab, 0xf1, 0x9b, 0x71, 0xc6, 0xf3, 0x1b, 0x91, 0x7b, 0xb2, 0xc8, - 0xf2, 0x41, 0x07, 0x66, 0xde, 0x5a, 0x6e, 0xc3, 0xba, 0x2f, 0xbe, 0x3f, 0xb1, 0x53, 0xf7, 0x00, - 0x72, 0x57, 0x27, 0x9a, 0xcc, 0x52, 0x34, 0xce, 0x60, 0x3d, 0x2c, 0x3c, 0xb3, 0xe5, 0x90, 0x22, - 0x45, 0xfc, 0xad, 0xc4, 0x45, 0x85, 0xcc, 0xdc, 0x0b, 0x5e, 0x11, 0xcb, 0xf8, 0x62, 0x42, 0x74, - 0x12, 0x90, 0x5d, 0xe0, 0x24, 0xa0, 0xf1, 0xbf, 0x93, 0x47, 0xcb, 0xca, 0x61, 0xb3, 0x22, 0x87, - 0x6d, 0xf6, 0xa8, 0x39, 0x0e, 0xee, 0x67, 0x5f, 0x26, 0xb8, 0x3f, 0x2f, 0x6d, 0xe3, 0x7d, 0xf4, - 0x1f, 0x68, 0x65, 0x3e, 0x5d, 0xe0, 0xe0, 0x22, 0x85, 0xcb, 0x37, 0xe9, 0xe0, 0xd8, 0xec, 0xaa, - 0x9c, 0xa2, 0xc2, 0xdc, 0x6b, 0x43, 0xc9, 0x13, 0x62, 0x8d, 0x69, 0x24, 0xa8, 0x12, 0x7a, 0xac, - 0x38, 0x4f, 0x8f, 0xa1, 0xef, 0xac, 0x35, 0x5c, 0x54, 0x56, 0xe7, 0x3c, 0xea, 0x77, 0xc8, 0x9e, - 0xd6, 0x78, 0xd9, 0x98, 0x81, 0xa3, 0xb1, 0x37, 0x9a, 0x38, 0xd2, 0xd6, 0x47, 0x19, 0xaa, 0x30, - 0x7d, 0xaf, 0xb1, 0x32, 0x7b, 0xaf, 0xf1, 0x43, 0x80, 0x40, 0xe0, 0xea, 0xd8, 0xb2, 0xfb, 0x52, - 0x67, 0x1e, 0xdd, 0xb9, 0xac, 0x6f, 0xfa, 0x00, 0x26, 0x41, 0x81, 0xed, 0x1f, 0x99, 0xe7, 0x74, - 0x28, 0xab, 0x53, 0x24, 0xa2, 0xf2, 0xb4, 0x76, 0x5f, 0x9d, 0xd5, 0xee, 0x6f, 0x41, 0x21, 0x40, - 0x13, 0x9a, 0xae, 0xe6, 0x5c, 0x3e, 0xbf, 0x1b, 0x64, 0x67, 0x1b, 0x0a, 0x97, 0x42, 0x92, 0xa8, - 0xff, 0x3c, 0x9f, 0x2e, 0xe5, 0x54, 0x8c, 0xb0, 0x98, 0xd2, 0xb0, 0x37, 0xd3, 0x1a, 0xb6, 0x6e, - 0x41, 0x51, 0x1f, 0x2f, 0x4c, 0x07, 0x0a, 0xc2, 0xc0, 0x64, 0x36, 0x11, 0x98, 0x8c, 0xf2, 0x5b, - 0x73, 0xc9, 0xfc, 0xd6, 0xa9, 0x7b, 0x7b, 0x85, 0x99, 0x7b, 0x7b, 0x8d, 0x4f, 0xa0, 0xa0, 0x7c, - 0x02, 0x08, 0xcd, 0x51, 0x65, 0xca, 0x62, 0xa7, 0x58, 0x86, 0x5f, 0x07, 0x16, 0x08, 0xb2, 0x75, - 0x44, 0xd7, 0x1c, 0x09, 0x52, 0x92, 0x59, 0x5e, 0x83, 0xeb, 0x0a, 0x37, 0x48, 0x7f, 0x21, 0x83, - 0xcb, 0xb1, 0x8f, 0x7d, 0xd3, 0xbf, 0x60, 0xf9, 0xc6, 0x87, 0x74, 0xb8, 0x1f, 0x0a, 0x54, 0x35, - 0xba, 0x27, 0xa9, 0xd4, 0xb2, 0xa5, 0xb5, 0x0f, 0xe5, 0x86, 0x68, 0x6f, 0x4f, 0x65, 0xcc, 0x91, - 0x3b, 0x45, 0xf1, 0xa0, 0xe5, 0xe4, 0x1e, 0xff, 0xa7, 0xb6, 0xde, 0x1a, 0x9b, 0x09, 0x8b, 0x31, - 0x9d, 0x02, 0x97, 0x59, 0x34, 0x05, 0xae, 0xf1, 0x18, 0xd6, 0x8c, 0xb4, 0x4e, 0xe7, 0xef, 0x41, - 0xc9, 0x1b, 0x27, 0xf9, 0xbc, 0x48, 0x2e, 0x43, 0xf4, 0xc6, 0x4f, 0x33, 0xb0, 0xdc, 0x71, 0xa5, - 0xf0, 0x5d, 0xd3, 0xd9, 0x76, 0xcc, 0x01, 0x7f, 0x37, 0xd4, 0x52, 0xf3, 0x63, 0x0f, 0x49, 0xdc, - 0xb4, 0xc2, 0x72, 0x74, 0x18, 0x9d, 0xdf, 0x80, 0x75, 0x61, 0xd9, 0xd2, 0xf3, 0x95, 0x9d, 0x1c, - 0x66, 0x2a, 0x5e, 0x07, 0xa6, 0xc0, 0x5d, 0x5a, 0x12, 0x3d, 0x35, 0xcd, 0x35, 0xb8, 0x9e, 0x82, - 0x86, 0x46, 0x70, 0x96, 0xdf, 0x86, 0x5a, 0xbc, 0x1b, 0x6d, 0x79, 0xae, 0xec, 0xb8, 0x96, 0x38, - 0x27, 0x23, 0x8b, 0xe5, 0x1a, 0xbf, 0x11, 0x99, 0x77, 0x4f, 0x75, 0x1e, 0xa3, 0xef, 0x79, 0xf1, - 0x25, 0x59, 0x5d, 0x4a, 0x5c, 0xc6, 0xce, 0x2e, 0x70, 0x19, 0xfb, 0xc3, 0xf8, 0x42, 0xad, 0xda, - 0x28, 0x5e, 0x99, 0xbb, 0xfb, 0x50, 0xfa, 0x95, 0xb6, 0xee, 0xbb, 0x22, 0x71, 0xbb, 0xf6, 0x4d, - 0xed, 0xd2, 0xe5, 0x17, 0xb1, 0x82, 0x55, 0xa6, 0xc2, 0x3b, 0xd3, 0xb7, 0x38, 0x16, 0x4b, 0x83, - 0x9c, 0x31, 0x54, 0xe1, 0xa5, 0x0d, 0xd5, 0x6f, 0x4d, 0x79, 0x4f, 0xe5, 0xb9, 0xe1, 0xb8, 0x2b, - 0xee, 0xa8, 0x7e, 0x0b, 0x4a, 0x43, 0x3b, 0x90, 0x9e, 0xaf, 0xee, 0x4d, 0xcf, 0xde, 0xf3, 0x4a, - 0x8c, 0xd6, 0x8e, 0x42, 0xa4, 0x9c, 0xb5, 0x90, 0x8a, 0x7f, 0x17, 0xd6, 0x69, 0xe0, 0x0f, 0x63, - 0xab, 0x21, 0xa8, 0x55, 0xe7, 0xe6, 0x0a, 0x26, 0x58, 0x6d, 0x4e, 0x91, 0x18, 0xb3, 0x4c, 0xea, - 0x03, 0x80, 0x78, 0x7e, 0x66, 0xb4, 0xd8, 0x67, 0xb8, 0x37, 0x7d, 0x13, 0x8a, 0xc1, 0xe4, 0x38, - 0x3e, 0x6f, 0xd3, 0xa5, 0xfa, 0x39, 0xd4, 0x67, 0xac, 0x83, 0x43, 0xe1, 0xab, 0xe6, 0x5e, 0x79, - 0x79, 0xfb, 0xc3, 0xe4, 0xc4, 0x2b, 0xe1, 0xbc, 0x7b, 0xc9, 0xec, 0x45, 0x9c, 0x13, 0x12, 0x50, - 0x7f, 0x07, 0xaa, 0x89, 0x41, 0x45, 0xcd, 0x3c, 0x71, 0x2d, 0x2f, 0x0c, 0x01, 0xe3, 0x6f, 0x75, - 0x79, 0xcd, 0x0a, 0x83, 0xc0, 0xf4, 0xbb, 0x6e, 0x00, 0x9b, 0x1e, 0xc0, 0x2b, 0x3c, 0xec, 0x57, - 0x60, 0x25, 0x61, 0xd2, 0x45, 0xe1, 0xc1, 0x34, 0xb0, 0x71, 0x06, 0x9f, 0x4f, 0xb0, 0x3b, 0x14, - 0xfe, 0xc8, 0x0e, 0x70, 0x23, 0x51, 0xce, 0x22, 0x99, 0xd6, 0x96, 0x70, 0xa5, 0x2d, 0x43, 0x0d, - 0x1a, 0x95, 0xf9, 0x37, 0xa0, 0x30, 0x16, 0xfe, 0x28, 0xd0, 0x5a, 0x74, 0x5a, 0x82, 0xe6, 0xb2, - 0x0d, 0x0c, 0x45, 0xd3, 0xf8, 0x47, 0x19, 0x28, 0xef, 0x09, 0x69, 0xa2, 0xed, 0xc0, 0xf7, 0xa6, - 0x6a, 0x99, 0x3d, 0x23, 0x0e, 0x51, 0x37, 0xb4, 0xfb, 0xba, 0xd1, 0xd1, 0xf8, 0xba, 0xbc, 0xb3, - 0x14, 0x37, 0xac, 0xbe, 0x09, 0x25, 0x0d, 0xae, 0xbf, 0x0b, 0x6b, 0x53, 0x98, 0x34, 0x2e, 0xca, - 0xb6, 0xef, 0x5e, 0x8c, 0xc2, 0x44, 0xa6, 0x65, 0x23, 0x0d, 0xdc, 0xac, 0x40, 0x69, 0xac, 0x08, - 0x1a, 0x7f, 0x70, 0x8b, 0xd2, 0x67, 0xec, 0x13, 0xf4, 0xe9, 0xe7, 0xed, 0xac, 0x77, 0x00, 0x68, - 0x6b, 0x56, 0x49, 0x16, 0x2a, 0x64, 0x9b, 0x80, 0xf0, 0xf7, 0xa3, 0x58, 0x7b, 0x7e, 0xae, 0x51, - 0x95, 0x64, 0x3e, 0x1d, 0x70, 0xaf, 0x41, 0xc9, 0x0e, 0x28, 0x0e, 0xa7, 0x13, 0x93, 0xc2, 0xa2, - 0xfa, 0xd2, 0xf3, 0xcc, 0x40, 0xea, 0xa0, 0x77, 0x58, 0xe4, 0xdf, 0x84, 0xa2, 0x3d, 0x1a, 0x7b, - 0xbe, 0xd4, 0x61, 0xfa, 0x2b, 0xeb, 0xeb, 0x10, 0xe6, 0xce, 0x92, 0xa1, 0x69, 0x90, 0x5a, 0x9c, - 0x13, 0x75, 0xf9, 0xc5, 0xd4, 0xed, 0xf3, 0x90, 0x5a, 0xd1, 0xf0, 0xef, 0xc0, 0xca, 0x40, 0x65, - 0x6c, 0x2a, 0xc6, 0x5a, 0xbd, 0x7c, 0xf9, 0x2a, 0x26, 0x8f, 0x92, 0x04, 0x3b, 0x4b, 0x46, 0x9a, - 0x03, 0xb2, 0x44, 0xd3, 0x5e, 0x04, 0xb2, 0xe7, 0x7d, 0xe4, 0xd9, 0x2e, 0x39, 0xc2, 0x2f, 0x60, - 0x69, 0x24, 0x09, 0x90, 0x65, 0x8a, 0x03, 0xff, 0x1a, 0xda, 0x42, 0x81, 0xd4, 0x97, 0xda, 0xef, - 0x5e, 0xc5, 0xa9, 0x27, 0x02, 0x7d, 0x1d, 0x3d, 0x90, 0xfc, 0x1c, 0xea, 0x89, 0xe5, 0xa3, 0x2b, - 0x69, 0x8e, 0xc7, 0xbe, 0x87, 0xde, 0xf4, 0x0a, 0x71, 0xfb, 0xda, 0x55, 0xdc, 0x0e, 0x2f, 0xa5, - 0xde, 0x59, 0x32, 0xae, 0xe0, 0xcd, 0x7b, 0xe8, 0xf3, 0xe9, 0x2e, 0xec, 0x0a, 0xf3, 0x2c, 0xbc, - 0x12, 0x7f, 0x7f, 0xa1, 0x51, 0x20, 0x8a, 0x9d, 0x25, 0x63, 0x8a, 0x07, 0xff, 0x15, 0x58, 0x4f, - 0xd5, 0x49, 0xb7, 0x60, 0xd5, 0x85, 0xf9, 0xaf, 0x2e, 0xdc, 0x0d, 0x24, 0xda, 0x59, 0x32, 0x66, - 0x39, 0xf1, 0x09, 0x7c, 0x6e, 0xb6, 0x4b, 0x5b, 0xa2, 0xef, 0xd8, 0xae, 0xd0, 0x77, 0xeb, 0xdf, - 0x79, 0xb9, 0xd1, 0xd2, 0xc4, 0x3b, 0x4b, 0xc6, 0xe5, 0x9c, 0xf9, 0x5f, 0x82, 0xdb, 0xe3, 0xb9, - 0xca, 0x47, 0x29, 0x35, 0x7d, 0x35, 0xff, 0xbd, 0x05, 0x6b, 0x9e, 0xa1, 0xdf, 0x59, 0x32, 0xae, - 0xe4, 0xcf, 0xfb, 0x70, 0xcd, 0x9c, 0x48, 0x0f, 0x2d, 0x05, 0x75, 0xbc, 0x4b, 0xd7, 0x27, 0xf5, - 0x85, 0xfe, 0x07, 0x57, 0x55, 0xdb, 0x9c, 0x25, 0xdb, 0x59, 0x32, 0xe6, 0x71, 0x43, 0xd3, 0x9d, - 0x1c, 0x78, 0x9d, 0xbd, 0xae, 0x0a, 0xfc, 0x36, 0x54, 0xcc, 0xbe, 0xb3, 0x23, 0x4c, 0x2b, 0x3a, - 0xae, 0x88, 0x01, 0xf5, 0xff, 0x9e, 0x81, 0xa2, 0x5e, 0x54, 0xb7, 0xa3, 0x94, 0x84, 0x68, 0xe7, - 0x88, 0x01, 0xfc, 0x03, 0xa8, 0x08, 0xdf, 0xf7, 0xfc, 0x96, 0x67, 0x85, 0xd9, 0x9c, 0xd3, 0x41, - 0x6e, 0xc5, 0x67, 0xa3, 0x1d, 0xa2, 0x19, 0x31, 0x05, 0x7f, 0x1f, 0x40, 0x29, 0x93, 0x5e, 0x7c, - 0x09, 0xa9, 0x3e, 0x9f, 0x5e, 0x9d, 0x80, 0xc5, 0xd8, 0x71, 0x54, 0x30, 0x3c, 0x7e, 0x0a, 0x8b, - 0x91, 0xbf, 0x5b, 0x48, 0xf8, 0xbb, 0xb7, 0x75, 0x18, 0x83, 0xa2, 0x3b, 0xfa, 0x2a, 0x5e, 0x04, - 0xa8, 0xff, 0x61, 0x06, 0x8a, 0x4a, 0x43, 0xf1, 0xf6, 0x6c, 0x8f, 0x5e, 0x7b, 0xb1, 0x62, 0xdb, - 0x98, 0xee, 0xd9, 0x37, 0x01, 0x94, 0xa2, 0x4b, 0xf4, 0xec, 0xf6, 0x14, 0x1f, 0x4d, 0x1a, 0xe6, - 0x4f, 0xc7, 0xf8, 0x8d, 0x87, 0xea, 0xba, 0x18, 0x45, 0xa4, 0x9f, 0xec, 0xee, 0xb2, 0x25, 0xbe, - 0x0e, 0x2b, 0x4f, 0xf6, 0x1f, 0xef, 0x1f, 0x3c, 0xdb, 0x3f, 0x6a, 0x1b, 0xc6, 0x81, 0xa1, 0x02, - 0xd3, 0x9b, 0xcd, 0xad, 0xa3, 0xce, 0xfe, 0xe1, 0x93, 0x1e, 0xcb, 0xd6, 0xff, 0x79, 0x06, 0x56, - 0x52, 0x0a, 0xf2, 0xcf, 0x76, 0xea, 0x12, 0xc3, 0x9f, 0x9b, 0x3f, 0xfc, 0xf9, 0xcb, 0x86, 0xbf, - 0x30, 0x3d, 0xfc, 0xbf, 0x93, 0x81, 0x95, 0x94, 0x22, 0x4e, 0x72, 0xcf, 0xa4, 0xb9, 0x27, 0x0d, - 0x8d, 0xec, 0x94, 0xa1, 0xd1, 0x80, 0xe5, 0xf0, 0xf7, 0x7e, 0x1c, 0xf0, 0x48, 0xc1, 0x92, 0x38, - 0x74, 0x5f, 0x23, 0x9f, 0xc6, 0xa1, 0x3b, 0x1b, 0x57, 0xb7, 0x96, 0xee, 0xa7, 0x06, 0x74, 0x7d, - 0xbf, 0x7e, 0xb9, 0x9a, 0xbe, 0xa2, 0x0b, 0x8f, 0xa0, 0x3a, 0x8e, 0x75, 0xc1, 0xcb, 0x59, 0x45, - 0x49, 0xca, 0x17, 0xb4, 0xf3, 0x77, 0x33, 0xb0, 0x9a, 0x56, 0xec, 0xff, 0x5f, 0x0f, 0xeb, 0x3f, - 0xcd, 0xc0, 0xfa, 0xcc, 0x76, 0x71, 0xa5, 0x5d, 0x39, 0xdd, 0xae, 0xec, 0x02, 0xed, 0xca, 0xcd, - 0x69, 0xd7, 0xe5, 0x9a, 0xe4, 0xea, 0x16, 0x77, 0xe1, 0x73, 0x97, 0x6e, 0x3c, 0x57, 0x0c, 0x75, - 0x8a, 0x69, 0x6e, 0x9a, 0xe9, 0x6f, 0x67, 0xe0, 0xf6, 0x55, 0x9b, 0xca, 0xff, 0x73, 0xb9, 0x9a, - 0x69, 0xe1, 0xaf, 0xc2, 0xb5, 0x39, 0xdb, 0xcf, 0x15, 0xed, 0x7a, 0x15, 0x56, 0xb1, 0x01, 0x87, - 0x71, 0x78, 0x3d, 0xab, 0xaf, 0x79, 0xa6, 0xa0, 0x68, 0x70, 0xab, 0x33, 0xf7, 0xcd, 0xd4, 0x33, - 0x51, 0x69, 0x60, 0xe3, 0xdd, 0x28, 0x8d, 0xa2, 0x0a, 0x25, 0xfd, 0x2a, 0x97, 0x4e, 0x54, 0x1f, - 0x7a, 0xcf, 0x5d, 0x15, 0x87, 0x37, 0x84, 0xa9, 0xdf, 0x2d, 0x30, 0xc4, 0xd8, 0xb1, 0xe9, 0x84, - 0xf8, 0x16, 0x40, 0x93, 0xbc, 0xda, 0xf0, 0x1a, 0x51, 0x6b, 0xf7, 0xa0, 0xdb, 0x66, 0x4b, 0x49, - 0x13, 0xfe, 0x93, 0x70, 0x1f, 0x68, 0x1c, 0x42, 0x31, 0xbe, 0xd8, 0xb1, 0x67, 0xfa, 0xa7, 0x96, - 0x3a, 0x87, 0x5d, 0x86, 0xf2, 0xa1, 0x76, 0x20, 0x55, 0x55, 0x1f, 0x75, 0x0f, 0xf6, 0x55, 0xc8, - 0x7f, 0xeb, 0xa0, 0xa7, 0xae, 0x87, 0x74, 0x9f, 0x3e, 0x52, 0x07, 0x82, 0x8f, 0x8c, 0xe6, 0xe1, - 0xce, 0x11, 0x61, 0x14, 0x1a, 0xbf, 0x95, 0x0f, 0x37, 0xd5, 0x86, 0xa1, 0x4f, 0x78, 0x01, 0x8a, - 0xb8, 0x99, 0x78, 0x9a, 0x71, 0x54, 0x0d, 0xa5, 0x34, 0xb7, 0xcf, 0x55, 0x14, 0x86, 0x65, 0x79, - 0x11, 0xb2, 0x87, 0xc7, 0x2a, 0x0f, 0x6b, 0x47, 0x8e, 0x1c, 0x75, 0xaf, 0xb4, 0x77, 0x2e, 0x59, - 0x01, 0x7f, 0xb4, 0x82, 0x33, 0x56, 0x6c, 0xfc, 0x8b, 0x1c, 0x54, 0x22, 0x4d, 0xfd, 0x32, 0x3b, - 0x07, 0xe7, 0xb0, 0xda, 0xd9, 0xef, 0xb5, 0x8d, 0xfd, 0xe6, 0xae, 0x46, 0xc9, 0xf1, 0x6b, 0xb0, - 0xb6, 0xdd, 0xd9, 0x6d, 0x1f, 0xed, 0x1e, 0x34, 0xb7, 0x34, 0xb0, 0xcc, 0x6f, 0x02, 0xef, 0xec, - 0x1d, 0x1e, 0x18, 0xbd, 0xa3, 0x4e, 0xf7, 0xa8, 0xd5, 0xdc, 0x6f, 0xb5, 0x77, 0xdb, 0x5b, 0xac, - 0xc8, 0x5f, 0x81, 0xbb, 0xfb, 0x07, 0xbd, 0xce, 0xc1, 0xfe, 0xd1, 0xfe, 0xc1, 0xd1, 0xc1, 0xe6, - 0x47, 0xed, 0x56, 0xaf, 0x7b, 0xd4, 0xd9, 0x3f, 0x42, 0xae, 0x8f, 0x8c, 0x26, 0x7e, 0x61, 0x05, - 0x7e, 0x17, 0x6e, 0x6b, 0xac, 0x6e, 0xdb, 0x78, 0xda, 0x36, 0x90, 0xc9, 0x93, 0xfd, 0xe6, 0xd3, - 0x66, 0x67, 0xb7, 0xb9, 0xb9, 0xdb, 0x66, 0xcb, 0xfc, 0x0e, 0xd4, 0x35, 0x86, 0xd1, 0xec, 0xb5, - 0x8f, 0x76, 0x3b, 0x7b, 0x9d, 0xde, 0x51, 0xfb, 0xbb, 0xad, 0x76, 0x7b, 0xab, 0xbd, 0xc5, 0x56, - 0xf8, 0x97, 0xe1, 0x4b, 0xd4, 0x28, 0xdd, 0x88, 0x74, 0x65, 0x9f, 0x74, 0x0e, 0x8f, 0x9a, 0x46, - 0x6b, 0xa7, 0xf3, 0xb4, 0xcd, 0x56, 0xf9, 0x6b, 0xf0, 0xc5, 0xcb, 0x51, 0xb7, 0x3a, 0x46, 0xbb, - 0xd5, 0x3b, 0x30, 0x3e, 0x66, 0xeb, 0xfc, 0x97, 0xe0, 0x73, 0x3b, 0xbd, 0xbd, 0xdd, 0xa3, 0x67, - 0xc6, 0xc1, 0xfe, 0xa3, 0x23, 0xfa, 0xd9, 0xed, 0x19, 0x4f, 0x5a, 0xbd, 0x27, 0x46, 0x9b, 0x01, - 0xaf, 0xc3, 0xcd, 0xc3, 0xcd, 0xa3, 0xfd, 0x83, 0xde, 0x51, 0x73, 0xff, 0xe3, 0xcd, 0xdd, 0x83, - 0xd6, 0xe3, 0xa3, 0xed, 0x03, 0x63, 0xaf, 0xd9, 0x63, 0x55, 0xfe, 0x15, 0x78, 0xad, 0xd5, 0x7d, - 0xaa, 0x9b, 0x79, 0xb0, 0x7d, 0x64, 0x1c, 0x3c, 0xeb, 0x1e, 0x1d, 0x18, 0x47, 0x46, 0x7b, 0x97, - 0xfa, 0xdc, 0x8d, 0xdb, 0x5e, 0xe2, 0xb7, 0xa1, 0xd6, 0xd9, 0xef, 0x3e, 0xd9, 0xde, 0xee, 0xb4, - 0x3a, 0xed, 0xfd, 0xde, 0xd1, 0x61, 0xdb, 0xd8, 0xeb, 0x74, 0xbb, 0x88, 0xc6, 0x2a, 0x8d, 0x6f, - 0x43, 0xb1, 0xe3, 0x9e, 0xd9, 0x92, 0x96, 0xb7, 0x16, 0x46, 0xed, 0x6f, 0x86, 0x45, 0x5a, 0x95, - 0xf6, 0xc0, 0xa5, 0xf7, 0x12, 0x68, 0x05, 0x2d, 0x1b, 0x31, 0xa0, 0xf1, 0x87, 0x39, 0x58, 0x51, - 0x2c, 0x42, 0xff, 0xf5, 0x1e, 0xac, 0xe9, 0x40, 0x70, 0x27, 0xad, 0x41, 0xa7, 0xc1, 0xf4, 0x10, - 0x99, 0x02, 0x25, 0x56, 0x67, 0x12, 0xc4, 0x6f, 0x42, 0xd1, 0xec, 0x3b, 0xe8, 0x04, 0xab, 0xd3, - 0x5a, 0x5d, 0xfa, 0xac, 0xaa, 0x13, 0xd5, 0xb2, 0x42, 0xec, 0x7b, 0x6e, 0x2b, 0xba, 0x32, 0x93, - 0x82, 0xf1, 0x4f, 0xe0, 0x56, 0x54, 0x6e, 0xbb, 0x7d, 0xff, 0x62, 0x1c, 0xbd, 0x14, 0x58, 0x9a, - 0x1b, 0x4a, 0xd9, 0xb6, 0x1d, 0x91, 0x42, 0x34, 0x2e, 0x63, 0xc0, 0x1f, 0x01, 0xd8, 0x34, 0x58, - 0x64, 0x9e, 0xcd, 0xbf, 0x17, 0x9e, 0x1a, 0x4d, 0x5d, 0xd2, 0x56, 0x68, 0xf4, 0x1b, 0xf7, 0xa7, - 0x01, 0xaa, 0xfd, 0xc7, 0xfa, 0x61, 0xc1, 0x65, 0x23, 0x2a, 0x37, 0x1e, 0x00, 0xc4, 0x54, 0x9c, - 0xc1, 0x32, 0x9a, 0x36, 0xcd, 0x60, 0x4f, 0x8c, 0x8e, 0x85, 0xaf, 0x72, 0x18, 0x15, 0xe4, 0x11, - 0x52, 0xb0, 0x4c, 0xe3, 0x8f, 0x32, 0x89, 0x28, 0x84, 0x8a, 0x32, 0x5c, 0xb9, 0x01, 0xce, 0x3b, - 0x11, 0x43, 0x6f, 0x5f, 0x0f, 0xaa, 0xb6, 0xcb, 0x74, 0x91, 0x1f, 0x02, 0xb7, 0x67, 0x87, 0x32, - 0xbf, 0xe0, 0x50, 0xce, 0xa1, 0x9d, 0x3e, 0xd0, 0x28, 0xcc, 0x1e, 0x68, 0xdc, 0x01, 0x18, 0x38, - 0xde, 0xb1, 0x56, 0xfb, 0x45, 0x9d, 0xf5, 0x14, 0x41, 0x1a, 0x0e, 0x94, 0xc3, 0x57, 0x12, 0x51, - 0xc6, 0xe8, 0x9d, 0xc4, 0x28, 0xbc, 0xab, 0x4a, 0x7c, 0x07, 0x56, 0x45, 0xba, 0xcd, 0xd9, 0x05, - 0xdb, 0x3c, 0x45, 0xd7, 0xf8, 0x3a, 0xac, 0xcf, 0x20, 0xe1, 0x20, 0x8e, 0x4d, 0x19, 0x3d, 0x95, - 0x80, 0xbf, 0x67, 0x93, 0x15, 0x1a, 0xff, 0x21, 0x0b, 0xcb, 0x7b, 0xa6, 0x6b, 0x9f, 0x88, 0x40, - 0x86, 0xad, 0x0d, 0xfa, 0x43, 0x31, 0x32, 0xc3, 0xd6, 0xaa, 0x92, 0x8e, 0xf9, 0x64, 0x93, 0xa7, - 0x29, 0x33, 0x87, 0x6f, 0xb8, 0x9a, 0x26, 0x72, 0x18, 0xdd, 0x1e, 0xd0, 0x25, 0x9c, 0x3b, 0xc7, - 0xee, 0x0b, 0x37, 0x08, 0x57, 0x4c, 0x58, 0x8c, 0x73, 0x97, 0x8a, 0x57, 0xe4, 0x2e, 0x95, 0x66, - 0xc7, 0xff, 0x2e, 0x54, 0x83, 0xbe, 0x2f, 0x84, 0x1b, 0x0c, 0x3d, 0x19, 0xbe, 0xb0, 0x99, 0x04, - 0x51, 0x22, 0xa1, 0xf7, 0xdc, 0x45, 0x19, 0xdf, 0xb5, 0xdd, 0x53, 0x9d, 0x1f, 0x97, 0x82, 0xa1, - 0x0c, 0x52, 0xc4, 0xcb, 0xfe, 0x81, 0xa0, 0x98, 0x4a, 0xc1, 0x88, 0xca, 0x14, 0xd3, 0x32, 0xa5, - 0x18, 0x78, 0xbe, 0x2d, 0x54, 0x60, 0xb7, 0x62, 0x24, 0x20, 0x48, 0xeb, 0x98, 0xee, 0x60, 0x62, - 0x0e, 0x84, 0x3e, 0xfc, 0x8f, 0xca, 0x8d, 0xff, 0x51, 0x00, 0x50, 0xab, 0x21, 0x18, 0xda, 0x63, - 0x3a, 0x78, 0xb2, 0x75, 0xce, 0xf4, 0x8a, 0x41, 0xbf, 0xf9, 0x7b, 0xa9, 0xeb, 0x0c, 0xb3, 0x47, - 0xc5, 0x31, 0xf9, 0x74, 0x40, 0x0c, 0x07, 0xc7, 0x94, 0x42, 0xa7, 0x8d, 0xd1, 0xf8, 0xe7, 0x8d, - 0x24, 0x88, 0x12, 0x07, 0x4d, 0x29, 0xda, 0xae, 0xa5, 0x02, 0x6e, 0x79, 0x23, 0x2a, 0xd3, 0x85, - 0xa8, 0x00, 0xcd, 0x1c, 0x43, 0xb8, 0xe2, 0x79, 0x74, 0xd7, 0x2f, 0x06, 0xf1, 0x3d, 0x58, 0x19, - 0x9b, 0x17, 0x23, 0xe1, 0xca, 0x3d, 0x21, 0x87, 0x9e, 0xa5, 0x73, 0xbc, 0x5e, 0xbb, 0xbc, 0x81, - 0x87, 0x49, 0x74, 0x23, 0x4d, 0x8d, 0x32, 0xe1, 0x06, 0xb4, 0x4a, 0xd4, 0x34, 0xea, 0x12, 0xdf, - 0x04, 0x50, 0xbf, 0x12, 0x9a, 0x6a, 0x26, 0xd2, 0x66, 0x8e, 0x44, 0x20, 0xfc, 0x33, 0x5b, 0x69, - 0x57, 0xa5, 0xa4, 0x62, 0x2a, 0xd4, 0xc5, 0x93, 0x40, 0xf8, 0xed, 0x91, 0x69, 0x3b, 0x7a, 0x82, - 0x63, 0x00, 0x7f, 0x1b, 0x6e, 0x04, 0x93, 0x63, 0x94, 0x99, 0x63, 0xd1, 0xf3, 0xf6, 0xc5, 0xf3, - 0xc0, 0x11, 0x52, 0x0a, 0x5f, 0xe7, 0x91, 0xcc, 0xff, 0xd8, 0x18, 0x44, 0x66, 0x18, 0xbd, 0xe6, - 0x82, 0xbf, 0xe2, 0x64, 0xb5, 0x08, 0xa4, 0x33, 0xf9, 0x58, 0x06, 0xd5, 0x9f, 0x02, 0xe9, 0x44, - 0xbf, 0x2c, 0xff, 0x12, 0x7c, 0x21, 0x85, 0x64, 0xa8, 0x63, 0xf9, 0x60, 0xdb, 0x76, 0x4d, 0xc7, - 0xfe, 0x81, 0x4a, 0x92, 0xc8, 0x35, 0xc6, 0xb0, 0x92, 0x1a, 0x38, 0xba, 0x9c, 0x4a, 0xbf, 0x74, - 0xb6, 0x13, 0x83, 0x65, 0x55, 0xee, 0x4a, 0xdf, 0xa6, 0xf3, 0xa6, 0x08, 0xd2, 0xc2, 0x75, 0xee, - 0xb1, 0x2c, 0xbf, 0x0e, 0x4c, 0x41, 0x3a, 0xae, 0x39, 0x1e, 0x37, 0xc7, 0x63, 0x47, 0xb0, 0x1c, - 0x5d, 0xfc, 0x8d, 0xa1, 0xea, 0x52, 0x03, 0xcb, 0x37, 0xbe, 0x0b, 0xb7, 0x68, 0x64, 0x9e, 0x0a, - 0x3f, 0xf2, 0xf3, 0x75, 0x5f, 0x6f, 0xc0, 0xba, 0xfa, 0xb5, 0xef, 0x49, 0xf5, 0x99, 0x8c, 0x4f, - 0x0e, 0xab, 0x0a, 0x8c, 0xb6, 0x57, 0x57, 0xd0, 0x75, 0xde, 0x08, 0x16, 0xe1, 0x65, 0x1b, 0x3f, - 0x2d, 0x02, 0x8f, 0x05, 0xa2, 0x67, 0x0b, 0x7f, 0xcb, 0x94, 0x66, 0x22, 0x4e, 0xbc, 0x72, 0x69, - 0xa6, 0xc3, 0x8b, 0xf3, 0x14, 0x6f, 0x42, 0xd1, 0x0e, 0xd0, 0x33, 0xd5, 0xc9, 0xca, 0xba, 0xc4, - 0x77, 0x01, 0xc6, 0xc2, 0xb7, 0x3d, 0x8b, 0x24, 0xa8, 0x30, 0xf7, 0x56, 0xc9, 0x6c, 0xa3, 0x36, - 0x0e, 0x23, 0x1a, 0x23, 0x41, 0x8f, 0xed, 0x50, 0x25, 0x95, 0x37, 0x50, 0xa4, 0x46, 0x27, 0x41, - 0xfc, 0x0d, 0xb8, 0x36, 0xf6, 0xed, 0xbe, 0x50, 0xd3, 0xf1, 0x24, 0xb0, 0x5a, 0xf4, 0x06, 0x62, - 0x89, 0x30, 0xe7, 0x7d, 0x42, 0x09, 0x34, 0x5d, 0xf2, 0xd7, 0x02, 0x3a, 0x29, 0xd7, 0x17, 0xe0, - 0x55, 0x3a, 0xef, 0x8a, 0x31, 0xff, 0x23, 0xbf, 0x0f, 0x4c, 0x7f, 0xd8, 0xb3, 0xdd, 0x5d, 0xe1, - 0x0e, 0xe4, 0x90, 0x84, 0x7b, 0xc5, 0x98, 0x81, 0x93, 0x06, 0x53, 0x2f, 0x4d, 0xa9, 0x53, 0xb4, - 0x8a, 0x11, 0x95, 0xd5, 0xa3, 0x0a, 0x8e, 0xe7, 0x77, 0xa5, 0xaf, 0xf3, 0x92, 0xa3, 0x32, 0xda, - 0x50, 0x01, 0xb5, 0xf5, 0xd0, 0xf7, 0xac, 0x09, 0x9d, 0xf1, 0x28, 0x25, 0x36, 0x0d, 0x8e, 0x31, - 0xf7, 0x4c, 0x57, 0x27, 0x8b, 0xae, 0x24, 0x31, 0x23, 0x30, 0xb9, 0xa4, 0x5e, 0x10, 0x33, 0x5c, - 0xd3, 0x2e, 0x69, 0x02, 0xa6, 0x71, 0x62, 0x56, 0x2c, 0xc2, 0x89, 0xf9, 0x50, 0xff, 0x2d, 0xdf, - 0xb3, 0xad, 0x98, 0x97, 0xca, 0x5b, 0x9a, 0x81, 0x27, 0x70, 0x63, 0x9e, 0x3c, 0x85, 0x1b, 0xc1, - 0x1b, 0x3f, 0xca, 0x00, 0xc4, 0x93, 0x8f, 0x22, 0x1f, 0x97, 0xe2, 0x25, 0x7e, 0x0b, 0xae, 0x25, - 0xc1, 0x8e, 0x4e, 0xf8, 0x25, 0xb9, 0x8f, 0x3f, 0x6c, 0x99, 0x17, 0x01, 0xcb, 0xea, 0x2b, 0xe8, - 0x1a, 0xf6, 0x4c, 0x08, 0xca, 0x9e, 0xbc, 0x0e, 0x2c, 0x06, 0xd2, 0xbd, 0xc2, 0x80, 0xe5, 0xd3, - 0xa8, 0x1f, 0x0b, 0xd3, 0x0f, 0x58, 0xa1, 0xb1, 0x03, 0x45, 0x75, 0xd4, 0x37, 0xe7, 0x90, 0xfe, - 0xe5, 0x32, 0x6e, 0xfe, 0x46, 0x06, 0x60, 0x4b, 0x65, 0x87, 0xe3, 0x2e, 0x3e, 0x27, 0xf7, 0x61, - 0x9e, 0x45, 0x65, 0x5a, 0x16, 0x65, 0xd9, 0xe7, 0xa2, 0xf7, 0x8b, 0xb0, 0x88, 0x92, 0x63, 0x86, - 0x19, 0x72, 0x6a, 0xcd, 0x45, 0x65, 0xb5, 0x81, 0xb4, 0x3c, 0xd7, 0x15, 0x7d, 0xdc, 0x7e, 0xa2, - 0x0d, 0x24, 0x02, 0x35, 0x7e, 0x98, 0x85, 0x4a, 0x6b, 0x68, 0x4a, 0xf5, 0xdc, 0xcf, 0xb7, 0xa1, - 0x3c, 0x12, 0x41, 0x60, 0x0e, 0x44, 0xa0, 0x8f, 0xb6, 0xa6, 0xcf, 0xa5, 0x23, 0xdc, 0x8d, 0x27, - 0xae, 0x2f, 0x4c, 0x4b, 0xbd, 0x71, 0x14, 0x51, 0x29, 0x0e, 0xae, 0x8c, 0x7c, 0xff, 0x97, 0xe0, - 0xe0, 0x46, 0x0f, 0x12, 0x5b, 0xc7, 0xf1, 0x0b, 0xd8, 0xaa, 0xb7, 0x49, 0x50, 0x7d, 0x0f, 0xaa, - 0x09, 0x52, 0xf4, 0xd8, 0x3d, 0xc7, 0x12, 0x81, 0xba, 0xe5, 0x18, 0x3f, 0x0c, 0x99, 0x02, 0x52, - 0x82, 0x0a, 0xae, 0x5c, 0xe1, 0xeb, 0x53, 0xca, 0xb0, 0xd8, 0xf8, 0x5f, 0x25, 0xa8, 0x62, 0xa3, - 0xf6, 0x54, 0x1f, 0x66, 0xa6, 0xa3, 0x06, 0x25, 0x4f, 0x73, 0xd6, 0xd7, 0x23, 0xbd, 0x04, 0x4f, - 0x9d, 0xf4, 0x92, 0x4b, 0x27, 0xbd, 0xdc, 0x86, 0x8a, 0x3a, 0x52, 0xb3, 0x9a, 0x4a, 0x13, 0xe6, - 0x8c, 0x18, 0x80, 0xe6, 0xca, 0xc8, 0xb3, 0x48, 0x1f, 0x37, 0xd5, 0x99, 0x53, 0xce, 0x48, 0x40, - 0x92, 0x8f, 0x55, 0x55, 0xd3, 0x8f, 0x55, 0x51, 0xf6, 0xd1, 0xd8, 0xb9, 0xe8, 0x79, 0xba, 0xb5, - 0x1d, 0x2b, 0xbe, 0x65, 0x9e, 0x86, 0xf3, 0x16, 0x94, 0xf4, 0xb4, 0xe8, 0x93, 0xb5, 0x2f, 0xcf, - 0x99, 0x09, 0x8d, 0xbe, 0xa1, 0xff, 0xea, 0x8b, 0x5e, 0x46, 0x48, 0xc9, 0x1f, 0x41, 0xd5, 0x94, - 0xd2, 0xec, 0x0f, 0x47, 0x5a, 0x7f, 0xe6, 0xe6, 0x1c, 0xbf, 0x27, 0x19, 0x35, 0x23, 0x6c, 0x23, - 0x49, 0xc9, 0x37, 0xa1, 0xe2, 0x0b, 0x33, 0x95, 0x01, 0xf0, 0xca, 0x15, 0x6c, 0x8c, 0x10, 0xd7, - 0x88, 0xc9, 0xa2, 0x37, 0x52, 0x21, 0x7e, 0x23, 0xb5, 0xfe, 0x93, 0x0c, 0xac, 0xa6, 0x1b, 0xff, - 0x67, 0xf1, 0x66, 0xdf, 0x37, 0xe3, 0x37, 0xfb, 0x3e, 0xc3, 0xfb, 0x77, 0xbf, 0x9d, 0x01, 0x88, - 0xc7, 0x05, 0xf7, 0x48, 0xf5, 0xb6, 0x58, 0x68, 0xb5, 0xab, 0x12, 0xdf, 0x49, 0x3d, 0x48, 0xf1, - 0xf6, 0x42, 0x83, 0x9c, 0xf8, 0x99, 0x48, 0xde, 0x7f, 0x00, 0xab, 0x69, 0x38, 0x5d, 0x7a, 0xe8, - 0xec, 0xb6, 0x55, 0x8c, 0xaa, 0xb3, 0xd7, 0x7c, 0xd4, 0xd6, 0x97, 0xed, 0x3a, 0xfb, 0x8f, 0x59, - 0xb6, 0xfe, 0xc7, 0x19, 0xa8, 0x44, 0x43, 0xce, 0xbf, 0x93, 0x9c, 0x2b, 0x95, 0xe6, 0xf3, 0xd6, - 0x22, 0x73, 0x15, 0xff, 0x6a, 0xbb, 0xd2, 0xbf, 0x48, 0x4c, 0x5d, 0xdd, 0x83, 0xd5, 0xf4, 0xc7, - 0x39, 0x4a, 0xf4, 0x51, 0x5a, 0x89, 0xbe, 0xb9, 0x50, 0x95, 0xa1, 0xab, 0xba, 0x6b, 0x07, 0x52, - 0xeb, 0xd7, 0xf7, 0xb3, 0xef, 0x65, 0xea, 0x77, 0x61, 0x39, 0xf9, 0x69, 0xf6, 0x46, 0xed, 0xfd, - 0x3f, 0xce, 0xc1, 0x6a, 0x3a, 0x53, 0x86, 0xee, 0xef, 0xa9, 0x2c, 0xad, 0x03, 0xc7, 0x4a, 0xdc, - 0x77, 0x60, 0xe8, 0x26, 0x6b, 0x67, 0x98, 0x00, 0xeb, 0x14, 0x05, 0xf3, 0x46, 0x82, 0xdd, 0x4d, - 0xbe, 0x4b, 0xfa, 0x06, 0x87, 0xf0, 0x66, 0x25, 0x1b, 0xf3, 0x8a, 0x7e, 0xa1, 0xed, 0x87, 0x59, - 0xbe, 0x92, 0xc8, 0xba, 0xff, 0x31, 0x5a, 0x82, 0x6b, 0x9b, 0x13, 0xd7, 0x72, 0x84, 0x15, 0x41, - 0x7f, 0x92, 0x84, 0x46, 0x69, 0xf3, 0x3f, 0xcc, 0xf3, 0x55, 0xa8, 0x74, 0x27, 0xc7, 0x3a, 0x65, - 0xfe, 0x2f, 0xe7, 0xf9, 0x4d, 0x58, 0xd7, 0x58, 0x71, 0x86, 0x2a, 0xfb, 0x2b, 0xb8, 0x67, 0xad, - 0x36, 0xd5, 0x78, 0xe9, 0x86, 0xb2, 0xbf, 0x9a, 0xc7, 0x26, 0xd0, 0x85, 0xfd, 0xbf, 0x46, 0x7c, - 0xa2, 0xeb, 0x4d, 0xec, 0xd7, 0xf2, 0x7c, 0x0d, 0xa0, 0xdb, 0x8b, 0x2a, 0xfa, 0x8d, 0x3c, 0xaf, - 0x42, 0xb1, 0xdb, 0x23, 0x6e, 0x3f, 0xca, 0xf3, 0x1b, 0xc0, 0xe2, 0xaf, 0x3a, 0x6f, 0xf7, 0x6f, - 0xaa, 0xc6, 0x44, 0x89, 0xb8, 0x7f, 0x2b, 0x8f, 0xfd, 0x0a, 0x47, 0x99, 0xfd, 0xed, 0x3c, 0x67, - 0x50, 0x4d, 0x84, 0x76, 0xd9, 0xdf, 0xc9, 0x73, 0x0e, 0x2b, 0x7b, 0x76, 0x10, 0xd8, 0xee, 0x40, - 0xf7, 0xe0, 0xd7, 0xa9, 0xe6, 0xed, 0xe8, 0x86, 0x16, 0xfb, 0xcd, 0x3c, 0xbf, 0x05, 0x3c, 0x79, - 0x9c, 0xa5, 0x3f, 0xfc, 0x5d, 0xa2, 0x56, 0xfb, 0x64, 0xa0, 0x61, 0x7f, 0x8f, 0xa8, 0x51, 0x12, - 0x34, 0xe0, 0xb7, 0x68, 0x40, 0x5a, 0x71, 0xa6, 0xaf, 0x86, 0xff, 0x98, 0x88, 0xc3, 0xc9, 0x54, - 0xb0, 0x9f, 0xe4, 0xef, 0xff, 0x94, 0x8e, 0x23, 0x92, 0x09, 0x73, 0x7c, 0x19, 0xca, 0x8e, 0xe7, - 0x0e, 0xa4, 0x7a, 0x0f, 0x76, 0x05, 0x2a, 0xc1, 0xd0, 0xf3, 0x25, 0x15, 0xe9, 0x0a, 0xa9, 0x4b, - 0x8f, 0x09, 0xa8, 0x4b, 0x17, 0xca, 0xab, 0x53, 0xf1, 0x55, 0x69, 0x0e, 0x58, 0x35, 0xca, 0x51, - 0xce, 0x47, 0x79, 0xd4, 0xf4, 0xa8, 0x41, 0x78, 0x69, 0x9c, 0x15, 0x11, 0x75, 0xe2, 0x3b, 0x2a, - 0x9f, 0x5a, 0xa0, 0x45, 0xaf, 0x1e, 0x7e, 0x1c, 0x0f, 0xd1, 0x71, 0xa8, 0x28, 0xa8, 0xf7, 0x3d, - 0x5b, 0x5d, 0x47, 0xd6, 0xe9, 0x89, 0x16, 0xb6, 0x23, 0xca, 0xc0, 0x61, 0xe2, 0xfe, 0xdf, 0xcf, - 0xc0, 0x72, 0x78, 0x95, 0xdf, 0x1e, 0xd8, 0xae, 0xca, 0xc8, 0x0e, 0x5f, 0xd9, 0xed, 0x3b, 0xf6, - 0x38, 0x7c, 0xb5, 0x72, 0x0d, 0xaa, 0x96, 0x6f, 0x0e, 0x9a, 0xae, 0xb5, 0xe5, 0x7b, 0x63, 0xd5, - 0x6c, 0x75, 0x60, 0xa9, 0x32, 0xc1, 0x9f, 0x8b, 0x63, 0x44, 0x1f, 0x0b, 0x9f, 0xe5, 0x29, 0xf5, - 0x71, 0x68, 0xfa, 0xb6, 0x3b, 0x68, 0x9f, 0x4b, 0xe1, 0x06, 0x2a, 0x23, 0xbc, 0x0a, 0xa5, 0x49, - 0x20, 0xfa, 0x66, 0x20, 0x58, 0x11, 0x0b, 0xc7, 0x13, 0xdb, 0x91, 0xb6, 0xab, 0x1e, 0x8b, 0x8c, - 0x52, 0xbe, 0xcb, 0xd8, 0x33, 0x73, 0x6c, 0xb3, 0xca, 0xfd, 0xdf, 0xcf, 0x40, 0x95, 0xc4, 0x22, - 0x8e, 0x89, 0xc7, 0x36, 0x5a, 0x15, 0x4a, 0xbb, 0xd1, 0xab, 0x81, 0x45, 0xc8, 0x1e, 0x9c, 0xaa, - 0x98, 0xb8, 0x16, 0x0b, 0x75, 0x23, 0x57, 0x3d, 0x20, 0x98, 0xe7, 0x9f, 0x83, 0x1b, 0x86, 0x18, - 0x79, 0x52, 0x3c, 0x33, 0x6d, 0x99, 0xbc, 0x7d, 0x55, 0x40, 0x77, 0x4e, 0x7d, 0x0a, 0xaf, 0x5b, - 0x15, 0xc9, 0x9d, 0xc3, 0x6a, 0x43, 0x48, 0x09, 0x7b, 0x4f, 0x10, 0xed, 0xdf, 0x95, 0x23, 0x94, - 0x8f, 0x3c, 0xdb, 0xc5, 0xda, 0xe8, 0x1e, 0x38, 0x41, 0xe8, 0x6c, 0x07, 0x41, 0x70, 0x7f, 0x1f, - 0x6e, 0xce, 0x3f, 0x91, 0x50, 0x37, 0xc4, 0xe9, 0xa9, 0x6a, 0xba, 0x8f, 0xf3, 0xcc, 0xb7, 0xd5, - 0x45, 0xdf, 0x0a, 0x14, 0x0e, 0x9e, 0xbb, 0x24, 0x16, 0xeb, 0xb0, 0xb2, 0xef, 0x25, 0x68, 0x58, - 0xee, 0x7e, 0x3f, 0x75, 0x88, 0x14, 0x0f, 0x4a, 0xd8, 0x88, 0xa5, 0xc4, 0x5d, 0xb3, 0x8c, 0x3a, - 0x1f, 0xa0, 0xff, 0x36, 0xa2, 0x5e, 0xcf, 0xd0, 0x87, 0x37, 0x96, 0x7a, 0x3d, 0x23, 0x6a, 0x66, - 0x5e, 0x3d, 0x23, 0xe6, 0xf6, 0x85, 0x23, 0x2c, 0x56, 0xb8, 0xff, 0x1e, 0xac, 0xe9, 0xae, 0xf6, - 0x45, 0x10, 0x84, 0x77, 0xb5, 0x0e, 0x7d, 0xfb, 0x4c, 0xbd, 0xd0, 0xb1, 0x0c, 0xe5, 0x43, 0xe1, - 0x07, 0x9e, 0x4b, 0xaf, 0x93, 0x00, 0x14, 0xbb, 0x43, 0xd3, 0xc7, 0x3a, 0xee, 0x7f, 0x55, 0x0f, - 0xd2, 0x93, 0xf3, 0x70, 0x6b, 0xc0, 0xf5, 0xa3, 0x1f, 0xe7, 0x31, 0xa5, 0xa9, 0xd1, 0xa5, 0x2f, - 0xcc, 0x11, 0xcb, 0xde, 0x6f, 0x41, 0x85, 0xae, 0x7a, 0x3d, 0xb6, 0x5d, 0x0b, 0x3b, 0xbe, 0xa9, - 0xaf, 0x1d, 0xd0, 0xab, 0x51, 0x67, 0x34, 0x1c, 0x65, 0xf5, 0xbe, 0x2e, 0xcb, 0xf2, 0x9b, 0xc0, - 0x9b, 0x13, 0xe9, 0x8d, 0x4c, 0xba, 0xa2, 0xec, 0x5c, 0xa8, 0xb7, 0x98, 0x73, 0xf7, 0xbf, 0x05, - 0x5c, 0xc5, 0xd8, 0x2c, 0x71, 0x6e, 0xbb, 0x83, 0xe8, 0xf5, 0x03, 0xa0, 0xa7, 0x4c, 0x2c, 0x71, - 0x1e, 0xde, 0xd3, 0x0b, 0x0b, 0xe1, 0x83, 0x2a, 0xdb, 0xde, 0xc4, 0xc5, 0x46, 0x3f, 0x85, 0xeb, - 0x4a, 0xc4, 0xb0, 0x17, 0x74, 0xff, 0xf5, 0x52, 0xc7, 0x5f, 0xdd, 0xd3, 0x93, 0x93, 0x20, 0xc2, - 0x65, 0x19, 0x6c, 0x58, 0xe4, 0x34, 0xc7, 0xf0, 0xec, 0xfd, 0x06, 0x5c, 0x9b, 0x13, 0xb9, 0x20, - 0xa5, 0xae, 0xfc, 0x37, 0xb6, 0x74, 0xff, 0x43, 0x58, 0x57, 0x6a, 0x68, 0x5f, 0xdd, 0x50, 0x0c, - 0x87, 0xed, 0x59, 0x67, 0xbb, 0xa3, 0x46, 0xba, 0xd5, 0xde, 0xdd, 0x7d, 0xb2, 0xdb, 0x34, 0x58, - 0x86, 0xe4, 0xe1, 0xa0, 0x77, 0xd4, 0x3a, 0xd8, 0xdf, 0x6f, 0xb7, 0x7a, 0xed, 0x2d, 0x96, 0xdd, - 0xbc, 0xff, 0x6f, 0x3f, 0xbd, 0x93, 0xf9, 0xd9, 0xa7, 0x77, 0x32, 0xff, 0xe5, 0xd3, 0x3b, 0x99, - 0x1f, 0xfd, 0xfc, 0xce, 0xd2, 0xcf, 0x7e, 0x7e, 0x67, 0xe9, 0x3f, 0xfe, 0xfc, 0xce, 0xd2, 0x27, - 0x6c, 0xfa, 0x1f, 0x06, 0x1d, 0x17, 0xc9, 0x65, 0x78, 0xeb, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, - 0x90, 0x26, 0xce, 0x54, 0x4b, 0x68, 0x00, 0x00, + 0x91, 0x58, 0xf3, 0x4d, 0x06, 0x9b, 0xdd, 0xd9, 0x39, 0x2f, 0x8a, 0x1a, 0x8d, 0x47, 0xd4, 0x6a, + 0x77, 0x34, 0x5a, 0xf5, 0xec, 0xce, 0xee, 0x6a, 0x57, 0x2b, 0xed, 0x4a, 0xec, 0x6e, 0xf6, 0x34, + 0x77, 0xfa, 0xa5, 0x22, 0x67, 0x46, 0xbb, 0xb8, 0x73, 0xbb, 0x9a, 0x95, 0x4d, 0x96, 0xba, 0x58, + 0x45, 0x55, 0x25, 0x7b, 0xba, 0x05, 0xdb, 0x90, 0x5f, 0x77, 0xbe, 0x3f, 0xd9, 0xf0, 0xd9, 0x3e, + 0x18, 0xc6, 0x49, 0x1f, 0x06, 0x0c, 0xdf, 0x19, 0xfe, 0x12, 0xec, 0xf3, 0x03, 0xf0, 0xf9, 0xcb, + 0x80, 0x7f, 0x64, 0x7f, 0x19, 0xf0, 0x01, 0x36, 0xb4, 0x80, 0x7f, 0x0c, 0xfb, 0x70, 0x06, 0x0c, + 0x08, 0x86, 0x3f, 0x8c, 0x88, 0xcc, 0x7a, 0x91, 0xec, 0x1e, 0xce, 0xde, 0x9d, 0xe1, 0xaf, 0x66, + 0x44, 0x45, 0x44, 0xe5, 0x23, 0x32, 0x32, 0x22, 0x32, 0xb2, 0x1a, 0x5e, 0x19, 0x9f, 0x0e, 0x1e, + 0x38, 0xf6, 0xf1, 0x83, 0xf1, 0xf1, 0x83, 0x91, 0x67, 0x09, 0xe7, 0xc1, 0xd8, 0xf7, 0xa4, 0x17, + 0x28, 0x20, 0x58, 0x27, 0x88, 0xd7, 0x4c, 0xf7, 0x42, 0x5e, 0x8c, 0xc5, 0x3a, 0x61, 0x1b, 0xb7, + 0x07, 0x9e, 0x37, 0x70, 0x84, 0x22, 0x3d, 0x9e, 0x9c, 0x3c, 0x08, 0xa4, 0x3f, 0xe9, 0x4b, 0x45, + 0xdc, 0xfc, 0x79, 0x1e, 0x6e, 0x76, 0x47, 0xa6, 0x2f, 0x37, 0x1c, 0xaf, 0x7f, 0xda, 0x75, 0xcd, + 0x71, 0x30, 0xf4, 0xe4, 0x86, 0x19, 0x08, 0xfe, 0x3a, 0x14, 0x8f, 0x11, 0x19, 0xd4, 0x33, 0x77, + 0x73, 0xf7, 0xaa, 0x0f, 0xaf, 0xaf, 0xa7, 0x04, 0xaf, 0x13, 0x87, 0xa1, 0x69, 0xf8, 0x9b, 0x50, + 0xb2, 0x84, 0x34, 0x6d, 0x27, 0xa8, 0x67, 0xef, 0x66, 0xee, 0x55, 0x1f, 0xde, 0x5a, 0x57, 0x2f, + 0x5e, 0x0f, 0x5f, 0xbc, 0xde, 0xa5, 0x17, 0x1b, 0x21, 0x1d, 0x7f, 0x17, 0xca, 0x27, 0xb6, 0x23, + 0x1e, 0x8b, 0x8b, 0xa0, 0x9e, 0xbb, 0x92, 0x67, 0x23, 0x5b, 0xcf, 0x18, 0x11, 0x31, 0xdf, 0x84, + 0x15, 0x71, 0x2e, 0x7d, 0xd3, 0x10, 0x8e, 0x29, 0x6d, 0xcf, 0x0d, 0xea, 0x79, 0x6a, 0xe1, 0xad, + 0xa9, 0x16, 0x86, 0xcf, 0x89, 0x7d, 0x8a, 0x85, 0xdf, 0x85, 0xaa, 0x77, 0xfc, 0x7d, 0xd1, 0x97, + 0xbd, 0x8b, 0xb1, 0x08, 0xea, 0x85, 0xbb, 0xb9, 0x7b, 0x15, 0x23, 0x89, 0xe2, 0xdf, 0x80, 0x6a, + 0xdf, 0x73, 0x1c, 0xd1, 0x57, 0xef, 0x28, 0x5e, 0xdd, 0xad, 0x24, 0x2d, 0x7f, 0x1b, 0x6e, 0xf8, + 0x62, 0xe4, 0x9d, 0x09, 0x6b, 0x33, 0xc2, 0x52, 0x3f, 0xcb, 0xf4, 0x9a, 0xf9, 0x0f, 0x79, 0x0b, + 0x6a, 0xbe, 0x6e, 0xdf, 0xae, 0xed, 0x9e, 0x06, 0xf5, 0x12, 0x75, 0xeb, 0xf3, 0x97, 0x74, 0x0b, + 0x69, 0x8c, 0x34, 0x07, 0x67, 0x90, 0x3b, 0x15, 0x17, 0xf5, 0xca, 0xdd, 0xcc, 0xbd, 0x8a, 0x81, + 0x3f, 0xf9, 0xfb, 0x50, 0xf7, 0x7c, 0x7b, 0x60, 0xbb, 0xa6, 0xb3, 0xe9, 0x0b, 0x53, 0x0a, 0xab, + 0x67, 0x8f, 0x44, 0x20, 0xcd, 0xd1, 0xb8, 0x0e, 0x77, 0x33, 0xf7, 0x72, 0xc6, 0xa5, 0xcf, 0xf9, + 0x5b, 0x6a, 0x86, 0x3a, 0xee, 0x89, 0x57, 0xaf, 0xea, 0xee, 0xa7, 0xdb, 0xb2, 0xad, 0x1f, 0x1b, + 0x11, 0x61, 0xf3, 0x97, 0x59, 0x28, 0x76, 0x85, 0xe9, 0xf7, 0x87, 0x8d, 0x5f, 0xcf, 0x40, 0xd1, + 0x10, 0xc1, 0xc4, 0x91, 0xbc, 0x01, 0x65, 0x35, 0xb6, 0x1d, 0xab, 0x9e, 0xa1, 0xd6, 0x45, 0xf0, + 0x67, 0xd1, 0x9d, 0x75, 0xc8, 0x8f, 0x84, 0x34, 0xeb, 0x39, 0x1a, 0xa1, 0xc6, 0x54, 0xab, 0xd4, + 0xeb, 0xd7, 0xf7, 0x84, 0x34, 0x0d, 0xa2, 0x6b, 0x7c, 0x9a, 0x81, 0x3c, 0x82, 0xfc, 0x36, 0x54, + 0x86, 0xf6, 0x60, 0xe8, 0xd8, 0x83, 0xa1, 0xd4, 0x0d, 0x89, 0x11, 0xfc, 0x43, 0x58, 0x8d, 0x00, + 0xc3, 0x74, 0x07, 0x02, 0x5b, 0x34, 0x4f, 0xf9, 0xe9, 0xa1, 0x31, 0x4d, 0xcc, 0xeb, 0x50, 0xa2, + 0xf5, 0xd0, 0xb1, 0x48, 0xa3, 0x2b, 0x46, 0x08, 0xa2, 0xba, 0x85, 0x33, 0xf5, 0x58, 0x5c, 0xd4, + 0xf3, 0xf4, 0x34, 0x89, 0xe2, 0x2d, 0x58, 0x0d, 0xc1, 0x2d, 0x3d, 0x1a, 0x85, 0xab, 0x47, 0x63, + 0x9a, 0xbe, 0xf9, 0xa3, 0x3d, 0x28, 0xd0, 0xb2, 0xe4, 0x2b, 0x90, 0xb5, 0xc3, 0x81, 0xce, 0xda, + 0x16, 0x7f, 0x00, 0xc5, 0x13, 0x5b, 0x38, 0xd6, 0x0b, 0x47, 0x58, 0x93, 0xf1, 0x36, 0x2c, 0xfb, + 0x22, 0x90, 0xbe, 0xad, 0xb5, 0x5f, 0x2d, 0xd0, 0x2f, 0xce, 0xb3, 0x01, 0xeb, 0x46, 0x82, 0xd0, + 0x48, 0xb1, 0x61, 0xb7, 0xfb, 0x43, 0xdb, 0xb1, 0x7c, 0xe1, 0x76, 0x2c, 0xb5, 0x4e, 0x2b, 0x46, + 0x12, 0xc5, 0xef, 0xc1, 0xea, 0xb1, 0xd9, 0x3f, 0x1d, 0xf8, 0xde, 0xc4, 0xc5, 0x05, 0xe1, 0xf9, + 0xd4, 0xed, 0x8a, 0x31, 0x8d, 0xe6, 0x6f, 0x40, 0xc1, 0x74, 0xec, 0x81, 0x4b, 0x2b, 0x71, 0x65, + 0x66, 0xd2, 0x55, 0x5b, 0x5a, 0x48, 0x61, 0x28, 0x42, 0xbe, 0x03, 0xb5, 0x33, 0xe1, 0x4b, 0xbb, + 0x6f, 0x3a, 0x84, 0xaf, 0x97, 0x88, 0xb3, 0x39, 0x97, 0xf3, 0x69, 0x92, 0xd2, 0x48, 0x33, 0xf2, + 0x0e, 0x40, 0x80, 0x66, 0x92, 0xa6, 0x53, 0xaf, 0x85, 0xd7, 0xe6, 0x8a, 0xd9, 0xf4, 0x5c, 0x29, + 0x5c, 0xb9, 0xde, 0x8d, 0xc8, 0x77, 0x96, 0x8c, 0x04, 0x33, 0x7f, 0x17, 0xf2, 0x52, 0x9c, 0xcb, + 0xfa, 0xca, 0x15, 0x23, 0x1a, 0x0a, 0xe9, 0x89, 0x73, 0xb9, 0xb3, 0x64, 0x10, 0x03, 0x32, 0xe2, + 0x22, 0xab, 0xaf, 0x2e, 0xc0, 0x88, 0xeb, 0x12, 0x19, 0x91, 0x81, 0x7f, 0x00, 0x45, 0xc7, 0xbc, + 0xf0, 0x26, 0xb2, 0xce, 0x88, 0xf5, 0x4b, 0x57, 0xb2, 0xee, 0x12, 0xe9, 0xce, 0x92, 0xa1, 0x99, + 0xf8, 0xdb, 0x90, 0xb3, 0xec, 0xb3, 0xfa, 0x1a, 0xf1, 0xde, 0xbd, 0x92, 0x77, 0xcb, 0x3e, 0xdb, + 0x59, 0x32, 0x90, 0x9c, 0x6f, 0x42, 0xf9, 0xd8, 0xf3, 0x4e, 0x47, 0xa6, 0x7f, 0x5a, 0xe7, 0xc4, + 0xfa, 0xe5, 0x2b, 0x59, 0x37, 0x34, 0xf1, 0xce, 0x92, 0x11, 0x31, 0x62, 0x97, 0xed, 0xbe, 0xe7, + 0xd6, 0xaf, 0x2d, 0xd0, 0xe5, 0x4e, 0xdf, 0x73, 0xb1, 0xcb, 0xc8, 0x80, 0x8c, 0x8e, 0xed, 0x9e, + 0xd6, 0xaf, 0x2f, 0xc0, 0x88, 0x96, 0x13, 0x19, 0x91, 0x01, 0x9b, 0x6d, 0x99, 0xd2, 0x3c, 0xb3, + 0xc5, 0xf3, 0xfa, 0x8d, 0x05, 0x9a, 0xbd, 0xa5, 0x89, 0xb1, 0xd9, 0x21, 0x23, 0x0a, 0x09, 0x97, + 0x66, 0xfd, 0xe6, 0x02, 0x42, 0x42, 0x8b, 0x8e, 0x42, 0x42, 0x46, 0xfe, 0x67, 0x61, 0xed, 0x44, + 0x98, 0x72, 0xe2, 0x0b, 0x2b, 0xde, 0xe8, 0x6e, 0x91, 0xb4, 0xf5, 0xab, 0xe7, 0x7e, 0x9a, 0x6b, + 0x67, 0xc9, 0x98, 0x15, 0xc5, 0xdf, 0x87, 0x82, 0x63, 0x4a, 0x71, 0x5e, 0xaf, 0x93, 0xcc, 0xe6, + 0x0b, 0x94, 0x42, 0x8a, 0xf3, 0x9d, 0x25, 0x43, 0xb1, 0xf0, 0xef, 0xc1, 0xaa, 0x34, 0x8f, 0x1d, + 0x71, 0x70, 0xa2, 0x09, 0x82, 0xfa, 0xe7, 0x48, 0xca, 0xeb, 0x57, 0xab, 0x73, 0x9a, 0x67, 0x67, + 0xc9, 0x98, 0x16, 0x83, 0xad, 0x22, 0x54, 0xbd, 0xb1, 0x40, 0xab, 0x48, 0x1e, 0xb6, 0x8a, 0x58, + 0xf8, 0x2e, 0x54, 0xe9, 0xc7, 0xa6, 0xe7, 0x4c, 0x46, 0x6e, 0xfd, 0xf3, 0x24, 0xe1, 0xde, 0x8b, + 0x25, 0x28, 0xfa, 0x9d, 0x25, 0x23, 0xc9, 0x8e, 0x93, 0x48, 0xa0, 0xe1, 0x3d, 0xaf, 0xdf, 0x5e, + 0x60, 0x12, 0x7b, 0x9a, 0x18, 0x27, 0x31, 0x64, 0xc4, 0xa5, 0xf7, 0xdc, 0xb6, 0x06, 0x42, 0xd6, + 0xbf, 0xb0, 0xc0, 0xd2, 0x7b, 0x46, 0xa4, 0xb8, 0xf4, 0x14, 0x13, 0xaa, 0x71, 0x7f, 0x68, 0xca, + 0xfa, 0x9d, 0x05, 0xd4, 0x78, 0x73, 0x68, 0x92, 0xad, 0x40, 0x86, 0xc6, 0x0f, 0x61, 0x39, 0x69, + 0x95, 0x39, 0x87, 0xbc, 0x2f, 0x4c, 0xb5, 0x23, 0x94, 0x0d, 0xfa, 0x8d, 0x38, 0x61, 0xd9, 0x92, + 0x76, 0x84, 0xb2, 0x41, 0xbf, 0xf9, 0x4d, 0x28, 0x2a, 0xdf, 0x84, 0x0c, 0x7e, 0xd9, 0xd0, 0x10, + 0xd2, 0x5a, 0xbe, 0x39, 0xa0, 0x7d, 0xab, 0x6c, 0xd0, 0x6f, 0xa4, 0xb5, 0x7c, 0x6f, 0x7c, 0xe0, + 0x92, 0xc1, 0x2e, 0x1b, 0x1a, 0x6a, 0x7c, 0xfa, 0x01, 0x94, 0x74, 0xa3, 0x1a, 0x7f, 0x3f, 0x03, + 0x45, 0x65, 0x50, 0xf8, 0xb7, 0xa1, 0x10, 0xc8, 0x0b, 0x47, 0x50, 0x1b, 0x56, 0x1e, 0x7e, 0x65, + 0x01, 0x23, 0xb4, 0xde, 0x45, 0x06, 0x43, 0xf1, 0x35, 0x0d, 0x28, 0x10, 0xcc, 0x4b, 0x90, 0x33, + 0xbc, 0xe7, 0x6c, 0x89, 0x03, 0x14, 0xd5, 0x64, 0xb1, 0x0c, 0x22, 0xb7, 0xec, 0x33, 0x96, 0x45, + 0xe4, 0x8e, 0x30, 0x2d, 0xe1, 0xb3, 0x1c, 0xaf, 0x41, 0x25, 0x9c, 0x96, 0x80, 0xe5, 0x39, 0x83, + 0xe5, 0xc4, 0x84, 0x07, 0xac, 0xd0, 0xf8, 0x9f, 0x79, 0xc8, 0xe3, 0xfa, 0xe7, 0xaf, 0x40, 0x4d, + 0x9a, 0xfe, 0x40, 0x28, 0x47, 0x38, 0x72, 0x52, 0xd2, 0x48, 0xfe, 0x41, 0xd8, 0x87, 0x2c, 0xf5, + 0xe1, 0xb5, 0x17, 0xda, 0x95, 0x54, 0x0f, 0x12, 0xbb, 0x70, 0x6e, 0xb1, 0x5d, 0x78, 0x1b, 0xca, + 0x68, 0xce, 0xba, 0xf6, 0x0f, 0x05, 0x0d, 0xfd, 0xca, 0xc3, 0xfb, 0x2f, 0x7e, 0x65, 0x47, 0x73, + 0x18, 0x11, 0x2f, 0xef, 0x40, 0xa5, 0x6f, 0xfa, 0x16, 0x35, 0x86, 0x66, 0x6b, 0xe5, 0xe1, 0x57, + 0x5f, 0x2c, 0x68, 0x33, 0x64, 0x31, 0x62, 0x6e, 0x7e, 0x00, 0x55, 0x4b, 0x04, 0x7d, 0xdf, 0x1e, + 0x93, 0x79, 0x53, 0x7b, 0xf1, 0xd7, 0x5e, 0x2c, 0x6c, 0x2b, 0x66, 0x32, 0x92, 0x12, 0xd0, 0x23, + 0xf3, 0x23, 0xfb, 0x56, 0x22, 0x07, 0x21, 0x46, 0x34, 0xdf, 0x85, 0x72, 0xd8, 0x1f, 0xbe, 0x0c, + 0x65, 0xfc, 0xbb, 0xef, 0xb9, 0x82, 0x2d, 0xe1, 0xdc, 0x22, 0xd4, 0x1d, 0x99, 0x8e, 0xc3, 0x32, + 0x7c, 0x05, 0x00, 0xc1, 0x3d, 0x61, 0xd9, 0x93, 0x11, 0xcb, 0x36, 0xbf, 0x19, 0x6a, 0x4b, 0x19, + 0xf2, 0x87, 0xe6, 0x00, 0x39, 0x96, 0xa1, 0x1c, 0x9a, 0x6b, 0x96, 0x41, 0xfe, 0x2d, 0x33, 0x18, + 0x1e, 0x7b, 0xa6, 0x6f, 0xb1, 0x2c, 0xaf, 0x42, 0xa9, 0xe5, 0xf7, 0x87, 0xf6, 0x99, 0x60, 0xb9, + 0xe6, 0x03, 0xa8, 0x26, 0xda, 0x8b, 0x22, 0xf4, 0x4b, 0x2b, 0x50, 0x68, 0x59, 0x96, 0xb0, 0x58, + 0x06, 0x19, 0x74, 0x07, 0x59, 0xb6, 0xf9, 0x55, 0xa8, 0x44, 0xa3, 0x85, 0xe4, 0xb8, 0x71, 0xb3, + 0x25, 0xfc, 0x85, 0x68, 0x96, 0x41, 0xad, 0xec, 0xb8, 0x8e, 0xed, 0x0a, 0x96, 0x6d, 0xfc, 0x39, + 0x52, 0x55, 0xfe, 0xad, 0xf4, 0x82, 0x78, 0xf5, 0x45, 0x3b, 0x6b, 0x7a, 0x35, 0x7c, 0x3e, 0xd1, + 0xbf, 0x5d, 0x9b, 0x1a, 0x57, 0x86, 0xfc, 0x96, 0x27, 0x03, 0x96, 0x69, 0xfc, 0xb7, 0x2c, 0x94, + 0xc3, 0x0d, 0x15, 0x63, 0x82, 0x89, 0xef, 0x68, 0x85, 0xc6, 0x9f, 0xfc, 0x3a, 0x14, 0xa4, 0x2d, + 0xb5, 0x1a, 0x57, 0x0c, 0x05, 0xa0, 0xaf, 0x96, 0x9c, 0x59, 0xe5, 0xc0, 0x4e, 0x4f, 0x95, 0x3d, + 0x32, 0x07, 0x62, 0xc7, 0x0c, 0x86, 0xda, 0x85, 0x8d, 0x11, 0xc8, 0x7f, 0x62, 0x9e, 0xa1, 0xce, + 0xd1, 0x73, 0xe5, 0xc5, 0x25, 0x51, 0xfc, 0x2d, 0xc8, 0x63, 0x07, 0xb5, 0xd2, 0xfc, 0x99, 0xa9, + 0x0e, 0xa3, 0x9a, 0x1c, 0xfa, 0x02, 0xa7, 0x67, 0x1d, 0x23, 0x30, 0x83, 0x88, 0xf9, 0xab, 0xb0, + 0xa2, 0x16, 0xe1, 0x41, 0x18, 0x3f, 0x94, 0x48, 0xf2, 0x14, 0x96, 0xb7, 0x70, 0x38, 0x4d, 0x29, + 0xea, 0xe5, 0x05, 0xf4, 0x3b, 0x1c, 0x9c, 0xf5, 0x2e, 0xb2, 0x18, 0x8a, 0xb3, 0xf9, 0x0e, 0x8e, + 0xa9, 0x29, 0x05, 0x4e, 0x73, 0x7b, 0x34, 0x96, 0x17, 0x4a, 0x69, 0xb6, 0x85, 0xec, 0x0f, 0x6d, + 0x77, 0xc0, 0x32, 0x6a, 0x88, 0x71, 0x12, 0x89, 0xc4, 0xf7, 0x3d, 0x9f, 0xe5, 0x1a, 0x0d, 0xc8, + 0xa3, 0x8e, 0xa2, 0x91, 0x74, 0xcd, 0x91, 0xd0, 0x23, 0x4d, 0xbf, 0x1b, 0xd7, 0x60, 0x6d, 0x66, + 0x3f, 0x6e, 0xfc, 0x5e, 0x51, 0x69, 0x08, 0x72, 0x90, 0x2f, 0xa8, 0x39, 0xc8, 0xcd, 0x7b, 0x29, + 0x1b, 0x83, 0x52, 0xd2, 0x36, 0xe6, 0x03, 0x28, 0x60, 0xc7, 0x42, 0x13, 0xb3, 0x00, 0xfb, 0x1e, + 0x92, 0x1b, 0x8a, 0x0b, 0x23, 0x98, 0xfe, 0x50, 0xf4, 0x4f, 0x85, 0xa5, 0x6d, 0x7d, 0x08, 0xa2, + 0xd2, 0xf4, 0x13, 0xee, 0xb9, 0x02, 0x48, 0x25, 0xfa, 0x9e, 0xdb, 0x1e, 0x79, 0xdf, 0xb7, 0x69, + 0x5e, 0x51, 0x25, 0x42, 0x44, 0xf8, 0xb4, 0x83, 0x3a, 0xa2, 0xa7, 0x2d, 0x46, 0x34, 0xda, 0x50, + 0xa0, 0x77, 0xe3, 0x4a, 0x50, 0x6d, 0x56, 0x99, 0x86, 0x57, 0x17, 0x6b, 0xb3, 0x6e, 0x72, 0xe3, + 0x77, 0xb3, 0x90, 0x47, 0x98, 0xdf, 0x87, 0x82, 0x8f, 0x71, 0x18, 0x0d, 0xe7, 0x65, 0x31, 0x9b, + 0x22, 0xe1, 0xdf, 0xd6, 0xaa, 0x98, 0x5d, 0x40, 0x59, 0xa2, 0x37, 0x26, 0xd5, 0xf2, 0x3a, 0x14, + 0xc6, 0xa6, 0x6f, 0x8e, 0xf4, 0x3a, 0x51, 0x40, 0xf3, 0x27, 0x19, 0xc8, 0x23, 0x11, 0x5f, 0x83, + 0x5a, 0x57, 0xfa, 0xf6, 0xa9, 0x90, 0x43, 0xdf, 0x9b, 0x0c, 0x86, 0x4a, 0x93, 0x1e, 0x8b, 0x0b, + 0x65, 0x6f, 0x94, 0x41, 0x90, 0xa6, 0x63, 0xf7, 0x59, 0x16, 0xb5, 0x6a, 0xc3, 0x73, 0x2c, 0x96, + 0xe3, 0xab, 0x50, 0x7d, 0xe2, 0x5a, 0xc2, 0x0f, 0xfa, 0x9e, 0x2f, 0x2c, 0x96, 0xd7, 0xab, 0xfb, + 0x94, 0x15, 0x68, 0x2f, 0x13, 0xe7, 0x92, 0x62, 0x21, 0x56, 0xe4, 0xd7, 0x60, 0x75, 0x23, 0x1d, + 0x20, 0xb1, 0x12, 0xda, 0xa4, 0x3d, 0xe1, 0xa2, 0x92, 0xb1, 0xb2, 0x52, 0x62, 0xef, 0xfb, 0x36, + 0xab, 0xe0, 0xcb, 0xd4, 0x3a, 0x61, 0xd0, 0xfc, 0x97, 0x99, 0xd0, 0x72, 0xd4, 0xa0, 0x72, 0x68, + 0xfa, 0xe6, 0xc0, 0x37, 0xc7, 0xd8, 0xbe, 0x2a, 0x94, 0xd4, 0xc6, 0xf9, 0xa6, 0xb2, 0x6e, 0x0a, + 0x78, 0xa8, 0x6c, 0xa3, 0x02, 0xde, 0x62, 0xb9, 0x18, 0x78, 0x9b, 0xe5, 0xf1, 0x1d, 0xdf, 0x9d, + 0x78, 0x52, 0xb0, 0x02, 0xd9, 0x3a, 0xcf, 0x12, 0xac, 0x88, 0xc8, 0x1e, 0x5a, 0x14, 0x56, 0xc2, + 0x3e, 0x6f, 0xa2, 0xfe, 0x1c, 0x7b, 0xe7, 0xac, 0x8c, 0xcd, 0xc0, 0x61, 0x14, 0x16, 0xab, 0xe0, + 0x93, 0xfd, 0xc9, 0xe8, 0x58, 0x60, 0x37, 0x01, 0x9f, 0xf4, 0xbc, 0xc1, 0xc0, 0x11, 0xac, 0x8a, + 0x63, 0x90, 0x30, 0xbe, 0x6c, 0x99, 0x2c, 0xad, 0xe9, 0x38, 0xde, 0x44, 0xb2, 0x5a, 0xe3, 0x97, + 0x39, 0xc8, 0x63, 0x74, 0x83, 0x6b, 0x67, 0x88, 0x76, 0x46, 0xaf, 0x1d, 0xfc, 0x1d, 0xad, 0xc0, + 0x6c, 0xbc, 0x02, 0xf9, 0xfb, 0x7a, 0xa6, 0x73, 0x0b, 0x58, 0x59, 0x14, 0x9c, 0x9c, 0x64, 0x0e, + 0xf9, 0x91, 0x3d, 0x12, 0xda, 0xd6, 0xd1, 0x6f, 0xc4, 0x05, 0xb8, 0x1f, 0x17, 0x28, 0x79, 0x42, + 0xbf, 0x71, 0xd5, 0x98, 0xb8, 0x2d, 0xb4, 0x24, 0xad, 0x81, 0x9c, 0x11, 0x82, 0x73, 0xac, 0x57, + 0x65, 0xae, 0xf5, 0xfa, 0x20, 0xb4, 0x5e, 0xa5, 0x05, 0x56, 0x3d, 0x35, 0x33, 0x69, 0xb9, 0x62, + 0xa3, 0x51, 0x5e, 0x9c, 0x3d, 0xb1, 0x99, 0x6c, 0x69, 0xad, 0x8d, 0x37, 0xba, 0xb2, 0x1a, 0x65, + 0x96, 0xc1, 0xd9, 0xa4, 0xe5, 0xaa, 0x6c, 0xde, 0x53, 0xdb, 0x12, 0x1e, 0xcb, 0xd1, 0x46, 0x38, + 0xb1, 0x6c, 0x8f, 0xe5, 0xd1, 0xf3, 0x3a, 0xdc, 0xda, 0x66, 0x85, 0xe6, 0xab, 0x89, 0x2d, 0xa9, + 0x35, 0x91, 0x9e, 0x12, 0x43, 0xea, 0x9b, 0x51, 0xda, 0x78, 0x2c, 0x2c, 0x96, 0x6d, 0x7e, 0x7d, + 0x8e, 0x99, 0xad, 0x41, 0xe5, 0xc9, 0xd8, 0xf1, 0x4c, 0xeb, 0x0a, 0x3b, 0xbb, 0x0c, 0x10, 0x47, + 0xd5, 0x8d, 0x5f, 0x36, 0xe3, 0xed, 0x1c, 0x7d, 0xd1, 0xc0, 0x9b, 0xf8, 0x7d, 0x41, 0x26, 0xa4, + 0x62, 0x68, 0x88, 0x7f, 0x07, 0x0a, 0xf8, 0x3c, 0x4c, 0xe3, 0xdc, 0x5f, 0x28, 0x96, 0x5b, 0x7f, + 0x6a, 0x8b, 0xe7, 0x86, 0x62, 0xe4, 0x77, 0x00, 0xcc, 0xbe, 0xb4, 0xcf, 0x04, 0x22, 0xf5, 0x62, + 0x4f, 0x60, 0xf8, 0x3b, 0x49, 0xf7, 0xe5, 0xea, 0x3c, 0x64, 0xc2, 0xaf, 0xe1, 0x06, 0x54, 0x71, + 0xe9, 0x8e, 0x0f, 0x7c, 0x5c, 0xed, 0xf5, 0x65, 0x62, 0x7c, 0x63, 0xb1, 0xe6, 0x3d, 0x8a, 0x18, + 0x8d, 0xa4, 0x10, 0xfe, 0x04, 0x96, 0x55, 0x4e, 0x4d, 0x0b, 0xad, 0x91, 0xd0, 0x37, 0x17, 0x13, + 0x7a, 0x10, 0x73, 0x1a, 0x29, 0x31, 0xb3, 0x69, 0xc9, 0xc2, 0x4b, 0xa7, 0x25, 0x5f, 0x85, 0x95, + 0x5e, 0x7a, 0x15, 0xa8, 0xad, 0x62, 0x0a, 0xcb, 0x9b, 0xb0, 0x6c, 0x07, 0x71, 0x56, 0x94, 0x72, + 0x24, 0x65, 0x23, 0x85, 0x6b, 0xfc, 0xfb, 0x22, 0xe4, 0x69, 0xe4, 0xa7, 0x73, 0x5c, 0x9b, 0x29, + 0x93, 0xfe, 0x60, 0xf1, 0xa9, 0x9e, 0x5a, 0xf1, 0x64, 0x41, 0x72, 0x09, 0x0b, 0xf2, 0x1d, 0x28, + 0x04, 0x9e, 0x2f, 0xc3, 0xe9, 0x5d, 0x50, 0x89, 0xba, 0x9e, 0x2f, 0x0d, 0xc5, 0xc8, 0xb7, 0xa1, + 0x74, 0x62, 0x3b, 0x12, 0x27, 0x45, 0x0d, 0xde, 0xeb, 0x8b, 0xc9, 0xd8, 0x26, 0x26, 0x23, 0x64, + 0xe6, 0xbb, 0x49, 0x65, 0x2b, 0x92, 0xa4, 0xf5, 0xc5, 0x24, 0xcd, 0xd3, 0xc1, 0xfb, 0xc0, 0xfa, + 0xde, 0x99, 0xf0, 0x8d, 0x44, 0x62, 0x52, 0x6d, 0xd2, 0x33, 0x78, 0xde, 0x80, 0xf2, 0xd0, 0xb6, + 0x04, 0xfa, 0x39, 0x64, 0x63, 0xca, 0x46, 0x04, 0xf3, 0xc7, 0x50, 0xa6, 0xf8, 0x00, 0xad, 0x62, + 0xe5, 0xa5, 0x07, 0x5f, 0x85, 0x2a, 0xa1, 0x00, 0x7c, 0x11, 0xbd, 0x7c, 0xdb, 0x96, 0x94, 0x9f, + 0x2e, 0x1b, 0x11, 0x8c, 0x0d, 0x26, 0x7d, 0x4f, 0x36, 0xb8, 0xaa, 0x1a, 0x3c, 0x8d, 0xe7, 0x6f, + 0xc3, 0x0d, 0xc2, 0x4d, 0x6d, 0x92, 0xb8, 0xd4, 0x50, 0xe8, 0xfc, 0x87, 0xe8, 0xb0, 0x8c, 0xcd, + 0x81, 0xd8, 0xb5, 0x47, 0xb6, 0xac, 0xd7, 0xee, 0x66, 0xee, 0x15, 0x8c, 0x18, 0xc1, 0x5f, 0x87, + 0x35, 0x4b, 0x9c, 0x98, 0x13, 0x47, 0xf6, 0xc4, 0x68, 0xec, 0x98, 0x52, 0x74, 0x2c, 0xd2, 0xd1, + 0x8a, 0x31, 0xfb, 0x80, 0xbf, 0x01, 0xd7, 0x34, 0xf2, 0x20, 0x3a, 0x55, 0xe8, 0x58, 0x94, 0xbe, + 0xab, 0x18, 0xf3, 0x1e, 0x35, 0xf7, 0xb4, 0x19, 0xc6, 0x0d, 0x14, 0xe3, 0xd4, 0xd0, 0x80, 0x06, + 0x52, 0xed, 0xc8, 0x8f, 0x4c, 0xc7, 0x11, 0xfe, 0x85, 0x0a, 0x72, 0x1f, 0x9b, 0xee, 0xb1, 0xe9, + 0xb2, 0x1c, 0xed, 0xb1, 0xa6, 0x23, 0x5c, 0xcb, 0xf4, 0xd5, 0x8e, 0xfc, 0x88, 0x36, 0xf4, 0x42, + 0xf3, 0x1e, 0xe4, 0x69, 0x48, 0x2b, 0x50, 0x50, 0x51, 0x12, 0x45, 0xcc, 0x3a, 0x42, 0x22, 0x8b, + 0xbc, 0x8b, 0xcb, 0x8f, 0x65, 0x1b, 0xff, 0xa0, 0x08, 0xe5, 0x70, 0xf0, 0xc2, 0x33, 0x84, 0x4c, + 0x7c, 0x86, 0x80, 0x6e, 0x5c, 0xf0, 0xd4, 0x0e, 0xec, 0x63, 0xed, 0x96, 0x96, 0x8d, 0x18, 0x81, + 0x9e, 0xd0, 0x73, 0xdb, 0x92, 0x43, 0x5a, 0x33, 0x05, 0x43, 0x01, 0xfc, 0x1e, 0xac, 0x5a, 0x38, + 0x0e, 0x6e, 0xdf, 0x99, 0x58, 0xa2, 0x87, 0xbb, 0xa8, 0x4a, 0x13, 0x4c, 0xa3, 0xf9, 0xc7, 0x00, + 0xd2, 0x1e, 0x89, 0x6d, 0xcf, 0x1f, 0x99, 0x52, 0xc7, 0x06, 0xdf, 0x78, 0x39, 0xad, 0x5e, 0xef, + 0x45, 0x02, 0x8c, 0x84, 0x30, 0x14, 0x8d, 0x6f, 0xd3, 0xa2, 0x4b, 0x9f, 0x49, 0xf4, 0x56, 0x24, + 0xc0, 0x48, 0x08, 0xe3, 0x3d, 0x28, 0x9d, 0x78, 0xfe, 0x68, 0xe2, 0x98, 0x7a, 0xcf, 0x7d, 0xff, + 0x25, 0xe5, 0x6e, 0x2b, 0x6e, 0xb2, 0x3d, 0xa1, 0xa8, 0x38, 0xc7, 0x5d, 0x59, 0x30, 0xc7, 0xdd, + 0xfc, 0x15, 0x80, 0xb8, 0x85, 0xfc, 0x26, 0xf0, 0x3d, 0xcf, 0x95, 0xc3, 0xd6, 0xf1, 0xb1, 0xbf, + 0x21, 0x4e, 0x3c, 0x5f, 0x6c, 0x99, 0xb8, 0xbd, 0xde, 0x80, 0xb5, 0x08, 0xdf, 0x3a, 0x91, 0xc2, + 0x47, 0x34, 0xa9, 0x40, 0x77, 0xe8, 0xf9, 0x52, 0xf9, 0x78, 0xf4, 0xf3, 0x49, 0x97, 0xe5, 0x70, + 0x4b, 0xef, 0x74, 0x0f, 0x58, 0xbe, 0x79, 0x0f, 0x20, 0x1e, 0x5a, 0x8a, 0x85, 0xe8, 0xd7, 0x9b, + 0x0f, 0x75, 0x64, 0x44, 0xd0, 0xc3, 0xb7, 0x59, 0xa6, 0xf9, 0x8b, 0x0c, 0x54, 0x13, 0x5d, 0x4a, + 0xc7, 0xcc, 0x9b, 0xde, 0xc4, 0x95, 0x2a, 0x48, 0xa7, 0x9f, 0x4f, 0x4d, 0x67, 0x82, 0x9b, 0xfb, + 0x1a, 0xd4, 0x08, 0xde, 0xb2, 0x03, 0x69, 0xbb, 0x7d, 0xc9, 0x72, 0x11, 0x89, 0x72, 0x0c, 0xf2, + 0x11, 0xc9, 0xbe, 0xa7, 0x51, 0x05, 0xce, 0x60, 0xf9, 0x50, 0xf8, 0x7d, 0x11, 0x12, 0x91, 0x33, + 0xac, 0x31, 0x11, 0x99, 0x72, 0x86, 0x4d, 0x39, 0xec, 0x4e, 0x46, 0xac, 0x8c, 0x4e, 0x25, 0x02, + 0xad, 0x33, 0xe1, 0xa3, 0x2f, 0x53, 0xc1, 0xf7, 0x20, 0x02, 0x57, 0x83, 0xe9, 0x32, 0x08, 0xa9, + 0xf7, 0x6c, 0x97, 0x55, 0x23, 0xc0, 0x3c, 0x67, 0xcb, 0xd8, 0x7e, 0x0a, 0x1d, 0x58, 0xad, 0xf1, + 0x5f, 0x73, 0x90, 0x47, 0xbb, 0x8e, 0xb1, 0x6e, 0xd2, 0x08, 0xa9, 0xb5, 0x92, 0x44, 0x7d, 0xb6, + 0xdd, 0x08, 0x65, 0x27, 0x77, 0xa3, 0xf7, 0xa0, 0xda, 0x9f, 0x04, 0xd2, 0x1b, 0xd1, 0x56, 0xac, + 0x4f, 0xbb, 0x6e, 0xce, 0x64, 0x8d, 0x68, 0x38, 0x8d, 0x24, 0x29, 0x7f, 0x07, 0x8a, 0x27, 0x4a, + 0xeb, 0x55, 0xde, 0xe8, 0x0b, 0x97, 0xec, 0xd6, 0x5a, 0xb3, 0x35, 0x31, 0xf6, 0xcb, 0x9e, 0x59, + 0xb1, 0x49, 0x94, 0xde, 0x75, 0x8b, 0xd1, 0xae, 0xfb, 0x2b, 0xb0, 0x22, 0x70, 0xc0, 0x0f, 0x1d, + 0xb3, 0x2f, 0x46, 0xc2, 0x0d, 0x97, 0xd9, 0xdb, 0x2f, 0xd1, 0x63, 0x9a, 0x31, 0xea, 0xf6, 0x94, + 0x2c, 0xb4, 0x3c, 0xae, 0x87, 0x9b, 0x7f, 0x18, 0xd8, 0x97, 0x8d, 0x18, 0xd1, 0xfc, 0xb2, 0xb6, + 0x97, 0x25, 0xc8, 0xb5, 0x82, 0xbe, 0xce, 0x80, 0x88, 0xa0, 0xaf, 0xc2, 0xab, 0x4d, 0x1a, 0x0e, + 0x96, 0x6d, 0xbe, 0x09, 0x95, 0xe8, 0x0d, 0xa8, 0x3c, 0xfb, 0x9e, 0xec, 0x8e, 0x45, 0xdf, 0x3e, + 0xb1, 0x85, 0xa5, 0xf4, 0xb3, 0x2b, 0x4d, 0x5f, 0xaa, 0x24, 0x62, 0xdb, 0xb5, 0x58, 0xb6, 0xf1, + 0x3b, 0x65, 0x28, 0xaa, 0xcd, 0x57, 0x77, 0xb8, 0x12, 0x75, 0xf8, 0xbb, 0x50, 0xf6, 0xc6, 0xc2, + 0x37, 0xa5, 0xe7, 0xeb, 0xcc, 0xcd, 0x3b, 0x2f, 0xb3, 0x99, 0xaf, 0x1f, 0x68, 0x66, 0x23, 0x12, + 0x33, 0xad, 0x4d, 0xd9, 0x59, 0x6d, 0xba, 0x0f, 0x2c, 0xdc, 0xb7, 0x0f, 0x7d, 0xe4, 0x93, 0x17, + 0x3a, 0x0e, 0x9f, 0xc1, 0xf3, 0x1e, 0x54, 0xfa, 0x9e, 0x6b, 0xd9, 0x51, 0x16, 0x67, 0xe5, 0xe1, + 0xd7, 0x5f, 0xaa, 0x85, 0x9b, 0x21, 0xb7, 0x11, 0x0b, 0xe2, 0xaf, 0x43, 0xe1, 0x0c, 0xd5, 0x8c, + 0xf4, 0xe9, 0x72, 0x25, 0x54, 0x44, 0xfc, 0x13, 0xa8, 0xfe, 0x60, 0x62, 0xf7, 0x4f, 0x0f, 0x92, + 0x59, 0xc2, 0xf7, 0x5e, 0xaa, 0x15, 0xdf, 0x8d, 0xf9, 0x8d, 0xa4, 0xb0, 0x84, 0x6a, 0x97, 0xfe, + 0x18, 0xaa, 0x5d, 0x9e, 0x55, 0x6d, 0x03, 0x6a, 0xae, 0x08, 0xa4, 0xb0, 0xb6, 0xb5, 0xaf, 0x06, + 0x9f, 0xc1, 0x57, 0x4b, 0x8b, 0x68, 0x7e, 0x09, 0xca, 0xe1, 0x84, 0xf3, 0x22, 0x64, 0xf7, 0x31, + 0x28, 0x2a, 0x42, 0xf6, 0xc0, 0x57, 0xda, 0xd6, 0x42, 0x6d, 0x6b, 0xfe, 0x61, 0x06, 0x2a, 0xd1, + 0xa0, 0xa7, 0x2d, 0x67, 0xfb, 0x07, 0x13, 0xd3, 0x61, 0x19, 0x0a, 0x97, 0x3d, 0xa9, 0x20, 0x32, + 0xd6, 0x8f, 0xe8, 0xb0, 0xde, 0x67, 0x39, 0x72, 0x11, 0x44, 0x10, 0xb0, 0x3c, 0xe7, 0xb0, 0xa2, + 0xd1, 0x07, 0xbe, 0x22, 0x2d, 0xa0, 0xe1, 0xc3, 0xa7, 0x21, 0xa2, 0xa8, 0x3c, 0x8a, 0x53, 0xa1, + 0x0c, 0xe4, 0xbe, 0x27, 0x09, 0x28, 0x63, 0xa3, 0x3a, 0x2e, 0xab, 0xe0, 0x3b, 0xf7, 0x3d, 0xd9, + 0x41, 0x93, 0x18, 0x85, 0x67, 0xd5, 0xf0, 0xf5, 0x04, 0x91, 0x45, 0x6c, 0x39, 0x4e, 0xc7, 0x65, + 0x35, 0xfd, 0x40, 0x41, 0x2b, 0x28, 0xb1, 0x7d, 0x6e, 0xf6, 0x91, 0x7d, 0x15, 0x2d, 0x2c, 0xf2, + 0x68, 0x98, 0xe1, 0x92, 0x6c, 0x9f, 0xdb, 0x81, 0x0c, 0xd8, 0x5a, 0xf3, 0xdf, 0x65, 0xa0, 0x9a, + 0x98, 0x60, 0x0c, 0xff, 0x88, 0x10, 0xb7, 0x32, 0x15, 0x0d, 0x7e, 0x8c, 0xc3, 0xe8, 0x5b, 0xe1, + 0x36, 0xd5, 0xf3, 0xf0, 0x67, 0x16, 0xdf, 0xd7, 0xf3, 0x46, 0x9e, 0xef, 0x7b, 0xcf, 0x95, 0xeb, + 0xb3, 0x6b, 0x06, 0xf2, 0x99, 0x10, 0xa7, 0x2c, 0x8f, 0x5d, 0xdd, 0x9c, 0xf8, 0xbe, 0x70, 0x15, + 0xa2, 0x40, 0x8d, 0x13, 0xe7, 0x0a, 0x2a, 0xa2, 0x50, 0x24, 0xa6, 0x7d, 0x90, 0x95, 0xd0, 0x10, + 0x68, 0x6a, 0x85, 0x29, 0x23, 0x01, 0x92, 0x2b, 0xb0, 0x82, 0x9b, 0x8a, 0xca, 0x50, 0x1c, 0x9c, + 0x6c, 0x99, 0x17, 0x41, 0x6b, 0xe0, 0x31, 0x98, 0x46, 0xee, 0x7b, 0xcf, 0x59, 0xb5, 0x31, 0x01, + 0x88, 0x63, 0x32, 0x8c, 0x45, 0x51, 0x21, 0xa2, 0x33, 0x04, 0x0d, 0xf1, 0x03, 0x00, 0xfc, 0x45, + 0x94, 0x61, 0x40, 0xfa, 0x12, 0x8e, 0x32, 0xf1, 0x19, 0x09, 0x11, 0x8d, 0xbf, 0x00, 0x95, 0xe8, + 0x01, 0xaf, 0x43, 0x89, 0x5c, 0xda, 0xe8, 0xb5, 0x21, 0x88, 0xfe, 0x99, 0xed, 0x5a, 0xe2, 0x9c, + 0xec, 0x4a, 0xc1, 0x50, 0x00, 0xb6, 0x72, 0x68, 0x5b, 0x96, 0x70, 0xc3, 0x93, 0x1e, 0x05, 0xcd, + 0x3b, 0x8f, 0xcf, 0xcf, 0x3d, 0x8f, 0x6f, 0xfc, 0x2a, 0x54, 0x13, 0x41, 0xe3, 0xa5, 0xdd, 0x4e, + 0x34, 0x2c, 0x9b, 0x6e, 0xd8, 0x6d, 0xa8, 0x84, 0x35, 0x20, 0x01, 0xed, 0x6d, 0x15, 0x23, 0x46, + 0x34, 0xfe, 0x69, 0x16, 0x3d, 0x59, 0xec, 0xda, 0x74, 0xa0, 0xb7, 0x0d, 0xc5, 0x40, 0x9a, 0x72, + 0x12, 0x16, 0x33, 0x2c, 0xb8, 0x40, 0xbb, 0xc4, 0xb3, 0xb3, 0x64, 0x68, 0x6e, 0xfe, 0x01, 0xe4, + 0xa4, 0x39, 0xd0, 0x89, 0xd2, 0xaf, 0x2c, 0x26, 0xa4, 0x67, 0x0e, 0x76, 0x96, 0x0c, 0xe4, 0xe3, + 0xbb, 0x50, 0xee, 0xeb, 0xdc, 0x96, 0x36, 0x8a, 0x0b, 0xc6, 0x62, 0x61, 0x46, 0x6c, 0x67, 0xc9, + 0x88, 0x24, 0xf0, 0xef, 0x40, 0x1e, 0xbd, 0x4b, 0x5d, 0xf3, 0xb1, 0x60, 0x8c, 0x89, 0xcb, 0x65, + 0x67, 0xc9, 0x20, 0xce, 0x8d, 0x12, 0x14, 0xc8, 0x06, 0x37, 0xea, 0x50, 0x54, 0x7d, 0x9d, 0x1e, + 0xb9, 0xc6, 0x2d, 0xc8, 0xf5, 0xcc, 0x01, 0x7a, 0xf8, 0xb6, 0x15, 0xe8, 0x54, 0x09, 0xfe, 0x6c, + 0xbc, 0x12, 0xe7, 0xe9, 0x92, 0x29, 0xe0, 0x4c, 0x2a, 0x05, 0xdc, 0x28, 0x42, 0x1e, 0xdf, 0xd8, + 0xb8, 0x7d, 0x55, 0xb4, 0xd0, 0xf8, 0x47, 0x39, 0x0c, 0x2c, 0xa4, 0x38, 0x9f, 0x9b, 0xde, 0xfe, + 0x08, 0x2a, 0x63, 0xdf, 0xeb, 0x8b, 0x20, 0xf0, 0x7c, 0xed, 0x1c, 0xbd, 0xfe, 0xe2, 0xa3, 0xe7, + 0xf5, 0xc3, 0x90, 0xc7, 0x88, 0xd9, 0x9b, 0xff, 0x3a, 0x0b, 0x95, 0xe8, 0x81, 0x8a, 0x67, 0xa4, + 0x38, 0x57, 0xa9, 0xcc, 0x3d, 0xe1, 0x8f, 0x4c, 0xdb, 0x52, 0xd6, 0x63, 0x73, 0x68, 0x86, 0x4e, + 0xee, 0xc7, 0xde, 0x44, 0x4e, 0x8e, 0x85, 0x4a, 0x61, 0x3d, 0xb5, 0x47, 0xc2, 0x63, 0x79, 0x3a, + 0x3c, 0x42, 0xc5, 0xee, 0x3b, 0xde, 0xc4, 0x62, 0x05, 0x84, 0x1f, 0xd1, 0xf6, 0xb6, 0x67, 0x8e, + 0x03, 0x65, 0x33, 0xf7, 0x6c, 0xdf, 0x63, 0x25, 0x64, 0xda, 0xb6, 0x07, 0x23, 0x93, 0x95, 0x51, + 0x58, 0xef, 0xb9, 0x2d, 0xd1, 0x08, 0x57, 0xd0, 0x4d, 0x3d, 0x18, 0x0b, 0xb7, 0x2b, 0x7d, 0x21, + 0xe4, 0x9e, 0x39, 0x56, 0x39, 0x4d, 0x43, 0x58, 0x96, 0x2d, 0x95, 0xfd, 0xdc, 0x36, 0xfb, 0xe2, + 0xd8, 0xf3, 0x4e, 0xd9, 0x32, 0x1a, 0x9a, 0x8e, 0x1b, 0x48, 0x73, 0xe0, 0x9b, 0x23, 0x65, 0x43, + 0x7b, 0xc2, 0x11, 0x04, 0xad, 0xd0, 0xbb, 0x6d, 0x39, 0x9c, 0x1c, 0x3f, 0xc2, 0xb8, 0x6f, 0x55, + 0x9d, 0x33, 0x59, 0x62, 0x2c, 0xd0, 0x86, 0x2e, 0x43, 0x79, 0xc3, 0x76, 0xec, 0x63, 0xdb, 0xb1, + 0xd9, 0x1a, 0x92, 0xb6, 0xcf, 0xfb, 0xa6, 0x63, 0x5b, 0xbe, 0xf9, 0x9c, 0x71, 0x6c, 0xdc, 0x63, + 0xdf, 0x3b, 0xb5, 0xd9, 0x35, 0x24, 0xa4, 0x30, 0xf0, 0xcc, 0xfe, 0x21, 0xbb, 0x4e, 0x67, 0x65, + 0xa7, 0x42, 0xf6, 0x87, 0x27, 0xe6, 0x31, 0xbb, 0x11, 0xa7, 0xf4, 0x6e, 0x36, 0xd6, 0x60, 0x75, + 0xea, 0x54, 0xbe, 0x51, 0xd2, 0xd1, 0x67, 0xa3, 0x06, 0xd5, 0xc4, 0x71, 0x69, 0xe3, 0x55, 0x28, + 0x87, 0x87, 0xa9, 0x18, 0xa5, 0xdb, 0x81, 0x4a, 0x03, 0x6b, 0x25, 0x89, 0xe0, 0xc6, 0x7f, 0xca, + 0x40, 0x51, 0x9d, 0x64, 0xf3, 0x8d, 0xa8, 0xf2, 0x24, 0xb3, 0xc0, 0xe9, 0xa5, 0x62, 0xd2, 0x67, + 0xbf, 0x51, 0xf9, 0xc9, 0x75, 0x28, 0x38, 0x14, 0x8e, 0x6b, 0xf3, 0x45, 0x40, 0xc2, 0xda, 0xe4, + 0x52, 0xd6, 0xe6, 0x36, 0x54, 0xcc, 0x89, 0xf4, 0xe8, 0x90, 0x4e, 0x9f, 0x60, 0xc4, 0x88, 0x66, + 0x2b, 0x3a, 0x8d, 0x0e, 0x13, 0x93, 0xe4, 0x33, 0xf6, 0x7c, 0x21, 0x54, 0xd2, 0x91, 0x62, 0xed, + 0x2c, 0xed, 0x24, 0xde, 0x68, 0x6c, 0xf6, 0x25, 0x21, 0x68, 0x8f, 0x45, 0x53, 0xcb, 0xf2, 0xb8, + 0x06, 0x36, 0x87, 0xa6, 0x6c, 0x9e, 0x40, 0xf9, 0xd0, 0x0b, 0xa6, 0x77, 0xec, 0x12, 0xe4, 0x7a, + 0xde, 0x58, 0xf9, 0x9f, 0x1b, 0x9e, 0x24, 0xff, 0x53, 0x6d, 0xd0, 0x27, 0x52, 0xa9, 0x9c, 0x61, + 0x0f, 0x86, 0x52, 0xc5, 0xe9, 0x1d, 0xd7, 0x15, 0x3e, 0x2b, 0xe0, 0x0c, 0x1b, 0x62, 0x8c, 0x3e, + 0x2f, 0x2b, 0xe2, 0x9c, 0x12, 0x7e, 0xdb, 0xf6, 0x03, 0xc9, 0x4a, 0xcd, 0x0e, 0xee, 0xb5, 0xf6, + 0x80, 0xb6, 0x48, 0xfa, 0x41, 0xa2, 0x96, 0xb0, 0x89, 0x04, 0x6e, 0x0a, 0x17, 0x35, 0x90, 0x62, + 0x2b, 0x15, 0x18, 0xd2, 0x0b, 0xb2, 0xb8, 0xbf, 0x11, 0xfc, 0xd1, 0x24, 0x90, 0xf6, 0xc9, 0x05, + 0xcb, 0x35, 0x9f, 0x41, 0x2d, 0x55, 0xe4, 0xc4, 0xaf, 0x03, 0x4b, 0x21, 0xb0, 0xe9, 0x4b, 0xfc, + 0x16, 0x5c, 0x4b, 0x61, 0xf7, 0x6c, 0xcb, 0xa2, 0x4c, 0xf0, 0xf4, 0x83, 0xb0, 0x83, 0x1b, 0x15, + 0x28, 0xf5, 0xd5, 0x1c, 0x36, 0x0f, 0xa1, 0x46, 0x93, 0xba, 0x27, 0xa4, 0x79, 0xe0, 0x3a, 0x17, + 0x7f, 0xec, 0x4a, 0xb4, 0xe6, 0x57, 0x75, 0xf8, 0x85, 0xd6, 0xe4, 0xc4, 0xf7, 0x46, 0x24, 0xab, + 0x60, 0xd0, 0x6f, 0x94, 0x2e, 0x3d, 0xad, 0x19, 0x59, 0xe9, 0x35, 0x7f, 0x59, 0x81, 0x52, 0xab, + 0xdf, 0xc7, 0x80, 0x71, 0xe6, 0xcd, 0xef, 0x40, 0xb1, 0xef, 0xb9, 0x27, 0xf6, 0x40, 0x5b, 0xeb, + 0x69, 0xbf, 0x51, 0xf3, 0xa1, 0x3a, 0x9e, 0xd8, 0x03, 0x43, 0x13, 0x23, 0x9b, 0xde, 0x6d, 0x0a, + 0x57, 0xb2, 0x29, 0x93, 0x1b, 0x6d, 0x2e, 0x0f, 0x20, 0x6f, 0xbb, 0x27, 0x9e, 0x2e, 0x1b, 0xfd, + 0xfc, 0x25, 0x4c, 0x54, 0x3b, 0x49, 0x84, 0x8d, 0xff, 0x9c, 0x81, 0xa2, 0x7a, 0x35, 0x7f, 0x15, + 0x56, 0x84, 0x8b, 0x4b, 0x2d, 0x34, 0xf4, 0x7a, 0x8d, 0x4d, 0x61, 0xd1, 0xa5, 0xd5, 0x18, 0x71, + 0x3c, 0x19, 0xe8, 0xcc, 0x4c, 0x12, 0xc5, 0xdf, 0x83, 0x5b, 0x0a, 0x3c, 0xf4, 0x85, 0x2f, 0x1c, + 0x61, 0x06, 0x62, 0x73, 0x68, 0xba, 0xae, 0x70, 0xf4, 0xb6, 0x7f, 0xd9, 0x63, 0xde, 0x84, 0x65, + 0xf5, 0xa8, 0x3b, 0x36, 0xfb, 0x22, 0xd0, 0x6b, 0x29, 0x85, 0xe3, 0x5f, 0x83, 0x02, 0x55, 0xd5, + 0xd6, 0xad, 0xab, 0xa7, 0x52, 0x51, 0x35, 0xbc, 0x68, 0x5f, 0x6a, 0x01, 0xa8, 0x61, 0xc2, 0x90, + 0x4c, 0xdb, 0x86, 0x2f, 0x5e, 0x39, 0xae, 0x14, 0x1d, 0x26, 0x98, 0xb0, 0x7d, 0x96, 0x70, 0x04, + 0x95, 0x3f, 0xe2, 0xbe, 0x99, 0xa5, 0x73, 0x97, 0x14, 0xae, 0xf1, 0x07, 0x79, 0xc8, 0xe3, 0x08, + 0x23, 0xf1, 0xd0, 0x1b, 0x89, 0x28, 0xfb, 0xac, 0x1c, 0x91, 0x14, 0x0e, 0x1d, 0x1f, 0x53, 0x15, + 0x00, 0x44, 0x64, 0xca, 0xb4, 0x4c, 0xa3, 0x91, 0x72, 0xec, 0x7b, 0x27, 0xb6, 0x13, 0x53, 0x6a, + 0x17, 0x69, 0x0a, 0xcd, 0xbf, 0x0e, 0x37, 0x47, 0xa6, 0x7f, 0x2a, 0x24, 0xad, 0xee, 0x67, 0x9e, + 0x7f, 0x1a, 0xe0, 0xc8, 0x75, 0x2c, 0x9d, 0xb6, 0xbc, 0xe4, 0x29, 0x7f, 0x1d, 0xd6, 0x9e, 0x87, + 0x60, 0xf4, 0x0e, 0x95, 0x38, 0x9c, 0x7d, 0x80, 0xc6, 0xd8, 0x12, 0x67, 0x36, 0xc9, 0x2d, 0xab, + 0xda, 0xda, 0x10, 0x46, 0x55, 0x32, 0xd5, 0x40, 0x76, 0xf5, 0x9b, 0xf5, 0xf9, 0x53, 0x1a, 0x8b, + 0x76, 0x53, 0xd5, 0x1c, 0x05, 0x1d, 0x8b, 0xf2, 0xae, 0x15, 0x23, 0x46, 0xa0, 0xa2, 0xd1, 0x2b, + 0x9f, 0x2a, 0x93, 0x5b, 0x53, 0x01, 0x6a, 0x02, 0x85, 0x14, 0x52, 0xf4, 0x87, 0xe1, 0x4b, 0x54, + 0x52, 0x34, 0x89, 0xe2, 0x77, 0x00, 0x06, 0xa6, 0x14, 0xcf, 0xcd, 0x8b, 0x27, 0xbe, 0x53, 0x17, + 0xea, 0x20, 0x25, 0xc6, 0x60, 0x88, 0xeb, 0x78, 0x7d, 0xd3, 0xe9, 0x4a, 0xcf, 0x37, 0x07, 0xe2, + 0xd0, 0x94, 0xc3, 0xfa, 0x40, 0x85, 0xb8, 0xd3, 0x78, 0xec, 0xb1, 0xb4, 0x47, 0xe2, 0x13, 0xcf, + 0x15, 0xf5, 0xa1, 0xea, 0x71, 0x08, 0x63, 0x4b, 0x4c, 0xd7, 0x74, 0x2e, 0xa4, 0xdd, 0xc7, 0xbe, + 0xd8, 0xaa, 0x25, 0x09, 0x14, 0x25, 0x15, 0x84, 0xc4, 0x71, 0xec, 0x58, 0xf5, 0xef, 0xab, 0xbe, + 0x46, 0x08, 0x9c, 0x5d, 0x21, 0x87, 0xc2, 0x17, 0x93, 0x51, 0xcb, 0xb2, 0x7c, 0x11, 0x04, 0xf5, + 0x53, 0x35, 0xbb, 0x53, 0xe8, 0xc6, 0x37, 0xe9, 0x98, 0x6b, 0xd8, 0x7c, 0x0b, 0x6a, 0xbb, 0xd8, + 0xc2, 0xd6, 0xd8, 0xee, 0xf6, 0xbd, 0xb1, 0x40, 0x83, 0x4e, 0x09, 0x63, 0x4a, 0x2f, 0x54, 0xa1, + 0xf4, 0x51, 0xe0, 0xb9, 0xad, 0xc3, 0x8e, 0xda, 0x62, 0xb6, 0x27, 0x8e, 0xc3, 0xb2, 0xcd, 0x03, + 0x80, 0x58, 0xb3, 0x71, 0xbb, 0x68, 0xd1, 0x99, 0x12, 0x5b, 0x52, 0xc9, 0x2c, 0xd7, 0xb2, 0xdd, + 0xc1, 0x96, 0x56, 0x66, 0x96, 0x41, 0x24, 0x25, 0x29, 0x84, 0x15, 0x21, 0xc9, 0x9d, 0x21, 0x48, + 0x58, 0x2c, 0xd7, 0xfc, 0x3f, 0x19, 0xa8, 0x26, 0x4a, 0x28, 0xfe, 0x04, 0xcb, 0x3e, 0x70, 0xb3, + 0x47, 0x77, 0x01, 0xe7, 0x4d, 0x29, 0x7a, 0x04, 0xe3, 0xac, 0xea, 0x0a, 0x0f, 0x7c, 0xaa, 0x52, + 0x12, 0x09, 0xcc, 0x67, 0x2a, 0xf9, 0x68, 0x3e, 0xd4, 0x79, 0x9d, 0x2a, 0x94, 0x9e, 0xb8, 0xa7, + 0xae, 0xf7, 0xdc, 0x55, 0xfb, 0x34, 0xd5, 0xf1, 0xa4, 0x4e, 0x24, 0xc3, 0x52, 0x9b, 0x5c, 0xf3, + 0x5f, 0xe4, 0xa7, 0x4a, 0xde, 0xda, 0x50, 0x54, 0xc1, 0x04, 0xf9, 0xb9, 0xb3, 0x35, 0x4a, 0x49, + 0x62, 0x7d, 0xfa, 0x95, 0x40, 0x19, 0x9a, 0x19, 0xbd, 0xfc, 0xa8, 0x20, 0x34, 0x3b, 0xf7, 0x94, + 0x2e, 0x25, 0x28, 0xb4, 0xcd, 0xa9, 0x9a, 0xe8, 0x48, 0x42, 0xe3, 0xaf, 0x65, 0xe0, 0xfa, 0x3c, + 0x92, 0x64, 0xe5, 0x78, 0x26, 0x5d, 0x39, 0xde, 0x9d, 0xaa, 0xc4, 0xce, 0x52, 0x6f, 0x1e, 0xbc, + 0x64, 0x23, 0xd2, 0x75, 0xd9, 0xcd, 0xdf, 0xcb, 0xc0, 0xda, 0x4c, 0x9f, 0x13, 0x7e, 0x0c, 0x40, + 0x51, 0x69, 0x96, 0x2a, 0x94, 0x8a, 0x4a, 0x57, 0xd4, 0xd1, 0x03, 0xed, 0xf0, 0x81, 0xaa, 0x05, + 0xd0, 0xb5, 0xe7, 0xca, 0x89, 0xc6, 0x59, 0xc3, 0x0d, 0x64, 0x20, 0x54, 0x9a, 0x56, 0x39, 0x5b, + 0x1a, 0x53, 0x54, 0x8e, 0xae, 0x3a, 0x1f, 0x61, 0x25, 0x2a, 0xc0, 0x9a, 0x8c, 0x1d, 0xbb, 0x8f, + 0x60, 0x99, 0x37, 0xe0, 0xa6, 0xba, 0x80, 0xa0, 0x83, 0xca, 0x93, 0xde, 0xd0, 0xa6, 0xc5, 0xc1, + 0x2a, 0xf8, 0x9e, 0xc3, 0xc9, 0xb1, 0x63, 0x07, 0x43, 0x06, 0x4d, 0x03, 0xae, 0xcd, 0xe9, 0x20, + 0x35, 0xf9, 0xa9, 0x6e, 0xfe, 0x0a, 0xc0, 0xd6, 0xd3, 0xb0, 0xd1, 0x2c, 0xc3, 0x39, 0xac, 0x6c, + 0x3d, 0x4d, 0x4a, 0xd7, 0x8b, 0xe7, 0x29, 0x5a, 0xaf, 0x80, 0xe5, 0x9a, 0xbf, 0x96, 0x09, 0x2b, + 0x24, 0x1a, 0x7f, 0x1e, 0x6a, 0xaa, 0xc1, 0x87, 0xe6, 0x85, 0xe3, 0x99, 0x16, 0x6f, 0xc3, 0x4a, + 0x10, 0x5d, 0x91, 0x49, 0x6c, 0x58, 0xd3, 0x8e, 0x40, 0x37, 0x45, 0x64, 0x4c, 0x31, 0x85, 0x81, + 0x52, 0x36, 0x3e, 0x56, 0xe1, 0x14, 0xf2, 0x99, 0xb4, 0xe4, 0x96, 0x29, 0x88, 0x33, 0x9b, 0x5f, + 0x83, 0xb5, 0x6e, 0x6c, 0xdc, 0x95, 0x47, 0x8d, 0xca, 0xa1, 0x76, 0x86, 0xad, 0x50, 0x39, 0x34, + 0xd8, 0xfc, 0xc7, 0x25, 0x80, 0xf8, 0x08, 0x69, 0xce, 0x9a, 0x9f, 0x57, 0x11, 0x31, 0x73, 0xa0, + 0x9b, 0x7b, 0xe9, 0x03, 0xdd, 0xf7, 0x22, 0xc7, 0x5e, 0xa5, 0x97, 0xa7, 0xcb, 0xc2, 0xe3, 0x36, + 0x4d, 0xbb, 0xf3, 0xa9, 0x82, 0xa1, 0xc2, 0x74, 0xc1, 0xd0, 0xdd, 0xd9, 0xea, 0xc2, 0x29, 0x63, + 0x14, 0xe7, 0x2d, 0x4a, 0xa9, 0xbc, 0x45, 0x03, 0xca, 0xbe, 0x30, 0x2d, 0xcf, 0x75, 0x2e, 0xc2, + 0x73, 0xc3, 0x10, 0xe6, 0x6f, 0x41, 0x41, 0xd2, 0x2d, 0x9f, 0x32, 0xad, 0x9d, 0x17, 0x4c, 0x9c, + 0xa2, 0x45, 0xcb, 0x66, 0x07, 0xba, 0x24, 0x50, 0xed, 0x9a, 0x65, 0x23, 0x81, 0xe1, 0xeb, 0xc0, + 0x6d, 0x0c, 0xe2, 0x1c, 0x47, 0x58, 0x1b, 0x17, 0x5b, 0xea, 0x38, 0x8f, 0xf6, 0xf5, 0xb2, 0x31, + 0xe7, 0x49, 0x38, 0xff, 0xcb, 0xf1, 0xfc, 0x53, 0x93, 0xcf, 0xec, 0x00, 0x7b, 0x5a, 0x23, 0xf7, + 0x25, 0x82, 0xd1, 0x73, 0x08, 0x17, 0xac, 0x1a, 0x4b, 0xd2, 0xde, 0xf8, 0x4c, 0xfc, 0x92, 0xa7, + 0xe1, 0xf0, 0xaa, 0xc4, 0xcd, 0x2a, 0x09, 0x8d, 0x11, 0x64, 0xc9, 0xfb, 0x9e, 0xbb, 0x8f, 0x1a, + 0xc1, 0xb4, 0x25, 0xd7, 0x30, 0xf6, 0x77, 0xec, 0x4c, 0x7c, 0xd3, 0xa1, 0xa7, 0x6b, 0xca, 0x92, + 0xc7, 0x98, 0xe6, 0xbf, 0xc9, 0x46, 0xc1, 0x53, 0x05, 0x0a, 0xc7, 0x66, 0x60, 0xf7, 0xd5, 0xee, + 0xa6, 0x9d, 0x1e, 0xb5, 0xbb, 0x49, 0xcf, 0xf2, 0x58, 0x16, 0xe3, 0xa0, 0x40, 0xe8, 0xe3, 0x9c, + 0xf8, 0x4e, 0x15, 0xcb, 0xa3, 0x09, 0x08, 0x35, 0x49, 0xd5, 0x0c, 0x11, 0x2b, 0x25, 0xe7, 0xac, + 0xa8, 0x1a, 0x93, 0xc2, 0x6c, 0xda, 0x62, 0x58, 0x19, 0x69, 0x5c, 0x4f, 0x0a, 0x95, 0x9a, 0x24, + 0xbd, 0x67, 0x80, 0x62, 0xc2, 0x4b, 0x02, 0xac, 0x8a, 0x81, 0x49, 0x28, 0x54, 0xe5, 0x13, 0x03, + 0x0a, 0xdb, 0x96, 0x71, 0xdd, 0xa7, 0x1f, 0xb0, 0x1a, 0xb6, 0x28, 0xbe, 0xaa, 0xc5, 0x56, 0x50, + 0xaa, 0x49, 0x95, 0x2c, 0xab, 0xf8, 0xf3, 0x8c, 0xea, 0x5b, 0x18, 0xbe, 0xd5, 0x42, 0xbb, 0xb4, + 0x86, 0x2d, 0x8b, 0x1c, 0x1d, 0xc6, 0x31, 0xee, 0x1a, 0x9b, 0x18, 0x04, 0xd9, 0x63, 0xd3, 0x95, + 0xec, 0x1a, 0x76, 0x75, 0x6c, 0x9d, 0xb0, 0xeb, 0xc8, 0xd2, 0x1f, 0x9a, 0x92, 0xdd, 0x40, 0x1a, + 0xfc, 0xb5, 0x25, 0x7c, 0xd4, 0x14, 0x76, 0x13, 0x69, 0xa4, 0x39, 0x60, 0xb7, 0x9a, 0xbf, 0x19, + 0xd7, 0x43, 0xbf, 0x11, 0x85, 0x27, 0x8b, 0x2c, 0x1f, 0x0c, 0x60, 0xe6, 0xad, 0xe5, 0x36, 0xac, + 0xf9, 0xe2, 0x07, 0x13, 0x3b, 0x75, 0x4b, 0x20, 0x77, 0x75, 0x19, 0xca, 0x2c, 0x47, 0xf3, 0x0c, + 0xd6, 0x42, 0xe0, 0x99, 0x2d, 0x87, 0x94, 0x47, 0xe2, 0x6f, 0x25, 0xae, 0x31, 0x64, 0xe6, 0x5e, + 0xff, 0x8a, 0x44, 0xc6, 0xd7, 0x16, 0xa2, 0x73, 0x82, 0xec, 0x02, 0xe7, 0x04, 0xcd, 0xff, 0x9d, + 0x3c, 0x78, 0x56, 0x01, 0x9b, 0x15, 0x05, 0x6c, 0xb3, 0x07, 0xd1, 0x71, 0xea, 0x3f, 0xfb, 0x32, + 0xa9, 0xff, 0x79, 0x45, 0x1d, 0xef, 0x63, 0xfc, 0x40, 0x2b, 0xf3, 0xe9, 0x02, 0xc7, 0x1a, 0x29, + 0x5a, 0xbe, 0x41, 0xc7, 0xca, 0x66, 0x57, 0x55, 0x1c, 0x15, 0xe6, 0x5e, 0x2a, 0x4a, 0x9e, 0x1f, + 0x6b, 0x4a, 0x23, 0xc1, 0x95, 0xb0, 0x63, 0xc5, 0x79, 0x76, 0x0c, 0x63, 0x67, 0x6d, 0xe1, 0x22, + 0x58, 0x9d, 0x02, 0xa9, 0xdf, 0xa1, 0x78, 0x5a, 0xe3, 0x65, 0x63, 0x06, 0x8f, 0xce, 0xde, 0x68, + 0xe2, 0x48, 0x5b, 0x1f, 0x74, 0x28, 0x60, 0xfa, 0xd6, 0x63, 0x65, 0xf6, 0xd6, 0xe3, 0x87, 0x00, + 0x81, 0xc0, 0xd5, 0xb1, 0x65, 0xf7, 0xa5, 0xae, 0x4b, 0xba, 0x73, 0x59, 0xdf, 0xf4, 0xf1, 0x4c, + 0x82, 0x03, 0xdb, 0x3f, 0x32, 0xcf, 0xe9, 0xc8, 0x56, 0x17, 0x50, 0x44, 0xf0, 0xb4, 0x75, 0x5f, + 0x99, 0xb5, 0xee, 0x6f, 0x41, 0x21, 0x40, 0x17, 0x9a, 0x2e, 0xee, 0x5c, 0x3e, 0xbf, 0xeb, 0xe4, + 0x67, 0x1b, 0x8a, 0x96, 0x12, 0x96, 0x68, 0xff, 0x3c, 0x9f, 0xae, 0xec, 0x54, 0x8c, 0x10, 0x4c, + 0x59, 0xd8, 0x9b, 0x69, 0x0b, 0xdb, 0xb0, 0xa0, 0xa8, 0x0f, 0x1f, 0xa6, 0x13, 0x05, 0x61, 0xda, + 0x32, 0x9b, 0x48, 0x5b, 0x46, 0xd5, 0xaf, 0xb9, 0x64, 0xf5, 0xeb, 0xd4, 0xad, 0xbe, 0xc2, 0xcc, + 0xad, 0xbe, 0xe6, 0x27, 0x50, 0x50, 0x31, 0x01, 0x84, 0xee, 0xa8, 0x72, 0x65, 0xb1, 0x53, 0x2c, + 0xc3, 0xaf, 0x03, 0x0b, 0x04, 0xf9, 0x3a, 0xa2, 0x6b, 0x8e, 0x04, 0x19, 0xc9, 0x2c, 0xaf, 0xc3, + 0x75, 0x45, 0x1b, 0xa4, 0x9f, 0x90, 0xc3, 0xe5, 0xd8, 0xc7, 0xbe, 0xe9, 0x5f, 0xb0, 0x7c, 0xf3, + 0x43, 0x3a, 0xfa, 0x0f, 0x15, 0xaa, 0x1a, 0xdd, 0xa2, 0x54, 0x66, 0xd9, 0xd2, 0xd6, 0x87, 0x2a, + 0x47, 0x74, 0xb4, 0xa7, 0xea, 0xe9, 0x28, 0x9c, 0xa2, 0x7c, 0xd0, 0x72, 0x72, 0x8f, 0xff, 0x13, + 0x5b, 0x6f, 0xcd, 0x8d, 0x84, 0xc7, 0x98, 0x2e, 0x90, 0xcb, 0x2c, 0x5a, 0x20, 0xd7, 0x7c, 0x0c, + 0xab, 0x46, 0xda, 0xa6, 0xf3, 0xf7, 0xa0, 0xe4, 0x8d, 0x93, 0x72, 0x5e, 0xa4, 0x97, 0x21, 0x79, + 0xf3, 0x67, 0x19, 0x58, 0xee, 0xb8, 0x52, 0xf8, 0xae, 0xe9, 0x6c, 0x3b, 0xe6, 0x80, 0xbf, 0x1b, + 0x5a, 0xa9, 0xf9, 0xb9, 0x87, 0x24, 0x6d, 0xda, 0x60, 0x39, 0x3a, 0xc9, 0xce, 0x6f, 0xc0, 0x9a, + 0xb0, 0x6c, 0xe9, 0xf9, 0xca, 0x4f, 0x0e, 0xeb, 0x18, 0xaf, 0x03, 0x53, 0xe8, 0x2e, 0x2d, 0x89, + 0x9e, 0x9a, 0xe6, 0x3a, 0x5c, 0x4f, 0x61, 0x43, 0x27, 0x38, 0xcb, 0x6f, 0x43, 0x3d, 0xde, 0x8d, + 0xb6, 0x3c, 0x57, 0x76, 0x5c, 0x4b, 0x9c, 0x93, 0x93, 0xc5, 0x72, 0xcd, 0xdf, 0x88, 0xdc, 0xbb, + 0xa7, 0xba, 0xca, 0xd1, 0xf7, 0xbc, 0xf8, 0x0a, 0xad, 0x86, 0x12, 0x57, 0xb5, 0xb3, 0x0b, 0x5c, + 0xd5, 0xfe, 0x30, 0xbe, 0x6e, 0xab, 0x36, 0x8a, 0x57, 0xe6, 0xee, 0x3e, 0x54, 0x9c, 0xa5, 0xbd, + 0xfb, 0xae, 0x48, 0xdc, 0xbd, 0x7d, 0x53, 0x87, 0x74, 0xf9, 0x45, 0xbc, 0x60, 0x55, 0xc7, 0xf0, + 0xce, 0xf4, 0x1d, 0x8f, 0xc5, 0x8a, 0x24, 0x67, 0x1c, 0x55, 0x78, 0x69, 0x47, 0xf5, 0xdb, 0x53, + 0xd1, 0x53, 0x79, 0x6e, 0x3a, 0xee, 0x8a, 0x1b, 0xac, 0xdf, 0x86, 0xd2, 0xd0, 0x0e, 0xa4, 0xe7, + 0xab, 0x5b, 0xd5, 0xb3, 0xb7, 0xc0, 0x12, 0xa3, 0xb5, 0xa3, 0x08, 0xa9, 0xa2, 0x2d, 0xe4, 0xe2, + 0xdf, 0x83, 0x35, 0x1a, 0xf8, 0xc3, 0xd8, 0x6b, 0x08, 0xea, 0xd5, 0xb9, 0x95, 0x84, 0x09, 0x51, + 0x1b, 0x53, 0x2c, 0xc6, 0xac, 0x90, 0xc6, 0x00, 0x20, 0x9e, 0x9f, 0x19, 0x2b, 0xf6, 0x19, 0x6e, + 0x55, 0xdf, 0x84, 0x62, 0x30, 0x39, 0x8e, 0x4f, 0xe3, 0x34, 0xd4, 0x38, 0x87, 0xc6, 0x8c, 0x77, + 0x70, 0x28, 0x7c, 0xd5, 0xdc, 0x2b, 0xaf, 0x76, 0x7f, 0x98, 0x9c, 0x78, 0xa5, 0x9c, 0x77, 0x2f, + 0x99, 0xbd, 0x48, 0x72, 0x42, 0x03, 0x1a, 0xef, 0x40, 0x35, 0x31, 0xa8, 0x68, 0x99, 0x27, 0xae, + 0xe5, 0x85, 0x29, 0x60, 0xfc, 0xad, 0xae, 0xb6, 0x59, 0x61, 0x12, 0x98, 0x7e, 0x37, 0x0c, 0x60, + 0xd3, 0x03, 0x78, 0x45, 0x84, 0xfd, 0x0a, 0xd4, 0x12, 0x2e, 0x5d, 0x94, 0x1e, 0x4c, 0x23, 0x9b, + 0x67, 0xf0, 0xf9, 0x84, 0xb8, 0x43, 0xe1, 0x8f, 0xec, 0x00, 0x37, 0x12, 0x15, 0x2c, 0x92, 0x6b, + 0x6d, 0x09, 0x57, 0xda, 0x32, 0xb4, 0xa0, 0x11, 0xcc, 0xbf, 0x09, 0x85, 0xb1, 0xf0, 0x47, 0x81, + 0xb6, 0xa2, 0xd3, 0x1a, 0x34, 0x57, 0x6c, 0x60, 0x28, 0x9e, 0xe6, 0x3f, 0xcc, 0x40, 0x79, 0x4f, + 0x48, 0x13, 0x7d, 0x07, 0xbe, 0x37, 0xf5, 0x96, 0xd9, 0x13, 0xe4, 0x90, 0x74, 0x5d, 0x87, 0xaf, + 0xeb, 0x1d, 0x4d, 0xaf, 0xe1, 0x9d, 0xa5, 0xb8, 0x61, 0x8d, 0x0d, 0x28, 0x69, 0x74, 0xe3, 0x5d, + 0x58, 0x9d, 0xa2, 0xa4, 0x71, 0x51, 0xbe, 0x7d, 0xf7, 0x62, 0x14, 0x96, 0x39, 0x2d, 0x1b, 0x69, + 0xe4, 0x46, 0x05, 0x4a, 0x63, 0xc5, 0xd0, 0xfc, 0x83, 0x1b, 0x54, 0x5c, 0x63, 0x9f, 0x60, 0x4c, + 0x3f, 0x6f, 0x67, 0xbd, 0x03, 0x40, 0x5b, 0xb3, 0x2a, 0xc1, 0x50, 0x29, 0xdb, 0x04, 0x86, 0xbf, + 0x1f, 0xe5, 0xda, 0xf3, 0x73, 0x9d, 0xaa, 0xa4, 0xf0, 0xe9, 0x84, 0x7b, 0x1d, 0x4a, 0x76, 0x40, + 0x79, 0x38, 0x5d, 0xb6, 0x14, 0x82, 0xea, 0x49, 0xcf, 0x33, 0x03, 0xa9, 0x93, 0xde, 0x21, 0xc8, + 0xbf, 0x05, 0x45, 0x7b, 0x34, 0xf6, 0x7c, 0xa9, 0xd3, 0xf4, 0x57, 0xbe, 0xaf, 0x43, 0x94, 0x3b, + 0x4b, 0x86, 0xe6, 0x41, 0x6e, 0x71, 0x4e, 0xdc, 0xe5, 0x17, 0x73, 0xb7, 0xcf, 0x43, 0x6e, 0xc5, + 0xc3, 0xbf, 0x0b, 0xb5, 0x81, 0xaa, 0xe7, 0x54, 0x82, 0xb5, 0x79, 0xf9, 0xca, 0x55, 0x42, 0x1e, + 0x25, 0x19, 0x76, 0x96, 0x8c, 0xb4, 0x04, 0x14, 0x89, 0xae, 0xbd, 0x08, 0x64, 0xcf, 0xfb, 0xc8, + 0xb3, 0x5d, 0x0a, 0x84, 0x5f, 0x20, 0xd2, 0x48, 0x32, 0xa0, 0xc8, 0x94, 0x04, 0xfe, 0x75, 0xf4, + 0x85, 0x02, 0xa9, 0xaf, 0xbc, 0xdf, 0xbd, 0x4a, 0x52, 0x4f, 0x04, 0xfa, 0xb2, 0x7a, 0x20, 0xf9, + 0x39, 0x34, 0x12, 0xcb, 0x47, 0xbf, 0xa4, 0x35, 0x1e, 0xfb, 0x1e, 0x46, 0xd3, 0x35, 0x92, 0xf6, + 0xf5, 0xab, 0xa4, 0x1d, 0x5e, 0xca, 0xbd, 0xb3, 0x64, 0x5c, 0x21, 0x9b, 0xf7, 0x30, 0xe6, 0xd3, + 0x5d, 0xd8, 0x15, 0xe6, 0x59, 0x78, 0x61, 0xfe, 0xfe, 0x42, 0xa3, 0x40, 0x1c, 0x3b, 0x4b, 0xc6, + 0x94, 0x0c, 0xfe, 0xab, 0xb0, 0x96, 0x7a, 0x27, 0xdd, 0x91, 0x55, 0xd7, 0xe9, 0xbf, 0xb6, 0x70, + 0x37, 0x90, 0x69, 0x67, 0xc9, 0x98, 0x95, 0xc4, 0x27, 0xf0, 0xb9, 0xd9, 0x2e, 0x6d, 0x89, 0xbe, + 0x63, 0xbb, 0x42, 0xdf, 0xbc, 0x7f, 0xe7, 0xe5, 0x46, 0x4b, 0x33, 0xef, 0x2c, 0x19, 0x97, 0x4b, + 0xe6, 0x7f, 0x11, 0x6e, 0x8f, 0xe7, 0x1a, 0x1f, 0x65, 0xd4, 0xf4, 0xc5, 0xfd, 0xf7, 0x16, 0x7c, + 0xf3, 0x0c, 0xff, 0xce, 0x92, 0x71, 0xa5, 0x7c, 0xf4, 0xaa, 0x29, 0xb6, 0xd6, 0x65, 0xe7, 0x0a, + 0xa0, 0x33, 0xdc, 0xbe, 0xb3, 0x23, 0x4c, 0x2b, 0x3a, 0x49, 0x88, 0x11, 0x8d, 0xff, 0x9e, 0x81, + 0xa2, 0xd6, 0xf7, 0xdb, 0x51, 0x2d, 0x41, 0x64, 0xd4, 0x63, 0x04, 0xff, 0x00, 0x2a, 0xc2, 0xf7, + 0x3d, 0x7f, 0xd3, 0xb3, 0xc2, 0x32, 0xcc, 0xe9, 0xfc, 0xb3, 0x92, 0xb3, 0xde, 0x0e, 0xc9, 0x8c, + 0x98, 0x83, 0xbf, 0x0f, 0xa0, 0xd6, 0x79, 0x2f, 0xbe, 0x3d, 0xd4, 0x98, 0xcf, 0xaf, 0x0e, 0xa7, + 0x62, 0xea, 0x38, 0x61, 0x17, 0x9e, 0x0c, 0x85, 0x60, 0x14, 0x8a, 0x16, 0x12, 0xa1, 0xe8, 0x6d, + 0x9d, 0x61, 0xa0, 0xc4, 0x8b, 0xbe, 0x43, 0x17, 0x21, 0x1a, 0xbf, 0x9f, 0x81, 0xa2, 0x32, 0x1e, + 0xbc, 0x3d, 0xdb, 0xa3, 0xd7, 0x5e, 0x6c, 0x73, 0xd6, 0xa7, 0x7b, 0xf6, 0x2d, 0x00, 0x65, 0x83, + 0x12, 0x3d, 0xbb, 0x3d, 0x25, 0x47, 0xb3, 0x86, 0x85, 0xcf, 0x31, 0x7d, 0xf3, 0xa1, 0xba, 0xe7, + 0x45, 0xc9, 0xe2, 0x27, 0xbb, 0xbb, 0x6c, 0x89, 0xaf, 0x41, 0xed, 0xc9, 0xfe, 0xe3, 0xfd, 0x83, + 0x67, 0xfb, 0x47, 0x6d, 0xc3, 0x38, 0x30, 0x54, 0xce, 0x78, 0xa3, 0xb5, 0x75, 0xd4, 0xd9, 0x3f, + 0x7c, 0xd2, 0x63, 0xd9, 0xc6, 0x3f, 0xcb, 0x40, 0x2d, 0x65, 0xbb, 0xfe, 0x74, 0xa7, 0x2e, 0x31, + 0xfc, 0xb9, 0xf9, 0xc3, 0x9f, 0xbf, 0x6c, 0xf8, 0x0b, 0xd3, 0xc3, 0xff, 0x3b, 0x19, 0xa8, 0xa5, + 0x6c, 0x64, 0x52, 0x7a, 0x26, 0x2d, 0x3d, 0xe9, 0x03, 0x64, 0xa7, 0x7c, 0x80, 0x26, 0x2c, 0x87, + 0xbf, 0xf7, 0xe3, 0x5c, 0x44, 0x0a, 0x97, 0xa4, 0xa1, 0x8b, 0x16, 0xf9, 0x34, 0x0d, 0x5d, 0xb6, + 0xb8, 0xba, 0xb5, 0x74, 0xb1, 0x34, 0xa0, 0x7b, 0xf7, 0x8d, 0xcb, 0x2d, 0xe8, 0x15, 0x5d, 0x78, + 0x04, 0xd5, 0x71, 0xbc, 0x4c, 0x5f, 0xce, 0x61, 0x49, 0x72, 0xbe, 0xa0, 0x9d, 0xbf, 0x9b, 0x81, + 0x95, 0xb4, 0xcd, 0xfd, 0xff, 0x7a, 0x58, 0xff, 0x49, 0x06, 0xd6, 0x66, 0x2c, 0xf9, 0x95, 0x2e, + 0xdf, 0x74, 0xbb, 0xb2, 0x0b, 0xb4, 0x2b, 0x37, 0xa7, 0x5d, 0x97, 0x5b, 0x92, 0xab, 0x5b, 0xdc, + 0x85, 0xcf, 0x5d, 0xba, 0x27, 0x5c, 0x31, 0xd4, 0x29, 0xa1, 0xb9, 0x69, 0xa1, 0xbf, 0x9d, 0x81, + 0xdb, 0x57, 0xd9, 0xfb, 0xff, 0xe7, 0x7a, 0x35, 0xdd, 0xc2, 0xe6, 0xbb, 0x51, 0x89, 0x41, 0x15, + 0x4a, 0xfa, 0x7b, 0x56, 0xba, 0xc4, 0x7b, 0xe8, 0x3d, 0x77, 0x55, 0x8e, 0xda, 0x10, 0xa6, 0xbe, + 0xf1, 0x6f, 0x88, 0xb1, 0x63, 0xd3, 0xe9, 0xe9, 0x2d, 0x80, 0x16, 0x45, 0x7c, 0xe1, 0x05, 0x9c, + 0xcd, 0xdd, 0x83, 0x6e, 0x9b, 0x2d, 0x25, 0xdd, 0xdb, 0x4f, 0x42, 0x43, 0xdc, 0x3c, 0x84, 0x62, + 0x7c, 0x25, 0x62, 0xcf, 0xf4, 0x4f, 0x2d, 0x75, 0x46, 0xb9, 0x0c, 0xe5, 0x43, 0x1d, 0x5c, 0xa9, + 0x57, 0x7d, 0xd4, 0x3d, 0xd8, 0x57, 0xe9, 0xf0, 0xad, 0x83, 0x9e, 0xba, 0x58, 0xd1, 0x7d, 0xfa, + 0x48, 0x1d, 0x96, 0x3d, 0x32, 0x5a, 0x87, 0x3b, 0x47, 0x44, 0x51, 0x68, 0xfe, 0x56, 0x3e, 0xdc, + 0xd5, 0x9a, 0x86, 0x3e, 0xfd, 0x04, 0x28, 0xa2, 0x35, 0xf7, 0xb4, 0xe0, 0xe8, 0x35, 0x54, 0x0c, + 0xdc, 0x3e, 0x57, 0x19, 0x0a, 0x96, 0xe5, 0x45, 0xc8, 0x1e, 0x1e, 0xab, 0x1a, 0xa5, 0x1d, 0x39, + 0x72, 0xd4, 0x8d, 0xcc, 0xde, 0xb9, 0x64, 0x05, 0xfc, 0xb1, 0x19, 0x9c, 0xb1, 0x62, 0xf3, 0x9f, + 0xe7, 0xa0, 0x12, 0x99, 0xca, 0x97, 0x31, 0xdd, 0x9c, 0xc3, 0x4a, 0x67, 0xbf, 0xd7, 0x36, 0xf6, + 0x5b, 0xbb, 0x9a, 0x24, 0xc7, 0xaf, 0xc1, 0xea, 0x76, 0x67, 0xb7, 0x7d, 0xb4, 0x7b, 0xd0, 0xda, + 0xd2, 0xc8, 0x32, 0xbf, 0x09, 0xbc, 0xb3, 0x77, 0x78, 0x60, 0xf4, 0x8e, 0x3a, 0xdd, 0xa3, 0xcd, + 0xd6, 0xfe, 0x66, 0x7b, 0xb7, 0xbd, 0xc5, 0x8a, 0xfc, 0x15, 0xb8, 0xbb, 0x7f, 0xd0, 0xeb, 0x1c, + 0xec, 0x1f, 0xed, 0x1f, 0x1c, 0x1d, 0x6c, 0x7c, 0xd4, 0xde, 0xec, 0x75, 0x8f, 0x3a, 0xfb, 0x47, + 0x28, 0xf5, 0x91, 0xd1, 0xc2, 0x27, 0xac, 0xc0, 0xef, 0xc2, 0x6d, 0x4d, 0xd5, 0x6d, 0x1b, 0x4f, + 0xdb, 0x06, 0x0a, 0x79, 0xb2, 0xdf, 0x7a, 0xda, 0xea, 0xec, 0xb6, 0x36, 0x76, 0xdb, 0x6c, 0x99, + 0xdf, 0x81, 0x86, 0xa6, 0x30, 0x5a, 0xbd, 0xf6, 0xd1, 0x6e, 0x67, 0xaf, 0xd3, 0x3b, 0x6a, 0x7f, + 0x6f, 0xb3, 0xdd, 0xde, 0x6a, 0x6f, 0xb1, 0x1a, 0xff, 0x0a, 0x7c, 0x99, 0x1a, 0xa5, 0x1b, 0x91, + 0x7e, 0xd9, 0x27, 0x9d, 0xc3, 0xa3, 0x96, 0xb1, 0xb9, 0xd3, 0x79, 0xda, 0x66, 0x2b, 0xfc, 0x35, + 0xf8, 0xd2, 0xe5, 0xa4, 0x5b, 0x1d, 0xa3, 0xbd, 0xd9, 0x3b, 0x30, 0x3e, 0x66, 0x6b, 0xfc, 0x0b, + 0xf0, 0xb9, 0x9d, 0xde, 0xde, 0xee, 0xd1, 0x33, 0xe3, 0x60, 0xff, 0xd1, 0x11, 0xfd, 0xec, 0xf6, + 0x8c, 0x27, 0x9b, 0xbd, 0x27, 0x46, 0x9b, 0x01, 0x6f, 0xc0, 0xcd, 0xc3, 0x8d, 0xa3, 0xfd, 0x83, + 0xde, 0x51, 0x6b, 0xff, 0xe3, 0x8d, 0xdd, 0x83, 0xcd, 0xc7, 0x47, 0xdb, 0x07, 0xc6, 0x5e, 0xab, + 0xc7, 0xaa, 0xfc, 0xab, 0xf0, 0xda, 0x66, 0xf7, 0xa9, 0x6e, 0xe6, 0xc1, 0xf6, 0x91, 0x71, 0xf0, + 0xac, 0x7b, 0x74, 0x60, 0x1c, 0x19, 0xed, 0x5d, 0xea, 0x73, 0x37, 0x6e, 0x7b, 0x89, 0xdf, 0x86, + 0x7a, 0x67, 0xbf, 0xfb, 0x64, 0x7b, 0xbb, 0xb3, 0xd9, 0x69, 0xef, 0xf7, 0x8e, 0x0e, 0xdb, 0xc6, + 0x5e, 0xa7, 0xdb, 0x45, 0x32, 0x56, 0x69, 0x7e, 0x07, 0x8a, 0x1d, 0xf7, 0xcc, 0x96, 0xb4, 0xbe, + 0xb4, 0x32, 0xea, 0x58, 0x2c, 0x04, 0x69, 0x59, 0xd8, 0x03, 0x97, 0xbe, 0x34, 0x40, 0xab, 0x6b, + 0xd9, 0x88, 0x11, 0xcd, 0xdf, 0xcf, 0x41, 0x4d, 0x89, 0x08, 0x63, 0xbb, 0x7b, 0xb0, 0xaa, 0x93, + 0xa4, 0x9d, 0xb4, 0x09, 0x9b, 0x46, 0xd3, 0x27, 0xbc, 0x14, 0x2a, 0x61, 0xc8, 0x92, 0x28, 0x7e, + 0x13, 0x8a, 0x66, 0xdf, 0xc1, 0x00, 0x51, 0x9d, 0x64, 0x6a, 0xe8, 0xb3, 0xda, 0x2e, 0xb4, 0x8b, + 0x8a, 0xb0, 0xef, 0xb9, 0x9b, 0xd1, 0x65, 0x93, 0x14, 0x8e, 0x7f, 0x02, 0xb7, 0x22, 0xb8, 0xed, + 0xf6, 0xfd, 0x8b, 0x71, 0xf4, 0x8d, 0xbd, 0xd2, 0xdc, 0x34, 0xc3, 0xb6, 0xed, 0x88, 0x14, 0xa1, + 0x71, 0x99, 0x00, 0xfe, 0x08, 0xc0, 0xa6, 0xc1, 0x22, 0xff, 0x68, 0xfe, 0x8d, 0xea, 0xd4, 0x68, + 0x6a, 0x48, 0xbb, 0x81, 0xd1, 0x6f, 0xdc, 0x20, 0x06, 0x68, 0x77, 0x1f, 0xeb, 0x4f, 0xf2, 0x2d, + 0x1b, 0x11, 0xdc, 0x7c, 0x00, 0x10, 0x73, 0x71, 0x06, 0xcb, 0xe8, 0x5b, 0xb4, 0x82, 0x3d, 0x31, + 0x3a, 0x16, 0xbe, 0xaa, 0xef, 0x53, 0x98, 0x47, 0xc8, 0xc1, 0x32, 0xcd, 0x3f, 0xcc, 0x24, 0x22, + 0x74, 0x15, 0x81, 0x5f, 0xb9, 0x03, 0xcd, 0x3b, 0x2d, 0xc2, 0x48, 0x58, 0x0f, 0xaa, 0x76, 0x8c, + 0x34, 0xc8, 0x0f, 0x81, 0xdb, 0xb3, 0x43, 0x99, 0x5f, 0x70, 0x28, 0xe7, 0xf0, 0x4e, 0x27, 0xfb, + 0x0b, 0xb3, 0xc9, 0xfe, 0x3b, 0x00, 0x03, 0xc7, 0x3b, 0xd6, 0x27, 0x8e, 0x45, 0x5d, 0x11, 0x14, + 0x61, 0x9a, 0x0e, 0x94, 0xc3, 0xef, 0x0b, 0xa2, 0x8e, 0xd1, 0x17, 0x06, 0xa3, 0xd4, 0xa7, 0x82, + 0xf8, 0x0e, 0xac, 0x88, 0x74, 0x9b, 0xb3, 0x0b, 0xb6, 0x79, 0x8a, 0xaf, 0xf9, 0x0d, 0x58, 0x9b, + 0x21, 0xc2, 0x41, 0x1c, 0x9b, 0x32, 0xfa, 0xc8, 0x00, 0xfe, 0x9e, 0x3d, 0xc8, 0x6f, 0xfe, 0x87, + 0x2c, 0x2c, 0xef, 0x99, 0xae, 0x7d, 0x22, 0x02, 0x19, 0xb6, 0x36, 0xe8, 0x0f, 0xc5, 0xc8, 0x0c, + 0x5b, 0xab, 0x20, 0x9d, 0x0f, 0xc9, 0x26, 0x4f, 0x1a, 0x66, 0x0e, 0xa6, 0x70, 0x35, 0x4d, 0xe4, + 0x30, 0xaa, 0xbb, 0xd7, 0x10, 0xce, 0x9d, 0x63, 0xf7, 0x85, 0x1b, 0x84, 0x2b, 0x26, 0x04, 0xe3, + 0xba, 0x9e, 0xe2, 0x15, 0x75, 0x3d, 0xa5, 0xd9, 0xf1, 0xbf, 0x0b, 0xd5, 0xa0, 0xef, 0x0b, 0xe1, + 0x06, 0x43, 0x4f, 0x86, 0xdf, 0xa6, 0x4c, 0xa2, 0xa8, 0xc8, 0xce, 0x7b, 0xee, 0xa2, 0x8e, 0xef, + 0xda, 0xee, 0xa9, 0xae, 0x1d, 0x4b, 0xe1, 0x50, 0x07, 0x29, 0x1b, 0x64, 0xff, 0x50, 0x50, 0xbe, + 0xa1, 0x60, 0x44, 0x30, 0xe5, 0x7b, 0x4c, 0x29, 0x06, 0x9e, 0x6f, 0x0b, 0x95, 0xf4, 0xac, 0x18, + 0x09, 0x0c, 0xf2, 0x3a, 0xa6, 0x3b, 0x98, 0x98, 0x03, 0xa1, 0x0f, 0xc6, 0x23, 0xb8, 0xf9, 0x3f, + 0x0a, 0x00, 0x6a, 0x35, 0x04, 0x43, 0x7b, 0x4c, 0x87, 0x32, 0xb6, 0xae, 0x36, 0xae, 0x19, 0xf4, + 0x9b, 0xbf, 0x97, 0xba, 0x08, 0x30, 0x7b, 0x8c, 0x1a, 0xb3, 0x4f, 0x27, 0x8b, 0x70, 0x70, 0x4c, + 0x29, 0x74, 0x49, 0x15, 0x8d, 0x7f, 0xde, 0x48, 0xa2, 0xa8, 0xa8, 0xce, 0x94, 0xa2, 0xed, 0x5a, + 0x2a, 0x19, 0x95, 0x37, 0x22, 0x98, 0xae, 0x12, 0x05, 0xad, 0x89, 0xf4, 0x0c, 0xe1, 0x8a, 0xe7, + 0xd1, 0x2d, 0xb9, 0x18, 0xc5, 0xf7, 0xa0, 0x36, 0x36, 0x2f, 0x46, 0xc2, 0x95, 0x7b, 0x42, 0x0e, + 0x3d, 0x4b, 0xd7, 0x3f, 0xbd, 0x76, 0x79, 0x03, 0x0f, 0x93, 0xe4, 0x46, 0x9a, 0x1b, 0x75, 0xc2, + 0x0d, 0x68, 0x95, 0xa8, 0x69, 0xd4, 0x10, 0xdf, 0x00, 0x50, 0xbf, 0x12, 0x96, 0x6a, 0x26, 0x0b, + 0x65, 0x8e, 0x44, 0x20, 0xfc, 0x33, 0x5b, 0x59, 0x57, 0x65, 0xa4, 0x62, 0x2e, 0xb4, 0xc5, 0x93, + 0x40, 0xf8, 0xed, 0x91, 0x69, 0x3b, 0x7a, 0x82, 0x63, 0x04, 0x7f, 0x1b, 0x6e, 0x04, 0x93, 0x63, + 0xd4, 0x99, 0x63, 0xd1, 0xf3, 0xf6, 0xc5, 0xf3, 0xc0, 0x11, 0x52, 0x0a, 0x5f, 0xd7, 0x58, 0xcc, + 0x7f, 0xd8, 0x1c, 0x44, 0x6e, 0x18, 0x7d, 0x07, 0x05, 0x7f, 0xc5, 0x85, 0x5c, 0x11, 0x4a, 0x57, + 0xb9, 0xb1, 0x0c, 0x9a, 0x3f, 0x85, 0xd2, 0x45, 0x70, 0x59, 0xfe, 0x65, 0xf8, 0x62, 0x8a, 0xc8, + 0x50, 0x47, 0xd6, 0xc1, 0xb6, 0xed, 0x9a, 0x8e, 0xfd, 0x43, 0x55, 0x40, 0x90, 0x6b, 0x8e, 0xa1, + 0x96, 0x1a, 0x38, 0xba, 0xd6, 0x49, 0xbf, 0x74, 0x25, 0x10, 0x83, 0x65, 0x05, 0x77, 0xa5, 0x6f, + 0xd3, 0x59, 0x4c, 0x84, 0xd9, 0xc4, 0x75, 0xee, 0xb1, 0x2c, 0xbf, 0x0e, 0x4c, 0x61, 0x3a, 0xae, + 0x39, 0x1e, 0xb7, 0xc6, 0x63, 0x47, 0xb0, 0x1c, 0x5d, 0x99, 0x8d, 0xb1, 0xea, 0x3a, 0x00, 0xcb, + 0x37, 0xbf, 0x07, 0xb7, 0x68, 0x64, 0x9e, 0x0a, 0x3f, 0x0a, 0xb4, 0x75, 0x5f, 0x6f, 0xc0, 0x9a, + 0xfa, 0xb5, 0xef, 0x49, 0xf5, 0x98, 0x9c, 0x4f, 0x0e, 0x2b, 0x0a, 0x8d, 0xbe, 0x57, 0x57, 0xd0, + 0x45, 0xd8, 0x08, 0x17, 0xd1, 0x65, 0x9b, 0x3f, 0x2b, 0x02, 0x8f, 0x15, 0xa2, 0x67, 0x0b, 0x7f, + 0xcb, 0x94, 0x66, 0x22, 0x87, 0x5a, 0xbb, 0xb4, 0x0a, 0xe0, 0xc5, 0x35, 0x7c, 0x37, 0xa1, 0x68, + 0x07, 0x18, 0x1a, 0xea, 0x42, 0x5e, 0x0d, 0xf1, 0x5d, 0x80, 0xb1, 0xf0, 0x6d, 0xcf, 0x22, 0x0d, + 0x2a, 0xcc, 0xbd, 0x8f, 0x31, 0xdb, 0xa8, 0xf5, 0xc3, 0x88, 0xc7, 0x48, 0xf0, 0x63, 0x3b, 0x14, + 0xa4, 0xce, 0xd4, 0x8b, 0xd4, 0xe8, 0x24, 0x8a, 0xbf, 0x01, 0xd7, 0xc6, 0xbe, 0xdd, 0x17, 0x6a, + 0x3a, 0x9e, 0x04, 0xd6, 0x26, 0x7d, 0x3d, 0xb0, 0x44, 0x94, 0xf3, 0x1e, 0xa1, 0x06, 0x9a, 0x2e, + 0x05, 0x4c, 0x01, 0x9d, 0x22, 0xeb, 0xab, 0xe3, 0xaa, 0xd4, 0xb5, 0x66, 0xcc, 0x7f, 0xc8, 0xef, + 0x03, 0xd3, 0x0f, 0xf6, 0x6c, 0x77, 0x57, 0xb8, 0x03, 0x39, 0x24, 0xe5, 0xae, 0x19, 0x33, 0x78, + 0xb2, 0x60, 0xea, 0x1b, 0x4d, 0xea, 0x84, 0xa9, 0x62, 0x44, 0xb0, 0xfa, 0x1c, 0x81, 0xe3, 0xf9, + 0x5d, 0xe9, 0xeb, 0x9a, 0xdd, 0x08, 0x46, 0x1f, 0x2a, 0xa0, 0xb6, 0x1e, 0xfa, 0x9e, 0x35, 0xa1, + 0xf3, 0x0f, 0x65, 0xc4, 0xa6, 0xd1, 0x31, 0xe5, 0x9e, 0xe9, 0xea, 0x42, 0xca, 0x5a, 0x92, 0x32, + 0x42, 0x53, 0x4c, 0xe8, 0x05, 0xb1, 0xc0, 0x55, 0x1d, 0x13, 0x26, 0x70, 0x9a, 0x26, 0x16, 0xc5, + 0x22, 0x9a, 0x58, 0x0e, 0xf5, 0xdf, 0xf2, 0x3d, 0xdb, 0x8a, 0x65, 0xa9, 0x9a, 0x9e, 0x19, 0x7c, + 0x82, 0x36, 0x96, 0xc9, 0x53, 0xb4, 0x11, 0xbe, 0xf9, 0xe3, 0x0c, 0x40, 0x3c, 0xf9, 0xa8, 0xf2, + 0x31, 0x14, 0x2f, 0xf1, 0x5b, 0x70, 0x2d, 0x89, 0x76, 0x74, 0x31, 0x2c, 0xe9, 0x7d, 0xfc, 0x60, + 0xcb, 0xbc, 0x08, 0x58, 0x56, 0x5f, 0xde, 0xd6, 0xb8, 0x67, 0x42, 0x50, 0x65, 0xe1, 0x75, 0x60, + 0x31, 0x92, 0x6e, 0xe4, 0x05, 0x2c, 0x9f, 0x26, 0xfd, 0x58, 0x98, 0x7e, 0xc0, 0x0a, 0xcd, 0x1d, + 0x28, 0xaa, 0x63, 0xb0, 0x39, 0x07, 0xd8, 0x2f, 0x57, 0x8d, 0xf2, 0xd7, 0x33, 0x00, 0x5b, 0xaa, + 0x72, 0x1a, 0x77, 0xf1, 0x39, 0x75, 0x01, 0xf3, 0x3c, 0x2a, 0xd3, 0xb2, 0xa8, 0x02, 0x3d, 0x17, + 0x7d, 0xf9, 0x07, 0x41, 0xd4, 0x1c, 0x33, 0xac, 0x1e, 0x53, 0x6b, 0x2e, 0x82, 0xd5, 0x06, 0xb2, + 0xe9, 0xb9, 0xae, 0xe8, 0xe3, 0xf6, 0x13, 0x6d, 0x20, 0x11, 0xaa, 0xf9, 0xa3, 0x2c, 0x54, 0x36, + 0x87, 0xa6, 0x54, 0x1f, 0xca, 0xf9, 0x0e, 0x94, 0x47, 0x22, 0x08, 0xcc, 0x81, 0x08, 0xf4, 0xb1, + 0xcf, 0xf4, 0x99, 0x6d, 0x44, 0xbb, 0xfe, 0xc4, 0xf5, 0x85, 0x69, 0xa9, 0xaf, 0x03, 0x45, 0x5c, + 0x4a, 0x82, 0x2b, 0xa3, 0xe0, 0xfb, 0x25, 0x24, 0xb8, 0xd1, 0xa7, 0x7c, 0xad, 0xe3, 0xf8, 0xdb, + 0xd1, 0xaa, 0xb7, 0x49, 0x54, 0x63, 0x0f, 0xaa, 0x09, 0x56, 0xfe, 0x0a, 0xd4, 0x3c, 0xc7, 0x12, + 0x81, 0xba, 0x1f, 0x18, 0x7f, 0x52, 0x31, 0x85, 0xa4, 0xe2, 0x0d, 0x5c, 0xb9, 0xc2, 0xd7, 0x27, + 0x78, 0x21, 0xd8, 0xfc, 0x5f, 0x25, 0xa8, 0x62, 0xa3, 0xf6, 0x54, 0x1f, 0x66, 0xa6, 0xa3, 0x0e, + 0x25, 0x4f, 0x4b, 0xd6, 0x17, 0x0b, 0xbd, 0x84, 0x4c, 0x5d, 0x10, 0x92, 0x4b, 0x17, 0x84, 0xdc, + 0x86, 0x8a, 0x3a, 0x6e, 0xb2, 0x5a, 0xca, 0x12, 0xe6, 0x8c, 0x18, 0x81, 0xee, 0xca, 0xc8, 0xb3, + 0xc8, 0x1e, 0xb7, 0xd4, 0x79, 0x4c, 0xce, 0x48, 0x60, 0x92, 0x9f, 0x79, 0xaa, 0xa6, 0x3f, 0xf3, + 0x44, 0x95, 0x39, 0x63, 0xe7, 0xa2, 0xe7, 0xe9, 0xd6, 0x76, 0xac, 0xf8, 0x7e, 0x76, 0x1a, 0xcf, + 0x37, 0xa1, 0xa4, 0xa7, 0x45, 0x9f, 0x3a, 0x7d, 0x65, 0xce, 0x4c, 0x68, 0xf2, 0x75, 0xfd, 0x57, + 0x5f, 0x91, 0x32, 0x42, 0x4e, 0xfe, 0x08, 0xaa, 0xa6, 0x94, 0x66, 0x7f, 0x38, 0xd2, 0xf6, 0x33, + 0x37, 0xe7, 0x68, 0x3a, 0x29, 0xa8, 0x15, 0x51, 0x1b, 0x49, 0x4e, 0xbe, 0x01, 0x15, 0x5f, 0x98, + 0xa9, 0xd3, 0xf1, 0x57, 0xae, 0x10, 0x63, 0x84, 0xb4, 0x46, 0xcc, 0x16, 0x7d, 0x5d, 0x14, 0xe2, + 0xaf, 0x8b, 0x36, 0x7e, 0x9a, 0x81, 0x95, 0x74, 0xe3, 0xff, 0x34, 0xbe, 0x76, 0xf7, 0xad, 0xf8, + 0x6b, 0x77, 0x9f, 0xe1, 0xcb, 0x71, 0xbf, 0x9d, 0x01, 0x88, 0xc7, 0x05, 0xf7, 0x48, 0xf5, 0x55, + 0xae, 0xd0, 0x6b, 0x57, 0x10, 0xdf, 0x49, 0x7d, 0xca, 0xe1, 0xed, 0x85, 0x06, 0x39, 0xf1, 0x33, + 0x51, 0xd8, 0xfe, 0x00, 0x56, 0xd2, 0x78, 0xba, 0x10, 0xd0, 0xd9, 0x6d, 0xab, 0x1c, 0x55, 0x67, + 0xaf, 0xf5, 0xa8, 0xad, 0x2f, 0xa2, 0x75, 0xf6, 0x1f, 0xb3, 0x6c, 0xe3, 0x8f, 0x32, 0x50, 0x89, + 0x86, 0x9c, 0x7f, 0x37, 0x39, 0x57, 0xaa, 0x04, 0xe6, 0xad, 0x45, 0xe6, 0x2a, 0xfe, 0xd5, 0x76, + 0xa5, 0x7f, 0x91, 0x98, 0xba, 0x86, 0x07, 0x2b, 0xe9, 0x87, 0x73, 0x8c, 0xe8, 0xa3, 0xb4, 0x11, + 0x7d, 0x73, 0xa1, 0x57, 0x86, 0xa1, 0xea, 0xae, 0x1d, 0x48, 0x6d, 0x5f, 0xdf, 0xcf, 0xbe, 0x97, + 0x69, 0xdc, 0x85, 0xe5, 0xe4, 0xa3, 0xd9, 0xbb, 0xa8, 0xf7, 0xff, 0x28, 0x07, 0x2b, 0xe9, 0x2a, + 0x12, 0xba, 0xdb, 0xa6, 0x2a, 0x98, 0x0e, 0x1c, 0x2b, 0x71, 0x17, 0x80, 0x61, 0x98, 0xac, 0x83, + 0x61, 0x42, 0xac, 0x51, 0x16, 0xcc, 0x1b, 0x09, 0x76, 0x37, 0xf9, 0x45, 0xcf, 0x37, 0x38, 0x84, + 0x77, 0x12, 0xd9, 0x98, 0x57, 0xf4, 0xb7, 0xcd, 0x7e, 0x94, 0xe5, 0xb5, 0x44, 0x45, 0xfa, 0x4f, + 0xd0, 0x13, 0x5c, 0xdd, 0x98, 0xb8, 0x96, 0x23, 0xac, 0x08, 0xfb, 0xd3, 0x24, 0x36, 0x2a, 0x29, + 0xff, 0x51, 0x9e, 0xaf, 0x40, 0xa5, 0x3b, 0x39, 0xd6, 0xe5, 0xe4, 0x7f, 0x29, 0xcf, 0x6f, 0xc2, + 0x9a, 0xa6, 0x8a, 0xab, 0x37, 0xd9, 0x5f, 0xc6, 0x3d, 0x6b, 0xa5, 0xa5, 0xc6, 0x4b, 0x37, 0x94, + 0xfd, 0x95, 0x3c, 0x36, 0x81, 0xae, 0xba, 0xff, 0x55, 0x92, 0x13, 0x5d, 0xfd, 0x61, 0xbf, 0x96, + 0xe7, 0xab, 0x00, 0xdd, 0x5e, 0xf4, 0xa2, 0xdf, 0xc8, 0xf3, 0x2a, 0x14, 0xbb, 0x3d, 0x92, 0xf6, + 0xe3, 0x3c, 0xbf, 0x01, 0x2c, 0x7e, 0xaa, 0x6b, 0x5a, 0xff, 0x86, 0x6a, 0x4c, 0x54, 0xa4, 0xfa, + 0x37, 0xf3, 0xd8, 0xaf, 0x70, 0x94, 0xd9, 0xdf, 0xca, 0x73, 0x06, 0xd5, 0x44, 0x6e, 0x95, 0xfd, + 0xed, 0x3c, 0xe7, 0x50, 0xdb, 0xb3, 0x83, 0xc0, 0x76, 0x07, 0xba, 0x07, 0xbf, 0x4e, 0x6f, 0xde, + 0x8e, 0x6e, 0x2f, 0xb1, 0xdf, 0xcc, 0xf3, 0x5b, 0xc0, 0x93, 0xe7, 0x49, 0xfa, 0xc1, 0xdf, 0x21, + 0x6e, 0xb5, 0x4f, 0x06, 0x1a, 0xf7, 0x77, 0x89, 0x1b, 0x35, 0x41, 0x23, 0x7e, 0x8b, 0x06, 0x64, + 0x33, 0xae, 0x82, 0xd5, 0xf8, 0x9f, 0x10, 0x73, 0x38, 0x99, 0x0a, 0xf7, 0xd3, 0xfc, 0xfd, 0x9f, + 0xd1, 0x79, 0x40, 0xb2, 0x98, 0x8c, 0x2f, 0x43, 0xd9, 0xf1, 0xdc, 0x81, 0x54, 0x5f, 0x52, 0xad, + 0x41, 0x25, 0x18, 0x7a, 0xbe, 0x24, 0x90, 0xae, 0x57, 0xba, 0x74, 0x0d, 0x5f, 0x5d, 0x48, 0x50, + 0x51, 0x9d, 0xca, 0xaf, 0x4a, 0x73, 0xc0, 0xaa, 0x51, 0xfd, 0x6e, 0x3e, 0xaa, 0x31, 0xa6, 0xcf, + 0x01, 0x84, 0xd7, 0xad, 0x59, 0x11, 0x49, 0x27, 0xbe, 0xa3, 0x6a, 0x8d, 0x05, 0x7a, 0xf4, 0xea, + 0x93, 0x89, 0xe3, 0x21, 0x06, 0x0e, 0x15, 0x85, 0xf5, 0xbe, 0x6f, 0xab, 0x8b, 0xbc, 0xba, 0x74, + 0xcf, 0xc2, 0x76, 0x44, 0xd5, 0x29, 0x4c, 0xdc, 0xff, 0x7b, 0x19, 0x58, 0x0e, 0x2f, 0xc1, 0xdb, + 0x03, 0xdb, 0x55, 0xd5, 0xca, 0xe1, 0xf7, 0x69, 0xfb, 0x8e, 0x3d, 0x0e, 0xbf, 0xf7, 0xb8, 0x0a, + 0x55, 0xcb, 0x37, 0x07, 0x2d, 0xd7, 0xda, 0xf2, 0xbd, 0xb1, 0x6a, 0xb6, 0x3a, 0x31, 0x54, 0x55, + 0xd2, 0xcf, 0xc5, 0x31, 0x92, 0x8f, 0x85, 0xcf, 0xf2, 0x54, 0x16, 0x38, 0x34, 0x7d, 0xdb, 0x1d, + 0xb4, 0xcf, 0xa5, 0x70, 0x03, 0x55, 0x2d, 0x5d, 0x85, 0xd2, 0x24, 0x10, 0x7d, 0x33, 0x10, 0xac, + 0x88, 0xc0, 0xf1, 0xc4, 0x76, 0xa4, 0xed, 0xaa, 0xcf, 0x2c, 0x46, 0xe5, 0xd0, 0x65, 0xec, 0x99, + 0x39, 0xb6, 0x59, 0xe5, 0xfe, 0xbf, 0xca, 0x40, 0x95, 0xd4, 0x22, 0xce, 0x89, 0xc7, 0x3e, 0x5a, + 0x15, 0x4a, 0xbb, 0xd1, 0xf7, 0xf6, 0x8a, 0x90, 0x3d, 0x38, 0x55, 0x39, 0x71, 0xad, 0x16, 0xea, + 0xb6, 0xaa, 0xfa, 0xf4, 0x5e, 0x9e, 0x7f, 0x0e, 0x6e, 0x18, 0x62, 0xe4, 0x49, 0xf1, 0xcc, 0xb4, + 0x65, 0xf2, 0x66, 0x52, 0x01, 0xc3, 0x39, 0xf5, 0x28, 0xbc, 0x8a, 0x54, 0xa4, 0x70, 0x0e, 0x5f, + 0x1b, 0x62, 0x4a, 0xd8, 0x7b, 0xc2, 0xe8, 0xf8, 0xae, 0x1c, 0x91, 0x7c, 0xe4, 0xd9, 0x2e, 0xbe, + 0x8d, 0x6e, 0x50, 0x13, 0x86, 0x0e, 0x57, 0x10, 0x05, 0xf7, 0xf7, 0xe1, 0xe6, 0xfc, 0x23, 0x01, + 0x75, 0xb7, 0x9a, 0x3e, 0xf2, 0x4c, 0x77, 0x55, 0x9e, 0xf9, 0xb6, 0xba, 0x04, 0x5b, 0x81, 0xc2, + 0xc1, 0x73, 0x97, 0xd4, 0x62, 0x0d, 0x6a, 0xfb, 0x5e, 0x82, 0x87, 0xe5, 0xee, 0xf7, 0x53, 0xa7, + 0x38, 0xf1, 0xa0, 0x84, 0x8d, 0x58, 0x4a, 0xdc, 0xc3, 0xca, 0xa8, 0xf3, 0x01, 0xfa, 0x3f, 0x1d, + 0xea, 0xbb, 0x13, 0xfa, 0xf4, 0xc4, 0x52, 0xdf, 0x9d, 0x88, 0x9a, 0x99, 0x57, 0x1f, 0xe0, 0x72, + 0xfb, 0xc2, 0x11, 0x16, 0x2b, 0xdc, 0x7f, 0x0f, 0x56, 0x75, 0x57, 0xfb, 0x22, 0x08, 0xc2, 0x7b, + 0x4c, 0x87, 0xbe, 0x7d, 0xa6, 0xbe, 0x6d, 0xb1, 0x0c, 0xe5, 0x43, 0xe1, 0x07, 0x9e, 0x4b, 0xdf, + 0xf5, 0x00, 0x28, 0x76, 0x87, 0xa6, 0x8f, 0xef, 0xb8, 0xff, 0x35, 0x3d, 0x48, 0x4f, 0xce, 0xc3, + 0xad, 0x01, 0xd7, 0x8f, 0xfe, 0xac, 0x8d, 0x29, 0x4d, 0x4d, 0x2e, 0x7d, 0x61, 0x8e, 0x58, 0xf6, + 0xfe, 0x26, 0x54, 0xe8, 0x1a, 0xd4, 0x63, 0xdb, 0xb5, 0xb0, 0xe3, 0x1b, 0xba, 0x24, 0x9f, 0xbe, + 0xb7, 0x74, 0x46, 0xc3, 0x51, 0x56, 0x5f, 0xa6, 0x65, 0x59, 0x7e, 0x13, 0x78, 0x6b, 0x22, 0xbd, + 0x91, 0x49, 0xd7, 0x77, 0x9d, 0x0b, 0xf5, 0x15, 0xe3, 0xdc, 0xfd, 0x6f, 0x03, 0x57, 0x39, 0x36, + 0x4b, 0x9c, 0xdb, 0xee, 0x20, 0xfa, 0x6e, 0x00, 0xd0, 0x47, 0x40, 0x2c, 0x71, 0x1e, 0xde, 0x61, + 0x0b, 0x81, 0xf0, 0x53, 0x24, 0xdb, 0xde, 0xc4, 0xc5, 0x46, 0x3f, 0x85, 0xeb, 0x4a, 0xc5, 0xb0, + 0x17, 0x74, 0x37, 0xf4, 0xd2, 0xc0, 0x5f, 0xdd, 0x61, 0x93, 0x93, 0x20, 0xa2, 0x65, 0x19, 0x6c, + 0x58, 0x14, 0x34, 0xc7, 0xf8, 0xec, 0xfd, 0x26, 0x5c, 0x9b, 0x93, 0xb9, 0x20, 0xa3, 0xae, 0xe2, + 0x37, 0xb6, 0x74, 0xff, 0x43, 0x58, 0x53, 0x66, 0x68, 0x5f, 0xdd, 0xde, 0x0b, 0x87, 0xed, 0x59, + 0x67, 0xbb, 0xa3, 0x46, 0x7a, 0xb3, 0xbd, 0xbb, 0xfb, 0x64, 0xb7, 0x65, 0xb0, 0x0c, 0xe9, 0xc3, + 0x41, 0xef, 0x68, 0xf3, 0x60, 0x7f, 0xbf, 0xbd, 0xd9, 0x6b, 0x6f, 0xb1, 0xec, 0xc6, 0xfd, 0x7f, + 0xfb, 0x8b, 0x3b, 0x99, 0x9f, 0xff, 0xe2, 0x4e, 0xe6, 0xbf, 0xfc, 0xe2, 0x4e, 0xe6, 0xc7, 0x9f, + 0xde, 0x59, 0xfa, 0xf9, 0xa7, 0x77, 0x96, 0xfe, 0xe3, 0xa7, 0x77, 0x96, 0x3e, 0x61, 0xd3, 0xff, + 0x6a, 0xe7, 0xb8, 0x48, 0x21, 0xc3, 0x5b, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x19, 0xb6, 0xd3, + 0x38, 0x85, 0x67, 0x00, 0x00, } func (m *SmartBlockSnapshotBase) Marshal() (dAtA []byte, err error) { @@ -12997,6 +12928,16 @@ func (m *BlockContentWidget) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.AutoAdded { + i-- + if m.AutoAdded { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } if len(m.ViewId) > 0 { i -= len(m.ViewId) copy(dAtA[i:], m.ViewId) @@ -15079,29 +15020,6 @@ func (m *NotificationPayloadOfParticipantPermissionsChange) MarshalToSizedBuffer } return len(dAtA) - i, nil } -func (m *NotificationPayloadOfAutoTypeWidgetAdded) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NotificationPayloadOfAutoTypeWidgetAdded) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.AutoTypeWidgetAdded != nil { - { - size, err := m.AutoTypeWidgetAdded.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintModels(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0x9a - } - return len(dAtA) - i, nil -} func (m *NotificationImport) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -15570,50 +15488,6 @@ func (m *NotificationParticipantPermissionsChange) MarshalToSizedBuffer(dAtA []b return len(dAtA) - i, nil } -func (m *NotificationAutoTypeWidgetAdded) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *NotificationAutoTypeWidgetAdded) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NotificationAutoTypeWidgetAdded) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.WidgetBlockId) > 0 { - i -= len(m.WidgetBlockId) - copy(dAtA[i:], m.WidgetBlockId) - i = encodeVarintModels(dAtA, i, uint64(len(m.WidgetBlockId))) - i-- - dAtA[i] = 0x1a - } - if len(m.TypePluralName) > 0 { - i -= len(m.TypePluralName) - copy(dAtA[i:], m.TypePluralName) - i = encodeVarintModels(dAtA, i, uint64(len(m.TypePluralName))) - i-- - dAtA[i] = 0x12 - } - if len(m.SpaceId) > 0 { - i -= len(m.SpaceId) - copy(dAtA[i:], m.SpaceId) - i = encodeVarintModels(dAtA, i, uint64(len(m.SpaceId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - func (m *Export) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -17917,6 +17791,9 @@ func (m *BlockContentWidget) Size() (n int) { if l > 0 { n += 1 + l + sovModels(uint64(l)) } + if m.AutoAdded { + n += 2 + } return n } @@ -18838,18 +18715,6 @@ func (m *NotificationPayloadOfParticipantPermissionsChange) Size() (n int) { } return n } -func (m *NotificationPayloadOfAutoTypeWidgetAdded) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.AutoTypeWidgetAdded != nil { - l = m.AutoTypeWidgetAdded.Size() - n += 2 + l + sovModels(uint64(l)) - } - return n -} func (m *NotificationImport) Size() (n int) { if m == nil { return 0 @@ -19077,27 +18942,6 @@ func (m *NotificationParticipantPermissionsChange) Size() (n int) { return n } -func (m *NotificationAutoTypeWidgetAdded) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.SpaceId) - if l > 0 { - n += 1 + l + sovModels(uint64(l)) - } - l = len(m.TypePluralName) - if l > 0 { - n += 1 + l + sovModels(uint64(l)) - } - l = len(m.WidgetBlockId) - if l > 0 { - n += 1 + l + sovModels(uint64(l)) - } - return n -} - func (m *Export) Size() (n int) { if m == nil { return 0 @@ -26116,6 +25960,26 @@ func (m *BlockContentWidget) Unmarshal(dAtA []byte) error { } m.ViewId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AutoAdded", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowModels + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.AutoAdded = bool(v != 0) default: iNdEx = preIndex skippy, err := skipModels(dAtA[iNdEx:]) @@ -31727,41 +31591,6 @@ func (m *Notification) Unmarshal(dAtA []byte) error { } m.Payload = &NotificationPayloadOfParticipantPermissionsChange{v} iNdEx = postIndex - case 19: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AutoTypeWidgetAdded", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowModels - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthModels - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthModels - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &NotificationAutoTypeWidgetAdded{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &NotificationPayloadOfAutoTypeWidgetAdded{v} - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipModels(dAtA[iNdEx:]) @@ -33344,152 +33173,6 @@ func (m *NotificationParticipantPermissionsChange) Unmarshal(dAtA []byte) error } return nil } -func (m *NotificationAutoTypeWidgetAdded) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowModels - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: AutoTypeWidgetAdded: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AutoTypeWidgetAdded: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SpaceId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowModels - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthModels - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthModels - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SpaceId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TypePluralName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowModels - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthModels - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthModels - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TypePluralName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WidgetBlockId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowModels - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthModels - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthModels - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WidgetBlockId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipModels(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthModels - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *Export) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pkg/lib/pb/model/protos/models.proto b/pkg/lib/pb/model/protos/models.proto index 080995757..d27fca58d 100644 --- a/pkg/lib/pb/model/protos/models.proto +++ b/pkg/lib/pb/model/protos/models.proto @@ -593,6 +593,7 @@ message Block { Layout layout = 1; int32 limit = 2; string viewId = 3; + bool autoAdded = 4; enum Layout { Link = 0; @@ -1055,7 +1056,6 @@ message Notification { ParticipantRemove participantRemove = 16; ParticipantRequestDecline participantRequestDecline = 17; ParticipantPermissionsChange participantPermissionsChange = 18; - AutoTypeWidgetAdded autoTypeWidgetAdded = 19; } string space = 7; string aclHeadId = 14; @@ -1140,12 +1140,6 @@ message Notification { enum ActionType { CLOSE = 0; } - - message AutoTypeWidgetAdded { - string spaceId = 1; - string typePluralName = 2; // fallback to singular if missing - string widgetBlockId = 3; - } } message Export { diff --git a/util/builtinobjects/builtinobjects.go b/util/builtinobjects/builtinobjects.go index da7661a8f..c366295fe 100644 --- a/util/builtinobjects/builtinobjects.go +++ b/util/builtinobjects/builtinobjects.go @@ -405,7 +405,7 @@ func (b *builtinObjects) createWidgets(ctx session.Context, spaceId string, useC } if err = cache.DoStateCtx(b.objectGetter, ctx, widgetObjectID, func(s *state.State, w widget.Widget) error { for _, targetId := range widgetTargetsToCreate { - if err := w.AddAutoWidget(s, targetId, "", addr.ObjectTypeAllViewId, model.BlockContentWidget_View); err != nil { + if err := w.AddAutoWidget(s, targetId, "", addr.ObjectTypeAllViewId, model.BlockContentWidget_View, ""); err != nil { log.Errorf("failed to create widget block for type '%s': %v", targetId, err) } } From ad48949f80c541fc8ec4b111a6b6daa35603743a Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Fri, 28 Mar 2025 17:38:41 +0100 Subject: [PATCH 109/132] GO-5303 fox --- core/block/editor/widget/widget.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/block/editor/widget/widget.go b/core/block/editor/widget/widget.go index 252320577..5bae98a46 100644 --- a/core/block/editor/widget/widget.go +++ b/core/block/editor/widget/widget.go @@ -21,7 +21,7 @@ const ( DefaultWidgetCollection = "collection" DefaultWidgetBin = "bin" DefaultWidgetRecentOpen = "recentOpen" - autoWidgetBlockIdPrefix = "auto_" // in case blockId is specifically provided to avoid bad tree merges + autoWidgetBlockSuffix = "-wrapper" // in case blockId is specifically provided to avoid bad tree merges ) type Widget interface { @@ -177,8 +177,8 @@ func (w *widget) createBlock(s *state.State, req *pb.RpcBlockCreateWidgetRequest } var wrapperBlockId string - if b.Model().Id != "" { - wrapperBlockId = autoWidgetBlockIdPrefix + b.Model().Id + if b.Model().Id != "" && isAutoAdded { + wrapperBlockId = b.Model().Id + autoWidgetBlockSuffix } wrapper := simple.New(&model.Block{ From ea62935ac5e1b7abf772a1060f23ec7c68476494 Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Fri, 28 Mar 2025 17:40:04 +0100 Subject: [PATCH 110/132] GO-5303 remove notification model changes --- docs/proto.md | 1 - pkg/lib/pb/model/models.pb.go | 1198 +++++++++++++------------- pkg/lib/pb/model/protos/models.proto | 1 - 3 files changed, 578 insertions(+), 622 deletions(-) diff --git a/docs/proto.md b/docs/proto.md index d985af57e..32db412ba 100644 --- a/docs/proto.md +++ b/docs/proto.md @@ -31119,7 +31119,6 @@ Used to decode block meta only, without the content itself | createTime | [int64](#int64) | | | | status | [Notification.Status](#anytype-model-Notification-Status) | | | | isLocal | [bool](#bool) | | | -| isToast | [bool](#bool) | | means it should automatically hide after some time if client window is active | | import | [Notification.Import](#anytype-model-Notification-Import) | | | | export | [Notification.Export](#anytype-model-Notification-Export) | | | | galleryImport | [Notification.GalleryImport](#anytype-model-Notification-GalleryImport) | | | diff --git a/pkg/lib/pb/model/models.pb.go b/pkg/lib/pb/model/models.pb.go index 67122633a..546fd6ea9 100644 --- a/pkg/lib/pb/model/models.pb.go +++ b/pkg/lib/pb/model/models.pb.go @@ -7351,7 +7351,6 @@ type Notification struct { CreateTime int64 `protobuf:"varint,2,opt,name=createTime,proto3" json:"createTime,omitempty"` Status NotificationStatus `protobuf:"varint,4,opt,name=status,proto3,enum=anytype.model.NotificationStatus" json:"status,omitempty"` IsLocal bool `protobuf:"varint,5,opt,name=isLocal,proto3" json:"isLocal,omitempty"` - IsToast bool `protobuf:"varint,3,opt,name=isToast,proto3" json:"isToast,omitempty"` // Types that are valid to be assigned to Payload: // // *NotificationPayloadOfImport @@ -7485,13 +7484,6 @@ func (m *Notification) GetIsLocal() bool { return false } -func (m *Notification) GetIsToast() bool { - if m != nil { - return m.IsToast - } - return false -} - func (m *Notification) GetImport() *NotificationImport { if x, ok := m.GetPayload().(*NotificationPayloadOfImport); ok { return x.Import @@ -9837,585 +9829,584 @@ func init() { } var fileDescriptor_98a910b73321e591 = []byte{ - // 9237 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x7d, 0x5b, 0x8c, 0x23, 0xc9, - 0x91, 0x58, 0xf3, 0x4d, 0x06, 0x9b, 0xdd, 0xd9, 0x39, 0x2f, 0x8a, 0x1a, 0x8d, 0x47, 0xd4, 0x6a, - 0x77, 0x34, 0x5a, 0xf5, 0xec, 0xce, 0xee, 0x6a, 0x57, 0x2b, 0xed, 0x4a, 0xec, 0x6e, 0xf6, 0x34, - 0x77, 0xfa, 0xa5, 0x22, 0x67, 0x46, 0xbb, 0xb8, 0x73, 0xbb, 0x9a, 0x95, 0x4d, 0x96, 0xba, 0x58, - 0x45, 0x55, 0x25, 0x7b, 0xba, 0x05, 0xdb, 0x90, 0x5f, 0x77, 0xbe, 0x3f, 0xd9, 0xf0, 0xd9, 0x3e, - 0x18, 0xc6, 0x49, 0x1f, 0x06, 0x0c, 0xdf, 0x19, 0xfe, 0x12, 0xec, 0xf3, 0x03, 0xf0, 0xf9, 0xcb, - 0x80, 0x7f, 0x64, 0x7f, 0x19, 0xf0, 0x01, 0x36, 0xb4, 0x80, 0x7f, 0x0c, 0xfb, 0x70, 0x06, 0x0c, - 0x08, 0x86, 0x3f, 0x8c, 0x88, 0xcc, 0x7a, 0x91, 0xec, 0x1e, 0xce, 0xde, 0x9d, 0xe1, 0xaf, 0x66, - 0x44, 0x45, 0x44, 0xe5, 0x23, 0x32, 0x32, 0x22, 0x32, 0xb2, 0x1a, 0x5e, 0x19, 0x9f, 0x0e, 0x1e, - 0x38, 0xf6, 0xf1, 0x83, 0xf1, 0xf1, 0x83, 0x91, 0x67, 0x09, 0xe7, 0xc1, 0xd8, 0xf7, 0xa4, 0x17, - 0x28, 0x20, 0x58, 0x27, 0x88, 0xd7, 0x4c, 0xf7, 0x42, 0x5e, 0x8c, 0xc5, 0x3a, 0x61, 0x1b, 0xb7, - 0x07, 0x9e, 0x37, 0x70, 0x84, 0x22, 0x3d, 0x9e, 0x9c, 0x3c, 0x08, 0xa4, 0x3f, 0xe9, 0x4b, 0x45, - 0xdc, 0xfc, 0x79, 0x1e, 0x6e, 0x76, 0x47, 0xa6, 0x2f, 0x37, 0x1c, 0xaf, 0x7f, 0xda, 0x75, 0xcd, - 0x71, 0x30, 0xf4, 0xe4, 0x86, 0x19, 0x08, 0xfe, 0x3a, 0x14, 0x8f, 0x11, 0x19, 0xd4, 0x33, 0x77, - 0x73, 0xf7, 0xaa, 0x0f, 0xaf, 0xaf, 0xa7, 0x04, 0xaf, 0x13, 0x87, 0xa1, 0x69, 0xf8, 0x9b, 0x50, - 0xb2, 0x84, 0x34, 0x6d, 0x27, 0xa8, 0x67, 0xef, 0x66, 0xee, 0x55, 0x1f, 0xde, 0x5a, 0x57, 0x2f, - 0x5e, 0x0f, 0x5f, 0xbc, 0xde, 0xa5, 0x17, 0x1b, 0x21, 0x1d, 0x7f, 0x17, 0xca, 0x27, 0xb6, 0x23, - 0x1e, 0x8b, 0x8b, 0xa0, 0x9e, 0xbb, 0x92, 0x67, 0x23, 0x5b, 0xcf, 0x18, 0x11, 0x31, 0xdf, 0x84, - 0x15, 0x71, 0x2e, 0x7d, 0xd3, 0x10, 0x8e, 0x29, 0x6d, 0xcf, 0x0d, 0xea, 0x79, 0x6a, 0xe1, 0xad, - 0xa9, 0x16, 0x86, 0xcf, 0x89, 0x7d, 0x8a, 0x85, 0xdf, 0x85, 0xaa, 0x77, 0xfc, 0x7d, 0xd1, 0x97, - 0xbd, 0x8b, 0xb1, 0x08, 0xea, 0x85, 0xbb, 0xb9, 0x7b, 0x15, 0x23, 0x89, 0xe2, 0xdf, 0x80, 0x6a, - 0xdf, 0x73, 0x1c, 0xd1, 0x57, 0xef, 0x28, 0x5e, 0xdd, 0xad, 0x24, 0x2d, 0x7f, 0x1b, 0x6e, 0xf8, - 0x62, 0xe4, 0x9d, 0x09, 0x6b, 0x33, 0xc2, 0x52, 0x3f, 0xcb, 0xf4, 0x9a, 0xf9, 0x0f, 0x79, 0x0b, - 0x6a, 0xbe, 0x6e, 0xdf, 0xae, 0xed, 0x9e, 0x06, 0xf5, 0x12, 0x75, 0xeb, 0xf3, 0x97, 0x74, 0x0b, - 0x69, 0x8c, 0x34, 0x07, 0x67, 0x90, 0x3b, 0x15, 0x17, 0xf5, 0xca, 0xdd, 0xcc, 0xbd, 0x8a, 0x81, - 0x3f, 0xf9, 0xfb, 0x50, 0xf7, 0x7c, 0x7b, 0x60, 0xbb, 0xa6, 0xb3, 0xe9, 0x0b, 0x53, 0x0a, 0xab, - 0x67, 0x8f, 0x44, 0x20, 0xcd, 0xd1, 0xb8, 0x0e, 0x77, 0x33, 0xf7, 0x72, 0xc6, 0xa5, 0xcf, 0xf9, - 0x5b, 0x6a, 0x86, 0x3a, 0xee, 0x89, 0x57, 0xaf, 0xea, 0xee, 0xa7, 0xdb, 0xb2, 0xad, 0x1f, 0x1b, - 0x11, 0x61, 0xf3, 0x97, 0x59, 0x28, 0x76, 0x85, 0xe9, 0xf7, 0x87, 0x8d, 0x5f, 0xcf, 0x40, 0xd1, - 0x10, 0xc1, 0xc4, 0x91, 0xbc, 0x01, 0x65, 0x35, 0xb6, 0x1d, 0xab, 0x9e, 0xa1, 0xd6, 0x45, 0xf0, - 0x67, 0xd1, 0x9d, 0x75, 0xc8, 0x8f, 0x84, 0x34, 0xeb, 0x39, 0x1a, 0xa1, 0xc6, 0x54, 0xab, 0xd4, - 0xeb, 0xd7, 0xf7, 0x84, 0x34, 0x0d, 0xa2, 0x6b, 0x7c, 0x9a, 0x81, 0x3c, 0x82, 0xfc, 0x36, 0x54, - 0x86, 0xf6, 0x60, 0xe8, 0xd8, 0x83, 0xa1, 0xd4, 0x0d, 0x89, 0x11, 0xfc, 0x43, 0x58, 0x8d, 0x00, - 0xc3, 0x74, 0x07, 0x02, 0x5b, 0x34, 0x4f, 0xf9, 0xe9, 0xa1, 0x31, 0x4d, 0xcc, 0xeb, 0x50, 0xa2, - 0xf5, 0xd0, 0xb1, 0x48, 0xa3, 0x2b, 0x46, 0x08, 0xa2, 0xba, 0x85, 0x33, 0xf5, 0x58, 0x5c, 0xd4, - 0xf3, 0xf4, 0x34, 0x89, 0xe2, 0x2d, 0x58, 0x0d, 0xc1, 0x2d, 0x3d, 0x1a, 0x85, 0xab, 0x47, 0x63, - 0x9a, 0xbe, 0xf9, 0xa3, 0x3d, 0x28, 0xd0, 0xb2, 0xe4, 0x2b, 0x90, 0xb5, 0xc3, 0x81, 0xce, 0xda, - 0x16, 0x7f, 0x00, 0xc5, 0x13, 0x5b, 0x38, 0xd6, 0x0b, 0x47, 0x58, 0x93, 0xf1, 0x36, 0x2c, 0xfb, - 0x22, 0x90, 0xbe, 0xad, 0xb5, 0x5f, 0x2d, 0xd0, 0x2f, 0xce, 0xb3, 0x01, 0xeb, 0x46, 0x82, 0xd0, - 0x48, 0xb1, 0x61, 0xb7, 0xfb, 0x43, 0xdb, 0xb1, 0x7c, 0xe1, 0x76, 0x2c, 0xb5, 0x4e, 0x2b, 0x46, - 0x12, 0xc5, 0xef, 0xc1, 0xea, 0xb1, 0xd9, 0x3f, 0x1d, 0xf8, 0xde, 0xc4, 0xc5, 0x05, 0xe1, 0xf9, - 0xd4, 0xed, 0x8a, 0x31, 0x8d, 0xe6, 0x6f, 0x40, 0xc1, 0x74, 0xec, 0x81, 0x4b, 0x2b, 0x71, 0x65, - 0x66, 0xd2, 0x55, 0x5b, 0x5a, 0x48, 0x61, 0x28, 0x42, 0xbe, 0x03, 0xb5, 0x33, 0xe1, 0x4b, 0xbb, - 0x6f, 0x3a, 0x84, 0xaf, 0x97, 0x88, 0xb3, 0x39, 0x97, 0xf3, 0x69, 0x92, 0xd2, 0x48, 0x33, 0xf2, - 0x0e, 0x40, 0x80, 0x66, 0x92, 0xa6, 0x53, 0xaf, 0x85, 0xd7, 0xe6, 0x8a, 0xd9, 0xf4, 0x5c, 0x29, - 0x5c, 0xb9, 0xde, 0x8d, 0xc8, 0x77, 0x96, 0x8c, 0x04, 0x33, 0x7f, 0x17, 0xf2, 0x52, 0x9c, 0xcb, - 0xfa, 0xca, 0x15, 0x23, 0x1a, 0x0a, 0xe9, 0x89, 0x73, 0xb9, 0xb3, 0x64, 0x10, 0x03, 0x32, 0xe2, - 0x22, 0xab, 0xaf, 0x2e, 0xc0, 0x88, 0xeb, 0x12, 0x19, 0x91, 0x81, 0x7f, 0x00, 0x45, 0xc7, 0xbc, - 0xf0, 0x26, 0xb2, 0xce, 0x88, 0xf5, 0x4b, 0x57, 0xb2, 0xee, 0x12, 0xe9, 0xce, 0x92, 0xa1, 0x99, - 0xf8, 0xdb, 0x90, 0xb3, 0xec, 0xb3, 0xfa, 0x1a, 0xf1, 0xde, 0xbd, 0x92, 0x77, 0xcb, 0x3e, 0xdb, - 0x59, 0x32, 0x90, 0x9c, 0x6f, 0x42, 0xf9, 0xd8, 0xf3, 0x4e, 0x47, 0xa6, 0x7f, 0x5a, 0xe7, 0xc4, - 0xfa, 0xe5, 0x2b, 0x59, 0x37, 0x34, 0xf1, 0xce, 0x92, 0x11, 0x31, 0x62, 0x97, 0xed, 0xbe, 0xe7, - 0xd6, 0xaf, 0x2d, 0xd0, 0xe5, 0x4e, 0xdf, 0x73, 0xb1, 0xcb, 0xc8, 0x80, 0x8c, 0x8e, 0xed, 0x9e, - 0xd6, 0xaf, 0x2f, 0xc0, 0x88, 0x96, 0x13, 0x19, 0x91, 0x01, 0x9b, 0x6d, 0x99, 0xd2, 0x3c, 0xb3, - 0xc5, 0xf3, 0xfa, 0x8d, 0x05, 0x9a, 0xbd, 0xa5, 0x89, 0xb1, 0xd9, 0x21, 0x23, 0x0a, 0x09, 0x97, - 0x66, 0xfd, 0xe6, 0x02, 0x42, 0x42, 0x8b, 0x8e, 0x42, 0x42, 0x46, 0xfe, 0x67, 0x61, 0xed, 0x44, - 0x98, 0x72, 0xe2, 0x0b, 0x2b, 0xde, 0xe8, 0x6e, 0x91, 0xb4, 0xf5, 0xab, 0xe7, 0x7e, 0x9a, 0x6b, - 0x67, 0xc9, 0x98, 0x15, 0xc5, 0xdf, 0x87, 0x82, 0x63, 0x4a, 0x71, 0x5e, 0xaf, 0x93, 0xcc, 0xe6, - 0x0b, 0x94, 0x42, 0x8a, 0xf3, 0x9d, 0x25, 0x43, 0xb1, 0xf0, 0xef, 0xc1, 0xaa, 0x34, 0x8f, 0x1d, - 0x71, 0x70, 0xa2, 0x09, 0x82, 0xfa, 0xe7, 0x48, 0xca, 0xeb, 0x57, 0xab, 0x73, 0x9a, 0x67, 0x67, - 0xc9, 0x98, 0x16, 0x83, 0xad, 0x22, 0x54, 0xbd, 0xb1, 0x40, 0xab, 0x48, 0x1e, 0xb6, 0x8a, 0x58, - 0xf8, 0x2e, 0x54, 0xe9, 0xc7, 0xa6, 0xe7, 0x4c, 0x46, 0x6e, 0xfd, 0xf3, 0x24, 0xe1, 0xde, 0x8b, - 0x25, 0x28, 0xfa, 0x9d, 0x25, 0x23, 0xc9, 0x8e, 0x93, 0x48, 0xa0, 0xe1, 0x3d, 0xaf, 0xdf, 0x5e, - 0x60, 0x12, 0x7b, 0x9a, 0x18, 0x27, 0x31, 0x64, 0xc4, 0xa5, 0xf7, 0xdc, 0xb6, 0x06, 0x42, 0xd6, - 0xbf, 0xb0, 0xc0, 0xd2, 0x7b, 0x46, 0xa4, 0xb8, 0xf4, 0x14, 0x13, 0xaa, 0x71, 0x7f, 0x68, 0xca, - 0xfa, 0x9d, 0x05, 0xd4, 0x78, 0x73, 0x68, 0x92, 0xad, 0x40, 0x86, 0xc6, 0x0f, 0x61, 0x39, 0x69, - 0x95, 0x39, 0x87, 0xbc, 0x2f, 0x4c, 0xb5, 0x23, 0x94, 0x0d, 0xfa, 0x8d, 0x38, 0x61, 0xd9, 0x92, - 0x76, 0x84, 0xb2, 0x41, 0xbf, 0xf9, 0x4d, 0x28, 0x2a, 0xdf, 0x84, 0x0c, 0x7e, 0xd9, 0xd0, 0x10, - 0xd2, 0x5a, 0xbe, 0x39, 0xa0, 0x7d, 0xab, 0x6c, 0xd0, 0x6f, 0xa4, 0xb5, 0x7c, 0x6f, 0x7c, 0xe0, - 0x92, 0xc1, 0x2e, 0x1b, 0x1a, 0x6a, 0x7c, 0xfa, 0x01, 0x94, 0x74, 0xa3, 0x1a, 0x7f, 0x3f, 0x03, - 0x45, 0x65, 0x50, 0xf8, 0xb7, 0xa1, 0x10, 0xc8, 0x0b, 0x47, 0x50, 0x1b, 0x56, 0x1e, 0x7e, 0x65, - 0x01, 0x23, 0xb4, 0xde, 0x45, 0x06, 0x43, 0xf1, 0x35, 0x0d, 0x28, 0x10, 0xcc, 0x4b, 0x90, 0x33, - 0xbc, 0xe7, 0x6c, 0x89, 0x03, 0x14, 0xd5, 0x64, 0xb1, 0x0c, 0x22, 0xb7, 0xec, 0x33, 0x96, 0x45, - 0xe4, 0x8e, 0x30, 0x2d, 0xe1, 0xb3, 0x1c, 0xaf, 0x41, 0x25, 0x9c, 0x96, 0x80, 0xe5, 0x39, 0x83, - 0xe5, 0xc4, 0x84, 0x07, 0xac, 0xd0, 0xf8, 0x9f, 0x79, 0xc8, 0xe3, 0xfa, 0xe7, 0xaf, 0x40, 0x4d, - 0x9a, 0xfe, 0x40, 0x28, 0x47, 0x38, 0x72, 0x52, 0xd2, 0x48, 0xfe, 0x41, 0xd8, 0x87, 0x2c, 0xf5, - 0xe1, 0xb5, 0x17, 0xda, 0x95, 0x54, 0x0f, 0x12, 0xbb, 0x70, 0x6e, 0xb1, 0x5d, 0x78, 0x1b, 0xca, - 0x68, 0xce, 0xba, 0xf6, 0x0f, 0x05, 0x0d, 0xfd, 0xca, 0xc3, 0xfb, 0x2f, 0x7e, 0x65, 0x47, 0x73, - 0x18, 0x11, 0x2f, 0xef, 0x40, 0xa5, 0x6f, 0xfa, 0x16, 0x35, 0x86, 0x66, 0x6b, 0xe5, 0xe1, 0x57, - 0x5f, 0x2c, 0x68, 0x33, 0x64, 0x31, 0x62, 0x6e, 0x7e, 0x00, 0x55, 0x4b, 0x04, 0x7d, 0xdf, 0x1e, - 0x93, 0x79, 0x53, 0x7b, 0xf1, 0xd7, 0x5e, 0x2c, 0x6c, 0x2b, 0x66, 0x32, 0x92, 0x12, 0xd0, 0x23, - 0xf3, 0x23, 0xfb, 0x56, 0x22, 0x07, 0x21, 0x46, 0x34, 0xdf, 0x85, 0x72, 0xd8, 0x1f, 0xbe, 0x0c, - 0x65, 0xfc, 0xbb, 0xef, 0xb9, 0x82, 0x2d, 0xe1, 0xdc, 0x22, 0xd4, 0x1d, 0x99, 0x8e, 0xc3, 0x32, - 0x7c, 0x05, 0x00, 0xc1, 0x3d, 0x61, 0xd9, 0x93, 0x11, 0xcb, 0x36, 0xbf, 0x19, 0x6a, 0x4b, 0x19, - 0xf2, 0x87, 0xe6, 0x00, 0x39, 0x96, 0xa1, 0x1c, 0x9a, 0x6b, 0x96, 0x41, 0xfe, 0x2d, 0x33, 0x18, - 0x1e, 0x7b, 0xa6, 0x6f, 0xb1, 0x2c, 0xaf, 0x42, 0xa9, 0xe5, 0xf7, 0x87, 0xf6, 0x99, 0x60, 0xb9, - 0xe6, 0x03, 0xa8, 0x26, 0xda, 0x8b, 0x22, 0xf4, 0x4b, 0x2b, 0x50, 0x68, 0x59, 0x96, 0xb0, 0x58, - 0x06, 0x19, 0x74, 0x07, 0x59, 0xb6, 0xf9, 0x55, 0xa8, 0x44, 0xa3, 0x85, 0xe4, 0xb8, 0x71, 0xb3, - 0x25, 0xfc, 0x85, 0x68, 0x96, 0x41, 0xad, 0xec, 0xb8, 0x8e, 0xed, 0x0a, 0x96, 0x6d, 0xfc, 0x39, - 0x52, 0x55, 0xfe, 0xad, 0xf4, 0x82, 0x78, 0xf5, 0x45, 0x3b, 0x6b, 0x7a, 0x35, 0x7c, 0x3e, 0xd1, - 0xbf, 0x5d, 0x9b, 0x1a, 0x57, 0x86, 0xfc, 0x96, 0x27, 0x03, 0x96, 0x69, 0xfc, 0xb7, 0x2c, 0x94, - 0xc3, 0x0d, 0x15, 0x63, 0x82, 0x89, 0xef, 0x68, 0x85, 0xc6, 0x9f, 0xfc, 0x3a, 0x14, 0xa4, 0x2d, - 0xb5, 0x1a, 0x57, 0x0c, 0x05, 0xa0, 0xaf, 0x96, 0x9c, 0x59, 0xe5, 0xc0, 0x4e, 0x4f, 0x95, 0x3d, - 0x32, 0x07, 0x62, 0xc7, 0x0c, 0x86, 0xda, 0x85, 0x8d, 0x11, 0xc8, 0x7f, 0x62, 0x9e, 0xa1, 0xce, - 0xd1, 0x73, 0xe5, 0xc5, 0x25, 0x51, 0xfc, 0x2d, 0xc8, 0x63, 0x07, 0xb5, 0xd2, 0xfc, 0x99, 0xa9, - 0x0e, 0xa3, 0x9a, 0x1c, 0xfa, 0x02, 0xa7, 0x67, 0x1d, 0x23, 0x30, 0x83, 0x88, 0xf9, 0xab, 0xb0, - 0xa2, 0x16, 0xe1, 0x41, 0x18, 0x3f, 0x94, 0x48, 0xf2, 0x14, 0x96, 0xb7, 0x70, 0x38, 0x4d, 0x29, - 0xea, 0xe5, 0x05, 0xf4, 0x3b, 0x1c, 0x9c, 0xf5, 0x2e, 0xb2, 0x18, 0x8a, 0xb3, 0xf9, 0x0e, 0x8e, - 0xa9, 0x29, 0x05, 0x4e, 0x73, 0x7b, 0x34, 0x96, 0x17, 0x4a, 0x69, 0xb6, 0x85, 0xec, 0x0f, 0x6d, - 0x77, 0xc0, 0x32, 0x6a, 0x88, 0x71, 0x12, 0x89, 0xc4, 0xf7, 0x3d, 0x9f, 0xe5, 0x1a, 0x0d, 0xc8, - 0xa3, 0x8e, 0xa2, 0x91, 0x74, 0xcd, 0x91, 0xd0, 0x23, 0x4d, 0xbf, 0x1b, 0xd7, 0x60, 0x6d, 0x66, - 0x3f, 0x6e, 0xfc, 0x5e, 0x51, 0x69, 0x08, 0x72, 0x90, 0x2f, 0xa8, 0x39, 0xc8, 0xcd, 0x7b, 0x29, - 0x1b, 0x83, 0x52, 0xd2, 0x36, 0xe6, 0x03, 0x28, 0x60, 0xc7, 0x42, 0x13, 0xb3, 0x00, 0xfb, 0x1e, - 0x92, 0x1b, 0x8a, 0x0b, 0x23, 0x98, 0xfe, 0x50, 0xf4, 0x4f, 0x85, 0xa5, 0x6d, 0x7d, 0x08, 0xa2, - 0xd2, 0xf4, 0x13, 0xee, 0xb9, 0x02, 0x48, 0x25, 0xfa, 0x9e, 0xdb, 0x1e, 0x79, 0xdf, 0xb7, 0x69, - 0x5e, 0x51, 0x25, 0x42, 0x44, 0xf8, 0xb4, 0x83, 0x3a, 0xa2, 0xa7, 0x2d, 0x46, 0x34, 0xda, 0x50, - 0xa0, 0x77, 0xe3, 0x4a, 0x50, 0x6d, 0x56, 0x99, 0x86, 0x57, 0x17, 0x6b, 0xb3, 0x6e, 0x72, 0xe3, - 0x77, 0xb3, 0x90, 0x47, 0x98, 0xdf, 0x87, 0x82, 0x8f, 0x71, 0x18, 0x0d, 0xe7, 0x65, 0x31, 0x9b, - 0x22, 0xe1, 0xdf, 0xd6, 0xaa, 0x98, 0x5d, 0x40, 0x59, 0xa2, 0x37, 0x26, 0xd5, 0xf2, 0x3a, 0x14, - 0xc6, 0xa6, 0x6f, 0x8e, 0xf4, 0x3a, 0x51, 0x40, 0xf3, 0x27, 0x19, 0xc8, 0x23, 0x11, 0x5f, 0x83, - 0x5a, 0x57, 0xfa, 0xf6, 0xa9, 0x90, 0x43, 0xdf, 0x9b, 0x0c, 0x86, 0x4a, 0x93, 0x1e, 0x8b, 0x0b, - 0x65, 0x6f, 0x94, 0x41, 0x90, 0xa6, 0x63, 0xf7, 0x59, 0x16, 0xb5, 0x6a, 0xc3, 0x73, 0x2c, 0x96, - 0xe3, 0xab, 0x50, 0x7d, 0xe2, 0x5a, 0xc2, 0x0f, 0xfa, 0x9e, 0x2f, 0x2c, 0x96, 0xd7, 0xab, 0xfb, - 0x94, 0x15, 0x68, 0x2f, 0x13, 0xe7, 0x92, 0x62, 0x21, 0x56, 0xe4, 0xd7, 0x60, 0x75, 0x23, 0x1d, - 0x20, 0xb1, 0x12, 0xda, 0xa4, 0x3d, 0xe1, 0xa2, 0x92, 0xb1, 0xb2, 0x52, 0x62, 0xef, 0xfb, 0x36, - 0xab, 0xe0, 0xcb, 0xd4, 0x3a, 0x61, 0xd0, 0xfc, 0x97, 0x99, 0xd0, 0x72, 0xd4, 0xa0, 0x72, 0x68, - 0xfa, 0xe6, 0xc0, 0x37, 0xc7, 0xd8, 0xbe, 0x2a, 0x94, 0xd4, 0xc6, 0xf9, 0xa6, 0xb2, 0x6e, 0x0a, - 0x78, 0xa8, 0x6c, 0xa3, 0x02, 0xde, 0x62, 0xb9, 0x18, 0x78, 0x9b, 0xe5, 0xf1, 0x1d, 0xdf, 0x9d, - 0x78, 0x52, 0xb0, 0x02, 0xd9, 0x3a, 0xcf, 0x12, 0xac, 0x88, 0xc8, 0x1e, 0x5a, 0x14, 0x56, 0xc2, - 0x3e, 0x6f, 0xa2, 0xfe, 0x1c, 0x7b, 0xe7, 0xac, 0x8c, 0xcd, 0xc0, 0x61, 0x14, 0x16, 0xab, 0xe0, - 0x93, 0xfd, 0xc9, 0xe8, 0x58, 0x60, 0x37, 0x01, 0x9f, 0xf4, 0xbc, 0xc1, 0xc0, 0x11, 0xac, 0x8a, - 0x63, 0x90, 0x30, 0xbe, 0x6c, 0x99, 0x2c, 0xad, 0xe9, 0x38, 0xde, 0x44, 0xb2, 0x5a, 0xe3, 0x97, - 0x39, 0xc8, 0x63, 0x74, 0x83, 0x6b, 0x67, 0x88, 0x76, 0x46, 0xaf, 0x1d, 0xfc, 0x1d, 0xad, 0xc0, - 0x6c, 0xbc, 0x02, 0xf9, 0xfb, 0x7a, 0xa6, 0x73, 0x0b, 0x58, 0x59, 0x14, 0x9c, 0x9c, 0x64, 0x0e, - 0xf9, 0x91, 0x3d, 0x12, 0xda, 0xd6, 0xd1, 0x6f, 0xc4, 0x05, 0xb8, 0x1f, 0x17, 0x28, 0x79, 0x42, - 0xbf, 0x71, 0xd5, 0x98, 0xb8, 0x2d, 0xb4, 0x24, 0xad, 0x81, 0x9c, 0x11, 0x82, 0x73, 0xac, 0x57, - 0x65, 0xae, 0xf5, 0xfa, 0x20, 0xb4, 0x5e, 0xa5, 0x05, 0x56, 0x3d, 0x35, 0x33, 0x69, 0xb9, 0x62, - 0xa3, 0x51, 0x5e, 0x9c, 0x3d, 0xb1, 0x99, 0x6c, 0x69, 0xad, 0x8d, 0x37, 0xba, 0xb2, 0x1a, 0x65, - 0x96, 0xc1, 0xd9, 0xa4, 0xe5, 0xaa, 0x6c, 0xde, 0x53, 0xdb, 0x12, 0x1e, 0xcb, 0xd1, 0x46, 0x38, - 0xb1, 0x6c, 0x8f, 0xe5, 0xd1, 0xf3, 0x3a, 0xdc, 0xda, 0x66, 0x85, 0xe6, 0xab, 0x89, 0x2d, 0xa9, - 0x35, 0x91, 0x9e, 0x12, 0x43, 0xea, 0x9b, 0x51, 0xda, 0x78, 0x2c, 0x2c, 0x96, 0x6d, 0x7e, 0x7d, - 0x8e, 0x99, 0xad, 0x41, 0xe5, 0xc9, 0xd8, 0xf1, 0x4c, 0xeb, 0x0a, 0x3b, 0xbb, 0x0c, 0x10, 0x47, - 0xd5, 0x8d, 0x5f, 0x36, 0xe3, 0xed, 0x1c, 0x7d, 0xd1, 0xc0, 0x9b, 0xf8, 0x7d, 0x41, 0x26, 0xa4, - 0x62, 0x68, 0x88, 0x7f, 0x07, 0x0a, 0xf8, 0x3c, 0x4c, 0xe3, 0xdc, 0x5f, 0x28, 0x96, 0x5b, 0x7f, - 0x6a, 0x8b, 0xe7, 0x86, 0x62, 0xe4, 0x77, 0x00, 0xcc, 0xbe, 0xb4, 0xcf, 0x04, 0x22, 0xf5, 0x62, - 0x4f, 0x60, 0xf8, 0x3b, 0x49, 0xf7, 0xe5, 0xea, 0x3c, 0x64, 0xc2, 0xaf, 0xe1, 0x06, 0x54, 0x71, - 0xe9, 0x8e, 0x0f, 0x7c, 0x5c, 0xed, 0xf5, 0x65, 0x62, 0x7c, 0x63, 0xb1, 0xe6, 0x3d, 0x8a, 0x18, - 0x8d, 0xa4, 0x10, 0xfe, 0x04, 0x96, 0x55, 0x4e, 0x4d, 0x0b, 0xad, 0x91, 0xd0, 0x37, 0x17, 0x13, - 0x7a, 0x10, 0x73, 0x1a, 0x29, 0x31, 0xb3, 0x69, 0xc9, 0xc2, 0x4b, 0xa7, 0x25, 0x5f, 0x85, 0x95, - 0x5e, 0x7a, 0x15, 0xa8, 0xad, 0x62, 0x0a, 0xcb, 0x9b, 0xb0, 0x6c, 0x07, 0x71, 0x56, 0x94, 0x72, - 0x24, 0x65, 0x23, 0x85, 0x6b, 0xfc, 0xfb, 0x22, 0xe4, 0x69, 0xe4, 0xa7, 0x73, 0x5c, 0x9b, 0x29, - 0x93, 0xfe, 0x60, 0xf1, 0xa9, 0x9e, 0x5a, 0xf1, 0x64, 0x41, 0x72, 0x09, 0x0b, 0xf2, 0x1d, 0x28, - 0x04, 0x9e, 0x2f, 0xc3, 0xe9, 0x5d, 0x50, 0x89, 0xba, 0x9e, 0x2f, 0x0d, 0xc5, 0xc8, 0xb7, 0xa1, - 0x74, 0x62, 0x3b, 0x12, 0x27, 0x45, 0x0d, 0xde, 0xeb, 0x8b, 0xc9, 0xd8, 0x26, 0x26, 0x23, 0x64, - 0xe6, 0xbb, 0x49, 0x65, 0x2b, 0x92, 0xa4, 0xf5, 0xc5, 0x24, 0xcd, 0xd3, 0xc1, 0xfb, 0xc0, 0xfa, - 0xde, 0x99, 0xf0, 0x8d, 0x44, 0x62, 0x52, 0x6d, 0xd2, 0x33, 0x78, 0xde, 0x80, 0xf2, 0xd0, 0xb6, - 0x04, 0xfa, 0x39, 0x64, 0x63, 0xca, 0x46, 0x04, 0xf3, 0xc7, 0x50, 0xa6, 0xf8, 0x00, 0xad, 0x62, - 0xe5, 0xa5, 0x07, 0x5f, 0x85, 0x2a, 0xa1, 0x00, 0x7c, 0x11, 0xbd, 0x7c, 0xdb, 0x96, 0x94, 0x9f, - 0x2e, 0x1b, 0x11, 0x8c, 0x0d, 0x26, 0x7d, 0x4f, 0x36, 0xb8, 0xaa, 0x1a, 0x3c, 0x8d, 0xe7, 0x6f, - 0xc3, 0x0d, 0xc2, 0x4d, 0x6d, 0x92, 0xb8, 0xd4, 0x50, 0xe8, 0xfc, 0x87, 0xe8, 0xb0, 0x8c, 0xcd, - 0x81, 0xd8, 0xb5, 0x47, 0xb6, 0xac, 0xd7, 0xee, 0x66, 0xee, 0x15, 0x8c, 0x18, 0xc1, 0x5f, 0x87, - 0x35, 0x4b, 0x9c, 0x98, 0x13, 0x47, 0xf6, 0xc4, 0x68, 0xec, 0x98, 0x52, 0x74, 0x2c, 0xd2, 0xd1, - 0x8a, 0x31, 0xfb, 0x80, 0xbf, 0x01, 0xd7, 0x34, 0xf2, 0x20, 0x3a, 0x55, 0xe8, 0x58, 0x94, 0xbe, - 0xab, 0x18, 0xf3, 0x1e, 0x35, 0xf7, 0xb4, 0x19, 0xc6, 0x0d, 0x14, 0xe3, 0xd4, 0xd0, 0x80, 0x06, - 0x52, 0xed, 0xc8, 0x8f, 0x4c, 0xc7, 0x11, 0xfe, 0x85, 0x0a, 0x72, 0x1f, 0x9b, 0xee, 0xb1, 0xe9, - 0xb2, 0x1c, 0xed, 0xb1, 0xa6, 0x23, 0x5c, 0xcb, 0xf4, 0xd5, 0x8e, 0xfc, 0x88, 0x36, 0xf4, 0x42, - 0xf3, 0x1e, 0xe4, 0x69, 0x48, 0x2b, 0x50, 0x50, 0x51, 0x12, 0x45, 0xcc, 0x3a, 0x42, 0x22, 0x8b, - 0xbc, 0x8b, 0xcb, 0x8f, 0x65, 0x1b, 0xff, 0xa0, 0x08, 0xe5, 0x70, 0xf0, 0xc2, 0x33, 0x84, 0x4c, - 0x7c, 0x86, 0x80, 0x6e, 0x5c, 0xf0, 0xd4, 0x0e, 0xec, 0x63, 0xed, 0x96, 0x96, 0x8d, 0x18, 0x81, - 0x9e, 0xd0, 0x73, 0xdb, 0x92, 0x43, 0x5a, 0x33, 0x05, 0x43, 0x01, 0xfc, 0x1e, 0xac, 0x5a, 0x38, - 0x0e, 0x6e, 0xdf, 0x99, 0x58, 0xa2, 0x87, 0xbb, 0xa8, 0x4a, 0x13, 0x4c, 0xa3, 0xf9, 0xc7, 0x00, - 0xd2, 0x1e, 0x89, 0x6d, 0xcf, 0x1f, 0x99, 0x52, 0xc7, 0x06, 0xdf, 0x78, 0x39, 0xad, 0x5e, 0xef, - 0x45, 0x02, 0x8c, 0x84, 0x30, 0x14, 0x8d, 0x6f, 0xd3, 0xa2, 0x4b, 0x9f, 0x49, 0xf4, 0x56, 0x24, - 0xc0, 0x48, 0x08, 0xe3, 0x3d, 0x28, 0x9d, 0x78, 0xfe, 0x68, 0xe2, 0x98, 0x7a, 0xcf, 0x7d, 0xff, - 0x25, 0xe5, 0x6e, 0x2b, 0x6e, 0xb2, 0x3d, 0xa1, 0xa8, 0x38, 0xc7, 0x5d, 0x59, 0x30, 0xc7, 0xdd, - 0xfc, 0x15, 0x80, 0xb8, 0x85, 0xfc, 0x26, 0xf0, 0x3d, 0xcf, 0x95, 0xc3, 0xd6, 0xf1, 0xb1, 0xbf, - 0x21, 0x4e, 0x3c, 0x5f, 0x6c, 0x99, 0xb8, 0xbd, 0xde, 0x80, 0xb5, 0x08, 0xdf, 0x3a, 0x91, 0xc2, - 0x47, 0x34, 0xa9, 0x40, 0x77, 0xe8, 0xf9, 0x52, 0xf9, 0x78, 0xf4, 0xf3, 0x49, 0x97, 0xe5, 0x70, - 0x4b, 0xef, 0x74, 0x0f, 0x58, 0xbe, 0x79, 0x0f, 0x20, 0x1e, 0x5a, 0x8a, 0x85, 0xe8, 0xd7, 0x9b, - 0x0f, 0x75, 0x64, 0x44, 0xd0, 0xc3, 0xb7, 0x59, 0xa6, 0xf9, 0x8b, 0x0c, 0x54, 0x13, 0x5d, 0x4a, - 0xc7, 0xcc, 0x9b, 0xde, 0xc4, 0x95, 0x2a, 0x48, 0xa7, 0x9f, 0x4f, 0x4d, 0x67, 0x82, 0x9b, 0xfb, - 0x1a, 0xd4, 0x08, 0xde, 0xb2, 0x03, 0x69, 0xbb, 0x7d, 0xc9, 0x72, 0x11, 0x89, 0x72, 0x0c, 0xf2, - 0x11, 0xc9, 0xbe, 0xa7, 0x51, 0x05, 0xce, 0x60, 0xf9, 0x50, 0xf8, 0x7d, 0x11, 0x12, 0x91, 0x33, - 0xac, 0x31, 0x11, 0x99, 0x72, 0x86, 0x4d, 0x39, 0xec, 0x4e, 0x46, 0xac, 0x8c, 0x4e, 0x25, 0x02, - 0xad, 0x33, 0xe1, 0xa3, 0x2f, 0x53, 0xc1, 0xf7, 0x20, 0x02, 0x57, 0x83, 0xe9, 0x32, 0x08, 0xa9, - 0xf7, 0x6c, 0x97, 0x55, 0x23, 0xc0, 0x3c, 0x67, 0xcb, 0xd8, 0x7e, 0x0a, 0x1d, 0x58, 0xad, 0xf1, - 0x5f, 0x73, 0x90, 0x47, 0xbb, 0x8e, 0xb1, 0x6e, 0xd2, 0x08, 0xa9, 0xb5, 0x92, 0x44, 0x7d, 0xb6, - 0xdd, 0x08, 0x65, 0x27, 0x77, 0xa3, 0xf7, 0xa0, 0xda, 0x9f, 0x04, 0xd2, 0x1b, 0xd1, 0x56, 0xac, - 0x4f, 0xbb, 0x6e, 0xce, 0x64, 0x8d, 0x68, 0x38, 0x8d, 0x24, 0x29, 0x7f, 0x07, 0x8a, 0x27, 0x4a, - 0xeb, 0x55, 0xde, 0xe8, 0x0b, 0x97, 0xec, 0xd6, 0x5a, 0xb3, 0x35, 0x31, 0xf6, 0xcb, 0x9e, 0x59, - 0xb1, 0x49, 0x94, 0xde, 0x75, 0x8b, 0xd1, 0xae, 0xfb, 0x2b, 0xb0, 0x22, 0x70, 0xc0, 0x0f, 0x1d, - 0xb3, 0x2f, 0x46, 0xc2, 0x0d, 0x97, 0xd9, 0xdb, 0x2f, 0xd1, 0x63, 0x9a, 0x31, 0xea, 0xf6, 0x94, - 0x2c, 0xb4, 0x3c, 0xae, 0x87, 0x9b, 0x7f, 0x18, 0xd8, 0x97, 0x8d, 0x18, 0xd1, 0xfc, 0xb2, 0xb6, - 0x97, 0x25, 0xc8, 0xb5, 0x82, 0xbe, 0xce, 0x80, 0x88, 0xa0, 0xaf, 0xc2, 0xab, 0x4d, 0x1a, 0x0e, - 0x96, 0x6d, 0xbe, 0x09, 0x95, 0xe8, 0x0d, 0xa8, 0x3c, 0xfb, 0x9e, 0xec, 0x8e, 0x45, 0xdf, 0x3e, - 0xb1, 0x85, 0xa5, 0xf4, 0xb3, 0x2b, 0x4d, 0x5f, 0xaa, 0x24, 0x62, 0xdb, 0xb5, 0x58, 0xb6, 0xf1, - 0x3b, 0x65, 0x28, 0xaa, 0xcd, 0x57, 0x77, 0xb8, 0x12, 0x75, 0xf8, 0xbb, 0x50, 0xf6, 0xc6, 0xc2, - 0x37, 0xa5, 0xe7, 0xeb, 0xcc, 0xcd, 0x3b, 0x2f, 0xb3, 0x99, 0xaf, 0x1f, 0x68, 0x66, 0x23, 0x12, - 0x33, 0xad, 0x4d, 0xd9, 0x59, 0x6d, 0xba, 0x0f, 0x2c, 0xdc, 0xb7, 0x0f, 0x7d, 0xe4, 0x93, 0x17, - 0x3a, 0x0e, 0x9f, 0xc1, 0xf3, 0x1e, 0x54, 0xfa, 0x9e, 0x6b, 0xd9, 0x51, 0x16, 0x67, 0xe5, 0xe1, - 0xd7, 0x5f, 0xaa, 0x85, 0x9b, 0x21, 0xb7, 0x11, 0x0b, 0xe2, 0xaf, 0x43, 0xe1, 0x0c, 0xd5, 0x8c, - 0xf4, 0xe9, 0x72, 0x25, 0x54, 0x44, 0xfc, 0x13, 0xa8, 0xfe, 0x60, 0x62, 0xf7, 0x4f, 0x0f, 0x92, - 0x59, 0xc2, 0xf7, 0x5e, 0xaa, 0x15, 0xdf, 0x8d, 0xf9, 0x8d, 0xa4, 0xb0, 0x84, 0x6a, 0x97, 0xfe, - 0x18, 0xaa, 0x5d, 0x9e, 0x55, 0x6d, 0x03, 0x6a, 0xae, 0x08, 0xa4, 0xb0, 0xb6, 0xb5, 0xaf, 0x06, - 0x9f, 0xc1, 0x57, 0x4b, 0x8b, 0x68, 0x7e, 0x09, 0xca, 0xe1, 0x84, 0xf3, 0x22, 0x64, 0xf7, 0x31, - 0x28, 0x2a, 0x42, 0xf6, 0xc0, 0x57, 0xda, 0xd6, 0x42, 0x6d, 0x6b, 0xfe, 0x61, 0x06, 0x2a, 0xd1, - 0xa0, 0xa7, 0x2d, 0x67, 0xfb, 0x07, 0x13, 0xd3, 0x61, 0x19, 0x0a, 0x97, 0x3d, 0xa9, 0x20, 0x32, - 0xd6, 0x8f, 0xe8, 0xb0, 0xde, 0x67, 0x39, 0x72, 0x11, 0x44, 0x10, 0xb0, 0x3c, 0xe7, 0xb0, 0xa2, - 0xd1, 0x07, 0xbe, 0x22, 0x2d, 0xa0, 0xe1, 0xc3, 0xa7, 0x21, 0xa2, 0xa8, 0x3c, 0x8a, 0x53, 0xa1, - 0x0c, 0xe4, 0xbe, 0x27, 0x09, 0x28, 0x63, 0xa3, 0x3a, 0x2e, 0xab, 0xe0, 0x3b, 0xf7, 0x3d, 0xd9, - 0x41, 0x93, 0x18, 0x85, 0x67, 0xd5, 0xf0, 0xf5, 0x04, 0x91, 0x45, 0x6c, 0x39, 0x4e, 0xc7, 0x65, - 0x35, 0xfd, 0x40, 0x41, 0x2b, 0x28, 0xb1, 0x7d, 0x6e, 0xf6, 0x91, 0x7d, 0x15, 0x2d, 0x2c, 0xf2, - 0x68, 0x98, 0xe1, 0x92, 0x6c, 0x9f, 0xdb, 0x81, 0x0c, 0xd8, 0x5a, 0xf3, 0xdf, 0x65, 0xa0, 0x9a, - 0x98, 0x60, 0x0c, 0xff, 0x88, 0x10, 0xb7, 0x32, 0x15, 0x0d, 0x7e, 0x8c, 0xc3, 0xe8, 0x5b, 0xe1, - 0x36, 0xd5, 0xf3, 0xf0, 0x67, 0x16, 0xdf, 0xd7, 0xf3, 0x46, 0x9e, 0xef, 0x7b, 0xcf, 0x95, 0xeb, - 0xb3, 0x6b, 0x06, 0xf2, 0x99, 0x10, 0xa7, 0x2c, 0x8f, 0x5d, 0xdd, 0x9c, 0xf8, 0xbe, 0x70, 0x15, - 0xa2, 0x40, 0x8d, 0x13, 0xe7, 0x0a, 0x2a, 0xa2, 0x50, 0x24, 0xa6, 0x7d, 0x90, 0x95, 0xd0, 0x10, - 0x68, 0x6a, 0x85, 0x29, 0x23, 0x01, 0x92, 0x2b, 0xb0, 0x82, 0x9b, 0x8a, 0xca, 0x50, 0x1c, 0x9c, - 0x6c, 0x99, 0x17, 0x41, 0x6b, 0xe0, 0x31, 0x98, 0x46, 0xee, 0x7b, 0xcf, 0x59, 0xb5, 0x31, 0x01, - 0x88, 0x63, 0x32, 0x8c, 0x45, 0x51, 0x21, 0xa2, 0x33, 0x04, 0x0d, 0xf1, 0x03, 0x00, 0xfc, 0x45, - 0x94, 0x61, 0x40, 0xfa, 0x12, 0x8e, 0x32, 0xf1, 0x19, 0x09, 0x11, 0x8d, 0xbf, 0x00, 0x95, 0xe8, - 0x01, 0xaf, 0x43, 0x89, 0x5c, 0xda, 0xe8, 0xb5, 0x21, 0x88, 0xfe, 0x99, 0xed, 0x5a, 0xe2, 0x9c, - 0xec, 0x4a, 0xc1, 0x50, 0x00, 0xb6, 0x72, 0x68, 0x5b, 0x96, 0x70, 0xc3, 0x93, 0x1e, 0x05, 0xcd, - 0x3b, 0x8f, 0xcf, 0xcf, 0x3d, 0x8f, 0x6f, 0xfc, 0x2a, 0x54, 0x13, 0x41, 0xe3, 0xa5, 0xdd, 0x4e, - 0x34, 0x2c, 0x9b, 0x6e, 0xd8, 0x6d, 0xa8, 0x84, 0x35, 0x20, 0x01, 0xed, 0x6d, 0x15, 0x23, 0x46, - 0x34, 0xfe, 0x69, 0x16, 0x3d, 0x59, 0xec, 0xda, 0x74, 0xa0, 0xb7, 0x0d, 0xc5, 0x40, 0x9a, 0x72, - 0x12, 0x16, 0x33, 0x2c, 0xb8, 0x40, 0xbb, 0xc4, 0xb3, 0xb3, 0x64, 0x68, 0x6e, 0xfe, 0x01, 0xe4, - 0xa4, 0x39, 0xd0, 0x89, 0xd2, 0xaf, 0x2c, 0x26, 0xa4, 0x67, 0x0e, 0x76, 0x96, 0x0c, 0xe4, 0xe3, - 0xbb, 0x50, 0xee, 0xeb, 0xdc, 0x96, 0x36, 0x8a, 0x0b, 0xc6, 0x62, 0x61, 0x46, 0x6c, 0x67, 0xc9, - 0x88, 0x24, 0xf0, 0xef, 0x40, 0x1e, 0xbd, 0x4b, 0x5d, 0xf3, 0xb1, 0x60, 0x8c, 0x89, 0xcb, 0x65, - 0x67, 0xc9, 0x20, 0xce, 0x8d, 0x12, 0x14, 0xc8, 0x06, 0x37, 0xea, 0x50, 0x54, 0x7d, 0x9d, 0x1e, - 0xb9, 0xc6, 0x2d, 0xc8, 0xf5, 0xcc, 0x01, 0x7a, 0xf8, 0xb6, 0x15, 0xe8, 0x54, 0x09, 0xfe, 0x6c, - 0xbc, 0x12, 0xe7, 0xe9, 0x92, 0x29, 0xe0, 0x4c, 0x2a, 0x05, 0xdc, 0x28, 0x42, 0x1e, 0xdf, 0xd8, - 0xb8, 0x7d, 0x55, 0xb4, 0xd0, 0xf8, 0x47, 0x39, 0x0c, 0x2c, 0xa4, 0x38, 0x9f, 0x9b, 0xde, 0xfe, - 0x08, 0x2a, 0x63, 0xdf, 0xeb, 0x8b, 0x20, 0xf0, 0x7c, 0xed, 0x1c, 0xbd, 0xfe, 0xe2, 0xa3, 0xe7, - 0xf5, 0xc3, 0x90, 0xc7, 0x88, 0xd9, 0x9b, 0xff, 0x3a, 0x0b, 0x95, 0xe8, 0x81, 0x8a, 0x67, 0xa4, - 0x38, 0x57, 0xa9, 0xcc, 0x3d, 0xe1, 0x8f, 0x4c, 0xdb, 0x52, 0xd6, 0x63, 0x73, 0x68, 0x86, 0x4e, - 0xee, 0xc7, 0xde, 0x44, 0x4e, 0x8e, 0x85, 0x4a, 0x61, 0x3d, 0xb5, 0x47, 0xc2, 0x63, 0x79, 0x3a, - 0x3c, 0x42, 0xc5, 0xee, 0x3b, 0xde, 0xc4, 0x62, 0x05, 0x84, 0x1f, 0xd1, 0xf6, 0xb6, 0x67, 0x8e, - 0x03, 0x65, 0x33, 0xf7, 0x6c, 0xdf, 0x63, 0x25, 0x64, 0xda, 0xb6, 0x07, 0x23, 0x93, 0x95, 0x51, - 0x58, 0xef, 0xb9, 0x2d, 0xd1, 0x08, 0x57, 0xd0, 0x4d, 0x3d, 0x18, 0x0b, 0xb7, 0x2b, 0x7d, 0x21, - 0xe4, 0x9e, 0x39, 0x56, 0x39, 0x4d, 0x43, 0x58, 0x96, 0x2d, 0x95, 0xfd, 0xdc, 0x36, 0xfb, 0xe2, - 0xd8, 0xf3, 0x4e, 0xd9, 0x32, 0x1a, 0x9a, 0x8e, 0x1b, 0x48, 0x73, 0xe0, 0x9b, 0x23, 0x65, 0x43, - 0x7b, 0xc2, 0x11, 0x04, 0xad, 0xd0, 0xbb, 0x6d, 0x39, 0x9c, 0x1c, 0x3f, 0xc2, 0xb8, 0x6f, 0x55, - 0x9d, 0x33, 0x59, 0x62, 0x2c, 0xd0, 0x86, 0x2e, 0x43, 0x79, 0xc3, 0x76, 0xec, 0x63, 0xdb, 0xb1, - 0xd9, 0x1a, 0x92, 0xb6, 0xcf, 0xfb, 0xa6, 0x63, 0x5b, 0xbe, 0xf9, 0x9c, 0x71, 0x6c, 0xdc, 0x63, - 0xdf, 0x3b, 0xb5, 0xd9, 0x35, 0x24, 0xa4, 0x30, 0xf0, 0xcc, 0xfe, 0x21, 0xbb, 0x4e, 0x67, 0x65, - 0xa7, 0x42, 0xf6, 0x87, 0x27, 0xe6, 0x31, 0xbb, 0x11, 0xa7, 0xf4, 0x6e, 0x36, 0xd6, 0x60, 0x75, - 0xea, 0x54, 0xbe, 0x51, 0xd2, 0xd1, 0x67, 0xa3, 0x06, 0xd5, 0xc4, 0x71, 0x69, 0xe3, 0x55, 0x28, - 0x87, 0x87, 0xa9, 0x18, 0xa5, 0xdb, 0x81, 0x4a, 0x03, 0x6b, 0x25, 0x89, 0xe0, 0xc6, 0x7f, 0xca, - 0x40, 0x51, 0x9d, 0x64, 0xf3, 0x8d, 0xa8, 0xf2, 0x24, 0xb3, 0xc0, 0xe9, 0xa5, 0x62, 0xd2, 0x67, - 0xbf, 0x51, 0xf9, 0xc9, 0x75, 0x28, 0x38, 0x14, 0x8e, 0x6b, 0xf3, 0x45, 0x40, 0xc2, 0xda, 0xe4, - 0x52, 0xd6, 0xe6, 0x36, 0x54, 0xcc, 0x89, 0xf4, 0xe8, 0x90, 0x4e, 0x9f, 0x60, 0xc4, 0x88, 0x66, - 0x2b, 0x3a, 0x8d, 0x0e, 0x13, 0x93, 0xe4, 0x33, 0xf6, 0x7c, 0x21, 0x54, 0xd2, 0x91, 0x62, 0xed, - 0x2c, 0xed, 0x24, 0xde, 0x68, 0x6c, 0xf6, 0x25, 0x21, 0x68, 0x8f, 0x45, 0x53, 0xcb, 0xf2, 0xb8, - 0x06, 0x36, 0x87, 0xa6, 0x6c, 0x9e, 0x40, 0xf9, 0xd0, 0x0b, 0xa6, 0x77, 0xec, 0x12, 0xe4, 0x7a, - 0xde, 0x58, 0xf9, 0x9f, 0x1b, 0x9e, 0x24, 0xff, 0x53, 0x6d, 0xd0, 0x27, 0x52, 0xa9, 0x9c, 0x61, - 0x0f, 0x86, 0x52, 0xc5, 0xe9, 0x1d, 0xd7, 0x15, 0x3e, 0x2b, 0xe0, 0x0c, 0x1b, 0x62, 0x8c, 0x3e, - 0x2f, 0x2b, 0xe2, 0x9c, 0x12, 0x7e, 0xdb, 0xf6, 0x03, 0xc9, 0x4a, 0xcd, 0x0e, 0xee, 0xb5, 0xf6, - 0x80, 0xb6, 0x48, 0xfa, 0x41, 0xa2, 0x96, 0xb0, 0x89, 0x04, 0x6e, 0x0a, 0x17, 0x35, 0x90, 0x62, - 0x2b, 0x15, 0x18, 0xd2, 0x0b, 0xb2, 0xb8, 0xbf, 0x11, 0xfc, 0xd1, 0x24, 0x90, 0xf6, 0xc9, 0x05, - 0xcb, 0x35, 0x9f, 0x41, 0x2d, 0x55, 0xe4, 0xc4, 0xaf, 0x03, 0x4b, 0x21, 0xb0, 0xe9, 0x4b, 0xfc, - 0x16, 0x5c, 0x4b, 0x61, 0xf7, 0x6c, 0xcb, 0xa2, 0x4c, 0xf0, 0xf4, 0x83, 0xb0, 0x83, 0x1b, 0x15, - 0x28, 0xf5, 0xd5, 0x1c, 0x36, 0x0f, 0xa1, 0x46, 0x93, 0xba, 0x27, 0xa4, 0x79, 0xe0, 0x3a, 0x17, - 0x7f, 0xec, 0x4a, 0xb4, 0xe6, 0x57, 0x75, 0xf8, 0x85, 0xd6, 0xe4, 0xc4, 0xf7, 0x46, 0x24, 0xab, - 0x60, 0xd0, 0x6f, 0x94, 0x2e, 0x3d, 0xad, 0x19, 0x59, 0xe9, 0x35, 0x7f, 0x59, 0x81, 0x52, 0xab, - 0xdf, 0xc7, 0x80, 0x71, 0xe6, 0xcd, 0xef, 0x40, 0xb1, 0xef, 0xb9, 0x27, 0xf6, 0x40, 0x5b, 0xeb, - 0x69, 0xbf, 0x51, 0xf3, 0xa1, 0x3a, 0x9e, 0xd8, 0x03, 0x43, 0x13, 0x23, 0x9b, 0xde, 0x6d, 0x0a, - 0x57, 0xb2, 0x29, 0x93, 0x1b, 0x6d, 0x2e, 0x0f, 0x20, 0x6f, 0xbb, 0x27, 0x9e, 0x2e, 0x1b, 0xfd, - 0xfc, 0x25, 0x4c, 0x54, 0x3b, 0x49, 0x84, 0x8d, 0xff, 0x9c, 0x81, 0xa2, 0x7a, 0x35, 0x7f, 0x15, - 0x56, 0x84, 0x8b, 0x4b, 0x2d, 0x34, 0xf4, 0x7a, 0x8d, 0x4d, 0x61, 0xd1, 0xa5, 0xd5, 0x18, 0x71, - 0x3c, 0x19, 0xe8, 0xcc, 0x4c, 0x12, 0xc5, 0xdf, 0x83, 0x5b, 0x0a, 0x3c, 0xf4, 0x85, 0x2f, 0x1c, - 0x61, 0x06, 0x62, 0x73, 0x68, 0xba, 0xae, 0x70, 0xf4, 0xb6, 0x7f, 0xd9, 0x63, 0xde, 0x84, 0x65, - 0xf5, 0xa8, 0x3b, 0x36, 0xfb, 0x22, 0xd0, 0x6b, 0x29, 0x85, 0xe3, 0x5f, 0x83, 0x02, 0x55, 0xd5, - 0xd6, 0xad, 0xab, 0xa7, 0x52, 0x51, 0x35, 0xbc, 0x68, 0x5f, 0x6a, 0x01, 0xa8, 0x61, 0xc2, 0x90, - 0x4c, 0xdb, 0x86, 0x2f, 0x5e, 0x39, 0xae, 0x14, 0x1d, 0x26, 0x98, 0xb0, 0x7d, 0x96, 0x70, 0x04, - 0x95, 0x3f, 0xe2, 0xbe, 0x99, 0xa5, 0x73, 0x97, 0x14, 0xae, 0xf1, 0x07, 0x79, 0xc8, 0xe3, 0x08, - 0x23, 0xf1, 0xd0, 0x1b, 0x89, 0x28, 0xfb, 0xac, 0x1c, 0x91, 0x14, 0x0e, 0x1d, 0x1f, 0x53, 0x15, - 0x00, 0x44, 0x64, 0xca, 0xb4, 0x4c, 0xa3, 0x91, 0x72, 0xec, 0x7b, 0x27, 0xb6, 0x13, 0x53, 0x6a, - 0x17, 0x69, 0x0a, 0xcd, 0xbf, 0x0e, 0x37, 0x47, 0xa6, 0x7f, 0x2a, 0x24, 0xad, 0xee, 0x67, 0x9e, - 0x7f, 0x1a, 0xe0, 0xc8, 0x75, 0x2c, 0x9d, 0xb6, 0xbc, 0xe4, 0x29, 0x7f, 0x1d, 0xd6, 0x9e, 0x87, - 0x60, 0xf4, 0x0e, 0x95, 0x38, 0x9c, 0x7d, 0x80, 0xc6, 0xd8, 0x12, 0x67, 0x36, 0xc9, 0x2d, 0xab, - 0xda, 0xda, 0x10, 0x46, 0x55, 0x32, 0xd5, 0x40, 0x76, 0xf5, 0x9b, 0xf5, 0xf9, 0x53, 0x1a, 0x8b, - 0x76, 0x53, 0xd5, 0x1c, 0x05, 0x1d, 0x8b, 0xf2, 0xae, 0x15, 0x23, 0x46, 0xa0, 0xa2, 0xd1, 0x2b, - 0x9f, 0x2a, 0x93, 0x5b, 0x53, 0x01, 0x6a, 0x02, 0x85, 0x14, 0x52, 0xf4, 0x87, 0xe1, 0x4b, 0x54, - 0x52, 0x34, 0x89, 0xe2, 0x77, 0x00, 0x06, 0xa6, 0x14, 0xcf, 0xcd, 0x8b, 0x27, 0xbe, 0x53, 0x17, - 0xea, 0x20, 0x25, 0xc6, 0x60, 0x88, 0xeb, 0x78, 0x7d, 0xd3, 0xe9, 0x4a, 0xcf, 0x37, 0x07, 0xe2, - 0xd0, 0x94, 0xc3, 0xfa, 0x40, 0x85, 0xb8, 0xd3, 0x78, 0xec, 0xb1, 0xb4, 0x47, 0xe2, 0x13, 0xcf, - 0x15, 0xf5, 0xa1, 0xea, 0x71, 0x08, 0x63, 0x4b, 0x4c, 0xd7, 0x74, 0x2e, 0xa4, 0xdd, 0xc7, 0xbe, - 0xd8, 0xaa, 0x25, 0x09, 0x14, 0x25, 0x15, 0x84, 0xc4, 0x71, 0xec, 0x58, 0xf5, 0xef, 0xab, 0xbe, - 0x46, 0x08, 0x9c, 0x5d, 0x21, 0x87, 0xc2, 0x17, 0x93, 0x51, 0xcb, 0xb2, 0x7c, 0x11, 0x04, 0xf5, - 0x53, 0x35, 0xbb, 0x53, 0xe8, 0xc6, 0x37, 0xe9, 0x98, 0x6b, 0xd8, 0x7c, 0x0b, 0x6a, 0xbb, 0xd8, - 0xc2, 0xd6, 0xd8, 0xee, 0xf6, 0xbd, 0xb1, 0x40, 0x83, 0x4e, 0x09, 0x63, 0x4a, 0x2f, 0x54, 0xa1, - 0xf4, 0x51, 0xe0, 0xb9, 0xad, 0xc3, 0x8e, 0xda, 0x62, 0xb6, 0x27, 0x8e, 0xc3, 0xb2, 0xcd, 0x03, - 0x80, 0x58, 0xb3, 0x71, 0xbb, 0x68, 0xd1, 0x99, 0x12, 0x5b, 0x52, 0xc9, 0x2c, 0xd7, 0xb2, 0xdd, - 0xc1, 0x96, 0x56, 0x66, 0x96, 0x41, 0x24, 0x25, 0x29, 0x84, 0x15, 0x21, 0xc9, 0x9d, 0x21, 0x48, - 0x58, 0x2c, 0xd7, 0xfc, 0x3f, 0x19, 0xa8, 0x26, 0x4a, 0x28, 0xfe, 0x04, 0xcb, 0x3e, 0x70, 0xb3, - 0x47, 0x77, 0x01, 0xe7, 0x4d, 0x29, 0x7a, 0x04, 0xe3, 0xac, 0xea, 0x0a, 0x0f, 0x7c, 0xaa, 0x52, - 0x12, 0x09, 0xcc, 0x67, 0x2a, 0xf9, 0x68, 0x3e, 0xd4, 0x79, 0x9d, 0x2a, 0x94, 0x9e, 0xb8, 0xa7, - 0xae, 0xf7, 0xdc, 0x55, 0xfb, 0x34, 0xd5, 0xf1, 0xa4, 0x4e, 0x24, 0xc3, 0x52, 0x9b, 0x5c, 0xf3, - 0x5f, 0xe4, 0xa7, 0x4a, 0xde, 0xda, 0x50, 0x54, 0xc1, 0x04, 0xf9, 0xb9, 0xb3, 0x35, 0x4a, 0x49, - 0x62, 0x7d, 0xfa, 0x95, 0x40, 0x19, 0x9a, 0x19, 0xbd, 0xfc, 0xa8, 0x20, 0x34, 0x3b, 0xf7, 0x94, - 0x2e, 0x25, 0x28, 0xb4, 0xcd, 0xa9, 0x9a, 0xe8, 0x48, 0x42, 0xe3, 0xaf, 0x65, 0xe0, 0xfa, 0x3c, - 0x92, 0x64, 0xe5, 0x78, 0x26, 0x5d, 0x39, 0xde, 0x9d, 0xaa, 0xc4, 0xce, 0x52, 0x6f, 0x1e, 0xbc, - 0x64, 0x23, 0xd2, 0x75, 0xd9, 0xcd, 0xdf, 0xcb, 0xc0, 0xda, 0x4c, 0x9f, 0x13, 0x7e, 0x0c, 0x40, - 0x51, 0x69, 0x96, 0x2a, 0x94, 0x8a, 0x4a, 0x57, 0xd4, 0xd1, 0x03, 0xed, 0xf0, 0x81, 0xaa, 0x05, - 0xd0, 0xb5, 0xe7, 0xca, 0x89, 0xc6, 0x59, 0xc3, 0x0d, 0x64, 0x20, 0x54, 0x9a, 0x56, 0x39, 0x5b, - 0x1a, 0x53, 0x54, 0x8e, 0xae, 0x3a, 0x1f, 0x61, 0x25, 0x2a, 0xc0, 0x9a, 0x8c, 0x1d, 0xbb, 0x8f, - 0x60, 0x99, 0x37, 0xe0, 0xa6, 0xba, 0x80, 0xa0, 0x83, 0xca, 0x93, 0xde, 0xd0, 0xa6, 0xc5, 0xc1, - 0x2a, 0xf8, 0x9e, 0xc3, 0xc9, 0xb1, 0x63, 0x07, 0x43, 0x06, 0x4d, 0x03, 0xae, 0xcd, 0xe9, 0x20, - 0x35, 0xf9, 0xa9, 0x6e, 0xfe, 0x0a, 0xc0, 0xd6, 0xd3, 0xb0, 0xd1, 0x2c, 0xc3, 0x39, 0xac, 0x6c, - 0x3d, 0x4d, 0x4a, 0xd7, 0x8b, 0xe7, 0x29, 0x5a, 0xaf, 0x80, 0xe5, 0x9a, 0xbf, 0x96, 0x09, 0x2b, - 0x24, 0x1a, 0x7f, 0x1e, 0x6a, 0xaa, 0xc1, 0x87, 0xe6, 0x85, 0xe3, 0x99, 0x16, 0x6f, 0xc3, 0x4a, - 0x10, 0x5d, 0x91, 0x49, 0x6c, 0x58, 0xd3, 0x8e, 0x40, 0x37, 0x45, 0x64, 0x4c, 0x31, 0x85, 0x81, - 0x52, 0x36, 0x3e, 0x56, 0xe1, 0x14, 0xf2, 0x99, 0xb4, 0xe4, 0x96, 0x29, 0x88, 0x33, 0x9b, 0x5f, - 0x83, 0xb5, 0x6e, 0x6c, 0xdc, 0x95, 0x47, 0x8d, 0xca, 0xa1, 0x76, 0x86, 0xad, 0x50, 0x39, 0x34, - 0xd8, 0xfc, 0xc7, 0x25, 0x80, 0xf8, 0x08, 0x69, 0xce, 0x9a, 0x9f, 0x57, 0x11, 0x31, 0x73, 0xa0, - 0x9b, 0x7b, 0xe9, 0x03, 0xdd, 0xf7, 0x22, 0xc7, 0x5e, 0xa5, 0x97, 0xa7, 0xcb, 0xc2, 0xe3, 0x36, - 0x4d, 0xbb, 0xf3, 0xa9, 0x82, 0xa1, 0xc2, 0x74, 0xc1, 0xd0, 0xdd, 0xd9, 0xea, 0xc2, 0x29, 0x63, - 0x14, 0xe7, 0x2d, 0x4a, 0xa9, 0xbc, 0x45, 0x03, 0xca, 0xbe, 0x30, 0x2d, 0xcf, 0x75, 0x2e, 0xc2, - 0x73, 0xc3, 0x10, 0xe6, 0x6f, 0x41, 0x41, 0xd2, 0x2d, 0x9f, 0x32, 0xad, 0x9d, 0x17, 0x4c, 0x9c, - 0xa2, 0x45, 0xcb, 0x66, 0x07, 0xba, 0x24, 0x50, 0xed, 0x9a, 0x65, 0x23, 0x81, 0xe1, 0xeb, 0xc0, - 0x6d, 0x0c, 0xe2, 0x1c, 0x47, 0x58, 0x1b, 0x17, 0x5b, 0xea, 0x38, 0x8f, 0xf6, 0xf5, 0xb2, 0x31, - 0xe7, 0x49, 0x38, 0xff, 0xcb, 0xf1, 0xfc, 0x53, 0x93, 0xcf, 0xec, 0x00, 0x7b, 0x5a, 0x23, 0xf7, - 0x25, 0x82, 0xd1, 0x73, 0x08, 0x17, 0xac, 0x1a, 0x4b, 0xd2, 0xde, 0xf8, 0x4c, 0xfc, 0x92, 0xa7, - 0xe1, 0xf0, 0xaa, 0xc4, 0xcd, 0x2a, 0x09, 0x8d, 0x11, 0x64, 0xc9, 0xfb, 0x9e, 0xbb, 0x8f, 0x1a, - 0xc1, 0xb4, 0x25, 0xd7, 0x30, 0xf6, 0x77, 0xec, 0x4c, 0x7c, 0xd3, 0xa1, 0xa7, 0x6b, 0xca, 0x92, - 0xc7, 0x98, 0xe6, 0xbf, 0xc9, 0x46, 0xc1, 0x53, 0x05, 0x0a, 0xc7, 0x66, 0x60, 0xf7, 0xd5, 0xee, - 0xa6, 0x9d, 0x1e, 0xb5, 0xbb, 0x49, 0xcf, 0xf2, 0x58, 0x16, 0xe3, 0xa0, 0x40, 0xe8, 0xe3, 0x9c, - 0xf8, 0x4e, 0x15, 0xcb, 0xa3, 0x09, 0x08, 0x35, 0x49, 0xd5, 0x0c, 0x11, 0x2b, 0x25, 0xe7, 0xac, - 0xa8, 0x1a, 0x93, 0xc2, 0x6c, 0xda, 0x62, 0x58, 0x19, 0x69, 0x5c, 0x4f, 0x0a, 0x95, 0x9a, 0x24, - 0xbd, 0x67, 0x80, 0x62, 0xc2, 0x4b, 0x02, 0xac, 0x8a, 0x81, 0x49, 0x28, 0x54, 0xe5, 0x13, 0x03, - 0x0a, 0xdb, 0x96, 0x71, 0xdd, 0xa7, 0x1f, 0xb0, 0x1a, 0xb6, 0x28, 0xbe, 0xaa, 0xc5, 0x56, 0x50, - 0xaa, 0x49, 0x95, 0x2c, 0xab, 0xf8, 0xf3, 0x8c, 0xea, 0x5b, 0x18, 0xbe, 0xd5, 0x42, 0xbb, 0xb4, - 0x86, 0x2d, 0x8b, 0x1c, 0x1d, 0xc6, 0x31, 0xee, 0x1a, 0x9b, 0x18, 0x04, 0xd9, 0x63, 0xd3, 0x95, - 0xec, 0x1a, 0x76, 0x75, 0x6c, 0x9d, 0xb0, 0xeb, 0xc8, 0xd2, 0x1f, 0x9a, 0x92, 0xdd, 0x40, 0x1a, - 0xfc, 0xb5, 0x25, 0x7c, 0xd4, 0x14, 0x76, 0x13, 0x69, 0xa4, 0x39, 0x60, 0xb7, 0x9a, 0xbf, 0x19, - 0xd7, 0x43, 0xbf, 0x11, 0x85, 0x27, 0x8b, 0x2c, 0x1f, 0x0c, 0x60, 0xe6, 0xad, 0xe5, 0x36, 0xac, - 0xf9, 0xe2, 0x07, 0x13, 0x3b, 0x75, 0x4b, 0x20, 0x77, 0x75, 0x19, 0xca, 0x2c, 0x47, 0xf3, 0x0c, - 0xd6, 0x42, 0xe0, 0x99, 0x2d, 0x87, 0x94, 0x47, 0xe2, 0x6f, 0x25, 0xae, 0x31, 0x64, 0xe6, 0x5e, - 0xff, 0x8a, 0x44, 0xc6, 0xd7, 0x16, 0xa2, 0x73, 0x82, 0xec, 0x02, 0xe7, 0x04, 0xcd, 0xff, 0x9d, - 0x3c, 0x78, 0x56, 0x01, 0x9b, 0x15, 0x05, 0x6c, 0xb3, 0x07, 0xd1, 0x71, 0xea, 0x3f, 0xfb, 0x32, - 0xa9, 0xff, 0x79, 0x45, 0x1d, 0xef, 0x63, 0xfc, 0x40, 0x2b, 0xf3, 0xe9, 0x02, 0xc7, 0x1a, 0x29, - 0x5a, 0xbe, 0x41, 0xc7, 0xca, 0x66, 0x57, 0x55, 0x1c, 0x15, 0xe6, 0x5e, 0x2a, 0x4a, 0x9e, 0x1f, - 0x6b, 0x4a, 0x23, 0xc1, 0x95, 0xb0, 0x63, 0xc5, 0x79, 0x76, 0x0c, 0x63, 0x67, 0x6d, 0xe1, 0x22, - 0x58, 0x9d, 0x02, 0xa9, 0xdf, 0xa1, 0x78, 0x5a, 0xe3, 0x65, 0x63, 0x06, 0x8f, 0xce, 0xde, 0x68, - 0xe2, 0x48, 0x5b, 0x1f, 0x74, 0x28, 0x60, 0xfa, 0xd6, 0x63, 0x65, 0xf6, 0xd6, 0xe3, 0x87, 0x00, - 0x81, 0xc0, 0xd5, 0xb1, 0x65, 0xf7, 0xa5, 0xae, 0x4b, 0xba, 0x73, 0x59, 0xdf, 0xf4, 0xf1, 0x4c, - 0x82, 0x03, 0xdb, 0x3f, 0x32, 0xcf, 0xe9, 0xc8, 0x56, 0x17, 0x50, 0x44, 0xf0, 0xb4, 0x75, 0x5f, - 0x99, 0xb5, 0xee, 0x6f, 0x41, 0x21, 0x40, 0x17, 0x9a, 0x2e, 0xee, 0x5c, 0x3e, 0xbf, 0xeb, 0xe4, - 0x67, 0x1b, 0x8a, 0x96, 0x12, 0x96, 0x68, 0xff, 0x3c, 0x9f, 0xae, 0xec, 0x54, 0x8c, 0x10, 0x4c, - 0x59, 0xd8, 0x9b, 0x69, 0x0b, 0xdb, 0xb0, 0xa0, 0xa8, 0x0f, 0x1f, 0xa6, 0x13, 0x05, 0x61, 0xda, - 0x32, 0x9b, 0x48, 0x5b, 0x46, 0xd5, 0xaf, 0xb9, 0x64, 0xf5, 0xeb, 0xd4, 0xad, 0xbe, 0xc2, 0xcc, - 0xad, 0xbe, 0xe6, 0x27, 0x50, 0x50, 0x31, 0x01, 0x84, 0xee, 0xa8, 0x72, 0x65, 0xb1, 0x53, 0x2c, - 0xc3, 0xaf, 0x03, 0x0b, 0x04, 0xf9, 0x3a, 0xa2, 0x6b, 0x8e, 0x04, 0x19, 0xc9, 0x2c, 0xaf, 0xc3, - 0x75, 0x45, 0x1b, 0xa4, 0x9f, 0x90, 0xc3, 0xe5, 0xd8, 0xc7, 0xbe, 0xe9, 0x5f, 0xb0, 0x7c, 0xf3, - 0x43, 0x3a, 0xfa, 0x0f, 0x15, 0xaa, 0x1a, 0xdd, 0xa2, 0x54, 0x66, 0xd9, 0xd2, 0xd6, 0x87, 0x2a, - 0x47, 0x74, 0xb4, 0xa7, 0xea, 0xe9, 0x28, 0x9c, 0xa2, 0x7c, 0xd0, 0x72, 0x72, 0x8f, 0xff, 0x13, - 0x5b, 0x6f, 0xcd, 0x8d, 0x84, 0xc7, 0x98, 0x2e, 0x90, 0xcb, 0x2c, 0x5a, 0x20, 0xd7, 0x7c, 0x0c, - 0xab, 0x46, 0xda, 0xa6, 0xf3, 0xf7, 0xa0, 0xe4, 0x8d, 0x93, 0x72, 0x5e, 0xa4, 0x97, 0x21, 0x79, - 0xf3, 0x67, 0x19, 0x58, 0xee, 0xb8, 0x52, 0xf8, 0xae, 0xe9, 0x6c, 0x3b, 0xe6, 0x80, 0xbf, 0x1b, - 0x5a, 0xa9, 0xf9, 0xb9, 0x87, 0x24, 0x6d, 0xda, 0x60, 0x39, 0x3a, 0xc9, 0xce, 0x6f, 0xc0, 0x9a, - 0xb0, 0x6c, 0xe9, 0xf9, 0xca, 0x4f, 0x0e, 0xeb, 0x18, 0xaf, 0x03, 0x53, 0xe8, 0x2e, 0x2d, 0x89, - 0x9e, 0x9a, 0xe6, 0x3a, 0x5c, 0x4f, 0x61, 0x43, 0x27, 0x38, 0xcb, 0x6f, 0x43, 0x3d, 0xde, 0x8d, - 0xb6, 0x3c, 0x57, 0x76, 0x5c, 0x4b, 0x9c, 0x93, 0x93, 0xc5, 0x72, 0xcd, 0xdf, 0x88, 0xdc, 0xbb, - 0xa7, 0xba, 0xca, 0xd1, 0xf7, 0xbc, 0xf8, 0x0a, 0xad, 0x86, 0x12, 0x57, 0xb5, 0xb3, 0x0b, 0x5c, - 0xd5, 0xfe, 0x30, 0xbe, 0x6e, 0xab, 0x36, 0x8a, 0x57, 0xe6, 0xee, 0x3e, 0x54, 0x9c, 0xa5, 0xbd, - 0xfb, 0xae, 0x48, 0xdc, 0xbd, 0x7d, 0x53, 0x87, 0x74, 0xf9, 0x45, 0xbc, 0x60, 0x55, 0xc7, 0xf0, - 0xce, 0xf4, 0x1d, 0x8f, 0xc5, 0x8a, 0x24, 0x67, 0x1c, 0x55, 0x78, 0x69, 0x47, 0xf5, 0xdb, 0x53, - 0xd1, 0x53, 0x79, 0x6e, 0x3a, 0xee, 0x8a, 0x1b, 0xac, 0xdf, 0x86, 0xd2, 0xd0, 0x0e, 0xa4, 0xe7, - 0xab, 0x5b, 0xd5, 0xb3, 0xb7, 0xc0, 0x12, 0xa3, 0xb5, 0xa3, 0x08, 0xa9, 0xa2, 0x2d, 0xe4, 0xe2, - 0xdf, 0x83, 0x35, 0x1a, 0xf8, 0xc3, 0xd8, 0x6b, 0x08, 0xea, 0xd5, 0xb9, 0x95, 0x84, 0x09, 0x51, - 0x1b, 0x53, 0x2c, 0xc6, 0xac, 0x90, 0xc6, 0x00, 0x20, 0x9e, 0x9f, 0x19, 0x2b, 0xf6, 0x19, 0x6e, - 0x55, 0xdf, 0x84, 0x62, 0x30, 0x39, 0x8e, 0x4f, 0xe3, 0x34, 0xd4, 0x38, 0x87, 0xc6, 0x8c, 0x77, - 0x70, 0x28, 0x7c, 0xd5, 0xdc, 0x2b, 0xaf, 0x76, 0x7f, 0x98, 0x9c, 0x78, 0xa5, 0x9c, 0x77, 0x2f, - 0x99, 0xbd, 0x48, 0x72, 0x42, 0x03, 0x1a, 0xef, 0x40, 0x35, 0x31, 0xa8, 0x68, 0x99, 0x27, 0xae, - 0xe5, 0x85, 0x29, 0x60, 0xfc, 0xad, 0xae, 0xb6, 0x59, 0x61, 0x12, 0x98, 0x7e, 0x37, 0x0c, 0x60, - 0xd3, 0x03, 0x78, 0x45, 0x84, 0xfd, 0x0a, 0xd4, 0x12, 0x2e, 0x5d, 0x94, 0x1e, 0x4c, 0x23, 0x9b, - 0x67, 0xf0, 0xf9, 0x84, 0xb8, 0x43, 0xe1, 0x8f, 0xec, 0x00, 0x37, 0x12, 0x15, 0x2c, 0x92, 0x6b, - 0x6d, 0x09, 0x57, 0xda, 0x32, 0xb4, 0xa0, 0x11, 0xcc, 0xbf, 0x09, 0x85, 0xb1, 0xf0, 0x47, 0x81, - 0xb6, 0xa2, 0xd3, 0x1a, 0x34, 0x57, 0x6c, 0x60, 0x28, 0x9e, 0xe6, 0x3f, 0xcc, 0x40, 0x79, 0x4f, - 0x48, 0x13, 0x7d, 0x07, 0xbe, 0x37, 0xf5, 0x96, 0xd9, 0x13, 0xe4, 0x90, 0x74, 0x5d, 0x87, 0xaf, - 0xeb, 0x1d, 0x4d, 0xaf, 0xe1, 0x9d, 0xa5, 0xb8, 0x61, 0x8d, 0x0d, 0x28, 0x69, 0x74, 0xe3, 0x5d, - 0x58, 0x9d, 0xa2, 0xa4, 0x71, 0x51, 0xbe, 0x7d, 0xf7, 0x62, 0x14, 0x96, 0x39, 0x2d, 0x1b, 0x69, - 0xe4, 0x46, 0x05, 0x4a, 0x63, 0xc5, 0xd0, 0xfc, 0x83, 0x1b, 0x54, 0x5c, 0x63, 0x9f, 0x60, 0x4c, - 0x3f, 0x6f, 0x67, 0xbd, 0x03, 0x40, 0x5b, 0xb3, 0x2a, 0xc1, 0x50, 0x29, 0xdb, 0x04, 0x86, 0xbf, - 0x1f, 0xe5, 0xda, 0xf3, 0x73, 0x9d, 0xaa, 0xa4, 0xf0, 0xe9, 0x84, 0x7b, 0x1d, 0x4a, 0x76, 0x40, - 0x79, 0x38, 0x5d, 0xb6, 0x14, 0x82, 0xea, 0x49, 0xcf, 0x33, 0x03, 0xa9, 0x93, 0xde, 0x21, 0xc8, - 0xbf, 0x05, 0x45, 0x7b, 0x34, 0xf6, 0x7c, 0xa9, 0xd3, 0xf4, 0x57, 0xbe, 0xaf, 0x43, 0x94, 0x3b, - 0x4b, 0x86, 0xe6, 0x41, 0x6e, 0x71, 0x4e, 0xdc, 0xe5, 0x17, 0x73, 0xb7, 0xcf, 0x43, 0x6e, 0xc5, - 0xc3, 0xbf, 0x0b, 0xb5, 0x81, 0xaa, 0xe7, 0x54, 0x82, 0xb5, 0x79, 0xf9, 0xca, 0x55, 0x42, 0x1e, - 0x25, 0x19, 0x76, 0x96, 0x8c, 0xb4, 0x04, 0x14, 0x89, 0xae, 0xbd, 0x08, 0x64, 0xcf, 0xfb, 0xc8, - 0xb3, 0x5d, 0x0a, 0x84, 0x5f, 0x20, 0xd2, 0x48, 0x32, 0xa0, 0xc8, 0x94, 0x04, 0xfe, 0x75, 0xf4, - 0x85, 0x02, 0xa9, 0xaf, 0xbc, 0xdf, 0xbd, 0x4a, 0x52, 0x4f, 0x04, 0xfa, 0xb2, 0x7a, 0x20, 0xf9, - 0x39, 0x34, 0x12, 0xcb, 0x47, 0xbf, 0xa4, 0x35, 0x1e, 0xfb, 0x1e, 0x46, 0xd3, 0x35, 0x92, 0xf6, - 0xf5, 0xab, 0xa4, 0x1d, 0x5e, 0xca, 0xbd, 0xb3, 0x64, 0x5c, 0x21, 0x9b, 0xf7, 0x30, 0xe6, 0xd3, - 0x5d, 0xd8, 0x15, 0xe6, 0x59, 0x78, 0x61, 0xfe, 0xfe, 0x42, 0xa3, 0x40, 0x1c, 0x3b, 0x4b, 0xc6, - 0x94, 0x0c, 0xfe, 0xab, 0xb0, 0x96, 0x7a, 0x27, 0xdd, 0x91, 0x55, 0xd7, 0xe9, 0xbf, 0xb6, 0x70, - 0x37, 0x90, 0x69, 0x67, 0xc9, 0x98, 0x95, 0xc4, 0x27, 0xf0, 0xb9, 0xd9, 0x2e, 0x6d, 0x89, 0xbe, - 0x63, 0xbb, 0x42, 0xdf, 0xbc, 0x7f, 0xe7, 0xe5, 0x46, 0x4b, 0x33, 0xef, 0x2c, 0x19, 0x97, 0x4b, - 0xe6, 0x7f, 0x11, 0x6e, 0x8f, 0xe7, 0x1a, 0x1f, 0x65, 0xd4, 0xf4, 0xc5, 0xfd, 0xf7, 0x16, 0x7c, - 0xf3, 0x0c, 0xff, 0xce, 0x92, 0x71, 0xa5, 0x7c, 0xf4, 0xaa, 0x29, 0xb6, 0xd6, 0x65, 0xe7, 0x0a, - 0xa0, 0x33, 0xdc, 0xbe, 0xb3, 0x23, 0x4c, 0x2b, 0x3a, 0x49, 0x88, 0x11, 0x8d, 0xff, 0x9e, 0x81, - 0xa2, 0xd6, 0xf7, 0xdb, 0x51, 0x2d, 0x41, 0x64, 0xd4, 0x63, 0x04, 0xff, 0x00, 0x2a, 0xc2, 0xf7, - 0x3d, 0x7f, 0xd3, 0xb3, 0xc2, 0x32, 0xcc, 0xe9, 0xfc, 0xb3, 0x92, 0xb3, 0xde, 0x0e, 0xc9, 0x8c, - 0x98, 0x83, 0xbf, 0x0f, 0xa0, 0xd6, 0x79, 0x2f, 0xbe, 0x3d, 0xd4, 0x98, 0xcf, 0xaf, 0x0e, 0xa7, - 0x62, 0xea, 0x38, 0x61, 0x17, 0x9e, 0x0c, 0x85, 0x60, 0x14, 0x8a, 0x16, 0x12, 0xa1, 0xe8, 0x6d, - 0x9d, 0x61, 0xa0, 0xc4, 0x8b, 0xbe, 0x43, 0x17, 0x21, 0x1a, 0xbf, 0x9f, 0x81, 0xa2, 0x32, 0x1e, - 0xbc, 0x3d, 0xdb, 0xa3, 0xd7, 0x5e, 0x6c, 0x73, 0xd6, 0xa7, 0x7b, 0xf6, 0x2d, 0x00, 0x65, 0x83, - 0x12, 0x3d, 0xbb, 0x3d, 0x25, 0x47, 0xb3, 0x86, 0x85, 0xcf, 0x31, 0x7d, 0xf3, 0xa1, 0xba, 0xe7, - 0x45, 0xc9, 0xe2, 0x27, 0xbb, 0xbb, 0x6c, 0x89, 0xaf, 0x41, 0xed, 0xc9, 0xfe, 0xe3, 0xfd, 0x83, - 0x67, 0xfb, 0x47, 0x6d, 0xc3, 0x38, 0x30, 0x54, 0xce, 0x78, 0xa3, 0xb5, 0x75, 0xd4, 0xd9, 0x3f, - 0x7c, 0xd2, 0x63, 0xd9, 0xc6, 0x3f, 0xcb, 0x40, 0x2d, 0x65, 0xbb, 0xfe, 0x74, 0xa7, 0x2e, 0x31, - 0xfc, 0xb9, 0xf9, 0xc3, 0x9f, 0xbf, 0x6c, 0xf8, 0x0b, 0xd3, 0xc3, 0xff, 0x3b, 0x19, 0xa8, 0xa5, - 0x6c, 0x64, 0x52, 0x7a, 0x26, 0x2d, 0x3d, 0xe9, 0x03, 0x64, 0xa7, 0x7c, 0x80, 0x26, 0x2c, 0x87, - 0xbf, 0xf7, 0xe3, 0x5c, 0x44, 0x0a, 0x97, 0xa4, 0xa1, 0x8b, 0x16, 0xf9, 0x34, 0x0d, 0x5d, 0xb6, - 0xb8, 0xba, 0xb5, 0x74, 0xb1, 0x34, 0xa0, 0x7b, 0xf7, 0x8d, 0xcb, 0x2d, 0xe8, 0x15, 0x5d, 0x78, - 0x04, 0xd5, 0x71, 0xbc, 0x4c, 0x5f, 0xce, 0x61, 0x49, 0x72, 0xbe, 0xa0, 0x9d, 0xbf, 0x9b, 0x81, - 0x95, 0xb4, 0xcd, 0xfd, 0xff, 0x7a, 0x58, 0xff, 0x49, 0x06, 0xd6, 0x66, 0x2c, 0xf9, 0x95, 0x2e, - 0xdf, 0x74, 0xbb, 0xb2, 0x0b, 0xb4, 0x2b, 0x37, 0xa7, 0x5d, 0x97, 0x5b, 0x92, 0xab, 0x5b, 0xdc, - 0x85, 0xcf, 0x5d, 0xba, 0x27, 0x5c, 0x31, 0xd4, 0x29, 0xa1, 0xb9, 0x69, 0xa1, 0xbf, 0x9d, 0x81, - 0xdb, 0x57, 0xd9, 0xfb, 0xff, 0xe7, 0x7a, 0x35, 0xdd, 0xc2, 0xe6, 0xbb, 0x51, 0x89, 0x41, 0x15, - 0x4a, 0xfa, 0x7b, 0x56, 0xba, 0xc4, 0x7b, 0xe8, 0x3d, 0x77, 0x55, 0x8e, 0xda, 0x10, 0xa6, 0xbe, - 0xf1, 0x6f, 0x88, 0xb1, 0x63, 0xd3, 0xe9, 0xe9, 0x2d, 0x80, 0x16, 0x45, 0x7c, 0xe1, 0x05, 0x9c, - 0xcd, 0xdd, 0x83, 0x6e, 0x9b, 0x2d, 0x25, 0xdd, 0xdb, 0x4f, 0x42, 0x43, 0xdc, 0x3c, 0x84, 0x62, - 0x7c, 0x25, 0x62, 0xcf, 0xf4, 0x4f, 0x2d, 0x75, 0x46, 0xb9, 0x0c, 0xe5, 0x43, 0x1d, 0x5c, 0xa9, - 0x57, 0x7d, 0xd4, 0x3d, 0xd8, 0x57, 0xe9, 0xf0, 0xad, 0x83, 0x9e, 0xba, 0x58, 0xd1, 0x7d, 0xfa, - 0x48, 0x1d, 0x96, 0x3d, 0x32, 0x5a, 0x87, 0x3b, 0x47, 0x44, 0x51, 0x68, 0xfe, 0x56, 0x3e, 0xdc, - 0xd5, 0x9a, 0x86, 0x3e, 0xfd, 0x04, 0x28, 0xa2, 0x35, 0xf7, 0xb4, 0xe0, 0xe8, 0x35, 0x54, 0x0c, - 0xdc, 0x3e, 0x57, 0x19, 0x0a, 0x96, 0xe5, 0x45, 0xc8, 0x1e, 0x1e, 0xab, 0x1a, 0xa5, 0x1d, 0x39, - 0x72, 0xd4, 0x8d, 0xcc, 0xde, 0xb9, 0x64, 0x05, 0xfc, 0xb1, 0x19, 0x9c, 0xb1, 0x62, 0xf3, 0x9f, - 0xe7, 0xa0, 0x12, 0x99, 0xca, 0x97, 0x31, 0xdd, 0x9c, 0xc3, 0x4a, 0x67, 0xbf, 0xd7, 0x36, 0xf6, - 0x5b, 0xbb, 0x9a, 0x24, 0xc7, 0xaf, 0xc1, 0xea, 0x76, 0x67, 0xb7, 0x7d, 0xb4, 0x7b, 0xd0, 0xda, - 0xd2, 0xc8, 0x32, 0xbf, 0x09, 0xbc, 0xb3, 0x77, 0x78, 0x60, 0xf4, 0x8e, 0x3a, 0xdd, 0xa3, 0xcd, - 0xd6, 0xfe, 0x66, 0x7b, 0xb7, 0xbd, 0xc5, 0x8a, 0xfc, 0x15, 0xb8, 0xbb, 0x7f, 0xd0, 0xeb, 0x1c, - 0xec, 0x1f, 0xed, 0x1f, 0x1c, 0x1d, 0x6c, 0x7c, 0xd4, 0xde, 0xec, 0x75, 0x8f, 0x3a, 0xfb, 0x47, - 0x28, 0xf5, 0x91, 0xd1, 0xc2, 0x27, 0xac, 0xc0, 0xef, 0xc2, 0x6d, 0x4d, 0xd5, 0x6d, 0x1b, 0x4f, - 0xdb, 0x06, 0x0a, 0x79, 0xb2, 0xdf, 0x7a, 0xda, 0xea, 0xec, 0xb6, 0x36, 0x76, 0xdb, 0x6c, 0x99, - 0xdf, 0x81, 0x86, 0xa6, 0x30, 0x5a, 0xbd, 0xf6, 0xd1, 0x6e, 0x67, 0xaf, 0xd3, 0x3b, 0x6a, 0x7f, - 0x6f, 0xb3, 0xdd, 0xde, 0x6a, 0x6f, 0xb1, 0x1a, 0xff, 0x0a, 0x7c, 0x99, 0x1a, 0xa5, 0x1b, 0x91, - 0x7e, 0xd9, 0x27, 0x9d, 0xc3, 0xa3, 0x96, 0xb1, 0xb9, 0xd3, 0x79, 0xda, 0x66, 0x2b, 0xfc, 0x35, - 0xf8, 0xd2, 0xe5, 0xa4, 0x5b, 0x1d, 0xa3, 0xbd, 0xd9, 0x3b, 0x30, 0x3e, 0x66, 0x6b, 0xfc, 0x0b, - 0xf0, 0xb9, 0x9d, 0xde, 0xde, 0xee, 0xd1, 0x33, 0xe3, 0x60, 0xff, 0xd1, 0x11, 0xfd, 0xec, 0xf6, - 0x8c, 0x27, 0x9b, 0xbd, 0x27, 0x46, 0x9b, 0x01, 0x6f, 0xc0, 0xcd, 0xc3, 0x8d, 0xa3, 0xfd, 0x83, - 0xde, 0x51, 0x6b, 0xff, 0xe3, 0x8d, 0xdd, 0x83, 0xcd, 0xc7, 0x47, 0xdb, 0x07, 0xc6, 0x5e, 0xab, - 0xc7, 0xaa, 0xfc, 0xab, 0xf0, 0xda, 0x66, 0xf7, 0xa9, 0x6e, 0xe6, 0xc1, 0xf6, 0x91, 0x71, 0xf0, - 0xac, 0x7b, 0x74, 0x60, 0x1c, 0x19, 0xed, 0x5d, 0xea, 0x73, 0x37, 0x6e, 0x7b, 0x89, 0xdf, 0x86, - 0x7a, 0x67, 0xbf, 0xfb, 0x64, 0x7b, 0xbb, 0xb3, 0xd9, 0x69, 0xef, 0xf7, 0x8e, 0x0e, 0xdb, 0xc6, - 0x5e, 0xa7, 0xdb, 0x45, 0x32, 0x56, 0x69, 0x7e, 0x07, 0x8a, 0x1d, 0xf7, 0xcc, 0x96, 0xb4, 0xbe, - 0xb4, 0x32, 0xea, 0x58, 0x2c, 0x04, 0x69, 0x59, 0xd8, 0x03, 0x97, 0xbe, 0x34, 0x40, 0xab, 0x6b, - 0xd9, 0x88, 0x11, 0xcd, 0xdf, 0xcf, 0x41, 0x4d, 0x89, 0x08, 0x63, 0xbb, 0x7b, 0xb0, 0xaa, 0x93, - 0xa4, 0x9d, 0xb4, 0x09, 0x9b, 0x46, 0xd3, 0x27, 0xbc, 0x14, 0x2a, 0x61, 0xc8, 0x92, 0x28, 0x7e, - 0x13, 0x8a, 0x66, 0xdf, 0xc1, 0x00, 0x51, 0x9d, 0x64, 0x6a, 0xe8, 0xb3, 0xda, 0x2e, 0xb4, 0x8b, - 0x8a, 0xb0, 0xef, 0xb9, 0x9b, 0xd1, 0x65, 0x93, 0x14, 0x8e, 0x7f, 0x02, 0xb7, 0x22, 0xb8, 0xed, - 0xf6, 0xfd, 0x8b, 0x71, 0xf4, 0x8d, 0xbd, 0xd2, 0xdc, 0x34, 0xc3, 0xb6, 0xed, 0x88, 0x14, 0xa1, - 0x71, 0x99, 0x00, 0xfe, 0x08, 0xc0, 0xa6, 0xc1, 0x22, 0xff, 0x68, 0xfe, 0x8d, 0xea, 0xd4, 0x68, - 0x6a, 0x48, 0xbb, 0x81, 0xd1, 0x6f, 0xdc, 0x20, 0x06, 0x68, 0x77, 0x1f, 0xeb, 0x4f, 0xf2, 0x2d, - 0x1b, 0x11, 0xdc, 0x7c, 0x00, 0x10, 0x73, 0x71, 0x06, 0xcb, 0xe8, 0x5b, 0xb4, 0x82, 0x3d, 0x31, - 0x3a, 0x16, 0xbe, 0xaa, 0xef, 0x53, 0x98, 0x47, 0xc8, 0xc1, 0x32, 0xcd, 0x3f, 0xcc, 0x24, 0x22, - 0x74, 0x15, 0x81, 0x5f, 0xb9, 0x03, 0xcd, 0x3b, 0x2d, 0xc2, 0x48, 0x58, 0x0f, 0xaa, 0x76, 0x8c, - 0x34, 0xc8, 0x0f, 0x81, 0xdb, 0xb3, 0x43, 0x99, 0x5f, 0x70, 0x28, 0xe7, 0xf0, 0x4e, 0x27, 0xfb, - 0x0b, 0xb3, 0xc9, 0xfe, 0x3b, 0x00, 0x03, 0xc7, 0x3b, 0xd6, 0x27, 0x8e, 0x45, 0x5d, 0x11, 0x14, - 0x61, 0x9a, 0x0e, 0x94, 0xc3, 0xef, 0x0b, 0xa2, 0x8e, 0xd1, 0x17, 0x06, 0xa3, 0xd4, 0xa7, 0x82, - 0xf8, 0x0e, 0xac, 0x88, 0x74, 0x9b, 0xb3, 0x0b, 0xb6, 0x79, 0x8a, 0xaf, 0xf9, 0x0d, 0x58, 0x9b, - 0x21, 0xc2, 0x41, 0x1c, 0x9b, 0x32, 0xfa, 0xc8, 0x00, 0xfe, 0x9e, 0x3d, 0xc8, 0x6f, 0xfe, 0x87, - 0x2c, 0x2c, 0xef, 0x99, 0xae, 0x7d, 0x22, 0x02, 0x19, 0xb6, 0x36, 0xe8, 0x0f, 0xc5, 0xc8, 0x0c, - 0x5b, 0xab, 0x20, 0x9d, 0x0f, 0xc9, 0x26, 0x4f, 0x1a, 0x66, 0x0e, 0xa6, 0x70, 0x35, 0x4d, 0xe4, - 0x30, 0xaa, 0xbb, 0xd7, 0x10, 0xce, 0x9d, 0x63, 0xf7, 0x85, 0x1b, 0x84, 0x2b, 0x26, 0x04, 0xe3, - 0xba, 0x9e, 0xe2, 0x15, 0x75, 0x3d, 0xa5, 0xd9, 0xf1, 0xbf, 0x0b, 0xd5, 0xa0, 0xef, 0x0b, 0xe1, - 0x06, 0x43, 0x4f, 0x86, 0xdf, 0xa6, 0x4c, 0xa2, 0xa8, 0xc8, 0xce, 0x7b, 0xee, 0xa2, 0x8e, 0xef, - 0xda, 0xee, 0xa9, 0xae, 0x1d, 0x4b, 0xe1, 0x50, 0x07, 0x29, 0x1b, 0x64, 0xff, 0x50, 0x50, 0xbe, - 0xa1, 0x60, 0x44, 0x30, 0xe5, 0x7b, 0x4c, 0x29, 0x06, 0x9e, 0x6f, 0x0b, 0x95, 0xf4, 0xac, 0x18, - 0x09, 0x0c, 0xf2, 0x3a, 0xa6, 0x3b, 0x98, 0x98, 0x03, 0xa1, 0x0f, 0xc6, 0x23, 0xb8, 0xf9, 0x3f, - 0x0a, 0x00, 0x6a, 0x35, 0x04, 0x43, 0x7b, 0x4c, 0x87, 0x32, 0xb6, 0xae, 0x36, 0xae, 0x19, 0xf4, - 0x9b, 0xbf, 0x97, 0xba, 0x08, 0x30, 0x7b, 0x8c, 0x1a, 0xb3, 0x4f, 0x27, 0x8b, 0x70, 0x70, 0x4c, - 0x29, 0x74, 0x49, 0x15, 0x8d, 0x7f, 0xde, 0x48, 0xa2, 0xa8, 0xa8, 0xce, 0x94, 0xa2, 0xed, 0x5a, - 0x2a, 0x19, 0x95, 0x37, 0x22, 0x98, 0xae, 0x12, 0x05, 0xad, 0x89, 0xf4, 0x0c, 0xe1, 0x8a, 0xe7, - 0xd1, 0x2d, 0xb9, 0x18, 0xc5, 0xf7, 0xa0, 0x36, 0x36, 0x2f, 0x46, 0xc2, 0x95, 0x7b, 0x42, 0x0e, - 0x3d, 0x4b, 0xd7, 0x3f, 0xbd, 0x76, 0x79, 0x03, 0x0f, 0x93, 0xe4, 0x46, 0x9a, 0x1b, 0x75, 0xc2, - 0x0d, 0x68, 0x95, 0xa8, 0x69, 0xd4, 0x10, 0xdf, 0x00, 0x50, 0xbf, 0x12, 0x96, 0x6a, 0x26, 0x0b, - 0x65, 0x8e, 0x44, 0x20, 0xfc, 0x33, 0x5b, 0x59, 0x57, 0x65, 0xa4, 0x62, 0x2e, 0xb4, 0xc5, 0x93, - 0x40, 0xf8, 0xed, 0x91, 0x69, 0x3b, 0x7a, 0x82, 0x63, 0x04, 0x7f, 0x1b, 0x6e, 0x04, 0x93, 0x63, - 0xd4, 0x99, 0x63, 0xd1, 0xf3, 0xf6, 0xc5, 0xf3, 0xc0, 0x11, 0x52, 0x0a, 0x5f, 0xd7, 0x58, 0xcc, - 0x7f, 0xd8, 0x1c, 0x44, 0x6e, 0x18, 0x7d, 0x07, 0x05, 0x7f, 0xc5, 0x85, 0x5c, 0x11, 0x4a, 0x57, - 0xb9, 0xb1, 0x0c, 0x9a, 0x3f, 0x85, 0xd2, 0x45, 0x70, 0x59, 0xfe, 0x65, 0xf8, 0x62, 0x8a, 0xc8, - 0x50, 0x47, 0xd6, 0xc1, 0xb6, 0xed, 0x9a, 0x8e, 0xfd, 0x43, 0x55, 0x40, 0x90, 0x6b, 0x8e, 0xa1, - 0x96, 0x1a, 0x38, 0xba, 0xd6, 0x49, 0xbf, 0x74, 0x25, 0x10, 0x83, 0x65, 0x05, 0x77, 0xa5, 0x6f, - 0xd3, 0x59, 0x4c, 0x84, 0xd9, 0xc4, 0x75, 0xee, 0xb1, 0x2c, 0xbf, 0x0e, 0x4c, 0x61, 0x3a, 0xae, - 0x39, 0x1e, 0xb7, 0xc6, 0x63, 0x47, 0xb0, 0x1c, 0x5d, 0x99, 0x8d, 0xb1, 0xea, 0x3a, 0x00, 0xcb, - 0x37, 0xbf, 0x07, 0xb7, 0x68, 0x64, 0x9e, 0x0a, 0x3f, 0x0a, 0xb4, 0x75, 0x5f, 0x6f, 0xc0, 0x9a, - 0xfa, 0xb5, 0xef, 0x49, 0xf5, 0x98, 0x9c, 0x4f, 0x0e, 0x2b, 0x0a, 0x8d, 0xbe, 0x57, 0x57, 0xd0, - 0x45, 0xd8, 0x08, 0x17, 0xd1, 0x65, 0x9b, 0x3f, 0x2b, 0x02, 0x8f, 0x15, 0xa2, 0x67, 0x0b, 0x7f, - 0xcb, 0x94, 0x66, 0x22, 0x87, 0x5a, 0xbb, 0xb4, 0x0a, 0xe0, 0xc5, 0x35, 0x7c, 0x37, 0xa1, 0x68, - 0x07, 0x18, 0x1a, 0xea, 0x42, 0x5e, 0x0d, 0xf1, 0x5d, 0x80, 0xb1, 0xf0, 0x6d, 0xcf, 0x22, 0x0d, - 0x2a, 0xcc, 0xbd, 0x8f, 0x31, 0xdb, 0xa8, 0xf5, 0xc3, 0x88, 0xc7, 0x48, 0xf0, 0x63, 0x3b, 0x14, - 0xa4, 0xce, 0xd4, 0x8b, 0xd4, 0xe8, 0x24, 0x8a, 0xbf, 0x01, 0xd7, 0xc6, 0xbe, 0xdd, 0x17, 0x6a, - 0x3a, 0x9e, 0x04, 0xd6, 0x26, 0x7d, 0x3d, 0xb0, 0x44, 0x94, 0xf3, 0x1e, 0xa1, 0x06, 0x9a, 0x2e, - 0x05, 0x4c, 0x01, 0x9d, 0x22, 0xeb, 0xab, 0xe3, 0xaa, 0xd4, 0xb5, 0x66, 0xcc, 0x7f, 0xc8, 0xef, - 0x03, 0xd3, 0x0f, 0xf6, 0x6c, 0x77, 0x57, 0xb8, 0x03, 0x39, 0x24, 0xe5, 0xae, 0x19, 0x33, 0x78, - 0xb2, 0x60, 0xea, 0x1b, 0x4d, 0xea, 0x84, 0xa9, 0x62, 0x44, 0xb0, 0xfa, 0x1c, 0x81, 0xe3, 0xf9, - 0x5d, 0xe9, 0xeb, 0x9a, 0xdd, 0x08, 0x46, 0x1f, 0x2a, 0xa0, 0xb6, 0x1e, 0xfa, 0x9e, 0x35, 0xa1, - 0xf3, 0x0f, 0x65, 0xc4, 0xa6, 0xd1, 0x31, 0xe5, 0x9e, 0xe9, 0xea, 0x42, 0xca, 0x5a, 0x92, 0x32, - 0x42, 0x53, 0x4c, 0xe8, 0x05, 0xb1, 0xc0, 0x55, 0x1d, 0x13, 0x26, 0x70, 0x9a, 0x26, 0x16, 0xc5, - 0x22, 0x9a, 0x58, 0x0e, 0xf5, 0xdf, 0xf2, 0x3d, 0xdb, 0x8a, 0x65, 0xa9, 0x9a, 0x9e, 0x19, 0x7c, - 0x82, 0x36, 0x96, 0xc9, 0x53, 0xb4, 0x11, 0xbe, 0xf9, 0xe3, 0x0c, 0x40, 0x3c, 0xf9, 0xa8, 0xf2, - 0x31, 0x14, 0x2f, 0xf1, 0x5b, 0x70, 0x2d, 0x89, 0x76, 0x74, 0x31, 0x2c, 0xe9, 0x7d, 0xfc, 0x60, - 0xcb, 0xbc, 0x08, 0x58, 0x56, 0x5f, 0xde, 0xd6, 0xb8, 0x67, 0x42, 0x50, 0x65, 0xe1, 0x75, 0x60, - 0x31, 0x92, 0x6e, 0xe4, 0x05, 0x2c, 0x9f, 0x26, 0xfd, 0x58, 0x98, 0x7e, 0xc0, 0x0a, 0xcd, 0x1d, - 0x28, 0xaa, 0x63, 0xb0, 0x39, 0x07, 0xd8, 0x2f, 0x57, 0x8d, 0xf2, 0xd7, 0x33, 0x00, 0x5b, 0xaa, - 0x72, 0x1a, 0x77, 0xf1, 0x39, 0x75, 0x01, 0xf3, 0x3c, 0x2a, 0xd3, 0xb2, 0xa8, 0x02, 0x3d, 0x17, - 0x7d, 0xf9, 0x07, 0x41, 0xd4, 0x1c, 0x33, 0xac, 0x1e, 0x53, 0x6b, 0x2e, 0x82, 0xd5, 0x06, 0xb2, - 0xe9, 0xb9, 0xae, 0xe8, 0xe3, 0xf6, 0x13, 0x6d, 0x20, 0x11, 0xaa, 0xf9, 0xa3, 0x2c, 0x54, 0x36, - 0x87, 0xa6, 0x54, 0x1f, 0xca, 0xf9, 0x0e, 0x94, 0x47, 0x22, 0x08, 0xcc, 0x81, 0x08, 0xf4, 0xb1, - 0xcf, 0xf4, 0x99, 0x6d, 0x44, 0xbb, 0xfe, 0xc4, 0xf5, 0x85, 0x69, 0xa9, 0xaf, 0x03, 0x45, 0x5c, - 0x4a, 0x82, 0x2b, 0xa3, 0xe0, 0xfb, 0x25, 0x24, 0xb8, 0xd1, 0xa7, 0x7c, 0xad, 0xe3, 0xf8, 0xdb, - 0xd1, 0xaa, 0xb7, 0x49, 0x54, 0x63, 0x0f, 0xaa, 0x09, 0x56, 0xfe, 0x0a, 0xd4, 0x3c, 0xc7, 0x12, - 0x81, 0xba, 0x1f, 0x18, 0x7f, 0x52, 0x31, 0x85, 0xa4, 0xe2, 0x0d, 0x5c, 0xb9, 0xc2, 0xd7, 0x27, - 0x78, 0x21, 0xd8, 0xfc, 0x5f, 0x25, 0xa8, 0x62, 0xa3, 0xf6, 0x54, 0x1f, 0x66, 0xa6, 0xa3, 0x0e, - 0x25, 0x4f, 0x4b, 0xd6, 0x17, 0x0b, 0xbd, 0x84, 0x4c, 0x5d, 0x10, 0x92, 0x4b, 0x17, 0x84, 0xdc, - 0x86, 0x8a, 0x3a, 0x6e, 0xb2, 0x5a, 0xca, 0x12, 0xe6, 0x8c, 0x18, 0x81, 0xee, 0xca, 0xc8, 0xb3, - 0xc8, 0x1e, 0xb7, 0xd4, 0x79, 0x4c, 0xce, 0x48, 0x60, 0x92, 0x9f, 0x79, 0xaa, 0xa6, 0x3f, 0xf3, - 0x44, 0x95, 0x39, 0x63, 0xe7, 0xa2, 0xe7, 0xe9, 0xd6, 0x76, 0xac, 0xf8, 0x7e, 0x76, 0x1a, 0xcf, - 0x37, 0xa1, 0xa4, 0xa7, 0x45, 0x9f, 0x3a, 0x7d, 0x65, 0xce, 0x4c, 0x68, 0xf2, 0x75, 0xfd, 0x57, - 0x5f, 0x91, 0x32, 0x42, 0x4e, 0xfe, 0x08, 0xaa, 0xa6, 0x94, 0x66, 0x7f, 0x38, 0xd2, 0xf6, 0x33, - 0x37, 0xe7, 0x68, 0x3a, 0x29, 0xa8, 0x15, 0x51, 0x1b, 0x49, 0x4e, 0xbe, 0x01, 0x15, 0x5f, 0x98, - 0xa9, 0xd3, 0xf1, 0x57, 0xae, 0x10, 0x63, 0x84, 0xb4, 0x46, 0xcc, 0x16, 0x7d, 0x5d, 0x14, 0xe2, - 0xaf, 0x8b, 0x36, 0x7e, 0x9a, 0x81, 0x95, 0x74, 0xe3, 0xff, 0x34, 0xbe, 0x76, 0xf7, 0xad, 0xf8, - 0x6b, 0x77, 0x9f, 0xe1, 0xcb, 0x71, 0xbf, 0x9d, 0x01, 0x88, 0xc7, 0x05, 0xf7, 0x48, 0xf5, 0x55, - 0xae, 0xd0, 0x6b, 0x57, 0x10, 0xdf, 0x49, 0x7d, 0xca, 0xe1, 0xed, 0x85, 0x06, 0x39, 0xf1, 0x33, - 0x51, 0xd8, 0xfe, 0x00, 0x56, 0xd2, 0x78, 0xba, 0x10, 0xd0, 0xd9, 0x6d, 0xab, 0x1c, 0x55, 0x67, - 0xaf, 0xf5, 0xa8, 0xad, 0x2f, 0xa2, 0x75, 0xf6, 0x1f, 0xb3, 0x6c, 0xe3, 0x8f, 0x32, 0x50, 0x89, - 0x86, 0x9c, 0x7f, 0x37, 0x39, 0x57, 0xaa, 0x04, 0xe6, 0xad, 0x45, 0xe6, 0x2a, 0xfe, 0xd5, 0x76, - 0xa5, 0x7f, 0x91, 0x98, 0xba, 0x86, 0x07, 0x2b, 0xe9, 0x87, 0x73, 0x8c, 0xe8, 0xa3, 0xb4, 0x11, - 0x7d, 0x73, 0xa1, 0x57, 0x86, 0xa1, 0xea, 0xae, 0x1d, 0x48, 0x6d, 0x5f, 0xdf, 0xcf, 0xbe, 0x97, - 0x69, 0xdc, 0x85, 0xe5, 0xe4, 0xa3, 0xd9, 0xbb, 0xa8, 0xf7, 0xff, 0x28, 0x07, 0x2b, 0xe9, 0x2a, - 0x12, 0xba, 0xdb, 0xa6, 0x2a, 0x98, 0x0e, 0x1c, 0x2b, 0x71, 0x17, 0x80, 0x61, 0x98, 0xac, 0x83, - 0x61, 0x42, 0xac, 0x51, 0x16, 0xcc, 0x1b, 0x09, 0x76, 0x37, 0xf9, 0x45, 0xcf, 0x37, 0x38, 0x84, - 0x77, 0x12, 0xd9, 0x98, 0x57, 0xf4, 0xb7, 0xcd, 0x7e, 0x94, 0xe5, 0xb5, 0x44, 0x45, 0xfa, 0x4f, - 0xd0, 0x13, 0x5c, 0xdd, 0x98, 0xb8, 0x96, 0x23, 0xac, 0x08, 0xfb, 0xd3, 0x24, 0x36, 0x2a, 0x29, - 0xff, 0x51, 0x9e, 0xaf, 0x40, 0xa5, 0x3b, 0x39, 0xd6, 0xe5, 0xe4, 0x7f, 0x29, 0xcf, 0x6f, 0xc2, - 0x9a, 0xa6, 0x8a, 0xab, 0x37, 0xd9, 0x5f, 0xc6, 0x3d, 0x6b, 0xa5, 0xa5, 0xc6, 0x4b, 0x37, 0x94, - 0xfd, 0x95, 0x3c, 0x36, 0x81, 0xae, 0xba, 0xff, 0x55, 0x92, 0x13, 0x5d, 0xfd, 0x61, 0xbf, 0x96, - 0xe7, 0xab, 0x00, 0xdd, 0x5e, 0xf4, 0xa2, 0xdf, 0xc8, 0xf3, 0x2a, 0x14, 0xbb, 0x3d, 0x92, 0xf6, - 0xe3, 0x3c, 0xbf, 0x01, 0x2c, 0x7e, 0xaa, 0x6b, 0x5a, 0xff, 0x86, 0x6a, 0x4c, 0x54, 0xa4, 0xfa, - 0x37, 0xf3, 0xd8, 0xaf, 0x70, 0x94, 0xd9, 0xdf, 0xca, 0x73, 0x06, 0xd5, 0x44, 0x6e, 0x95, 0xfd, - 0xed, 0x3c, 0xe7, 0x50, 0xdb, 0xb3, 0x83, 0xc0, 0x76, 0x07, 0xba, 0x07, 0xbf, 0x4e, 0x6f, 0xde, - 0x8e, 0x6e, 0x2f, 0xb1, 0xdf, 0xcc, 0xf3, 0x5b, 0xc0, 0x93, 0xe7, 0x49, 0xfa, 0xc1, 0xdf, 0x21, - 0x6e, 0xb5, 0x4f, 0x06, 0x1a, 0xf7, 0x77, 0x89, 0x1b, 0x35, 0x41, 0x23, 0x7e, 0x8b, 0x06, 0x64, - 0x33, 0xae, 0x82, 0xd5, 0xf8, 0x9f, 0x10, 0x73, 0x38, 0x99, 0x0a, 0xf7, 0xd3, 0xfc, 0xfd, 0x9f, - 0xd1, 0x79, 0x40, 0xb2, 0x98, 0x8c, 0x2f, 0x43, 0xd9, 0xf1, 0xdc, 0x81, 0x54, 0x5f, 0x52, 0xad, - 0x41, 0x25, 0x18, 0x7a, 0xbe, 0x24, 0x90, 0xae, 0x57, 0xba, 0x74, 0x0d, 0x5f, 0x5d, 0x48, 0x50, - 0x51, 0x9d, 0xca, 0xaf, 0x4a, 0x73, 0xc0, 0xaa, 0x51, 0xfd, 0x6e, 0x3e, 0xaa, 0x31, 0xa6, 0xcf, - 0x01, 0x84, 0xd7, 0xad, 0x59, 0x11, 0x49, 0x27, 0xbe, 0xa3, 0x6a, 0x8d, 0x05, 0x7a, 0xf4, 0xea, - 0x93, 0x89, 0xe3, 0x21, 0x06, 0x0e, 0x15, 0x85, 0xf5, 0xbe, 0x6f, 0xab, 0x8b, 0xbc, 0xba, 0x74, - 0xcf, 0xc2, 0x76, 0x44, 0xd5, 0x29, 0x4c, 0xdc, 0xff, 0x7b, 0x19, 0x58, 0x0e, 0x2f, 0xc1, 0xdb, - 0x03, 0xdb, 0x55, 0xd5, 0xca, 0xe1, 0xf7, 0x69, 0xfb, 0x8e, 0x3d, 0x0e, 0xbf, 0xf7, 0xb8, 0x0a, - 0x55, 0xcb, 0x37, 0x07, 0x2d, 0xd7, 0xda, 0xf2, 0xbd, 0xb1, 0x6a, 0xb6, 0x3a, 0x31, 0x54, 0x55, - 0xd2, 0xcf, 0xc5, 0x31, 0x92, 0x8f, 0x85, 0xcf, 0xf2, 0x54, 0x16, 0x38, 0x34, 0x7d, 0xdb, 0x1d, - 0xb4, 0xcf, 0xa5, 0x70, 0x03, 0x55, 0x2d, 0x5d, 0x85, 0xd2, 0x24, 0x10, 0x7d, 0x33, 0x10, 0xac, - 0x88, 0xc0, 0xf1, 0xc4, 0x76, 0xa4, 0xed, 0xaa, 0xcf, 0x2c, 0x46, 0xe5, 0xd0, 0x65, 0xec, 0x99, - 0x39, 0xb6, 0x59, 0xe5, 0xfe, 0xbf, 0xca, 0x40, 0x95, 0xd4, 0x22, 0xce, 0x89, 0xc7, 0x3e, 0x5a, - 0x15, 0x4a, 0xbb, 0xd1, 0xf7, 0xf6, 0x8a, 0x90, 0x3d, 0x38, 0x55, 0x39, 0x71, 0xad, 0x16, 0xea, - 0xb6, 0xaa, 0xfa, 0xf4, 0x5e, 0x9e, 0x7f, 0x0e, 0x6e, 0x18, 0x62, 0xe4, 0x49, 0xf1, 0xcc, 0xb4, - 0x65, 0xf2, 0x66, 0x52, 0x01, 0xc3, 0x39, 0xf5, 0x28, 0xbc, 0x8a, 0x54, 0xa4, 0x70, 0x0e, 0x5f, - 0x1b, 0x62, 0x4a, 0xd8, 0x7b, 0xc2, 0xe8, 0xf8, 0xae, 0x1c, 0x91, 0x7c, 0xe4, 0xd9, 0x2e, 0xbe, - 0x8d, 0x6e, 0x50, 0x13, 0x86, 0x0e, 0x57, 0x10, 0x05, 0xf7, 0xf7, 0xe1, 0xe6, 0xfc, 0x23, 0x01, - 0x75, 0xb7, 0x9a, 0x3e, 0xf2, 0x4c, 0x77, 0x55, 0x9e, 0xf9, 0xb6, 0xba, 0x04, 0x5b, 0x81, 0xc2, - 0xc1, 0x73, 0x97, 0xd4, 0x62, 0x0d, 0x6a, 0xfb, 0x5e, 0x82, 0x87, 0xe5, 0xee, 0xf7, 0x53, 0xa7, - 0x38, 0xf1, 0xa0, 0x84, 0x8d, 0x58, 0x4a, 0xdc, 0xc3, 0xca, 0xa8, 0xf3, 0x01, 0xfa, 0x3f, 0x1d, - 0xea, 0xbb, 0x13, 0xfa, 0xf4, 0xc4, 0x52, 0xdf, 0x9d, 0x88, 0x9a, 0x99, 0x57, 0x1f, 0xe0, 0x72, - 0xfb, 0xc2, 0x11, 0x16, 0x2b, 0xdc, 0x7f, 0x0f, 0x56, 0x75, 0x57, 0xfb, 0x22, 0x08, 0xc2, 0x7b, - 0x4c, 0x87, 0xbe, 0x7d, 0xa6, 0xbe, 0x6d, 0xb1, 0x0c, 0xe5, 0x43, 0xe1, 0x07, 0x9e, 0x4b, 0xdf, - 0xf5, 0x00, 0x28, 0x76, 0x87, 0xa6, 0x8f, 0xef, 0xb8, 0xff, 0x35, 0x3d, 0x48, 0x4f, 0xce, 0xc3, - 0xad, 0x01, 0xd7, 0x8f, 0xfe, 0xac, 0x8d, 0x29, 0x4d, 0x4d, 0x2e, 0x7d, 0x61, 0x8e, 0x58, 0xf6, - 0xfe, 0x26, 0x54, 0xe8, 0x1a, 0xd4, 0x63, 0xdb, 0xb5, 0xb0, 0xe3, 0x1b, 0xba, 0x24, 0x9f, 0xbe, - 0xb7, 0x74, 0x46, 0xc3, 0x51, 0x56, 0x5f, 0xa6, 0x65, 0x59, 0x7e, 0x13, 0x78, 0x6b, 0x22, 0xbd, - 0x91, 0x49, 0xd7, 0x77, 0x9d, 0x0b, 0xf5, 0x15, 0xe3, 0xdc, 0xfd, 0x6f, 0x03, 0x57, 0x39, 0x36, - 0x4b, 0x9c, 0xdb, 0xee, 0x20, 0xfa, 0x6e, 0x00, 0xd0, 0x47, 0x40, 0x2c, 0x71, 0x1e, 0xde, 0x61, - 0x0b, 0x81, 0xf0, 0x53, 0x24, 0xdb, 0xde, 0xc4, 0xc5, 0x46, 0x3f, 0x85, 0xeb, 0x4a, 0xc5, 0xb0, - 0x17, 0x74, 0x37, 0xf4, 0xd2, 0xc0, 0x5f, 0xdd, 0x61, 0x93, 0x93, 0x20, 0xa2, 0x65, 0x19, 0x6c, - 0x58, 0x14, 0x34, 0xc7, 0xf8, 0xec, 0xfd, 0x26, 0x5c, 0x9b, 0x93, 0xb9, 0x20, 0xa3, 0xae, 0xe2, - 0x37, 0xb6, 0x74, 0xff, 0x43, 0x58, 0x53, 0x66, 0x68, 0x5f, 0xdd, 0xde, 0x0b, 0x87, 0xed, 0x59, - 0x67, 0xbb, 0xa3, 0x46, 0x7a, 0xb3, 0xbd, 0xbb, 0xfb, 0x64, 0xb7, 0x65, 0xb0, 0x0c, 0xe9, 0xc3, - 0x41, 0xef, 0x68, 0xf3, 0x60, 0x7f, 0xbf, 0xbd, 0xd9, 0x6b, 0x6f, 0xb1, 0xec, 0xc6, 0xfd, 0x7f, - 0xfb, 0x8b, 0x3b, 0x99, 0x9f, 0xff, 0xe2, 0x4e, 0xe6, 0xbf, 0xfc, 0xe2, 0x4e, 0xe6, 0xc7, 0x9f, - 0xde, 0x59, 0xfa, 0xf9, 0xa7, 0x77, 0x96, 0xfe, 0xe3, 0xa7, 0x77, 0x96, 0x3e, 0x61, 0xd3, 0xff, - 0x6a, 0xe7, 0xb8, 0x48, 0x21, 0xc3, 0x5b, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x19, 0xb6, 0xd3, - 0x38, 0x85, 0x67, 0x00, 0x00, + // 9225 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x7d, 0x5b, 0x6c, 0x23, 0xd9, + 0x95, 0x98, 0xf8, 0x26, 0x0f, 0x45, 0xe9, 0xea, 0xf6, 0x8b, 0xa6, 0xdb, 0x9d, 0x36, 0x3d, 0x9e, + 0x69, 0xb7, 0xc7, 0xea, 0x99, 0x9e, 0x19, 0xcf, 0x78, 0xec, 0x19, 0x9b, 0x92, 0xa8, 0x16, 0xa7, + 0xf5, 0x72, 0x91, 0xdd, 0xed, 0x19, 0xec, 0x46, 0x29, 0xb1, 0xae, 0xc8, 0xb2, 0x8a, 0x55, 0x74, + 0xd5, 0xa5, 0x5a, 0x32, 0x92, 0xc0, 0x79, 0xed, 0x66, 0xff, 0x9c, 0x20, 0x9b, 0x64, 0x11, 0x04, + 0x6b, 0x7f, 0x04, 0x08, 0xb2, 0x1b, 0xe4, 0xcb, 0x48, 0x36, 0x0f, 0x20, 0xbb, 0x5f, 0x01, 0xf2, + 0xe3, 0xe4, 0x2b, 0x40, 0x02, 0x24, 0xf0, 0x00, 0xf9, 0x09, 0x92, 0xc5, 0x06, 0x08, 0x60, 0x04, + 0xf9, 0x08, 0xce, 0xb9, 0xb7, 0x5e, 0x24, 0xa5, 0x66, 0xcf, 0xee, 0x06, 0xf9, 0x12, 0xef, 0xa9, + 0x73, 0x4e, 0xdd, 0xc7, 0xb9, 0xe7, 0x9e, 0xd7, 0x2d, 0xc1, 0x2b, 0xe3, 0xd3, 0xc1, 0x03, 0xc7, + 0x3e, 0x7e, 0x30, 0x3e, 0x7e, 0x30, 0xf2, 0x2c, 0xe1, 0x3c, 0x18, 0xfb, 0x9e, 0xf4, 0x02, 0xd5, + 0x08, 0xd6, 0xa9, 0xc5, 0x6b, 0xa6, 0x7b, 0x21, 0x2f, 0xc6, 0x62, 0x9d, 0xa0, 0x8d, 0xdb, 0x03, + 0xcf, 0x1b, 0x38, 0x42, 0xa1, 0x1e, 0x4f, 0x4e, 0x1e, 0x04, 0xd2, 0x9f, 0xf4, 0xa5, 0x42, 0x6e, + 0xfe, 0x3c, 0x0f, 0x37, 0xbb, 0x23, 0xd3, 0x97, 0x1b, 0x8e, 0xd7, 0x3f, 0xed, 0xba, 0xe6, 0x38, + 0x18, 0x7a, 0x72, 0xc3, 0x0c, 0x04, 0x7f, 0x1d, 0x8a, 0xc7, 0x08, 0x0c, 0xea, 0x99, 0xbb, 0xb9, + 0x7b, 0xd5, 0x87, 0xd7, 0xd7, 0x53, 0x8c, 0xd7, 0x89, 0xc2, 0xd0, 0x38, 0xfc, 0x4d, 0x28, 0x59, + 0x42, 0x9a, 0xb6, 0x13, 0xd4, 0xb3, 0x77, 0x33, 0xf7, 0xaa, 0x0f, 0x6f, 0xad, 0xab, 0x17, 0xaf, + 0x87, 0x2f, 0x5e, 0xef, 0xd2, 0x8b, 0x8d, 0x10, 0x8f, 0xbf, 0x0b, 0xe5, 0x13, 0xdb, 0x11, 0x8f, + 0xc5, 0x45, 0x50, 0xcf, 0x5d, 0x49, 0xb3, 0x91, 0xad, 0x67, 0x8c, 0x08, 0x99, 0x6f, 0xc2, 0x8a, + 0x38, 0x97, 0xbe, 0x69, 0x08, 0xc7, 0x94, 0xb6, 0xe7, 0x06, 0xf5, 0x3c, 0xf5, 0xf0, 0xd6, 0x54, + 0x0f, 0xc3, 0xe7, 0x44, 0x3e, 0x45, 0xc2, 0xef, 0x42, 0xd5, 0x3b, 0xfe, 0xbe, 0xe8, 0xcb, 0xde, + 0xc5, 0x58, 0x04, 0xf5, 0xc2, 0xdd, 0xdc, 0xbd, 0x8a, 0x91, 0x04, 0xf1, 0x6f, 0x40, 0xb5, 0xef, + 0x39, 0x8e, 0xe8, 0xab, 0x77, 0x14, 0xaf, 0x1e, 0x56, 0x12, 0x97, 0xbf, 0x0d, 0x37, 0x7c, 0x31, + 0xf2, 0xce, 0x84, 0xb5, 0x19, 0x41, 0x69, 0x9c, 0x65, 0x7a, 0xcd, 0xfc, 0x87, 0xbc, 0x05, 0x35, + 0x5f, 0xf7, 0x6f, 0xd7, 0x76, 0x4f, 0x83, 0x7a, 0x89, 0x86, 0xf5, 0xf9, 0x4b, 0x86, 0x85, 0x38, + 0x46, 0x9a, 0x82, 0x33, 0xc8, 0x9d, 0x8a, 0x8b, 0x7a, 0xe5, 0x6e, 0xe6, 0x5e, 0xc5, 0xc0, 0x9f, + 0xfc, 0x7d, 0xa8, 0x7b, 0xbe, 0x3d, 0xb0, 0x5d, 0xd3, 0xd9, 0xf4, 0x85, 0x29, 0x85, 0xd5, 0xb3, + 0x47, 0x22, 0x90, 0xe6, 0x68, 0x5c, 0x87, 0xbb, 0x99, 0x7b, 0x39, 0xe3, 0xd2, 0xe7, 0xfc, 0x2d, + 0xb5, 0x42, 0x1d, 0xf7, 0xc4, 0xab, 0x57, 0xf5, 0xf0, 0xd3, 0x7d, 0xd9, 0xd6, 0x8f, 0x8d, 0x08, + 0xb1, 0xf9, 0xcb, 0x2c, 0x14, 0xbb, 0xc2, 0xf4, 0xfb, 0xc3, 0xc6, 0xaf, 0x67, 0xa0, 0x68, 0x88, + 0x60, 0xe2, 0x48, 0xde, 0x80, 0xb2, 0x9a, 0xdb, 0x8e, 0x55, 0xcf, 0x50, 0xef, 0xa2, 0xf6, 0x67, + 0x91, 0x9d, 0x75, 0xc8, 0x8f, 0x84, 0x34, 0xeb, 0x39, 0x9a, 0xa1, 0xc6, 0x54, 0xaf, 0xd4, 0xeb, + 0xd7, 0xf7, 0x84, 0x34, 0x0d, 0xc2, 0x6b, 0x7c, 0x9a, 0x81, 0x3c, 0x36, 0xf9, 0x6d, 0xa8, 0x0c, + 0xed, 0xc1, 0xd0, 0xb1, 0x07, 0x43, 0xa9, 0x3b, 0x12, 0x03, 0xf8, 0x87, 0xb0, 0x1a, 0x35, 0x0c, + 0xd3, 0x1d, 0x08, 0xec, 0xd1, 0x3c, 0xe1, 0xa7, 0x87, 0xc6, 0x34, 0x32, 0xaf, 0x43, 0x89, 0xf6, + 0x43, 0xc7, 0x22, 0x89, 0xae, 0x18, 0x61, 0x13, 0xc5, 0x2d, 0x5c, 0xa9, 0xc7, 0xe2, 0xa2, 0x9e, + 0xa7, 0xa7, 0x49, 0x10, 0x6f, 0xc1, 0x6a, 0xd8, 0xdc, 0xd2, 0xb3, 0x51, 0xb8, 0x7a, 0x36, 0xa6, + 0xf1, 0x9b, 0x3f, 0xda, 0x83, 0x02, 0x6d, 0x4b, 0xbe, 0x02, 0x59, 0x3b, 0x9c, 0xe8, 0xac, 0x6d, + 0xf1, 0x07, 0x50, 0x3c, 0xb1, 0x85, 0x63, 0xbd, 0x70, 0x86, 0x35, 0x1a, 0x6f, 0xc3, 0xb2, 0x2f, + 0x02, 0xe9, 0xdb, 0x5a, 0xfa, 0xd5, 0x06, 0xfd, 0xe2, 0x3c, 0x1d, 0xb0, 0x6e, 0x24, 0x10, 0x8d, + 0x14, 0x19, 0x0e, 0xbb, 0x3f, 0xb4, 0x1d, 0xcb, 0x17, 0x6e, 0xc7, 0x52, 0xfb, 0xb4, 0x62, 0x24, + 0x41, 0xfc, 0x1e, 0xac, 0x1e, 0x9b, 0xfd, 0xd3, 0x81, 0xef, 0x4d, 0x5c, 0xdc, 0x10, 0x9e, 0x4f, + 0xc3, 0xae, 0x18, 0xd3, 0x60, 0xfe, 0x06, 0x14, 0x4c, 0xc7, 0x1e, 0xb8, 0xb4, 0x13, 0x57, 0x66, + 0x16, 0x5d, 0xf5, 0xa5, 0x85, 0x18, 0x86, 0x42, 0xe4, 0x3b, 0x50, 0x3b, 0x13, 0xbe, 0xb4, 0xfb, + 0xa6, 0x43, 0xf0, 0x7a, 0x89, 0x28, 0x9b, 0x73, 0x29, 0x9f, 0x26, 0x31, 0x8d, 0x34, 0x21, 0xef, + 0x00, 0x04, 0xa8, 0x26, 0x69, 0x39, 0xf5, 0x5e, 0x78, 0x6d, 0x2e, 0x9b, 0x4d, 0xcf, 0x95, 0xc2, + 0x95, 0xeb, 0xdd, 0x08, 0x7d, 0x67, 0xc9, 0x48, 0x10, 0xf3, 0x77, 0x21, 0x2f, 0xc5, 0xb9, 0xac, + 0xaf, 0x5c, 0x31, 0xa3, 0x21, 0x93, 0x9e, 0x38, 0x97, 0x3b, 0x4b, 0x06, 0x11, 0x20, 0x21, 0x6e, + 0xb2, 0xfa, 0xea, 0x02, 0x84, 0xb8, 0x2f, 0x91, 0x10, 0x09, 0xf8, 0x07, 0x50, 0x74, 0xcc, 0x0b, + 0x6f, 0x22, 0xeb, 0x8c, 0x48, 0xbf, 0x74, 0x25, 0xe9, 0x2e, 0xa1, 0xee, 0x2c, 0x19, 0x9a, 0x88, + 0xbf, 0x0d, 0x39, 0xcb, 0x3e, 0xab, 0xaf, 0x11, 0xed, 0xdd, 0x2b, 0x69, 0xb7, 0xec, 0xb3, 0x9d, + 0x25, 0x03, 0xd1, 0xf9, 0x26, 0x94, 0x8f, 0x3d, 0xef, 0x74, 0x64, 0xfa, 0xa7, 0x75, 0x4e, 0xa4, + 0x5f, 0xbe, 0x92, 0x74, 0x43, 0x23, 0xef, 0x2c, 0x19, 0x11, 0x21, 0x0e, 0xd9, 0xee, 0x7b, 0x6e, + 0xfd, 0xda, 0x02, 0x43, 0xee, 0xf4, 0x3d, 0x17, 0x87, 0x8c, 0x04, 0x48, 0xe8, 0xd8, 0xee, 0x69, + 0xfd, 0xfa, 0x02, 0x84, 0xa8, 0x39, 0x91, 0x10, 0x09, 0xb0, 0xdb, 0x96, 0x29, 0xcd, 0x33, 0x5b, + 0x3c, 0xaf, 0xdf, 0x58, 0xa0, 0xdb, 0x5b, 0x1a, 0x19, 0xbb, 0x1d, 0x12, 0x22, 0x93, 0x70, 0x6b, + 0xd6, 0x6f, 0x2e, 0xc0, 0x24, 0xd4, 0xe8, 0xc8, 0x24, 0x24, 0xe4, 0x7f, 0x16, 0xd6, 0x4e, 0x84, + 0x29, 0x27, 0xbe, 0xb0, 0xe2, 0x83, 0xee, 0x16, 0x71, 0x5b, 0xbf, 0x7a, 0xed, 0xa7, 0xa9, 0x76, + 0x96, 0x8c, 0x59, 0x56, 0xfc, 0x7d, 0x28, 0x38, 0xa6, 0x14, 0xe7, 0xf5, 0x3a, 0xf1, 0x6c, 0xbe, + 0x40, 0x28, 0xa4, 0x38, 0xdf, 0x59, 0x32, 0x14, 0x09, 0xff, 0x1e, 0xac, 0x4a, 0xf3, 0xd8, 0x11, + 0x07, 0x27, 0x1a, 0x21, 0xa8, 0x7f, 0x8e, 0xb8, 0xbc, 0x7e, 0xb5, 0x38, 0xa7, 0x69, 0x76, 0x96, + 0x8c, 0x69, 0x36, 0xd8, 0x2b, 0x02, 0xd5, 0x1b, 0x0b, 0xf4, 0x8a, 0xf8, 0x61, 0xaf, 0x88, 0x84, + 0xef, 0x42, 0x95, 0x7e, 0x6c, 0x7a, 0xce, 0x64, 0xe4, 0xd6, 0x3f, 0x4f, 0x1c, 0xee, 0xbd, 0x98, + 0x83, 0xc2, 0xdf, 0x59, 0x32, 0x92, 0xe4, 0xb8, 0x88, 0xd4, 0x34, 0xbc, 0xe7, 0xf5, 0xdb, 0x0b, + 0x2c, 0x62, 0x4f, 0x23, 0xe3, 0x22, 0x86, 0x84, 0xb8, 0xf5, 0x9e, 0xdb, 0xd6, 0x40, 0xc8, 0xfa, + 0x17, 0x16, 0xd8, 0x7a, 0xcf, 0x08, 0x15, 0xb7, 0x9e, 0x22, 0x42, 0x31, 0xee, 0x0f, 0x4d, 0x59, + 0xbf, 0xb3, 0x80, 0x18, 0x6f, 0x0e, 0x4d, 0xd2, 0x15, 0x48, 0xd0, 0xf8, 0x21, 0x2c, 0x27, 0xb5, + 0x32, 0xe7, 0x90, 0xf7, 0x85, 0xa9, 0x4e, 0x84, 0xb2, 0x41, 0xbf, 0x11, 0x26, 0x2c, 0x5b, 0xd2, + 0x89, 0x50, 0x36, 0xe8, 0x37, 0xbf, 0x09, 0x45, 0x65, 0x9b, 0x90, 0xc2, 0x2f, 0x1b, 0xba, 0x85, + 0xb8, 0x96, 0x6f, 0x0e, 0xe8, 0xdc, 0x2a, 0x1b, 0xf4, 0x1b, 0x71, 0x2d, 0xdf, 0x1b, 0x1f, 0xb8, + 0xa4, 0xb0, 0xcb, 0x86, 0x6e, 0x35, 0x3e, 0xfd, 0x00, 0x4a, 0xba, 0x53, 0x8d, 0xbf, 0x9f, 0x81, + 0xa2, 0x52, 0x28, 0xfc, 0xdb, 0x50, 0x08, 0xe4, 0x85, 0x23, 0xa8, 0x0f, 0x2b, 0x0f, 0xbf, 0xb2, + 0x80, 0x12, 0x5a, 0xef, 0x22, 0x81, 0xa1, 0xe8, 0x9a, 0x06, 0x14, 0xa8, 0xcd, 0x4b, 0x90, 0x33, + 0xbc, 0xe7, 0x6c, 0x89, 0x03, 0x14, 0xd5, 0x62, 0xb1, 0x0c, 0x02, 0xb7, 0xec, 0x33, 0x96, 0x45, + 0xe0, 0x8e, 0x30, 0x2d, 0xe1, 0xb3, 0x1c, 0xaf, 0x41, 0x25, 0x5c, 0x96, 0x80, 0xe5, 0x39, 0x83, + 0xe5, 0xc4, 0x82, 0x07, 0xac, 0xd0, 0xf8, 0x9f, 0x79, 0xc8, 0xe3, 0xfe, 0xe7, 0xaf, 0x40, 0x4d, + 0x9a, 0xfe, 0x40, 0x28, 0x43, 0x38, 0x32, 0x52, 0xd2, 0x40, 0xfe, 0x41, 0x38, 0x86, 0x2c, 0x8d, + 0xe1, 0xb5, 0x17, 0xea, 0x95, 0xd4, 0x08, 0x12, 0xa7, 0x70, 0x6e, 0xb1, 0x53, 0x78, 0x1b, 0xca, + 0xa8, 0xce, 0xba, 0xf6, 0x0f, 0x05, 0x4d, 0xfd, 0xca, 0xc3, 0xfb, 0x2f, 0x7e, 0x65, 0x47, 0x53, + 0x18, 0x11, 0x2d, 0xef, 0x40, 0xa5, 0x6f, 0xfa, 0x16, 0x75, 0x86, 0x56, 0x6b, 0xe5, 0xe1, 0x57, + 0x5f, 0xcc, 0x68, 0x33, 0x24, 0x31, 0x62, 0x6a, 0x7e, 0x00, 0x55, 0x4b, 0x04, 0x7d, 0xdf, 0x1e, + 0x93, 0x7a, 0x53, 0x67, 0xf1, 0xd7, 0x5e, 0xcc, 0x6c, 0x2b, 0x26, 0x32, 0x92, 0x1c, 0xd0, 0x22, + 0xf3, 0x23, 0xfd, 0x56, 0x22, 0x03, 0x21, 0x06, 0x34, 0xdf, 0x85, 0x72, 0x38, 0x1e, 0xbe, 0x0c, + 0x65, 0xfc, 0xbb, 0xef, 0xb9, 0x82, 0x2d, 0xe1, 0xda, 0x62, 0xab, 0x3b, 0x32, 0x1d, 0x87, 0x65, + 0xf8, 0x0a, 0x00, 0x36, 0xf7, 0x84, 0x65, 0x4f, 0x46, 0x2c, 0xdb, 0xfc, 0x66, 0x28, 0x2d, 0x65, + 0xc8, 0x1f, 0x9a, 0x03, 0xa4, 0x58, 0x86, 0x72, 0xa8, 0xae, 0x59, 0x06, 0xe9, 0xb7, 0xcc, 0x60, + 0x78, 0xec, 0x99, 0xbe, 0xc5, 0xb2, 0xbc, 0x0a, 0xa5, 0x96, 0xdf, 0x1f, 0xda, 0x67, 0x82, 0xe5, + 0x9a, 0x0f, 0xa0, 0x9a, 0xe8, 0x2f, 0xb2, 0xd0, 0x2f, 0xad, 0x40, 0xa1, 0x65, 0x59, 0xc2, 0x62, + 0x19, 0x24, 0xd0, 0x03, 0x64, 0xd9, 0xe6, 0x57, 0xa1, 0x12, 0xcd, 0x16, 0xa2, 0xe3, 0xc1, 0xcd, + 0x96, 0xf0, 0x17, 0x82, 0x59, 0x06, 0xa5, 0xb2, 0xe3, 0x3a, 0xb6, 0x2b, 0x58, 0xb6, 0xf1, 0xe7, + 0x48, 0x54, 0xf9, 0xb7, 0xd2, 0x1b, 0xe2, 0xd5, 0x17, 0x9d, 0xac, 0xe9, 0xdd, 0xf0, 0xf9, 0xc4, + 0xf8, 0x76, 0x6d, 0xea, 0x5c, 0x19, 0xf2, 0x5b, 0x9e, 0x0c, 0x58, 0xa6, 0xf1, 0xdf, 0xb2, 0x50, + 0x0e, 0x0f, 0x54, 0xf4, 0x09, 0x26, 0xbe, 0xa3, 0x05, 0x1a, 0x7f, 0xf2, 0xeb, 0x50, 0x90, 0xb6, + 0xd4, 0x62, 0x5c, 0x31, 0x54, 0x03, 0x6d, 0xb5, 0xe4, 0xca, 0x2a, 0x03, 0x76, 0x7a, 0xa9, 0xec, + 0x91, 0x39, 0x10, 0x3b, 0x66, 0x30, 0xd4, 0x26, 0x6c, 0x0c, 0x40, 0xfa, 0x13, 0xf3, 0x0c, 0x65, + 0x8e, 0x9e, 0x2b, 0x2b, 0x2e, 0x09, 0xe2, 0x6f, 0x41, 0x1e, 0x07, 0xa8, 0x85, 0xe6, 0xcf, 0x4c, + 0x0d, 0x18, 0xc5, 0xe4, 0xd0, 0x17, 0xb8, 0x3c, 0xeb, 0xe8, 0x81, 0x19, 0x84, 0xcc, 0x5f, 0x85, + 0x15, 0xb5, 0x09, 0x0f, 0x42, 0xff, 0xa1, 0x44, 0x9c, 0xa7, 0xa0, 0xbc, 0x85, 0xd3, 0x69, 0x4a, + 0x51, 0x2f, 0x2f, 0x20, 0xdf, 0xe1, 0xe4, 0xac, 0x77, 0x91, 0xc4, 0x50, 0x94, 0xcd, 0x77, 0x70, + 0x4e, 0x4d, 0x29, 0x70, 0x99, 0xdb, 0xa3, 0xb1, 0xbc, 0x50, 0x42, 0xb3, 0x2d, 0x64, 0x7f, 0x68, + 0xbb, 0x03, 0x96, 0x51, 0x53, 0x8c, 0x8b, 0x48, 0x28, 0xbe, 0xef, 0xf9, 0x2c, 0xd7, 0x68, 0x40, + 0x1e, 0x65, 0x14, 0x95, 0xa4, 0x6b, 0x8e, 0x84, 0x9e, 0x69, 0xfa, 0xdd, 0xb8, 0x06, 0x6b, 0x33, + 0xe7, 0x71, 0xe3, 0xf7, 0x8a, 0x4a, 0x42, 0x90, 0x82, 0x6c, 0x41, 0x4d, 0x41, 0x66, 0xde, 0x4b, + 0xe9, 0x18, 0xe4, 0x92, 0xd6, 0x31, 0x1f, 0x40, 0x01, 0x07, 0x16, 0xaa, 0x98, 0x05, 0xc8, 0xf7, + 0x10, 0xdd, 0x50, 0x54, 0xe8, 0xc1, 0xf4, 0x87, 0xa2, 0x7f, 0x2a, 0x2c, 0xad, 0xeb, 0xc3, 0x26, + 0x0a, 0x4d, 0x3f, 0x61, 0x9e, 0xab, 0x06, 0x89, 0x44, 0xdf, 0x73, 0xdb, 0x23, 0xef, 0xfb, 0x36, + 0xad, 0x2b, 0x8a, 0x44, 0x08, 0x08, 0x9f, 0x76, 0x50, 0x46, 0xf4, 0xb2, 0xc5, 0x80, 0x46, 0x1b, + 0x0a, 0xf4, 0x6e, 0xdc, 0x09, 0xaa, 0xcf, 0x2a, 0xd2, 0xf0, 0xea, 0x62, 0x7d, 0xd6, 0x5d, 0x6e, + 0xfc, 0x6e, 0x16, 0xf2, 0xd8, 0xe6, 0xf7, 0xa1, 0xe0, 0xa3, 0x1f, 0x46, 0xd3, 0x79, 0x99, 0xcf, + 0xa6, 0x50, 0xf8, 0xb7, 0xb5, 0x28, 0x66, 0x17, 0x10, 0x96, 0xe8, 0x8d, 0x49, 0xb1, 0xbc, 0x0e, + 0x85, 0xb1, 0xe9, 0x9b, 0x23, 0xbd, 0x4f, 0x54, 0xa3, 0xf9, 0x93, 0x0c, 0xe4, 0x11, 0x89, 0xaf, + 0x41, 0xad, 0x2b, 0x7d, 0xfb, 0x54, 0xc8, 0xa1, 0xef, 0x4d, 0x06, 0x43, 0x25, 0x49, 0x8f, 0xc5, + 0x85, 0xd2, 0x37, 0x4a, 0x21, 0x48, 0xd3, 0xb1, 0xfb, 0x2c, 0x8b, 0x52, 0xb5, 0xe1, 0x39, 0x16, + 0xcb, 0xf1, 0x55, 0xa8, 0x3e, 0x71, 0x2d, 0xe1, 0x07, 0x7d, 0xcf, 0x17, 0x16, 0xcb, 0xeb, 0xdd, + 0x7d, 0xca, 0x0a, 0x74, 0x96, 0x89, 0x73, 0x49, 0xbe, 0x10, 0x2b, 0xf2, 0x6b, 0xb0, 0xba, 0x91, + 0x76, 0x90, 0x58, 0x09, 0x75, 0xd2, 0x9e, 0x70, 0x51, 0xc8, 0x58, 0x59, 0x09, 0xb1, 0xf7, 0x7d, + 0x9b, 0x55, 0xf0, 0x65, 0x6a, 0x9f, 0x30, 0x68, 0xfe, 0xcb, 0x4c, 0xa8, 0x39, 0x6a, 0x50, 0x39, + 0x34, 0x7d, 0x73, 0xe0, 0x9b, 0x63, 0xec, 0x5f, 0x15, 0x4a, 0xea, 0xe0, 0x7c, 0x53, 0x69, 0x37, + 0xd5, 0x78, 0xa8, 0x74, 0xa3, 0x6a, 0xbc, 0xc5, 0x72, 0x71, 0xe3, 0x6d, 0x96, 0xc7, 0x77, 0x7c, + 0x77, 0xe2, 0x49, 0xc1, 0x0a, 0xa4, 0xeb, 0x3c, 0x4b, 0xb0, 0x22, 0x02, 0x7b, 0xa8, 0x51, 0x58, + 0x09, 0xc7, 0xbc, 0x89, 0xf2, 0x73, 0xec, 0x9d, 0xb3, 0x32, 0x76, 0x03, 0xa7, 0x51, 0x58, 0xac, + 0x82, 0x4f, 0xf6, 0x27, 0xa3, 0x63, 0x81, 0xc3, 0x04, 0x7c, 0xd2, 0xf3, 0x06, 0x03, 0x47, 0xb0, + 0x2a, 0xce, 0x41, 0x42, 0xf9, 0xb2, 0x65, 0xd2, 0xb4, 0xa6, 0xe3, 0x78, 0x13, 0xc9, 0x6a, 0x8d, + 0x5f, 0xe6, 0x20, 0x8f, 0xde, 0x0d, 0xee, 0x9d, 0x21, 0xea, 0x19, 0xbd, 0x77, 0xf0, 0x77, 0xb4, + 0x03, 0xb3, 0xf1, 0x0e, 0xe4, 0xef, 0xeb, 0x95, 0xce, 0x2d, 0xa0, 0x65, 0x91, 0x71, 0x72, 0x91, + 0x39, 0xe4, 0x47, 0xf6, 0x48, 0x68, 0x5d, 0x47, 0xbf, 0x11, 0x16, 0xe0, 0x79, 0x5c, 0xa0, 0xe0, + 0x09, 0xfd, 0xc6, 0x5d, 0x63, 0xe2, 0xb1, 0xd0, 0x92, 0xb4, 0x07, 0x72, 0x46, 0xd8, 0x9c, 0xa3, + 0xbd, 0x2a, 0x73, 0xb5, 0xd7, 0x07, 0xa1, 0xf6, 0x2a, 0x2d, 0xb0, 0xeb, 0xa9, 0x9b, 0x49, 0xcd, + 0x15, 0x2b, 0x8d, 0xf2, 0xe2, 0xe4, 0x89, 0xc3, 0x64, 0x4b, 0x4b, 0x6d, 0x7c, 0xd0, 0x95, 0xd5, + 0x2c, 0xb3, 0x0c, 0xae, 0x26, 0x6d, 0x57, 0xa5, 0xf3, 0x9e, 0xda, 0x96, 0xf0, 0x58, 0x8e, 0x0e, + 0xc2, 0x89, 0x65, 0x7b, 0x2c, 0x8f, 0x96, 0xd7, 0xe1, 0xd6, 0x36, 0x2b, 0x34, 0x5f, 0x4d, 0x1c, + 0x49, 0xad, 0x89, 0xf4, 0x14, 0x1b, 0x12, 0xdf, 0x8c, 0x92, 0xc6, 0x63, 0x61, 0xb1, 0x6c, 0xf3, + 0xeb, 0x73, 0xd4, 0x6c, 0x0d, 0x2a, 0x4f, 0xc6, 0x8e, 0x67, 0x5a, 0x57, 0xe8, 0xd9, 0x65, 0x80, + 0xd8, 0xab, 0x6e, 0xfc, 0xb2, 0x19, 0x1f, 0xe7, 0x68, 0x8b, 0x06, 0xde, 0xc4, 0xef, 0x0b, 0x52, + 0x21, 0x15, 0x43, 0xb7, 0xf8, 0x77, 0xa0, 0x80, 0xcf, 0xc3, 0x30, 0xce, 0xfd, 0x85, 0x7c, 0xb9, + 0xf5, 0xa7, 0xb6, 0x78, 0x6e, 0x28, 0x42, 0x7e, 0x07, 0xc0, 0xec, 0x4b, 0xfb, 0x4c, 0x20, 0x50, + 0x6f, 0xf6, 0x04, 0x84, 0xbf, 0x93, 0x34, 0x5f, 0xae, 0x8e, 0x43, 0x26, 0xec, 0x1a, 0x6e, 0x40, + 0x15, 0xb7, 0xee, 0xf8, 0xc0, 0xc7, 0xdd, 0x5e, 0x5f, 0x26, 0xc2, 0x37, 0x16, 0xeb, 0xde, 0xa3, + 0x88, 0xd0, 0x48, 0x32, 0xe1, 0x4f, 0x60, 0x59, 0xc5, 0xd4, 0x34, 0xd3, 0x1a, 0x31, 0x7d, 0x73, + 0x31, 0xa6, 0x07, 0x31, 0xa5, 0x91, 0x62, 0x33, 0x1b, 0x96, 0x2c, 0xbc, 0x74, 0x58, 0xf2, 0x55, + 0x58, 0xe9, 0xa5, 0x77, 0x81, 0x3a, 0x2a, 0xa6, 0xa0, 0xbc, 0x09, 0xcb, 0x76, 0x10, 0x47, 0x45, + 0x29, 0x46, 0x52, 0x36, 0x52, 0xb0, 0xc6, 0xbf, 0x2b, 0x42, 0x9e, 0x66, 0x7e, 0x3a, 0xc6, 0xb5, + 0x99, 0x52, 0xe9, 0x0f, 0x16, 0x5f, 0xea, 0xa9, 0x1d, 0x4f, 0x1a, 0x24, 0x97, 0xd0, 0x20, 0xdf, + 0x81, 0x42, 0xe0, 0xf9, 0x32, 0x5c, 0xde, 0x05, 0x85, 0xa8, 0xeb, 0xf9, 0xd2, 0x50, 0x84, 0x7c, + 0x1b, 0x4a, 0x27, 0xb6, 0x23, 0x71, 0x51, 0xd4, 0xe4, 0xbd, 0xbe, 0x18, 0x8f, 0x6d, 0x22, 0x32, + 0x42, 0x62, 0xbe, 0x9b, 0x14, 0xb6, 0x22, 0x71, 0x5a, 0x5f, 0x8c, 0xd3, 0x3c, 0x19, 0xbc, 0x0f, + 0xac, 0xef, 0x9d, 0x09, 0xdf, 0x48, 0x04, 0x26, 0xd5, 0x21, 0x3d, 0x03, 0xe7, 0x0d, 0x28, 0x0f, + 0x6d, 0x4b, 0xa0, 0x9d, 0x43, 0x3a, 0xa6, 0x6c, 0x44, 0x6d, 0xfe, 0x18, 0xca, 0xe4, 0x1f, 0xa0, + 0x56, 0xac, 0xbc, 0xf4, 0xe4, 0x2b, 0x57, 0x25, 0x64, 0x80, 0x2f, 0xa2, 0x97, 0x6f, 0xdb, 0x92, + 0xe2, 0xd3, 0x65, 0x23, 0x6a, 0x63, 0x87, 0x49, 0xde, 0x93, 0x1d, 0xae, 0xaa, 0x0e, 0x4f, 0xc3, + 0xf9, 0xdb, 0x70, 0x83, 0x60, 0x53, 0x87, 0x24, 0x6e, 0x35, 0x64, 0x3a, 0xff, 0x21, 0x1a, 0x2c, + 0x63, 0x73, 0x20, 0x76, 0xed, 0x91, 0x2d, 0xeb, 0xb5, 0xbb, 0x99, 0x7b, 0x05, 0x23, 0x06, 0xf0, + 0xd7, 0x61, 0xcd, 0x12, 0x27, 0xe6, 0xc4, 0x91, 0x3d, 0x31, 0x1a, 0x3b, 0xa6, 0x14, 0x1d, 0x8b, + 0x64, 0xb4, 0x62, 0xcc, 0x3e, 0xe0, 0x6f, 0xc0, 0x35, 0x0d, 0x3c, 0x88, 0xb2, 0x0a, 0x1d, 0x8b, + 0xc2, 0x77, 0x15, 0x63, 0xde, 0xa3, 0xe6, 0x9e, 0x56, 0xc3, 0x78, 0x80, 0xa2, 0x9f, 0x1a, 0x2a, + 0xd0, 0x40, 0xaa, 0x13, 0xf9, 0x91, 0xe9, 0x38, 0xc2, 0xbf, 0x50, 0x4e, 0xee, 0x63, 0xd3, 0x3d, + 0x36, 0x5d, 0x96, 0xa3, 0x33, 0xd6, 0x74, 0x84, 0x6b, 0x99, 0xbe, 0x3a, 0x91, 0x1f, 0xd1, 0x81, + 0x5e, 0x68, 0xde, 0x83, 0x3c, 0x4d, 0x69, 0x05, 0x0a, 0xca, 0x4b, 0x22, 0x8f, 0x59, 0x7b, 0x48, + 0xa4, 0x91, 0x77, 0x71, 0xfb, 0xb1, 0x6c, 0xe3, 0x1f, 0x14, 0xa1, 0x1c, 0x4e, 0x5e, 0x98, 0x43, + 0xc8, 0xc4, 0x39, 0x04, 0x34, 0xe3, 0x82, 0xa7, 0x76, 0x60, 0x1f, 0x6b, 0xb3, 0xb4, 0x6c, 0xc4, + 0x00, 0xb4, 0x84, 0x9e, 0xdb, 0x96, 0x1c, 0xd2, 0x9e, 0x29, 0x18, 0xaa, 0xc1, 0xef, 0xc1, 0xaa, + 0x85, 0xf3, 0xe0, 0xf6, 0x9d, 0x89, 0x25, 0x7a, 0x78, 0x8a, 0xaa, 0x30, 0xc1, 0x34, 0x98, 0x7f, + 0x0c, 0x20, 0xed, 0x91, 0xd8, 0xf6, 0xfc, 0x91, 0x29, 0xb5, 0x6f, 0xf0, 0x8d, 0x97, 0x93, 0xea, + 0xf5, 0x5e, 0xc4, 0xc0, 0x48, 0x30, 0x43, 0xd6, 0xf8, 0x36, 0xcd, 0xba, 0xf4, 0x99, 0x58, 0x6f, + 0x45, 0x0c, 0x8c, 0x04, 0x33, 0xde, 0x83, 0xd2, 0x89, 0xe7, 0x8f, 0x26, 0x8e, 0xa9, 0xcf, 0xdc, + 0xf7, 0x5f, 0x92, 0xef, 0xb6, 0xa2, 0x26, 0xdd, 0x13, 0xb2, 0x8a, 0x63, 0xdc, 0x95, 0x05, 0x63, + 0xdc, 0xcd, 0x5f, 0x01, 0x88, 0x7b, 0xc8, 0x6f, 0x02, 0xdf, 0xf3, 0x5c, 0x39, 0x6c, 0x1d, 0x1f, + 0xfb, 0x1b, 0xe2, 0xc4, 0xf3, 0xc5, 0x96, 0x89, 0xc7, 0xeb, 0x0d, 0x58, 0x8b, 0xe0, 0xad, 0x13, + 0x29, 0x7c, 0x04, 0x93, 0x08, 0x74, 0x87, 0x9e, 0x2f, 0x95, 0x8d, 0x47, 0x3f, 0x9f, 0x74, 0x59, + 0x0e, 0x8f, 0xf4, 0x4e, 0xf7, 0x80, 0xe5, 0x9b, 0xf7, 0x00, 0xe2, 0xa9, 0x25, 0x5f, 0x88, 0x7e, + 0xbd, 0xf9, 0x50, 0x7b, 0x46, 0xd4, 0x7a, 0xf8, 0x36, 0xcb, 0x34, 0x7f, 0x91, 0x81, 0x6a, 0x62, + 0x48, 0x69, 0x9f, 0x79, 0xd3, 0x9b, 0xb8, 0x52, 0x39, 0xe9, 0xf4, 0xf3, 0xa9, 0xe9, 0x4c, 0xf0, + 0x70, 0x5f, 0x83, 0x1a, 0xb5, 0xb7, 0xec, 0x40, 0xda, 0x6e, 0x5f, 0xb2, 0x5c, 0x84, 0xa2, 0x0c, + 0x83, 0x7c, 0x84, 0xb2, 0xef, 0x69, 0x50, 0x81, 0x33, 0x58, 0x3e, 0x14, 0x7e, 0x5f, 0x84, 0x48, + 0x64, 0x0c, 0x6b, 0x48, 0x84, 0xa6, 0x8c, 0x61, 0x53, 0x0e, 0xbb, 0x93, 0x11, 0x2b, 0xa3, 0x51, + 0x89, 0x8d, 0xd6, 0x99, 0xf0, 0xd1, 0x96, 0xa9, 0xe0, 0x7b, 0x10, 0x80, 0xbb, 0xc1, 0x74, 0x19, + 0x84, 0xd8, 0x7b, 0xb6, 0xcb, 0xaa, 0x51, 0xc3, 0x3c, 0x67, 0xcb, 0xd8, 0x7f, 0x72, 0x1d, 0x58, + 0xad, 0xf1, 0x5f, 0x73, 0x90, 0x47, 0xbd, 0x8e, 0xbe, 0x6e, 0x52, 0x09, 0xa9, 0xbd, 0x92, 0x04, + 0x7d, 0xb6, 0xd3, 0x08, 0x79, 0x27, 0x4f, 0xa3, 0xf7, 0xa0, 0xda, 0x9f, 0x04, 0xd2, 0x1b, 0xd1, + 0x51, 0xac, 0xb3, 0x5d, 0x37, 0x67, 0xa2, 0x46, 0x34, 0x9d, 0x46, 0x12, 0x95, 0xbf, 0x03, 0xc5, + 0x13, 0x25, 0xf5, 0x2a, 0x6e, 0xf4, 0x85, 0x4b, 0x4e, 0x6b, 0x2d, 0xd9, 0x1a, 0x19, 0xc7, 0x65, + 0xcf, 0xec, 0xd8, 0x24, 0x48, 0x9f, 0xba, 0xc5, 0xe8, 0xd4, 0xfd, 0x15, 0x58, 0x11, 0x38, 0xe1, + 0x87, 0x8e, 0xd9, 0x17, 0x23, 0xe1, 0x86, 0xdb, 0xec, 0xed, 0x97, 0x18, 0x31, 0xad, 0x18, 0x0d, + 0x7b, 0x8a, 0x17, 0x6a, 0x1e, 0xd7, 0xc3, 0xc3, 0x3f, 0x74, 0xec, 0xcb, 0x46, 0x0c, 0x68, 0x7e, + 0x59, 0xeb, 0xcb, 0x12, 0xe4, 0x5a, 0x41, 0x5f, 0x47, 0x40, 0x44, 0xd0, 0x57, 0xee, 0xd5, 0x26, + 0x4d, 0x07, 0xcb, 0x36, 0xdf, 0x84, 0x4a, 0xf4, 0x06, 0x14, 0x9e, 0x7d, 0x4f, 0x76, 0xc7, 0xa2, + 0x6f, 0x9f, 0xd8, 0xc2, 0x52, 0xf2, 0xd9, 0x95, 0xa6, 0x2f, 0x55, 0x10, 0xb1, 0xed, 0x5a, 0x2c, + 0xdb, 0xf8, 0x9d, 0x32, 0x14, 0xd5, 0xe1, 0xab, 0x07, 0x5c, 0x89, 0x06, 0xfc, 0x5d, 0x28, 0x7b, + 0x63, 0xe1, 0x9b, 0xd2, 0xf3, 0x75, 0xe4, 0xe6, 0x9d, 0x97, 0x39, 0xcc, 0xd7, 0x0f, 0x34, 0xb1, + 0x11, 0xb1, 0x99, 0x96, 0xa6, 0xec, 0xac, 0x34, 0xdd, 0x07, 0x16, 0x9e, 0xdb, 0x87, 0x3e, 0xd2, + 0xc9, 0x0b, 0xed, 0x87, 0xcf, 0xc0, 0x79, 0x0f, 0x2a, 0x7d, 0xcf, 0xb5, 0xec, 0x28, 0x8a, 0xb3, + 0xf2, 0xf0, 0xeb, 0x2f, 0xd5, 0xc3, 0xcd, 0x90, 0xda, 0x88, 0x19, 0xf1, 0xd7, 0xa1, 0x70, 0x86, + 0x62, 0x46, 0xf2, 0x74, 0xb9, 0x10, 0x2a, 0x24, 0xfe, 0x09, 0x54, 0x7f, 0x30, 0xb1, 0xfb, 0xa7, + 0x07, 0xc9, 0x28, 0xe1, 0x7b, 0x2f, 0xd5, 0x8b, 0xef, 0xc6, 0xf4, 0x46, 0x92, 0x59, 0x42, 0xb4, + 0x4b, 0x7f, 0x0c, 0xd1, 0x2e, 0xcf, 0x8a, 0xb6, 0x01, 0x35, 0x57, 0x04, 0x52, 0x58, 0xdb, 0xda, + 0x56, 0x83, 0xcf, 0x60, 0xab, 0xa5, 0x59, 0x34, 0xbf, 0x04, 0xe5, 0x70, 0xc1, 0x79, 0x11, 0xb2, + 0xfb, 0xe8, 0x14, 0x15, 0x21, 0x7b, 0xe0, 0x2b, 0x69, 0x6b, 0xa1, 0xb4, 0x35, 0xff, 0x30, 0x03, + 0x95, 0x68, 0xd2, 0xd3, 0x9a, 0xb3, 0xfd, 0x83, 0x89, 0xe9, 0xb0, 0x0c, 0xb9, 0xcb, 0x9e, 0x54, + 0x2d, 0x52, 0xd6, 0x8f, 0x28, 0x59, 0xef, 0xb3, 0x1c, 0x99, 0x08, 0x22, 0x08, 0x58, 0x9e, 0x73, + 0x58, 0xd1, 0xe0, 0x03, 0x5f, 0xa1, 0x16, 0x50, 0xf1, 0xe1, 0xd3, 0x10, 0x50, 0x54, 0x16, 0xc5, + 0xa9, 0x50, 0x0a, 0x72, 0xdf, 0x93, 0xd4, 0x28, 0x63, 0xa7, 0x3a, 0x2e, 0xab, 0xe0, 0x3b, 0xf7, + 0x3d, 0xd9, 0x41, 0x95, 0x18, 0xb9, 0x67, 0xd5, 0xf0, 0xf5, 0xd4, 0x22, 0x8d, 0xd8, 0x72, 0x9c, + 0x8e, 0xcb, 0x6a, 0xfa, 0x81, 0x6a, 0xad, 0x20, 0xc7, 0xf6, 0xb9, 0xd9, 0x47, 0xf2, 0x55, 0xd4, + 0xb0, 0x48, 0xa3, 0xdb, 0x0c, 0xb7, 0x64, 0xfb, 0xdc, 0x0e, 0x64, 0xc0, 0xd6, 0x9a, 0xff, 0x36, + 0x03, 0xd5, 0xc4, 0x02, 0xa3, 0xfb, 0x47, 0x88, 0x78, 0x94, 0x29, 0x6f, 0xf0, 0x63, 0x9c, 0x46, + 0xdf, 0x0a, 0x8f, 0xa9, 0x9e, 0x87, 0x3f, 0xb3, 0xf8, 0xbe, 0x9e, 0x37, 0xf2, 0x7c, 0xdf, 0x7b, + 0xae, 0x4c, 0x9f, 0x5d, 0x33, 0x90, 0xcf, 0x84, 0x38, 0x65, 0x79, 0x1c, 0xea, 0xe6, 0xc4, 0xf7, + 0x85, 0xab, 0x00, 0x05, 0xea, 0x9c, 0x38, 0x57, 0xad, 0x22, 0x32, 0x45, 0x64, 0x3a, 0x07, 0x59, + 0x09, 0x15, 0x81, 0xc6, 0x56, 0x90, 0x32, 0x22, 0x20, 0xba, 0x6a, 0x56, 0xf0, 0x50, 0x51, 0x11, + 0x8a, 0x83, 0x93, 0x2d, 0xf3, 0x22, 0x68, 0x0d, 0x3c, 0x06, 0xd3, 0xc0, 0x7d, 0xef, 0x39, 0xab, + 0x36, 0x26, 0x00, 0xb1, 0x4f, 0x86, 0xbe, 0x28, 0x0a, 0x44, 0x94, 0x43, 0xd0, 0x2d, 0x7e, 0x00, + 0x80, 0xbf, 0x08, 0x33, 0x74, 0x48, 0x5f, 0xc2, 0x50, 0x26, 0x3a, 0x23, 0xc1, 0xa2, 0xf1, 0x17, + 0xa0, 0x12, 0x3d, 0xe0, 0x75, 0x28, 0x91, 0x49, 0x1b, 0xbd, 0x36, 0x6c, 0xa2, 0x7d, 0x66, 0xbb, + 0x96, 0x38, 0x27, 0xbd, 0x52, 0x30, 0x54, 0x03, 0x7b, 0x39, 0xb4, 0x2d, 0x4b, 0xb8, 0x61, 0xa6, + 0x47, 0xb5, 0xe6, 0xe5, 0xe3, 0xf3, 0x73, 0xf3, 0xf1, 0x8d, 0x5f, 0x85, 0x6a, 0xc2, 0x69, 0xbc, + 0x74, 0xd8, 0x89, 0x8e, 0x65, 0xd3, 0x1d, 0xbb, 0x0d, 0x95, 0xb0, 0x06, 0x24, 0xa0, 0xb3, 0xad, + 0x62, 0xc4, 0x80, 0xc6, 0x3f, 0xcd, 0xa2, 0x25, 0x8b, 0x43, 0x9b, 0x76, 0xf4, 0xb6, 0xa1, 0x18, + 0x48, 0x53, 0x4e, 0xc2, 0x62, 0x86, 0x05, 0x37, 0x68, 0x97, 0x68, 0x76, 0x96, 0x0c, 0x4d, 0xcd, + 0x3f, 0x80, 0x9c, 0x34, 0x07, 0x3a, 0x50, 0xfa, 0x95, 0xc5, 0x98, 0xf4, 0xcc, 0xc1, 0xce, 0x92, + 0x81, 0x74, 0x7c, 0x17, 0xca, 0x7d, 0x1d, 0xdb, 0xd2, 0x4a, 0x71, 0x41, 0x5f, 0x2c, 0x8c, 0x88, + 0xed, 0x2c, 0x19, 0x11, 0x07, 0xfe, 0x1d, 0xc8, 0xa3, 0x75, 0xa9, 0x6b, 0x3e, 0x16, 0xf4, 0x31, + 0x71, 0xbb, 0xec, 0x2c, 0x19, 0x44, 0xb9, 0x51, 0x82, 0x02, 0xe9, 0xe0, 0x46, 0x1d, 0x8a, 0x6a, + 0xac, 0xd3, 0x33, 0xd7, 0xb8, 0x05, 0xb9, 0x9e, 0x39, 0x40, 0x0b, 0xdf, 0xb6, 0x02, 0x1d, 0x2a, + 0xc1, 0x9f, 0x8d, 0x57, 0xe2, 0x38, 0x5d, 0x32, 0x04, 0x9c, 0x49, 0x85, 0x80, 0x1b, 0x45, 0xc8, + 0xe3, 0x1b, 0x1b, 0xb7, 0xaf, 0xf2, 0x16, 0x1a, 0xff, 0x28, 0x87, 0x8e, 0x85, 0x14, 0xe7, 0x73, + 0xc3, 0xdb, 0x1f, 0x41, 0x65, 0xec, 0x7b, 0x7d, 0x11, 0x04, 0x9e, 0xaf, 0x8d, 0xa3, 0xd7, 0x5f, + 0x9c, 0x7a, 0x5e, 0x3f, 0x0c, 0x69, 0x8c, 0x98, 0xbc, 0xf9, 0xaf, 0xb3, 0x50, 0x89, 0x1e, 0x28, + 0x7f, 0x46, 0x8a, 0x73, 0x15, 0xca, 0xdc, 0x13, 0xfe, 0xc8, 0xb4, 0x2d, 0xa5, 0x3d, 0x36, 0x87, + 0x66, 0x68, 0xe4, 0x7e, 0xec, 0x4d, 0xe4, 0xe4, 0x58, 0xa8, 0x10, 0xd6, 0x53, 0x7b, 0x24, 0x3c, + 0x96, 0xa7, 0xe4, 0x11, 0x0a, 0x76, 0xdf, 0xf1, 0x26, 0x16, 0x2b, 0x60, 0xfb, 0x11, 0x1d, 0x6f, + 0x7b, 0xe6, 0x38, 0x50, 0x3a, 0x73, 0xcf, 0xf6, 0x3d, 0x56, 0x42, 0xa2, 0x6d, 0x7b, 0x30, 0x32, + 0x59, 0x19, 0x99, 0xf5, 0x9e, 0xdb, 0x12, 0x95, 0x70, 0x05, 0xcd, 0xd4, 0x83, 0xb1, 0x70, 0xbb, + 0xd2, 0x17, 0x42, 0xee, 0x99, 0x63, 0x15, 0xd3, 0x34, 0x84, 0x65, 0xd9, 0x52, 0xe9, 0xcf, 0x6d, + 0xb3, 0x2f, 0x8e, 0x3d, 0xef, 0x94, 0x2d, 0xa3, 0xa2, 0xe9, 0xb8, 0x81, 0x34, 0x07, 0xbe, 0x39, + 0x52, 0x3a, 0xb4, 0x27, 0x1c, 0x41, 0xad, 0x15, 0x7a, 0xb7, 0x2d, 0x87, 0x93, 0xe3, 0x47, 0xe8, + 0xf7, 0xad, 0xaa, 0x3c, 0x93, 0x25, 0xc6, 0x02, 0x75, 0xe8, 0x32, 0x94, 0x37, 0x6c, 0xc7, 0x3e, + 0xb6, 0x1d, 0x9b, 0xad, 0x21, 0x6a, 0xfb, 0xbc, 0x6f, 0x3a, 0xb6, 0xe5, 0x9b, 0xcf, 0x19, 0xc7, + 0xce, 0x3d, 0xf6, 0xbd, 0x53, 0x9b, 0x5d, 0x43, 0x44, 0x72, 0x03, 0xcf, 0xec, 0x1f, 0xb2, 0xeb, + 0x94, 0x2b, 0x3b, 0x15, 0xb2, 0x3f, 0x3c, 0x31, 0x8f, 0xd9, 0x8d, 0x38, 0xa4, 0x77, 0xb3, 0xb1, + 0x06, 0xab, 0x53, 0x59, 0xf9, 0x46, 0x49, 0x7b, 0x9f, 0x8d, 0x1a, 0x54, 0x13, 0xe9, 0xd2, 0xc6, + 0xab, 0x50, 0x0e, 0x93, 0xa9, 0xe8, 0xa5, 0xdb, 0x81, 0x0a, 0x03, 0x6b, 0x21, 0x89, 0xda, 0x8d, + 0xff, 0x98, 0x81, 0xa2, 0xca, 0x64, 0xf3, 0x8d, 0xa8, 0xf2, 0x24, 0xb3, 0x40, 0xf6, 0x52, 0x11, + 0xe9, 0xdc, 0x6f, 0x54, 0x7e, 0x72, 0x1d, 0x0a, 0x0e, 0xb9, 0xe3, 0x5a, 0x7d, 0x51, 0x23, 0xa1, + 0x6d, 0x72, 0x29, 0x6d, 0x73, 0x1b, 0x2a, 0xe6, 0x44, 0x7a, 0x94, 0xa4, 0xd3, 0x19, 0x8c, 0x18, + 0xd0, 0x6c, 0x45, 0xd9, 0xe8, 0x30, 0x30, 0x49, 0x36, 0x63, 0xcf, 0x17, 0x42, 0x05, 0x1d, 0xc9, + 0xd7, 0xce, 0xd2, 0x49, 0xe2, 0x8d, 0xc6, 0x66, 0x5f, 0x12, 0x80, 0xce, 0x58, 0x54, 0xb5, 0x2c, + 0x8f, 0x7b, 0x60, 0x73, 0x68, 0xca, 0xe6, 0x09, 0x94, 0x0f, 0xbd, 0x60, 0xfa, 0xc4, 0x2e, 0x41, + 0xae, 0xe7, 0x8d, 0x95, 0xfd, 0xb9, 0xe1, 0x49, 0xb2, 0x3f, 0xd5, 0x01, 0x7d, 0x22, 0x95, 0xc8, + 0x19, 0xf6, 0x60, 0x28, 0x95, 0x9f, 0xde, 0x71, 0x5d, 0xe1, 0xb3, 0x02, 0xae, 0xb0, 0x21, 0xc6, + 0x68, 0xf3, 0xb2, 0x22, 0xae, 0x29, 0xc1, 0xb7, 0x6d, 0x3f, 0x90, 0xac, 0xd4, 0xec, 0xe0, 0x59, + 0x6b, 0x0f, 0xe8, 0x88, 0xa4, 0x1f, 0xc4, 0x6a, 0x09, 0xbb, 0x48, 0xcd, 0x4d, 0xe1, 0xa2, 0x04, + 0x92, 0x6f, 0xa5, 0x1c, 0x43, 0x7a, 0x41, 0x16, 0xcf, 0x37, 0x6a, 0x7f, 0x34, 0x09, 0xa4, 0x7d, + 0x72, 0xc1, 0x72, 0xcd, 0x67, 0x50, 0x4b, 0x15, 0x39, 0xf1, 0xeb, 0xc0, 0x52, 0x00, 0xec, 0xfa, + 0x12, 0xbf, 0x05, 0xd7, 0x52, 0xd0, 0x3d, 0xdb, 0xb2, 0x28, 0x12, 0x3c, 0xfd, 0x20, 0x1c, 0xe0, + 0x46, 0x05, 0x4a, 0x7d, 0xb5, 0x86, 0xcd, 0x43, 0xa8, 0xd1, 0xa2, 0xee, 0x09, 0x69, 0x1e, 0xb8, + 0xce, 0xc5, 0x1f, 0xbb, 0x12, 0xad, 0xf9, 0x55, 0xed, 0x7e, 0xa1, 0x36, 0x39, 0xf1, 0xbd, 0x11, + 0xf1, 0x2a, 0x18, 0xf4, 0x1b, 0xb9, 0x4b, 0x4f, 0x4b, 0x46, 0x56, 0x7a, 0xcd, 0x5f, 0x56, 0xa0, + 0xd4, 0xea, 0xf7, 0xd1, 0x61, 0x9c, 0x79, 0xf3, 0x3b, 0x50, 0xec, 0x7b, 0xee, 0x89, 0x3d, 0xd0, + 0xda, 0x7a, 0xda, 0x6e, 0xd4, 0x74, 0x28, 0x8e, 0x27, 0xf6, 0xc0, 0xd0, 0xc8, 0x48, 0xa6, 0x4f, + 0x9b, 0xc2, 0x95, 0x64, 0x4a, 0xe5, 0x46, 0x87, 0xcb, 0x03, 0xc8, 0xdb, 0xee, 0x89, 0xa7, 0xcb, + 0x46, 0x3f, 0x7f, 0x09, 0x11, 0xd5, 0x4e, 0x12, 0x62, 0xe3, 0x3f, 0x67, 0xa0, 0xa8, 0x5e, 0xcd, + 0x5f, 0x85, 0x15, 0xe1, 0xe2, 0x56, 0x0b, 0x15, 0xbd, 0xde, 0x63, 0x53, 0x50, 0x34, 0x69, 0x35, + 0x44, 0x1c, 0x4f, 0x06, 0x3a, 0x32, 0x93, 0x04, 0xf1, 0xf7, 0xe0, 0x96, 0x6a, 0x1e, 0xfa, 0xc2, + 0x17, 0x8e, 0x30, 0x03, 0xb1, 0x39, 0x34, 0x5d, 0x57, 0x38, 0xfa, 0xd8, 0xbf, 0xec, 0x31, 0x6f, + 0xc2, 0xb2, 0x7a, 0xd4, 0x1d, 0x9b, 0x7d, 0x11, 0xe8, 0xbd, 0x94, 0x82, 0xf1, 0xaf, 0x41, 0x81, + 0xaa, 0x6a, 0xeb, 0xd6, 0xd5, 0x4b, 0xa9, 0xb0, 0x1a, 0x5e, 0x74, 0x2e, 0xb5, 0x00, 0xd4, 0x34, + 0xa1, 0x4b, 0xa6, 0x75, 0xc3, 0x17, 0xaf, 0x9c, 0x57, 0xf2, 0x0e, 0x13, 0x44, 0xd8, 0x3f, 0x4b, + 0x38, 0x82, 0xca, 0x1f, 0xf1, 0xdc, 0xcc, 0x52, 0xde, 0x25, 0x05, 0x6b, 0xfc, 0xa7, 0x3c, 0xe4, + 0x71, 0x86, 0x11, 0x79, 0xe8, 0x8d, 0x44, 0x14, 0x7d, 0x56, 0x86, 0x48, 0x0a, 0x86, 0x86, 0x8f, + 0xa9, 0x0a, 0x00, 0x22, 0x34, 0xa5, 0x5a, 0xa6, 0xc1, 0x88, 0x39, 0xf6, 0xbd, 0x13, 0xdb, 0x89, + 0x31, 0xb5, 0x89, 0x34, 0x05, 0xe6, 0x5f, 0x87, 0x9b, 0x23, 0xd3, 0x3f, 0x15, 0x92, 0x76, 0xf7, + 0x33, 0xcf, 0x3f, 0x0d, 0x70, 0xe6, 0x3a, 0x96, 0x0e, 0x5b, 0x5e, 0xf2, 0x94, 0xbf, 0x0e, 0x6b, + 0xcf, 0xc3, 0x66, 0xf4, 0x0e, 0x15, 0x38, 0x9c, 0x7d, 0x80, 0xca, 0xd8, 0x12, 0x67, 0x36, 0xf1, + 0x2d, 0xab, 0xda, 0xda, 0xb0, 0x8d, 0xa2, 0x64, 0xaa, 0x89, 0xec, 0xea, 0x37, 0xeb, 0xfc, 0x53, + 0x1a, 0x8a, 0x7a, 0x53, 0xd5, 0x1c, 0x05, 0x1d, 0x8b, 0xe2, 0xae, 0x15, 0x23, 0x06, 0xa0, 0xa0, + 0xd1, 0x2b, 0x9f, 0x2a, 0x95, 0x5b, 0x53, 0x0e, 0x6a, 0x02, 0x84, 0x18, 0x52, 0xf4, 0x87, 0xe1, + 0x4b, 0x54, 0x50, 0x34, 0x09, 0xe2, 0x77, 0x00, 0x06, 0xa6, 0x14, 0xcf, 0xcd, 0x8b, 0x27, 0xbe, + 0x53, 0x17, 0x2a, 0x91, 0x12, 0x43, 0xd0, 0xc5, 0x75, 0xbc, 0xbe, 0xe9, 0x74, 0xa5, 0xe7, 0x9b, + 0x03, 0x71, 0x68, 0xca, 0x61, 0x7d, 0xa0, 0x5c, 0xdc, 0x69, 0x38, 0x8e, 0x58, 0xda, 0x23, 0xf1, + 0x89, 0xe7, 0x8a, 0xfa, 0x50, 0x8d, 0x38, 0x6c, 0x63, 0x4f, 0x4c, 0xd7, 0x74, 0x2e, 0xa4, 0xdd, + 0xc7, 0xb1, 0xd8, 0xaa, 0x27, 0x09, 0x10, 0x05, 0x15, 0x84, 0xc4, 0x79, 0xec, 0x58, 0xf5, 0xef, + 0xab, 0xb1, 0x46, 0x00, 0x5c, 0x5d, 0x21, 0x87, 0xc2, 0x17, 0x93, 0x51, 0xcb, 0xb2, 0x7c, 0x11, + 0x04, 0xf5, 0x53, 0xb5, 0xba, 0x53, 0xe0, 0xc6, 0x37, 0x29, 0xcd, 0x35, 0x6c, 0xbe, 0x05, 0xb5, + 0x5d, 0xec, 0x61, 0x6b, 0x6c, 0x77, 0xfb, 0xde, 0x58, 0xa0, 0x42, 0xa7, 0x80, 0x31, 0x85, 0x17, + 0xaa, 0x50, 0xfa, 0x28, 0xf0, 0xdc, 0xd6, 0x61, 0x47, 0x1d, 0x31, 0xdb, 0x13, 0xc7, 0x61, 0xd9, + 0xe6, 0x01, 0x40, 0x2c, 0xd9, 0x78, 0x5c, 0xb4, 0x28, 0xa7, 0xc4, 0x96, 0x54, 0x30, 0xcb, 0xb5, + 0x6c, 0x77, 0xb0, 0xa5, 0x85, 0x99, 0x65, 0x10, 0x48, 0x41, 0x0a, 0x61, 0x45, 0x40, 0x32, 0x67, + 0xa8, 0x25, 0x2c, 0x96, 0x6b, 0xfe, 0x9f, 0x0c, 0x54, 0x13, 0x25, 0x14, 0x7f, 0x82, 0x65, 0x1f, + 0x78, 0xd8, 0xa3, 0xb9, 0x80, 0xeb, 0xa6, 0x04, 0x3d, 0x6a, 0xe3, 0xaa, 0xea, 0x0a, 0x0f, 0x7c, + 0xaa, 0x42, 0x12, 0x09, 0xc8, 0x67, 0x2a, 0xf9, 0x68, 0x3e, 0xd4, 0x71, 0x9d, 0x2a, 0x94, 0x9e, + 0xb8, 0xa7, 0xae, 0xf7, 0xdc, 0x55, 0xe7, 0x34, 0xd5, 0xf1, 0xa4, 0x32, 0x92, 0x61, 0xa9, 0x4d, + 0xae, 0xf9, 0x2f, 0xf2, 0x53, 0x25, 0x6f, 0x6d, 0x28, 0x2a, 0x67, 0x82, 0xec, 0xdc, 0xd9, 0x1a, + 0xa5, 0x24, 0xb2, 0xce, 0x7e, 0x25, 0x40, 0x86, 0x26, 0x46, 0x2b, 0x3f, 0x2a, 0x08, 0xcd, 0xce, + 0xcd, 0xd2, 0xa5, 0x18, 0x85, 0xba, 0x39, 0x55, 0x13, 0x1d, 0x71, 0x68, 0xfc, 0xb5, 0x0c, 0x5c, + 0x9f, 0x87, 0x92, 0xac, 0x1c, 0xcf, 0xa4, 0x2b, 0xc7, 0xbb, 0x53, 0x95, 0xd8, 0x59, 0x1a, 0xcd, + 0x83, 0x97, 0xec, 0x44, 0xba, 0x2e, 0xbb, 0xf9, 0x7b, 0x19, 0x58, 0x9b, 0x19, 0x73, 0xc2, 0x8e, + 0x01, 0x28, 0x2a, 0xc9, 0x52, 0x85, 0x52, 0x51, 0xe9, 0x8a, 0x4a, 0x3d, 0xd0, 0x09, 0x1f, 0xa8, + 0x5a, 0x00, 0x5d, 0x7b, 0xae, 0x8c, 0x68, 0x5c, 0x35, 0x3c, 0x40, 0x06, 0x42, 0x85, 0x69, 0x95, + 0xb1, 0xa5, 0x21, 0x45, 0x65, 0xe8, 0xaa, 0xfc, 0x08, 0x2b, 0x51, 0x01, 0xd6, 0x64, 0xec, 0xd8, + 0x7d, 0x6c, 0x96, 0x79, 0x03, 0x6e, 0xaa, 0x0b, 0x08, 0xda, 0xa9, 0x3c, 0xe9, 0x0d, 0x6d, 0xda, + 0x1c, 0xac, 0x82, 0xef, 0x39, 0x9c, 0x1c, 0x3b, 0x76, 0x30, 0x64, 0xd0, 0x34, 0xe0, 0xda, 0x9c, + 0x01, 0x52, 0x97, 0x9f, 0xea, 0xee, 0xaf, 0x00, 0x6c, 0x3d, 0x0d, 0x3b, 0xcd, 0x32, 0x9c, 0xc3, + 0xca, 0xd6, 0xd3, 0x24, 0x77, 0xbd, 0x79, 0x9e, 0xa2, 0xf6, 0x0a, 0x58, 0xae, 0xf9, 0x6b, 0x99, + 0xb0, 0x42, 0xa2, 0xf1, 0xe7, 0xa1, 0xa6, 0x3a, 0x7c, 0x68, 0x5e, 0x38, 0x9e, 0x69, 0xf1, 0x36, + 0xac, 0x04, 0xd1, 0x15, 0x99, 0xc4, 0x81, 0x35, 0x6d, 0x08, 0x74, 0x53, 0x48, 0xc6, 0x14, 0x51, + 0xe8, 0x28, 0x65, 0xe3, 0xb4, 0x0a, 0x27, 0x97, 0xcf, 0xa4, 0x2d, 0xb7, 0x4c, 0x4e, 0x9c, 0xd9, + 0xfc, 0x1a, 0xac, 0x75, 0x63, 0xe5, 0xae, 0x2c, 0x6a, 0x14, 0x0e, 0x75, 0x32, 0x6c, 0x85, 0xc2, + 0xa1, 0x9b, 0xcd, 0x7f, 0x5c, 0x02, 0x88, 0x53, 0x48, 0x73, 0xf6, 0xfc, 0xbc, 0x8a, 0x88, 0x99, + 0x84, 0x6e, 0xee, 0xa5, 0x13, 0xba, 0xef, 0x45, 0x86, 0xbd, 0x0a, 0x2f, 0x4f, 0x97, 0x85, 0xc7, + 0x7d, 0x9a, 0x36, 0xe7, 0x53, 0x05, 0x43, 0x85, 0xe9, 0x82, 0xa1, 0xbb, 0xb3, 0xd5, 0x85, 0x53, + 0xca, 0x28, 0x8e, 0x5b, 0x94, 0x52, 0x71, 0x8b, 0x06, 0x94, 0x7d, 0x61, 0x5a, 0x9e, 0xeb, 0x5c, + 0x84, 0x79, 0xc3, 0xb0, 0xcd, 0xdf, 0x82, 0x82, 0xa4, 0x5b, 0x3e, 0x65, 0xda, 0x3b, 0x2f, 0x58, + 0x38, 0x85, 0x8b, 0x9a, 0xcd, 0x0e, 0x74, 0x49, 0xa0, 0x3a, 0x35, 0xcb, 0x46, 0x02, 0xc2, 0xd7, + 0x81, 0xdb, 0xe8, 0xc4, 0x39, 0x8e, 0xb0, 0x36, 0x2e, 0xb6, 0x54, 0x3a, 0x8f, 0xce, 0xf5, 0xb2, + 0x31, 0xe7, 0x49, 0xb8, 0xfe, 0xcb, 0xf1, 0xfa, 0x53, 0x97, 0xcf, 0xec, 0x00, 0x47, 0x5a, 0x23, + 0xf3, 0x25, 0x6a, 0xa3, 0xe5, 0x10, 0x6e, 0x58, 0x35, 0x97, 0x24, 0xbd, 0x71, 0x4e, 0xfc, 0x92, + 0xa7, 0xe1, 0xf4, 0xaa, 0xc0, 0xcd, 0x2a, 0x31, 0x8d, 0x01, 0xa4, 0xc9, 0xfb, 0x9e, 0xbb, 0x8f, + 0x12, 0xc1, 0xb4, 0x26, 0xd7, 0x6d, 0x1c, 0xef, 0xd8, 0x99, 0xf8, 0xa6, 0x43, 0x4f, 0xd7, 0x94, + 0x26, 0x8f, 0x21, 0xcd, 0x3f, 0xc8, 0x46, 0xce, 0x53, 0x05, 0x0a, 0xc7, 0x66, 0x60, 0xf7, 0xd5, + 0xe9, 0xa6, 0x8d, 0x1e, 0x75, 0xba, 0x49, 0xcf, 0xf2, 0x58, 0x16, 0xfd, 0xa0, 0x40, 0xe8, 0x74, + 0x4e, 0x7c, 0xa7, 0x8a, 0xe5, 0x51, 0x05, 0x84, 0x92, 0xa4, 0x6a, 0x86, 0x88, 0x94, 0x82, 0x73, + 0x56, 0x54, 0x8d, 0x49, 0x6e, 0x36, 0x1d, 0x31, 0xac, 0x8c, 0x38, 0xae, 0x27, 0x85, 0x0a, 0x4d, + 0x92, 0xdc, 0x33, 0x40, 0x36, 0xe1, 0x25, 0x01, 0x56, 0x45, 0xc7, 0x24, 0x64, 0xaa, 0xe2, 0x89, + 0x01, 0xb9, 0x6d, 0xcb, 0xb8, 0xef, 0xd3, 0x0f, 0x58, 0x0d, 0x7b, 0x14, 0x5f, 0xd5, 0x62, 0x2b, + 0xc8, 0xd5, 0xa4, 0x4a, 0x96, 0x55, 0xfc, 0x79, 0x46, 0xf5, 0x2d, 0x0c, 0xdf, 0x6a, 0xa1, 0x5e, + 0x5a, 0xc3, 0x9e, 0x45, 0x86, 0x0e, 0xe3, 0xe8, 0x77, 0x8d, 0x4d, 0x74, 0x82, 0xec, 0xb1, 0xe9, + 0x4a, 0x76, 0x0d, 0x87, 0x3a, 0xb6, 0x4e, 0xd8, 0x75, 0x24, 0xe9, 0x0f, 0x4d, 0xc9, 0x6e, 0x20, + 0x0e, 0xfe, 0xda, 0x12, 0x3e, 0x4a, 0x0a, 0xbb, 0x89, 0x38, 0xd2, 0x1c, 0xb0, 0x5b, 0xcd, 0xdf, + 0x8c, 0xeb, 0xa1, 0xdf, 0x88, 0xdc, 0x93, 0x45, 0xb6, 0x0f, 0x3a, 0x30, 0xf3, 0xf6, 0x72, 0x1b, + 0xd6, 0x7c, 0xf1, 0x83, 0x89, 0x9d, 0xba, 0x25, 0x90, 0xbb, 0xba, 0x0c, 0x65, 0x96, 0xa2, 0x79, + 0x06, 0x6b, 0x61, 0xe3, 0x99, 0x2d, 0x87, 0x14, 0x47, 0xe2, 0x6f, 0x25, 0xae, 0x31, 0x64, 0xe6, + 0x5e, 0xff, 0x8a, 0x58, 0xc6, 0xd7, 0x16, 0xa2, 0x3c, 0x41, 0x76, 0x81, 0x3c, 0x41, 0xf3, 0x7f, + 0x27, 0x13, 0xcf, 0xca, 0x61, 0xb3, 0x22, 0x87, 0x6d, 0x36, 0x11, 0x1d, 0x87, 0xfe, 0xb3, 0x2f, + 0x13, 0xfa, 0x9f, 0x57, 0xd4, 0xf1, 0x3e, 0xfa, 0x0f, 0xb4, 0x33, 0x9f, 0x2e, 0x90, 0xd6, 0x48, + 0xe1, 0xf2, 0x0d, 0x4a, 0x2b, 0x9b, 0x5d, 0x55, 0x71, 0x54, 0x98, 0x7b, 0xa9, 0x28, 0x99, 0x3f, + 0xd6, 0x98, 0x46, 0x82, 0x2a, 0xa1, 0xc7, 0x8a, 0xf3, 0xf4, 0x18, 0xfa, 0xce, 0x5a, 0xc3, 0x45, + 0x6d, 0x95, 0x05, 0x52, 0xbf, 0x43, 0xf6, 0xb4, 0xc7, 0xcb, 0xc6, 0x0c, 0x1c, 0x8d, 0xbd, 0xd1, + 0xc4, 0x91, 0xb6, 0x4e, 0x74, 0xa8, 0xc6, 0xf4, 0xad, 0xc7, 0xca, 0xec, 0xad, 0xc7, 0x0f, 0x01, + 0x02, 0x81, 0xbb, 0x63, 0xcb, 0xee, 0x4b, 0x5d, 0x97, 0x74, 0xe7, 0xb2, 0xb1, 0xe9, 0xf4, 0x4c, + 0x82, 0x02, 0xfb, 0x3f, 0x32, 0xcf, 0x29, 0x65, 0xab, 0x0b, 0x28, 0xa2, 0xf6, 0xb4, 0x76, 0x5f, + 0x99, 0xd5, 0xee, 0x6f, 0x41, 0x21, 0x40, 0x13, 0x9a, 0x2e, 0xee, 0x5c, 0xbe, 0xbe, 0xeb, 0x64, + 0x67, 0x1b, 0x0a, 0x97, 0x02, 0x96, 0xa8, 0xff, 0x3c, 0x9f, 0xae, 0xec, 0x54, 0x8c, 0xb0, 0x99, + 0xd2, 0xb0, 0x37, 0xd3, 0x1a, 0xb6, 0x61, 0x41, 0x51, 0x27, 0x1f, 0xa6, 0x03, 0x05, 0x61, 0xd8, + 0x32, 0x9b, 0x08, 0x5b, 0x46, 0xd5, 0xaf, 0xb9, 0x64, 0xf5, 0xeb, 0xd4, 0xad, 0xbe, 0xc2, 0xcc, + 0xad, 0xbe, 0xe6, 0x27, 0x50, 0x50, 0x3e, 0x01, 0x84, 0xe6, 0xa8, 0x32, 0x65, 0x71, 0x50, 0x2c, + 0xc3, 0xaf, 0x03, 0x0b, 0x04, 0xd9, 0x3a, 0xa2, 0x6b, 0x8e, 0x04, 0x29, 0xc9, 0x2c, 0xaf, 0xc3, + 0x75, 0x85, 0x1b, 0xa4, 0x9f, 0x90, 0xc1, 0xe5, 0xd8, 0xc7, 0xbe, 0xe9, 0x5f, 0xb0, 0x7c, 0xf3, + 0x43, 0x4a, 0xfd, 0x87, 0x02, 0x55, 0x8d, 0x6e, 0x51, 0x2a, 0xb5, 0x6c, 0x69, 0xed, 0x43, 0x95, + 0x23, 0xda, 0xdb, 0x53, 0xf5, 0x74, 0xe4, 0x4e, 0x51, 0x3c, 0x68, 0x39, 0x79, 0xc6, 0xff, 0x89, + 0xed, 0xb7, 0xe6, 0x46, 0xc2, 0x62, 0x4c, 0x17, 0xc8, 0x65, 0x16, 0x2d, 0x90, 0x6b, 0x3e, 0x86, + 0x55, 0x23, 0xad, 0xd3, 0xf9, 0x7b, 0x50, 0xf2, 0xc6, 0x49, 0x3e, 0x2f, 0x92, 0xcb, 0x10, 0xbd, + 0xf9, 0xb3, 0x0c, 0x2c, 0x77, 0x5c, 0x29, 0x7c, 0xd7, 0x74, 0xb6, 0x1d, 0x73, 0xc0, 0xdf, 0x0d, + 0xb5, 0xd4, 0xfc, 0xd8, 0x43, 0x12, 0x37, 0xad, 0xb0, 0x1c, 0x1d, 0x64, 0xe7, 0x37, 0x60, 0x4d, + 0x58, 0xb6, 0xf4, 0x7c, 0x65, 0x27, 0x87, 0x75, 0x8c, 0xd7, 0x81, 0x29, 0x70, 0x97, 0xb6, 0x44, + 0x4f, 0x2d, 0x73, 0x1d, 0xae, 0xa7, 0xa0, 0xa1, 0x11, 0x9c, 0xe5, 0xb7, 0xa1, 0x1e, 0x9f, 0x46, + 0x5b, 0x9e, 0x2b, 0x3b, 0xae, 0x25, 0xce, 0xc9, 0xc8, 0x62, 0xb9, 0xe6, 0x6f, 0x44, 0xe6, 0xdd, + 0x53, 0x5d, 0xe5, 0xe8, 0x7b, 0x5e, 0x7c, 0x85, 0x56, 0xb7, 0x12, 0x57, 0xb5, 0xb3, 0x0b, 0x5c, + 0xd5, 0xfe, 0x30, 0xbe, 0x6e, 0xab, 0x0e, 0x8a, 0x57, 0xe6, 0x9e, 0x3e, 0x54, 0x9c, 0xa5, 0xad, + 0xfb, 0xae, 0x48, 0xdc, 0xbd, 0x7d, 0x53, 0xbb, 0x74, 0xf9, 0x45, 0xac, 0x60, 0x55, 0xc7, 0xf0, + 0xce, 0xf4, 0x1d, 0x8f, 0xc5, 0x8a, 0x24, 0x67, 0x0c, 0x55, 0x78, 0x69, 0x43, 0xf5, 0xdb, 0x53, + 0xde, 0x53, 0x79, 0x6e, 0x38, 0xee, 0x8a, 0x1b, 0xac, 0xdf, 0x86, 0xd2, 0xd0, 0x0e, 0xa4, 0xe7, + 0xab, 0x5b, 0xd5, 0xb3, 0xb7, 0xc0, 0x12, 0xb3, 0xb5, 0xa3, 0x10, 0xa9, 0xa2, 0x2d, 0xa4, 0xe2, + 0xdf, 0x83, 0x35, 0x9a, 0xf8, 0xc3, 0xd8, 0x6a, 0x08, 0xea, 0xd5, 0xb9, 0x95, 0x84, 0x09, 0x56, + 0x1b, 0x53, 0x24, 0xc6, 0x2c, 0x93, 0xc6, 0x00, 0x20, 0x5e, 0x9f, 0x19, 0x2d, 0xf6, 0x19, 0x6e, + 0x55, 0xdf, 0x84, 0x62, 0x30, 0x39, 0x8e, 0xb3, 0x71, 0xba, 0xd5, 0x38, 0x87, 0xc6, 0x8c, 0x75, + 0x70, 0x28, 0x7c, 0xd5, 0xdd, 0x2b, 0xaf, 0x76, 0x7f, 0x98, 0x5c, 0x78, 0x25, 0x9c, 0x77, 0x2f, + 0x59, 0xbd, 0x88, 0x73, 0x42, 0x02, 0x1a, 0xef, 0x40, 0x35, 0x31, 0xa9, 0xa8, 0x99, 0x27, 0xae, + 0xe5, 0x85, 0x21, 0x60, 0xfc, 0xad, 0xae, 0xb6, 0x59, 0x61, 0x10, 0x98, 0x7e, 0x37, 0x0c, 0x60, + 0xd3, 0x13, 0x78, 0x85, 0x87, 0xfd, 0x0a, 0xd4, 0x12, 0x26, 0x5d, 0x14, 0x1e, 0x4c, 0x03, 0x9b, + 0x67, 0xf0, 0xf9, 0x04, 0xbb, 0x43, 0xe1, 0x8f, 0xec, 0x00, 0x0f, 0x12, 0xe5, 0x2c, 0x92, 0x69, + 0x6d, 0x09, 0x57, 0xda, 0x32, 0xd4, 0xa0, 0x51, 0x9b, 0x7f, 0x13, 0x0a, 0x63, 0xe1, 0x8f, 0x02, + 0xad, 0x45, 0xa7, 0x25, 0x68, 0x2e, 0xdb, 0xc0, 0x50, 0x34, 0xcd, 0x7f, 0x98, 0x81, 0xf2, 0x9e, + 0x90, 0x26, 0xda, 0x0e, 0x7c, 0x6f, 0xea, 0x2d, 0xb3, 0x19, 0xe4, 0x10, 0x75, 0x5d, 0xbb, 0xaf, + 0xeb, 0x1d, 0x8d, 0xaf, 0xdb, 0x3b, 0x4b, 0x71, 0xc7, 0x1a, 0x1b, 0x50, 0xd2, 0xe0, 0xc6, 0xbb, + 0xb0, 0x3a, 0x85, 0x49, 0xf3, 0xa2, 0x6c, 0xfb, 0xee, 0xc5, 0x28, 0x2c, 0x73, 0x5a, 0x36, 0xd2, + 0xc0, 0x8d, 0x0a, 0x94, 0xc6, 0x8a, 0xa0, 0xf9, 0x07, 0x37, 0xa8, 0xb8, 0xc6, 0x3e, 0x41, 0x9f, + 0x7e, 0xde, 0xc9, 0x7a, 0x07, 0x80, 0x8e, 0x66, 0x55, 0x82, 0xa1, 0x42, 0xb6, 0x09, 0x08, 0x7f, + 0x3f, 0x8a, 0xb5, 0xe7, 0xe7, 0x1a, 0x55, 0x49, 0xe6, 0xd3, 0x01, 0xf7, 0x3a, 0x94, 0xec, 0x80, + 0xe2, 0x70, 0xba, 0x6c, 0x29, 0x6c, 0xf2, 0x6f, 0x41, 0xd1, 0x1e, 0x8d, 0x3d, 0x5f, 0xea, 0x60, + 0xfc, 0x95, 0x5c, 0x3b, 0x84, 0xb9, 0xb3, 0x64, 0x68, 0x1a, 0xa4, 0x16, 0xe7, 0x44, 0x5d, 0x7e, + 0x31, 0x75, 0xfb, 0x3c, 0xa4, 0x56, 0x34, 0xfc, 0xbb, 0x50, 0x1b, 0xa8, 0xaa, 0x4d, 0xc5, 0x58, + 0x2b, 0x91, 0xaf, 0x5c, 0xc5, 0xe4, 0x51, 0x92, 0x60, 0x67, 0xc9, 0x48, 0x73, 0x40, 0x96, 0x68, + 0xc0, 0x8b, 0x40, 0xf6, 0xbc, 0x8f, 0x3c, 0xdb, 0x25, 0x77, 0xf7, 0x05, 0x2c, 0x8d, 0x24, 0x01, + 0xb2, 0x4c, 0x71, 0xe0, 0x5f, 0x47, 0x8b, 0x27, 0x90, 0xfa, 0x62, 0xfb, 0xdd, 0xab, 0x38, 0xf5, + 0x44, 0xa0, 0xaf, 0xa4, 0x07, 0x92, 0x9f, 0x43, 0x23, 0xb1, 0x49, 0xf4, 0x4b, 0x5a, 0xe3, 0xb1, + 0xef, 0xa1, 0xcf, 0x5c, 0x23, 0x6e, 0x5f, 0xbf, 0x8a, 0xdb, 0xe1, 0xa5, 0xd4, 0x3b, 0x4b, 0xc6, + 0x15, 0xbc, 0x79, 0x0f, 0x3d, 0x3b, 0x3d, 0x84, 0x5d, 0x61, 0x9e, 0x85, 0xd7, 0xe2, 0xef, 0x2f, + 0x34, 0x0b, 0x44, 0xb1, 0xb3, 0x64, 0x4c, 0xf1, 0xe0, 0xbf, 0x0a, 0x6b, 0xa9, 0x77, 0xd2, 0x4d, + 0x58, 0x75, 0x69, 0xfe, 0x6b, 0x0b, 0x0f, 0x03, 0x89, 0x76, 0x96, 0x8c, 0x59, 0x4e, 0x7c, 0x02, + 0x9f, 0x9b, 0x1d, 0xd2, 0x96, 0xe8, 0x3b, 0xb6, 0x2b, 0xf4, 0xfd, 0xfa, 0x77, 0x5e, 0x6e, 0xb6, + 0x34, 0xf1, 0xce, 0x92, 0x71, 0x39, 0x67, 0xfe, 0x17, 0xe1, 0xf6, 0x78, 0xae, 0x8a, 0x51, 0xaa, + 0x4b, 0x5f, 0xcf, 0x7f, 0x6f, 0xc1, 0x37, 0xcf, 0xd0, 0xef, 0x2c, 0x19, 0x57, 0xf2, 0x47, 0xdb, + 0x99, 0x3c, 0x68, 0x5d, 0x5c, 0xae, 0x1a, 0x94, 0xa9, 0xed, 0x3b, 0x3b, 0xc2, 0xb4, 0xa2, 0x7c, + 0x41, 0x0c, 0x68, 0xfc, 0xf7, 0x0c, 0x14, 0xb5, 0xbc, 0xdf, 0x8e, 0x2a, 0x06, 0x22, 0xd5, 0x1d, + 0x03, 0xf8, 0x07, 0x50, 0x11, 0xbe, 0xef, 0xf9, 0x9b, 0x9e, 0x15, 0x16, 0x5b, 0x4e, 0x47, 0x99, + 0x15, 0x9f, 0xf5, 0x76, 0x88, 0x66, 0xc4, 0x14, 0xfc, 0x7d, 0x00, 0xb5, 0xcf, 0x7b, 0xf1, 0x1d, + 0xa1, 0xc6, 0x7c, 0x7a, 0x95, 0x82, 0x8a, 0xb1, 0xe3, 0xb0, 0x5c, 0x98, 0xff, 0x09, 0x9b, 0x91, + 0xc3, 0x59, 0x48, 0x38, 0x9c, 0xb7, 0x75, 0x1c, 0x81, 0xc2, 0x2b, 0xfa, 0xa6, 0x5c, 0x04, 0x68, + 0xfc, 0x7e, 0x06, 0x8a, 0x4a, 0x79, 0xf0, 0xf6, 0xec, 0x88, 0x5e, 0x7b, 0xb1, 0xce, 0x59, 0x9f, + 0x1e, 0xd9, 0xb7, 0x00, 0x94, 0x0e, 0x4a, 0x8c, 0xec, 0xf6, 0x14, 0x1f, 0x4d, 0x1a, 0x96, 0x37, + 0xc7, 0xf8, 0xcd, 0x87, 0xea, 0x36, 0x17, 0x85, 0x84, 0x9f, 0xec, 0xee, 0xb2, 0x25, 0xbe, 0x06, + 0xb5, 0x27, 0xfb, 0x8f, 0xf7, 0x0f, 0x9e, 0xed, 0x1f, 0xb5, 0x0d, 0xe3, 0xc0, 0x50, 0x91, 0xe1, + 0x8d, 0xd6, 0xd6, 0x51, 0x67, 0xff, 0xf0, 0x49, 0x8f, 0x65, 0x1b, 0xff, 0x2c, 0x03, 0xb5, 0x94, + 0xee, 0xfa, 0xd3, 0x5d, 0xba, 0xc4, 0xf4, 0xe7, 0xe6, 0x4f, 0x7f, 0xfe, 0xb2, 0xe9, 0x2f, 0x4c, + 0x4f, 0xff, 0xef, 0x64, 0xa0, 0x96, 0xd2, 0x91, 0x49, 0xee, 0x99, 0x34, 0xf7, 0xe4, 0x49, 0x9f, + 0x9d, 0x3a, 0xe9, 0x9b, 0xb0, 0x1c, 0xfe, 0xde, 0x8f, 0x23, 0x0e, 0x29, 0x58, 0x12, 0x87, 0xae, + 0x53, 0xe4, 0xd3, 0x38, 0x74, 0xa5, 0xe2, 0xea, 0xde, 0xd2, 0xf5, 0xd1, 0x80, 0x6e, 0xd7, 0x37, + 0x2e, 0xd7, 0xa0, 0x57, 0x0c, 0xe1, 0x11, 0x54, 0xc7, 0xf1, 0x36, 0x7d, 0x39, 0xb3, 0x24, 0x49, + 0xf9, 0x82, 0x7e, 0xfe, 0x6e, 0x06, 0x56, 0xd2, 0x3a, 0xf7, 0xff, 0xeb, 0x69, 0xfd, 0x27, 0x19, + 0x58, 0x9b, 0xd1, 0xe4, 0x57, 0x1a, 0x76, 0xd3, 0xfd, 0xca, 0x2e, 0xd0, 0xaf, 0xdc, 0x9c, 0x7e, + 0x5d, 0xae, 0x49, 0xae, 0xee, 0x71, 0x17, 0x3e, 0x77, 0xe9, 0x99, 0x70, 0xc5, 0x54, 0xa7, 0x98, + 0xe6, 0xa6, 0x99, 0xfe, 0x76, 0x06, 0x6e, 0x5f, 0xa5, 0xef, 0xff, 0x9f, 0xcb, 0xd5, 0x74, 0x0f, + 0x9b, 0xef, 0x46, 0x85, 0x04, 0x55, 0x28, 0xe9, 0xaf, 0x56, 0xe9, 0x42, 0xee, 0xa1, 0xf7, 0xdc, + 0x55, 0x91, 0x68, 0x43, 0x98, 0xfa, 0x5e, 0xbf, 0x21, 0xc6, 0x8e, 0x4d, 0x39, 0xd2, 0x5b, 0x00, + 0x2d, 0xf2, 0xeb, 0xc2, 0x6b, 0x36, 0x9b, 0xbb, 0x07, 0xdd, 0x36, 0x5b, 0x4a, 0x1a, 0xb1, 0x9f, + 0x84, 0x8a, 0xb8, 0x79, 0x08, 0xc5, 0xf8, 0xe2, 0xc3, 0x9e, 0xe9, 0x9f, 0x5a, 0x2a, 0x13, 0xb9, + 0x0c, 0xe5, 0x43, 0xed, 0x42, 0xa9, 0x57, 0x7d, 0xd4, 0x3d, 0xd8, 0x57, 0x41, 0xef, 0xad, 0x83, + 0x9e, 0xba, 0x3e, 0xd1, 0x7d, 0xfa, 0x48, 0xa5, 0xc4, 0x1e, 0x19, 0xad, 0xc3, 0x9d, 0x23, 0xc2, + 0x28, 0x34, 0x7f, 0x2b, 0x1f, 0x9e, 0x6a, 0x4d, 0x43, 0xe7, 0x38, 0x01, 0x8a, 0xa8, 0xcd, 0x3d, + 0xcd, 0x38, 0x7a, 0x0d, 0x95, 0xfc, 0xb6, 0xcf, 0x55, 0x1c, 0x82, 0x65, 0x79, 0x11, 0xb2, 0x87, + 0xc7, 0xaa, 0x12, 0x69, 0x47, 0x8e, 0x1c, 0x75, 0xef, 0xb2, 0x77, 0x2e, 0x59, 0x01, 0x7f, 0x6c, + 0x06, 0x67, 0xac, 0xd8, 0xfc, 0xe7, 0x39, 0xa8, 0x44, 0xaa, 0xf2, 0x65, 0x54, 0x37, 0xe7, 0xb0, + 0xd2, 0xd9, 0xef, 0xb5, 0x8d, 0xfd, 0xd6, 0xae, 0x46, 0xc9, 0xf1, 0x6b, 0xb0, 0xba, 0xdd, 0xd9, + 0x6d, 0x1f, 0xed, 0x1e, 0xb4, 0xb6, 0x34, 0xb0, 0xcc, 0x6f, 0x02, 0xef, 0xec, 0x1d, 0x1e, 0x18, + 0xbd, 0xa3, 0x4e, 0xf7, 0x68, 0xb3, 0xb5, 0xbf, 0xd9, 0xde, 0x6d, 0x6f, 0xb1, 0x22, 0x7f, 0x05, + 0xee, 0xee, 0x1f, 0xf4, 0x3a, 0x07, 0xfb, 0x47, 0xfb, 0x07, 0x47, 0x07, 0x1b, 0x1f, 0xb5, 0x37, + 0x7b, 0xdd, 0xa3, 0xce, 0xfe, 0x11, 0x72, 0x7d, 0x64, 0xb4, 0xf0, 0x09, 0x2b, 0xf0, 0xbb, 0x70, + 0x5b, 0x63, 0x75, 0xdb, 0xc6, 0xd3, 0xb6, 0x81, 0x4c, 0x9e, 0xec, 0xb7, 0x9e, 0xb6, 0x3a, 0xbb, + 0xad, 0x8d, 0xdd, 0x36, 0x5b, 0xe6, 0x77, 0xa0, 0xa1, 0x31, 0x8c, 0x56, 0xaf, 0x7d, 0xb4, 0xdb, + 0xd9, 0xeb, 0xf4, 0x8e, 0xda, 0xdf, 0xdb, 0x6c, 0xb7, 0xb7, 0xda, 0x5b, 0xac, 0xc6, 0xbf, 0x02, + 0x5f, 0xa6, 0x4e, 0xe9, 0x4e, 0xa4, 0x5f, 0xf6, 0x49, 0xe7, 0xf0, 0xa8, 0x65, 0x6c, 0xee, 0x74, + 0x9e, 0xb6, 0xd9, 0x0a, 0x7f, 0x0d, 0xbe, 0x74, 0x39, 0xea, 0x56, 0xc7, 0x68, 0x6f, 0xf6, 0x0e, + 0x8c, 0x8f, 0xd9, 0x1a, 0xff, 0x02, 0x7c, 0x6e, 0xa7, 0xb7, 0xb7, 0x7b, 0xf4, 0xcc, 0x38, 0xd8, + 0x7f, 0x74, 0x44, 0x3f, 0xbb, 0x3d, 0xe3, 0xc9, 0x66, 0xef, 0x89, 0xd1, 0x66, 0xc0, 0x1b, 0x70, + 0xf3, 0x70, 0xe3, 0x68, 0xff, 0xa0, 0x77, 0xd4, 0xda, 0xff, 0x78, 0x63, 0xf7, 0x60, 0xf3, 0xf1, + 0xd1, 0xf6, 0x81, 0xb1, 0xd7, 0xea, 0xb1, 0x2a, 0xff, 0x2a, 0xbc, 0xb6, 0xd9, 0x7d, 0xaa, 0xbb, + 0x79, 0xb0, 0x7d, 0x64, 0x1c, 0x3c, 0xeb, 0x1e, 0x1d, 0x18, 0x47, 0x46, 0x7b, 0x97, 0xc6, 0xdc, + 0x8d, 0xfb, 0x5e, 0xe2, 0xb7, 0xa1, 0xde, 0xd9, 0xef, 0x3e, 0xd9, 0xde, 0xee, 0x6c, 0x76, 0xda, + 0xfb, 0xbd, 0xa3, 0xc3, 0xb6, 0xb1, 0xd7, 0xe9, 0x76, 0x11, 0x8d, 0x55, 0x9a, 0xdf, 0x81, 0x62, + 0xc7, 0x3d, 0xb3, 0x25, 0xed, 0x2f, 0x2d, 0x8c, 0xda, 0xe3, 0x0a, 0x9b, 0xb4, 0x2d, 0xec, 0x81, + 0x4b, 0xdf, 0x13, 0xa0, 0xdd, 0xb5, 0x6c, 0xc4, 0x80, 0xe6, 0xef, 0xe7, 0xa0, 0xa6, 0x58, 0x84, + 0x1e, 0xdc, 0x3d, 0x58, 0xd5, 0xa1, 0xd0, 0x4e, 0x5a, 0x85, 0x4d, 0x83, 0xe9, 0x43, 0x5d, 0x0a, + 0x94, 0x50, 0x64, 0x49, 0x10, 0xbf, 0x09, 0x45, 0xb3, 0xef, 0xa0, 0x1b, 0xa8, 0xf2, 0x95, 0xba, + 0xf5, 0x59, 0x75, 0x17, 0xea, 0x45, 0x85, 0xd8, 0xf7, 0xdc, 0xcd, 0xe8, 0x4a, 0x49, 0x0a, 0xc6, + 0x3f, 0x81, 0x5b, 0x51, 0xbb, 0xed, 0xf6, 0xfd, 0x8b, 0x71, 0xf4, 0x25, 0xbd, 0xd2, 0xdc, 0x60, + 0xc2, 0xb6, 0xed, 0x88, 0x14, 0xa2, 0x71, 0x19, 0x03, 0xfe, 0x08, 0xc0, 0xa6, 0xc9, 0x22, 0xfb, + 0x68, 0xfe, 0xbd, 0xe9, 0xd4, 0x6c, 0xea, 0x96, 0x36, 0x03, 0xa3, 0xdf, 0x78, 0x40, 0x0c, 0x50, + 0xef, 0x3e, 0xd6, 0x1f, 0xde, 0x5b, 0x36, 0xa2, 0x76, 0xf3, 0x01, 0x40, 0x4c, 0xc5, 0x19, 0x2c, + 0xa3, 0x6d, 0xd1, 0x0a, 0xf6, 0xc4, 0xe8, 0x58, 0xf8, 0xaa, 0x8a, 0x4f, 0x41, 0x1e, 0x21, 0x05, + 0xcb, 0x34, 0xff, 0x30, 0x93, 0xf0, 0xc3, 0x95, 0x9f, 0x7d, 0xe5, 0x09, 0x34, 0x2f, 0x27, 0x84, + 0x9e, 0xb0, 0x9e, 0x54, 0x6d, 0x18, 0xe9, 0x26, 0x3f, 0x04, 0x6e, 0xcf, 0x4e, 0x65, 0x7e, 0xc1, + 0xa9, 0x9c, 0x43, 0x3b, 0x1d, 0xd2, 0x2f, 0xcc, 0x86, 0xf4, 0xef, 0x00, 0x0c, 0x1c, 0xef, 0x58, + 0xe7, 0x15, 0x8b, 0xba, 0xee, 0x27, 0x82, 0x34, 0x1d, 0x28, 0x87, 0x5f, 0x11, 0x44, 0x19, 0xa3, + 0xef, 0x08, 0x46, 0x01, 0x4e, 0xd5, 0xe2, 0x3b, 0xb0, 0x22, 0xd2, 0x7d, 0xce, 0x2e, 0xd8, 0xe7, + 0x29, 0xba, 0xe6, 0x37, 0x60, 0x6d, 0x06, 0x09, 0x27, 0x71, 0x6c, 0xca, 0xe8, 0x53, 0x02, 0xf8, + 0x7b, 0x36, 0x5d, 0xdf, 0xfc, 0xf7, 0x59, 0x58, 0xde, 0x33, 0x5d, 0xfb, 0x44, 0x04, 0x32, 0xec, + 0x6d, 0xd0, 0x1f, 0x8a, 0x91, 0x19, 0xf6, 0x56, 0xb5, 0x74, 0xd4, 0x23, 0x9b, 0xcc, 0x27, 0xcc, + 0xa4, 0x9f, 0x70, 0x37, 0x4d, 0xe4, 0x30, 0xaa, 0xae, 0xd7, 0x2d, 0x5c, 0x3b, 0xc7, 0xee, 0x0b, + 0x37, 0x08, 0x77, 0x4c, 0xd8, 0x8c, 0xab, 0x77, 0x8a, 0x57, 0x54, 0xef, 0x94, 0x66, 0xe7, 0xff, + 0x2e, 0x54, 0x83, 0xbe, 0x2f, 0x84, 0x1b, 0x0c, 0x3d, 0x19, 0x7e, 0x81, 0x32, 0x09, 0xa2, 0x52, + 0x3a, 0xef, 0xb9, 0x8b, 0x32, 0xbe, 0x6b, 0xbb, 0xa7, 0xba, 0x42, 0x2c, 0x05, 0x43, 0x19, 0xa4, + 0x98, 0x8f, 0xfd, 0x43, 0x41, 0xf1, 0x86, 0x82, 0x11, 0xb5, 0x29, 0xaa, 0x63, 0x4a, 0x31, 0xf0, + 0x7c, 0x5b, 0xa8, 0xd0, 0x66, 0xc5, 0x48, 0x40, 0x90, 0xd6, 0x31, 0xdd, 0xc1, 0xc4, 0x1c, 0x08, + 0x9d, 0xfe, 0x8e, 0xda, 0xcd, 0xff, 0x51, 0x00, 0x50, 0xbb, 0x21, 0x18, 0xda, 0x63, 0x4a, 0xbd, + 0xd8, 0xba, 0xa6, 0xb8, 0x66, 0xd0, 0x6f, 0xfe, 0x5e, 0xaa, 0xdc, 0x7f, 0x36, 0x59, 0x1a, 0x93, + 0x4f, 0x87, 0x84, 0x70, 0x72, 0x4c, 0x29, 0x74, 0xe1, 0x14, 0xcd, 0x7f, 0xde, 0x48, 0x82, 0xa8, + 0x74, 0xce, 0x94, 0xa2, 0xed, 0x5a, 0x2a, 0xe4, 0x94, 0x37, 0xa2, 0x36, 0x5d, 0x18, 0x0a, 0x5a, + 0x13, 0xe9, 0x19, 0xc2, 0x15, 0xcf, 0xa3, 0xbb, 0x70, 0x31, 0x88, 0xef, 0x41, 0x6d, 0x6c, 0x5e, + 0x8c, 0x84, 0x2b, 0xf7, 0x84, 0x1c, 0x7a, 0x96, 0xae, 0x72, 0x7a, 0xed, 0xf2, 0x0e, 0x1e, 0x26, + 0xd1, 0x8d, 0x34, 0x35, 0xca, 0x84, 0x1b, 0xd0, 0x2e, 0x51, 0xcb, 0xa8, 0x5b, 0x7c, 0x03, 0x40, + 0xfd, 0x4a, 0x68, 0xaa, 0x99, 0x28, 0x94, 0x39, 0x12, 0x81, 0xf0, 0xcf, 0x6c, 0xa5, 0x5d, 0x95, + 0x92, 0x8a, 0xa9, 0x50, 0x17, 0x4f, 0x02, 0xe1, 0xb7, 0x47, 0xa6, 0xed, 0xe8, 0x05, 0x8e, 0x01, + 0xfc, 0x6d, 0xb8, 0x11, 0x4c, 0x8e, 0x51, 0x66, 0x8e, 0x45, 0xcf, 0xdb, 0x17, 0xcf, 0x03, 0x47, + 0x48, 0x29, 0x7c, 0x5d, 0x49, 0x31, 0xff, 0x61, 0x73, 0x10, 0x99, 0x61, 0xf4, 0xb5, 0x13, 0xfc, + 0x15, 0x97, 0x6b, 0x45, 0x20, 0x5d, 0xcb, 0xc6, 0x32, 0xa8, 0xfe, 0x14, 0x48, 0x97, 0xba, 0x65, + 0xf9, 0x97, 0xe1, 0x8b, 0x29, 0x24, 0x43, 0x25, 0xa6, 0x83, 0x6d, 0xdb, 0x35, 0x1d, 0xfb, 0x87, + 0xaa, 0x4c, 0x20, 0xd7, 0x1c, 0x43, 0x2d, 0x35, 0x71, 0x74, 0x79, 0x93, 0x7e, 0xe9, 0x7a, 0x1f, + 0x06, 0xcb, 0xaa, 0xdd, 0x95, 0xbe, 0x4d, 0x19, 0x97, 0x08, 0xb2, 0x89, 0xfb, 0xdc, 0x63, 0x59, + 0x7e, 0x1d, 0x98, 0x82, 0x74, 0x5c, 0x73, 0x3c, 0x6e, 0x8d, 0xc7, 0x8e, 0x60, 0x39, 0xba, 0x18, + 0x1b, 0x43, 0x55, 0xd1, 0x3f, 0xcb, 0x37, 0xbf, 0x07, 0xb7, 0x68, 0x66, 0x9e, 0x0a, 0x3f, 0x72, + 0xb4, 0xf5, 0x58, 0x6f, 0xc0, 0x9a, 0xfa, 0xb5, 0xef, 0x49, 0xf5, 0x98, 0x8c, 0x4f, 0x0e, 0x2b, + 0x0a, 0x8c, 0xb6, 0x57, 0x57, 0xd0, 0x75, 0xd7, 0x08, 0x16, 0xe1, 0x65, 0x9b, 0x3f, 0x2b, 0x02, + 0x8f, 0x05, 0xa2, 0x67, 0x0b, 0x7f, 0xcb, 0x94, 0x66, 0x22, 0x52, 0x5a, 0xbb, 0x34, 0xd7, 0xff, + 0xe2, 0x4a, 0xbd, 0x9b, 0x50, 0xb4, 0x03, 0x74, 0x0d, 0x75, 0xb9, 0xae, 0x6e, 0xf1, 0x5d, 0x80, + 0xb1, 0xf0, 0x6d, 0xcf, 0x22, 0x09, 0x2a, 0xcc, 0xbd, 0x75, 0x31, 0xdb, 0xa9, 0xf5, 0xc3, 0x88, + 0xc6, 0x48, 0xd0, 0x63, 0x3f, 0x54, 0x4b, 0x65, 0xce, 0x8b, 0xd4, 0xe9, 0x24, 0x88, 0xbf, 0x01, + 0xd7, 0xc6, 0xbe, 0xdd, 0x17, 0x6a, 0x39, 0x9e, 0x04, 0xd6, 0x26, 0x7d, 0x23, 0xb0, 0x44, 0x98, + 0xf3, 0x1e, 0xa1, 0x04, 0x9a, 0x2e, 0x39, 0x4c, 0x01, 0xe5, 0x8a, 0xf5, 0x05, 0x71, 0x55, 0xd0, + 0x5a, 0x33, 0xe6, 0x3f, 0xe4, 0xf7, 0x81, 0xe9, 0x07, 0x7b, 0xb6, 0xbb, 0x2b, 0xdc, 0x81, 0x1c, + 0x92, 0x70, 0xd7, 0x8c, 0x19, 0x38, 0x69, 0x30, 0xf5, 0x25, 0x26, 0x95, 0x47, 0xaa, 0x18, 0x51, + 0x5b, 0x7d, 0x74, 0xc0, 0xf1, 0xfc, 0xae, 0xf4, 0x75, 0x65, 0x6e, 0xd4, 0x46, 0x1b, 0x2a, 0xa0, + 0xbe, 0x1e, 0xfa, 0x9e, 0x35, 0xa1, 0x2c, 0x87, 0x52, 0x62, 0xd3, 0xe0, 0x18, 0x73, 0xcf, 0x74, + 0x75, 0xb9, 0x64, 0x2d, 0x89, 0x19, 0x81, 0xc9, 0x27, 0xf4, 0x82, 0x98, 0xe1, 0xaa, 0xf6, 0x09, + 0x13, 0x30, 0x8d, 0x13, 0xb3, 0x62, 0x11, 0x4e, 0xcc, 0x87, 0xc6, 0x6f, 0xf9, 0x9e, 0x6d, 0xc5, + 0xbc, 0x54, 0xe5, 0xce, 0x0c, 0x3c, 0x81, 0x1b, 0xf3, 0xe4, 0x29, 0xdc, 0x08, 0xde, 0xfc, 0x71, + 0x06, 0x20, 0x5e, 0x7c, 0x14, 0xf9, 0xb8, 0x15, 0x6f, 0xf1, 0x5b, 0x70, 0x2d, 0x09, 0x76, 0x74, + 0xc9, 0x2b, 0xc9, 0x7d, 0xfc, 0x60, 0xcb, 0xbc, 0x08, 0x58, 0x56, 0x5f, 0xd1, 0xd6, 0xb0, 0x67, + 0x42, 0x50, 0xfd, 0xe0, 0x75, 0x60, 0x31, 0x90, 0xee, 0xdd, 0x05, 0x2c, 0x9f, 0x46, 0xfd, 0x58, + 0x98, 0x7e, 0xc0, 0x0a, 0xcd, 0x1d, 0x28, 0xaa, 0x64, 0xd7, 0x9c, 0x34, 0xf5, 0xcb, 0xd5, 0x9c, + 0xfc, 0xf5, 0x0c, 0xc0, 0x96, 0xaa, 0x8f, 0xc6, 0x53, 0x7c, 0x4e, 0xf6, 0x7f, 0x9e, 0x45, 0x65, + 0x5a, 0x16, 0xd5, 0x99, 0xe7, 0xa2, 0xef, 0xfb, 0x60, 0x13, 0x25, 0xc7, 0x0c, 0x6b, 0xc4, 0xd4, + 0x9e, 0x8b, 0xda, 0xea, 0x00, 0xd9, 0xf4, 0x5c, 0x57, 0xf4, 0xf1, 0xf8, 0x89, 0x0e, 0x90, 0x08, + 0xd4, 0xfc, 0x51, 0x16, 0x2a, 0x9b, 0x43, 0x53, 0xaa, 0xcf, 0xe1, 0x7c, 0x07, 0xca, 0x23, 0x11, + 0x04, 0xe6, 0x40, 0x04, 0x3a, 0xb9, 0x33, 0x9d, 0x99, 0x8d, 0x70, 0xd7, 0x9f, 0xb8, 0xbe, 0x30, + 0x2d, 0xf5, 0x0d, 0xa0, 0x88, 0x4a, 0x71, 0x70, 0x65, 0xe4, 0x7c, 0xbf, 0x04, 0x07, 0x37, 0xfa, + 0x60, 0xaf, 0x75, 0x1c, 0x7f, 0x21, 0x5a, 0x8d, 0x36, 0x09, 0x6a, 0xec, 0x41, 0x35, 0x41, 0xca, + 0x5f, 0x81, 0x9a, 0xe7, 0x58, 0x22, 0x50, 0xb7, 0x00, 0xe3, 0x0f, 0x27, 0xa6, 0x80, 0x54, 0xa2, + 0x81, 0x3b, 0x57, 0xf8, 0x3a, 0x4f, 0x17, 0x36, 0x9b, 0xff, 0xab, 0x04, 0x55, 0xec, 0xd4, 0x9e, + 0x1a, 0xc3, 0xcc, 0x72, 0xd4, 0xa1, 0xe4, 0x69, 0xce, 0xfa, 0xfa, 0xa0, 0x97, 0xe0, 0xa9, 0xcb, + 0x3e, 0x72, 0xe9, 0xb2, 0x8f, 0xdb, 0x50, 0x51, 0x49, 0x25, 0xab, 0xa5, 0x34, 0x61, 0xce, 0x88, + 0x01, 0x68, 0xae, 0x8c, 0x3c, 0x8b, 0xf4, 0x71, 0x4b, 0xe5, 0x63, 0x72, 0x46, 0x02, 0x92, 0xfc, + 0x98, 0x53, 0x35, 0xfd, 0x31, 0x27, 0xaa, 0xbf, 0x19, 0x3b, 0x17, 0x3d, 0x4f, 0xf7, 0xb6, 0x63, + 0xc5, 0xb7, 0xb0, 0xd3, 0x70, 0xbe, 0x09, 0x25, 0xbd, 0x2c, 0x3a, 0xeb, 0xf4, 0x95, 0x39, 0x2b, + 0xa1, 0xd1, 0xd7, 0xf5, 0x5f, 0x7d, 0x11, 0xca, 0x08, 0x29, 0xf9, 0x23, 0xa8, 0x9a, 0x52, 0x9a, + 0xfd, 0xe1, 0x48, 0xeb, 0xcf, 0xdc, 0x9c, 0x04, 0x74, 0x92, 0x51, 0x2b, 0xc2, 0x36, 0x92, 0x94, + 0x7c, 0x03, 0x2a, 0xbe, 0x30, 0x53, 0x39, 0xf0, 0x57, 0xae, 0x60, 0x63, 0x84, 0xb8, 0x46, 0x4c, + 0x16, 0x7d, 0x43, 0x14, 0xe2, 0x6f, 0x88, 0x36, 0x7e, 0x9a, 0x81, 0x95, 0x74, 0xe7, 0xff, 0x34, + 0xbe, 0x69, 0xf7, 0xad, 0xf8, 0x9b, 0x76, 0x9f, 0xe1, 0xfb, 0x70, 0xbf, 0x9d, 0x01, 0x88, 0xe7, + 0x05, 0xcf, 0x48, 0xf5, 0xed, 0xad, 0xd0, 0x6a, 0x57, 0x2d, 0xbe, 0x93, 0xfa, 0x60, 0xc3, 0xdb, + 0x0b, 0x4d, 0x72, 0xe2, 0x67, 0xa2, 0x7c, 0xfd, 0x01, 0xac, 0xa4, 0xe1, 0x54, 0xf6, 0xdf, 0xd9, + 0x6d, 0xab, 0x18, 0x55, 0x67, 0xaf, 0xf5, 0xa8, 0xad, 0xaf, 0x9b, 0x75, 0xf6, 0x1f, 0xb3, 0x6c, + 0xe3, 0x8f, 0x32, 0x50, 0x89, 0xa6, 0x9c, 0x7f, 0x37, 0xb9, 0x56, 0xaa, 0xd0, 0xe5, 0xad, 0x45, + 0xd6, 0x2a, 0xfe, 0xd5, 0x76, 0xa5, 0x7f, 0x91, 0x58, 0xba, 0x86, 0x07, 0x2b, 0xe9, 0x87, 0x73, + 0x94, 0xe8, 0xa3, 0xb4, 0x12, 0x7d, 0x73, 0xa1, 0x57, 0x86, 0xae, 0xea, 0xae, 0x1d, 0x48, 0xad, + 0x5f, 0xdf, 0xcf, 0xbe, 0x97, 0x69, 0xdc, 0x85, 0xe5, 0xe4, 0xa3, 0xd9, 0x1b, 0xa7, 0xf7, 0xff, + 0x28, 0x07, 0x2b, 0xe9, 0x5a, 0x11, 0xba, 0xc1, 0xa6, 0xea, 0x94, 0x0e, 0x1c, 0x2b, 0x51, 0xf1, + 0xcf, 0xd0, 0x4d, 0xd6, 0xce, 0x30, 0x01, 0xd6, 0x28, 0x0a, 0xe6, 0x8d, 0x04, 0xbb, 0x9b, 0xfc, + 0x6e, 0xe7, 0x1b, 0x1c, 0xc2, 0x9b, 0x87, 0x6c, 0xcc, 0x2b, 0xfa, 0x0b, 0x66, 0x3f, 0xca, 0xf2, + 0x5a, 0xa2, 0xee, 0xfc, 0x27, 0x68, 0x09, 0xae, 0x6e, 0x4c, 0x5c, 0xcb, 0x11, 0x56, 0x04, 0xfd, + 0x69, 0x12, 0x1a, 0x15, 0x8e, 0xff, 0x28, 0xcf, 0x57, 0xa0, 0xd2, 0x9d, 0x1c, 0xeb, 0xa2, 0xf1, + 0xbf, 0x94, 0xe7, 0x37, 0x61, 0x4d, 0x63, 0xc5, 0x35, 0x9a, 0xec, 0x2f, 0xe3, 0x99, 0xb5, 0xd2, + 0x52, 0xf3, 0xa5, 0x3b, 0xca, 0xfe, 0x4a, 0x1e, 0xbb, 0x40, 0x17, 0xda, 0xff, 0x2a, 0xf1, 0x89, + 0x2e, 0xf8, 0xb0, 0x5f, 0xcb, 0xf3, 0x55, 0x80, 0x6e, 0x2f, 0x7a, 0xd1, 0x6f, 0xe4, 0x79, 0x15, + 0x8a, 0xdd, 0x1e, 0x71, 0xfb, 0x71, 0x9e, 0xdf, 0x00, 0x16, 0x3f, 0xd5, 0x95, 0xab, 0x7f, 0x43, + 0x75, 0x26, 0x2a, 0x45, 0xfd, 0x9b, 0x79, 0x1c, 0x57, 0x38, 0xcb, 0xec, 0x6f, 0xe5, 0x39, 0x83, + 0x6a, 0x22, 0xb6, 0xca, 0xfe, 0x76, 0x9e, 0x73, 0xa8, 0xed, 0xd9, 0x41, 0x60, 0xbb, 0x03, 0x3d, + 0x82, 0x5f, 0xa7, 0x37, 0x6f, 0x47, 0x77, 0x94, 0xd8, 0x6f, 0xe6, 0xf9, 0x2d, 0xe0, 0xc9, 0x7c, + 0x92, 0x7e, 0xf0, 0x77, 0x88, 0x5a, 0x9d, 0x93, 0x81, 0x86, 0xfd, 0x5d, 0xa2, 0x46, 0x49, 0xd0, + 0x80, 0xdf, 0xa2, 0x09, 0xd9, 0x8c, 0x6b, 0x5d, 0x35, 0xfc, 0x27, 0x44, 0x1c, 0x2e, 0xa6, 0x82, + 0xfd, 0x34, 0x7f, 0xff, 0x67, 0x94, 0x0f, 0x48, 0x96, 0x8c, 0xf1, 0x65, 0x28, 0x3b, 0x9e, 0x3b, + 0x90, 0xea, 0x7b, 0xa9, 0x35, 0xa8, 0x04, 0x43, 0xcf, 0x97, 0xd4, 0xa4, 0x4b, 0x94, 0x2e, 0x5d, + 0xb6, 0x57, 0xd7, 0x0e, 0x94, 0x57, 0xa7, 0xe2, 0xab, 0xd2, 0x1c, 0xb0, 0x6a, 0x54, 0xa5, 0x9b, + 0x8f, 0x2a, 0x89, 0xe9, 0xd2, 0x7f, 0x78, 0xa9, 0x9a, 0x15, 0x11, 0x75, 0xe2, 0x3b, 0xaa, 0xa2, + 0x58, 0xa0, 0x45, 0xaf, 0x3e, 0x8c, 0x38, 0x1e, 0xa2, 0xe3, 0x50, 0x51, 0x50, 0xef, 0xfb, 0xb6, + 0xba, 0xae, 0xab, 0x0b, 0xf4, 0x2c, 0xec, 0x47, 0x54, 0x83, 0xc2, 0xc4, 0xfd, 0xbf, 0x97, 0x81, + 0xe5, 0xf0, 0xaa, 0xbb, 0x3d, 0xb0, 0x5d, 0x55, 0x93, 0x1c, 0x7e, 0x85, 0xb6, 0xef, 0xd8, 0xe3, + 0xf0, 0xab, 0x8e, 0xab, 0x50, 0xb5, 0x7c, 0x73, 0xd0, 0x72, 0xad, 0x2d, 0xdf, 0x1b, 0xab, 0x6e, + 0xab, 0x8c, 0xa1, 0xaa, 0x85, 0x7e, 0x2e, 0x8e, 0x11, 0x7d, 0x2c, 0x7c, 0x96, 0xa7, 0xe2, 0xbf, + 0xa1, 0xe9, 0xdb, 0xee, 0xa0, 0x7d, 0x2e, 0x85, 0x1b, 0xa8, 0x9a, 0xe8, 0x2a, 0x94, 0x26, 0x81, + 0xe8, 0x9b, 0x81, 0x60, 0x45, 0x6c, 0x1c, 0x4f, 0x6c, 0x47, 0xda, 0xae, 0xfa, 0x98, 0x62, 0x54, + 0xf4, 0x5c, 0xc6, 0x91, 0x99, 0x63, 0x9b, 0x55, 0xee, 0xff, 0xab, 0x0c, 0x54, 0x49, 0x2c, 0xe2, + 0x98, 0x78, 0x6c, 0xa3, 0x55, 0xa1, 0xb4, 0x1b, 0x7d, 0x55, 0xaf, 0x08, 0xd9, 0x83, 0x53, 0x15, + 0x13, 0xd7, 0x62, 0xa1, 0xee, 0xa4, 0xaa, 0x0f, 0xec, 0xe5, 0xf9, 0xe7, 0xe0, 0x86, 0x21, 0x46, + 0x9e, 0x14, 0xcf, 0x4c, 0x5b, 0x26, 0xef, 0x1f, 0x15, 0xd0, 0x9d, 0x53, 0x8f, 0xc2, 0x0b, 0x47, + 0x45, 0x72, 0xe7, 0xf0, 0xb5, 0x21, 0xa4, 0x84, 0xa3, 0x27, 0x88, 0xf6, 0xef, 0xca, 0x11, 0xca, + 0x47, 0x9e, 0xed, 0xe2, 0xdb, 0xe8, 0x9e, 0x34, 0x41, 0x28, 0xb9, 0x82, 0x20, 0xb8, 0xbf, 0x0f, + 0x37, 0xe7, 0xa7, 0x04, 0xd4, 0x0d, 0x6a, 0xfa, 0x94, 0x33, 0xdd, 0x48, 0x79, 0xe6, 0xdb, 0xea, + 0xaa, 0x6b, 0x05, 0x0a, 0x07, 0xcf, 0x5d, 0x12, 0x8b, 0x35, 0xa8, 0xed, 0x7b, 0x09, 0x1a, 0x96, + 0xbb, 0xdf, 0x4f, 0x65, 0x71, 0xe2, 0x49, 0x09, 0x3b, 0xb1, 0x94, 0xb8, 0x6d, 0x95, 0x51, 0xf9, + 0x01, 0xfa, 0x6f, 0x1c, 0xea, 0xeb, 0x12, 0x3a, 0x7b, 0x62, 0xa9, 0xaf, 0x4b, 0x44, 0xdd, 0xcc, + 0xab, 0xcf, 0x6c, 0xb9, 0x7d, 0xe1, 0x08, 0x8b, 0x15, 0xee, 0xbf, 0x07, 0xab, 0x7a, 0xa8, 0x7d, + 0x11, 0x04, 0xe1, 0x6d, 0xa5, 0x43, 0xdf, 0x3e, 0x53, 0x5f, 0xb0, 0x58, 0x86, 0xf2, 0xa1, 0xf0, + 0x03, 0xcf, 0xa5, 0xaf, 0x77, 0x00, 0x14, 0xbb, 0x43, 0xd3, 0xc7, 0x77, 0xdc, 0xff, 0x9a, 0x9e, + 0xa4, 0x27, 0xe7, 0xe1, 0xd1, 0x80, 0xfb, 0x47, 0x7f, 0xbc, 0xc6, 0x94, 0xa6, 0x46, 0x97, 0xbe, + 0x30, 0x47, 0x2c, 0x7b, 0x7f, 0x13, 0x2a, 0x74, 0xd9, 0xe9, 0xb1, 0xed, 0x5a, 0x38, 0xf0, 0x0d, + 0x5d, 0x78, 0x4f, 0x5f, 0x55, 0x3a, 0xa3, 0xe9, 0x28, 0xab, 0xef, 0xcf, 0xb2, 0x2c, 0xbf, 0x09, + 0xbc, 0x35, 0x91, 0xde, 0xc8, 0xa4, 0x4b, 0xba, 0xce, 0x85, 0xfa, 0x56, 0x71, 0xee, 0xfe, 0xb7, + 0x81, 0xab, 0x18, 0x9b, 0x25, 0xce, 0x6d, 0x77, 0x10, 0x7d, 0x1d, 0x00, 0xe8, 0x53, 0x1f, 0x96, + 0x38, 0x0f, 0x6f, 0xaa, 0x85, 0x8d, 0xf0, 0x83, 0x23, 0xdb, 0xde, 0xc4, 0xc5, 0x4e, 0x3f, 0x85, + 0xeb, 0x4a, 0xc4, 0x70, 0x14, 0x74, 0x03, 0xf4, 0x52, 0xc7, 0x5f, 0xdd, 0x54, 0x93, 0x93, 0x20, + 0xc2, 0x65, 0x19, 0xec, 0x58, 0xe4, 0x34, 0xc7, 0xf0, 0xec, 0xfd, 0x26, 0x5c, 0x9b, 0x13, 0xb9, + 0x20, 0xa5, 0xae, 0xfc, 0x37, 0xb6, 0x74, 0xff, 0x43, 0x58, 0x53, 0x6a, 0x68, 0x5f, 0xdd, 0xd1, + 0x0b, 0xa7, 0xed, 0x59, 0x67, 0xbb, 0xa3, 0x66, 0x7a, 0xb3, 0xbd, 0xbb, 0xfb, 0x64, 0xb7, 0x65, + 0xb0, 0x0c, 0xc9, 0xc3, 0x41, 0xef, 0x68, 0xf3, 0x60, 0x7f, 0xbf, 0xbd, 0xd9, 0x6b, 0x6f, 0xb1, + 0xec, 0xc6, 0xfd, 0x7f, 0xf3, 0x8b, 0x3b, 0x99, 0x9f, 0xff, 0xe2, 0x4e, 0xe6, 0xbf, 0xfc, 0xe2, + 0x4e, 0xe6, 0xc7, 0x9f, 0xde, 0x59, 0xfa, 0xf9, 0xa7, 0x77, 0x96, 0xfe, 0xc3, 0xa7, 0x77, 0x96, + 0x3e, 0x61, 0xd3, 0xff, 0x50, 0xe7, 0xb8, 0x48, 0x2e, 0xc3, 0x5b, 0xff, 0x37, 0x00, 0x00, 0xff, + 0xff, 0xd3, 0x7d, 0x59, 0x78, 0x6b, 0x67, 0x00, 0x00, } func (m *SmartBlockSnapshotBase) Marshal() (dAtA []byte, err error) { @@ -14779,16 +14770,6 @@ func (m *Notification) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x20 } - if m.IsToast { - i-- - if m.IsToast { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } if m.CreateTime != 0 { i = encodeVarintModels(dAtA, i, uint64(m.CreateTime)) i-- @@ -18572,9 +18553,6 @@ func (m *Notification) Size() (n int) { if m.CreateTime != 0 { n += 1 + sovModels(uint64(m.CreateTime)) } - if m.IsToast { - n += 2 - } if m.Status != 0 { n += 1 + sovModels(uint64(m.Status)) } @@ -31118,26 +31096,6 @@ func (m *Notification) Unmarshal(dAtA []byte) error { break } } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IsToast", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowModels - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.IsToast = bool(v != 0) case 4: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) diff --git a/pkg/lib/pb/model/protos/models.proto b/pkg/lib/pb/model/protos/models.proto index d27fca58d..407078ed8 100644 --- a/pkg/lib/pb/model/protos/models.proto +++ b/pkg/lib/pb/model/protos/models.proto @@ -1044,7 +1044,6 @@ message Notification { int64 createTime = 2; Status status = 4; bool isLocal = 5; - bool isToast = 3; // means it should automatically hide after some time if client window is active oneof payload { Import import = 6; Export export = 8; From 6a866bee46a273cca9113b522ea9f0c3593b1b47 Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Fri, 28 Mar 2025 17:44:20 +0100 Subject: [PATCH 111/132] GO-5303 do not send event if name is empty --- core/block/editor/widget/widget.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/core/block/editor/widget/widget.go b/core/block/editor/widget/widget.go index 5bae98a46..e8d003cc9 100644 --- a/core/block/editor/widget/widget.go +++ b/core/block/editor/widget/widget.go @@ -145,14 +145,16 @@ func (w *widget) AddAutoWidget(st *state.State, targetId, widgetBlockId, viewId return err } - msg := event.NewMessage(w.SpaceID(), &pb.EventMessageValueOfSpaceAutoWidgetAdded{ - SpaceAutoWidgetAdded: &pb.EventSpaceAutoWidgetAdded{ - TargetId: targetId, - TargetName: eventName, - WidgetBlockId: widgetBlockId, - }, - }) - w.SendEvent([]*pb.EventMessage{msg}) + if eventName != "" { + msg := event.NewMessage(w.SpaceID(), &pb.EventMessageValueOfSpaceAutoWidgetAdded{ + SpaceAutoWidgetAdded: &pb.EventSpaceAutoWidgetAdded{ + TargetId: targetId, + TargetName: eventName, + WidgetBlockId: widgetBlockId, + }, + }) + w.SendEvent([]*pb.EventMessage{msg}) + } return nil } From fd3c7baf226acd7f793bfea1cc053afa5ce8d162 Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Fri, 28 Mar 2025 18:02:22 +0100 Subject: [PATCH 112/132] GO-5362 add relation autoWidgetDisabled for widget object --- core/block/detailservice/set_details.go | 3 +++ core/block/editor/archive.go | 3 +++ core/block/editor/widget/widget.go | 4 ++++ core/block/widget.go | 3 +++ pkg/lib/bundle/relation.gen.go | 16 +++++++++++++++- pkg/lib/bundle/relations.json | 9 +++++++++ 6 files changed, 37 insertions(+), 1 deletion(-) diff --git a/core/block/detailservice/set_details.go b/core/block/detailservice/set_details.go index d1b38a66f..b456b3954 100644 --- a/core/block/detailservice/set_details.go +++ b/core/block/detailservice/set_details.go @@ -267,6 +267,9 @@ func (s *service) createFavoriteWidget(spc clientspace.Space) error { if err != nil { return fmt.Errorf("get widget details: %w", err) } + if widgetDetails.GetBool(bundle.RelationKeyAutoWidgetDisabled) { + return nil + } targetIds := widgetDetails.GetStringList(bundle.RelationKeyAutoWidgetTargets) if slices.Contains(targetIds, widget.DefaultWidgetFavorite) { return nil diff --git a/core/block/editor/archive.go b/core/block/editor/archive.go index 2806d8b20..7820d402a 100644 --- a/core/block/editor/archive.go +++ b/core/block/editor/archive.go @@ -90,6 +90,9 @@ func (p *Archive) autoInstallBinWidget() error { if err != nil { return err } + if widgetDetails.GetBool(bundle.RelationKeyAutoWidgetDisabled) { + return nil + } keys := widgetDetails.Get(bundle.RelationKeyAutoWidgetTargets).StringList() if slices.Contains(keys, widget.DefaultWidgetBin) { // cache to avoid unnecessary objectstore requests diff --git a/core/block/editor/widget/widget.go b/core/block/editor/widget/widget.go index e8d003cc9..86047cc69 100644 --- a/core/block/editor/widget/widget.go +++ b/core/block/editor/widget/widget.go @@ -74,6 +74,10 @@ func NewWidget(sb smartblock.SmartBlock) Widget { } func (w *widget) AddAutoWidget(st *state.State, targetId, widgetBlockId, viewId string, layout model.BlockContentWidgetLayout, eventName string) error { + isDisabled := st.Details().Get(bundle.RelationKeyAutoWidgetDisabled).Bool() + if isDisabled { + return nil + } targets := st.Details().Get(bundle.RelationKeyAutoWidgetTargets).StringList() if slices.Contains(targets, targetId) { return nil diff --git a/core/block/widget.go b/core/block/widget.go index 3f3e70b14..e07a28b6a 100644 --- a/core/block/widget.go +++ b/core/block/widget.go @@ -98,6 +98,9 @@ func (s *Service) CreateTypeWidgetIfMissing(ctx context.Context, spaceId string, spaceIndex := s.objectStore.SpaceIndex(space.Id()) widgetDetails, err := s.objectStore.SpaceIndex(space.Id()).GetDetails(widgetObjectId) if err == nil { + if widgetDetails.GetBool(bundle.RelationKeyAutoWidgetDisabled) { + return nil + } keys := widgetDetails.Get(bundle.RelationKeyAutoWidgetTargets).StringList() if slices.Contains(keys, typeId) { // widget was created before diff --git a/pkg/lib/bundle/relation.gen.go b/pkg/lib/bundle/relation.gen.go index 999d31147..f3b0e482b 100644 --- a/pkg/lib/bundle/relation.gen.go +++ b/pkg/lib/bundle/relation.gen.go @@ -9,7 +9,7 @@ import ( "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) -const RelationChecksum = "e8392d6bf8efab6b707d68bc3922e4284a18a68370828e3ec6b18e0267b84bea" +const RelationChecksum = "6388e7cd19fabdc6953ebc6d1f2cd0208054d488b3fe538b7e013b38d7311108" const ( RelationKeyTag domain.RelationKey = "tag" RelationKeyCamera domain.RelationKey = "camera" @@ -158,6 +158,7 @@ const ( RelationKeyDefaultViewType domain.RelationKey = "defaultViewType" RelationKeyDefaultTypeId domain.RelationKey = "defaultTypeId" RelationKeyAutoWidgetTargets domain.RelationKey = "autoWidgetTargets" + RelationKeyAutoWidgetDisabled domain.RelationKey = "autoWidgetDisabled" RelationKeyPluralName domain.RelationKey = "pluralName" ) @@ -282,6 +283,19 @@ var ( Revision: 1, Scope: model.Relation_type, }, + RelationKeyAutoWidgetDisabled: { + + DataSource: model.Relation_details, + Description: "", + Format: model.RelationFormat_bool, + Hidden: true, + Id: "_brautoWidgetDisabled", + Key: "autoWidgetDisabled", + Name: "Auto Widget disabled", + ReadOnly: false, + ReadOnlyRelation: true, + Scope: model.Relation_type, + }, RelationKeyAutoWidgetTargets: { DataSource: model.Relation_details, diff --git a/pkg/lib/bundle/relations.json b/pkg/lib/bundle/relations.json index 3e3bc2a44..a73c38167 100644 --- a/pkg/lib/bundle/relations.json +++ b/pkg/lib/bundle/relations.json @@ -1517,6 +1517,15 @@ "readonly": false, "source": "details" }, + { + "format": "bool", + "hidden": true, + "key": "autoWidgetDisabled", + "maxCount": 0, + "name": "Auto Widget disabled", + "readonly": false, + "source": "details" + }, { "description": "Name of Object type in plural form", "format": "longtext", From ef913f47b352ca6fc6c8026b6d8055cf72fcdde9 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Fri, 28 Mar 2025 18:19:25 +0100 Subject: [PATCH 113/132] GO-3338 remove log (#2274) --- core/event/event_grpc.go | 2 +- core/files/fileobject/fileindex.go | 3 +++ core/files/files.go | 7 +++++-- core/filestorage/filesync/upload.go | 1 - go.mod | 2 -- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/core/event/event_grpc.go b/core/event/event_grpc.go index 9fd445c8f..7e14b658d 100644 --- a/core/event/event_grpc.go +++ b/core/event/event_grpc.go @@ -75,7 +75,7 @@ func (es *GrpcSender) sendEvent(server SessionServer, event *pb.Event) { if s, ok := status.FromError(err); ok && s.Code() == codes.Unavailable { es.shutdownCh <- server.Token } - if strings.Contains(err.Error(), "rpc error: code = Unavailable desc = transport is closing") { + if strings.Contains(err.Error(), "transport is closing") { log.Errorf("failed to send event: %v", err) } } diff --git a/core/files/fileobject/fileindex.go b/core/files/fileobject/fileindex.go index 4b8b5dfbc..a97690832 100644 --- a/core/files/fileobject/fileindex.go +++ b/core/files/fileobject/fileindex.go @@ -210,6 +210,9 @@ func logIndexLoop(err error) { if errors.Is(err, rpcstore.ErrNoConnectionToAnyFileClient) { return } + if errors.Is(err, files.FailedProtoUnmarshallError) { + return + } log.Errorf("index loop: %v", err) } diff --git a/core/files/files.go b/core/files/files.go index d0d113926..4e72d5f02 100644 --- a/core/files/files.go +++ b/core/files/files.go @@ -42,7 +42,10 @@ const ( CName = "files" ) -var log = logging.Logger("anytype-files") +var ( + log = logging.Logger("anytype-files") + FailedProtoUnmarshallError = errors.New("failed proto unmarshall") +) var _ Service = (*service)(nil) @@ -306,7 +309,7 @@ func (s *service) fileInfoFromPath(ctx context.Context, spaceId string, fileId d } err = proto.Unmarshal(b, &file) if err != nil || file.Hash == "" { - return nil, fmt.Errorf("failed to unmarshal not-encrypted file info: %w", err) + return nil, fmt.Errorf("failed to unmarshal not-encrypted file info: %w", FailedProtoUnmarshallError) } } diff --git a/core/filestorage/filesync/upload.go b/core/filestorage/filesync/upload.go index c89fb637b..0a73c9a9c 100644 --- a/core/filestorage/filesync/upload.go +++ b/core/filestorage/filesync/upload.go @@ -349,7 +349,6 @@ func (s *fileSync) uploadFile(ctx context.Context, spaceID string, fileId domain if err != nil { log.Warn("delete limit reached error logged", zap.String("fileId", fileId.String()), zap.Error(err)) } - log.Warn("done upload", zap.String("fileId", fileId.String()), zap.Int("bytesToUpload", blocksAvailability.bytesToUpload), zap.Int("bytesUploaded", totalBytesUploaded)) return nil } diff --git a/go.mod b/go.mod index 1c5cc2ed2..90c579cb2 100644 --- a/go.mod +++ b/go.mod @@ -2,8 +2,6 @@ module github.com/anyproto/anytype-heart go 1.23.2 -toolchain go1.24.1 - require ( github.com/JohannesKaufmann/html-to-markdown v1.4.0 github.com/PuerkitoBio/goquery v1.10.2 From ff3fe5f9045f99a045230b1a85aef5fa7a15482c Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Fri, 28 Mar 2025 19:40:30 +0100 Subject: [PATCH 114/132] GO-5320: create widget after import finish Signed-off-by: AnastasiaShemyakinskaya --- core/block/import/common/collection.go | 98 +------------------ .../import/common/workerpool/workerpool.go | 16 --- core/block/import/csv/converter.go | 5 +- core/block/import/csv/converter_test.go | 48 ++++----- core/block/import/html/converter.go | 5 +- core/block/import/html/converter_test.go | 6 +- core/block/import/importer.go | 30 +++++- core/block/import/markdown/import.go | 7 +- core/block/import/markdown/import_test.go | 19 +--- .../import/notion/api/database/database.go | 12 +-- .../notion/api/database/database_test.go | 18 ++-- core/block/import/notion/converter.go | 6 +- core/block/import/pb/converter_test.go | 6 +- core/block/import/pb/gallery.go | 61 +++++++++--- core/block/import/pb/gallery_test.go | 48 ++------- core/block/import/pb/space.go | 5 +- core/block/import/pb/space_test.go | 27 +---- core/block/import/txt/converter.go | 5 +- core/block/import/txt/converter_test.go | 6 +- 19 files changed, 142 insertions(+), 286 deletions(-) diff --git a/core/block/import/common/collection.go b/core/block/import/common/collection.go index c4bd53a49..d61bf20e6 100644 --- a/core/block/import/common/collection.go +++ b/core/block/import/common/collection.go @@ -4,7 +4,6 @@ import ( "fmt" "time" - "github.com/globalsign/mgo/bson" "github.com/google/uuid" "github.com/anyproto/anytype-heart/core/block/collection" @@ -18,14 +17,11 @@ import ( "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) -const rootWidget = "rootWidget" - type ImportCollectionSetting struct { collectionName string targetObjects []string icon string needToAddDate, shouldBeFavorite, shouldAddRelations bool - widgetSnapshot *Snapshot } type ImportCollectionOption func(*ImportCollectionSetting) @@ -74,12 +70,6 @@ func WithRelations() ImportCollectionOption { } } -func WithWidgetSnapshot(snapshot *Snapshot) ImportCollectionOption { - return func(s *ImportCollectionSetting) { - s.widgetSnapshot = snapshot - } -} - type ImportCollection struct { service *collection.Service } @@ -88,7 +78,7 @@ func NewImportCollection(service *collection.Service) *ImportCollection { return &ImportCollection{service: service} } -func (r *ImportCollection) MakeImportCollection(req *ImportCollectionSetting) (*Snapshot, *Snapshot, error) { +func (r *ImportCollection) MakeImportCollection(req *ImportCollectionSetting) (*Snapshot, error) { if req.needToAddDate { importDate := time.Now().Format(time.RFC3339) req.collectionName = fmt.Sprintf("%s %s", req.collectionName, importDate) @@ -98,100 +88,20 @@ func (r *ImportCollection) MakeImportCollection(req *ImportCollectionSetting) (* Value: model.InternalFlag_collectionDontIndexLinks, }}) if err != nil { - return nil, nil, err + return nil, err } if req.shouldAddRelations { err = r.addRelations(st) if err != nil { - return nil, nil, err + return nil, err } } detailsStruct = st.CombinedDetails().Merge(detailsStruct) st.UpdateStoreSlice(template.CollectionStoreKey, req.targetObjects) - rootCollectionSnapshot := r.getRootCollectionSnapshot(req.collectionName, st, detailsStruct) - widgetSnapshot := r.makeWidgetSnapshot(req, rootCollectionSnapshot) - return rootCollectionSnapshot, widgetSnapshot, nil -} - -func (r *ImportCollection) makeWidgetSnapshot(req *ImportCollectionSetting, rootSnapshot *Snapshot) *Snapshot { - if req.widgetSnapshot == nil { - return r.buildNewWidgetSnapshot(rootSnapshot.Id) - } - return r.enhanceExistingSnapshot(req.widgetSnapshot, rootSnapshot.Id) -} - -func (r *ImportCollection) buildNewWidgetSnapshot(targetID string) *Snapshot { - linkBlock := r.createLinkBlock(targetID) - widgetBlock := r.createWidgetBlock(linkBlock.Id) - rootBlock := r.createSmartBlock(widgetBlock.Id) - - return &Snapshot{ - Id: rootBlock.Id, - FileName: rootWidget, - Snapshot: &SnapshotModel{ - SbType: sb.SmartBlockTypeWidget, - Data: &StateSnapshot{ - Blocks: []*model.Block{rootBlock, widgetBlock, linkBlock}, - Details: r.defaultWidgetDetails(), - ObjectTypes: []string{bundle.TypeKeyDashboard.String()}, - }, - }, - } -} - -func (r *ImportCollection) enhanceExistingSnapshot(snapshot *Snapshot, targetID string) *Snapshot { - linkBlock := r.createLinkBlock(targetID) - widgetBlock := r.createWidgetBlock(linkBlock.Id) - - for _, block := range snapshot.Snapshot.Data.Blocks { - if block.GetSmartblock() != nil { - block.ChildrenIds = append(block.ChildrenIds, widgetBlock.Id) - } - } - - snapshot.Snapshot.Data.Blocks = append(snapshot.Snapshot.Data.Blocks, linkBlock, widgetBlock) - return snapshot -} - -func (r *ImportCollection) createLinkBlock(targetID string) *model.Block { - return &model.Block{ - Id: bson.NewObjectId().Hex(), - Content: &model.BlockContentOfLink{ - Link: &model.BlockContentLink{ - TargetBlockId: targetID, - }, - }, - } -} - -func (r *ImportCollection) createWidgetBlock(childID string) *model.Block { - return &model.Block{ - Id: bson.NewObjectId().Hex(), - ChildrenIds: []string{childID}, - Content: &model.BlockContentOfWidget{ - Widget: &model.BlockContentWidget{ - Layout: model.BlockContentWidget_CompactList, - }, - }, - } -} - -func (r *ImportCollection) createSmartBlock(childID string) *model.Block { - return &model.Block{ - Id: uuid.New().String(), - ChildrenIds: []string{childID}, - Content: &model.BlockContentOfSmartblock{Smartblock: &model.BlockContentSmartblock{}}, - } -} - -func (r *ImportCollection) defaultWidgetDetails() *domain.Details { - return domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ - bundle.RelationKeyLayout: domain.Int64(model.ObjectType_dashboard), - bundle.RelationKeyIsHidden: domain.Bool(true), - }) + return r.getRootCollectionSnapshot(req.collectionName, st, detailsStruct), nil } func (r *ImportCollection) getRootCollectionSnapshot( diff --git a/core/block/import/common/workerpool/workerpool.go b/core/block/import/common/workerpool/workerpool.go index 9eea0d891..3238acc63 100644 --- a/core/block/import/common/workerpool/workerpool.go +++ b/core/block/import/common/workerpool/workerpool.go @@ -13,7 +13,6 @@ type WorkerPool struct { tasks chan ITask results chan interface{} quit chan struct{} - finalizer ITask } func NewPool(numWorkers int) *WorkerPool { @@ -35,10 +34,6 @@ func (p *WorkerPool) AddWork(t ITask) bool { return false } -func (p *WorkerPool) SetFinalizer(t ITask) { - p.finalizer = t -} - func (p *WorkerPool) Start(data interface{}) { wg := &sync.WaitGroup{} for i := 0; i < p.numWorkers; i++ { @@ -48,7 +43,6 @@ func (p *WorkerPool) Start(data interface{}) { }(i) } wg.Wait() - p.finalize(data) p.CloseResult() } @@ -78,13 +72,3 @@ func (p *WorkerPool) CloseResult() { func (p *WorkerPool) CloseTask() { close(p.tasks) } - -func (p *WorkerPool) finalize(data interface{}) { - if p.finalizer != nil { - select { - case <-p.quit: - return - case p.results <- p.finalizer.Execute(data): - } - } -} diff --git a/core/block/import/csv/converter.go b/core/block/import/csv/converter.go index c9f68ba08..82dfe18ed 100644 --- a/core/block/import/csv/converter.go +++ b/core/block/import/csv/converter.go @@ -73,7 +73,7 @@ func (c *CSV) GetSnapshots(ctx context.Context, req *pb.RpcObjectImportRequest, common.WithAddDate(), common.WithRelations(), ) - rootCol, widgetSnapshot, err := rootCollection.MakeImportCollection(settings) + rootCol, err := rootCollection.MakeImportCollection(settings) if err != nil { allErrors.Add(err) if req.Mode == pb.RpcObjectImportRequest_ALL_OR_NOTHING { @@ -85,9 +85,6 @@ func (c *CSV) GetSnapshots(ctx context.Context, req *pb.RpcObjectImportRequest, result.snapshots = append(result.snapshots, rootCol) rootCollectionID = rootCol.Id } - if widgetSnapshot != nil { - result.snapshots = append(result.snapshots, widgetSnapshot) - } progress.SetTotal(int64(len(result.snapshots))) if allErrors.IsEmpty() { return &common.Response{Snapshots: result.snapshots, RootCollectionID: rootCollectionID}, nil diff --git a/core/block/import/csv/converter_test.go b/core/block/import/csv/converter_test.go index 07792616a..b5bb86307 100644 --- a/core/block/import/csv/converter_test.go +++ b/core/block/import/csv/converter_test.go @@ -34,7 +34,7 @@ func TestCsv_GetSnapshotsEmptyFile(t *testing.T) { }, p) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 3) // test + root collection + root collection widget + assert.Len(t, sn.Snapshots, 2) // test + root collection assert.Contains(t, sn.Snapshots[0].FileName, "test.csv") assert.Len(t, pbtypes.GetStringList(sn.Snapshots[0].Snapshot.Data.Collections, template.CollectionStoreKey), 0) assert.NotEmpty(t, sn.Snapshots[1].Snapshot.Data.ObjectTypes) // empty collection @@ -63,31 +63,21 @@ func TestCsv_GetSnapshots(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 7) // Journal.csv + root collection + 2 objects in Journal.csv + 2 relations (Created, Tags) + assert.Len(t, sn.Snapshots, 6) // Journal.csv + root collection + 2 objects in Journal.csv + 2 relations (Created, Tags) assert.Contains(t, sn.Snapshots[0].FileName, "Journal.csv") assert.Len(t, pbtypes.GetStringList(sn.Snapshots[0].Snapshot.Data.Collections, template.CollectionStoreKey), 2) // 2 objects - var found, foundWidget bool - var rootCollectionId string + var found bool for _, snapshot := range sn.Snapshots { if strings.Contains(snapshot.FileName, rootCollectionName) { found = true - rootCollectionId = snapshot.Id assert.NotEmpty(t, snapshot.Snapshot.Data.ObjectTypes) assert.Equal(t, snapshot.Snapshot.Data.ObjectTypes[0], bundle.TypeKeyCollection.String()) assert.Len(t, pbtypes.GetStringList(snapshot.Snapshot.Data.Collections, template.CollectionStoreKey), 1) // only Journal.csv collection } - if snapshot.Snapshot.SbType == sb.SmartBlockTypeWidget { - foundWidget = true - assert.Len(t, snapshot.Snapshot.Data.Blocks, 3) - assert.NotNil(t, snapshot.Snapshot.Data.Blocks[1].GetWidget()) - assert.NotNil(t, snapshot.Snapshot.Data.Blocks[2].GetLink()) - assert.Equal(t, rootCollectionId, snapshot.Snapshot.Data.Blocks[2].GetLink().GetTargetBlockId()) - } } assert.True(t, found) - assert.True(t, foundWidget) } func TestCsv_GetSnapshotsTable(t *testing.T) { @@ -107,7 +97,7 @@ func TestCsv_GetSnapshotsTable(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 3) // 1 page with table + root collection + root collection widget + assert.Len(t, sn.Snapshots, 2) // 1 page with table + root collection assert.Contains(t, sn.Snapshots[0].FileName, "Journal.csv") var found bool @@ -137,7 +127,7 @@ func TestCsv_GetSnapshotsTableUseFirstColumnForRelationsOn(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 3) // 1 page with table + root collection + root collection widget + assert.Len(t, sn.Snapshots, 2) // 1 page with table + root collection assert.Contains(t, sn.Snapshots[0].FileName, "Journal.csv") var rowsID []string @@ -177,7 +167,7 @@ func TestCsv_GetSnapshotsSemiColon(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 17) // 8 objects + root collection + semicolon collection + 5 relations + root collection widget + assert.Len(t, sn.Snapshots, 16) // 8 objects + root collection + semicolon collection + 5 relations assert.Contains(t, sn.Snapshots[0].FileName, "semicolon.csv") assert.Len(t, pbtypes.GetStringList(sn.Snapshots[0].Snapshot.Data.Collections, template.CollectionStoreKey), 8) assert.Equal(t, sn.Snapshots[0].Snapshot.Data.ObjectTypes[0], bundle.TypeKeyCollection.String()) @@ -202,7 +192,7 @@ func TestCsv_GetSnapshotsTranspose(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 5) // 2 object + root collection + transpose collection + 1 relations + root collection widget + assert.Len(t, sn.Snapshots, 4) // 2 object + root collection + transpose collection + 1 relations for _, snapshot := range sn.Snapshots { if snapshot.Snapshot.SbType == sb.SmartBlockTypeRelation { @@ -246,7 +236,7 @@ func TestCsv_GetSnapshotsTranspose(t *testing.T) { // then assert.Nil(t, err) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 5) + assert.Len(t, sn.Snapshots, 4) for _, snapshot := range sn.Snapshots { if snapshot.Snapshot.SbType == sb.SmartBlockTypeRelation { @@ -275,7 +265,7 @@ func TestCsv_GetSnapshotsTransposeUseFirstRowForRelationsOff(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 6) // 2 object + root collection + transpose collection + 1 relations + root collection widget + assert.Len(t, sn.Snapshots, 5) // 2 object + root collection + transpose collection + 1 relations for _, snapshot := range sn.Snapshots { if snapshot.Snapshot.SbType == sb.SmartBlockTypeRelation { @@ -302,7 +292,7 @@ func TestCsv_GetSnapshotsUseFirstColumnForRelationsOn(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 7) // Journal.csv collection, root collection + 2 objects in Journal.csv + 2 relations (Created, Tags) + root collection widget + assert.Len(t, sn.Snapshots, 6) // Journal.csv collection, root collection + 2 objects in Journal.csv + 2 relations (Created, Tags) var rowsObjects []*common.Snapshot for _, snapshot := range sn.Snapshots { @@ -313,7 +303,7 @@ func TestCsv_GetSnapshotsUseFirstColumnForRelationsOn(t *testing.T) { } } - assert.Len(t, rowsObjects, 3) + assert.Len(t, rowsObjects, 2) want := [][]string{ {"Hawaii Vacation", "July 13, 2022 8:54 AM", "Special Event"}, @@ -348,7 +338,7 @@ func TestCsv_GetSnapshotsUseFirstColumnForRelationsOff(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 8) // Journal.csv collection, root collection + 3 objects in Journal.csv + 2 relations (Created, Tags) + root collection widget + assert.Len(t, sn.Snapshots, 7) // Journal.csv collection, root collection + 3 objects in Journal.csv + 2 relations (Created, Tags) var objects []*common.Snapshot for _, snapshot := range sn.Snapshots { @@ -359,7 +349,7 @@ func TestCsv_GetSnapshotsUseFirstColumnForRelationsOff(t *testing.T) { } } - assert.Len(t, objects, 4) // first row is also an object + assert.Len(t, objects, 3) // first row is also an object want := [][]string{ {"Name", "Created", "Tags"}, @@ -524,7 +514,7 @@ func TestCsv_GetSnapshots1000RowsFile(t *testing.T) { var objects []*common.Snapshot for _, snapshot := range sn.Snapshots { // only objects created from rows - if snapshot.Snapshot.SbType != sb.SmartBlockTypeRelation && snapshot.Snapshot.SbType != sb.SmartBlockTypeWidget && + if snapshot.Snapshot.SbType != sb.SmartBlockTypeRelation && !lo.Contains(snapshot.Snapshot.Data.ObjectTypes, bundle.TypeKeyCollection.String()) { objects = append(objects, snapshot) } @@ -550,7 +540,7 @@ func TestCsv_GetSnapshots1000RowsFile(t *testing.T) { objects = []*common.Snapshot{} for _, snapshot := range sn.Snapshots { // only objects created from rows - if snapshot.Snapshot.SbType != sb.SmartBlockTypeRelation && snapshot.Snapshot.SbType != sb.SmartBlockTypeWidget && + if snapshot.Snapshot.SbType != sb.SmartBlockTypeRelation && !lo.Contains(snapshot.Snapshot.Data.ObjectTypes, bundle.TypeKeyCollection.String()) { objects = append(objects, snapshot) } @@ -673,7 +663,7 @@ func TestCsv_GetSnapshots10Relations(t *testing.T) { var objects []*common.Snapshot for _, snapshot := range sn.Snapshots { // only objects created from rows - if snapshot.Snapshot.SbType != sb.SmartBlockTypeRelation && snapshot.Snapshot.SbType != sb.SmartBlockTypeWidget && + if snapshot.Snapshot.SbType != sb.SmartBlockTypeRelation && !lo.Contains(snapshot.Snapshot.Data.ObjectTypes, bundle.TypeKeyCollection.String()) { objects = append(objects, snapshot) } @@ -704,7 +694,7 @@ func TestCsv_GetSnapshots10Relations(t *testing.T) { objects = []*common.Snapshot{} for _, snapshot := range sn.Snapshots { // only objects created from rows - if snapshot.Snapshot.SbType != sb.SmartBlockTypeRelation && snapshot.Snapshot.SbType != sb.SmartBlockTypeWidget && + if snapshot.Snapshot.SbType != sb.SmartBlockTypeRelation && !lo.Contains(snapshot.Snapshot.Data.ObjectTypes, bundle.TypeKeyCollection.String()) { objects = append(objects, snapshot) } @@ -748,7 +738,7 @@ func TestCsv_GetSnapshotsTableModeDifferentColumnsNumber(t *testing.T) { objects = append(objects, snapshot) } } - assert.Len(t, objects, 2) + assert.Len(t, objects, 1) assert.Equal(t, objects[0].Snapshot.Data.Details.GetString(bundle.RelationKeyName), "differentcolumnnumber") numberOfCSVColumns := lo.CountBy(objects[0].Snapshot.Data.Blocks, func(item *model.Block) bool { return item.GetTableColumn() != nil }) assert.Equal(t, 5, numberOfCSVColumns) @@ -781,7 +771,7 @@ func TestCsv_GetSnapshotsTableModeDifferentColumnsNumber(t *testing.T) { var objects []*common.Snapshot for _, snapshot := range sn.Snapshots { // only objects created from rows - if snapshot.Snapshot.SbType != sb.SmartBlockTypeRelation && snapshot.Snapshot.SbType != sb.SmartBlockTypeWidget && + if snapshot.Snapshot.SbType != sb.SmartBlockTypeRelation && !lo.Contains(snapshot.Snapshot.Data.ObjectTypes, bundle.TypeKeyCollection.String()) { objects = append(objects, snapshot) } diff --git a/core/block/import/html/converter.go b/core/block/import/html/converter.go index 846d8bf7c..f40f26c2f 100644 --- a/core/block/import/html/converter.go +++ b/core/block/import/html/converter.go @@ -72,7 +72,7 @@ func (h *HTML) GetSnapshots(ctx context.Context, req *pb.RpcObjectImportRequest, common.WithAddDate(), common.WithRelations(), ) - rootCollectionSnapshot, widgetSnapshot, err := rootCollection.MakeImportCollection(settings) + rootCollectionSnapshot, err := rootCollection.MakeImportCollection(settings) if err != nil { allErrors.Add(err) if allErrors.ShouldAbortImport(len(path), req.Type) { @@ -84,9 +84,6 @@ func (h *HTML) GetSnapshots(ctx context.Context, req *pb.RpcObjectImportRequest, snapshots = append(snapshots, rootCollectionSnapshot) rootCollectionID = rootCollectionSnapshot.Id } - if widgetSnapshot != nil { - snapshots = append(snapshots, widgetSnapshot) - } progress.SetTotal(int64(numberOfStages * len(snapshots))) if allErrors.IsEmpty() { return &common.Response{Snapshots: snapshots, RootCollectionID: rootCollectionID}, nil diff --git a/core/block/import/html/converter_test.go b/core/block/import/html/converter_test.go index ad560993e..3198db518 100644 --- a/core/block/import/html/converter_test.go +++ b/core/block/import/html/converter_test.go @@ -44,7 +44,7 @@ func TestHTML_GetSnapshots(t *testing.T) { ) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 3) + assert.Len(t, sn.Snapshots, 2) assert.Contains(t, sn.Snapshots[0].FileName, "test.html") assert.NotEmpty(t, sn.Snapshots[0].Snapshot.Data.Details.GetString("name")) assert.Equal(t, sn.Snapshots[0].Snapshot.Data.Details.GetString("name"), "test") @@ -53,10 +53,6 @@ func TestHTML_GetSnapshots(t *testing.T) { assert.NotEmpty(t, sn.Snapshots[1].Snapshot.Data.ObjectTypes) assert.Equal(t, sn.Snapshots[1].Snapshot.Data.ObjectTypes[0], bundle.TypeKeyCollection.String()) - assert.Len(t, sn.Snapshots[2].Snapshot.Data.Blocks, 3) - assert.NotNil(t, sn.Snapshots[2].Snapshot.Data.Blocks[1].GetWidget()) - assert.NotNil(t, sn.Snapshots[2].Snapshot.Data.Blocks[2].GetLink()) - assert.Equal(t, sn.Snapshots[1].Id, sn.Snapshots[2].Snapshot.Data.Blocks[2].GetLink().GetTargetBlockId()) assert.NotEmpty(t, err) assert.True(t, errors.Is(err.GetResultError(model.Import_Html), common.ErrFileImportNoObjectsInDirectory)) }) diff --git a/core/block/import/importer.go b/core/block/import/importer.go index 3ae7874ad..b131de4f1 100644 --- a/core/block/import/importer.go +++ b/core/block/import/importer.go @@ -42,7 +42,6 @@ import ( "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/core" - "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock" "github.com/anyproto/anytype-heart/pkg/lib/localstore/addr" "github.com/anyproto/anytype-heart/pkg/lib/localstore/filestore" "github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore" @@ -71,6 +70,7 @@ type Import struct { importCtx context.Context importCtxCancel context.CancelFunc + spaceService space.Service } func New() Importer { @@ -83,6 +83,7 @@ func (i *Import) Init(a *app.App) (err error) { i.s = app.MustComponent[*block.Service](a) accountService := app.MustComponent[account.Service](a) spaceService := app.MustComponent[space.Service](a) + i.spaceService = spaceService col := app.MustComponent[*collection.Service](a) i.tempDirProvider = app.MustComponent[core.TempDirProvider](a) converters := []common.Converter{ @@ -181,10 +182,33 @@ func (i *Import) importObjects(ctx context.Context, importRequest *ImportRequest func (i *Import) onImportFinish(res *ImportResponse, req *ImportRequest, importId string) { i.finishImportProcess(res.Err, req) i.sendFileEvents(res.Err) + if res.RootCollectionId != "" { + i.addRootCollectionWidget(res, req) + } i.recordEvent(&metrics.ImportFinishedEvent{ID: importId, ImportType: req.Type.String()}) i.sendImportFinishEventToClient(res.RootCollectionId, req.IsSync, res.ObjectsCount, req.Type) } +func (i *Import) addRootCollectionWidget(res *ImportResponse, req *ImportRequest) { + spc, err := i.spaceService.Get(i.importCtx, req.SpaceId) + if err != nil { + log.Errorf("failed to create widget from root collection, error: %s", err.Error()) + } else { + _, err = i.s.CreateWidgetBlock(nil, &pb.RpcBlockCreateWidgetRequest{ + ContextId: spc.DerivedIDs().Widgets, + WidgetLayout: model.BlockContentWidget_CompactList, + Block: &model.Block{ + Content: &model.BlockContentOfLink{Link: &model.BlockContentLink{ + TargetBlockId: res.RootCollectionId, + }}, + }, + }) + if err != nil { + log.Errorf("failed to create widget from root collection, error: %s", err.Error()) + } + } +} + func (i *Import) sendFileEvents(returnedErr error) { if returnedErr == nil { i.fileSync.SendImportEvents() @@ -493,10 +517,6 @@ func (i *Import) extractInternalKey(snapshot *common.Snapshot, oldIDToNew map[st func (i *Import) addWork(res *common.Response, pool *workerpool.WorkerPool) { for _, snapshot := range res.Snapshots { t := creator.NewTask(snapshot, i.oc) - if snapshot.Snapshot.SbType == smartblock.SmartBlockTypeWidget { - pool.SetFinalizer(t) - continue - } stop := pool.AddWork(t) if stop { break diff --git a/core/block/import/markdown/import.go b/core/block/import/markdown/import.go index 0ccb27eb4..71b7e411e 100644 --- a/core/block/import/markdown/import.go +++ b/core/block/import/markdown/import.go @@ -108,7 +108,7 @@ func (m *Markdown) createRootCollection(allSnapshots []*common.Snapshot, allRoot common.WithAddDate(), common.WithRelations(), ) - rootCol, widgetSnapshot, err := rootCollection.MakeImportCollection(settings) + rootCol, err := rootCollection.MakeImportCollection(settings) if err != nil { return nil, "", err } @@ -118,9 +118,6 @@ func (m *Markdown) createRootCollection(allSnapshots []*common.Snapshot, allRoot allSnapshots = append(allSnapshots, rootCol) rootCollectionID = rootCol.Id } - if widgetSnapshot != nil { - allSnapshots = append(allSnapshots, widgetSnapshot) - } return allSnapshots, rootCollectionID, nil } @@ -436,7 +433,7 @@ func (m *Markdown) addCollectionSnapshot(fileName string, file *FileInfo, snapsh common.WithCollectionName(file.Title), common.WithTargetObjects(file.CollectionsObjectsIds), ) - csvCollection, _, err := c.MakeImportCollection(settings) + csvCollection, err := c.MakeImportCollection(settings) if err != nil { return nil, err } diff --git a/core/block/import/markdown/import_test.go b/core/block/import/markdown/import_test.go index 386273b56..9cafe0409 100644 --- a/core/block/import/markdown/import_test.go +++ b/core/block/import/markdown/import_test.go @@ -14,7 +14,6 @@ import ( "github.com/anyproto/anytype-heart/core/block/import/common/test" "github.com/anyproto/anytype-heart/core/block/process" "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" "github.com/anyproto/anytype-heart/tests/blockbuilder" ) @@ -38,10 +37,10 @@ func TestMarkdown_GetSnapshots(t *testing.T) { // then assert.Nil(t, err) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 4) + assert.Len(t, sn.Snapshots, 3) var ( - found, foundWidget bool - subPageId string + found bool + subPageId string ) for _, snapshot := range sn.Snapshots { if snapshot.FileName == filepath.Join(testDirectory, "test_database", "test.md") { @@ -55,18 +54,10 @@ func TestMarkdown_GetSnapshots(t *testing.T) { assert.NotEmpty(t, snapshot.Snapshot.Data.Collections.Fields["objects"]) assert.Len(t, snapshot.Snapshot.Data.Collections.Fields["objects"].GetListValue().GetValues(), 1) assert.Equal(t, subPageId, snapshot.Snapshot.Data.Collections.Fields["objects"].GetListValue().GetValues()[0].GetStringValue()) - } - if snapshot.Snapshot.SbType == smartblock.SmartBlockTypeWidget { - foundWidget = true - assert.Len(t, snapshot.Snapshot.Data.Blocks, 3) - assert.NotNil(t, snapshot.Snapshot.Data.Blocks[1].GetWidget()) - assert.NotNil(t, snapshot.Snapshot.Data.Blocks[2].GetLink()) - assert.NotEmpty(t, snapshot.Snapshot.Data.Blocks[2].GetLink().GetTargetBlockId()) break } } assert.True(t, found) - assert.True(t, foundWidget) }) t.Run("no object error", func(t *testing.T) { // given @@ -107,7 +98,7 @@ func TestMarkdown_GetSnapshots(t *testing.T) { // then assert.Nil(t, err) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 8) + assert.Len(t, sn.Snapshots, 7) fileNameToObjectId := make(map[string]string, len(sn.Snapshots)) for _, snapshot := range sn.Snapshots { @@ -188,7 +179,7 @@ func TestMarkdown_GetSnapshots(t *testing.T) { // then assert.Nil(t, ce) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 5) + assert.Len(t, sn.Snapshots, 4) fileNameToObjectId := make(map[string]string, len(sn.Snapshots)) for _, snapshot := range sn.Snapshots { fileNameToObjectId[snapshot.FileName] = snapshot.Id diff --git a/core/block/import/notion/api/database/database.go b/core/block/import/notion/api/database/database.go index 0acf026bf..264242387 100644 --- a/core/block/import/notion/api/database/database.go +++ b/core/block/import/notion/api/database/database.go @@ -345,11 +345,9 @@ func (ds *Service) AddPagesToCollections(databaseSnapshots []*common.Snapshot, p } } -func (ds *Service) AddObjectsToNotionCollection( - notionContext *api.NotionImportContext, +func (ds *Service) AddObjectsToNotionCollection(notionContext *api.NotionImportContext, notionDB []Database, - notionPages []page.Page, -) (*common.Snapshot, *common.Snapshot, error) { + notionPages []page.Page) (*common.Snapshot, error) { allObjects := ds.filterObjects(notionContext, notionDB, notionPages) rootCollection := common.NewImportCollection(ds.collectionService) @@ -359,11 +357,11 @@ func (ds *Service) AddObjectsToNotionCollection( common.WithAddDate(), common.WithRelations(), ) - rootCol, widget, err := rootCollection.MakeImportCollection(settings) + rootCol, err := rootCollection.MakeImportCollection(settings) if err != nil { - return nil, nil, err + return nil, err } - return rootCol, widget, nil + return rootCol, nil } func (ds *Service) filterObjects(notionContext *api.NotionImportContext, diff --git a/core/block/import/notion/api/database/database_test.go b/core/block/import/notion/api/database/database_test.go index ead10e9dd..53090238c 100644 --- a/core/block/import/notion/api/database/database_test.go +++ b/core/block/import/notion/api/database/database_test.go @@ -41,7 +41,7 @@ func TestService_AddObjectsToNotionCollection(t *testing.T) { } // when - collection, _, err := service.AddObjectsToNotionCollection(notionImportContext, nil, notionPages) + collection, err := service.AddObjectsToNotionCollection(notionImportContext, nil, notionPages) // then assert.Nil(t, err) @@ -83,7 +83,7 @@ func TestService_AddObjectsToNotionCollection(t *testing.T) { } // when - collection, _, err := service.AddObjectsToNotionCollection(notionImportContext, nil, notionPages) + collection, err := service.AddObjectsToNotionCollection(notionImportContext, nil, notionPages) // then assert.Nil(t, err) @@ -119,7 +119,7 @@ func TestService_AddObjectsToNotionCollection(t *testing.T) { } // when - collection, _, err := service.AddObjectsToNotionCollection(notionImportContext, nil, notionPages) + collection, err := service.AddObjectsToNotionCollection(notionImportContext, nil, notionPages) // then assert.Nil(t, err) @@ -166,7 +166,7 @@ func TestService_AddObjectsToNotionCollection(t *testing.T) { } // when - collection, _, err := service.AddObjectsToNotionCollection(notionImportContext, notionDB, notionPages) + collection, err := service.AddObjectsToNotionCollection(notionImportContext, notionDB, notionPages) // then assert.Nil(t, err) @@ -205,7 +205,7 @@ func TestService_AddObjectsToNotionCollection(t *testing.T) { } // when - collection, _, err := service.AddObjectsToNotionCollection(notionImportContext, notionDB, notionPages) + collection, err := service.AddObjectsToNotionCollection(notionImportContext, notionDB, notionPages) // then assert.Nil(t, err) @@ -251,7 +251,7 @@ func TestService_AddObjectsToNotionCollection(t *testing.T) { } // when - collection, _, err := service.AddObjectsToNotionCollection(notionImportContext, notionDB, notionPages) + collection, err := service.AddObjectsToNotionCollection(notionImportContext, notionDB, notionPages) // then assert.Nil(t, err) @@ -287,7 +287,7 @@ func TestService_AddObjectsToNotionCollection(t *testing.T) { } // when - collection, _, err := service.AddObjectsToNotionCollection(notionImportContext, notionDB, nil) + collection, err := service.AddObjectsToNotionCollection(notionImportContext, notionDB, nil) // then assert.Nil(t, err) @@ -329,7 +329,7 @@ func TestService_AddObjectsToNotionCollection(t *testing.T) { } // when - collection, _, err := service.AddObjectsToNotionCollection(notionImportContext, nil, notionPages) + collection, err := service.AddObjectsToNotionCollection(notionImportContext, nil, notionPages) // then assert.Nil(t, err) @@ -368,7 +368,7 @@ func TestService_AddObjectsToNotionCollection(t *testing.T) { } // when - collection, _, err := service.AddObjectsToNotionCollection(notionImportContext, nil, notionPages) + collection, err := service.AddObjectsToNotionCollection(notionImportContext, nil, notionPages) // then assert.Nil(t, err) diff --git a/core/block/import/notion/converter.go b/core/block/import/notion/converter.go index ae58034ba..f16ecf1d9 100644 --- a/core/block/import/notion/converter.go +++ b/core/block/import/notion/converter.go @@ -116,7 +116,7 @@ func (n *Notion) GetSnapshots(ctx context.Context, req *pb.RpcObjectImportReques n.dbService.AddPagesToCollections(dbs, pages, db, notionImportContext.NotionPageIdsToAnytype, notionImportContext.NotionDatabaseIdsToAnytype) - rootCollectionSnapshot, widgetSnapshot, err := n.dbService.AddObjectsToNotionCollection(notionImportContext, db, pages) + rootCollectionSnapshot, err := n.dbService.AddObjectsToNotionCollection(notionImportContext, db, pages) if err != nil { ce.Add(err) if ce.ShouldAbortImport(0, req.Type) { @@ -132,10 +132,6 @@ func (n *Notion) GetSnapshots(ctx context.Context, req *pb.RpcObjectImportReques allSnapshots = append(allSnapshots, pgs...) allSnapshots = append(allSnapshots, dbs...) - if widgetSnapshot != nil { - allSnapshots = append(allSnapshots, widgetSnapshot) - } - if !ce.IsEmpty() { return &common.Response{Snapshots: allSnapshots, RootCollectionID: rootCollectionID}, ce } diff --git a/core/block/import/pb/converter_test.go b/core/block/import/pb/converter_test.go index d9b8c62c2..59040cbc3 100644 --- a/core/block/import/pb/converter_test.go +++ b/core/block/import/pb/converter_test.go @@ -50,7 +50,7 @@ func Test_GetSnapshotsSuccess(t *testing.T) { }, process.NewNoOp()) assert.Nil(t, ce) - assert.Len(t, res.Snapshots, 3) + assert.Len(t, res.Snapshots, 2) assert.Contains(t, res.Snapshots[1].FileName, rootCollectionName) assert.NotEmpty(t, res.Snapshots[1].Snapshot.Data.ObjectTypes) @@ -159,7 +159,7 @@ func Test_GetSnapshotsFailedToGetSnapshotForTwoFiles(t *testing.T) { assert.NotNil(t, ce) assert.NotNil(t, res.Snapshots) - assert.Len(t, res.Snapshots, 3) + assert.Len(t, res.Snapshots, 2) assert.False(t, ce.IsEmpty()) } @@ -215,7 +215,7 @@ func Test_GetSnapshotsSkipFileWithoutExtension(t *testing.T) { assert.Nil(t, ce) assert.NotNil(t, res.Snapshots) - assert.Len(t, res.Snapshots, 3) + assert.Len(t, res.Snapshots, 2) assert.Equal(t, res.Snapshots[0].FileName, "bafyreig5sd7mlmhindapjuvzc4gnetdbszztb755sa7nflojkljmu56mmi.pb") assert.Contains(t, res.Snapshots[1].FileName, rootCollectionName) diff --git a/core/block/import/pb/gallery.go b/core/block/import/pb/gallery.go index 17f4a5e72..e82fe3bf2 100644 --- a/core/block/import/pb/gallery.go +++ b/core/block/import/pb/gallery.go @@ -1,6 +1,8 @@ package pb import ( + "github.com/globalsign/mgo/bson" + "github.com/anyproto/anytype-heart/core/block/collection" "github.com/anyproto/anytype-heart/core/block/editor/state" widgets "github.com/anyproto/anytype-heart/core/block/editor/widget" @@ -10,6 +12,7 @@ import ( "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock" "github.com/anyproto/anytype-heart/pkg/lib/localstore/addr" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) const widgetCollectionPattern = "'s Widgets" @@ -28,7 +31,7 @@ func (g *GalleryImport) ProvideCollection(snapshots []*common.Snapshot, params *pb.RpcObjectImportRequestPbParams, workspaceSnapshot *common.Snapshot, isNewSpace bool, -) (resultSnapshots []*common.Snapshot, err error) { +) (collectionsSnapshots []*common.Snapshot, err error) { if isNewSpace { return nil, nil } @@ -36,10 +39,7 @@ func (g *GalleryImport) ProvideCollection(snapshots []*common.Snapshot, if widget != nil { widgetObjects = g.getObjectsFromWidgets(widget) } - var ( - icon string - widgetSnapshot *common.Snapshot - ) + var icon string if workspaceSnapshot != nil { // we use space icon for import collection icon = workspaceSnapshot.Snapshot.Data.Details.GetString(bundle.RelationKeyIconImage) } @@ -49,7 +49,7 @@ func (g *GalleryImport) ProvideCollection(snapshots []*common.Snapshot, } rootCollection := common.NewImportCollection(g.service) if len(widgetObjects) > 0 { - resultSnapshots, widgetSnapshot, err = g.getWidgetsCollection(collectionName, rootCollection, widgetObjects, icon, resultSnapshots) + collectionsSnapshots, err = g.getWidgetsCollection(collectionName, rootCollection, widgetObjects, icon, widget, collectionsSnapshots) if err != nil { return nil, err } @@ -60,17 +60,22 @@ func (g *GalleryImport) ProvideCollection(snapshots []*common.Snapshot, common.WithTargetObjects(objectsIDs), common.WithIcon(icon), common.WithRelations(), - common.WithWidgetSnapshot(widgetSnapshot), ) - objectsCollection, widgetSnapshot, err := rootCollection.MakeImportCollection(settings) + objectsCollection, err := rootCollection.MakeImportCollection(settings) if err != nil { return nil, err } - resultSnapshots = append(resultSnapshots, objectsCollection, widgetSnapshot) - return resultSnapshots, nil + collectionsSnapshots = append(collectionsSnapshots, objectsCollection) + return collectionsSnapshots, err } -func (g *GalleryImport) getWidgetsCollection(collectionName string, rootCollection *common.ImportCollection, widgetObjects []string, icon string, collectionsSnapshots []*common.Snapshot) ([]*common.Snapshot, *common.Snapshot, error) { +func (g *GalleryImport) getWidgetsCollection(collectionName string, + rootCollection *common.ImportCollection, + widgetObjects []string, + icon string, + widget *common.Snapshot, + collectionsSnapshots []*common.Snapshot, +) ([]*common.Snapshot, error) { widgetCollectionName := collectionName + widgetCollectionPattern settings := common.NewImportCollectionSetting( common.WithCollectionName(widgetCollectionName), @@ -78,14 +83,17 @@ func (g *GalleryImport) getWidgetsCollection(collectionName string, rootCollecti common.WithIcon(icon), common.WithRelations(), ) - widgetsCollectionSnapshot, widget, err := rootCollection.MakeImportCollection(settings) + widgetsCollectionSnapshot, err := rootCollection.MakeImportCollection(settings) if err != nil { - return nil, nil, err + return nil, err + } + if widgetsCollectionSnapshot != nil && widget != nil { + g.addCollectionWidget(widget, widgetsCollectionSnapshot.Id) } if widgetsCollectionSnapshot != nil { collectionsSnapshots = append(collectionsSnapshots, widgetsCollectionSnapshot) } - return collectionsSnapshots, widget, nil + return collectionsSnapshots, nil } func (g *GalleryImport) getObjectsFromWidgets(widgetSnapshot *common.Snapshot) []string { @@ -109,6 +117,31 @@ func (g *GalleryImport) getObjectsFromWidgets(widgetSnapshot *common.Snapshot) [ return objectsInWidget } +func (g *GalleryImport) addCollectionWidget(widgetSnapshot *common.Snapshot, collectionID string) { + id := bson.NewObjectId().Hex() + // create widget for import collection + linkBlock := &model.Block{ + Id: id, + Content: &model.BlockContentOfLink{ + Link: &model.BlockContentLink{ + TargetBlockId: collectionID, + }, + }, + } + widgetID := bson.NewObjectId().Hex() + widgetBlock := &model.Block{ + Id: widgetID, + ChildrenIds: []string{id}, + Content: &model.BlockContentOfWidget{Widget: &model.BlockContentWidget{ + Layout: model.BlockContentWidget_CompactList, + Limit: 0, + ViewId: "", + }}, + } + // for widget object we only add import collection, other widgets should be erased + widgetSnapshot.Snapshot.Data.Blocks = []*model.Block{widgetBlock, linkBlock} +} + func (g *GalleryImport) getObjectsIDs(snapshots []*common.Snapshot) []string { var resultIDs []string for _, snapshot := range snapshots { diff --git a/core/block/import/pb/gallery_test.go b/core/block/import/pb/gallery_test.go index 57835df8e..140390ca6 100644 --- a/core/block/import/pb/gallery_test.go +++ b/core/block/import/pb/gallery_test.go @@ -28,7 +28,7 @@ func TestGalleryImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) - assert.Len(t, collection, 2) + assert.Len(t, collection, 1) assert.NotContains(t, widgetCollectionPattern, collection[0].FileName) }) t.Run("CollectionTitle parameter is empty - collection with default name", func(t *testing.T) { @@ -41,7 +41,7 @@ func TestGalleryImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) - assert.Len(t, collection, 2) + assert.Len(t, collection, 1) assert.Equal(t, rootCollectionName, collection[0].FileName) }) t.Run("CollectionTitle parameter is equal 'test' - collection with name test", func(t *testing.T) { @@ -54,7 +54,7 @@ func TestGalleryImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) - assert.Len(t, collection, 2) + assert.Len(t, collection, 1) assert.Equal(t, "test", collection[0].FileName) }) t.Run("widget with sets - only objects root collection as we ignore default sets and not create widgets collection", func(t *testing.T) { @@ -135,7 +135,7 @@ func TestGalleryImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) - assert.Len(t, collection, 2) + assert.Len(t, collection, 1) assert.NotContains(t, widgetCollectionPattern, collection[0].FileName) }) t.Run("default sets and objects in widget - root collection with objects from widget and object root collection are created", func(t *testing.T) { @@ -206,7 +206,7 @@ func TestGalleryImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) - assert.Len(t, collection, 3) + assert.Len(t, collection, 2) rootCollectionState := state.NewDocFromSnapshot("", collection[0].Snapshot.ToProto()).(*state.State) objectsInCollection := rootCollectionState.GetStoreSlice(template.CollectionStoreKey) assert.Len(t, objectsInCollection, 1) @@ -241,7 +241,7 @@ func TestGalleryImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) - assert.Len(t, collection, 2) + assert.Len(t, collection, 1) assert.NotContains(t, widgetCollectionPattern, collection[0].FileName) }) @@ -255,7 +255,7 @@ func TestGalleryImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) - assert.Len(t, collection, 2) + assert.Len(t, collection, 1) assert.Empty(t, collection[0].Snapshot.Data.Details.GetString(bundle.RelationKeyIconImage)) }) t.Run("workspace without icon - root collection without icon", func(t *testing.T) { @@ -278,7 +278,7 @@ func TestGalleryImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) - assert.Len(t, collection, 2) + assert.Len(t, collection, 1) assert.Empty(t, collection[0].Snapshot.Data.Details.GetString(bundle.RelationKeyIconImage)) }) t.Run("workspace with icon - root collection with icon", func(t *testing.T) { @@ -303,7 +303,7 @@ func TestGalleryImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) - assert.Len(t, collection, 2) + assert.Len(t, collection, 1) assert.Equal(t, "icon", collection[0].Snapshot.Data.Details.GetString(bundle.RelationKeyIconImage)) }) t.Run("if import in new space - not create anything", func(t *testing.T) { @@ -349,35 +349,7 @@ func TestGalleryImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) - assert.Len(t, collection, 2) + assert.Len(t, collection, 1) assert.NotContains(t, widgetCollectionPattern, collection[0].FileName) }) - t.Run("widget with collection", func(t *testing.T) { - // given - p := GalleryImport{} - params := &pb.RpcObjectImportRequestPbParams{NoCollection: false} - - // object with widget - widgetSnapshot := &common.Snapshot{ - Id: "widgetID", - Snapshot: &common.SnapshotModel{ - SbType: smartblock.SmartBlockTypeWidget, - Data: &common.StateSnapshot{ - Blocks: []*model.Block{}, - }, - }, - } - - // when - collection, err := p.ProvideCollection(nil, widgetSnapshot, nil, params, nil, false) - - // then - assert.Nil(t, err) - assert.Len(t, collection, 2) - assert.Equal(t, smartblock.SmartBlockTypeWidget, collection[1].Snapshot.SbType) - assert.Len(t, collection[1].Snapshot.Data.Blocks, 3) - assert.NotNil(t, collection[1].Snapshot.Data.Blocks[1].GetWidget()) - assert.NotNil(t, collection[1].Snapshot.Data.Blocks[2].GetLink()) - assert.Equal(t, collection[0].Id, collection[1].Snapshot.Data.Blocks[2].GetLink().GetTargetBlockId()) - }) } diff --git a/core/block/import/pb/space.go b/core/block/import/pb/space.go index b62d7edc9..6a967e62a 100644 --- a/core/block/import/pb/space.go +++ b/core/block/import/pb/space.go @@ -61,13 +61,12 @@ func (s *SpaceImport) ProvideCollection(snapshots []*common.Snapshot, common.WithTargetObjects(rootObjects), common.WithRelations(), common.WithAddDate(), - common.WithWidgetSnapshot(widgetSnapshot), ) - rootCollectionSnapshot, widgetSnapshot, err := rootCollection.MakeImportCollection(settings) + rootCollectionSnapshot, err := rootCollection.MakeImportCollection(settings) if err != nil { return nil, err } - return []*common.Snapshot{rootCollectionSnapshot, widgetSnapshot}, nil + return []*common.Snapshot{rootCollectionSnapshot}, nil } func (s *SpaceImport) objectShouldBeSkipped(item *common.Snapshot) bool { diff --git a/core/block/import/pb/space_test.go b/core/block/import/pb/space_test.go index f12b561ae..119fa6cbe 100644 --- a/core/block/import/pb/space_test.go +++ b/core/block/import/pb/space_test.go @@ -27,7 +27,7 @@ func TestSpaceImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) - assert.Len(t, collection, 2) + assert.Len(t, collection, 1) rootCollectionState := state.NewDocFromSnapshot("", collection[0].Snapshot.ToProto()).(*state.State) objectsInCollection := rootCollectionState.GetStoreSlice(template.CollectionStoreKey) assert.Len(t, objectsInCollection, 0) @@ -82,7 +82,7 @@ func TestSpaceImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) assert.NotNil(t, collection) - assert.Len(t, collection, 2) + assert.Len(t, collection, 1) rootCollectionState := state.NewDocFromSnapshot("", collection[0].Snapshot.ToProto()).(*state.State) objectsInCollection := rootCollectionState.GetStoreSlice(template.CollectionStoreKey) assert.Len(t, objectsInCollection, 3) @@ -172,7 +172,7 @@ func TestSpaceImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) assert.NotNil(t, collection) - assert.Len(t, collection, 2) + assert.Len(t, collection, 1) rootCollectionState := state.NewDocFromSnapshot("", collection[0].Snapshot.ToProto()).(*state.State) objectsInCollection := rootCollectionState.GetStoreSlice(template.CollectionStoreKey) assert.Len(t, objectsInCollection, 1) @@ -261,7 +261,7 @@ func TestSpaceImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) assert.NotNil(t, collection) - assert.Len(t, collection, 2) + assert.Len(t, collection, 1) rootCollectionState := state.NewDocFromSnapshot("", collection[0].Snapshot.ToProto()).(*state.State) objectsInCollection := rootCollectionState.GetStoreSlice(template.CollectionStoreKey) assert.Len(t, objectsInCollection, 1) @@ -365,26 +365,9 @@ func TestSpaceImport_ProvideCollection(t *testing.T) { // then assert.Nil(t, err) assert.NotNil(t, collection) - assert.Len(t, collection, 2) + assert.Len(t, collection, 1) rootCollectionState := state.NewDocFromSnapshot("", collection[0].Snapshot.ToProto()).(*state.State) objectsInCollection := rootCollectionState.GetStoreSlice(template.CollectionStoreKey) assert.Equal(t, []string{"newObjectInWidget", "id1", "spaceDashboardId"}, objectsInCollection) }) - t.Run("widget with collection", func(t *testing.T) { - // given - p := SpaceImport{} - params := &pb.RpcObjectImportRequestPbParams{NoCollection: false} - - // when - collection, err := p.ProvideCollection(nil, nil, nil, params, nil, false) - - // then - assert.Nil(t, err) - assert.Len(t, collection, 2) - assert.Equal(t, smartblock2.SmartBlockTypeWidget, collection[1].Snapshot.SbType) - assert.Len(t, collection[1].Snapshot.Data.Blocks, 3) - assert.NotNil(t, collection[1].Snapshot.Data.Blocks[1].GetWidget()) - assert.NotNil(t, collection[1].Snapshot.Data.Blocks[2].GetLink()) - assert.Equal(t, collection[0].Id, collection[1].Snapshot.Data.Blocks[2].GetLink().GetTargetBlockId()) - }) } diff --git a/core/block/import/txt/converter.go b/core/block/import/txt/converter.go index 07c16dc71..2282c2c4b 100644 --- a/core/block/import/txt/converter.go +++ b/core/block/import/txt/converter.go @@ -62,7 +62,7 @@ func (t *TXT) GetSnapshots(ctx context.Context, req *pb.RpcObjectImportRequest, common.WithRelations(), common.WithAddDate(), ) - rootCol, widget, err := rootCollection.MakeImportCollection(settings) + rootCol, err := rootCollection.MakeImportCollection(settings) if err != nil { allErrors.Add(err) if allErrors.ShouldAbortImport(len(paths), req.Type) { @@ -74,9 +74,6 @@ func (t *TXT) GetSnapshots(ctx context.Context, req *pb.RpcObjectImportRequest, snapshots = append(snapshots, rootCol) rootCollectionID = rootCol.Id } - if widget != nil { - snapshots = append(snapshots, widget) - } progress.SetTotal(int64(numberOfStages * len(snapshots))) if allErrors.IsEmpty() { return &common.Response{Snapshots: snapshots, RootCollectionID: rootCollectionID}, nil diff --git a/core/block/import/txt/converter_test.go b/core/block/import/txt/converter_test.go index 4929647e6..10deca90e 100644 --- a/core/block/import/txt/converter_test.go +++ b/core/block/import/txt/converter_test.go @@ -31,7 +31,7 @@ func TestTXT_GetSnapshots(t *testing.T) { assert.NotNil(t, err) assert.True(t, errors.Is(err.GetResultError(model.Import_Txt), common.ErrFileImportNoObjectsInDirectory)) assert.NotNil(t, sn) - assert.Len(t, sn.Snapshots, 3) + assert.Len(t, sn.Snapshots, 2) assert.Contains(t, sn.Snapshots[0].FileName, "test.txt") assert.Equal(t, sn.Snapshots[0].Snapshot.Data.Details.GetString("name"), "test") @@ -39,10 +39,6 @@ func TestTXT_GetSnapshots(t *testing.T) { assert.NotEmpty(t, sn.Snapshots[1].Snapshot.Data.ObjectTypes) assert.Equal(t, sn.Snapshots[1].Snapshot.Data.ObjectTypes[0], bundle.TypeKeyCollection.String()) - assert.Len(t, sn.Snapshots[2].Snapshot.Data.Blocks, 3) - assert.NotNil(t, sn.Snapshots[2].Snapshot.Data.Blocks[1].GetWidget()) - assert.NotNil(t, sn.Snapshots[2].Snapshot.Data.Blocks[2].GetLink()) - assert.Equal(t, sn.Snapshots[1].Id, sn.Snapshots[2].Snapshot.Data.Blocks[2].GetLink().GetTargetBlockId()) var ( found bool text string From 48498427cb0eabaea5b8431fe2afaaaa4aa441fb Mon Sep 17 00:00:00 2001 From: Anastasia Shemyakinskaya <36507473+anastasiashemyakinskaya@users.noreply.github.com> Date: Mon, 31 Mar 2025 11:09:59 +0200 Subject: [PATCH 115/132] GO-5365: return joinSpace param Signed-off-by: AnastasiaShemyakinskaya --- core/publish.go | 2 +- core/publish/service.go | 49 +- core/publish/service_test.go | 29 +- docs/proto.md | 2 +- pb/commands.pb.go | 2713 +++++++++++++++++----------------- pb/protos/commands.proto | 2 +- 6 files changed, 1401 insertions(+), 1396 deletions(-) diff --git a/core/publish.go b/core/publish.go index 97184d531..e5863df81 100644 --- a/core/publish.go +++ b/core/publish.go @@ -9,7 +9,7 @@ import ( func (mw *Middleware) PublishingCreate(ctx context.Context, req *pb.RpcPublishingCreateRequest) *pb.RpcPublishingCreateResponse { publishService := mustService[publish.Service](mw) - res, err := publishService.Publish(ctx, req.SpaceId, req.ObjectId, req.Uri, req.IncludeSpaceInfo) + res, err := publishService.Publish(ctx, req.SpaceId, req.ObjectId, req.Uri, req.JoinSpace) code := mapErrorCode(err, errToCode(nil, pb.RpcPublishingCreateResponseError_NULL), errToCode(publish.ErrLimitExceeded, pb.RpcPublishingCreateResponseError_LIMIT_EXCEEDED), diff --git a/core/publish/service.go b/core/publish/service.go index 25f03bfff..2b2d1c441 100644 --- a/core/publish/service.go +++ b/core/publish/service.go @@ -154,8 +154,13 @@ func (s *service) exportToDir(ctx context.Context, spaceId, pageId string, inclu return } -func (s *service) publishToPublishServer(ctx context.Context, spaceId, pageId, uri, globalName string, includeSpaceInfo bool) (err error) { - dirEntries, exportPath, err := s.exportToDir(ctx, spaceId, pageId, includeSpaceInfo) +func (s *service) publishToPublishServer(ctx context.Context, spaceId, pageId, uri, globalName string, joinSpace bool) (err error) { + spc, err := s.spaceService.Get(ctx, spaceId) + if err != nil { + return err + } + includeInviteLinkAndSpaceInfo := joinSpace && !spc.IsPersonal() + dirEntries, exportPath, err := s.exportToDir(ctx, spaceId, pageId, includeInviteLinkAndSpaceInfo) if err != nil { return err } @@ -177,12 +182,7 @@ func (s *service) publishToPublishServer(ctx context.Context, spaceId, pageId, u return err } - spc, err := s.spaceService.Get(ctx, spaceId) - if err != nil { - return err - } - - err = s.applyInviteLink(ctx, spc, &uberSnapshot, includeSpaceInfo) + err = s.applyInviteLink(ctx, spaceId, &uberSnapshot, includeInviteLinkAndSpaceInfo) if err != nil { return err } @@ -190,7 +190,7 @@ func (s *service) publishToPublishServer(ctx context.Context, spaceId, pageId, u return err } - version, err := s.evaluateDocumentVersion(ctx, spc, pageId, includeSpaceInfo) + version, err := s.evaluateDocumentVersion(ctx, spc, pageId, joinSpace) if err != nil { return err } @@ -210,12 +210,18 @@ func (s *service) publishToPublishServer(ctx context.Context, spaceId, pageId, u return nil } -func (s *service) applyInviteLink(ctx context.Context, spc clientspace.Space, snapshot *PublishingUberSnapshot, includeSpaceInfo bool) error { - inviteLink, err := s.extractInviteLink(ctx, spc.Id(), includeSpaceInfo, spc.IsPersonal()) +func (s *service) applyInviteLink(ctx context.Context, spaceId string, snapshot *PublishingUberSnapshot, includeInviteLink bool) error { + if !includeInviteLink { + return nil + } + inviteInfo, err := s.inviteService.GetCurrent(ctx, spaceId) + if err != nil && errors.Is(err, inviteservice.ErrInviteNotExists) { + return nil + } if err != nil { return err } - snapshot.Meta.InviteLink = inviteLink + snapshot.Meta.InviteLink = fmt.Sprintf(inviteLinkUrlTemplate, inviteInfo.InviteFileCid, inviteInfo.InviteFileKey) return nil } @@ -366,21 +372,6 @@ func (s *service) publishToServer(ctx context.Context, spaceId, pageId, uri, ver return nil } -func (s *service) extractInviteLink(ctx context.Context, spaceId string, joinSpace, isPersonal bool) (string, error) { - var inviteLink string - if joinSpace && !isPersonal { - inviteInfo, err := s.inviteService.GetCurrent(ctx, spaceId) - if err != nil && errors.Is(err, inviteservice.ErrInviteNotExists) { - return "", nil - } - if err != nil { - return "", err - } - inviteLink = fmt.Sprintf(inviteLinkUrlTemplate, inviteInfo.InviteFileCid, inviteInfo.InviteFileKey) - } - return inviteLink, nil -} - func (s *service) evaluateDocumentVersion(ctx context.Context, spc clientspace.Space, pageId string, joinSpace bool) (string, error) { treeStorage, err := spc.Storage().TreeStorage(ctx, pageId) if err != nil { @@ -406,11 +397,11 @@ func (s *service) getPublishLimit(globalName string) (int64, error) { return defaultLimit, nil } -func (s *service) Publish(ctx context.Context, spaceId, pageId, uri string, includeSpaceInfo bool) (res PublishResult, err error) { +func (s *service) Publish(ctx context.Context, spaceId, pageId, uri string, joinSpace bool) (res PublishResult, err error) { identity, _, details := s.identityService.GetMyProfileDetails(ctx) globalName := details.GetString(bundle.RelationKeyGlobalName) - err = s.publishToPublishServer(ctx, spaceId, pageId, uri, globalName, includeSpaceInfo) + err = s.publishToPublishServer(ctx, spaceId, pageId, uri, globalName, joinSpace) if err != nil { log.Error("Failed to publish", zap.Error(err)) diff --git a/core/publish/service_test.go b/core/publish/service_test.go index 2b063eee9..6f12dcfec 100644 --- a/core/publish/service_test.go +++ b/core/publish/service_test.go @@ -161,7 +161,7 @@ func TestPublish(t *testing.T) { identityService := mock_identity.NewMockService(t) identityService.EXPECT().GetMyProfileDetails(context.Background()).Return("identity", nil, domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{})) - exp := prepareExporter(t, objectTypeId, spaceService, includeSpaceInfo) + exp := prepareExporter(t, objectTypeId, spaceService, false) svc := &service{ spaceService: spaceService, @@ -372,7 +372,7 @@ func TestPublish(t *testing.T) { expectedErr: fmt.Errorf("internal error"), } - exp := prepareExporter(t, objectTypeId, spaceService, includeSpaceInfo) + exp := prepareExporter(t, objectTypeId, spaceService, false) svc := &service{ spaceService: spaceService, @@ -394,7 +394,14 @@ func TestPublish(t *testing.T) { }) t.Run("limit error for members", func(t *testing.T) { // given + isPersonal := false + includeSpaceInfo := true + spaceService := mock_space.NewMockService(t) + space := mock_clientspace.NewMockSpace(t) + space.EXPECT().DerivedIDs().Return(threads.DerivedSmartblockIds{Workspace: workspaceId}) + space.EXPECT().IsPersonal().Return(isPersonal) + spaceService.EXPECT().Get(context.Background(), spaceId).Return(space, nil) expectedUri := "test" testFile := "test" @@ -424,7 +431,7 @@ func TestPublish(t *testing.T) { } // when - publish, err := svc.Publish(context.Background(), spaceId, objectId, expectedUri, true) + publish, err := svc.Publish(context.Background(), spaceId, objectId, expectedUri, includeSpaceInfo) // then assert.Error(t, err) @@ -433,7 +440,14 @@ func TestPublish(t *testing.T) { }) t.Run("default limit error", func(t *testing.T) { // given + isPersonal := false + includeSpaceInfo := true + spaceService := mock_space.NewMockService(t) + space := mock_clientspace.NewMockSpace(t) + space.EXPECT().DerivedIDs().Return(threads.DerivedSmartblockIds{Workspace: workspaceId}) + space.EXPECT().IsPersonal().Return(isPersonal) + spaceService.EXPECT().Get(context.Background(), spaceId).Return(space, nil) expectedUri := "test" testFile := "test" @@ -460,7 +474,7 @@ func TestPublish(t *testing.T) { } // when - publish, err := svc.Publish(context.Background(), spaceId, objectId, expectedUri, true) + publish, err := svc.Publish(context.Background(), spaceId, objectId, expectedUri, includeSpaceInfo) // then assert.Error(t, err) @@ -679,17 +693,18 @@ func prepareSpaceService(t *testing.T, isPersonal bool, includeSpaceInfo bool) ( spaceService := mock_space.NewMockService(t) space := mock_clientspace.NewMockSpace(t) ctrl := gomock.NewController(t) - space.EXPECT().IsPersonal().Return(isPersonal) - space.EXPECT().Id().Return(spaceId) st := mock_anystorage.NewMockClientSpaceStorage(t) mockSt := mock_objecttree.NewMockStorage(ctrl) st.EXPECT().TreeStorage(mock.Anything, mock.Anything).Return(mockSt, nil) mockSt.EXPECT().Heads(gomock.Any()).Return([]string{"heads"}, nil) space.EXPECT().Storage().Return(st) - if includeSpaceInfo { + if includeSpaceInfo && !isPersonal { space.EXPECT().DerivedIDs().Return(threads.DerivedSmartblockIds{Workspace: workspaceId}) } + if includeSpaceInfo { + space.EXPECT().IsPersonal().Return(isPersonal) + } spaceService.EXPECT().Get(context.Background(), spaceId).Return(space, nil) return spaceService, nil } diff --git a/docs/proto.md b/docs/proto.md index cdfd5cade..ee2bff86f 100644 --- a/docs/proto.md +++ b/docs/proto.md @@ -19049,7 +19049,7 @@ Available undo/redo operations | spaceId | [string](#string) | | | | objectId | [string](#string) | | | | uri | [string](#string) | | | -| includeSpaceInfo | [bool](#bool) | | | +| joinSpace | [bool](#bool) | | | diff --git a/pb/commands.pb.go b/pb/commands.pb.go index 0cc49b22a..8a508f9c7 100644 --- a/pb/commands.pb.go +++ b/pb/commands.pb.go @@ -20410,10 +20410,10 @@ func (m *RpcPublishingCreate) XXX_DiscardUnknown() { var xxx_messageInfo_RpcPublishingCreate proto.InternalMessageInfo type RpcPublishingCreateRequest struct { - SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` - ObjectId string `protobuf:"bytes,2,opt,name=objectId,proto3" json:"objectId,omitempty"` - Uri string `protobuf:"bytes,3,opt,name=uri,proto3" json:"uri,omitempty"` - IncludeSpaceInfo bool `protobuf:"varint,4,opt,name=includeSpaceInfo,proto3" json:"includeSpaceInfo,omitempty"` + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + ObjectId string `protobuf:"bytes,2,opt,name=objectId,proto3" json:"objectId,omitempty"` + Uri string `protobuf:"bytes,3,opt,name=uri,proto3" json:"uri,omitempty"` + JoinSpace bool `protobuf:"varint,4,opt,name=joinSpace,proto3" json:"joinSpace,omitempty"` } func (m *RpcPublishingCreateRequest) Reset() { *m = RpcPublishingCreateRequest{} } @@ -20470,9 +20470,9 @@ func (m *RpcPublishingCreateRequest) GetUri() string { return "" } -func (m *RpcPublishingCreateRequest) GetIncludeSpaceInfo() bool { +func (m *RpcPublishingCreateRequest) GetJoinSpace() bool { if m != nil { - return m.IncludeSpaceInfo + return m.JoinSpace } return false } @@ -76308,1352 +76308,1351 @@ func init() { func init() { proto.RegisterFile("pb/protos/commands.proto", fileDescriptor_8261c968b2e6f45c) } var fileDescriptor_8261c968b2e6f45c = []byte{ - // 21513 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7b, 0x9c, 0x24, 0x49, - 0x59, 0x37, 0x8a, 0x4f, 0x65, 0x56, 0x55, 0x77, 0x47, 0x5f, 0x26, 0x27, 0x77, 0x76, 0x98, 0x4d, - 0x96, 0xd9, 0x75, 0x76, 0x59, 0xd6, 0x65, 0xe9, 0x5d, 0x16, 0x44, 0x76, 0xd9, 0x65, 0xa9, 0xae, - 0xca, 0xee, 0xae, 0xdd, 0xea, 0xaa, 0x26, 0xab, 0x7a, 0x86, 0xf1, 0x7d, 0xfd, 0xb5, 0x39, 0x55, - 0xd1, 0xdd, 0xb9, 0x53, 0x9d, 0x59, 0x64, 0x66, 0xcf, 0x6c, 0xf3, 0xfb, 0x78, 0x5e, 0x11, 0x57, - 0x40, 0x44, 0x44, 0x45, 0x45, 0xe4, 0xb6, 0x08, 0x08, 0xc8, 0xfd, 0xf6, 0x82, 0x02, 0xca, 0x45, - 0x10, 0x11, 0x51, 0xbc, 0x00, 0xca, 0x11, 0xef, 0xf8, 0x1e, 0x3d, 0xbe, 0x78, 0x14, 0x44, 0x45, - 0xcf, 0x27, 0x2e, 0x99, 0x19, 0x51, 0x5d, 0x99, 0x15, 0x59, 0x5d, 0x59, 0xbd, 0xe8, 0xf9, 0xab, - 0x2a, 0x23, 0x23, 0x9f, 0x78, 0xe2, 0xf9, 0x3e, 0x11, 0xf1, 0x44, 0xc4, 0x13, 0x4f, 0x80, 0xd3, - 0xbd, 0x8b, 0xb7, 0xf5, 0x5c, 0xc7, 0x77, 0xbc, 0xdb, 0xda, 0xce, 0xee, 0xae, 0x69, 0x77, 0xbc, - 0x45, 0xfc, 0xac, 0x4e, 0x99, 0xf6, 0xbe, 0xbf, 0xdf, 0x83, 0xda, 0x8d, 0xbd, 0x4b, 0xdb, 0xb7, - 0x75, 0xad, 0x8b, 0xb7, 0xf5, 0x2e, 0xde, 0xb6, 0xeb, 0x74, 0x60, 0x37, 0xf8, 0x00, 0x3f, 0xd0, - 0xec, 0xda, 0xcd, 0x71, 0xb9, 0xba, 0x4e, 0xdb, 0xec, 0x7a, 0xbe, 0xe3, 0x42, 0x9a, 0xf3, 0x54, - 0x54, 0x24, 0xbc, 0x0c, 0x6d, 0x3f, 0xa0, 0x70, 0xed, 0xb6, 0xe3, 0x6c, 0x77, 0x21, 0x79, 0x77, - 0x71, 0x6f, 0xeb, 0x36, 0xcf, 0x77, 0xf7, 0xda, 0x3e, 0x7d, 0x7b, 0x7d, 0xff, 0xdb, 0x0e, 0xf4, - 0xda, 0xae, 0xd5, 0xf3, 0x1d, 0x97, 0xe4, 0x38, 0xfb, 0xb5, 0xdf, 0x9b, 0x06, 0xb2, 0xd1, 0x6b, - 0x6b, 0x5f, 0x9f, 0x02, 0x72, 0xa9, 0xd7, 0xd3, 0x3e, 0x21, 0x01, 0xb0, 0x02, 0xfd, 0x73, 0xd0, - 0xf5, 0x2c, 0xc7, 0xd6, 0x8e, 0x83, 0x29, 0x03, 0x3e, 0x7b, 0x0f, 0x7a, 0xfe, 0x5d, 0xf9, 0x17, - 0xfc, 0x95, 0x9c, 0xd3, 0x5e, 0x2f, 0x81, 0x69, 0x03, 0x7a, 0x3d, 0xc7, 0xf6, 0xa0, 0xfa, 0x0c, - 0x50, 0x80, 0xae, 0xeb, 0xb8, 0xa7, 0x73, 0xd7, 0xe7, 0x6e, 0x9e, 0xbd, 0xe3, 0x96, 0x45, 0x5a, - 0xfd, 0x45, 0xa3, 0xd7, 0x5e, 0x2c, 0xf5, 0x7a, 0x8b, 0x11, 0xa5, 0xc5, 0xe0, 0xa3, 0x45, 0x1d, - 0x7d, 0x61, 0x90, 0x0f, 0xd5, 0xd3, 0x60, 0xea, 0x32, 0xc9, 0x70, 0x5a, 0xba, 0x3e, 0x77, 0xf3, - 0x8c, 0x11, 0x3c, 0xa2, 0x37, 0x1d, 0xe8, 0x9b, 0x56, 0xd7, 0x3b, 0x2d, 0x93, 0x37, 0xf4, 0x51, - 0x7b, 0x38, 0x07, 0x0a, 0x98, 0x88, 0x5a, 0x06, 0xf9, 0xb6, 0xd3, 0x81, 0xb8, 0xf8, 0x85, 0x3b, - 0x6e, 0x13, 0x2f, 0x7e, 0xb1, 0xec, 0x74, 0xa0, 0x81, 0x3f, 0x56, 0xaf, 0x07, 0xb3, 0x81, 0x58, - 0x22, 0x36, 0xd8, 0xa4, 0xb3, 0x77, 0x80, 0x3c, 0xca, 0xaf, 0x4e, 0x83, 0x7c, 0x7d, 0xa3, 0x56, - 0x53, 0x8e, 0xa9, 0x27, 0xc0, 0xfc, 0x46, 0xfd, 0xfe, 0x7a, 0xe3, 0x7c, 0x7d, 0x53, 0x37, 0x8c, - 0x86, 0xa1, 0xe4, 0xd4, 0x79, 0x30, 0xb3, 0x54, 0xaa, 0x6c, 0x56, 0xeb, 0xeb, 0x1b, 0x2d, 0x45, - 0xd2, 0x5e, 0x25, 0x83, 0x85, 0x26, 0xf4, 0x2b, 0xf0, 0xb2, 0xd5, 0x86, 0x4d, 0xdf, 0xf4, 0xa1, - 0xf6, 0x92, 0x5c, 0x28, 0x4c, 0x75, 0x03, 0x15, 0x1a, 0xbe, 0xa2, 0x15, 0x78, 0xd2, 0x81, 0x0a, - 0xf0, 0x14, 0x16, 0xe9, 0xd7, 0x8b, 0x4c, 0x9a, 0xc1, 0xd2, 0x39, 0xfb, 0x04, 0x30, 0xcb, 0xbc, - 0x53, 0x17, 0x00, 0x58, 0x2a, 0x95, 0xef, 0x5f, 0x31, 0x1a, 0x1b, 0xf5, 0x8a, 0x72, 0x0c, 0x3d, - 0x2f, 0x37, 0x0c, 0x9d, 0x3e, 0xe7, 0xb4, 0x6f, 0xe6, 0x18, 0x30, 0x2b, 0x3c, 0x98, 0x8b, 0xc3, - 0x99, 0x19, 0x00, 0xa8, 0xf6, 0x86, 0x10, 0x9c, 0x15, 0x0e, 0x9c, 0x27, 0xa5, 0x23, 0x97, 0x3d, - 0x40, 0x0f, 0x49, 0x60, 0xba, 0xb9, 0xb3, 0xe7, 0x77, 0x9c, 0x2b, 0xb6, 0x36, 0x13, 0x22, 0xa3, - 0xfd, 0x1d, 0x2b, 0x93, 0xa7, 0xf3, 0x32, 0xb9, 0xf9, 0x60, 0x25, 0x28, 0x85, 0x18, 0x69, 0xbc, - 0x26, 0x94, 0x46, 0x89, 0x93, 0xc6, 0x13, 0x44, 0x09, 0x65, 0x2f, 0x87, 0x2f, 0xdc, 0x0d, 0x0a, - 0xcd, 0x9e, 0xd9, 0x86, 0xda, 0x67, 0x64, 0x30, 0x57, 0x83, 0xe6, 0x65, 0x58, 0xea, 0xf5, 0x5c, - 0xe7, 0x32, 0xd4, 0xca, 0x91, 0xbe, 0x9e, 0x06, 0x53, 0x1e, 0xca, 0x54, 0xed, 0xe0, 0x1a, 0xcc, - 0x18, 0xc1, 0xa3, 0x7a, 0x06, 0x00, 0xab, 0x03, 0x6d, 0xdf, 0xf2, 0x2d, 0xe8, 0x9d, 0x96, 0xae, - 0x97, 0x6f, 0x9e, 0x31, 0x98, 0x14, 0xed, 0xeb, 0x92, 0xa8, 0x8e, 0x61, 0x2e, 0x16, 0x59, 0x0e, - 0x62, 0xa4, 0xfa, 0x3a, 0x49, 0x44, 0xc7, 0x86, 0x92, 0x4b, 0x27, 0xdb, 0xb7, 0xe5, 0xd2, 0x0b, - 0x17, 0xe5, 0xa8, 0x37, 0x36, 0x9b, 0x1b, 0xe5, 0xd5, 0xcd, 0xe6, 0x7a, 0xa9, 0xac, 0x2b, 0x50, - 0x3d, 0x09, 0x14, 0xfc, 0x77, 0xb3, 0xda, 0xdc, 0xac, 0xe8, 0x35, 0xbd, 0xa5, 0x57, 0x94, 0x2d, - 0x55, 0x05, 0x0b, 0x86, 0xfe, 0xcc, 0x0d, 0xbd, 0xd9, 0xda, 0x5c, 0x2e, 0x55, 0x6b, 0x7a, 0x45, - 0xd9, 0x46, 0x1f, 0xd7, 0xaa, 0x6b, 0xd5, 0xd6, 0xa6, 0xa1, 0x97, 0xca, 0xab, 0x7a, 0x45, 0xd9, - 0x51, 0x1f, 0x05, 0xae, 0xaa, 0x37, 0x36, 0x4b, 0xeb, 0xeb, 0x46, 0xe3, 0x9c, 0xbe, 0x49, 0xbf, - 0x68, 0x2a, 0x16, 0x29, 0xa8, 0xb5, 0xd9, 0x5c, 0x2d, 0x19, 0x7a, 0x69, 0xa9, 0xa6, 0x2b, 0x0f, - 0x68, 0xcf, 0x93, 0xc1, 0xfc, 0x9a, 0x79, 0x09, 0x36, 0x77, 0x4c, 0x17, 0x9a, 0x17, 0xbb, 0x50, - 0xbb, 0x41, 0x00, 0x4f, 0xed, 0x33, 0x2c, 0x5e, 0x3a, 0x8f, 0xd7, 0x6d, 0x03, 0x04, 0xcc, 0x15, - 0x11, 0x03, 0xd8, 0x3f, 0x87, 0xcd, 0x60, 0x95, 0x03, 0xec, 0xc9, 0x29, 0xe9, 0xa5, 0x43, 0xec, - 0x07, 0x1f, 0x01, 0x88, 0x69, 0x5f, 0xcc, 0x83, 0x85, 0xaa, 0x7d, 0xd9, 0xf2, 0xe1, 0x0a, 0xb4, - 0xa1, 0x8b, 0xc6, 0x81, 0x57, 0xe5, 0x44, 0xda, 0x55, 0x0b, 0x00, 0x0b, 0x7f, 0xd7, 0xda, 0xef, - 0x41, 0x5c, 0xbd, 0xc1, 0xf2, 0xe2, 0x89, 0x87, 0x43, 0x44, 0x35, 0xfc, 0xd6, 0x60, 0xe8, 0x9c, - 0xbd, 0x01, 0x80, 0xe8, 0x8d, 0x0a, 0x40, 0x71, 0x0d, 0xee, 0x5e, 0x84, 0xae, 0x72, 0x4c, 0x9d, - 0x01, 0x85, 0x15, 0xf4, 0xa5, 0x92, 0xd3, 0x5e, 0x2f, 0x33, 0x2a, 0xb0, 0xcc, 0xab, 0xc0, 0xed, - 0x22, 0x2c, 0x0c, 0x1a, 0xe9, 0xaf, 0x05, 0x33, 0x84, 0x8f, 0xb2, 0xd5, 0xa1, 0x68, 0x45, 0x09, - 0xea, 0x8d, 0x60, 0x9e, 0x3c, 0x2c, 0x5b, 0x5d, 0x78, 0x3f, 0xdc, 0xa7, 0x63, 0x3e, 0x9f, 0xa8, - 0xfd, 0x68, 0xd8, 0xf0, 0xab, 0x9c, 0x1e, 0x7d, 0x57, 0x5a, 0xa6, 0xd2, 0x29, 0xd2, 0xcb, 0x1e, - 0x09, 0x4d, 0xff, 0x40, 0x0b, 0xb7, 0xb4, 0x6f, 0x49, 0x60, 0xb6, 0xe9, 0x3b, 0x3d, 0xd4, 0x5c, - 0x2c, 0x7b, 0x5b, 0xac, 0x7d, 0x7f, 0x8a, 0x6d, 0xdf, 0x65, 0x1e, 0xdc, 0x27, 0x0c, 0x90, 0x23, - 0x53, 0x40, 0x4c, 0xeb, 0xfe, 0x7a, 0xd8, 0xba, 0x97, 0x39, 0x54, 0xee, 0x48, 0x45, 0xed, 0xdb, - 0xb0, 0x6d, 0xbf, 0x4c, 0x06, 0x4a, 0xa0, 0x66, 0x7e, 0x79, 0xcf, 0x75, 0xa1, 0xed, 0x8b, 0x81, - 0xf0, 0x47, 0x2c, 0x08, 0xab, 0x3c, 0x08, 0x77, 0x24, 0x28, 0x73, 0x50, 0x4a, 0x86, 0x6d, 0xec, - 0x57, 0x43, 0x34, 0xef, 0xe7, 0xd0, 0xfc, 0xee, 0xf4, 0x6c, 0xa5, 0x83, 0x74, 0x75, 0x04, 0x44, - 0x4f, 0x02, 0x05, 0x8d, 0x87, 0xe5, 0x56, 0xf5, 0x9c, 0xbe, 0x59, 0xad, 0x9f, 0xab, 0xb6, 0x74, - 0x05, 0x6a, 0x2f, 0x95, 0xa3, 0x3e, 0xd7, 0xc7, 0x9d, 0x9a, 0x18, 0x2a, 0x5f, 0x94, 0x46, 0xeb, - 0xf7, 0x48, 0x19, 0x13, 0xc1, 0x44, 0xbc, 0xdf, 0x1b, 0xc8, 0x54, 0x3a, 0x44, 0xee, 0x1b, 0x01, - 0x91, 0x53, 0x40, 0xad, 0xd6, 0xcf, 0x95, 0x6a, 0xd5, 0x0a, 0x69, 0x63, 0x9b, 0xad, 0x0b, 0xeb, - 0x08, 0x93, 0x9f, 0x94, 0xc1, 0x1c, 0x61, 0xcd, 0x80, 0x97, 0x9d, 0x4b, 0x82, 0xc6, 0xc8, 0x97, - 0x53, 0x1a, 0x8f, 0x6c, 0x09, 0x31, 0xbd, 0xd5, 0x8f, 0xa4, 0x30, 0x1e, 0x13, 0xc8, 0x3d, 0x92, - 0x46, 0x90, 0x03, 0x5d, 0xd3, 0xf6, 0x80, 0x1e, 0x6c, 0xe0, 0x08, 0xf2, 0xb1, 0x7c, 0x60, 0x0f, - 0x9c, 0xb3, 0xe0, 0x15, 0x6d, 0x2d, 0xc2, 0x84, 0x53, 0xdb, 0xdc, 0x50, 0xb5, 0x95, 0x06, 0xa9, - 0xed, 0x5f, 0xb2, 0x76, 0xc4, 0x12, 0x8f, 0xde, 0xad, 0xb1, 0xe2, 0x46, 0x9c, 0xc4, 0xaf, 0x16, - 0x04, 0x8a, 0x22, 0xf1, 0xd6, 0xd2, 0xb5, 0x60, 0x06, 0xff, 0xad, 0x9b, 0xbb, 0x90, 0xb6, 0xa1, - 0x28, 0x41, 0x3d, 0x0b, 0xe6, 0x48, 0xc6, 0xb6, 0x63, 0xa3, 0xfa, 0xe4, 0x71, 0x06, 0x2e, 0x0d, - 0x81, 0xd8, 0x76, 0xa1, 0xe9, 0x3b, 0x2e, 0xa6, 0x51, 0x20, 0x20, 0x32, 0x49, 0xea, 0xad, 0xe0, - 0x84, 0xe5, 0xe1, 0x56, 0xb5, 0xe1, 0x41, 0x97, 0x30, 0x7b, 0xba, 0x78, 0x7d, 0xee, 0xe6, 0x69, - 0xe3, 0xe0, 0x0b, 0xed, 0xab, 0x61, 0x9b, 0xd5, 0x39, 0x3d, 0x7b, 0x62, 0x9a, 0x8a, 0xa7, 0xd3, - 0xb2, 0xcb, 0xa3, 0xf5, 0xa0, 0xa4, 0xdf, 0xdc, 0x44, 0xba, 0xb1, 0x8c, 0x17, 0x06, 0x20, 0x6d, - 0xc5, 0x28, 0x15, 0xe5, 0x2d, 0x37, 0xea, 0x2d, 0xbd, 0xde, 0x52, 0xb6, 0x06, 0xea, 0xdf, 0xb6, - 0xf6, 0xba, 0x3c, 0xc8, 0xdf, 0xe7, 0x58, 0xb6, 0xf6, 0x50, 0x8e, 0x53, 0x20, 0x1b, 0xfa, 0x57, - 0x1c, 0xf7, 0x52, 0xd8, 0xac, 0xa3, 0x84, 0x64, 0x24, 0x23, 0xc5, 0x93, 0x87, 0x2a, 0x5e, 0x7e, - 0x90, 0xe2, 0xfd, 0x04, 0xab, 0x78, 0x77, 0xf3, 0x8a, 0x77, 0xd3, 0x00, 0xf9, 0x23, 0xe6, 0x63, - 0xba, 0x8b, 0x4f, 0x86, 0xdd, 0xc5, 0xbd, 0x1c, 0x8c, 0x8f, 0x17, 0x23, 0x93, 0x0e, 0xc0, 0x2f, - 0x65, 0xda, 0x4d, 0x0c, 0x82, 0x7a, 0x3b, 0x06, 0xea, 0x9d, 0x01, 0x3d, 0x88, 0x75, 0xb0, 0xa3, - 0x79, 0xe0, 0x60, 0xa7, 0x72, 0x49, 0xbd, 0x1a, 0x9c, 0xa8, 0x54, 0x97, 0x97, 0x75, 0x43, 0xaf, - 0xb7, 0x36, 0xeb, 0x7a, 0xeb, 0x7c, 0xc3, 0xb8, 0x5f, 0xe9, 0x6a, 0x0f, 0xcb, 0x00, 0x20, 0x09, - 0x95, 0x4d, 0xbb, 0x0d, 0xbb, 0x62, 0xfd, 0xff, 0xff, 0x2d, 0xa5, 0xeb, 0x41, 0x22, 0xfa, 0x31, - 0x70, 0xbe, 0x52, 0x12, 0x6f, 0x95, 0xb1, 0xc4, 0xd2, 0x81, 0xfa, 0xe6, 0x47, 0xc2, 0xec, 0xe1, - 0x2a, 0x70, 0x3c, 0xa0, 0x47, 0xb3, 0x0f, 0x5e, 0x34, 0x78, 0x7b, 0x1e, 0x2c, 0x50, 0x58, 0x82, - 0x55, 0xa0, 0x17, 0x08, 0x4d, 0x57, 0x35, 0x30, 0x4d, 0x17, 0x7d, 0x82, 0xc1, 0x20, 0x7c, 0x56, - 0x57, 0xc0, 0x6c, 0x0f, 0xba, 0xbb, 0x96, 0xe7, 0x59, 0x8e, 0x4d, 0x96, 0x73, 0x17, 0xee, 0x78, - 0x6c, 0x28, 0x71, 0xbc, 0xf2, 0xbd, 0xb8, 0x6e, 0xba, 0xbe, 0xd5, 0xb6, 0x7a, 0xa6, 0xed, 0xaf, - 0x47, 0x99, 0x0d, 0xf6, 0x4b, 0x64, 0xd8, 0xa5, 0x32, 0xd0, 0xf8, 0x9a, 0xc4, 0xa8, 0xc4, 0xaf, - 0xa4, 0x98, 0x54, 0x26, 0x12, 0x4c, 0xa7, 0x16, 0x9f, 0xc8, 0x54, 0x2d, 0x06, 0xe0, 0xbd, 0xad, - 0x5e, 0x03, 0xae, 0xae, 0xd6, 0xcb, 0x0d, 0xc3, 0xd0, 0xcb, 0xad, 0xcd, 0x75, 0xdd, 0x58, 0xab, - 0x36, 0x9b, 0xd5, 0x46, 0xbd, 0x79, 0x98, 0xd6, 0xae, 0x7d, 0x5a, 0x0e, 0x35, 0xa6, 0x02, 0xdb, - 0x5d, 0xcb, 0x86, 0xda, 0xbd, 0x87, 0x54, 0x18, 0x7e, 0xcd, 0x50, 0x1c, 0x67, 0x5a, 0x7e, 0x0c, - 0xce, 0xaf, 0x4d, 0x8f, 0xf3, 0x60, 0x82, 0xff, 0x89, 0x9b, 0xff, 0x97, 0x65, 0x70, 0x82, 0x69, - 0x88, 0x06, 0xdc, 0x1d, 0xdb, 0x3a, 0xf0, 0x0f, 0xb2, 0x6d, 0xb7, 0xca, 0x63, 0x3a, 0xc8, 0xf6, - 0x3e, 0xc0, 0x46, 0x0c, 0xac, 0x6f, 0x0e, 0x61, 0xad, 0x71, 0xb0, 0x3e, 0x75, 0x04, 0x9a, 0xe9, - 0x90, 0x7d, 0x47, 0xa6, 0xc8, 0x5e, 0x03, 0xae, 0x5e, 0x2f, 0x19, 0xad, 0x6a, 0xb9, 0xba, 0x5e, - 0x42, 0xe3, 0x28, 0x33, 0x64, 0xc7, 0x18, 0xf7, 0x3c, 0xe8, 0x03, 0xf1, 0xfd, 0x48, 0x1e, 0x5c, - 0x3b, 0xb8, 0xa3, 0x2d, 0xef, 0x98, 0xf6, 0x36, 0xd4, 0x2c, 0x11, 0xa8, 0x2b, 0x60, 0xaa, 0x8d, - 0xb3, 0x13, 0x9c, 0xd9, 0x8d, 0xbf, 0x84, 0xbe, 0x9c, 0x94, 0x60, 0x04, 0x9f, 0x6a, 0xef, 0x66, - 0x15, 0xa2, 0xc5, 0x2b, 0xc4, 0xd3, 0x93, 0xc1, 0x3b, 0xc0, 0x77, 0x8c, 0x6e, 0x7c, 0x2e, 0xd4, - 0x8d, 0xf3, 0x9c, 0x6e, 0x94, 0x0f, 0x47, 0x3e, 0x9d, 0x9a, 0xfc, 0xe6, 0x23, 0xa1, 0x03, 0x88, - 0xd5, 0x26, 0x2b, 0x7e, 0x54, 0x18, 0xd8, 0xdd, 0xbf, 0x5a, 0x06, 0xc5, 0x0a, 0xec, 0x42, 0x5f, - 0x70, 0x06, 0xff, 0xf7, 0x92, 0xe8, 0x76, 0x1a, 0x81, 0x81, 0xd0, 0x8e, 0x5f, 0x4b, 0xf1, 0xad, - 0x5d, 0xe8, 0xf9, 0xe6, 0x6e, 0x0f, 0x8b, 0x5a, 0x36, 0xa2, 0x04, 0xed, 0x87, 0x24, 0x91, 0xcd, - 0xb6, 0x84, 0x62, 0xfe, 0x73, 0xac, 0x0a, 0x7f, 0x5e, 0x02, 0xd3, 0x4d, 0xe8, 0x37, 0xdc, 0x0e, - 0x74, 0xb5, 0x66, 0x84, 0xd1, 0xf5, 0x60, 0x16, 0x83, 0x82, 0xa6, 0x99, 0x21, 0x4e, 0x6c, 0x92, - 0x7a, 0x13, 0x58, 0x08, 0x1f, 0xf1, 0xe7, 0xb4, 0x1b, 0xef, 0x4b, 0xd5, 0xbe, 0x96, 0x13, 0xf5, - 0x01, 0xa0, 0x8b, 0xbe, 0x94, 0x9b, 0x98, 0x56, 0x2a, 0xb6, 0x9f, 0x9f, 0x48, 0x2a, 0xfb, 0x6d, - 0xd2, 0x77, 0x4a, 0x00, 0x6c, 0xd8, 0x5e, 0x20, 0xd7, 0xc7, 0xa7, 0x90, 0xab, 0xf6, 0x4f, 0xb9, - 0x74, 0xb3, 0x98, 0xa8, 0x9c, 0x18, 0x89, 0xfd, 0x42, 0x8a, 0xb5, 0x85, 0x58, 0x62, 0x13, 0xd8, - 0x5a, 0x3e, 0x0e, 0x8a, 0xe7, 0xcd, 0x6e, 0x17, 0xfa, 0xda, 0xab, 0x64, 0x50, 0x2c, 0xbb, 0xd0, - 0xf4, 0xa1, 0x06, 0x23, 0xd1, 0x69, 0x60, 0xda, 0x75, 0x1c, 0x7f, 0xdd, 0xf4, 0x77, 0xa8, 0xdc, - 0xc2, 0x67, 0xf5, 0xa9, 0xe0, 0x51, 0x5b, 0x7b, 0xdd, 0xae, 0x0f, 0x1f, 0xf4, 0xd7, 0x5d, 0x6b, - 0xd7, 0x74, 0xf7, 0x6b, 0xa6, 0xbd, 0xbd, 0x67, 0x6e, 0x43, 0xca, 0x5e, 0xdc, 0x6b, 0xea, 0xa8, - 0xf2, 0x4b, 0x6c, 0xc7, 0x73, 0x2f, 0x2f, 0xf4, 0xef, 0xe4, 0xe4, 0x44, 0x58, 0x5c, 0x24, 0xec, - 0xc5, 0xf4, 0x3c, 0x1a, 0x98, 0xde, 0xb5, 0xe1, 0xae, 0x63, 0x5b, 0xed, 0xc0, 0x5a, 0x0d, 0x9e, - 0xb5, 0x8f, 0x86, 0x68, 0x2c, 0x71, 0x68, 0x2c, 0x0a, 0x97, 0x92, 0x0e, 0x8a, 0xe6, 0x08, 0xfd, - 0xce, 0x75, 0xe0, 0xd1, 0xa4, 0x1b, 0xd9, 0x6c, 0x35, 0x36, 0xcb, 0x86, 0x5e, 0x6a, 0xe9, 0x9b, - 0xb5, 0x46, 0xb9, 0x54, 0xdb, 0x34, 0xf4, 0xf5, 0x86, 0x02, 0xd1, 0xec, 0x7c, 0xca, 0x80, 0x6d, - 0xe7, 0x32, 0x74, 0xb5, 0xe7, 0xe6, 0xc4, 0x20, 0x4a, 0x10, 0x4a, 0x12, 0x7c, 0xb2, 0x08, 0x7c, - 0x3f, 0x21, 0xec, 0x67, 0x44, 0x05, 0x4b, 0x99, 0x8f, 0x69, 0x31, 0x1f, 0x13, 0xea, 0x63, 0x12, - 0x49, 0x3d, 0x02, 0x40, 0xfa, 0x47, 0x09, 0x4c, 0x95, 0x1d, 0xfb, 0x32, 0x74, 0x7d, 0x76, 0x92, - 0xc5, 0xe2, 0x90, 0xeb, 0xc3, 0xe1, 0x34, 0x98, 0x82, 0xb6, 0xef, 0x3a, 0xbd, 0x60, 0x96, 0x15, - 0x3c, 0x6a, 0x6f, 0x4c, 0x2b, 0x61, 0x5a, 0x72, 0xfc, 0xda, 0xec, 0xe0, 0x82, 0x38, 0xf6, 0xe4, - 0xbe, 0xb6, 0xf3, 0x70, 0x1a, 0x5c, 0x06, 0x33, 0x90, 0x7d, 0x3f, 0xf6, 0x15, 0x19, 0xcc, 0x93, - 0x76, 0xdb, 0x84, 0xd8, 0x2c, 0xd4, 0x1a, 0xec, 0x3a, 0x67, 0x9f, 0xf0, 0x57, 0x8f, 0x71, 0xe2, - 0x2f, 0x9a, 0xbd, 0x5e, 0xb8, 0x42, 0xbe, 0x7a, 0xcc, 0xa0, 0xcf, 0x44, 0xcd, 0x97, 0x8a, 0x20, - 0x6f, 0xee, 0xf9, 0x3b, 0xda, 0xb7, 0x84, 0x67, 0xbc, 0x5c, 0x3f, 0x42, 0xf9, 0x89, 0x81, 0xe4, - 0x24, 0x28, 0xf8, 0xce, 0x25, 0x18, 0xc8, 0x81, 0x3c, 0x20, 0x38, 0xcc, 0x5e, 0xaf, 0x85, 0x5f, - 0x50, 0x38, 0x82, 0x67, 0x64, 0x60, 0x99, 0xed, 0xb6, 0xb3, 0x67, 0xfb, 0xd5, 0x60, 0x95, 0x3c, - 0x4a, 0xd0, 0xbe, 0x20, 0xb4, 0x0d, 0x25, 0xc0, 0x60, 0x3a, 0xc8, 0x2e, 0x8e, 0xd0, 0x94, 0x16, - 0xc1, 0x2d, 0xa5, 0xf5, 0xf5, 0xcd, 0x56, 0xe3, 0x7e, 0xbd, 0x1e, 0x59, 0xbb, 0x9b, 0xd5, 0xfa, - 0x66, 0x6b, 0x55, 0xdf, 0x2c, 0x6f, 0x18, 0x78, 0x71, 0xb2, 0x54, 0x2e, 0x37, 0x36, 0xea, 0x2d, - 0x05, 0x6a, 0x6f, 0x95, 0xc0, 0x5c, 0xb9, 0xeb, 0x78, 0x21, 0xc2, 0xd7, 0x45, 0x08, 0x87, 0x62, - 0xcc, 0x31, 0x62, 0xd4, 0xfe, 0x35, 0x27, 0xea, 0x27, 0x13, 0x08, 0x84, 0x21, 0x1f, 0xd3, 0x4b, - 0xbd, 0x51, 0xc8, 0x4f, 0x66, 0x38, 0xbd, 0xec, 0x9b, 0xc4, 0x67, 0x96, 0xc1, 0x54, 0x89, 0x28, - 0x86, 0xf6, 0x27, 0x39, 0x50, 0x2c, 0x3b, 0xf6, 0x96, 0xb5, 0x8d, 0x2c, 0x48, 0x68, 0x9b, 0x17, - 0xbb, 0xb0, 0x62, 0xfa, 0xe6, 0x65, 0x0b, 0x5e, 0xc1, 0x15, 0x98, 0x36, 0xfa, 0x52, 0x11, 0x53, - 0x34, 0x05, 0x5e, 0xdc, 0xdb, 0xc6, 0x4c, 0x4d, 0x1b, 0x6c, 0x12, 0x1a, 0x3f, 0xc8, 0xe3, 0xba, - 0x0b, 0x5d, 0xd8, 0x85, 0xa6, 0x07, 0xd1, 0x5c, 0xcc, 0x86, 0x5d, 0xac, 0xb4, 0xd3, 0x46, 0xdc, - 0x6b, 0xf5, 0x2c, 0x98, 0x23, 0xaf, 0xb0, 0xfd, 0xe3, 0x61, 0x35, 0x9e, 0x36, 0xb8, 0x34, 0xf5, - 0x09, 0xa0, 0x00, 0x1f, 0xf4, 0x5d, 0xf3, 0x74, 0x07, 0xe3, 0xf5, 0xa8, 0x45, 0xe2, 0x28, 0xbb, - 0x18, 0x38, 0xca, 0x2e, 0x36, 0xb1, 0x1b, 0xad, 0x41, 0x72, 0x69, 0xff, 0x7b, 0x3a, 0xb4, 0x5e, - 0x3e, 0x2f, 0x47, 0x8a, 0xa1, 0x82, 0xbc, 0x6d, 0xee, 0x42, 0xaa, 0x17, 0xf8, 0xbf, 0x7a, 0x0b, - 0x38, 0x6e, 0x5e, 0x36, 0x7d, 0xd3, 0xad, 0x39, 0x6d, 0xb3, 0x8b, 0x87, 0xcd, 0xa0, 0xe5, 0xf7, - 0xbf, 0xc0, 0x9b, 0x56, 0xbe, 0xe3, 0x42, 0x9c, 0x2b, 0xd8, 0xb4, 0x0a, 0x12, 0x10, 0x75, 0xab, - 0xed, 0xd8, 0x98, 0x7f, 0xd9, 0xc0, 0xff, 0x91, 0x54, 0x3a, 0x96, 0x87, 0x2a, 0x82, 0xa9, 0xd4, - 0xc9, 0x7e, 0x4a, 0x73, 0xdf, 0x6e, 0xe3, 0x0d, 0xab, 0x69, 0x23, 0xee, 0xb5, 0xba, 0x04, 0x66, - 0xe9, 0xee, 0xcb, 0x1a, 0xd2, 0xab, 0x22, 0xd6, 0xab, 0xeb, 0x79, 0x37, 0x44, 0x82, 0xe7, 0x62, - 0x3d, 0xca, 0x67, 0xb0, 0x1f, 0xa9, 0xcf, 0x00, 0x8f, 0xa6, 0x8f, 0xe5, 0x3d, 0xcf, 0x77, 0x76, - 0x09, 0xe8, 0xcb, 0x56, 0x97, 0xd4, 0x60, 0x0a, 0xd7, 0x20, 0x29, 0x8b, 0x7a, 0x07, 0x38, 0xd9, - 0x73, 0xe1, 0x16, 0x74, 0x2f, 0x98, 0xbb, 0x7b, 0x0f, 0xb6, 0x5c, 0xd3, 0xf6, 0x7a, 0x8e, 0xeb, - 0x9f, 0x9e, 0xc6, 0xcc, 0x0f, 0x7c, 0xa7, 0xde, 0x0a, 0x4e, 0x3c, 0xe0, 0x39, 0x76, 0xa9, 0x67, - 0xd5, 0x2c, 0xcf, 0x87, 0x76, 0xa9, 0xd3, 0x71, 0x4f, 0xcf, 0xe0, 0xb2, 0x0e, 0xbe, 0x50, 0x6f, - 0x04, 0xf3, 0x0f, 0x38, 0x96, 0xdd, 0xf4, 0x5d, 0x68, 0xee, 0x6e, 0xb8, 0xdd, 0xd3, 0x80, 0x6c, - 0x10, 0x71, 0x89, 0xb4, 0xf3, 0x9d, 0x06, 0x45, 0x02, 0x89, 0xf6, 0x92, 0x82, 0xb0, 0x57, 0x33, - 0x15, 0x52, 0xa2, 0xb5, 0x78, 0x3b, 0x98, 0xa2, 0xbd, 0x26, 0x06, 0x7f, 0xf6, 0x8e, 0x53, 0x7d, - 0x0b, 0x24, 0x94, 0x8a, 0x11, 0x64, 0x53, 0x9f, 0x04, 0x8a, 0x6d, 0x2c, 0x2a, 0xac, 0x07, 0xb3, - 0x77, 0x3c, 0x7a, 0x70, 0xa1, 0x38, 0x8b, 0x41, 0xb3, 0x6a, 0x5f, 0x94, 0x85, 0x1c, 0xa1, 0x93, - 0x38, 0x4e, 0xd7, 0x53, 0x7c, 0x55, 0x1a, 0xa1, 0x2b, 0xbe, 0x15, 0xdc, 0x4c, 0xfb, 0x59, 0x6a, - 0xd3, 0x54, 0x36, 0x97, 0x36, 0x82, 0x59, 0x2d, 0xb2, 0x74, 0x9a, 0xad, 0x92, 0xd1, 0xda, 0xac, - 0x37, 0x2a, 0x68, 0x36, 0x7c, 0x0b, 0xb8, 0x69, 0x48, 0x6e, 0xbd, 0xb5, 0x59, 0x2f, 0xad, 0xe9, - 0xca, 0x16, 0x6f, 0x2f, 0x35, 0x5b, 0x8d, 0xf5, 0x4d, 0x63, 0xa3, 0x5e, 0xaf, 0xd6, 0x57, 0x08, - 0x31, 0x64, 0xa0, 0x9e, 0x8a, 0x32, 0x9c, 0x37, 0xaa, 0x2d, 0x7d, 0xb3, 0xdc, 0xa8, 0x2f, 0x57, - 0x57, 0x14, 0x6b, 0x98, 0xb1, 0xf5, 0x80, 0x7a, 0x3d, 0xb8, 0x96, 0xe3, 0xa4, 0xda, 0xa8, 0xa3, - 0x29, 0x7a, 0xb9, 0x54, 0x2f, 0xeb, 0x68, 0x3e, 0x7e, 0x49, 0xd5, 0xc0, 0xd5, 0x84, 0xdc, 0xe6, - 0x72, 0xb5, 0xc6, 0xee, 0xaa, 0x7d, 0x2a, 0xa7, 0x9e, 0x06, 0x57, 0xb1, 0xef, 0xa8, 0x4f, 0x84, - 0xf2, 0x1b, 0x39, 0xf5, 0x46, 0x70, 0x1d, 0xf7, 0x15, 0xd9, 0x20, 0xdb, 0xac, 0x56, 0x36, 0xd7, - 0xaa, 0xcd, 0xb5, 0x52, 0xab, 0xbc, 0xaa, 0x7c, 0x1a, 0x4f, 0x5f, 0x42, 0x7b, 0x9c, 0xf1, 0x4e, - 0x7e, 0x19, 0x6b, 0x27, 0x94, 0x78, 0x45, 0x7d, 0xfc, 0x40, 0xd8, 0x93, 0xed, 0xe2, 0x4f, 0x84, - 0x23, 0x4e, 0x85, 0x53, 0xa1, 0xdb, 0x53, 0xd0, 0x4a, 0xa7, 0x43, 0xad, 0x11, 0x54, 0xe8, 0x7a, - 0x70, 0x6d, 0x5d, 0x27, 0x48, 0x19, 0x7a, 0xb9, 0x71, 0x4e, 0x37, 0x36, 0xcf, 0x97, 0x6a, 0x35, - 0xbd, 0xb5, 0xb9, 0x5c, 0x35, 0x9a, 0x2d, 0x65, 0x4b, 0xfb, 0x27, 0x29, 0x5c, 0x96, 0x62, 0xa4, - 0xf5, 0x27, 0x52, 0xda, 0x66, 0x9d, 0xb8, 0xfc, 0xf4, 0x5d, 0xa0, 0xe8, 0xf9, 0xa6, 0xbf, 0xe7, - 0xd1, 0x56, 0xfd, 0x98, 0xc1, 0xad, 0x7a, 0xb1, 0x89, 0x33, 0x19, 0x34, 0xb3, 0xf6, 0xc5, 0x5c, - 0x9a, 0x66, 0x3a, 0x86, 0x95, 0x29, 0x6b, 0x04, 0x11, 0x9f, 0x01, 0x5a, 0xa0, 0xed, 0xd5, 0xe6, - 0x66, 0xa9, 0x66, 0xe8, 0xa5, 0xca, 0x85, 0x70, 0x3d, 0x0a, 0xaa, 0x57, 0x83, 0x13, 0x1b, 0xf5, - 0xd2, 0x52, 0x4d, 0xc7, 0xcd, 0xa5, 0x51, 0xaf, 0xeb, 0x65, 0x24, 0xf7, 0x1f, 0xc2, 0xbb, 0x3f, - 0xc8, 0x2a, 0xc7, 0x7c, 0x23, 0xcb, 0x89, 0x91, 0xff, 0x5f, 0x09, 0xbb, 0xb9, 0x45, 0x1a, 0xc6, - 0xd2, 0x1a, 0x2f, 0x0e, 0x5f, 0x10, 0xf2, 0x6c, 0x13, 0xe2, 0x24, 0x1d, 0x1e, 0xdf, 0x37, 0x02, - 0x1e, 0x57, 0x83, 0x13, 0x2c, 0x1e, 0xd8, 0xc3, 0x2d, 0x1e, 0x86, 0x3f, 0x96, 0xc1, 0xd4, 0x9a, - 0xb5, 0x8d, 0xdd, 0x8b, 0xf7, 0x22, 0x03, 0x65, 0x01, 0x48, 0xa1, 0xf7, 0x8e, 0x64, 0x75, 0xb8, - 0xc9, 0xbc, 0x24, 0xbe, 0xde, 0x22, 0x34, 0x61, 0xff, 0x62, 0xea, 0x9e, 0x89, 0x32, 0x1c, 0xd3, - 0x33, 0xbd, 0x50, 0x4a, 0xd3, 0x33, 0x0d, 0xa6, 0x95, 0x0a, 0x26, 0x64, 0x3a, 0xb8, 0xf0, 0xd9, - 0x7b, 0x96, 0x0b, 0x3b, 0xd8, 0x4c, 0xc4, 0xf5, 0x96, 0x0d, 0x3e, 0xf1, 0xac, 0x7b, 0x38, 0x30, - 0x59, 0x2f, 0x9b, 0x39, 0x30, 0x1d, 0x8e, 0x26, 0x78, 0xc3, 0x07, 0xbd, 0xd4, 0xeb, 0x8d, 0x8d, - 0x95, 0xd5, 0xcd, 0x65, 0x43, 0xd7, 0xe9, 0x12, 0xf1, 0xb6, 0xf6, 0x2e, 0x09, 0xcc, 0xd3, 0x1a, - 0x52, 0xef, 0x89, 0xeb, 0x62, 0x41, 0xa6, 0x70, 0xfc, 0x07, 0x3b, 0x3d, 0x59, 0xe1, 0xe1, 0x78, - 0x62, 0x92, 0x08, 0x13, 0xdd, 0x27, 0xde, 0x14, 0x36, 0xa1, 0xfb, 0x38, 0x50, 0x9e, 0x92, 0x9a, - 0x62, 0xf6, 0x53, 0x94, 0x97, 0x00, 0x50, 0x6c, 0xc2, 0x2e, 0x6c, 0xfb, 0xda, 0x87, 0xe4, 0x91, - 0xdb, 0x44, 0x9c, 0xb9, 0x2d, 0xa7, 0x32, 0xb7, 0xf3, 0x19, 0x98, 0xdb, 0x85, 0xd1, 0xcd, 0xed, - 0x62, 0x5a, 0x73, 0x7b, 0x2a, 0xce, 0xdc, 0x4e, 0xe8, 0x35, 0xa6, 0x13, 0x7b, 0x8d, 0x3e, 0x43, - 0xdd, 0xa8, 0x51, 0x93, 0x9e, 0x4f, 0xa4, 0xca, 0xfc, 0xf1, 0x62, 0xda, 0x71, 0x9c, 0x00, 0x7f, - 0xb4, 0xe6, 0xf9, 0x8f, 0x15, 0xd2, 0x8c, 0xfb, 0x03, 0x39, 0x4e, 0xd7, 0x4a, 0x5e, 0x99, 0xcf, - 0x60, 0xd1, 0x51, 0xbd, 0x01, 0x5c, 0x17, 0x3d, 0x6f, 0xea, 0xcf, 0xaa, 0x36, 0x5b, 0x4d, 0x6c, - 0x93, 0x97, 0x1b, 0x86, 0xb1, 0xb1, 0x4e, 0xb6, 0xab, 0x4e, 0x01, 0x35, 0xa2, 0x62, 0x6c, 0xd4, - 0x89, 0x05, 0xbe, 0xcd, 0x53, 0x5f, 0xae, 0xd6, 0x2b, 0x9b, 0xe1, 0xa8, 0x56, 0x5f, 0x6e, 0x28, - 0x3b, 0xea, 0x22, 0xb8, 0x85, 0xa1, 0x8e, 0x3b, 0x40, 0x52, 0x42, 0xa9, 0x5e, 0xd9, 0x5c, 0xab, - 0xeb, 0x6b, 0x8d, 0x7a, 0xb5, 0x8c, 0xd3, 0x9b, 0x7a, 0x4b, 0xb1, 0x90, 0x29, 0xd8, 0x67, 0xf3, - 0x37, 0xf5, 0x92, 0x51, 0x5e, 0xd5, 0x0d, 0x52, 0xe4, 0x03, 0xea, 0x4d, 0xe0, 0x6c, 0xa9, 0xde, - 0x68, 0xa1, 0x94, 0x52, 0xfd, 0x42, 0xeb, 0xc2, 0xba, 0xbe, 0xb9, 0x6e, 0x34, 0xca, 0x7a, 0xb3, - 0x89, 0x46, 0x52, 0x3a, 0x43, 0x50, 0xba, 0xea, 0xd3, 0xc1, 0x5d, 0x0c, 0x6b, 0x7a, 0x0b, 0xfb, - 0x46, 0xac, 0x35, 0xb0, 0x7b, 0x5c, 0x45, 0xdf, 0x5c, 0x2d, 0x35, 0x37, 0xab, 0xf5, 0x72, 0x63, - 0x6d, 0xbd, 0xd4, 0xaa, 0xa2, 0x01, 0x77, 0xdd, 0x68, 0xb4, 0x1a, 0x9b, 0xe7, 0x74, 0xa3, 0x59, - 0x6d, 0xd4, 0x15, 0x1b, 0x55, 0x99, 0x19, 0xa1, 0x03, 0x4b, 0xc9, 0x51, 0xaf, 0x05, 0xa7, 0x83, - 0xf4, 0x5a, 0x03, 0x09, 0x9a, 0x99, 0x33, 0xf4, 0x58, 0x3b, 0xab, 0xd9, 0x6a, 0x18, 0x64, 0xd6, - 0xb0, 0x56, 0x5d, 0x31, 0xd0, 0x54, 0x47, 0x79, 0x76, 0xa6, 0x73, 0x8a, 0x7f, 0x91, 0x40, 0xbe, - 0xe9, 0x3b, 0x3d, 0xed, 0x3b, 0xa3, 0xee, 0xf0, 0x0c, 0x00, 0x2e, 0x76, 0x85, 0xa8, 0x98, 0xbe, - 0x49, 0x57, 0x6b, 0x98, 0x14, 0xed, 0xd7, 0x85, 0xf7, 0x6f, 0x23, 0xab, 0xcb, 0xe9, 0xc5, 0x0c, - 0x1f, 0xdf, 0x14, 0x3b, 0x0e, 0x19, 0x4f, 0x28, 0x5d, 0x7b, 0xf8, 0x91, 0x51, 0x76, 0x68, 0x35, - 0x70, 0x8a, 0x81, 0x15, 0xc9, 0x3f, 0x50, 0x19, 0xa8, 0x3e, 0x0a, 0x5c, 0xd5, 0xa7, 0x7c, 0x58, - 0xe7, 0xb6, 0xd4, 0xef, 0x00, 0x8f, 0x61, 0xd4, 0x5f, 0x5f, 0x6b, 0x9c, 0xd3, 0x43, 0x45, 0xaf, - 0x94, 0x5a, 0x25, 0x65, 0x5b, 0xfb, 0xbc, 0x0c, 0xf2, 0x6b, 0xce, 0xe5, 0xfe, 0x6d, 0x73, 0x1b, - 0x5e, 0x61, 0xf6, 0x56, 0x82, 0x47, 0xfe, 0x08, 0x96, 0x90, 0xd8, 0xd7, 0xe2, 0x5d, 0x64, 0xbe, - 0x20, 0xa5, 0x11, 0xfb, 0xda, 0x61, 0xfd, 0x62, 0xfe, 0x66, 0x14, 0xb1, 0xc7, 0x88, 0x16, 0xaa, - 0x67, 0xc1, 0x99, 0xe8, 0x45, 0xb5, 0xa2, 0xd7, 0x5b, 0xd5, 0xe5, 0x0b, 0x91, 0x70, 0xab, 0x86, - 0x90, 0xf8, 0x87, 0x75, 0x73, 0xc9, 0x6b, 0x05, 0xa7, 0xc1, 0xc9, 0xe8, 0xdd, 0x8a, 0xde, 0x0a, - 0xde, 0x3c, 0xa0, 0x3d, 0x54, 0x00, 0x73, 0xa4, 0xdb, 0xdf, 0xe8, 0x75, 0x90, 0xf5, 0xfd, 0xa4, - 0x08, 0xdd, 0x9b, 0xc1, 0xf1, 0xea, 0xfa, 0x72, 0xb3, 0xe9, 0x3b, 0xae, 0xb9, 0x0d, 0xf1, 0x38, - 0x4a, 0xa4, 0xd5, 0x9f, 0xac, 0xbd, 0x57, 0x78, 0xf5, 0x9f, 0x1f, 0x6a, 0x48, 0x99, 0x31, 0xa8, - 0x7f, 0x45, 0x68, 0xb5, 0x5e, 0x80, 0x60, 0x3a, 0xf4, 0x1f, 0x18, 0x73, 0x9b, 0x8b, 0xc7, 0x65, - 0xeb, 0xec, 0xf3, 0x25, 0x30, 0xd3, 0xb2, 0x76, 0xe1, 0x73, 0x1c, 0x1b, 0x7a, 0xea, 0x14, 0x90, - 0x57, 0xd6, 0x5a, 0xca, 0x31, 0xf4, 0x07, 0x4d, 0x8b, 0x72, 0xf8, 0x8f, 0x8e, 0x0a, 0x40, 0x7f, - 0x4a, 0x2d, 0x45, 0x46, 0x7f, 0xd6, 0xf4, 0x96, 0x92, 0x47, 0x7f, 0xea, 0x7a, 0x4b, 0x29, 0xa0, - 0x3f, 0xeb, 0xb5, 0x96, 0x52, 0x44, 0x7f, 0xaa, 0xcd, 0x96, 0x32, 0x85, 0xfe, 0x2c, 0x35, 0x5b, - 0xca, 0x34, 0xfa, 0x73, 0xae, 0xd9, 0x52, 0x66, 0xd0, 0x9f, 0x72, 0xab, 0xa5, 0x00, 0xf4, 0xe7, - 0xbe, 0x66, 0x4b, 0x99, 0x45, 0x7f, 0x4a, 0xe5, 0x96, 0x32, 0x87, 0xff, 0xe8, 0x2d, 0x65, 0x1e, - 0xfd, 0x69, 0x36, 0x5b, 0xca, 0x02, 0xa6, 0xdc, 0x6c, 0x29, 0xc7, 0x71, 0x59, 0xd5, 0x96, 0xa2, - 0xa0, 0x3f, 0xab, 0xcd, 0x96, 0x72, 0x02, 0x67, 0x6e, 0xb6, 0x14, 0x15, 0x17, 0xda, 0x6c, 0x29, - 0x57, 0xe1, 0x3c, 0xcd, 0x96, 0x72, 0x12, 0x17, 0xd1, 0x6c, 0x29, 0x57, 0x63, 0x36, 0xf4, 0x96, - 0x72, 0x0a, 0xe7, 0x31, 0x5a, 0xca, 0xa3, 0xf0, 0xab, 0x7a, 0x4b, 0x39, 0x8d, 0x19, 0xd3, 0x5b, - 0xca, 0x35, 0xf8, 0x8f, 0xd1, 0x52, 0x34, 0xfc, 0xaa, 0xd4, 0x52, 0x1e, 0xad, 0x3d, 0x06, 0xcc, - 0xac, 0x40, 0x9f, 0x80, 0xa8, 0x29, 0x40, 0x5e, 0x81, 0x3e, 0x3b, 0x11, 0x7f, 0x55, 0x1e, 0x3c, - 0x8a, 0x2e, 0xde, 0x2c, 0xbb, 0xce, 0x6e, 0x0d, 0x6e, 0x9b, 0xed, 0x7d, 0xfd, 0x41, 0x64, 0xf0, - 0x69, 0x2f, 0xce, 0x71, 0x2b, 0xda, 0xbd, 0xa8, 0x37, 0xc2, 0xff, 0x13, 0x0d, 0xe4, 0x60, 0x8d, - 0x5a, 0xe6, 0xd7, 0xa8, 0xe3, 0x4c, 0xc2, 0xbc, 0xc8, 0x44, 0xf2, 0x1f, 0xd8, 0xc6, 0xc0, 0x6d, - 0x48, 0xe5, 0xfa, 0x36, 0xa4, 0x50, 0x0b, 0xeb, 0x41, 0xd7, 0x73, 0x6c, 0xb3, 0xdb, 0xa4, 0xee, - 0x47, 0x64, 0xae, 0xda, 0x9f, 0xac, 0x3e, 0x33, 0x68, 0x54, 0xc4, 0xe0, 0x7b, 0x5a, 0xd2, 0xf2, - 0x56, 0xbf, 0x84, 0x62, 0xda, 0xd7, 0xa7, 0xc3, 0xf6, 0xd5, 0xe2, 0xda, 0xd7, 0x33, 0x0e, 0x41, - 0x3b, 0x5d, 0x53, 0xab, 0x8e, 0x36, 0x15, 0x8d, 0x9c, 0xf3, 0x83, 0xfd, 0x2f, 0x59, 0xfb, 0xbc, - 0x04, 0x4e, 0xe9, 0xf6, 0xa0, 0xa9, 0x0c, 0xab, 0x46, 0x6f, 0x65, 0xa1, 0x59, 0xe7, 0x45, 0x7a, - 0xd7, 0xc0, 0x6a, 0x0f, 0xa6, 0x19, 0x23, 0xd1, 0xcf, 0x86, 0x12, 0x6d, 0x72, 0x12, 0xbd, 0x77, - 0x74, 0xd2, 0xe9, 0x04, 0x5a, 0x1f, 0x6b, 0xdf, 0x95, 0xd7, 0xfe, 0x42, 0x02, 0x27, 0x88, 0x07, - 0xe1, 0x7d, 0x64, 0xe6, 0x84, 0x7b, 0x7b, 0xde, 0xfa, 0xea, 0x46, 0xb3, 0x2c, 0xa2, 0xdf, 0x4c, - 0x8a, 0xf6, 0x3a, 0x56, 0xe0, 0xf7, 0xf3, 0x02, 0x8f, 0xe9, 0xc7, 0xfb, 0x8b, 0x8b, 0x91, 0xf5, - 0x6f, 0x84, 0xb2, 0xae, 0x73, 0xb2, 0xbe, 0x6b, 0x24, 0xaa, 0x47, 0x2b, 0xe6, 0xaf, 0xe6, 0xc1, - 0x63, 0x08, 0x87, 0x54, 0x11, 0x48, 0x3f, 0x58, 0xb2, 0x3b, 0x06, 0xf4, 0x7c, 0xd3, 0xf5, 0xb9, - 0xd0, 0x2b, 0x7d, 0x53, 0xf3, 0x5c, 0x06, 0x53, 0x73, 0x69, 0xe8, 0xd4, 0x5c, 0x7b, 0x0f, 0x6b, - 0xe0, 0x9d, 0xe7, 0x91, 0x2d, 0x25, 0x60, 0x10, 0x53, 0xc3, 0xb8, 0x16, 0x15, 0x5a, 0x7e, 0xdf, - 0xc3, 0xa1, 0xbc, 0x7c, 0xe8, 0x12, 0xd2, 0x21, 0xfe, 0xeb, 0xe3, 0xb5, 0xc4, 0xf3, 0xec, 0x3b, - 0xde, 0x6c, 0x54, 0x3a, 0x99, 0x4e, 0xa1, 0x5e, 0x3a, 0x0d, 0x66, 0x70, 0x97, 0x53, 0xb3, 0xec, - 0x4b, 0xda, 0x9f, 0xcb, 0x60, 0xae, 0x0e, 0xaf, 0x94, 0x77, 0xcc, 0x6e, 0x17, 0xda, 0xdb, 0x50, - 0x7b, 0x80, 0xb3, 0xed, 0xcd, 0x5e, 0xaf, 0x1e, 0xed, 0x0f, 0x07, 0x8f, 0xea, 0xbd, 0xa0, 0xe0, - 0xb5, 0x9d, 0x30, 0xa8, 0xc3, 0x77, 0xc6, 0xac, 0x5e, 0x97, 0xf6, 0xfc, 0x9d, 0x45, 0x5c, 0x56, - 0xa9, 0x67, 0x35, 0xd1, 0x07, 0x06, 0xf9, 0x8e, 0x8e, 0x93, 0x7f, 0x35, 0xb0, 0x33, 0xce, 0x25, - 0x74, 0xc6, 0x21, 0xe3, 0x8b, 0x2c, 0xd3, 0x31, 0x8b, 0x24, 0xd7, 0x83, 0xd9, 0x76, 0x90, 0x25, - 0x3c, 0xa5, 0xc7, 0x26, 0x69, 0x7f, 0x99, 0xaa, 0xbb, 0x16, 0x2a, 0x3c, 0x9d, 0x56, 0xc1, 0x31, - 0x9b, 0x9a, 0x57, 0x83, 0x13, 0xad, 0x46, 0x63, 0x73, 0xad, 0x54, 0xbf, 0x10, 0xc5, 0x56, 0xd9, - 0xd2, 0x5e, 0x99, 0x07, 0x0b, 0x4d, 0xa7, 0x7b, 0x19, 0x46, 0x38, 0x57, 0x39, 0xf7, 0x4f, 0x56, - 0x4e, 0xb9, 0x03, 0x72, 0x52, 0x4f, 0x81, 0xa2, 0x69, 0x7b, 0x57, 0x60, 0x60, 0xfe, 0xd3, 0x27, - 0x0a, 0xe3, 0x47, 0xd8, 0x8e, 0xc0, 0xe0, 0x61, 0xbc, 0x7b, 0x88, 0x24, 0x79, 0xae, 0x62, 0x80, - 0x3c, 0x0b, 0xe6, 0x3c, 0xe2, 0x25, 0xd2, 0x62, 0x9c, 0x81, 0xb8, 0x34, 0xcc, 0x22, 0x71, 0x53, - 0x92, 0x29, 0x8b, 0xf8, 0x49, 0x7b, 0x38, 0xec, 0x3f, 0x36, 0x38, 0x88, 0x4b, 0x87, 0x61, 0x2c, - 0x1d, 0xc8, 0xaf, 0x1e, 0xf7, 0x24, 0xfe, 0x34, 0x38, 0x19, 0x9c, 0x50, 0x2f, 0xaf, 0x96, 0x6a, - 0x35, 0xbd, 0xbe, 0xa2, 0x6f, 0x56, 0x2b, 0x64, 0x3f, 0x39, 0x4a, 0x29, 0xb5, 0x5a, 0xfa, 0xda, - 0x7a, 0xab, 0xb9, 0xa9, 0x3f, 0xab, 0xac, 0xeb, 0x15, 0xec, 0x80, 0x8d, 0x4f, 0x50, 0x06, 0xae, - 0xf2, 0xa5, 0x7a, 0xf3, 0xbc, 0x6e, 0x28, 0x3b, 0x67, 0x4b, 0x60, 0x96, 0x19, 0x28, 0x10, 0x77, - 0x15, 0xb8, 0x65, 0xee, 0x75, 0xa9, 0x39, 0xae, 0x1c, 0x43, 0xdc, 0x61, 0xd9, 0x34, 0xec, 0xee, - 0xbe, 0x92, 0x53, 0x15, 0x30, 0xc7, 0x8e, 0x09, 0x8a, 0xa4, 0xbd, 0xf3, 0x5a, 0x30, 0x73, 0xde, - 0x71, 0x2f, 0x61, 0xaf, 0x61, 0xed, 0x03, 0x24, 0x06, 0x5b, 0x10, 0x51, 0x82, 0x31, 0xc0, 0x5e, - 0x2d, 0xee, 0x26, 0x16, 0x50, 0x5b, 0x1c, 0x1a, 0x35, 0xe2, 0x7a, 0x30, 0x7b, 0x25, 0xc8, 0x1d, - 0xb5, 0x74, 0x26, 0x49, 0xfb, 0x45, 0x31, 0xc7, 0xaf, 0xe1, 0x45, 0x66, 0xbf, 0xea, 0xff, 0x76, - 0x09, 0x14, 0x57, 0xa0, 0x5f, 0xea, 0x76, 0x59, 0xb9, 0xbd, 0x5c, 0xf8, 0x1c, 0x29, 0x57, 0x89, - 0x52, 0xb7, 0x1b, 0xdf, 0xa8, 0x18, 0x01, 0x05, 0xe7, 0x9d, 0xb8, 0x34, 0x41, 0x2f, 0xed, 0x21, - 0x05, 0x66, 0x2f, 0xb1, 0x8f, 0x46, 0xae, 0xd9, 0xaf, 0x67, 0xcc, 0xa4, 0x27, 0x46, 0xf1, 0xf7, - 0x72, 0xc9, 0x4e, 0x52, 0x41, 0x3e, 0xf5, 0x7e, 0x30, 0xb5, 0xe7, 0xc1, 0xb2, 0xe9, 0x05, 0x43, - 0x1b, 0x5f, 0xd3, 0xc6, 0xc5, 0x07, 0x60, 0xdb, 0x5f, 0xac, 0xee, 0xa2, 0x89, 0xcf, 0x06, 0xc9, - 0x18, 0xc6, 0x2b, 0xa2, 0xcf, 0x46, 0x40, 0x01, 0x4d, 0x3b, 0xaf, 0x58, 0xfe, 0x4e, 0x79, 0xc7, - 0xf4, 0xe9, 0x66, 0x4b, 0xf8, 0xac, 0xbd, 0x64, 0x04, 0x38, 0x13, 0x1d, 0x76, 0x62, 0x8f, 0xa3, - 0xa7, 0x06, 0x71, 0x0c, 0x5e, 0x36, 0xa3, 0x80, 0xf8, 0xb7, 0x12, 0xc8, 0x37, 0x7a, 0xd0, 0x16, - 0x3e, 0x7b, 0x19, 0xca, 0x56, 0xea, 0x93, 0xed, 0xc3, 0xe2, 0x6e, 0xc1, 0x61, 0xa5, 0x51, 0xc9, - 0x31, 0x92, 0xbd, 0x0d, 0xe4, 0x2d, 0x7b, 0xcb, 0xa1, 0x96, 0xed, 0xa3, 0x63, 0x6c, 0x9d, 0xaa, - 0xbd, 0xe5, 0x18, 0x38, 0xa3, 0xa8, 0x47, 0x70, 0x52, 0xd9, 0xd9, 0x8b, 0xfb, 0xef, 0xa6, 0x41, - 0x91, 0xa8, 0xb3, 0xf6, 0x32, 0x19, 0xc8, 0xa5, 0x4e, 0x27, 0x46, 0xf0, 0xd2, 0x01, 0xc1, 0x3b, - 0xf8, 0xb3, 0x10, 0x93, 0xf0, 0x99, 0x0f, 0xbc, 0x26, 0xd8, 0xb7, 0xd3, 0x26, 0x55, 0xea, 0x74, - 0xe2, 0xcf, 0x2d, 0x84, 0x05, 0x4a, 0x7c, 0x81, 0x6c, 0x0b, 0x97, 0xc5, 0x5a, 0x78, 0xea, 0x81, - 0x20, 0x96, 0xbf, 0xec, 0x21, 0xfa, 0x07, 0x09, 0x4c, 0xd5, 0x2c, 0xcf, 0x47, 0xd8, 0x94, 0x44, - 0xb0, 0xb9, 0x16, 0xcc, 0x04, 0xa2, 0x41, 0x5d, 0x1e, 0xea, 0xcf, 0xa3, 0x04, 0x7e, 0x26, 0x7e, - 0x1f, 0x8f, 0xce, 0x93, 0x93, 0x6b, 0x4f, 0xb9, 0x88, 0x3f, 0xd3, 0x16, 0x15, 0x2b, 0xf5, 0x17, - 0xfb, 0x4b, 0xa1, 0xc0, 0xd7, 0x38, 0x81, 0xdf, 0x39, 0x4a, 0x91, 0xd9, 0x0b, 0xfd, 0xf7, 0x25, - 0x00, 0x50, 0xd9, 0xf4, 0xe0, 0xf0, 0xe3, 0xb8, 0x70, 0x20, 0x09, 0xd2, 0x7d, 0x25, 0x2b, 0xdd, - 0x35, 0x5e, 0xba, 0xdf, 0x3d, 0xbc, 0xaa, 0x49, 0x07, 0x84, 0x55, 0x05, 0xc8, 0x56, 0x28, 0x5a, - 0xf4, 0x57, 0x7b, 0x7b, 0x28, 0xd4, 0x75, 0x4e, 0xa8, 0x77, 0x8f, 0x58, 0x52, 0xf6, 0x72, 0xfd, - 0x23, 0x09, 0x4c, 0x35, 0xa1, 0x8f, 0xba, 0x49, 0xed, 0x9c, 0x48, 0x0f, 0xcf, 0xb4, 0x6d, 0x49, - 0xb0, 0x6d, 0x7f, 0x23, 0x27, 0x1a, 0x18, 0x2e, 0x92, 0x0c, 0xe5, 0x29, 0x66, 0xf5, 0xe1, 0xf5, - 0x42, 0x81, 0xe1, 0x86, 0x51, 0xcb, 0x5e, 0xba, 0x6f, 0x95, 0x42, 0x4f, 0x11, 0xfe, 0x5c, 0x1f, - 0x6b, 0x16, 0xe7, 0x0e, 0x9a, 0xc5, 0xe2, 0xe7, 0xfa, 0xd8, 0x3a, 0xc6, 0x3b, 0x26, 0xa4, 0x36, - 0x36, 0xc6, 0xe0, 0x33, 0x30, 0x8a, 0xbc, 0x9e, 0x27, 0x83, 0x22, 0xdd, 0x3c, 0xb8, 0x37, 0x79, - 0xef, 0x60, 0xf8, 0xd4, 0xe2, 0xfd, 0x23, 0x98, 0x72, 0x49, 0xcb, 0xf2, 0x21, 0x1b, 0x12, 0xc3, - 0xc6, 0xad, 0xa0, 0x80, 0xa3, 0x66, 0xd3, 0x71, 0x2e, 0x72, 0xf7, 0x08, 0x48, 0xe8, 0xe8, 0xad, - 0x41, 0x32, 0xa5, 0x46, 0x61, 0x0c, 0x2b, 0xf9, 0xa3, 0xa0, 0xf0, 0x75, 0x15, 0x80, 0xf5, 0xbd, - 0x8b, 0x5d, 0xcb, 0xdb, 0xb1, 0x6c, 0xec, 0x23, 0x36, 0x47, 0x1f, 0x49, 0xf0, 0xe7, 0x44, 0xf3, - 0x2f, 0xd6, 0x28, 0x50, 0x80, 0xbc, 0xe7, 0x5a, 0x74, 0x19, 0x00, 0xfd, 0x55, 0xef, 0x09, 0xbd, - 0x2d, 0xf3, 0x7d, 0x81, 0x5b, 0x90, 0x18, 0x22, 0x0e, 0x16, 0x99, 0xd2, 0x23, 0xaf, 0x4b, 0x36, - 0xc2, 0x77, 0x81, 0x8f, 0xf0, 0xcd, 0x9d, 0xe6, 0x2e, 0xf6, 0x9d, 0xe6, 0x46, 0x38, 0x7a, 0xd6, - 0x73, 0x20, 0x76, 0x3d, 0x92, 0x0d, 0xfc, 0x1f, 0x7d, 0x81, 0xdd, 0x83, 0xb0, 0x77, 0x1e, 0x39, - 0x33, 0x10, 0x25, 0xb0, 0x7d, 0xde, 0x8c, 0x60, 0x9f, 0xf7, 0xd9, 0x68, 0xee, 0xf3, 0xfd, 0x82, - 0x86, 0x73, 0x0a, 0xc9, 0xdd, 0x02, 0x14, 0xcb, 0x6e, 0x77, 0xf7, 0x3a, 0xe4, 0xd8, 0x09, 0xea, - 0xdb, 0xe8, 0x69, 0x94, 0x03, 0xe9, 0xda, 0xc7, 0x85, 0xc3, 0x72, 0x32, 0x12, 0x4f, 0x9c, 0xd3, - 0x50, 0x7e, 0xa4, 0x90, 0x1f, 0x66, 0x47, 0x38, 0xa9, 0x3f, 0x1e, 0x46, 0x3f, 0x9d, 0x66, 0xef, - 0x8e, 0xb0, 0x7a, 0xa3, 0x82, 0x85, 0xe0, 0x90, 0x7c, 0x63, 0xe9, 0x3e, 0xbd, 0xdc, 0x52, 0xe0, - 0xc1, 0x83, 0xf3, 0xf8, 0x88, 0x3c, 0x39, 0x0e, 0x1f, 0xad, 0xd0, 0x68, 0xff, 0x4b, 0x02, 0x45, - 0x6a, 0x7c, 0xdc, 0x7b, 0x48, 0x40, 0xb5, 0x57, 0x8d, 0x02, 0x49, 0x62, 0xac, 0x92, 0xcf, 0xa4, - 0x05, 0x60, 0x0c, 0xe6, 0xc6, 0x85, 0xcc, 0x00, 0xd0, 0xfe, 0x59, 0x02, 0x79, 0x64, 0x14, 0x89, - 0x45, 0x82, 0xf8, 0xb4, 0xb0, 0x83, 0x30, 0x23, 0x00, 0x44, 0x3e, 0x46, 0xbf, 0x97, 0xc0, 0x4c, - 0x8f, 0x64, 0x0c, 0xe3, 0x90, 0xdc, 0x28, 0xd0, 0x35, 0x41, 0x23, 0xfa, 0x4c, 0x7b, 0x9f, 0xd0, - 0xf1, 0x87, 0x64, 0x7e, 0xd2, 0xc1, 0xa1, 0x8f, 0x23, 0x68, 0xc4, 0x96, 0xf6, 0x6f, 0x12, 0x00, - 0x06, 0xf4, 0x9c, 0xee, 0x65, 0xb8, 0xe1, 0x5a, 0xda, 0xa3, 0x23, 0x00, 0x68, 0xb3, 0xcf, 0x45, - 0xcd, 0xfe, 0x73, 0x92, 0xa8, 0x2b, 0x30, 0xa7, 0x79, 0x01, 0xf1, 0x18, 0xf1, 0x3f, 0x1d, 0x4c, - 0x51, 0x39, 0x52, 0x0b, 0x53, 0x4c, 0xf8, 0xc1, 0x47, 0xda, 0x07, 0x85, 0x5c, 0x89, 0x45, 0x38, - 0x4a, 0x07, 0x40, 0x79, 0x04, 0x00, 0x8e, 0x83, 0xd9, 0x00, 0x80, 0x0d, 0xa3, 0xaa, 0x40, 0xed, - 0xdd, 0x32, 0xf6, 0xb7, 0x20, 0x43, 0xdd, 0xe1, 0x7b, 0x9a, 0xbf, 0x10, 0x9e, 0xfa, 0x33, 0xf2, - 0x08, 0xcb, 0xcf, 0x08, 0xa0, 0xdf, 0x16, 0x9a, 0xeb, 0x0b, 0x30, 0xf4, 0x48, 0xe9, 0xaf, 0xce, - 0xea, 0x60, 0x9e, 0xb3, 0x51, 0xd4, 0xd3, 0xe0, 0x24, 0x97, 0x40, 0xc6, 0xbb, 0x8e, 0x72, 0x4c, - 0xd5, 0xc0, 0x29, 0xee, 0x0d, 0x7d, 0x80, 0x1d, 0x25, 0xa7, 0x3d, 0xfc, 0x85, 0x5c, 0xb8, 0xfa, - 0xf3, 0xfe, 0x3c, 0x5d, 0x77, 0xfb, 0x24, 0x1f, 0xfa, 0xb2, 0xed, 0xd8, 0x3e, 0x7c, 0x90, 0x71, - 0x5a, 0x09, 0x13, 0x12, 0x6d, 0x88, 0xd3, 0x60, 0xca, 0x77, 0x59, 0x47, 0x96, 0xe0, 0x91, 0x55, - 0xac, 0x02, 0xaf, 0x58, 0x75, 0x70, 0x96, 0x5a, 0x13, 0x06, 0xec, 0x9a, 0x48, 0x86, 0x5e, 0xc9, - 0xab, 0xc0, 0x1e, 0xb4, 0x3b, 0xd0, 0xf6, 0x09, 0x9f, 0xc1, 0x29, 0x58, 0x81, 0x9c, 0xbc, 0x32, - 0xde, 0xc3, 0x2b, 0xe3, 0xe3, 0x06, 0x2d, 0xe8, 0x26, 0xac, 0xfe, 0xdd, 0x09, 0x00, 0xa9, 0xdb, - 0x39, 0x0b, 0x5e, 0xa1, 0x6a, 0x78, 0x4d, 0xdf, 0x1a, 0x60, 0x23, 0xcc, 0x60, 0x30, 0x99, 0xb5, - 0x2f, 0x87, 0xea, 0xf7, 0x0c, 0x4e, 0xfd, 0x6e, 0x15, 0x64, 0x21, 0x9d, 0xd6, 0xf5, 0x46, 0xd0, - 0xba, 0x79, 0x30, 0x13, 0xed, 0x2d, 0xcb, 0xea, 0x35, 0xe0, 0xea, 0xc0, 0xdf, 0xb8, 0xae, 0xeb, - 0x95, 0xe6, 0xe6, 0xc6, 0xfa, 0x8a, 0x51, 0xaa, 0xe8, 0x0a, 0x40, 0xfa, 0x49, 0xf4, 0x32, 0x74, - 0x13, 0xce, 0x6b, 0x7f, 0x20, 0x81, 0x02, 0x3e, 0xc2, 0xad, 0x7d, 0xef, 0x98, 0x34, 0xc7, 0xe3, - 0x5c, 0xa0, 0xc2, 0x71, 0x57, 0xfc, 0x42, 0x13, 0x2a, 0x4c, 0xcc, 0xd5, 0xa1, 0x2e, 0x34, 0x49, - 0x20, 0x94, 0xfd, 0xbc, 0x08, 0x35, 0xc9, 0xe6, 0x8e, 0x73, 0xe5, 0xbf, 0x72, 0x93, 0x44, 0xf5, - 0x3f, 0xe2, 0x26, 0x39, 0x80, 0x85, 0x89, 0x37, 0xc9, 0x01, 0xed, 0x2e, 0xa1, 0x99, 0x6a, 0x1f, - 0x29, 0x84, 0xb3, 0xc1, 0x4f, 0x48, 0x87, 0xda, 0x09, 0x2b, 0x81, 0x79, 0xcb, 0xf6, 0xa1, 0x6b, - 0x9b, 0xdd, 0xe5, 0xae, 0xb9, 0x1d, 0xd8, 0xa7, 0xfd, 0xdb, 0x1f, 0x55, 0x26, 0x8f, 0xc1, 0x7f, - 0xa1, 0x9e, 0x01, 0xc0, 0x87, 0xbb, 0xbd, 0xae, 0xe9, 0x47, 0xaa, 0xc7, 0xa4, 0xb0, 0xda, 0x97, - 0xe7, 0xb5, 0xef, 0x76, 0x70, 0x15, 0x01, 0xad, 0xb5, 0xdf, 0x83, 0x1b, 0xb6, 0xf5, 0xec, 0x3d, - 0x1c, 0x29, 0x99, 0xe8, 0xe8, 0xa0, 0x57, 0xdc, 0x7e, 0x50, 0x91, 0xdf, 0x0f, 0x52, 0xef, 0x06, - 0xd7, 0xe0, 0x20, 0xd8, 0xf8, 0xc6, 0x90, 0xf3, 0x56, 0x67, 0x1b, 0xfa, 0xd5, 0xad, 0x35, 0xcb, - 0xf3, 0x2c, 0x7b, 0x1b, 0x4f, 0xce, 0xa7, 0x8d, 0xf8, 0x0c, 0xda, 0xdf, 0x0a, 0x47, 0x61, 0x0a, - 0xfa, 0x8c, 0x21, 0x51, 0x98, 0xc2, 0x76, 0x2a, 0xf7, 0xb5, 0xd3, 0x70, 0x8d, 0x27, 0x2f, 0xb0, - 0xc6, 0xc3, 0x62, 0x5a, 0x10, 0x5c, 0x2b, 0x78, 0xad, 0x50, 0x98, 0xa7, 0xa4, 0x6a, 0x4c, 0x60, - 0x4d, 0x48, 0x06, 0x0b, 0xa4, 0xe8, 0x25, 0xc7, 0xb9, 0xb4, 0x6b, 0xba, 0x97, 0xb4, 0x9f, 0x38, - 0xdc, 0x9e, 0x6e, 0xe2, 0x5e, 0x56, 0xdc, 0x06, 0x6d, 0x9f, 0xf2, 0xe6, 0xfb, 0x95, 0x57, 0xfb, - 0xac, 0xf0, 0x94, 0x84, 0x93, 0x67, 0x50, 0xa9, 0xc9, 0x6c, 0x76, 0x89, 0x1d, 0x76, 0x14, 0x61, - 0x30, 0x7b, 0xe0, 0x7f, 0x33, 0x04, 0x3e, 0x18, 0x47, 0xd8, 0x7d, 0x82, 0x71, 0xe2, 0xae, 0x7d, - 0x65, 0x34, 0xec, 0x02, 0xbe, 0x46, 0xc0, 0x4e, 0x01, 0xf2, 0xa5, 0xd0, 0x35, 0x09, 0xfd, 0x65, - 0x2b, 0x94, 0xcf, 0x0e, 0xcd, 0x18, 0x96, 0x27, 0x82, 0xe6, 0x49, 0x9e, 0x85, 0x46, 0x2f, 0x53, - 0x4c, 0xbf, 0x24, 0xbc, 0xff, 0x36, 0x50, 0x40, 0x84, 0xbb, 0xc9, 0xb4, 0x4a, 0xb1, 0xcd, 0x3b, - 0x71, 0x36, 0xb3, 0x47, 0xf3, 0xc5, 0x05, 0x30, 0x13, 0x44, 0xc3, 0xc2, 0xf7, 0x0b, 0x86, 0x18, - 0x9e, 0x02, 0x45, 0xcf, 0xd9, 0x73, 0xdb, 0x90, 0xee, 0x88, 0xd2, 0xa7, 0x11, 0x76, 0xef, 0x86, - 0x9a, 0x0b, 0x07, 0x2c, 0x92, 0x7c, 0x6a, 0x8b, 0x24, 0xde, 0xde, 0x4d, 0xb0, 0x1f, 0xb4, 0x97, - 0x08, 0x5f, 0x02, 0xc2, 0x61, 0xd6, 0x84, 0xfe, 0x23, 0xd1, 0x08, 0xf8, 0x35, 0xa1, 0xbd, 0xa1, - 0x21, 0x35, 0x49, 0xa7, 0x72, 0x8d, 0x11, 0xec, 0xe0, 0x47, 0x83, 0x47, 0x05, 0x39, 0xa8, 0x01, - 0x8c, 0x0d, 0xde, 0x0d, 0xa3, 0xa6, 0xc8, 0xda, 0xf3, 0xf2, 0x40, 0x21, 0xac, 0x35, 0x42, 0x5b, - 0x50, 0x7b, 0x79, 0xee, 0xa8, 0x0d, 0xde, 0xf8, 0x19, 0xec, 0xef, 0x4a, 0xa2, 0xa1, 0xc3, 0x39, - 0xc1, 0x47, 0xb5, 0x8b, 0xd1, 0xa4, 0x11, 0x9a, 0x59, 0x82, 0xf2, 0x69, 0x6f, 0xc9, 0x89, 0x44, - 0x22, 0x17, 0x63, 0x31, 0xfb, 0x5e, 0xe9, 0x1b, 0xf9, 0x20, 0xa8, 0xe1, 0xb2, 0xeb, 0xec, 0x6e, - 0xb8, 0x5d, 0xed, 0xdf, 0x85, 0x2e, 0x7a, 0x88, 0x99, 0x5d, 0x48, 0xf1, 0xb3, 0x0b, 0xbc, 0x22, - 0xdd, 0x8d, 0x36, 0xc6, 0xba, 0x23, 0x0c, 0xdf, 0xea, 0x4d, 0x60, 0xc1, 0xec, 0x74, 0xd6, 0xcd, - 0x6d, 0x58, 0x46, 0xd3, 0x76, 0xdb, 0xa7, 0x01, 0xcf, 0xfa, 0x52, 0x13, 0xa7, 0x32, 0x7c, 0x1f, - 0x39, 0x75, 0xc0, 0x2a, 0x15, 0x5f, 0x86, 0xe5, 0x40, 0xa4, 0xf2, 0x9b, 0xc8, 0xf0, 0x87, 0x86, - 0x8c, 0xf6, 0x8e, 0x19, 0x85, 0x67, 0xa4, 0x4f, 0x82, 0x9e, 0x59, 0x02, 0x7c, 0x67, 0xaf, 0x79, - 0xbf, 0x22, 0x81, 0x29, 0x84, 0x47, 0xa9, 0xd3, 0xd1, 0x1e, 0xcb, 0x45, 0x31, 0x8d, 0xf5, 0x8d, - 0x7b, 0xa1, 0xb0, 0x53, 0x62, 0x50, 0x43, 0x42, 0x3f, 0x06, 0x93, 0x48, 0x88, 0x12, 0x27, 0x44, - 0x31, 0xdf, 0xc3, 0xc4, 0x22, 0xb2, 0x17, 0xdf, 0xa7, 0x25, 0x30, 0x1f, 0xcc, 0x33, 0x96, 0xa1, - 0xdf, 0xde, 0xd1, 0xee, 0x14, 0x5d, 0xe7, 0xa2, 0x2d, 0x31, 0xdc, 0x12, 0xee, 0x6a, 0xdf, 0xca, - 0xa5, 0x54, 0x79, 0xae, 0xe4, 0x98, 0x45, 0xc2, 0x54, 0xba, 0x98, 0x44, 0x30, 0x7b, 0x61, 0x7e, - 0x59, 0x02, 0xa0, 0xe5, 0x84, 0x93, 0xe5, 0x43, 0x48, 0xf2, 0x27, 0x85, 0x77, 0x8b, 0x69, 0xc5, - 0xa3, 0x62, 0xd3, 0xf7, 0x1c, 0x82, 0xae, 0x55, 0xc3, 0x4a, 0x9a, 0x48, 0x5b, 0x9f, 0xa9, 0xec, - 0xf5, 0xba, 0x56, 0xdb, 0xf4, 0xfb, 0xfd, 0x01, 0xe3, 0xc5, 0x8b, 0x2f, 0xe7, 0x4e, 0x65, 0x34, - 0x86, 0x65, 0xc4, 0xc8, 0x92, 0x44, 0xfd, 0x91, 0x82, 0xa8, 0x3f, 0x82, 0x3e, 0x3e, 0x43, 0x88, - 0x4f, 0x40, 0x3d, 0x65, 0x70, 0xbc, 0xd1, 0x83, 0xf6, 0x92, 0x0b, 0xcd, 0x4e, 0xdb, 0xdd, 0xdb, - 0xbd, 0xe8, 0xb1, 0xce, 0xac, 0xc9, 0x3a, 0xca, 0xac, 0x5c, 0x4b, 0xdc, 0xca, 0xb5, 0xf6, 0xc3, - 0xb2, 0x68, 0x5c, 0x36, 0x66, 0x7f, 0x85, 0xe1, 0x61, 0x84, 0xa1, 0x2e, 0x95, 0x0b, 0x56, 0xdf, - 0x22, 0x75, 0x3e, 0xcd, 0x22, 0xf5, 0x9b, 0x85, 0xa2, 0xbc, 0x09, 0xd5, 0x6b, 0x22, 0x9e, 0x74, - 0x0b, 0x4d, 0xe8, 0xc7, 0xc0, 0x7b, 0x23, 0x98, 0xbf, 0x18, 0xbd, 0x09, 0x21, 0xe6, 0x13, 0x07, - 0xf8, 0xb7, 0xbe, 0x35, 0xed, 0x0a, 0x0d, 0xcf, 0x42, 0x0c, 0xba, 0x21, 0x82, 0x92, 0x88, 0x13, - 0x5d, 0xaa, 0xe5, 0x96, 0xc4, 0xf2, 0xb3, 0x47, 0xe1, 0xe3, 0x12, 0x98, 0xc5, 0x57, 0x8e, 0x2f, - 0xed, 0xe3, 0x63, 0x9d, 0x82, 0x46, 0xc9, 0x8b, 0x59, 0x31, 0xab, 0x20, 0xdf, 0xb5, 0xec, 0x4b, - 0x81, 0xf7, 0x23, 0xfa, 0x1f, 0x5d, 0x58, 0x2a, 0x0d, 0xb8, 0xb0, 0x34, 0xdc, 0x26, 0x09, 0xcb, - 0x8d, 0x19, 0x4d, 0xdf, 0x90, 0x13, 0xb9, 0xb0, 0x74, 0x28, 0xb9, 0xec, 0xc5, 0xf8, 0xd7, 0x79, - 0x50, 0x6c, 0x42, 0xd3, 0x6d, 0xef, 0x68, 0xef, 0x97, 0x06, 0x4e, 0x25, 0xa6, 0xf9, 0xa9, 0xc4, - 0x32, 0x98, 0xda, 0xb2, 0xba, 0x3e, 0x74, 0x89, 0x47, 0x38, 0xdb, 0xb5, 0x93, 0x26, 0xbe, 0xd4, - 0x75, 0xda, 0x97, 0x16, 0xa9, 0x69, 0xbf, 0x18, 0x44, 0x8f, 0x5e, 0x5c, 0xc6, 0x1f, 0x19, 0xc1, - 0xc7, 0xc8, 0x20, 0xf4, 0x1c, 0xd7, 0x8f, 0xbb, 0x8d, 0x28, 0x86, 0x4a, 0xd3, 0x71, 0x7d, 0x83, - 0x7c, 0x88, 0x60, 0xde, 0xda, 0xeb, 0x76, 0x5b, 0xf0, 0x41, 0x3f, 0x98, 0xd6, 0x05, 0xcf, 0xc8, - 0x58, 0x74, 0xb6, 0xb6, 0x3c, 0x48, 0x16, 0x15, 0x0a, 0x06, 0x7d, 0x52, 0x4f, 0x82, 0x42, 0xd7, - 0xda, 0xb5, 0xc8, 0x44, 0xa4, 0x60, 0x90, 0x07, 0xf5, 0x16, 0xa0, 0x44, 0x73, 0x20, 0xc2, 0xe8, - 0xe9, 0x22, 0x6e, 0x9a, 0x07, 0xd2, 0x91, 0xce, 0x5c, 0x82, 0xfb, 0xde, 0xe9, 0x29, 0xfc, 0x1e, - 0xff, 0xe7, 0x8f, 0xdf, 0x88, 0x6c, 0x98, 0x10, 0x89, 0xc7, 0xcf, 0x70, 0x5d, 0xd8, 0x76, 0xdc, - 0x4e, 0x20, 0x9b, 0xf8, 0x09, 0x06, 0xcd, 0x97, 0x6e, 0x9b, 0x63, 0x60, 0xe1, 0xd9, 0x6b, 0xda, - 0x7b, 0x8a, 0xa8, 0xdb, 0x44, 0x45, 0x9f, 0xb7, 0xfc, 0x9d, 0x35, 0xe8, 0x9b, 0xda, 0x5f, 0xcb, - 0x03, 0x35, 0x6e, 0xf6, 0xff, 0xd3, 0xb8, 0x21, 0x1a, 0x47, 0x22, 0x80, 0xf9, 0x7b, 0xae, 0x8d, - 0xe4, 0x48, 0xbd, 0x6a, 0x99, 0x14, 0xf5, 0x6e, 0x70, 0x4d, 0xf4, 0x14, 0x2c, 0xa5, 0x56, 0x18, - 0x47, 0xdb, 0x69, 0x23, 0x3e, 0x83, 0xba, 0x0e, 0x6e, 0x20, 0x2f, 0x57, 0x5b, 0x6b, 0xb5, 0x55, - 0x6b, 0x7b, 0xa7, 0x6b, 0x6d, 0xef, 0xf8, 0x5e, 0xd5, 0xf6, 0x7c, 0x68, 0x76, 0x1a, 0x5b, 0x06, - 0xb9, 0x47, 0x0c, 0x60, 0x3a, 0x22, 0x59, 0x79, 0x8f, 0x71, 0xb1, 0xd1, 0x8d, 0xd5, 0x94, 0x98, - 0x96, 0xf2, 0x14, 0xd4, 0x52, 0xbc, 0xbd, 0x6e, 0x88, 0xe9, 0xb5, 0x7d, 0x98, 0x46, 0xaa, 0xbe, - 0xd7, 0xc5, 0xcd, 0x05, 0x67, 0x4e, 0x3b, 0xce, 0x25, 0x70, 0x92, 0x7d, 0xb3, 0xf9, 0xf7, 0x22, - 0x28, 0xac, 0xb8, 0x66, 0x6f, 0x47, 0x7b, 0x1e, 0xd3, 0x3f, 0x8f, 0xab, 0x4d, 0x84, 0xda, 0x29, - 0x0d, 0xd3, 0x4e, 0x79, 0x88, 0x76, 0xe6, 0x19, 0xed, 0x8c, 0x5f, 0x74, 0x3e, 0x0b, 0xe6, 0xda, - 0x4e, 0xb7, 0x0b, 0xdb, 0x48, 0x1e, 0xd5, 0x0e, 0x5e, 0xed, 0x99, 0x31, 0xb8, 0x34, 0x1c, 0x61, - 0x1f, 0xfa, 0x4d, 0xb2, 0xc6, 0x4e, 0x94, 0x3e, 0x4a, 0xd0, 0x5e, 0x2e, 0x81, 0xbc, 0xde, 0xd9, - 0x86, 0xdc, 0x3a, 0x7c, 0x8e, 0x59, 0x87, 0x3f, 0x05, 0x8a, 0xbe, 0xe9, 0x6e, 0x43, 0x3f, 0x58, - 0x27, 0x20, 0x4f, 0x61, 0xe0, 0x7f, 0x99, 0x09, 0xfc, 0xff, 0xdd, 0x20, 0x8f, 0x64, 0x46, 0x9d, - 0xe4, 0x6f, 0x18, 0x04, 0x3f, 0x96, 0xfd, 0x22, 0x2a, 0x71, 0x11, 0xd5, 0xda, 0xc0, 0x1f, 0xf4, - 0x63, 0x5d, 0x38, 0x18, 0x98, 0xf6, 0x5a, 0x30, 0x63, 0xb5, 0x1d, 0xbb, 0xba, 0x6b, 0x6e, 0x43, - 0x5a, 0xcd, 0x28, 0x21, 0x78, 0xab, 0xef, 0x3a, 0x0f, 0x58, 0x74, 0x51, 0x2b, 0x4a, 0x40, 0x55, - 0xd8, 0xb1, 0x3a, 0x1d, 0x68, 0xd3, 0x96, 0x4d, 0x9f, 0xce, 0x9e, 0x01, 0x79, 0xc4, 0x03, 0xd2, - 0x1f, 0x64, 0x2c, 0x28, 0xc7, 0xd4, 0x39, 0xd4, 0xac, 0x48, 0xe3, 0x55, 0x72, 0xfc, 0x9a, 0xab, - 0x88, 0xd7, 0x10, 0xa9, 0xdc, 0xe0, 0xc6, 0xf5, 0x04, 0x50, 0xb0, 0x9d, 0x0e, 0x1c, 0x3a, 0x08, - 0x91, 0x5c, 0xea, 0x93, 0x41, 0x01, 0x76, 0x50, 0xaf, 0x20, 0xe3, 0xec, 0x67, 0x92, 0x65, 0x69, - 0x90, 0xcc, 0xe9, 0x5c, 0x93, 0x06, 0x71, 0x9b, 0x7d, 0x03, 0xfc, 0xd1, 0x29, 0x70, 0x9c, 0xf4, - 0x01, 0xcd, 0xbd, 0x8b, 0x88, 0xd4, 0x45, 0xa8, 0xbd, 0x7e, 0xf0, 0xc0, 0x75, 0x9c, 0x57, 0xf6, - 0x93, 0xa0, 0xe0, 0xed, 0x5d, 0x0c, 0x8d, 0x50, 0xf2, 0xc0, 0x36, 0x5d, 0x69, 0x2c, 0xc3, 0x99, - 0x3c, 0xea, 0x70, 0xc6, 0x0d, 0x4d, 0x72, 0xd0, 0xf8, 0xa3, 0x81, 0x8c, 0x1c, 0xef, 0x08, 0x06, - 0xb2, 0x41, 0xc3, 0xd0, 0x69, 0x30, 0x65, 0x6e, 0xf9, 0xd0, 0x8d, 0xcc, 0x44, 0xfa, 0x88, 0x86, - 0xca, 0x8b, 0x70, 0xcb, 0x71, 0x91, 0x58, 0x48, 0x90, 0xd8, 0xf0, 0x99, 0x69, 0xb9, 0x80, 0xdb, - 0x41, 0xbb, 0x15, 0x9c, 0xb0, 0x9d, 0x0a, 0xec, 0x51, 0x39, 0x13, 0x14, 0xe7, 0xc9, 0x5d, 0xed, - 0x07, 0x5e, 0x1c, 0xe8, 0x4a, 0x16, 0x0e, 0x76, 0x25, 0xda, 0xe7, 0xd2, 0xce, 0x99, 0xfb, 0x80, - 0x1e, 0x9b, 0x85, 0xa6, 0x3e, 0x0d, 0xcc, 0x75, 0xa8, 0x87, 0x58, 0xdb, 0x0a, 0x5b, 0x49, 0xec, - 0x77, 0x5c, 0xe6, 0x48, 0x91, 0xf2, 0xac, 0x22, 0xad, 0x80, 0x69, 0x7c, 0x10, 0x1b, 0x69, 0x52, - 0xa1, 0xcf, 0x23, 0x1f, 0x4f, 0xeb, 0xc2, 0x4a, 0x31, 0x62, 0x5b, 0x2c, 0xd3, 0x4f, 0x8c, 0xf0, - 0xe3, 0x74, 0xb3, 0xef, 0x64, 0x09, 0x65, 0xdf, 0x1c, 0x7f, 0xa9, 0x08, 0xae, 0x29, 0xbb, 0x8e, - 0xe7, 0xe1, 0x63, 0x38, 0xfd, 0x0d, 0xf3, 0x8d, 0x12, 0x77, 0x05, 0xd0, 0x23, 0xba, 0xf9, 0x0d, - 0x6a, 0x50, 0x93, 0x6b, 0x1a, 0x7f, 0x21, 0x1c, 0xc2, 0x26, 0xdc, 0x7f, 0x88, 0x11, 0xfa, 0x7f, - 0x8d, 0x46, 0xf2, 0x9e, 0x9c, 0x48, 0x54, 0x9d, 0x94, 0xb2, 0xca, 0xbe, 0xb9, 0x7c, 0x49, 0x02, - 0x8f, 0xee, 0xe7, 0x66, 0xc3, 0xf6, 0xc2, 0x06, 0x73, 0xdd, 0x90, 0xf6, 0xc2, 0x47, 0x61, 0x49, - 0xbc, 0xf1, 0x37, 0xa6, 0xee, 0x4c, 0x69, 0x31, 0x8b, 0x25, 0xd1, 0x81, 0x9e, 0xa4, 0x1b, 0x7f, - 0x53, 0x93, 0xcf, 0x5e, 0xb8, 0xbf, 0x9b, 0x07, 0xc7, 0x57, 0x5c, 0x67, 0xaf, 0xe7, 0x45, 0x3d, - 0xd0, 0x9f, 0x0c, 0xde, 0x90, 0x2d, 0x8a, 0x98, 0x06, 0xd7, 0x83, 0x59, 0x97, 0x5a, 0x73, 0xd1, - 0xf6, 0x2c, 0x9b, 0xc4, 0xf6, 0x5e, 0xf2, 0x61, 0x7a, 0xaf, 0xa8, 0x9f, 0xc9, 0x73, 0xfd, 0x4c, - 0x7f, 0xcf, 0x51, 0x18, 0xd0, 0x73, 0xfc, 0xb1, 0x94, 0x72, 0x50, 0xed, 0x13, 0x51, 0x4c, 0x7f, - 0x51, 0x06, 0xc5, 0x6d, 0x9c, 0x91, 0x76, 0x17, 0x8f, 0x17, 0xab, 0x19, 0x26, 0x6e, 0xd0, 0x4f, - 0x23, 0xb9, 0xca, 0xac, 0x0e, 0xa7, 0x1a, 0xe0, 0x92, 0xb9, 0xcd, 0x5e, 0xa9, 0x1e, 0xce, 0x83, - 0xb9, 0xb0, 0xf4, 0x6a, 0xc7, 0xe3, 0x62, 0xbd, 0x32, 0x1a, 0x35, 0x2f, 0xa2, 0x51, 0x07, 0xd6, - 0x99, 0xc3, 0x51, 0x47, 0x66, 0x46, 0x9d, 0x81, 0xa3, 0xcb, 0x5c, 0xcc, 0xe8, 0xa2, 0x3d, 0x57, - 0x16, 0xbd, 0x44, 0x8f, 0xef, 0x5a, 0x71, 0x6d, 0x1e, 0xc9, 0x83, 0x85, 0xe0, 0x55, 0x7e, 0xc3, - 0x6b, 0x95, 0xbd, 0x92, 0x7c, 0x58, 0x02, 0x27, 0x0e, 0x76, 0xe6, 0xdf, 0xc1, 0x7b, 0xa9, 0xa1, - 0x3a, 0x79, 0xa1, 0x97, 0x1a, 0x7e, 0xe2, 0x37, 0xe9, 0x12, 0x43, 0xa2, 0x70, 0xf6, 0xde, 0xf0, - 0x4e, 0x5c, 0x2c, 0xe8, 0x89, 0x20, 0xd1, 0xec, 0x05, 0xf8, 0x53, 0x32, 0x98, 0x69, 0x42, 0xbf, - 0x66, 0xee, 0x3b, 0x7b, 0xbe, 0x66, 0x8a, 0x6e, 0xcf, 0x3d, 0x15, 0x14, 0xbb, 0xf8, 0x13, 0xdc, - 0xc1, 0xb0, 0x21, 0x48, 0xd9, 0xfd, 0x2d, 0xec, 0x1b, 0x44, 0x48, 0x1b, 0x34, 0x3f, 0x1f, 0x8b, - 0x46, 0x64, 0x77, 0x34, 0xe4, 0x6e, 0x2c, 0x5b, 0x3b, 0xa9, 0xf6, 0x4e, 0xe3, 0x8a, 0xce, 0x1e, - 0x96, 0x1f, 0x96, 0xc1, 0x7c, 0x13, 0xfa, 0x55, 0x6f, 0xd9, 0xbc, 0xec, 0xb8, 0x96, 0x0f, 0xb5, - 0x15, 0x51, 0x68, 0xce, 0x00, 0x60, 0x85, 0x9f, 0xd1, 0x08, 0x59, 0x4c, 0x8a, 0xf6, 0x96, 0xb4, - 0x8e, 0x42, 0x1c, 0x1f, 0x63, 0x01, 0x21, 0x95, 0x8f, 0x45, 0x52, 0xf1, 0x13, 0xb8, 0x06, 0x5c, - 0xa2, 0x40, 0x94, 0xdc, 0xf6, 0x8e, 0x75, 0x19, 0x76, 0x52, 0x02, 0x11, 0x7c, 0x16, 0x01, 0x11, - 0x12, 0x4a, 0xed, 0xbe, 0xc2, 0xf1, 0x31, 0x0e, 0xf7, 0x95, 0x24, 0x82, 0x13, 0x09, 0x72, 0x85, - 0xba, 0x1e, 0xba, 0x9e, 0x79, 0xaf, 0xa8, 0x58, 0x23, 0x93, 0x4d, 0x62, 0x4d, 0xb6, 0x91, 0x3a, - 0x16, 0x52, 0xf6, 0x30, 0x9d, 0xce, 0x67, 0xd1, 0xb1, 0x0c, 0x2c, 0x3a, 0x7b, 0xa1, 0xbf, 0x4f, - 0x06, 0x57, 0x87, 0xd1, 0x5f, 0x9a, 0xd0, 0xaf, 0x98, 0xde, 0xce, 0x45, 0xc7, 0x74, 0x3b, 0x5a, - 0x79, 0x0c, 0x07, 0x0e, 0xb5, 0x3f, 0x64, 0x41, 0xa8, 0xf3, 0x20, 0x0c, 0x74, 0x25, 0x1d, 0xc8, - 0xcb, 0x38, 0x3a, 0x99, 0x44, 0x6f, 0xd7, 0x77, 0x84, 0x60, 0x3d, 0x93, 0x03, 0xeb, 0x9e, 0x51, - 0x59, 0xcc, 0x1e, 0xb8, 0x9f, 0x25, 0x23, 0x02, 0xe3, 0xf5, 0x7c, 0x41, 0x14, 0xb0, 0x18, 0xaf, - 0x57, 0x39, 0xd6, 0xeb, 0x75, 0xa4, 0x31, 0x62, 0xa8, 0xc7, 0x72, 0xb6, 0x63, 0xc4, 0x11, 0x7a, - 0x23, 0xbf, 0x4b, 0x06, 0x0a, 0x0e, 0xff, 0xc5, 0x78, 0x84, 0xb3, 0xd1, 0xb4, 0x93, 0xd1, 0x39, - 0xe0, 0x7d, 0x3e, 0x95, 0xd6, 0xfb, 0x5c, 0x7b, 0x67, 0x5a, 0x1f, 0xf3, 0x7e, 0x6e, 0xc7, 0x82, - 0x58, 0x2a, 0x17, 0xf2, 0x21, 0x1c, 0x64, 0x0f, 0xda, 0x8f, 0xc9, 0x00, 0xa0, 0x06, 0x4d, 0xcf, - 0x46, 0x3c, 0x4b, 0x14, 0xae, 0xdb, 0x58, 0xbf, 0x7b, 0x04, 0xd4, 0xd5, 0x7d, 0x40, 0x11, 0x8a, - 0xd1, 0xa9, 0x8b, 0xd7, 0xa7, 0xf5, 0xad, 0x8c, 0xb8, 0x1a, 0x0b, 0x2c, 0xa9, 0xbc, 0x2d, 0x63, - 0xcb, 0xce, 0x1e, 0x90, 0xff, 0x29, 0x81, 0x42, 0xcb, 0x69, 0x42, 0xff, 0xf0, 0xa6, 0x40, 0xea, - 0xa8, 0x01, 0xb8, 0xdc, 0x71, 0x44, 0x0d, 0x18, 0x44, 0x28, 0x7b, 0xd1, 0xbd, 0x57, 0x02, 0x73, - 0x2d, 0xa7, 0x1c, 0x2e, 0x4e, 0x89, 0xfb, 0xaa, 0xfe, 0x6b, 0x2e, 0xe5, 0x1a, 0x06, 0x5b, 0x4c, - 0x8c, 0xc0, 0x52, 0xad, 0x1e, 0x24, 0xd0, 0xcb, 0x5e, 0x6e, 0x77, 0x82, 0xe3, 0x1b, 0x76, 0xc7, - 0x31, 0x60, 0xc7, 0xa1, 0x2b, 0xdd, 0xaa, 0x0a, 0xf2, 0x7b, 0x76, 0xc7, 0xc1, 0x2c, 0x17, 0x0c, - 0xfc, 0x1f, 0xa5, 0xb9, 0xb0, 0xe3, 0x50, 0xdf, 0x00, 0xfc, 0x5f, 0xfb, 0x0b, 0x19, 0xe4, 0xd1, - 0xb7, 0xe2, 0xa2, 0x7e, 0x97, 0x9c, 0x32, 0x0e, 0x02, 0x22, 0x3f, 0x16, 0x4b, 0xe8, 0x5e, 0x66, - 0xed, 0x9f, 0x78, 0xb0, 0xde, 0x10, 0x57, 0x1e, 0x23, 0x8a, 0x68, 0xcd, 0x5f, 0x3d, 0x0d, 0xa6, - 0x2e, 0x76, 0x9d, 0xf6, 0xa5, 0xe8, 0xb8, 0x3e, 0x7d, 0x54, 0x6f, 0x01, 0x05, 0xd7, 0xb4, 0xb7, - 0x21, 0xdd, 0x53, 0x38, 0xd9, 0xd7, 0x17, 0x62, 0xaf, 0x17, 0x83, 0x64, 0xd1, 0xde, 0x99, 0x26, - 0x02, 0xc3, 0x80, 0xca, 0xa7, 0xd3, 0x87, 0xca, 0x08, 0x27, 0xcf, 0x14, 0x30, 0x57, 0x2e, 0xd5, - 0xc9, 0xad, 0x86, 0x8d, 0x73, 0xba, 0x22, 0x63, 0x98, 0x91, 0x4c, 0x32, 0x84, 0x19, 0x91, 0xff, - 0x2f, 0x0b, 0xf3, 0x80, 0xca, 0x1f, 0x05, 0xcc, 0x9f, 0x96, 0xc0, 0x7c, 0xcd, 0xf2, 0xfc, 0x38, - 0x6f, 0xff, 0x84, 0xe8, 0xbf, 0x2f, 0x49, 0x6b, 0x2a, 0x73, 0xe5, 0x08, 0x87, 0xfd, 0x4d, 0x65, - 0x0e, 0x27, 0x15, 0x31, 0x99, 0x63, 0x29, 0x98, 0x03, 0x72, 0xa5, 0xbd, 0xb0, 0x24, 0x53, 0x1b, - 0x4a, 0x51, 0x21, 0x93, 0x37, 0x94, 0x62, 0xcb, 0xce, 0x5e, 0xbe, 0x7f, 0x21, 0x81, 0x13, 0xa8, - 0xf8, 0xa4, 0x65, 0xa9, 0x78, 0x31, 0x0f, 0x5d, 0x96, 0x4a, 0xbd, 0x32, 0x7e, 0x80, 0x97, 0x71, - 0xac, 0x8c, 0x0f, 0x23, 0x3a, 0x61, 0x31, 0xc7, 0x2c, 0xc3, 0x0e, 0x13, 0x73, 0xc2, 0x32, 0xec, - 0xe8, 0x62, 0x4e, 0x5e, 0x8a, 0x1d, 0x51, 0xcc, 0x47, 0xb6, 0xc0, 0xfa, 0x0b, 0x72, 0x28, 0xe6, - 0xd8, 0xb5, 0x8d, 0x04, 0x31, 0xa7, 0x3e, 0xd1, 0xab, 0xbd, 0x7b, 0x44, 0xc1, 0x8f, 0x79, 0x7d, - 0x63, 0x14, 0x98, 0x8e, 0x70, 0x8d, 0xe3, 0xe7, 0x64, 0xb0, 0x40, 0xb9, 0x18, 0x3c, 0x65, 0x4e, - 0xc0, 0x28, 0xf5, 0x94, 0x39, 0xf5, 0x19, 0x20, 0x9e, 0xb3, 0xc9, 0x9f, 0x01, 0x4a, 0x2c, 0x3f, - 0x7b, 0x70, 0xfe, 0x2a, 0x0f, 0x4e, 0x21, 0x16, 0xd6, 0x9c, 0x8e, 0xb5, 0xb5, 0x4f, 0xb8, 0x38, - 0x67, 0x76, 0xf7, 0xa0, 0xa7, 0x7d, 0x40, 0x12, 0x45, 0xe9, 0xbf, 0x03, 0xe0, 0xf4, 0xa0, 0x4b, - 0xe2, 0xb8, 0x51, 0xa0, 0xee, 0x8e, 0xab, 0xec, 0xc1, 0x92, 0xc2, 0xcb, 0x70, 0x1a, 0x01, 0x11, - 0x83, 0xa1, 0x87, 0xac, 0xc2, 0x99, 0xf0, 0x4d, 0xbf, 0x83, 0x47, 0xee, 0xa0, 0x83, 0xc7, 0xcd, - 0x40, 0x36, 0x3b, 0x9d, 0x10, 0xaa, 0xfe, 0xcd, 0x6c, 0x5c, 0xa6, 0x81, 0xb2, 0xa0, 0x9c, 0x1e, - 0x8c, 0x8e, 0xe6, 0xc5, 0xe4, 0xf4, 0xa0, 0xaf, 0x2e, 0x82, 0x22, 0xb9, 0x1c, 0x3c, 0x5c, 0xd1, - 0x1f, 0x9c, 0x99, 0xe6, 0xe2, 0x4d, 0xbb, 0x06, 0xaf, 0x86, 0x77, 0xa6, 0x92, 0xcc, 0xa0, 0x7e, - 0x3a, 0xb2, 0x93, 0x0d, 0x4e, 0xc1, 0x9e, 0x3e, 0x32, 0xe5, 0xc9, 0xec, 0x86, 0x95, 0x7a, 0xbd, - 0xee, 0x7e, 0x8b, 0x06, 0x1e, 0x48, 0xb5, 0x1b, 0xc6, 0xc4, 0x2f, 0x90, 0x0e, 0xc4, 0x2f, 0x48, - 0xbd, 0x1b, 0xc6, 0xf1, 0x31, 0x8e, 0xdd, 0xb0, 0x24, 0x82, 0x13, 0xb9, 0x95, 0x07, 0x5b, 0xcd, - 0xf4, 0x6e, 0x82, 0x7f, 0x1c, 0xec, 0x59, 0x0d, 0x78, 0x67, 0x97, 0x41, 0xd7, 0x16, 0x24, 0xde, - 0xc9, 0xa2, 0x3e, 0x19, 0x14, 0xb7, 0x1c, 0x77, 0xd7, 0x0c, 0x36, 0xee, 0xfb, 0x4f, 0x8a, 0xd0, - 0xfb, 0x00, 0x96, 0x71, 0x1e, 0x83, 0xe6, 0x45, 0xf3, 0x91, 0xe7, 0x58, 0x3d, 0x1a, 0xf4, 0x11, - 0xfd, 0x55, 0x6f, 0x04, 0xf3, 0x34, 0xf6, 0x63, 0x1d, 0x7a, 0x3e, 0xec, 0xd0, 0x88, 0x16, 0x7c, - 0xa2, 0x7a, 0x16, 0xcc, 0xd1, 0x84, 0x65, 0xab, 0x0b, 0x3d, 0x1a, 0xd4, 0x82, 0x4b, 0x53, 0x4f, - 0x81, 0xa2, 0xe5, 0xdd, 0xe7, 0x39, 0x36, 0x0d, 0xc8, 0x47, 0x9f, 0xd4, 0x9b, 0xc1, 0x71, 0x9a, - 0x2f, 0x34, 0x56, 0xc9, 0x81, 0x9d, 0xfe, 0x64, 0xa4, 0x5a, 0xb6, 0xb3, 0xee, 0x3a, 0xdb, 0x2e, - 0xf4, 0x3c, 0x7c, 0x6a, 0x6a, 0xda, 0x60, 0x52, 0xd4, 0x0b, 0xe0, 0x44, 0xd7, 0xb2, 0x2f, 0x79, - 0x38, 0x46, 0xf0, 0x32, 0x75, 0x1b, 0x9b, 0x1b, 0x10, 0xbb, 0x9b, 0x69, 0x6c, 0x54, 0x0e, 0xec, - 0x27, 0xc6, 0x41, 0x2a, 0x4c, 0x94, 0xfc, 0x25, 0xb3, 0x7d, 0x09, 0xbf, 0xa7, 0xee, 0xa8, 0x07, - 0xd2, 0x19, 0x61, 0x90, 0x3b, 0x00, 0x16, 0x38, 0x61, 0xe0, 0x34, 0xed, 0x65, 0x39, 0x30, 0xc7, - 0x15, 0x60, 0x02, 0x35, 0xe8, 0x16, 0xbd, 0xf3, 0x3b, 0x96, 0x0f, 0x11, 0x73, 0xf4, 0xac, 0xcb, - 0x13, 0x87, 0x30, 0x6f, 0x1c, 0xf8, 0xd0, 0x18, 0x40, 0x0c, 0xf1, 0x45, 0x3a, 0x3c, 0xec, 0x59, - 0xe6, 0x51, 0x5b, 0x95, 0x4b, 0xd3, 0x9e, 0x03, 0xd4, 0x83, 0xd4, 0x18, 0x2f, 0x90, 0x5c, 0x3a, - 0x2f, 0x10, 0x24, 0x37, 0xb3, 0xdb, 0x75, 0xae, 0xc0, 0x4e, 0x48, 0x96, 0xea, 0xea, 0x81, 0x74, - 0xed, 0xf3, 0xa3, 0xcc, 0x0b, 0x53, 0x5f, 0xb3, 0x81, 0x1a, 0xd9, 0x5e, 0xbb, 0x0d, 0x61, 0x87, - 0x1e, 0x5c, 0x0b, 0x1e, 0x53, 0x5e, 0xc0, 0x91, 0x7a, 0x16, 0x79, 0x44, 0x37, 0x70, 0x7c, 0xf4, - 0x6a, 0x50, 0x24, 0xb7, 0xd9, 0x69, 0x2f, 0x5b, 0x18, 0xd8, 0xd7, 0x2c, 0xf0, 0x7d, 0xcd, 0x06, - 0x98, 0xb3, 0x1d, 0x54, 0xdc, 0xba, 0xe9, 0x9a, 0xbb, 0x5e, 0xd2, 0x22, 0x31, 0xa1, 0x1b, 0x5a, - 0x04, 0x75, 0xe6, 0xb3, 0xd5, 0x63, 0x06, 0x47, 0x46, 0xfd, 0xff, 0x81, 0xe3, 0x17, 0x69, 0x80, - 0x07, 0x8f, 0x52, 0x96, 0xe2, 0x5d, 0x28, 0xfb, 0x28, 0x2f, 0xf1, 0x5f, 0xae, 0x1e, 0x33, 0xfa, - 0x89, 0xa9, 0xff, 0x0d, 0x2c, 0xa0, 0xc7, 0x8e, 0x73, 0x25, 0x60, 0x5c, 0x8e, 0xb7, 0x23, 0xfb, - 0xc8, 0xaf, 0x71, 0x1f, 0xae, 0x1e, 0x33, 0xfa, 0x48, 0xa9, 0x0d, 0x00, 0x76, 0xfc, 0xdd, 0x2e, - 0x25, 0x9c, 0x8f, 0x57, 0xc9, 0x3e, 0xc2, 0xab, 0xe1, 0x47, 0xab, 0xc7, 0x0c, 0x86, 0x84, 0x5a, - 0x03, 0x33, 0xfe, 0x83, 0x3e, 0xa5, 0x57, 0x88, 0xf7, 0x5d, 0xe8, 0xa3, 0xd7, 0x0a, 0xbe, 0x59, - 0x3d, 0x66, 0x44, 0x04, 0xd4, 0x2a, 0x98, 0xee, 0x5d, 0xa4, 0xc4, 0x8a, 0xf1, 0xfd, 0x5d, 0x1f, - 0xb1, 0xf5, 0x8b, 0x21, 0xad, 0xf0, 0x73, 0xc4, 0x58, 0xdb, 0xbb, 0x4c, 0x69, 0x4d, 0x09, 0x33, - 0x56, 0x0e, 0xbe, 0x41, 0x8c, 0x85, 0x04, 0xd4, 0x2a, 0x98, 0xf1, 0x6c, 0xb3, 0xe7, 0xed, 0x38, - 0xbe, 0x77, 0x7a, 0xba, 0xcf, 0xcd, 0x35, 0x9e, 0x5a, 0x93, 0x7e, 0x63, 0x44, 0x5f, 0xab, 0x4f, - 0x06, 0x57, 0xef, 0xf5, 0x3a, 0xa6, 0x0f, 0xf5, 0x07, 0x2d, 0xcf, 0xb7, 0xec, 0xed, 0x20, 0x42, - 0x31, 0x19, 0x2c, 0x06, 0xbf, 0x54, 0x17, 0xe9, 0x81, 0x37, 0x80, 0xdb, 0xa6, 0xd6, 0xbf, 0xd7, - 0x4a, 0x8a, 0x65, 0xce, 0xb9, 0x3d, 0x0d, 0xe4, 0xd1, 0x2b, 0x3c, 0xb8, 0x2c, 0x0c, 0x5e, 0xc7, - 0xed, 0xd7, 0x1d, 0xdc, 0x80, 0xd1, 0x47, 0x7d, 0xe3, 0xd3, 0xdc, 0x81, 0xf1, 0xe9, 0x7a, 0x30, - 0x6b, 0x79, 0x6b, 0xd6, 0x36, 0x31, 0x8e, 0xe9, 0xf8, 0xc1, 0x26, 0x91, 0xc5, 0x84, 0x3a, 0xbc, - 0x42, 0x06, 0x8e, 0xe3, 0xc1, 0x62, 0x42, 0x90, 0xa2, 0xdd, 0x04, 0xe6, 0xd8, 0x46, 0x46, 0xae, - 0xc4, 0xb5, 0x22, 0xd3, 0x9a, 0x3e, 0x69, 0x37, 0x82, 0x05, 0x5e, 0xa7, 0x19, 0x0b, 0x42, 0x0e, - 0xba, 0x42, 0xed, 0x06, 0x70, 0xbc, 0xaf, 0x61, 0x05, 0x21, 0x63, 0x72, 0x51, 0xc8, 0x98, 0xeb, - 0x01, 0x88, 0xb4, 0x78, 0x20, 0x99, 0xeb, 0xc0, 0x4c, 0xa8, 0x97, 0x03, 0x33, 0xfc, 0x69, 0x0e, - 0x4c, 0x07, 0xca, 0x36, 0x28, 0x03, 0x1a, 0x99, 0x6c, 0x66, 0x7f, 0x28, 0x18, 0x99, 0xd8, 0x34, - 0x64, 0x26, 0x44, 0x5e, 0xd9, 0x2d, 0xcb, 0xef, 0x06, 0x27, 0x1b, 0xfb, 0x93, 0xd5, 0x75, 0x00, - 0x2c, 0x8c, 0x51, 0x2b, 0x3a, 0xea, 0x78, 0x7b, 0x8a, 0xf6, 0x40, 0xf4, 0x81, 0xa1, 0x71, 0xf6, - 0x3b, 0xe8, 0x39, 0xc4, 0x19, 0x50, 0x20, 0x61, 0xfa, 0x8f, 0xa9, 0x0b, 0x00, 0xe8, 0xcf, 0x5a, - 0xd7, 0x8d, 0xaa, 0x5e, 0x2f, 0xeb, 0x4a, 0x4e, 0x7b, 0x85, 0x04, 0x66, 0xc2, 0x46, 0x30, 0xb0, - 0x92, 0x3a, 0x55, 0xad, 0xa1, 0xb7, 0x8e, 0x1e, 0x6c, 0x54, 0xac, 0x92, 0x3d, 0x15, 0x3c, 0x6a, - 0xcf, 0x83, 0xcb, 0x96, 0xeb, 0xf9, 0x86, 0x73, 0x65, 0xd9, 0x71, 0xa3, 0x81, 0x95, 0x04, 0xb8, - 0x8d, 0x7b, 0x8d, 0x0c, 0xc6, 0x0e, 0xc4, 0x67, 0xde, 0xa0, 0x4b, 0x17, 0xfe, 0xa3, 0x04, 0x44, - 0xd7, 0x77, 0x4d, 0xdb, 0xeb, 0x39, 0x1e, 0x34, 0x9c, 0x2b, 0x5e, 0xc9, 0xee, 0x94, 0x9d, 0xee, - 0xde, 0xae, 0xed, 0x51, 0x93, 0x2f, 0xee, 0x35, 0x92, 0x0e, 0xbe, 0x53, 0x78, 0x01, 0x80, 0x72, - 0xa3, 0x56, 0xd3, 0xcb, 0xad, 0x6a, 0xa3, 0xae, 0x1c, 0x43, 0xd2, 0x6a, 0x95, 0x96, 0x6a, 0x48, - 0x3a, 0xdf, 0x0b, 0xa6, 0x83, 0x36, 0x4d, 0xa3, 0xdc, 0xe4, 0x82, 0x28, 0x37, 0x6a, 0x09, 0x4c, - 0x07, 0xad, 0x9c, 0x8e, 0x08, 0x8f, 0xed, 0x3f, 0xd5, 0xbc, 0x6b, 0xba, 0x3e, 0x36, 0x50, 0x02, - 0x22, 0x4b, 0xa6, 0x07, 0x8d, 0xf0, 0xb3, 0xb3, 0x4f, 0xa0, 0x1c, 0xa8, 0x60, 0xa1, 0x54, 0xab, - 0x6d, 0x36, 0x8c, 0xcd, 0x7a, 0xa3, 0xb5, 0x5a, 0xad, 0xaf, 0x90, 0x11, 0xb2, 0xba, 0x52, 0x6f, - 0x18, 0x3a, 0x19, 0x20, 0x9b, 0x4a, 0x8e, 0xdc, 0x69, 0xbd, 0x34, 0x0d, 0x8a, 0x3d, 0x2c, 0x5d, - 0xed, 0x4b, 0x72, 0xca, 0x70, 0x06, 0x21, 0x4e, 0x31, 0xb7, 0xee, 0x72, 0x47, 0x0a, 0xa4, 0x01, - 0x47, 0x7e, 0xcf, 0x82, 0x39, 0x62, 0xaa, 0x7b, 0x78, 0x77, 0x06, 0x23, 0x27, 0x1b, 0x5c, 0x9a, - 0xf6, 0x71, 0x29, 0x45, 0x8c, 0x83, 0x81, 0x1c, 0xa5, 0x33, 0x2e, 0x7e, 0x2f, 0x37, 0xda, 0xa5, - 0x16, 0xd5, 0x7a, 0x4b, 0x37, 0xea, 0xa5, 0x1a, 0xcd, 0x22, 0xab, 0xa7, 0xc1, 0xc9, 0x7a, 0x83, - 0x86, 0x74, 0x6c, 0x6e, 0xb6, 0x1a, 0x9b, 0xd5, 0xb5, 0xf5, 0x86, 0xd1, 0x52, 0x0a, 0xea, 0x29, - 0xa0, 0x92, 0xff, 0x9b, 0xd5, 0xe6, 0x66, 0xb9, 0x54, 0x2f, 0xeb, 0x35, 0xbd, 0xa2, 0x14, 0xd5, - 0xc7, 0x81, 0x1b, 0xc8, 0x25, 0x49, 0x8d, 0xe5, 0x4d, 0xa3, 0x71, 0xbe, 0x89, 0x10, 0x34, 0xf4, - 0x5a, 0x09, 0x29, 0x12, 0x73, 0xb7, 0xf5, 0x94, 0x7a, 0x15, 0x38, 0x8e, 0x2f, 0xbe, 0xaf, 0x35, - 0x4a, 0x15, 0x5a, 0xde, 0xb4, 0x7a, 0x2d, 0x38, 0x5d, 0xad, 0x37, 0x37, 0x96, 0x97, 0xab, 0xe5, - 0xaa, 0x5e, 0x6f, 0x6d, 0xae, 0xeb, 0xc6, 0x5a, 0xb5, 0xd9, 0x44, 0xdf, 0x2a, 0x33, 0xf8, 0xe6, - 0x60, 0xd2, 0x67, 0x6a, 0xef, 0x97, 0xc1, 0xfc, 0x39, 0xb3, 0x6b, 0xa1, 0x81, 0x02, 0x5f, 0x29, - 0xde, 0x77, 0x1a, 0xc8, 0xc7, 0x57, 0x8f, 0xd3, 0xf3, 0x04, 0xf8, 0x41, 0xfb, 0x21, 0x39, 0xe5, - 0x69, 0x20, 0x0a, 0x04, 0x29, 0x71, 0x91, 0x2b, 0x2d, 0x66, 0xee, 0xfa, 0x5a, 0x29, 0xc5, 0x69, - 0x20, 0x71, 0xf2, 0xe9, 0xc0, 0xff, 0xf9, 0x71, 0x81, 0xaf, 0x80, 0xb9, 0x8d, 0x7a, 0x69, 0xa3, - 0xb5, 0xda, 0x30, 0xaa, 0xdf, 0x83, 0x63, 0xd9, 0xcf, 0x83, 0x99, 0xe5, 0x86, 0xb1, 0x54, 0xad, - 0x54, 0xf4, 0xba, 0x52, 0x50, 0x1f, 0x05, 0xae, 0x6a, 0xea, 0xc6, 0xb9, 0x6a, 0x59, 0xdf, 0xdc, - 0xa8, 0x97, 0xce, 0x95, 0xaa, 0x35, 0xdc, 0x47, 0x14, 0x13, 0xae, 0x43, 0x9f, 0xd2, 0x7e, 0x20, - 0x0f, 0x00, 0xa9, 0x3a, 0xbe, 0xca, 0x89, 0xb9, 0x34, 0xfb, 0x0f, 0xd2, 0x4e, 0x1a, 0x22, 0x32, - 0x31, 0xed, 0xb7, 0x0a, 0xa6, 0x5d, 0xfa, 0x82, 0xae, 0x8e, 0x0d, 0xa3, 0x43, 0xfe, 0x06, 0xd4, - 0x8c, 0xf0, 0x73, 0xed, 0x03, 0x69, 0xe6, 0x08, 0xb1, 0x8c, 0xa5, 0x43, 0x72, 0x79, 0x3c, 0x40, - 0x6a, 0x2f, 0xce, 0x81, 0x05, 0xbe, 0x62, 0xa8, 0x12, 0xd8, 0x98, 0x12, 0xab, 0x04, 0xff, 0x31, - 0x63, 0x64, 0x9d, 0x7d, 0x12, 0x1d, 0x4e, 0x41, 0xd0, 0x32, 0xc9, 0xc1, 0xfe, 0xc0, 0x62, 0x51, - 0x72, 0x88, 0x79, 0x64, 0x74, 0x28, 0x92, 0x3a, 0x05, 0xe4, 0xd6, 0x83, 0xbe, 0x22, 0x6b, 0x5f, - 0x93, 0xc1, 0x3c, 0x77, 0x2b, 0xb7, 0xf6, 0xce, 0x9c, 0xc8, 0x8d, 0xb9, 0xcc, 0x7d, 0xdf, 0xb9, - 0xc3, 0xde, 0xf7, 0x7d, 0xf6, 0x5e, 0x30, 0x45, 0xd3, 0xb0, 0x7c, 0x1b, 0x75, 0x64, 0x0a, 0x1c, - 0x07, 0xb3, 0x2b, 0x7a, 0x6b, 0xb3, 0xd9, 0x2a, 0x19, 0x2d, 0xbd, 0xa2, 0xe4, 0xd0, 0xc0, 0xa7, - 0xaf, 0xad, 0xb7, 0x2e, 0x28, 0x12, 0x1a, 0x13, 0x57, 0x36, 0xaa, 0x15, 0x7d, 0xb3, 0x51, 0xaf, - 0x5d, 0x50, 0xe4, 0xf4, 0x0e, 0x97, 0xfd, 0x8c, 0x4d, 0xd8, 0xe1, 0x32, 0xa9, 0xf8, 0xec, 0xe7, - 0xae, 0x9f, 0x93, 0x81, 0x42, 0x38, 0xd0, 0x1f, 0xec, 0x41, 0xd7, 0x82, 0x76, 0x1b, 0x6a, 0x97, - 0x44, 0x02, 0xc0, 0x1e, 0x08, 0x7d, 0x88, 0xfb, 0x77, 0xc6, 0x6a, 0x24, 0x0f, 0x7d, 0x06, 0x77, - 0xfe, 0x80, 0xc1, 0xfd, 0xd9, 0xb4, 0x1e, 0x97, 0xfd, 0xec, 0x8e, 0x05, 0xb2, 0x4f, 0xa5, 0xf1, - 0xb8, 0x1c, 0xc2, 0xc1, 0x44, 0xe2, 0x3a, 0xc7, 0x8c, 0xc7, 0x8a, 0xac, 0xbd, 0x48, 0x06, 0xc7, - 0x2b, 0xa6, 0x0f, 0x97, 0xf6, 0x5b, 0xc1, 0x2d, 0x9a, 0x31, 0x37, 0x5f, 0xe7, 0x0e, 0xdc, 0x7c, - 0x1d, 0x5d, 0xc4, 0x29, 0xf5, 0x5d, 0xc4, 0xa9, 0xbd, 0x27, 0xed, 0x19, 0xcd, 0x3e, 0x1e, 0xc6, - 0x16, 0x7c, 0x39, 0xdd, 0xd9, 0xcb, 0x64, 0x2e, 0xb2, 0x6f, 0x60, 0x6f, 0x9f, 0x01, 0x0a, 0x61, - 0x85, 0x71, 0x2a, 0xfc, 0x29, 0x7a, 0x59, 0xfc, 0x66, 0x8a, 0x18, 0x8e, 0x41, 0x54, 0x0c, 0x89, - 0x8f, 0x8a, 0xc1, 0xad, 0x51, 0xcb, 0xfd, 0x8e, 0x20, 0x69, 0x3b, 0x43, 0xc6, 0x83, 0x30, 0x3e, - 0x6c, 0x6e, 0x76, 0x9d, 0x61, 0x62, 0xf1, 0x93, 0xb9, 0xd0, 0x98, 0xde, 0x1a, 0xaa, 0x8b, 0x22, - 0x93, 0x7c, 0x6f, 0x7b, 0x5a, 0x77, 0x72, 0xce, 0x83, 0x33, 0xe1, 0x32, 0xf3, 0xec, 0xdc, 0xc9, - 0x87, 0x71, 0x90, 0x3d, 0x0a, 0xdf, 0x92, 0x40, 0xbe, 0xe9, 0xb8, 0xfe, 0xb8, 0x30, 0x48, 0xbb, - 0x05, 0xce, 0x48, 0xa0, 0x19, 0x3f, 0x07, 0xcd, 0x6e, 0x0b, 0x3c, 0xb9, 0xfc, 0x09, 0x84, 0xc1, - 0x3c, 0x0e, 0x16, 0x08, 0x27, 0xe1, 0x1d, 0x32, 0xff, 0x26, 0x91, 0xfe, 0xea, 0x7e, 0x51, 0x44, - 0xf0, 0x46, 0x48, 0xb8, 0x05, 0x1d, 0x80, 0xc2, 0xa5, 0x69, 0x6f, 0x64, 0x71, 0xa9, 0xf0, 0xb8, - 0x0c, 0x9a, 0x81, 0x87, 0xd7, 0xb0, 0x8c, 0xab, 0x67, 0x4a, 0x13, 0x51, 0x33, 0xa1, 0xf0, 0xec, - 0x11, 0x79, 0x48, 0x06, 0x45, 0xea, 0x02, 0x38, 0x56, 0x04, 0xd2, 0xb6, 0x8c, 0x50, 0x08, 0x62, - 0xae, 0x82, 0xf2, 0xb8, 0x5b, 0x46, 0x72, 0xf9, 0xd9, 0xe3, 0xf0, 0x1f, 0xd4, 0xb7, 0xb5, 0x74, - 0xd9, 0xb4, 0xba, 0xe6, 0xc5, 0x6e, 0x8a, 0x48, 0xd6, 0x1f, 0x4f, 0x79, 0x9a, 0x2f, 0xac, 0x2a, - 0x57, 0x5e, 0x8c, 0xc4, 0xbf, 0x0b, 0xcc, 0xb8, 0xdc, 0xde, 0x1f, 0xb2, 0xa2, 0xfa, 0xfc, 0x8a, - 0xe9, 0x7b, 0x23, 0xca, 0x99, 0xea, 0xe8, 0x9e, 0x10, 0x3f, 0x13, 0x39, 0x6a, 0x34, 0x5b, 0xea, - 0x74, 0x96, 0xa1, 0xe9, 0xef, 0xb9, 0xb0, 0x93, 0x6a, 0x88, 0x70, 0xfb, 0xb6, 0x47, 0x19, 0x49, - 0x70, 0xb1, 0x24, 0x6b, 0x3c, 0x3a, 0x4f, 0x19, 0xd2, 0x1b, 0x04, 0xbc, 0x8c, 0xa5, 0x4b, 0x7a, - 0x5b, 0x08, 0x49, 0x83, 0x83, 0xe4, 0x69, 0xa3, 0x31, 0x91, 0x3d, 0x20, 0x3f, 0x23, 0x83, 0x05, - 0x62, 0x27, 0x8c, 0x1b, 0x93, 0x0f, 0xa5, 0x74, 0x19, 0x62, 0x6e, 0xe9, 0x62, 0xd9, 0x19, 0x0b, - 0x2c, 0x69, 0x1c, 0x8c, 0xc4, 0xf8, 0xc8, 0x1e, 0x99, 0xe7, 0x9f, 0x00, 0x80, 0x71, 0x03, 0xfd, - 0x78, 0x31, 0x8a, 0xeb, 0xa8, 0xbd, 0x93, 0xce, 0x3f, 0x9a, 0x5c, 0x90, 0x71, 0xc6, 0xc5, 0x33, - 0xdc, 0xa0, 0xe2, 0x13, 0x85, 0x46, 0x95, 0xdf, 0x4b, 0x69, 0xf3, 0x52, 0x27, 0xcc, 0xa1, 0x83, - 0xfb, 0x88, 0xbd, 0xdc, 0x27, 0x52, 0x18, 0xbf, 0xc3, 0x58, 0x49, 0x87, 0x5a, 0x6d, 0x84, 0x99, - 0xfd, 0x69, 0x70, 0xd2, 0xd0, 0x4b, 0x95, 0x46, 0xbd, 0x76, 0x81, 0xbd, 0xb2, 0x49, 0x91, 0xd9, - 0xc9, 0x49, 0x26, 0xb0, 0xbd, 0x2e, 0x65, 0x1f, 0xc8, 0xcb, 0x2a, 0x69, 0xb6, 0xc2, 0x2c, 0xae, - 0x0c, 0xef, 0xd5, 0x04, 0xc8, 0x1e, 0x25, 0x0a, 0x5f, 0x2b, 0x82, 0x59, 0x03, 0xb6, 0x9d, 0xdd, - 0x5d, 0x68, 0x77, 0x60, 0x47, 0x7b, 0x9d, 0x0c, 0xe6, 0xc2, 0xfd, 0xbf, 0x26, 0xf4, 0xb5, 0xff, - 0x16, 0x61, 0x73, 0x16, 0xcc, 0xa1, 0xca, 0x35, 0xf8, 0xc0, 0xf1, 0x5c, 0x9a, 0x7a, 0x2b, 0x38, - 0x11, 0xa0, 0xd0, 0xe8, 0x9b, 0xc2, 0x1c, 0x7c, 0xa1, 0xbd, 0x97, 0xc5, 0x68, 0x83, 0xc7, 0xe8, - 0xde, 0x78, 0x61, 0x86, 0xec, 0x2e, 0xb2, 0xac, 0xc6, 0x80, 0xf5, 0x3b, 0x21, 0x58, 0xcf, 0xe2, - 0xc0, 0xaa, 0x1c, 0x92, 0xfe, 0x51, 0xa2, 0xf6, 0xcb, 0x32, 0x38, 0x19, 0x74, 0xc4, 0x93, 0x43, - 0xeb, 0x13, 0x2c, 0x5a, 0xdf, 0xcb, 0xa3, 0xb5, 0x22, 0x22, 0xcd, 0x41, 0x2c, 0xc7, 0xa0, 0xf6, - 0xc5, 0x10, 0xb5, 0xef, 0xe3, 0x50, 0xab, 0x8d, 0xa9, 0x9c, 0xa3, 0x44, 0xef, 0x43, 0x32, 0x38, - 0x8d, 0xcc, 0xce, 0xb2, 0x63, 0x6f, 0x75, 0xad, 0xb6, 0x6f, 0xd9, 0xdb, 0x91, 0x4b, 0xdb, 0x8a, - 0xc8, 0xca, 0x66, 0x3f, 0xb6, 0xd2, 0x41, 0x6c, 0xf9, 0x78, 0x1b, 0xa2, 0x6d, 0x2b, 0x8e, 0xad, - 0x98, 0x21, 0x8c, 0x71, 0xd6, 0x8e, 0x34, 0x87, 0x4d, 0x4a, 0xdf, 0xfa, 0x04, 0x39, 0x38, 0x4a, - 0xfc, 0x1e, 0x02, 0x8c, 0xe9, 0xf1, 0x42, 0x19, 0x28, 0xd8, 0x7f, 0x12, 0xf7, 0xec, 0xf4, 0x3e, - 0xd3, 0x06, 0xef, 0x59, 0xdf, 0x0b, 0x04, 0x14, 0x78, 0xd6, 0x07, 0x09, 0xea, 0x4d, 0x60, 0xa1, - 0xbd, 0x03, 0xdb, 0x97, 0xaa, 0x76, 0xe0, 0x9b, 0x44, 0x1c, 0x59, 0xfa, 0x52, 0xf9, 0xc1, 0xec, - 0x7e, 0x1e, 0x4c, 0x7e, 0xe1, 0x91, 0x9b, 0xd8, 0xb0, 0x4c, 0xc5, 0x34, 0xb4, 0xdf, 0x08, 0x01, - 0xaa, 0x73, 0x00, 0xdd, 0x35, 0x12, 0xd5, 0x74, 0xb0, 0xd4, 0x47, 0x80, 0x45, 0x03, 0xa7, 0x1a, - 0xeb, 0xad, 0x6a, 0xa3, 0xbe, 0xb9, 0xd1, 0xd4, 0x2b, 0x9b, 0x4b, 0x01, 0x38, 0x4d, 0x45, 0xd6, - 0xbe, 0x2a, 0x81, 0x29, 0xc2, 0x96, 0xa7, 0x3d, 0x3e, 0x82, 0x60, 0xe8, 0x91, 0x02, 0xed, 0xed, - 0xc2, 0x01, 0x82, 0x42, 0x41, 0xd0, 0x72, 0x62, 0x1a, 0xc6, 0x53, 0xc1, 0x14, 0x01, 0x39, 0xd8, - 0x05, 0x38, 0x13, 0x63, 0xd9, 0x51, 0x32, 0x46, 0x90, 0x5d, 0x30, 0x58, 0xd0, 0x10, 0x36, 0xb2, - 0xb7, 0xc6, 0x9f, 0x9b, 0x27, 0x4b, 0x07, 0xe7, 0x2d, 0x7f, 0x07, 0x9f, 0x38, 0xd0, 0x9e, 0x29, - 0xd2, 0x71, 0xdd, 0x0a, 0x0a, 0x97, 0x51, 0xee, 0x21, 0xa7, 0x37, 0x48, 0x26, 0xed, 0xe7, 0x85, - 0x63, 0x53, 0x73, 0xfa, 0x19, 0xf2, 0x14, 0x03, 0xce, 0x1a, 0xc8, 0x77, 0x2d, 0xcf, 0xa7, 0x36, - 0xf7, 0x9d, 0xa9, 0x08, 0x05, 0x7f, 0xaa, 0x3e, 0xdc, 0x35, 0x30, 0x19, 0xed, 0x3e, 0x64, 0x31, - 0x45, 0xa9, 0x02, 0x27, 0x58, 0x4e, 0x83, 0x29, 0x7a, 0xb2, 0x9a, 0x6e, 0x4b, 0x05, 0x8f, 0x82, - 0x5b, 0x41, 0x42, 0xb5, 0xcd, 0x5e, 0x07, 0xfe, 0x9f, 0xe3, 0x60, 0x6a, 0xd5, 0xf2, 0x7c, 0xc7, - 0xdd, 0xd7, 0x5e, 0x9f, 0x03, 0x53, 0xe7, 0xa0, 0xeb, 0x59, 0x8e, 0x7d, 0xc0, 0x5d, 0xeb, 0x7a, - 0x30, 0xdb, 0x73, 0xe1, 0x65, 0xcb, 0xd9, 0xf3, 0x98, 0x51, 0x82, 0x49, 0x52, 0x35, 0x30, 0x6d, - 0xee, 0xf9, 0x3b, 0x8e, 0x1b, 0x05, 0x64, 0x0a, 0x9e, 0xd5, 0x33, 0x00, 0x90, 0xff, 0x75, 0x73, - 0x17, 0x06, 0x77, 0xae, 0x47, 0x29, 0xaa, 0x0a, 0xf2, 0xbe, 0xb5, 0x0b, 0x69, 0x84, 0x76, 0xfc, - 0x1f, 0x09, 0x18, 0x47, 0x3b, 0xa5, 0x51, 0x65, 0x65, 0x23, 0x78, 0xd4, 0xfe, 0x50, 0x06, 0xb3, - 0x2b, 0xd0, 0xa7, 0xac, 0x7a, 0xda, 0x4b, 0x72, 0x42, 0x97, 0x22, 0xa1, 0x79, 0x49, 0xd7, 0xf4, - 0x82, 0xef, 0xc2, 0x21, 0x97, 0x4f, 0x8c, 0xc2, 0xc5, 0xcb, 0xec, 0x5d, 0x11, 0x38, 0x76, 0xa8, - 0x5f, 0x25, 0xce, 0xfc, 0x34, 0x33, 0xdd, 0x38, 0x3e, 0xf8, 0x82, 0xb7, 0x89, 0x13, 0xe3, 0x6e, - 0x50, 0xd9, 0x2f, 0x32, 0xf5, 0x89, 0xed, 0x8e, 0xa6, 0x2f, 0xd3, 0x1c, 0x07, 0xae, 0x01, 0x61, - 0x29, 0x51, 0x32, 0x46, 0x98, 0x5b, 0x30, 0x62, 0xc7, 0x70, 0x4e, 0x26, 0x70, 0xf1, 0xab, 0x0c, - 0x66, 0x9b, 0x3b, 0xce, 0x95, 0x40, 0x8e, 0xdf, 0x2b, 0x06, 0xec, 0xb5, 0x60, 0xe6, 0x72, 0x1f, - 0xa8, 0x51, 0x02, 0x7b, 0xd7, 0x9c, 0xcc, 0xdf, 0x35, 0xf7, 0x02, 0x39, 0x2d, 0x4c, 0x0c, 0x73, - 0x31, 0x30, 0xf1, 0xd7, 0xc3, 0x49, 0x29, 0xae, 0x87, 0x53, 0x9f, 0x02, 0xa6, 0x28, 0xd7, 0x74, - 0x99, 0x3a, 0x19, 0xe0, 0x20, 0x33, 0x5b, 0xc1, 0x3c, 0x5f, 0xc1, 0x74, 0xc8, 0xc7, 0x57, 0x2e, - 0x7b, 0xe4, 0x7f, 0x4b, 0xc2, 0xf1, 0x9a, 0x02, 0xe0, 0xcb, 0x63, 0x00, 0x5e, 0xfb, 0x66, 0x4e, - 0x74, 0x33, 0x27, 0x94, 0x40, 0xc8, 0xc1, 0xa1, 0x2e, 0x3c, 0x1b, 0x4a, 0x2e, 0x7b, 0x79, 0xbe, - 0x22, 0x0f, 0xe6, 0x2a, 0xd6, 0xd6, 0x56, 0xd8, 0x49, 0xbe, 0x54, 0xb0, 0x93, 0x8c, 0x77, 0xa9, - 0x42, 0x76, 0xee, 0x9e, 0xeb, 0x42, 0x3b, 0xa8, 0x14, 0x6d, 0x4e, 0x7d, 0xa9, 0xea, 0xcd, 0xe0, - 0x78, 0x30, 0x2e, 0xb0, 0x1d, 0xe5, 0x8c, 0xd1, 0x9f, 0xac, 0x7d, 0x5d, 0xd8, 0x13, 0x20, 0x90, - 0x28, 0x5b, 0xa5, 0x98, 0x06, 0x78, 0x37, 0x98, 0xdf, 0x21, 0xb9, 0xf1, 0x72, 0x69, 0xd0, 0x59, - 0x9e, 0xea, 0x8b, 0x87, 0xbf, 0x06, 0x3d, 0xcf, 0xdc, 0x86, 0x06, 0x9f, 0xb9, 0xaf, 0xf9, 0xca, - 0x69, 0x6e, 0x77, 0x14, 0x73, 0x2a, 0x10, 0xa8, 0x49, 0xf6, 0xda, 0xf1, 0xc5, 0xb3, 0x20, 0xbf, - 0x6c, 0x75, 0xa1, 0xf6, 0x23, 0x12, 0x98, 0x41, 0xb3, 0x6e, 0xbb, 0x8d, 0x9e, 0x18, 0x07, 0xcb, - 0xaf, 0xe5, 0x44, 0x6f, 0x35, 0x46, 0x74, 0x16, 0x43, 0x1a, 0x31, 0xed, 0x46, 0xec, 0xf6, 0xe2, - 0x44, 0x52, 0x13, 0xb8, 0x83, 0x0a, 0x4d, 0x3d, 0xb6, 0xb6, 0xba, 0x8e, 0xc9, 0x6d, 0x18, 0xf4, - 0x9b, 0x42, 0xd1, 0xa1, 0xc0, 0xba, 0xe3, 0xaf, 0x5b, 0xb6, 0x1d, 0xc6, 0xd9, 0x38, 0x90, 0xce, - 0xfb, 0xba, 0x24, 0x86, 0x2a, 0xc3, 0x75, 0xa7, 0xa5, 0xc7, 0x68, 0xf6, 0x4d, 0x60, 0xe1, 0xe2, - 0xbe, 0x0f, 0x3d, 0x9a, 0x8b, 0x16, 0x9b, 0x37, 0xfa, 0x52, 0x99, 0x8b, 0x06, 0x92, 0x42, 0x9a, - 0x25, 0x14, 0x98, 0x4e, 0xd4, 0xab, 0x23, 0xcc, 0x00, 0x4f, 0x02, 0xa5, 0xde, 0xa8, 0xe8, 0xd8, - 0xdf, 0x37, 0xf0, 0xa0, 0xdc, 0xd6, 0x7e, 0x52, 0x06, 0x73, 0xd8, 0x01, 0x2f, 0x40, 0xe1, 0x06, - 0x81, 0xf9, 0x88, 0xf6, 0x65, 0x61, 0x5f, 0x60, 0x5c, 0x65, 0xb6, 0x80, 0x78, 0x41, 0x6f, 0x59, - 0xdd, 0x7e, 0x41, 0x17, 0x8c, 0xbe, 0xd4, 0x01, 0x80, 0xc8, 0x03, 0x01, 0xf9, 0x65, 0x21, 0x87, - 0xe0, 0x61, 0xdc, 0x1d, 0x15, 0x2a, 0xbf, 0x22, 0x83, 0x59, 0x34, 0x49, 0x09, 0x40, 0x69, 0x70, - 0xa0, 0x38, 0x76, 0x77, 0x3f, 0x5a, 0x16, 0x09, 0x1e, 0x53, 0x35, 0x92, 0x3f, 0x12, 0x9e, 0xb9, - 0x63, 0x11, 0x31, 0xbc, 0x4c, 0x08, 0xbf, 0x0f, 0x0a, 0xcd, 0xe7, 0x87, 0x30, 0x77, 0x54, 0xf0, - 0x3d, 0x5c, 0x04, 0xc5, 0x8d, 0x1e, 0x46, 0xee, 0x4b, 0xb2, 0xc8, 0xa5, 0x1d, 0x07, 0x0e, 0x83, - 0x21, 0x33, 0xab, 0xeb, 0xb4, 0xcd, 0xee, 0x7a, 0x74, 0xaa, 0x36, 0x4a, 0x50, 0xef, 0xa2, 0xfe, - 0xe1, 0xe4, 0xc4, 0xf9, 0x4d, 0x89, 0xf7, 0x59, 0x60, 0x19, 0x31, 0x07, 0xef, 0x6e, 0x05, 0x27, - 0x3a, 0x96, 0x67, 0x5e, 0xec, 0x42, 0xdd, 0x6e, 0xbb, 0xfb, 0x44, 0x1c, 0x74, 0x5a, 0x75, 0xe0, - 0x85, 0x7a, 0x0f, 0x28, 0x78, 0xfe, 0x7e, 0x97, 0xcc, 0x13, 0xd9, 0x73, 0x7a, 0xb1, 0x45, 0x35, - 0x51, 0x76, 0x83, 0x7c, 0xc5, 0xba, 0x75, 0x4e, 0x89, 0xb9, 0x75, 0xaa, 0x4f, 0x02, 0x45, 0xc7, - 0xb5, 0xb6, 0x2d, 0x72, 0x45, 0xdd, 0xc2, 0x81, 0xb0, 0xad, 0xc4, 0x14, 0x68, 0xe0, 0x2c, 0x06, - 0xcd, 0xaa, 0x3e, 0x05, 0xcc, 0x58, 0xbb, 0xe6, 0x36, 0xbc, 0xdf, 0xb2, 0xc9, 0xa1, 0xf6, 0x85, - 0x3b, 0x4e, 0x1f, 0x38, 0x82, 0x48, 0xdf, 0x1b, 0x51, 0x56, 0xf5, 0x6e, 0x70, 0x4d, 0xdb, 0x85, - 0xa6, 0x0f, 0x91, 0x80, 0xce, 0x5b, 0x9d, 0x6d, 0xe8, 0x57, 0xb7, 0xd6, 0x2c, 0xcf, 0xb3, 0xec, - 0x6d, 0x7a, 0x0b, 0x65, 0x7c, 0x06, 0xed, 0x83, 0x92, 0x68, 0x64, 0x3a, 0x2c, 0x19, 0xa2, 0x12, - 0x23, 0xdc, 0x96, 0xcd, 0x48, 0x51, 0x16, 0x74, 0x8e, 0x7d, 0xb5, 0x50, 0xcc, 0xb8, 0x78, 0xb6, - 0xb2, 0x1f, 0xfa, 0x7f, 0x5f, 0x02, 0xd3, 0x15, 0xe7, 0x8a, 0x8d, 0x9b, 0xc9, 0x9d, 0x62, 0x96, - 0xf2, 0x80, 0x63, 0xe6, 0xfc, 0xbd, 0xcb, 0x89, 0x67, 0xca, 0x70, 0x6d, 0x83, 0x22, 0x63, 0x60, - 0x48, 0x6c, 0x77, 0x82, 0xb7, 0xe1, 0x26, 0x95, 0x93, 0xbd, 0x5c, 0x7f, 0x5b, 0x06, 0xf9, 0x8a, - 0xeb, 0xf4, 0xb4, 0xb7, 0xe5, 0x52, 0x38, 0x89, 0x75, 0x5c, 0xa7, 0xd7, 0xc2, 0xd7, 0x59, 0x46, - 0xfb, 0x22, 0x6c, 0x9a, 0x7a, 0x27, 0x98, 0xee, 0x39, 0x9e, 0xe5, 0x07, 0x93, 0x90, 0x85, 0x3b, - 0x1e, 0x33, 0xb0, 0x2f, 0x58, 0xa7, 0x99, 0x8c, 0x30, 0x3b, 0xea, 0xf3, 0xb1, 0x08, 0x91, 0x5c, - 0x90, 0x18, 0x83, 0x2b, 0x3d, 0xfb, 0x52, 0xb5, 0x97, 0xb1, 0x48, 0x3e, 0x8d, 0x47, 0xf2, 0xb1, - 0x03, 0x24, 0xec, 0x3a, 0xbd, 0xb1, 0xb8, 0x75, 0xbc, 0x32, 0x44, 0xf5, 0xe9, 0x1c, 0xaa, 0xb7, - 0x08, 0x95, 0x99, 0x3d, 0xa2, 0x1f, 0xcc, 0x03, 0x80, 0x8d, 0x94, 0x0d, 0x34, 0x7d, 0x12, 0xb3, - 0xd0, 0x7e, 0x38, 0xcf, 0xc8, 0xb2, 0xc4, 0xcb, 0xf2, 0xf1, 0x31, 0x36, 0x10, 0x26, 0x1f, 0x23, - 0xd1, 0x12, 0x28, 0xec, 0xa1, 0xd7, 0x54, 0xa2, 0x82, 0x24, 0xf0, 0xa3, 0x41, 0xbe, 0xd4, 0x7e, - 0x2b, 0x07, 0x0a, 0x38, 0x41, 0x3d, 0x03, 0x00, 0x36, 0x0b, 0xc8, 0x91, 0xcc, 0x1c, 0x36, 0x00, - 0x98, 0x14, 0xac, 0xad, 0x56, 0x87, 0xbe, 0x26, 0x06, 0x77, 0x94, 0x80, 0xbe, 0xc6, 0xc6, 0x02, - 0xa6, 0x45, 0xcd, 0x07, 0x26, 0x05, 0x7d, 0x8d, 0x9f, 0x6a, 0x70, 0x8b, 0xdc, 0x34, 0x90, 0x37, - 0xa2, 0x84, 0xf0, 0xeb, 0x5a, 0x78, 0x3f, 0x65, 0xf0, 0x35, 0x4e, 0x41, 0x53, 0x69, 0xac, 0x96, - 0x4b, 0x51, 0x11, 0x45, 0x9c, 0xa9, 0x3f, 0x59, 0x7b, 0x5d, 0xa8, 0x36, 0x15, 0x4e, 0x6d, 0x6e, - 0x4f, 0x21, 0xde, 0xec, 0x95, 0xe7, 0x4f, 0x0b, 0x60, 0xa6, 0xee, 0x74, 0xa8, 0xee, 0x30, 0xd3, - 0xcd, 0x4f, 0x15, 0x52, 0x4d, 0x37, 0x43, 0x1a, 0x31, 0x0a, 0xf2, 0x0c, 0x5e, 0x41, 0xc4, 0x28, - 0xb0, 0xfa, 0xa1, 0x2e, 0x81, 0x22, 0xd6, 0xde, 0x83, 0x17, 0x1f, 0x26, 0x91, 0xc0, 0xa2, 0x35, - 0xe8, 0x97, 0xff, 0xe9, 0x74, 0xec, 0x7f, 0x80, 0x02, 0xae, 0x60, 0xc2, 0xde, 0x10, 0x5f, 0x51, - 0x29, 0xb9, 0xa2, 0x72, 0x72, 0x45, 0xf3, 0xfd, 0x15, 0x4d, 0xb3, 0x8a, 0x10, 0xa7, 0x21, 0xd9, - 0xeb, 0xf8, 0xdf, 0x4e, 0x01, 0x50, 0x37, 0x2f, 0x5b, 0xdb, 0x64, 0x6f, 0xf9, 0x0f, 0x83, 0xd9, - 0x13, 0xdd, 0x05, 0xfe, 0x31, 0x66, 0x20, 0xbc, 0x13, 0x4c, 0xd1, 0x71, 0x8f, 0x56, 0xe4, 0x3a, - 0xae, 0x22, 0x11, 0x15, 0x62, 0xd4, 0x3e, 0xe8, 0x1b, 0x41, 0x7e, 0xee, 0x8e, 0x76, 0xa9, 0xef, - 0x8e, 0xf6, 0xc1, 0x3b, 0x18, 0x31, 0x37, 0xb7, 0x6b, 0xef, 0x13, 0x3e, 0x43, 0xc5, 0xf0, 0xc3, - 0xd4, 0x28, 0xa6, 0x09, 0x3e, 0x09, 0x4c, 0x39, 0xe1, 0x76, 0xb8, 0x1c, 0xbb, 0x8a, 0x56, 0xb5, - 0xb7, 0x1c, 0x23, 0xc8, 0x29, 0xb8, 0x75, 0x26, 0xc4, 0xc7, 0x44, 0x8e, 0x29, 0x9e, 0x5a, 0x09, - 0xa2, 0x36, 0xa2, 0x7a, 0x9c, 0xb7, 0xfc, 0x9d, 0x9a, 0x65, 0x5f, 0xf2, 0xb4, 0xef, 0x13, 0xb3, - 0x20, 0x19, 0xfc, 0xa5, 0x74, 0xf8, 0xf3, 0x51, 0x93, 0x9a, 0x3c, 0x6a, 0xf7, 0xc4, 0x51, 0x19, - 0xcc, 0x6d, 0x0c, 0x80, 0x77, 0x81, 0x22, 0x61, 0x94, 0x76, 0xa2, 0x67, 0x63, 0xf1, 0x0b, 0x29, - 0x19, 0xf4, 0x0b, 0xed, 0xbd, 0x21, 0x8e, 0xe7, 0x38, 0x1c, 0x97, 0x0e, 0xc5, 0x59, 0xe6, 0x90, - 0x9e, 0x7d, 0x22, 0x98, 0xa2, 0x92, 0x56, 0x17, 0xd8, 0x56, 0xac, 0x1c, 0x53, 0x01, 0x28, 0xae, - 0x39, 0x97, 0x61, 0xcb, 0x51, 0x72, 0xe8, 0x3f, 0xe2, 0xaf, 0xe5, 0x28, 0x92, 0xf6, 0xaa, 0x69, - 0x30, 0x1d, 0x86, 0xcb, 0xfb, 0x7d, 0x09, 0x28, 0x65, 0x3c, 0x43, 0x5b, 0x76, 0x9d, 0x5d, 0x52, - 0x23, 0x71, 0x7f, 0xfc, 0x9f, 0x11, 0x76, 0x10, 0x09, 0xc3, 0xd8, 0xf5, 0x17, 0x16, 0x83, 0x25, - 0x59, 0xc2, 0x94, 0x82, 0x25, 0x4c, 0xed, 0xad, 0x42, 0x0e, 0x23, 0xa2, 0xa5, 0x64, 0xdf, 0xd4, - 0x3e, 0x2b, 0x81, 0x42, 0xb9, 0xeb, 0xd8, 0x90, 0x3d, 0x34, 0x3a, 0xf4, 0x74, 0xe2, 0xe0, 0x7d, - 0x0c, 0xed, 0xb9, 0x92, 0xa8, 0xad, 0x11, 0x09, 0x00, 0x95, 0x2d, 0x28, 0x5b, 0xb1, 0x41, 0x2a, - 0x91, 0x74, 0xf6, 0x02, 0xfd, 0xaa, 0x04, 0x66, 0x48, 0x64, 0xb2, 0x52, 0xb7, 0xab, 0x3d, 0x26, - 0x12, 0xea, 0x80, 0x90, 0x83, 0xda, 0x2f, 0x0b, 0x1f, 0x8a, 0x0a, 0x6b, 0x15, 0xd2, 0x4e, 0x11, - 0xa2, 0x2d, 0xdd, 0x19, 0x1d, 0xb1, 0x9d, 0xb8, 0xa1, 0x0c, 0x65, 0x2f, 0xea, 0x3f, 0x90, 0x90, - 0x01, 0x60, 0x5f, 0x5a, 0x77, 0xe1, 0x65, 0x0b, 0x5e, 0xd1, 0x1e, 0x1d, 0x09, 0xfb, 0x60, 0xd8, - 0xa5, 0x37, 0x09, 0x2f, 0xe2, 0x30, 0x24, 0x63, 0x37, 0xc2, 0x66, 0xbb, 0x51, 0x26, 0xda, 0x8b, - 0xf7, 0xc7, 0xc2, 0x62, 0xc8, 0x18, 0x6c, 0x76, 0xc1, 0x35, 0x9b, 0x78, 0x2e, 0xb2, 0x17, 0xec, - 0xaf, 0x4e, 0x81, 0xe9, 0x0d, 0xdb, 0xeb, 0x75, 0x4d, 0x6f, 0x47, 0xfb, 0x37, 0x19, 0x14, 0xc9, - 0x75, 0x9b, 0xda, 0x77, 0x71, 0xd1, 0x5d, 0x9e, 0xbd, 0x07, 0xdd, 0xc0, 0x81, 0x87, 0x3c, 0x44, - 0xf6, 0x91, 0xc4, 0xd8, 0x47, 0xda, 0x07, 0x65, 0xd1, 0x49, 0x6a, 0x50, 0x28, 0xbd, 0xdf, 0x33, - 0x3e, 0xa0, 0x48, 0xcf, 0x6a, 0xfb, 0x7b, 0x2e, 0xf4, 0x06, 0x06, 0x14, 0x89, 0xa5, 0xb2, 0x4e, - 0xbe, 0x32, 0xc2, 0xcf, 0x35, 0x13, 0x4c, 0xd1, 0xc4, 0x03, 0x9b, 0x51, 0x07, 0x23, 0x1e, 0x9c, - 0x02, 0x45, 0xd3, 0xf5, 0x2d, 0xcf, 0xa7, 0xdb, 0xb3, 0xf4, 0x09, 0x75, 0x97, 0xe4, 0xdf, 0x86, - 0xdb, 0x0d, 0xe2, 0x40, 0x85, 0x09, 0xda, 0xaf, 0x08, 0xcd, 0x1f, 0x93, 0x6b, 0x9e, 0x0e, 0xf2, - 0xfb, 0x47, 0x58, 0xe1, 0x7e, 0x14, 0xb8, 0xca, 0x28, 0xb5, 0xf4, 0x4d, 0x12, 0x36, 0x28, 0x8c, - 0x10, 0xd4, 0xd1, 0xde, 0x23, 0x33, 0xeb, 0x77, 0xfb, 0xdc, 0x18, 0x41, 0xa5, 0x18, 0x8d, 0x11, - 0x61, 0x42, 0xc2, 0x5e, 0x37, 0xb7, 0x84, 0x2b, 0x0b, 0x2f, 0xe1, 0x6a, 0xbf, 0x24, 0xbc, 0x17, - 0x15, 0x8a, 0x72, 0xc8, 0x1a, 0x60, 0xd2, 0x75, 0x7c, 0x1f, 0x16, 0xda, 0x57, 0x1a, 0x56, 0xd2, - 0x11, 0xc2, 0xf6, 0xcd, 0x53, 0x40, 0x2a, 0x55, 0xb5, 0x1f, 0x9d, 0x02, 0x73, 0xe7, 0x5d, 0xcb, - 0xb7, 0xec, 0xed, 0x96, 0xe3, 0x74, 0x3d, 0xed, 0x1b, 0xcc, 0x46, 0xc5, 0x53, 0x40, 0xb1, 0xed, - 0xd8, 0x5b, 0xd6, 0x36, 0x15, 0xe3, 0x19, 0xae, 0x72, 0xa5, 0xea, 0xe2, 0xba, 0xeb, 0x5c, 0xb6, - 0x3a, 0xd0, 0x2d, 0xe3, 0x5c, 0x06, 0xcd, 0x8d, 0xf4, 0x98, 0x09, 0xbc, 0x76, 0x7b, 0xff, 0x57, - 0x6c, 0x79, 0x61, 0xe4, 0x17, 0x9a, 0xc8, 0xc4, 0x5d, 0xab, 0x82, 0xe9, 0xae, 0x69, 0x6f, 0xef, - 0x05, 0x33, 0xef, 0xfe, 0x5d, 0xd4, 0x38, 0x4a, 0x35, 0xfa, 0x91, 0x11, 0x7e, 0x8e, 0x9d, 0xdc, - 0x90, 0xa9, 0x4f, 0xda, 0x1e, 0xfe, 0x7f, 0xf6, 0xa3, 0x39, 0x30, 0xcb, 0x14, 0xaa, 0xce, 0x82, - 0xa9, 0x8a, 0xbe, 0x5c, 0xda, 0xa8, 0xb5, 0x94, 0x63, 0x48, 0x8a, 0xcd, 0x8d, 0xb5, 0xb5, 0x92, - 0x51, 0xfd, 0x1e, 0x5d, 0xc9, 0xa1, 0x77, 0x2b, 0x46, 0x09, 0x3d, 0x2b, 0x12, 0x7a, 0x68, 0xae, - 0x36, 0x8c, 0x96, 0x5e, 0x57, 0x64, 0x64, 0x8f, 0xea, 0xcf, 0x5a, 0x2f, 0xd5, 0x2b, 0x4a, 0x1e, - 0xfd, 0x5f, 0xda, 0xa8, 0xd5, 0xf4, 0x96, 0x52, 0x88, 0x42, 0xb1, 0x15, 0x51, 0x72, 0xb9, 0xd4, - 0xdc, 0x28, 0xd5, 0x94, 0x29, 0x94, 0xbc, 0xbc, 0x51, 0xaf, 0x5f, 0x50, 0xa6, 0x51, 0x11, 0xe5, - 0x46, 0x7d, 0xb9, 0x5a, 0xd1, 0xeb, 0x2d, 0x65, 0x46, 0xbd, 0x0a, 0x1c, 0x6f, 0xb6, 0x8c, 0x52, - 0x75, 0x65, 0xb5, 0xb5, 0xdc, 0x30, 0xce, 0x97, 0x8c, 0x8a, 0x02, 0x54, 0x05, 0xcc, 0xad, 0x1b, - 0x8d, 0x65, 0x1d, 0xc7, 0xf2, 0x28, 0xd5, 0x94, 0x59, 0xf4, 0x55, 0xcb, 0x28, 0xd5, 0x9b, 0xb5, - 0x52, 0x4b, 0x57, 0xe6, 0xce, 0xde, 0x07, 0xa6, 0x83, 0xea, 0xaa, 0x45, 0x20, 0xe9, 0x75, 0xe5, - 0x18, 0xfe, 0x6d, 0x2a, 0x39, 0xf4, 0xbb, 0x8c, 0xf8, 0x2d, 0x02, 0xa9, 0xa2, 0x2b, 0x32, 0xfa, - 0xad, 0xb6, 0x94, 0x3c, 0xfa, 0x5d, 0x47, 0x2c, 0x16, 0x81, 0xb4, 0x5a, 0x55, 0x8a, 0xe8, 0xb7, - 0xb5, 0xaa, 0x4c, 0xf1, 0xb7, 0x6e, 0x27, 0xf6, 0xc2, 0x07, 0x25, 0x1f, 0x63, 0x68, 0xf8, 0xd1, - 0x1c, 0x19, 0xff, 0xd7, 0x5e, 0x29, 0x89, 0xf4, 0x75, 0xc9, 0xf4, 0xd3, 0x35, 0x9a, 0xb7, 0xe4, - 0xc6, 0xd8, 0x6a, 0x54, 0x0d, 0x9c, 0xd2, 0xeb, 0x95, 0xf5, 0x46, 0xb5, 0xde, 0x22, 0x01, 0xb3, - 0xf4, 0x52, 0x79, 0x15, 0xe3, 0x0c, 0x11, 0x82, 0x6b, 0x8d, 0x8a, 0x5e, 0xc3, 0x2f, 0x96, 0x1b, - 0x1b, 0xf5, 0x8a, 0xb2, 0x85, 0xca, 0x2a, 0x6d, 0xb4, 0x56, 0x37, 0x0d, 0xfd, 0x99, 0x1b, 0x55, - 0x43, 0xaf, 0x28, 0xdb, 0x88, 0x46, 0xad, 0x54, 0x5f, 0xd9, 0x28, 0xad, 0xd0, 0xfd, 0xc2, 0x8d, - 0xf5, 0xf5, 0x06, 0xde, 0x31, 0xdc, 0xd1, 0xfe, 0x21, 0x0f, 0xa6, 0x4b, 0x7b, 0xbe, 0xb3, 0x65, - 0x75, 0xbb, 0xda, 0x43, 0xd2, 0xe1, 0x9b, 0x62, 0x89, 0x6b, 0x8a, 0x07, 0x1a, 0x50, 0x50, 0x56, - 0xd8, 0x78, 0x82, 0x04, 0xa6, 0x1d, 0x9e, 0x8e, 0x9c, 0xb1, 0x65, 0xba, 0xd3, 0x4c, 0x1e, 0x89, - 0x23, 0xae, 0x4d, 0x5b, 0x16, 0x7e, 0x43, 0x1f, 0xcf, 0xde, 0x0f, 0xe6, 0x58, 0x4a, 0x38, 0xa8, - 0x54, 0x69, 0x85, 0x44, 0x9d, 0x0a, 0xe2, 0xcc, 0x91, 0xa8, 0x53, 0xf8, 0x50, 0x80, 0x84, 0xdb, - 0x4b, 0xb5, 0x55, 0x43, 0x7a, 0x7a, 0x1c, 0xcc, 0x56, 0xf4, 0x66, 0xd9, 0xa8, 0x62, 0x3f, 0x75, - 0x25, 0xcf, 0x7b, 0x19, 0x24, 0x5a, 0x66, 0x7c, 0x8d, 0x44, 0x95, 0xf2, 0x5b, 0x42, 0xf6, 0x56, - 0x3c, 0xed, 0x74, 0x0a, 0xf9, 0x92, 0x47, 0x9a, 0x42, 0x6a, 0x2f, 0xc9, 0x93, 0x75, 0xb2, 0xe6, - 0xde, 0xee, 0xae, 0xe9, 0xee, 0x73, 0xfe, 0x6a, 0xa3, 0xea, 0x5d, 0xfc, 0xf8, 0x9e, 0x18, 0xa1, - 0x06, 0x99, 0x50, 0x3d, 0xd7, 0xd9, 0xed, 0x05, 0x7d, 0x35, 0x7d, 0xd2, 0xfe, 0x2f, 0xe1, 0x99, - 0x63, 0xa9, 0xba, 0xc8, 0x54, 0x66, 0x84, 0xa1, 0xfd, 0x07, 0x24, 0x91, 0x59, 0x64, 0x62, 0x31, - 0xdf, 0xee, 0x1a, 0xf1, 0x37, 0x79, 0x70, 0x15, 0x8d, 0x3e, 0x12, 0xae, 0x3f, 0x20, 0x53, 0xf5, - 0x35, 0x99, 0x6a, 0x06, 0x35, 0xa8, 0xe5, 0xc8, 0xa0, 0x66, 0x36, 0xbc, 0xf3, 0x82, 0x1b, 0xde, - 0x6f, 0x13, 0x3e, 0xf4, 0x50, 0xaa, 0x2e, 0x0e, 0xa8, 0xe3, 0x64, 0xb6, 0xe5, 0x5f, 0x20, 0x89, - 0xac, 0xb6, 0x0a, 0x71, 0xf8, 0xed, 0xae, 0x6b, 0xef, 0xc8, 0x81, 0x05, 0x5e, 0x55, 0xd4, 0x27, - 0x83, 0xe9, 0x1e, 0x4d, 0xa1, 0x72, 0x39, 0x1d, 0xa7, 0x5c, 0x46, 0x98, 0x13, 0x41, 0x04, 0xed, - 0x4e, 0xcf, 0xb1, 0xec, 0x70, 0x5d, 0x3e, 0x78, 0x46, 0xf3, 0x4e, 0x3c, 0x75, 0x08, 0x62, 0xd1, - 0xe1, 0x87, 0x28, 0x02, 0x69, 0x9e, 0x89, 0x40, 0x8a, 0x84, 0xe8, 0xc3, 0x5d, 0x7c, 0xa3, 0xca, - 0x9e, 0x4b, 0x1c, 0x5e, 0x24, 0x83, 0x4d, 0x3a, 0xfb, 0x74, 0x30, 0x1d, 0x94, 0x8f, 0xac, 0xbb, - 0x46, 0xad, 0x56, 0x5a, 0x2b, 0x91, 0x85, 0xca, 0xc6, 0xba, 0x5e, 0x2f, 0x55, 0x95, 0x1c, 0x1a, - 0xe8, 0x6a, 0x6b, 0xcd, 0xd6, 0x46, 0xa5, 0xda, 0x50, 0x24, 0xfc, 0x84, 0x32, 0x95, 0xd7, 0xd7, - 0x15, 0x59, 0x7b, 0xe3, 0x14, 0x98, 0x5a, 0x31, 0xbb, 0x5d, 0xe8, 0xee, 0x6b, 0x5f, 0x95, 0x80, - 0x12, 0xcc, 0x0e, 0xd6, 0x4c, 0xdb, 0xda, 0x82, 0x9e, 0x9f, 0xbc, 0x50, 0xf1, 0x3e, 0xe1, 0x6b, - 0x96, 0x68, 0x19, 0x8b, 0xfd, 0xf4, 0x63, 0x74, 0xfc, 0x36, 0x90, 0xb7, 0xec, 0x2d, 0x87, 0x2e, - 0x57, 0xf4, 0xfb, 0xdb, 0x04, 0x1f, 0xe3, 0x6d, 0x03, 0x9c, 0x51, 0xf0, 0xa6, 0x25, 0x41, 0x2e, - 0xb2, 0x5f, 0xb5, 0x78, 0x47, 0x1e, 0xcc, 0x07, 0x4c, 0x54, 0xed, 0x0e, 0x7c, 0x90, 0xdd, 0x06, - 0xfd, 0xc9, 0xbc, 0x68, 0xf0, 0x9b, 0xfe, 0xfa, 0x60, 0x52, 0x31, 0x22, 0x6d, 0x01, 0xd0, 0x36, - 0x7d, 0xb8, 0xed, 0xb8, 0x56, 0xb8, 0x16, 0xf1, 0xe4, 0x34, 0xd4, 0xca, 0xe4, 0xeb, 0x7d, 0x83, - 0xa1, 0xa3, 0xde, 0x03, 0x66, 0x61, 0x18, 0x6d, 0x30, 0xd8, 0x26, 0x4d, 0xc4, 0x8b, 0xcd, 0xaf, - 0xfd, 0x81, 0x50, 0x8c, 0x1d, 0x91, 0x6a, 0xa6, 0xc3, 0x6c, 0x73, 0xb4, 0xae, 0x67, 0xa3, 0xbe, - 0x56, 0x32, 0x9a, 0xab, 0xa5, 0x5a, 0xad, 0x5a, 0x5f, 0x09, 0xc3, 0xde, 0xaa, 0x60, 0xa1, 0xd2, - 0x38, 0x5f, 0x67, 0xe2, 0x12, 0xe7, 0xb5, 0x75, 0x30, 0x1d, 0xc8, 0x6b, 0xd0, 0x29, 0x2a, 0x56, - 0x66, 0xf4, 0x14, 0x15, 0x93, 0x84, 0x4c, 0x43, 0xab, 0x1d, 0xba, 0xd6, 0xe3, 0xff, 0xda, 0x6f, - 0x9a, 0xa0, 0x80, 0xfd, 0x59, 0xb4, 0x77, 0xe1, 0x79, 0x71, 0xaf, 0x6b, 0xb6, 0xa1, 0xb6, 0x9b, - 0x62, 0x25, 0x3c, 0xb8, 0xf7, 0x53, 0x3a, 0x70, 0xef, 0x27, 0xfe, 0x4b, 0x47, 0x8c, 0x93, 0x83, - 0x7c, 0x68, 0x0c, 0x92, 0x85, 0x0f, 0x47, 0x93, 0xe8, 0xd9, 0x44, 0x5c, 0x6f, 0x28, 0x9b, 0x31, - 0x2a, 0x19, 0xcf, 0x53, 0xba, 0x55, 0x60, 0x31, 0x1f, 0xa8, 0x24, 0x8e, 0xb2, 0x6f, 0xf1, 0x5f, - 0xca, 0x83, 0x42, 0xb3, 0xd7, 0xb5, 0x7c, 0xed, 0xe7, 0xa4, 0xb1, 0x60, 0x46, 0xee, 0x6a, 0x95, - 0x87, 0xde, 0xd5, 0x1a, 0xf9, 0x4b, 0xe6, 0x05, 0xfc, 0x25, 0x5b, 0xf0, 0x41, 0x9f, 0xf7, 0x97, - 0xbc, 0x93, 0x4e, 0xdb, 0x88, 0xb7, 0xe5, 0x63, 0x07, 0x88, 0x14, 0x57, 0x6b, 0xc0, 0x9d, 0x08, - 0x67, 0x9f, 0x48, 0x43, 0xb3, 0x03, 0x50, 0x5c, 0x6a, 0xb4, 0x5a, 0x8d, 0x35, 0xe5, 0x18, 0x9e, - 0x7e, 0x35, 0xd6, 0x49, 0xa0, 0xdc, 0x6a, 0xbd, 0xae, 0x1b, 0xdc, 0x8c, 0x8b, 0xbf, 0xb8, 0x2f, - 0x71, 0x82, 0xc5, 0x97, 0x9d, 0xa5, 0x7a, 0x89, 0x2d, 0x82, 0xc7, 0xf3, 0x93, 0xbd, 0x72, 0xfd, - 0xb4, 0x0c, 0x0a, 0x6b, 0xd0, 0xdd, 0x86, 0xda, 0xb3, 0x53, 0x38, 0xd8, 0x6d, 0x59, 0xae, 0x47, - 0x42, 0xeb, 0x47, 0x0e, 0x76, 0x6c, 0x9a, 0x7a, 0x23, 0x98, 0xf7, 0x60, 0xdb, 0xb1, 0x3b, 0x41, - 0x26, 0xd2, 0x1f, 0xf1, 0x89, 0xda, 0xcb, 0x53, 0x42, 0x86, 0x19, 0x1d, 0x8b, 0x97, 0x5c, 0x1a, - 0x60, 0x06, 0x95, 0x9a, 0x3d, 0x30, 0x5f, 0x97, 0xd1, 0x47, 0xbd, 0x7d, 0xed, 0xe5, 0xc2, 0x9e, - 0x8f, 0xb7, 0x82, 0xe2, 0xc5, 0xe0, 0x8e, 0x26, 0x39, 0xb6, 0x3f, 0xa6, 0x79, 0xd4, 0x25, 0x70, - 0xc2, 0x83, 0x5d, 0xd8, 0xf6, 0x61, 0x07, 0x35, 0x5d, 0x63, 0x68, 0xa7, 0x70, 0x30, 0xbb, 0xf6, - 0x3b, 0x2c, 0x80, 0x77, 0xf3, 0x00, 0xde, 0x34, 0x40, 0x94, 0xa8, 0x42, 0xf1, 0x73, 0x13, 0x54, - 0x8d, 0x66, 0xd7, 0x09, 0x0d, 0xdf, 0xe0, 0x19, 0xbd, 0xdb, 0xf1, 0x77, 0xbb, 0xf8, 0x1d, 0x3d, - 0x1a, 0x1c, 0x3c, 0xab, 0x8b, 0x60, 0xca, 0xb4, 0xf7, 0xf1, 0xab, 0x7c, 0x42, 0xad, 0x83, 0x4c, - 0xda, 0xab, 0x42, 0xe4, 0xef, 0xe5, 0x90, 0x7f, 0xbc, 0x18, 0xbb, 0xd9, 0x03, 0xff, 0x43, 0x53, - 0xa0, 0xb0, 0x6e, 0x7a, 0x3e, 0xd4, 0xfe, 0xb7, 0x2c, 0x8a, 0xfc, 0x4d, 0x60, 0x61, 0xcb, 0x69, - 0xef, 0x79, 0xb0, 0xc3, 0x37, 0xca, 0xbe, 0xd4, 0x71, 0x60, 0xae, 0xde, 0x02, 0x94, 0x20, 0x91, - 0x92, 0x0d, 0x5c, 0x60, 0x0f, 0xa4, 0xe3, 0x6b, 0xe0, 0xbc, 0x75, 0xd3, 0xf5, 0x1b, 0x5b, 0x38, - 0x2d, 0xbc, 0x06, 0x8e, 0x4d, 0xe4, 0xa0, 0x2f, 0x26, 0x40, 0x3f, 0x15, 0x0f, 0xfd, 0xb4, 0x00, - 0xf4, 0x6a, 0x09, 0x4c, 0x6f, 0x59, 0x5d, 0x88, 0x3f, 0x98, 0xc1, 0x1f, 0x0c, 0x1a, 0x93, 0xb0, - 0xec, 0xc3, 0x31, 0x69, 0xd9, 0xea, 0x42, 0x23, 0xfc, 0x2c, 0x98, 0xc8, 0x80, 0x68, 0x22, 0x53, - 0x23, 0x27, 0xe1, 0x90, 0xe1, 0x65, 0x9b, 0xbb, 0x30, 0xd8, 0xf8, 0xb6, 0xe9, 0xb1, 0xf4, 0x8e, - 0xe9, 0x9b, 0x18, 0x8c, 0x39, 0x03, 0xff, 0xe7, 0x7d, 0xb2, 0xe5, 0x7e, 0x9f, 0xec, 0xe7, 0xcb, - 0xe9, 0x7a, 0xc4, 0x80, 0xd9, 0x98, 0x16, 0x75, 0x31, 0x00, 0x88, 0x58, 0x8a, 0xe1, 0x33, 0x02, - 0xa6, 0x6d, 0xba, 0xd0, 0x5f, 0x67, 0xbd, 0xa0, 0x0b, 0x06, 0x9f, 0x88, 0x0f, 0xe1, 0x78, 0x4d, - 0x73, 0x97, 0x5c, 0xf3, 0x56, 0x46, 0xef, 0xe8, 0xe1, 0x8a, 0x03, 0xe9, 0x51, 0xff, 0x5b, 0x18, - 0x77, 0xff, 0x3b, 0xa8, 0x8e, 0xd9, 0x37, 0xc3, 0xd7, 0xe6, 0x81, 0x5c, 0xde, 0xf3, 0x1f, 0xd1, - 0xdd, 0xef, 0xb7, 0x84, 0x7d, 0xcc, 0x69, 0x7f, 0xb6, 0xe7, 0x1f, 0x6d, 0xef, 0x9b, 0x52, 0x4b, - 0xc4, 0x7c, 0xd9, 0xe3, 0xea, 0x96, 0xbd, 0x8e, 0xbc, 0x4d, 0x0e, 0x8f, 0x46, 0x3d, 0x94, 0x3b, - 0xbc, 0x69, 0xae, 0x91, 0xfe, 0x89, 0xe9, 0x19, 0xc2, 0xe7, 0xa0, 0xe3, 0xc9, 0x73, 0x37, 0x13, - 0x60, 0xd7, 0x56, 0x2c, 0xca, 0x39, 0x83, 0x3c, 0x68, 0xaf, 0x10, 0x3e, 0x30, 0x4a, 0xc4, 0x96, - 0x78, 0x8c, 0x27, 0x9d, 0x4d, 0xf5, 0x1a, 0xa1, 0x63, 0xa3, 0x09, 0xc5, 0x66, 0x0f, 0xd8, 0xdf, - 0xb3, 0xc7, 0x74, 0x4a, 0x87, 0x46, 0x4c, 0x7b, 0xb5, 0xf0, 0x82, 0x3e, 0xa9, 0xf6, 0x90, 0xbd, - 0xfa, 0x74, 0xf2, 0x16, 0x73, 0x14, 0x4b, 0x2c, 0x78, 0x02, 0xf7, 0xd6, 0xca, 0xa0, 0x48, 0x16, - 0x7e, 0xb5, 0x37, 0x0b, 0x37, 0x11, 0xd4, 0x1b, 0xf1, 0xc7, 0x77, 0xc2, 0xe7, 0x34, 0x6b, 0x0e, - 0xdc, 0x31, 0x9f, 0x7c, 0xaa, 0x63, 0x3e, 0x7c, 0x04, 0x16, 0x81, 0x76, 0x44, 0xea, 0x98, 0xf1, - 0x74, 0x32, 0x4d, 0x0b, 0x1b, 0xc8, 0x50, 0xf6, 0x78, 0xbf, 0xb0, 0x00, 0xe6, 0x48, 0xd1, 0xe4, - 0x7c, 0xa1, 0xf6, 0x1e, 0xe9, 0xdb, 0x07, 0x75, 0xb5, 0x0e, 0xe6, 0xae, 0x60, 0xb6, 0xc9, 0x7d, - 0xb4, 0x74, 0xe5, 0xe2, 0x96, 0xc4, 0x75, 0x0f, 0x52, 0xcf, 0xe0, 0x06, 0x5b, 0xee, 0x7b, 0x24, - 0x63, 0xb2, 0xc1, 0x42, 0x0e, 0x4f, 0x14, 0xb1, 0x91, 0xc5, 0x26, 0xa9, 0xa7, 0x40, 0xf1, 0xb2, - 0x05, 0xaf, 0x54, 0x3b, 0xd4, 0xba, 0xa5, 0x4f, 0xda, 0xaf, 0x09, 0xfb, 0x4c, 0xb2, 0x70, 0x53, - 0x5e, 0xb2, 0xd5, 0x42, 0x31, 0xcf, 0xc9, 0xa1, 0x6c, 0x4d, 0x20, 0x1a, 0x90, 0x44, 0xee, 0xcc, - 0xa6, 0x61, 0xe6, 0xcb, 0x29, 0x14, 0x31, 0xce, 0x70, 0xe6, 0x83, 0xf0, 0x25, 0x9e, 0x35, 0x27, - 0x02, 0x88, 0xca, 0x1f, 0x4b, 0x9f, 0x2f, 0x16, 0x19, 0x6e, 0x48, 0xd1, 0xd9, 0x4b, 0xfe, 0x75, - 0x32, 0x98, 0x69, 0x42, 0x7f, 0xd9, 0x82, 0xdd, 0x8e, 0xa7, 0xb9, 0x87, 0x37, 0x8d, 0x6e, 0x03, - 0xc5, 0x2d, 0x4c, 0x6c, 0xd8, 0xe6, 0x24, 0xcd, 0xa6, 0xbd, 0x56, 0x12, 0xf5, 0x03, 0xa2, 0xab, - 0x6f, 0x01, 0xb7, 0x63, 0x81, 0x49, 0xec, 0x34, 0x5d, 0x72, 0xc9, 0x13, 0xb8, 0xc6, 0x47, 0x06, - 0x73, 0x78, 0xfb, 0x1f, 0xfa, 0xa5, 0xae, 0xb5, 0x6d, 0x6b, 0x7b, 0x63, 0x68, 0x21, 0xea, 0xed, - 0xa0, 0x60, 0x22, 0x6a, 0xd4, 0xdd, 0x4d, 0x1b, 0xd8, 0x79, 0xe2, 0xf2, 0x0c, 0x92, 0x31, 0xc5, - 0xa5, 0x19, 0x91, 0x62, 0x07, 0x3c, 0x4f, 0xf0, 0xd2, 0x8c, 0xa1, 0x85, 0x67, 0x8f, 0xd8, 0x57, - 0x64, 0x70, 0x92, 0x32, 0x70, 0x0e, 0xba, 0xbe, 0xd5, 0x36, 0xbb, 0x04, 0xb9, 0x17, 0xe7, 0xc6, - 0x01, 0xdd, 0x2a, 0x98, 0xbf, 0xcc, 0x92, 0xa5, 0x10, 0x9e, 0x1d, 0x08, 0x21, 0xc7, 0x80, 0xc1, - 0x7f, 0x98, 0xe2, 0xf2, 0x01, 0x4e, 0xaa, 0x1c, 0xcd, 0x09, 0x5e, 0x3e, 0x20, 0xcc, 0x44, 0xf6, - 0x10, 0xbf, 0x8c, 0x06, 0xd5, 0x8c, 0xba, 0xcf, 0x3f, 0x14, 0xc6, 0x76, 0x03, 0xcc, 0x62, 0x2c, - 0xc9, 0x87, 0x74, 0x19, 0x22, 0x41, 0x89, 0xc3, 0x7e, 0x87, 0x5e, 0x97, 0x1e, 0x7e, 0x6b, 0xb0, - 0x74, 0xb4, 0xf3, 0x00, 0x44, 0xaf, 0xd8, 0x4e, 0x3a, 0x17, 0xd7, 0x49, 0x4b, 0x62, 0x9d, 0xf4, - 0x9b, 0x84, 0xc3, 0x1c, 0x0e, 0x66, 0xfb, 0xf0, 0xea, 0x21, 0x16, 0xe0, 0x6e, 0x78, 0xe9, 0xd9, - 0xeb, 0xc5, 0xab, 0xa8, 0x5e, 0x54, 0xf6, 0x7a, 0x5d, 0xab, 0x8d, 0xe6, 0x53, 0x1f, 0x1f, 0xcb, - 0x7c, 0x8a, 0xed, 0x0f, 0xe4, 0xbe, 0xfe, 0xe0, 0x10, 0x96, 0xf4, 0xcd, 0xe0, 0x38, 0x29, 0xa2, - 0x1c, 0xb2, 0x55, 0x20, 0x41, 0xdc, 0xfa, 0x92, 0xf9, 0x88, 0xe2, 0x82, 0x4a, 0x10, 0x0a, 0x61, - 0x84, 0xa5, 0xcf, 0x74, 0xc6, 0x6e, 0x5a, 0x05, 0x89, 0xe3, 0x6c, 0x02, 0x47, 0xb2, 0xf2, 0xc4, - 0xda, 0xdd, 0xc0, 0x37, 0xda, 0x6b, 0x5f, 0xcc, 0x8f, 0x63, 0x44, 0x78, 0x06, 0xf5, 0x34, 0x95, - 0x63, 0x97, 0x34, 0xa2, 0x22, 0xc3, 0x7e, 0xa4, 0x05, 0x1f, 0xf4, 0x57, 0x8f, 0x11, 0xbf, 0x54, - 0xf5, 0x16, 0x70, 0xfc, 0xa2, 0xd9, 0xbe, 0xb4, 0xed, 0x3a, 0x7b, 0xf8, 0xee, 0x6f, 0x87, 0x5e, - 0x22, 0xbe, 0x7a, 0xcc, 0xe8, 0x7f, 0xa1, 0xde, 0x11, 0x98, 0x0e, 0x85, 0x61, 0xa6, 0xc3, 0xea, - 0x31, 0x6a, 0x3c, 0xa8, 0x4f, 0x0c, 0x3b, 0x9d, 0x62, 0x62, 0xa7, 0xb3, 0x7a, 0x2c, 0xe8, 0x76, - 0xd4, 0x0a, 0x98, 0xee, 0x58, 0x97, 0xf1, 0x56, 0x35, 0x9e, 0x75, 0x0d, 0x0b, 0x3a, 0x54, 0xb1, - 0x2e, 0x93, 0x8d, 0xed, 0xd5, 0x63, 0x46, 0xf8, 0xa5, 0xba, 0x02, 0x66, 0xf0, 0xb6, 0x00, 0x26, - 0x33, 0x9d, 0x2a, 0xa0, 0xd0, 0xea, 0x31, 0x23, 0xfa, 0x16, 0x59, 0x1f, 0x79, 0x7c, 0xee, 0xfa, - 0xde, 0x60, 0xbb, 0x3d, 0x97, 0x6a, 0xbb, 0x1d, 0xc9, 0x82, 0x6c, 0xb8, 0x9f, 0x02, 0x85, 0x36, - 0x96, 0xb0, 0x44, 0x25, 0x4c, 0x1e, 0xd5, 0xbb, 0x41, 0x7e, 0xd7, 0x74, 0x83, 0xc9, 0xf3, 0x4d, - 0xc3, 0xe9, 0xae, 0x99, 0xee, 0x25, 0x84, 0x20, 0xfa, 0x6a, 0x69, 0x0a, 0x14, 0xb0, 0xe0, 0xc2, - 0x3f, 0xda, 0xdb, 0xf2, 0xc4, 0x0c, 0x29, 0x3b, 0x36, 0x1a, 0xf6, 0x5b, 0x4e, 0x70, 0x38, 0xfd, - 0xd7, 0x72, 0xe3, 0xb1, 0x20, 0xaf, 0x62, 0xae, 0xfa, 0xb0, 0xad, 0x67, 0xef, 0xc1, 0xfb, 0xe1, - 0x3e, 0x5d, 0x12, 0x1d, 0xf4, 0x4a, 0x3d, 0x03, 0x80, 0x4f, 0x4f, 0xea, 0x85, 0x41, 0x4c, 0x99, - 0x94, 0x68, 0xf9, 0xa0, 0x30, 0xdc, 0x51, 0xe5, 0x77, 0x46, 0x30, 0x5d, 0xfa, 0x05, 0x11, 0x3f, - 0x03, 0xef, 0x5a, 0x36, 0x53, 0xe7, 0xe0, 0x31, 0x65, 0xa7, 0x94, 0xd6, 0xa8, 0x19, 0xc2, 0x5e, - 0xf6, 0x7d, 0xd3, 0x5b, 0xf2, 0xe4, 0xb6, 0x03, 0x72, 0x02, 0x5a, 0x7f, 0xd0, 0xf2, 0x7c, 0xcb, - 0xde, 0xa6, 0xe7, 0x9b, 0x3f, 0x33, 0x16, 0xa5, 0x19, 0x30, 0xe0, 0xc8, 0x03, 0x07, 0x9c, 0x03, - 0x01, 0x82, 0xf2, 0x43, 0x02, 0x04, 0x15, 0xd2, 0xad, 0x1c, 0x7e, 0x84, 0xd5, 0x9f, 0x75, 0x5e, - 0x7f, 0xee, 0x8a, 0x01, 0x68, 0x90, 0x5c, 0xc6, 0x62, 0xdf, 0xbc, 0x2b, 0xd4, 0x94, 0x26, 0xa7, - 0x29, 0xf7, 0x8e, 0xce, 0x48, 0xf6, 0xda, 0xf2, 0xa1, 0x3c, 0xb8, 0x2a, 0x62, 0xa6, 0x0e, 0xaf, - 0x50, 0x45, 0xf9, 0xfd, 0xb1, 0x28, 0x4a, 0x7a, 0x47, 0xe7, 0xac, 0x35, 0xe6, 0xb7, 0x84, 0xcf, - 0xed, 0xf7, 0x03, 0x15, 0xca, 0x26, 0x46, 0x59, 0x4e, 0x81, 0x22, 0xe9, 0x61, 0x28, 0x34, 0xf4, - 0x29, 0x65, 0x77, 0x23, 0x76, 0xda, 0x5f, 0x94, 0xb7, 0x09, 0xe8, 0x0f, 0x5d, 0xd7, 0x68, 0xed, - 0xb9, 0x76, 0xd5, 0xf6, 0x1d, 0xed, 0x07, 0xc7, 0xa2, 0x38, 0xa1, 0x37, 0x9c, 0x3c, 0x8a, 0x37, - 0xdc, 0x48, 0xab, 0x1c, 0x41, 0x0d, 0x8e, 0x64, 0x95, 0x23, 0xa6, 0xf0, 0xec, 0xf1, 0x7b, 0xa7, - 0x0c, 0x4e, 0xd1, 0xc9, 0xd6, 0x12, 0x6f, 0x21, 0x6a, 0x17, 0xc6, 0x01, 0xe4, 0xc9, 0xc0, 0x4c, - 0xa2, 0x7e, 0xf4, 0xf8, 0x81, 0x8f, 0x52, 0x90, 0x78, 0x9b, 0x25, 0x37, 0x1d, 0xec, 0xe3, 0x70, - 0x2c, 0x48, 0x89, 0x5d, 0x62, 0x99, 0x82, 0x8d, 0xec, 0x31, 0x7b, 0xa9, 0x0c, 0x8a, 0x24, 0x46, - 0x82, 0xb6, 0x91, 0x89, 0xc3, 0x04, 0x7f, 0x3f, 0x8b, 0xc0, 0x8e, 0x1c, 0xe1, 0x26, 0xb3, 0xf8, - 0x11, 0x69, 0xf6, 0xe2, 0x06, 0xb2, 0x32, 0x01, 0x17, 0x42, 0x09, 0xcc, 0x36, 0xa1, 0x5f, 0x36, - 0x5d, 0xd7, 0x32, 0xb7, 0xc7, 0xe5, 0xf1, 0x2d, 0xea, 0x3d, 0xac, 0x7d, 0x23, 0x27, 0x7a, 0x96, - 0x3d, 0x5c, 0x08, 0x0f, 0x58, 0x8d, 0x89, 0x02, 0xfe, 0x7a, 0xa1, 0xf3, 0xea, 0xc3, 0xa8, 0x4d, - 0xc0, 0x63, 0x5b, 0x02, 0x53, 0x41, 0x1c, 0x8c, 0xdb, 0xb8, 0xd8, 0x28, 0x3b, 0xfe, 0x6e, 0x70, - 0x0c, 0x06, 0xff, 0x3f, 0x18, 0x7f, 0x41, 0x7b, 0x65, 0x4a, 0x47, 0xf9, 0xe4, 0x20, 0x1e, 0xe9, - 0xda, 0x58, 0x1a, 0x77, 0xf8, 0xa3, 0x0a, 0xdb, 0xf1, 0xcb, 0x53, 0x74, 0x39, 0xb2, 0x66, 0xfa, - 0xf0, 0x41, 0xed, 0x0f, 0x65, 0x30, 0xd5, 0x84, 0x3e, 0x1a, 0x6f, 0x11, 0xfb, 0x87, 0xd6, 0x70, - 0x95, 0x59, 0xf1, 0xa0, 0x67, 0x6b, 0xd5, 0xfb, 0xc0, 0x4c, 0xcf, 0x75, 0xda, 0xd0, 0xf3, 0xe8, - 0xea, 0x05, 0xeb, 0xa8, 0x36, 0x68, 0xf4, 0xc7, 0xac, 0x2d, 0xae, 0x07, 0xdf, 0x18, 0xd1, 0xe7, - 0x69, 0xcd, 0x00, 0x42, 0x89, 0x56, 0x70, 0xd2, 0x66, 0x40, 0x52, 0xe1, 0xd9, 0x03, 0xfd, 0xbb, - 0x32, 0x98, 0x6b, 0x42, 0x3f, 0x94, 0x62, 0x8a, 0x4d, 0x8e, 0x78, 0x78, 0x39, 0x28, 0xe5, 0xc3, - 0x41, 0xf9, 0x4e, 0xe1, 0x4b, 0x61, 0x79, 0x69, 0x86, 0xc4, 0xc6, 0x82, 0xe7, 0x5b, 0x84, 0xee, - 0x82, 0x15, 0xe3, 0x60, 0x02, 0xc7, 0xd7, 0x1e, 0x0b, 0x66, 0x30, 0x2f, 0xb8, 0xc1, 0xfe, 0x68, - 0x3e, 0x6a, 0xbc, 0x5f, 0xc8, 0xa8, 0xf1, 0xde, 0x03, 0x0a, 0xbb, 0xa6, 0x7b, 0x29, 0x38, 0x7c, - 0xfb, 0x38, 0xb1, 0xd5, 0x2f, 0xcf, 0x20, 0x5f, 0x0d, 0xf6, 0xd3, 0x2c, 0xa4, 0xf3, 0xd3, 0x7c, - 0xbd, 0x94, 0x6a, 0x24, 0x24, 0x73, 0x87, 0x31, 0x36, 0xf9, 0x14, 0xe3, 0x66, 0x42, 0xd9, 0xd9, - 0x2b, 0xc7, 0x8b, 0x65, 0x30, 0x8d, 0xc6, 0x6d, 0x6c, 0x8f, 0x9f, 0x3f, 0xbc, 0x3a, 0x0c, 0x36, - 0xf4, 0x53, 0xf6, 0xc0, 0x81, 0x44, 0xc6, 0x67, 0xde, 0xa7, 0xe8, 0x81, 0x93, 0x0a, 0xcf, 0x1e, - 0x8f, 0x77, 0x13, 0x3c, 0x70, 0x7b, 0xd0, 0xde, 0x20, 0x03, 0x79, 0x05, 0xfa, 0x93, 0xb6, 0x22, - 0xdf, 0x2e, 0x1c, 0x5e, 0x94, 0x13, 0x18, 0xe6, 0x79, 0x71, 0x05, 0x8e, 0xa7, 0x01, 0x89, 0xc5, - 0x15, 0x15, 0x62, 0x20, 0x7b, 0xd4, 0xde, 0x4f, 0x50, 0x23, 0x9b, 0x0b, 0x3f, 0x30, 0x86, 0x5e, - 0x75, 0xb2, 0x0b, 0x1f, 0x81, 0x00, 0x31, 0x8d, 0xa3, 0x6a, 0x6f, 0x83, 0x0a, 0xcf, 0x1e, 0xb9, - 0x9f, 0x91, 0xf1, 0x25, 0x66, 0xe5, 0x1d, 0xd8, 0xbe, 0x04, 0x3b, 0xec, 0x45, 0xce, 0xa3, 0x42, - 0x77, 0x1a, 0x4c, 0xb5, 0x09, 0x35, 0x0c, 0xde, 0xb4, 0x11, 0x3c, 0xf2, 0x37, 0x0b, 0x25, 0xde, - 0x9d, 0xc5, 0x77, 0x44, 0xe4, 0xf3, 0xb1, 0xe0, 0x22, 0x76, 0xe1, 0x95, 0x40, 0xf1, 0x13, 0x30, - 0x5b, 0xc8, 0x2c, 0xa3, 0xda, 0x76, 0x6c, 0xed, 0xfb, 0x0f, 0x0f, 0xcb, 0xb5, 0x60, 0xc6, 0x6a, - 0x3b, 0x36, 0x0e, 0x01, 0x17, 0x1c, 0x02, 0x0a, 0x13, 0x82, 0xb7, 0xfa, 0xae, 0xf3, 0x80, 0x45, - 0x77, 0xcd, 0xa3, 0x84, 0x51, 0x8d, 0x09, 0xc4, 0xfa, 0x51, 0x19, 0x13, 0x03, 0xca, 0xce, 0x1e, - 0xb2, 0x4f, 0x44, 0xde, 0x6d, 0xa4, 0x2b, 0x7c, 0x44, 0xac, 0x02, 0x8f, 0x32, 0x9c, 0xb1, 0xb5, - 0x38, 0x92, 0xe1, 0x2c, 0x81, 0x81, 0x09, 0xdc, 0x44, 0x18, 0xe1, 0x98, 0xf9, 0x1a, 0xf0, 0x21, - 0xd0, 0x19, 0x9f, 0x79, 0x38, 0x22, 0x3a, 0x47, 0x63, 0x22, 0x7e, 0x98, 0x86, 0xa7, 0xa7, 0x16, - 0x8f, 0xf6, 0x3f, 0xc6, 0x01, 0xce, 0x5d, 0xa3, 0xf8, 0x2b, 0x10, 0x6f, 0x05, 0xed, 0xad, 0x92, - 0x68, 0x08, 0x94, 0x03, 0x12, 0x44, 0x54, 0xc6, 0x82, 0xe0, 0x9b, 0x84, 0x62, 0x93, 0x88, 0x94, - 0x9f, 0x3d, 0x80, 0x2f, 0x92, 0xc1, 0x02, 0xf6, 0x11, 0xe8, 0x42, 0xd3, 0x25, 0x1d, 0xe5, 0x58, - 0x1c, 0xe5, 0xdf, 0x2d, 0x1c, 0xe0, 0x87, 0x97, 0x43, 0xc4, 0xc7, 0x58, 0xa0, 0x10, 0x8b, 0xee, - 0x23, 0xc8, 0xc2, 0x44, 0xb6, 0x51, 0x94, 0x90, 0x05, 0xaa, 0xe2, 0xe3, 0xc1, 0x23, 0xa5, 0x47, - 0x2e, 0x2f, 0x8c, 0xa0, 0xb1, 0x4d, 0xd8, 0x23, 0x57, 0x84, 0x89, 0xec, 0x31, 0x79, 0xc3, 0xed, - 0x74, 0xc1, 0xb9, 0x65, 0x5e, 0xec, 0x42, 0xed, 0xd5, 0xf9, 0xf0, 0x44, 0xdb, 0xef, 0x8e, 0xc5, - 0x03, 0xf3, 0x10, 0x97, 0x51, 0xa9, 0x20, 0xef, 0x3a, 0x57, 0xc8, 0xd2, 0xd6, 0xbc, 0x81, 0xff, - 0x93, 0x78, 0x96, 0xdd, 0xbd, 0x5d, 0x9b, 0x9c, 0x0c, 0x9d, 0x37, 0x82, 0x47, 0xf5, 0x46, 0x30, - 0x7f, 0xc5, 0xf2, 0x77, 0x56, 0xa1, 0xd9, 0x81, 0xae, 0xe1, 0x5c, 0xc1, 0x1e, 0x73, 0xd3, 0x06, - 0x9f, 0xc8, 0xfb, 0xaf, 0x08, 0xd8, 0x97, 0x48, 0x28, 0x93, 0x39, 0xfe, 0x96, 0xc6, 0xf2, 0x8c, - 0xe7, 0x2a, 0x7b, 0x85, 0xf9, 0x80, 0x0c, 0x66, 0x0c, 0xe7, 0x0a, 0x55, 0x92, 0xff, 0xe3, 0x68, - 0x75, 0x24, 0xf5, 0x44, 0x0f, 0x4b, 0x2e, 0x64, 0x7f, 0xe2, 0x13, 0xbd, 0xc4, 0xe2, 0x27, 0x72, - 0x72, 0x69, 0xce, 0x70, 0xae, 0x34, 0xa1, 0x4f, 0x5a, 0x84, 0xb6, 0x39, 0x26, 0x27, 0x6b, 0xcb, - 0x23, 0x04, 0xe9, 0x3c, 0x3c, 0x7c, 0x4e, 0xbb, 0x8b, 0x10, 0x0a, 0x28, 0x64, 0x71, 0xd2, 0xbb, - 0x08, 0x43, 0x39, 0x98, 0x40, 0x8c, 0x14, 0x19, 0xcc, 0x1a, 0xce, 0x15, 0x34, 0x34, 0x2c, 0x5b, - 0xdd, 0xee, 0x78, 0x46, 0xc8, 0xb4, 0xc6, 0x7f, 0x20, 0x86, 0x80, 0x8b, 0x89, 0x1b, 0xff, 0x43, - 0x18, 0xc8, 0x1e, 0x86, 0xe7, 0x93, 0xc6, 0x12, 0x8c, 0xd0, 0xf6, 0x78, 0x70, 0x18, 0xb5, 0x41, - 0x84, 0x6c, 0x1c, 0x59, 0x83, 0x88, 0xe3, 0x60, 0x22, 0x3b, 0x27, 0x0b, 0x65, 0x3c, 0xcc, 0x8f, - 0xb7, 0x4d, 0xbc, 0x37, 0x9d, 0x6b, 0x22, 0x1d, 0x76, 0x39, 0x46, 0xc6, 0x82, 0x46, 0x0a, 0x17, - 0x44, 0x01, 0x1e, 0xb2, 0xc7, 0xe3, 0xa3, 0x32, 0x98, 0x23, 0x2c, 0x3c, 0x42, 0xac, 0x80, 0x91, - 0x1a, 0x15, 0x5b, 0x83, 0xa3, 0x69, 0x54, 0x09, 0x1c, 0x4c, 0xe4, 0x3e, 0x7f, 0x64, 0xc7, 0x8d, - 0x70, 0x7c, 0x3c, 0x0e, 0xc1, 0x91, 0x8d, 0xb1, 0x31, 0x1e, 0x21, 0x1f, 0xc5, 0x18, 0x3b, 0xa2, - 0x63, 0xe4, 0xcf, 0x0f, 0x5b, 0xd1, 0x38, 0x31, 0x38, 0x44, 0x53, 0x18, 0x23, 0x0c, 0x23, 0x36, - 0x85, 0x23, 0x42, 0xe2, 0x4f, 0x65, 0x00, 0x08, 0x03, 0x6b, 0xce, 0x65, 0x7c, 0x91, 0xe6, 0x18, - 0xba, 0xb3, 0x7e, 0xb7, 0x7a, 0x79, 0x88, 0x5b, 0x7d, 0xca, 0x10, 0x2e, 0x69, 0x57, 0x02, 0x19, - 0x29, 0xa3, 0x4a, 0x4e, 0x7c, 0x25, 0x30, 0xb9, 0xfc, 0xec, 0x31, 0xfe, 0x32, 0xb1, 0xe6, 0xa2, - 0x03, 0xa6, 0x3f, 0x3b, 0x16, 0x94, 0x99, 0xd9, 0xbf, 0xcc, 0xcf, 0xfe, 0x0f, 0x81, 0xed, 0xa8, - 0x36, 0xe2, 0xb0, 0x83, 0xa3, 0xd9, 0xdb, 0x88, 0x47, 0x77, 0x40, 0xf4, 0x07, 0xf2, 0xe0, 0x38, - 0xed, 0x44, 0xbe, 0x1d, 0x20, 0x4e, 0x79, 0x0e, 0x8f, 0xeb, 0x24, 0x87, 0xa0, 0x3c, 0xae, 0x05, - 0xa9, 0x34, 0x4b, 0x99, 0x02, 0xec, 0x4d, 0x64, 0x75, 0xa3, 0xa8, 0x3f, 0xd8, 0x33, 0xed, 0x8e, - 0x78, 0xb8, 0xdf, 0x21, 0xc0, 0x07, 0x6b, 0x8d, 0x32, 0xbf, 0xd6, 0x38, 0x60, 0x65, 0x32, 0xf5, - 0xce, 0x35, 0x16, 0x19, 0x61, 0x77, 0xe2, 0x3b, 0xd7, 0xf1, 0x65, 0x67, 0x8f, 0xd2, 0x7b, 0x65, - 0x90, 0x6f, 0x3a, 0xae, 0xaf, 0xbd, 0x20, 0x4d, 0xeb, 0x24, 0x92, 0x8f, 0x40, 0x0a, 0x9e, 0xd5, - 0x32, 0xc8, 0xa3, 0xca, 0xd1, 0x19, 0xc3, 0x6d, 0xc9, 0x47, 0x9d, 0x4d, 0xdf, 0xc4, 0x5e, 0xdd, - 0xa8, 0xfc, 0xc5, 0xd6, 0x7e, 0x0f, 0x1a, 0xf8, 0xe3, 0xb4, 0xf1, 0x74, 0x88, 0xfc, 0x9a, 0xf1, - 0x07, 0x30, 0x32, 0x8b, 0xa7, 0x13, 0x5b, 0x72, 0xf6, 0xb8, 0x3d, 0x7c, 0x9c, 0xfa, 0xb6, 0x2e, - 0x5b, 0x5d, 0xa8, 0xbd, 0x80, 0xb8, 0x8c, 0xd4, 0xcd, 0x5d, 0x28, 0x7e, 0x24, 0x26, 0xd1, 0xb5, - 0x15, 0xc7, 0x97, 0x95, 0xa3, 0xf8, 0xb2, 0x69, 0x1b, 0x14, 0x39, 0x80, 0x4e, 0x58, 0x9a, 0x74, - 0x83, 0x4a, 0x28, 0x7b, 0x22, 0x71, 0x3a, 0x4f, 0x34, 0xa1, 0x4f, 0x8c, 0xca, 0x46, 0x70, 0x45, - 0xd2, 0xf7, 0x8e, 0x25, 0x62, 0x67, 0x78, 0xa1, 0x8e, 0xdc, 0x77, 0x03, 0xd3, 0x07, 0x58, 0x70, - 0xd6, 0x78, 0x70, 0xbe, 0x3b, 0x5e, 0x40, 0x3c, 0x93, 0x63, 0x81, 0xe9, 0xed, 0x21, 0x4c, 0xeb, - 0x1c, 0x4c, 0x77, 0x8f, 0xc8, 0x45, 0xf6, 0x80, 0xfd, 0x78, 0x01, 0x1c, 0x27, 0x93, 0xfe, 0x92, - 0xdd, 0xa1, 0x11, 0x56, 0xdf, 0x2c, 0x1d, 0xf1, 0x66, 0xdb, 0xc1, 0x10, 0xac, 0x5c, 0x2c, 0xe7, - 0x42, 0x5f, 0x2c, 0x67, 0x75, 0x89, 0x84, 0x73, 0x45, 0x9d, 0x28, 0xde, 0x69, 0x1b, 0x16, 0x66, - 0x02, 0xcb, 0x1e, 0x77, 0xb9, 0xe1, 0x77, 0xfc, 0x3d, 0xa2, 0x53, 0xe2, 0xf7, 0x88, 0xfe, 0x76, - 0xba, 0x75, 0x3b, 0x5c, 0x74, 0x9f, 0xc0, 0x33, 0xb6, 0x9d, 0x52, 0xac, 0xe8, 0x09, 0x70, 0xf7, - 0x5f, 0xc3, 0x9d, 0x2c, 0x8a, 0x20, 0x32, 0xa2, 0x3b, 0x19, 0x26, 0x70, 0x94, 0xee, 0x64, 0xc3, - 0x18, 0xc8, 0x1e, 0xc7, 0xdf, 0x2e, 0xd0, 0xdd, 0x7c, 0xdc, 0x6e, 0xb4, 0x3f, 0x96, 0x32, 0x1f, - 0xa5, 0xbf, 0x99, 0x4b, 0xe5, 0xff, 0x8c, 0xf9, 0x4a, 0x1e, 0xa6, 0xd3, 0x78, 0x34, 0x27, 0x91, - 0x9b, 0xc0, 0xba, 0x91, 0x84, 0x7d, 0xd1, 0xcf, 0x5b, 0x1d, 0x7f, 0x67, 0x4c, 0x27, 0x3a, 0xae, - 0x20, 0x5a, 0x34, 0x5e, 0x3d, 0x79, 0xd0, 0xfe, 0x35, 0x97, 0x2a, 0x84, 0x54, 0x28, 0x12, 0xcc, - 0x56, 0x8c, 0x88, 0x53, 0x04, 0x7e, 0x4a, 0xa4, 0x37, 0x41, 0x8d, 0x3e, 0x67, 0x75, 0xa0, 0xf3, - 0x08, 0xd4, 0x68, 0xcc, 0xd7, 0xf8, 0x34, 0x3a, 0x89, 0xdc, 0x7f, 0x51, 0x8d, 0x0e, 0x45, 0x32, - 0x26, 0x8d, 0x4e, 0xa4, 0x97, 0xbd, 0x8c, 0x5f, 0x39, 0x47, 0x27, 0x52, 0x35, 0xcb, 0xbe, 0xa4, - 0xfd, 0x53, 0x11, 0x28, 0x41, 0x1c, 0x61, 0x7f, 0x87, 0xc6, 0x82, 0xf9, 0x90, 0xf0, 0xdd, 0x28, - 0x23, 0xc4, 0x7b, 0xe1, 0xc3, 0x49, 0x15, 0x0e, 0x84, 0x93, 0x2a, 0x81, 0x79, 0xcb, 0xf6, 0xa1, - 0x6b, 0x9b, 0xdd, 0xe5, 0xae, 0xb9, 0xed, 0x9d, 0x9e, 0x1a, 0x78, 0x79, 0x5d, 0x95, 0xc9, 0x63, - 0xf0, 0x5f, 0xb0, 0x17, 0x88, 0x4e, 0xf3, 0x17, 0x88, 0xc6, 0x44, 0xbf, 0x9a, 0x89, 0x8f, 0x7e, - 0x15, 0x46, 0xb7, 0x02, 0xc3, 0x83, 0x63, 0x8b, 0xda, 0xc6, 0x29, 0xc3, 0xfd, 0xdd, 0x26, 0x18, - 0x85, 0x2d, 0x0c, 0xfd, 0xf8, 0x1a, 0x39, 0xd5, 0xea, 0x1e, 0x52, 0x84, 0xc5, 0x7e, 0x25, 0x48, - 0x6d, 0xa1, 0xb2, 0x95, 0x97, 0xfb, 0x2a, 0x1f, 0x9a, 0x3c, 0x79, 0x01, 0x93, 0x87, 0x55, 0xaa, - 0x82, 0xe8, 0x9d, 0xae, 0xe2, 0x8b, 0x85, 0x22, 0xb5, 0x9d, 0xc0, 0x69, 0xa4, 0x02, 0x38, 0x11, - 0x44, 0xbb, 0xed, 0xf5, 0xa0, 0xe9, 0x9a, 0x76, 0x1b, 0x6a, 0x9f, 0x90, 0xc6, 0x61, 0xf6, 0x2e, - 0x83, 0x69, 0xab, 0xed, 0xd8, 0x4d, 0xeb, 0x39, 0xc1, 0xe5, 0x72, 0xc9, 0x41, 0xd6, 0xb1, 0x44, - 0xaa, 0xf4, 0x0b, 0x23, 0xfc, 0x56, 0xad, 0x82, 0x99, 0xb6, 0xe9, 0x76, 0x48, 0x10, 0xbe, 0x42, - 0xdf, 0x45, 0x4e, 0xb1, 0x84, 0xca, 0xc1, 0x27, 0x46, 0xf4, 0xb5, 0xda, 0xe0, 0x85, 0x58, 0xec, - 0x8b, 0xe6, 0x11, 0x4b, 0xac, 0x12, 0x7d, 0xc4, 0xc9, 0x1c, 0x49, 0xc7, 0x85, 0x5d, 0x93, 0x5c, - 0x3a, 0x3e, 0x45, 0xee, 0x88, 0x0e, 0x13, 0xd2, 0x2e, 0x0f, 0xe0, 0xa2, 0x0e, 0xa0, 0x31, 0xe9, - 0xe5, 0x01, 0x21, 0x2e, 0xb2, 0xd7, 0xcc, 0x77, 0x15, 0xc1, 0x3c, 0xe9, 0xd5, 0xa8, 0x38, 0xb5, - 0x17, 0xc9, 0xa0, 0xd8, 0x84, 0xfe, 0xfd, 0x70, 0x5f, 0x6b, 0x1e, 0x7e, 0x4c, 0x56, 0x80, 0x7c, - 0x29, 0x0c, 0x38, 0x88, 0xfe, 0xa6, 0xdd, 0xb7, 0x0f, 0xf8, 0x5a, 0x24, 0x3c, 0x4d, 0x7a, 0xdf, - 0x3e, 0xb9, 0xf8, 0xec, 0xf1, 0xf9, 0x09, 0x19, 0xc8, 0xa5, 0x4e, 0x47, 0x6b, 0x1f, 0x1e, 0x8a, - 0xeb, 0xc1, 0x6c, 0xd0, 0x66, 0xa2, 0x18, 0x90, 0x6c, 0x52, 0xda, 0x45, 0xd0, 0x50, 0x36, 0xa5, - 0xce, 0xc4, 0x77, 0x15, 0x12, 0xca, 0xce, 0x1e, 0x94, 0x2f, 0x4c, 0xd1, 0x46, 0xb3, 0xe4, 0x38, - 0x97, 0xf0, 0x51, 0x99, 0x5f, 0x94, 0x41, 0x61, 0x19, 0xfa, 0xed, 0x1d, 0xcd, 0x1b, 0x4b, 0x9b, - 0xe9, 0xbb, 0xf7, 0x7c, 0x48, 0x50, 0xce, 0xb4, 0xd1, 0x9f, 0x03, 0xb6, 0x17, 0x31, 0xcb, 0x93, - 0x8e, 0xfe, 0x9c, 0x58, 0xfa, 0x04, 0x0e, 0xc1, 0xe5, 0xc1, 0x42, 0xb8, 0x02, 0x46, 0x30, 0x7b, - 0x47, 0xee, 0x11, 0xb7, 0x1e, 0x3a, 0xc4, 0x6e, 0xd6, 0x7e, 0x3f, 0x5d, 0x88, 0xb5, 0x50, 0xe6, - 0x7c, 0xcd, 0x33, 0x5e, 0x98, 0x4c, 0x11, 0x7c, 0x4d, 0x8c, 0xc1, 0x09, 0xac, 0x00, 0xc8, 0x60, - 0x1a, 0x33, 0x54, 0xb1, 0x2e, 0x63, 0xd7, 0x43, 0x6e, 0xa1, 0xf2, 0xb9, 0x63, 0x59, 0xa8, 0xbc, - 0x9b, 0x5f, 0xa8, 0x14, 0x8c, 0x98, 0x1c, 0xac, 0x53, 0xa6, 0xf4, 0xc5, 0x41, 0xdf, 0x8f, 0x7d, - 0x99, 0x32, 0x85, 0x2f, 0xce, 0x90, 0xf2, 0xb3, 0x47, 0xf4, 0x8d, 0xff, 0x9d, 0x76, 0xd6, 0xc1, - 0x86, 0xac, 0xf6, 0xbf, 0x4e, 0x80, 0xfc, 0x39, 0xf4, 0xe7, 0x1f, 0xa3, 0x1b, 0xb5, 0x5e, 0x3e, - 0x86, 0xe0, 0x0e, 0x4f, 0x07, 0x79, 0x44, 0x9f, 0x4e, 0x7b, 0x6e, 0x11, 0xdb, 0x1d, 0x46, 0x8c, - 0x18, 0xf8, 0x3b, 0xf5, 0x14, 0x28, 0x7a, 0xce, 0x9e, 0xdb, 0x46, 0xe6, 0x37, 0xd2, 0x18, 0xfa, - 0x94, 0x36, 0xa8, 0x29, 0x47, 0x7a, 0x71, 0x7c, 0x2e, 0xa7, 0xcc, 0x05, 0x4b, 0x32, 0x77, 0xc1, - 0x52, 0x8a, 0xfd, 0x07, 0x01, 0xde, 0xb2, 0xd7, 0x88, 0x3f, 0xc6, 0x77, 0x0d, 0x76, 0xc6, 0x05, - 0x7b, 0x8c, 0x58, 0x0e, 0xab, 0x0e, 0x69, 0x1d, 0xc6, 0x79, 0xd1, 0x86, 0x71, 0xe4, 0x27, 0xea, - 0x30, 0x2e, 0xc0, 0xc3, 0x44, 0x4e, 0xb9, 0x17, 0xa9, 0x93, 0xeb, 0x85, 0x71, 0xa2, 0x9b, 0xe7, - 0x94, 0xfe, 0x50, 0xe8, 0x8c, 0xd1, 0xf9, 0x75, 0x64, 0x74, 0x8e, 0xc8, 0xfd, 0xf5, 0xd7, 0x65, - 0x1c, 0x49, 0x33, 0x30, 0x82, 0xc4, 0x2f, 0x4a, 0x4a, 0x0d, 0x11, 0x1a, 0x83, 0xb9, 0x38, 0xd2, - 0xf3, 0xa3, 0x87, 0x16, 0xe7, 0x45, 0xc7, 0xf0, 0x3f, 0xe9, 0xd0, 0xe2, 0xa2, 0x8c, 0x64, 0x0f, - 0xe4, 0x2f, 0x90, 0x8b, 0xc9, 0x4a, 0x6d, 0xdf, 0xba, 0x3c, 0xe6, 0x96, 0xc6, 0x0f, 0x2f, 0x29, - 0xa3, 0x09, 0x1f, 0x90, 0x10, 0xe1, 0x70, 0xd2, 0xd1, 0x84, 0xc5, 0xd8, 0xc8, 0x1e, 0xa6, 0x1f, - 0x03, 0x48, 0x7a, 0x74, 0x6d, 0xe7, 0x0d, 0x32, 0x90, 0x9b, 0xd0, 0xd7, 0xe0, 0xe1, 0xd1, 0x3a, - 0x0b, 0xe6, 0x98, 0xa5, 0x83, 0xe0, 0xc2, 0x1b, 0x2e, 0x2d, 0xed, 0x41, 0xf9, 0x50, 0x64, 0xec, - 0xa2, 0xcb, 0xa4, 0x0f, 0xca, 0x8b, 0x30, 0x31, 0x81, 0x83, 0xf2, 0x74, 0xd9, 0xe7, 0xdb, 0x05, - 0xa8, 0x71, 0xad, 0x00, 0x1d, 0x0a, 0xa8, 0xa3, 0x58, 0x0a, 0x7a, 0x7b, 0x64, 0x6c, 0x4c, 0x08, - 0xab, 0x0f, 0xb1, 0x58, 0x35, 0x78, 0xac, 0xee, 0x14, 0x11, 0x93, 0x98, 0xf1, 0x21, 0x34, 0xc1, - 0x7f, 0x67, 0x08, 0x97, 0xc1, 0xc1, 0xf5, 0xf4, 0x91, 0xf9, 0xc8, 0x1e, 0xb1, 0x9f, 0x23, 0xe3, - 0x56, 0x93, 0xcc, 0xad, 0xc6, 0x33, 0x6e, 0xd1, 0x69, 0x9b, 0xcc, 0x4d, 0xdb, 0x52, 0x1e, 0xac, - 0x88, 0xfc, 0x85, 0x03, 0xe6, 0x86, 0x41, 0x94, 0x1f, 0xf3, 0xc1, 0x8a, 0xa1, 0x1c, 0x64, 0x0f, - 0xce, 0xd7, 0x64, 0x00, 0x56, 0x5c, 0x67, 0xaf, 0xd7, 0x70, 0x3b, 0xd0, 0xd5, 0xfe, 0x2c, 0x9a, - 0xa9, 0xfd, 0xe4, 0x18, 0x66, 0x6a, 0xeb, 0x00, 0x6c, 0x87, 0xc4, 0xa9, 0x86, 0xdf, 0x2e, 0x36, - 0x2f, 0x8b, 0x98, 0x32, 0x18, 0x1a, 0xfc, 0xdd, 0xc2, 0xcf, 0xe4, 0x31, 0x4e, 0xea, 0xb3, 0x22, - 0x72, 0xe3, 0x9c, 0xa9, 0xbd, 0x3b, 0xc4, 0xba, 0xc5, 0x61, 0xfd, 0x8c, 0x43, 0x70, 0x92, 0x3d, - 0xe6, 0xff, 0x30, 0x05, 0x66, 0xc9, 0xbe, 0x2c, 0x91, 0xe9, 0xdf, 0x44, 0xa0, 0xff, 0xec, 0x18, - 0x40, 0xdf, 0x00, 0x73, 0x4e, 0x44, 0x9d, 0xf4, 0xa9, 0xec, 0x4a, 0x59, 0x22, 0xec, 0x0c, 0x5f, - 0x06, 0x47, 0x46, 0xfb, 0x18, 0x8b, 0xbc, 0xc1, 0x23, 0x7f, 0x77, 0x82, 0xbc, 0x19, 0x8a, 0xe3, - 0x84, 0xfe, 0x3d, 0x21, 0xf4, 0x1b, 0x1c, 0xf4, 0xa5, 0xc3, 0xb0, 0x32, 0x81, 0x7b, 0x15, 0x64, - 0x90, 0xc7, 0xc7, 0x20, 0xdf, 0x92, 0xe1, 0x42, 0xcc, 0x69, 0x30, 0x85, 0x9b, 0x6c, 0x38, 0x41, - 0x0c, 0x1e, 0xd1, 0x1b, 0x73, 0xcb, 0x87, 0x6e, 0xb8, 0xc4, 0x1e, 0x3c, 0x22, 0x1e, 0x02, 0xf7, - 0x73, 0xef, 0x74, 0x91, 0xec, 0x38, 0x87, 0x09, 0x23, 0xcf, 0x1e, 0x59, 0x89, 0x8f, 0xed, 0x60, - 0xe4, 0x28, 0xb3, 0xc7, 0x21, 0x8c, 0x64, 0x0f, 0xfc, 0x17, 0xf3, 0xe0, 0x34, 0x59, 0xfe, 0x5b, - 0x76, 0x9d, 0xdd, 0xbe, 0x6b, 0xcc, 0xac, 0xc3, 0xeb, 0xc2, 0x4d, 0x60, 0xc1, 0xe7, 0x1c, 0xef, - 0xa9, 0x4e, 0xf4, 0xa5, 0x6a, 0xbf, 0xc3, 0x3a, 0xcf, 0x3c, 0x8b, 0x47, 0x72, 0x29, 0x41, 0x80, - 0x71, 0xbc, 0xa7, 0xde, 0x51, 0x11, 0x64, 0x94, 0x59, 0x4d, 0x94, 0x47, 0x5a, 0x5c, 0x0e, 0x75, - 0xaa, 0x20, 0xa2, 0x53, 0x1f, 0x0c, 0x75, 0xea, 0xbf, 0x71, 0x3a, 0xb5, 0x72, 0x78, 0x91, 0x4c, - 0x60, 0x89, 0x69, 0x01, 0x14, 0x97, 0xad, 0xae, 0x0f, 0x5d, 0xed, 0xcb, 0x74, 0x1e, 0xf5, 0xea, - 0x0c, 0xbb, 0x97, 0x0a, 0x28, 0x6e, 0xe1, 0xd2, 0xa8, 0x41, 0x76, 0xab, 0x18, 0x36, 0x84, 0x43, - 0x83, 0x7e, 0x9b, 0x36, 0xc8, 0x5f, 0x1f, 0x99, 0xb1, 0x4d, 0xc0, 0x52, 0x04, 0xf9, 0x1b, 0xce, - 0xc2, 0x44, 0xee, 0xb7, 0x2a, 0x1a, 0x70, 0x17, 0x8d, 0x20, 0x97, 0xb2, 0x43, 0x58, 0x01, 0xb2, - 0xd5, 0xf1, 0x70, 0xd3, 0x9b, 0x31, 0xd0, 0xdf, 0xb4, 0x2e, 0x47, 0xfd, 0xa2, 0x22, 0x2c, 0x4f, - 0xda, 0xe5, 0x48, 0x88, 0x8b, 0xec, 0x31, 0xfb, 0x26, 0xf6, 0x37, 0xed, 0x75, 0xcd, 0x36, 0x44, - 0xdc, 0x67, 0x86, 0xda, 0x02, 0x90, 0xac, 0x60, 0xc4, 0x97, 0x2c, 0xb6, 0x9d, 0x16, 0x0e, 0xd1, - 0x4e, 0x47, 0x5d, 0x8d, 0x0c, 0x65, 0x8e, 0x2b, 0x7e, 0x64, 0xab, 0x91, 0x89, 0x6c, 0x4c, 0xe0, - 0xf6, 0xd2, 0xe0, 0x3c, 0xee, 0x44, 0x5b, 0xeb, 0xa8, 0x7b, 0x35, 0x54, 0x58, 0x63, 0x3b, 0x7b, - 0x3b, 0xca, 0x5e, 0x4d, 0x3c, 0x0f, 0x13, 0x40, 0x6b, 0x81, 0xa2, 0xf5, 0x79, 0x3a, 0x8c, 0x66, - 0xbc, 0x5d, 0xea, 0x39, 0xae, 0x9f, 0x6e, 0xbb, 0x14, 0x71, 0x67, 0xe0, 0xef, 0xd2, 0x9e, 0xdf, - 0xe2, 0x8f, 0x67, 0x8f, 0x6b, 0xf8, 0x4c, 0x71, 0x7e, 0x6b, 0x18, 0x03, 0xd9, 0xc3, 0xfb, 0xd6, - 0x23, 0x1a, 0x3c, 0x47, 0x6d, 0x8e, 0xb4, 0x0d, 0x8c, 0x6d, 0xe8, 0x1c, 0xa5, 0x39, 0xc6, 0xf3, - 0x90, 0x3d, 0x5e, 0x7f, 0xcf, 0x0c, 0x9c, 0x6f, 0x9a, 0xe0, 0xc0, 0x19, 0xb4, 0xcc, 0xc2, 0x88, - 0x2d, 0x73, 0xd4, 0xdd, 0x05, 0x2a, 0xeb, 0xf1, 0x0d, 0x98, 0xa3, 0xec, 0x2e, 0x24, 0x30, 0x91, - 0x3d, 0xe2, 0x6f, 0x96, 0x41, 0xa1, 0x39, 0xf9, 0xf1, 0x72, 0xd4, 0xb9, 0x08, 0x96, 0x55, 0x73, - 0x6c, 0xc3, 0xe5, 0x28, 0x73, 0x91, 0x58, 0x16, 0x26, 0x10, 0xbf, 0xff, 0x38, 0x98, 0xc3, 0x13, - 0xee, 0x60, 0xb7, 0xf5, 0xef, 0xe9, 0xa8, 0xf9, 0xfa, 0x0c, 0xdb, 0xea, 0x7d, 0x60, 0x3a, 0xd8, - 0x1d, 0xa2, 0x23, 0xe7, 0xa2, 0x58, 0xfb, 0x0c, 0xb8, 0x34, 0xc2, 0xef, 0x0f, 0xe5, 0x13, 0x31, - 0xf6, 0x9d, 0xc0, 0x51, 0x7d, 0x22, 0x8e, 0x74, 0x37, 0xf0, 0xb7, 0xa3, 0x11, 0xf5, 0xfb, 0xb3, - 0xc3, 0xbc, 0x7f, 0x97, 0x30, 0x3f, 0x60, 0x97, 0xf0, 0x13, 0x2c, 0x96, 0x4d, 0x1e, 0xcb, 0x7b, - 0x44, 0x45, 0x38, 0xc6, 0xb1, 0xf6, 0xbd, 0x21, 0x9c, 0xe7, 0x38, 0x38, 0x97, 0x0e, 0xc5, 0xcb, - 0x04, 0xce, 0x4f, 0xe6, 0xa3, 0x31, 0xf7, 0x93, 0x19, 0xb6, 0xe3, 0xbe, 0xc3, 0x19, 0xf9, 0x03, - 0x87, 0x33, 0xb8, 0x96, 0x5e, 0x38, 0x64, 0x4b, 0xff, 0x24, 0xab, 0x1d, 0x2d, 0x5e, 0x3b, 0x9e, - 0x2e, 0x8e, 0xc8, 0xf8, 0x46, 0xe6, 0xf7, 0x85, 0xea, 0x71, 0x9e, 0x53, 0x8f, 0xf2, 0xe1, 0x98, - 0xc9, 0x5e, 0x3f, 0x7e, 0x23, 0x98, 0xd0, 0x1e, 0x71, 0x7b, 0x1f, 0x75, 0x23, 0x92, 0x13, 0xe2, - 0xd8, 0x46, 0xee, 0x51, 0x36, 0x22, 0x87, 0x71, 0x32, 0x81, 0x90, 0x6e, 0xf3, 0x60, 0x16, 0xf3, - 0x74, 0xde, 0xea, 0x6c, 0x43, 0x5f, 0x7b, 0x0d, 0x71, 0x55, 0x0c, 0x02, 0x68, 0x8e, 0x29, 0xca, - 0x51, 0xdc, 0xb1, 0xd9, 0xb4, 0xfe, 0x02, 0x84, 0xc9, 0x45, 0x86, 0xc1, 0x49, 0x07, 0x62, 0x1c, - 0xca, 0x41, 0xf6, 0x90, 0x7d, 0x8c, 0x38, 0x73, 0xd4, 0xcc, 0x7d, 0x67, 0xcf, 0xd7, 0x1e, 0x1a, - 0x43, 0x07, 0xbd, 0x04, 0x8a, 0x5d, 0x4c, 0x8d, 0x9e, 0xce, 0x48, 0x9e, 0xee, 0x50, 0x11, 0x90, - 0xf2, 0x0d, 0xfa, 0x65, 0xda, 0x23, 0x1a, 0x91, 0x1c, 0x09, 0x9d, 0x49, 0x1f, 0xd1, 0x18, 0x52, - 0xfe, 0x44, 0xae, 0xea, 0x99, 0x46, 0xa5, 0x5b, 0xbb, 0x96, 0x3f, 0xa6, 0x40, 0x10, 0x5d, 0x44, - 0x2b, 0x08, 0x04, 0x81, 0x1f, 0xd2, 0x1e, 0x3c, 0x65, 0xa4, 0x82, 0x3e, 0x9f, 0xf4, 0xc1, 0xd3, - 0xe4, 0xe2, 0xb3, 0xc7, 0xe4, 0xa7, 0x49, 0xcb, 0x3a, 0x47, 0x7c, 0x70, 0x33, 0x74, 0xef, 0x1d, - 0xb9, 0xb1, 0x10, 0xd6, 0x8e, 0xae, 0xb1, 0x0c, 0x2c, 0x3f, 0x7b, 0x60, 0x7e, 0xf1, 0x3b, 0x41, - 0xa1, 0x02, 0x2f, 0xee, 0x6d, 0x6b, 0x77, 0x83, 0xe9, 0x96, 0x0b, 0x61, 0xd5, 0xde, 0x72, 0x90, - 0x74, 0x7d, 0xf4, 0x3f, 0x80, 0x84, 0x3e, 0x21, 0x3c, 0x76, 0xa0, 0xd9, 0x89, 0x8e, 0xa1, 0x05, - 0x8f, 0xda, 0xcb, 0x25, 0x90, 0x6f, 0xfa, 0xa6, 0xaf, 0xcd, 0x84, 0xd8, 0x6a, 0x0f, 0xb1, 0x58, - 0xdc, 0xcd, 0x63, 0x71, 0x13, 0x27, 0x0b, 0xcc, 0xc1, 0x22, 0xfa, 0x3e, 0x06, 0x00, 0x0d, 0x4c, - 0x3f, 0xe0, 0x39, 0x36, 0xca, 0x11, 0x9c, 0x94, 0x0c, 0x9e, 0xb5, 0x57, 0x85, 0xe2, 0xbe, 0x97, - 0x13, 0xf7, 0xe3, 0xc5, 0x8a, 0x98, 0xc0, 0x4a, 0x9b, 0x04, 0x66, 0x90, 0x68, 0x57, 0xa1, 0xd9, - 0xf1, 0xb4, 0xef, 0x88, 0x94, 0x3f, 0x46, 0xcc, 0xda, 0x87, 0x85, 0x63, 0x7a, 0x92, 0x5a, 0x85, - 0xc4, 0xe3, 0xfd, 0x05, 0x82, 0x98, 0x26, 0x12, 0x1f, 0xd3, 0xe4, 0x36, 0x90, 0xb7, 0xec, 0x2d, - 0x87, 0x7a, 0xaf, 0x3d, 0x3a, 0x86, 0x36, 0xd2, 0x09, 0x03, 0x67, 0x14, 0x0c, 0xf8, 0x99, 0xcc, - 0xd6, 0x44, 0xee, 0xce, 0xcb, 0xa3, 0xd2, 0xb5, 0xff, 0xff, 0x50, 0x61, 0xab, 0x2a, 0xc8, 0xf7, - 0x4c, 0x7f, 0x87, 0x16, 0x8d, 0xff, 0x23, 0x1b, 0x79, 0xcf, 0x36, 0x6d, 0xc7, 0xde, 0xdf, 0xb5, - 0x9e, 0x13, 0x5e, 0xd1, 0xcb, 0xa5, 0x21, 0xce, 0xb7, 0xa1, 0x0d, 0x5d, 0xd3, 0x87, 0xcd, 0xcb, - 0xdb, 0x78, 0x8e, 0x35, 0x6d, 0xb0, 0x49, 0xa9, 0xf5, 0x1f, 0x71, 0x1c, 0xaf, 0xff, 0x5b, 0x56, - 0x17, 0xe2, 0x80, 0x4f, 0x54, 0xff, 0x83, 0xe7, 0x54, 0xfa, 0x3f, 0xa0, 0x88, 0xec, 0xd1, 0xf8, - 0x37, 0x09, 0xcc, 0x35, 0x91, 0xc2, 0x35, 0xf7, 0x76, 0x77, 0x4d, 0x77, 0x5f, 0xbb, 0x21, 0x42, - 0x85, 0x51, 0xcd, 0x1c, 0xa7, 0x9a, 0xda, 0xaf, 0x0b, 0xdf, 0x4e, 0x4d, 0x9b, 0x36, 0x53, 0x42, - 0xea, 0x76, 0xf0, 0x44, 0x50, 0x40, 0xea, 0x1d, 0xf8, 0xf3, 0x25, 0x36, 0x04, 0x92, 0x53, 0x30, - 0x30, 0xd6, 0x50, 0xde, 0x26, 0x10, 0x94, 0x43, 0x02, 0xc7, 0x9b, 0xbe, 0xd9, 0xbe, 0xb4, 0xe2, - 0xb8, 0xce, 0x9e, 0x6f, 0xd9, 0xd0, 0xd3, 0x1e, 0x13, 0x21, 0x10, 0xe8, 0x7f, 0x2e, 0xd2, 0x7f, - 0xed, 0x3f, 0x72, 0xa2, 0xa3, 0x68, 0xd8, 0xad, 0xb2, 0xe4, 0x63, 0xe2, 0x5c, 0x89, 0x8d, 0x8b, - 0x22, 0x14, 0xb3, 0x17, 0xda, 0x9b, 0x64, 0xa0, 0xe8, 0x0f, 0xf6, 0x1c, 0xd7, 0xaf, 0x39, 0x6d, - 0xb3, 0xeb, 0xf9, 0x8e, 0x0b, 0xb5, 0x46, 0xa2, 0xd4, 0x50, 0x0f, 0xd3, 0x71, 0xda, 0xd1, 0xe0, - 0x48, 0x9f, 0x58, 0xb5, 0x93, 0x79, 0x1d, 0xff, 0x98, 0xf0, 0x2e, 0x23, 0x91, 0x4a, 0x3f, 0x47, - 0x31, 0x7a, 0x3e, 0xa8, 0x4b, 0x4b, 0xe7, 0x8a, 0x2f, 0xb6, 0xf3, 0x28, 0xc4, 0xd4, 0x04, 0x96, - 0xca, 0x25, 0x30, 0xdf, 0xdc, 0xbb, 0x18, 0x12, 0xf1, 0x58, 0x23, 0xe4, 0xb5, 0xc2, 0xc1, 0x2c, - 0xa8, 0xe2, 0xb1, 0x84, 0x62, 0xe4, 0x7b, 0x23, 0x98, 0xf7, 0xd8, 0x6c, 0x14, 0x6f, 0x3e, 0x51, - 0x30, 0x88, 0xc5, 0xf0, 0x52, 0xb3, 0x17, 0xe0, 0xfb, 0x24, 0x30, 0xdf, 0xe8, 0x41, 0x1b, 0x76, - 0x88, 0x8f, 0x1d, 0x27, 0xc0, 0x97, 0xa7, 0x14, 0x20, 0x47, 0x28, 0x46, 0x80, 0x91, 0x3f, 0x6c, - 0x25, 0x10, 0x5e, 0x94, 0x90, 0x4a, 0x70, 0x49, 0xa5, 0x65, 0x2f, 0xb8, 0x2f, 0x49, 0x60, 0xd6, - 0xd8, 0xb3, 0xd7, 0x5d, 0x07, 0x8d, 0xc6, 0xae, 0x76, 0x4f, 0xd4, 0x41, 0xdc, 0x0a, 0x4e, 0x74, - 0xf6, 0x5c, 0xbc, 0xfe, 0x54, 0xb5, 0x9b, 0xb0, 0xed, 0xd8, 0x1d, 0x0f, 0xd7, 0xa3, 0x60, 0x1c, - 0x7c, 0x71, 0x57, 0xfe, 0x05, 0x7f, 0x25, 0xe7, 0xb4, 0x17, 0x09, 0x47, 0xcc, 0x21, 0x95, 0x67, - 0x8a, 0x16, 0xef, 0x09, 0x04, 0xe3, 0xe2, 0x0c, 0x2b, 0x21, 0x7b, 0xe1, 0x7e, 0x5e, 0x02, 0x6a, - 0xa9, 0xdd, 0x76, 0xf6, 0x6c, 0xbf, 0x09, 0xbb, 0xb0, 0xed, 0xb7, 0x5c, 0xb3, 0x0d, 0x59, 0xfb, - 0x59, 0x01, 0x72, 0xc7, 0x72, 0x69, 0x1f, 0x8c, 0xfe, 0x52, 0x39, 0xbe, 0x5c, 0x78, 0xc7, 0x91, - 0xd4, 0xf2, 0x60, 0x29, 0x29, 0xc4, 0x29, 0xb6, 0xaf, 0x28, 0x58, 0x50, 0xf6, 0x52, 0xfd, 0xa4, - 0x04, 0x66, 0x82, 0x1e, 0x7b, 0x5b, 0x44, 0x98, 0x3f, 0x9d, 0x72, 0x32, 0x12, 0x12, 0x4f, 0x21, - 0xc3, 0x77, 0xa5, 0x98, 0x55, 0xc4, 0xd1, 0x4f, 0x27, 0xba, 0x52, 0x7a, 0xd1, 0xa1, 0xc7, 0x7a, - 0x63, 0x73, 0xb9, 0x51, 0xab, 0xe8, 0x86, 0x22, 0x6b, 0x5f, 0x96, 0x40, 0x7e, 0xdd, 0xb2, 0xb7, - 0xd9, 0xc0, 0x66, 0x27, 0x91, 0x1d, 0xd9, 0x81, 0x0f, 0xd2, 0x96, 0x4e, 0x1e, 0xd4, 0x3b, 0xc0, - 0x49, 0x7b, 0x6f, 0xf7, 0x22, 0x74, 0x1b, 0x5b, 0x78, 0x94, 0xf5, 0x5a, 0x4e, 0x13, 0xda, 0xc4, - 0x08, 0x2d, 0x18, 0x03, 0xdf, 0xf1, 0x26, 0x98, 0xc0, 0xe4, 0x01, 0x71, 0x12, 0x23, 0xf1, 0x90, - 0x29, 0x89, 0x61, 0x2a, 0xd5, 0xb4, 0x61, 0x00, 0xf1, 0xec, 0x35, 0xf5, 0x37, 0x0b, 0xe0, 0xea, - 0x92, 0xbd, 0x8f, 0x6d, 0x0a, 0xd2, 0xc1, 0x97, 0x77, 0x4c, 0x7b, 0x1b, 0xe2, 0x01, 0x22, 0x94, - 0x38, 0x1b, 0xe9, 0x3f, 0xc7, 0x47, 0xfa, 0x57, 0x0d, 0x30, 0xe5, 0xb8, 0x1d, 0xe8, 0x2e, 0xed, - 0x63, 0x9e, 0xfa, 0x97, 0x9d, 0x69, 0x9b, 0x1c, 0x54, 0xc4, 0x22, 0x25, 0xbf, 0xd8, 0x20, 0xdf, - 0x1b, 0x01, 0xa1, 0xb3, 0xb7, 0x82, 0x29, 0x9a, 0xa6, 0xce, 0x81, 0xe9, 0x86, 0x51, 0xd1, 0x8d, - 0xcd, 0x6a, 0x45, 0x39, 0xa6, 0x5e, 0x05, 0x8e, 0x57, 0x5b, 0xba, 0x51, 0x6a, 0x55, 0x1b, 0xf5, - 0x4d, 0x9c, 0xae, 0xe4, 0xb4, 0xe7, 0xe7, 0x45, 0x3d, 0x7b, 0x93, 0x99, 0x19, 0x04, 0xab, 0x01, - 0xa6, 0xda, 0x24, 0x03, 0x1e, 0x42, 0x67, 0x53, 0xd5, 0x8e, 0x12, 0x24, 0x09, 0x46, 0x40, 0x48, - 0x3d, 0x03, 0xc0, 0x15, 0xd7, 0xb1, 0xb7, 0xa3, 0x33, 0x6d, 0xd3, 0x06, 0x93, 0xa2, 0x3d, 0x94, - 0x03, 0x45, 0xf2, 0x0d, 0xbe, 0xd9, 0x04, 0xff, 0x8b, 0x04, 0x1f, 0x3c, 0x23, 0x8b, 0x17, 0xcb, - 0x2b, 0x9a, 0x68, 0xd1, 0x47, 0xa4, 0x8b, 0x44, 0x06, 0xc4, 0x12, 0xa6, 0x55, 0xb9, 0x0d, 0x14, - 0xc9, 0xb7, 0xd4, 0xeb, 0x20, 0x3e, 0x4a, 0x29, 0xc9, 0x26, 0xe8, 0xa7, 0x2c, 0x2e, 0xd3, 0xec, - 0xb5, 0xf9, 0x23, 0x12, 0x98, 0xae, 0x43, 0xbf, 0xbc, 0x03, 0xdb, 0x97, 0xb4, 0xc7, 0xf1, 0x0b, - 0xa0, 0x5d, 0x0b, 0xda, 0xfe, 0x85, 0xdd, 0x6e, 0xb8, 0x00, 0x1a, 0x24, 0x68, 0x2f, 0x64, 0x3b, - 0xdf, 0x67, 0xf0, 0xfa, 0x73, 0xcb, 0x80, 0xba, 0x06, 0x25, 0xc4, 0xa8, 0xcc, 0x29, 0x50, 0x74, - 0xa1, 0xb7, 0xd7, 0x0d, 0x16, 0xd1, 0xe8, 0x93, 0xf6, 0x70, 0x28, 0xce, 0x32, 0x27, 0xce, 0xdb, - 0xc4, 0x8b, 0x98, 0x40, 0xd8, 0xd3, 0x3c, 0x98, 0xaa, 0xda, 0x96, 0x6f, 0x99, 0x5d, 0xed, 0x45, - 0x79, 0x30, 0xdf, 0x84, 0xfe, 0xba, 0xe9, 0x9a, 0xbb, 0xd0, 0x87, 0xae, 0xa7, 0x7d, 0x83, 0xef, - 0x13, 0x7a, 0x5d, 0xd3, 0xdf, 0x72, 0xdc, 0xdd, 0x40, 0x35, 0x83, 0x67, 0xa4, 0x9a, 0x97, 0xa1, - 0xeb, 0x45, 0x7c, 0x05, 0x8f, 0xe8, 0xcd, 0x15, 0xc7, 0xbd, 0x84, 0x06, 0x41, 0x3a, 0x4d, 0xa3, - 0x8f, 0x88, 0x5e, 0xd7, 0xd9, 0xae, 0xc1, 0xcb, 0x30, 0x88, 0xaa, 0x16, 0x3e, 0xa3, 0xb9, 0x40, - 0xc7, 0xa9, 0x3b, 0x3e, 0xea, 0xb4, 0x6b, 0xce, 0x36, 0x09, 0x3b, 0x3b, 0x6d, 0xf0, 0x89, 0x51, - 0x2e, 0xf3, 0x32, 0xc4, 0xb9, 0x8a, 0x6c, 0x2e, 0x9a, 0xa8, 0x2e, 0x02, 0x35, 0xfc, 0xac, 0x05, - 0xbb, 0x70, 0x17, 0xfa, 0xee, 0x3e, 0xbe, 0x5d, 0x62, 0xda, 0x18, 0xf0, 0x86, 0x0e, 0xd0, 0xe2, - 0x93, 0x75, 0x2a, 0xbd, 0x45, 0x4e, 0x72, 0x87, 0x9a, 0xac, 0x8b, 0x50, 0x9c, 0xc8, 0xed, 0x59, - 0x32, 0xb2, 0x66, 0x5e, 0x21, 0x83, 0x3c, 0x1e, 0x3c, 0xdf, 0x9c, 0xe3, 0x56, 0x98, 0x76, 0xa1, - 0xe7, 0x99, 0xdb, 0x30, 0x58, 0x61, 0xa2, 0x8f, 0xea, 0x9d, 0xa0, 0xd0, 0xc5, 0x98, 0x92, 0xc1, - 0xe1, 0x06, 0xae, 0x66, 0xc8, 0xc0, 0x40, 0xb4, 0xc2, 0x91, 0x00, 0xc3, 0x6d, 0x90, 0x2f, 0xce, - 0xde, 0x07, 0x0a, 0x04, 0xfe, 0x19, 0x50, 0xa8, 0xe8, 0x4b, 0x1b, 0x2b, 0xca, 0x31, 0xf4, 0x37, - 0xe0, 0x6f, 0x06, 0x14, 0x96, 0x4b, 0xad, 0x52, 0x4d, 0x91, 0x50, 0x3d, 0xaa, 0xf5, 0xe5, 0x86, - 0x22, 0xa3, 0xc4, 0xf5, 0x52, 0xbd, 0x5a, 0x56, 0xf2, 0xea, 0x2c, 0x98, 0x3a, 0x5f, 0x32, 0xea, - 0xd5, 0xfa, 0x8a, 0x52, 0xd0, 0xfe, 0x92, 0xc5, 0xef, 0x2e, 0x1e, 0xbf, 0x1b, 0xe3, 0x78, 0x1a, - 0x04, 0xd9, 0xcf, 0x87, 0x90, 0xdd, 0xc3, 0x41, 0xf6, 0x9d, 0x22, 0x44, 0x26, 0xe0, 0xce, 0x54, - 0x04, 0x53, 0xeb, 0xae, 0xd3, 0x86, 0x9e, 0xa7, 0xfd, 0x8c, 0x04, 0x8a, 0x65, 0xd3, 0x6e, 0xc3, - 0xae, 0x76, 0x4d, 0x04, 0x15, 0x71, 0x15, 0xcd, 0x05, 0xae, 0xa2, 0xda, 0xd7, 0x72, 0xa2, 0xbd, - 0x1f, 0xa5, 0xbb, 0x48, 0x68, 0xc6, 0xc8, 0x47, 0xac, 0x97, 0x4b, 0x24, 0x35, 0x81, 0x1b, 0x76, - 0x24, 0x30, 0x43, 0x57, 0x03, 0x2e, 0x42, 0x76, 0x1e, 0xfe, 0x8d, 0x9c, 0xe8, 0xe4, 0x30, 0xa8, - 0x41, 0x48, 0x26, 0x46, 0x1e, 0x62, 0x13, 0xc1, 0x61, 0xd4, 0x26, 0xb0, 0x79, 0x28, 0x81, 0xd9, - 0x0d, 0xdb, 0x1b, 0x24, 0x14, 0xf1, 0x70, 0xfc, 0x41, 0x35, 0x18, 0x42, 0x87, 0x0a, 0xc7, 0x3f, - 0x9c, 0x5e, 0xf6, 0x82, 0xf9, 0x46, 0x0e, 0x9c, 0x5c, 0x81, 0x36, 0x74, 0xad, 0x36, 0xa9, 0x41, - 0x20, 0x89, 0x7b, 0x78, 0x49, 0x3c, 0x8e, 0xe3, 0x7c, 0xd0, 0x17, 0xbc, 0x04, 0x5e, 0x1d, 0x4a, - 0xe0, 0x19, 0x9c, 0x04, 0x6e, 0x15, 0xa4, 0x33, 0x81, 0x6b, 0xd5, 0x67, 0xc0, 0x5c, 0xdd, 0xf1, - 0xad, 0x2d, 0xab, 0x4d, 0x7c, 0xd0, 0x7e, 0x4e, 0x06, 0xf9, 0x9a, 0xe5, 0xf9, 0x5a, 0x29, 0xea, - 0x4e, 0xae, 0x07, 0xb3, 0x96, 0xdd, 0xee, 0xee, 0x75, 0xa0, 0x01, 0x4d, 0xd2, 0xaf, 0x4c, 0x1b, - 0x6c, 0x52, 0xb4, 0xb5, 0x8f, 0xd8, 0x92, 0x83, 0xad, 0xfd, 0xcf, 0x0a, 0x2f, 0xc3, 0xb0, 0x2c, - 0xe0, 0xb8, 0x94, 0x31, 0x76, 0x57, 0x09, 0xcc, 0xdb, 0x4c, 0xd6, 0xc0, 0x60, 0xef, 0xbf, 0x97, - 0x80, 0x25, 0x67, 0xf0, 0x5f, 0x68, 0x1f, 0x10, 0x6a, 0xac, 0xc3, 0x18, 0x4a, 0x87, 0xcc, 0xf2, - 0x08, 0x93, 0x64, 0x15, 0x2c, 0x54, 0xeb, 0x2d, 0xdd, 0xa8, 0x97, 0x6a, 0x34, 0x8b, 0xac, 0xfd, - 0x9b, 0x04, 0x0a, 0x06, 0xec, 0x75, 0xf7, 0xd9, 0xc0, 0xd3, 0xd4, 0x51, 0x3c, 0x17, 0x3a, 0x8a, - 0xab, 0xcb, 0x00, 0x98, 0x6d, 0x54, 0x30, 0xbe, 0x99, 0x4b, 0x1a, 0x18, 0xce, 0x94, 0xab, 0x60, - 0x29, 0xcc, 0x6d, 0x30, 0x5f, 0x6a, 0x2f, 0x16, 0xde, 0x39, 0xe2, 0xa8, 0x61, 0x0e, 0x63, 0xfa, - 0x84, 0x0f, 0x0a, 0x6d, 0xf6, 0x0c, 0x25, 0x77, 0x34, 0xe2, 0xff, 0x8a, 0x04, 0xf2, 0x2d, 0xd4, - 0x5b, 0x32, 0x1d, 0xe7, 0x67, 0x46, 0xd3, 0x71, 0x44, 0x26, 0x46, 0xc7, 0xef, 0x05, 0x73, 0xac, - 0xc6, 0x52, 0x57, 0x89, 0x44, 0x15, 0xe7, 0x3e, 0x18, 0x45, 0xc3, 0x07, 0xb0, 0x73, 0x34, 0x22, - 0xfe, 0xd4, 0xe3, 0x01, 0x58, 0x83, 0xbb, 0x17, 0xa1, 0xeb, 0xed, 0x58, 0x3d, 0xed, 0xaf, 0x65, - 0x30, 0xb3, 0x02, 0xfd, 0xa6, 0x6f, 0xfa, 0x7b, 0x5e, 0xdf, 0x76, 0xa7, 0xed, 0x94, 0xcd, 0xf6, - 0x0e, 0xa4, 0xdd, 0x51, 0xf0, 0xa8, 0xbd, 0x47, 0x16, 0xf5, 0x27, 0x8a, 0xca, 0x59, 0x0c, 0xcb, - 0x88, 0xc1, 0xe4, 0x09, 0x20, 0xdf, 0x31, 0x7d, 0x93, 0x62, 0x71, 0x4d, 0x1f, 0x16, 0x11, 0x21, - 0x03, 0x67, 0xd3, 0xde, 0x21, 0x89, 0x38, 0x14, 0x09, 0x94, 0x9f, 0x0e, 0x84, 0x0f, 0xe4, 0x46, - 0x40, 0xe1, 0x04, 0x98, 0xaf, 0x37, 0x5a, 0x9b, 0xb5, 0xc6, 0xca, 0x8a, 0x8e, 0x52, 0x15, 0x59, - 0x3d, 0x05, 0xd4, 0xf5, 0xd2, 0x85, 0x35, 0xbd, 0xde, 0xda, 0xac, 0x37, 0x2a, 0x3a, 0xfd, 0x32, - 0xaf, 0x1e, 0x07, 0xb3, 0xe5, 0x52, 0x79, 0x35, 0x48, 0x28, 0xa8, 0xa7, 0xc1, 0xc9, 0x35, 0x7d, - 0x6d, 0x49, 0x37, 0x9a, 0xab, 0xd5, 0xf5, 0x4d, 0x44, 0x66, 0xb9, 0xb1, 0x51, 0xaf, 0x28, 0x45, - 0x55, 0x03, 0xa7, 0x98, 0x37, 0xe7, 0x8d, 0x46, 0x7d, 0x65, 0xb3, 0xd9, 0x2a, 0xb5, 0x74, 0x65, - 0x4a, 0xbd, 0x0a, 0x1c, 0x2f, 0x97, 0xea, 0x38, 0x7b, 0xb9, 0x51, 0xaf, 0xeb, 0xe5, 0x96, 0x32, - 0xad, 0xfd, 0x47, 0x1e, 0xcc, 0x56, 0xbd, 0xba, 0xb9, 0x0b, 0xcf, 0x99, 0x5d, 0xab, 0xa3, 0xbd, - 0x88, 0x99, 0x79, 0xdc, 0x08, 0xe6, 0x5d, 0xf2, 0x17, 0x76, 0x5a, 0x16, 0x24, 0x68, 0xce, 0x1b, - 0x7c, 0x22, 0x9a, 0x93, 0xdb, 0x98, 0x40, 0x30, 0x27, 0x27, 0x4f, 0xea, 0x12, 0x00, 0xe4, 0x5f, - 0x2b, 0xba, 0x23, 0xf6, 0x6c, 0x7f, 0x6b, 0x32, 0x77, 0xa1, 0x07, 0xdd, 0xcb, 0x56, 0x1b, 0x06, - 0x39, 0x0d, 0xe6, 0x2b, 0xed, 0x4f, 0x65, 0xd1, 0xfd, 0x45, 0x06, 0x54, 0xa6, 0x3a, 0x31, 0xbd, - 0xe1, 0x8f, 0xc8, 0x22, 0xbb, 0x83, 0x42, 0x24, 0xd3, 0x69, 0xca, 0x4b, 0xa5, 0xd1, 0x96, 0x6d, - 0x5b, 0x8d, 0xc6, 0x66, 0x73, 0xb5, 0x61, 0xb4, 0x14, 0x59, 0x9d, 0x03, 0xd3, 0xe8, 0xb1, 0xd6, - 0xa8, 0xaf, 0x28, 0x79, 0xf5, 0x6a, 0x70, 0x62, 0xb5, 0xd4, 0xdc, 0xac, 0xd6, 0xcf, 0x95, 0x6a, - 0xd5, 0xca, 0x66, 0x79, 0xb5, 0x64, 0x34, 0x95, 0x82, 0x7a, 0x0d, 0xb8, 0xba, 0x55, 0xd5, 0x8d, - 0xcd, 0x65, 0xbd, 0xd4, 0xda, 0x30, 0xf4, 0xe6, 0x66, 0xbd, 0xb1, 0x59, 0x2f, 0xad, 0xe9, 0x4a, - 0x11, 0x35, 0x7f, 0xfc, 0x2a, 0x52, 0x9b, 0xa9, 0x83, 0xca, 0x38, 0x1d, 0xa3, 0x8c, 0x33, 0xfd, - 0xca, 0x08, 0x58, 0xb5, 0x32, 0xf4, 0xa6, 0x6e, 0x9c, 0xd3, 0x95, 0xd9, 0x41, 0xba, 0x36, 0xa7, - 0x9e, 0x04, 0x0a, 0xe2, 0x61, 0xb3, 0xda, 0x0c, 0x72, 0x56, 0x94, 0x79, 0xed, 0x93, 0x45, 0x70, - 0xca, 0x80, 0xdb, 0x96, 0xe7, 0x43, 0x77, 0xdd, 0xdc, 0xdf, 0x85, 0xb6, 0x1f, 0x74, 0xf2, 0xff, - 0x9c, 0x5a, 0x19, 0xd7, 0xc0, 0x7c, 0x8f, 0xd0, 0x58, 0x83, 0xfe, 0x8e, 0xd3, 0xa1, 0xa3, 0xf0, - 0xe3, 0x62, 0x7b, 0x8e, 0xc5, 0x75, 0x36, 0xbb, 0xc1, 0x7f, 0xcd, 0xe8, 0xb6, 0x9c, 0xa0, 0xdb, - 0xf9, 0x51, 0x74, 0x5b, 0xbd, 0x16, 0xcc, 0xec, 0x79, 0xd0, 0xd5, 0x77, 0x4d, 0xab, 0x1b, 0xdc, - 0xf1, 0x19, 0x26, 0x68, 0xef, 0xcc, 0x8b, 0x9e, 0x58, 0x61, 0xea, 0x32, 0x58, 0x8c, 0x31, 0x7d, - 0xeb, 0x19, 0x00, 0x68, 0x65, 0x37, 0xdc, 0x2e, 0x55, 0x56, 0x26, 0x05, 0xf1, 0x77, 0xd1, 0xea, - 0x76, 0x2d, 0x7b, 0x3b, 0xdc, 0xf7, 0x8f, 0x12, 0xb4, 0x97, 0xca, 0x22, 0x27, 0x58, 0xd2, 0xf2, - 0x96, 0xae, 0x35, 0xbd, 0x58, 0x9a, 0x70, 0xbf, 0x7b, 0xb0, 0xe9, 0x14, 0x55, 0x05, 0xcc, 0xe1, - 0x34, 0xda, 0x02, 0x95, 0x29, 0xd4, 0x07, 0x07, 0xe4, 0xd6, 0xf4, 0xd6, 0x6a, 0xa3, 0x12, 0xbe, - 0x9b, 0x46, 0x24, 0x11, 0x33, 0xa5, 0xfa, 0x05, 0xdc, 0x1a, 0x67, 0xd4, 0xc7, 0x80, 0x6b, 0x98, - 0x0e, 0xbb, 0x54, 0x33, 0xf4, 0x52, 0xe5, 0xc2, 0xa6, 0xfe, 0xac, 0x6a, 0xb3, 0xd5, 0xe4, 0x1b, - 0x57, 0xd0, 0x8e, 0x66, 0x11, 0xbf, 0xfa, 0x5a, 0xa9, 0x5a, 0xa3, 0xfd, 0xfb, 0x72, 0xc3, 0x58, - 0x2b, 0xb5, 0x94, 0x39, 0xed, 0x15, 0x32, 0x50, 0x56, 0xa0, 0xbf, 0xee, 0xb8, 0xbe, 0xd9, 0xad, - 0x59, 0xf6, 0xa5, 0x0d, 0xb7, 0xcb, 0x4d, 0x36, 0x85, 0xc3, 0x74, 0xf0, 0x43, 0x24, 0x47, 0x30, - 0x7e, 0x47, 0xbc, 0x87, 0xb3, 0x45, 0xca, 0x14, 0x25, 0x68, 0xcf, 0x95, 0x44, 0x96, 0xbb, 0xc5, - 0x4b, 0x4d, 0xa7, 0x27, 0xcf, 0x9b, 0xf4, 0xf8, 0x3c, 0x00, 0xb5, 0xa2, 0xf6, 0x82, 0x3c, 0x98, - 0x5e, 0xb6, 0x6c, 0xb3, 0x6b, 0x3d, 0x87, 0x8b, 0x8e, 0x19, 0xf5, 0x31, 0xb9, 0x84, 0x3e, 0x46, - 0x1a, 0x69, 0xfc, 0xfc, 0x29, 0x59, 0x74, 0x79, 0x81, 0x91, 0x7d, 0xc0, 0x64, 0xcc, 0xe0, 0xf9, - 0xab, 0x92, 0xc8, 0xf2, 0xc2, 0x70, 0x7a, 0xe9, 0x30, 0xfc, 0xf4, 0xb7, 0x87, 0x8d, 0xd5, 0xd7, - 0xbe, 0xa7, 0x07, 0xa9, 0xc2, 0x8c, 0xf6, 0x7b, 0x32, 0xd0, 0x56, 0xa0, 0x7f, 0x0e, 0xba, 0xe1, - 0x54, 0x00, 0xf7, 0xfa, 0xd4, 0xde, 0x66, 0x9a, 0xec, 0x9b, 0x59, 0x00, 0xcf, 0xf3, 0x00, 0x96, - 0x12, 0x1a, 0x4f, 0x0c, 0xe9, 0x98, 0xc6, 0x5b, 0x05, 0x45, 0x0f, 0xbf, 0xa7, 0x6a, 0xf6, 0xc4, - 0xf8, 0xe1, 0x12, 0x13, 0x63, 0xa9, 0x13, 0xc2, 0x06, 0x25, 0xa0, 0x7d, 0x33, 0x9c, 0x04, 0x7d, - 0x0f, 0xa7, 0x1d, 0xcb, 0x87, 0x66, 0x36, 0x9d, 0xbe, 0xb8, 0xd9, 0xaa, 0xcb, 0x20, 0xfb, 0x46, - 0xfb, 0xd5, 0x02, 0x38, 0x39, 0xa8, 0x3a, 0xda, 0x2f, 0xe7, 0xb8, 0x1d, 0x76, 0x88, 0x87, 0xfc, - 0x1c, 0xdd, 0x40, 0x44, 0x0f, 0xea, 0x93, 0xc1, 0xd5, 0xe1, 0x32, 0x5c, 0xcb, 0xa9, 0xc3, 0x2b, - 0x5e, 0x17, 0xfa, 0x3e, 0x74, 0x71, 0xd5, 0xa6, 0x8d, 0xc1, 0x2f, 0xd5, 0xa7, 0x82, 0x47, 0x59, - 0xb6, 0x67, 0x75, 0xa0, 0xdb, 0xb2, 0x7a, 0x5e, 0xc9, 0xee, 0xb4, 0xf6, 0x7c, 0xc7, 0xb5, 0x4c, - 0x7a, 0x23, 0xe5, 0xb4, 0x11, 0xf7, 0x5a, 0xbd, 0x05, 0x28, 0x96, 0xd7, 0xb0, 0x2f, 0x3a, 0xa6, - 0xdb, 0xb1, 0xec, 0xed, 0x9a, 0xe5, 0xf9, 0xd4, 0x03, 0xf8, 0x40, 0xba, 0xf6, 0x37, 0xb2, 0xe8, - 0x61, 0xba, 0x21, 0xb0, 0xc6, 0x74, 0x28, 0x2f, 0x94, 0x45, 0x8e, 0xc7, 0xa5, 0xa3, 0x9d, 0x4e, - 0x59, 0x9e, 0x3f, 0x69, 0x43, 0x62, 0xf0, 0x08, 0x8e, 0xbb, 0x16, 0x92, 0x1e, 0x18, 0x02, 0xe7, - 0x74, 0xa3, 0xba, 0x5c, 0xd5, 0x91, 0x59, 0x71, 0x35, 0x38, 0x11, 0xbd, 0xab, 0x5c, 0xd8, 0x6c, - 0xea, 0xf5, 0x96, 0x32, 0x8d, 0xfa, 0x29, 0x92, 0xbc, 0x5c, 0xaa, 0xd6, 0xf4, 0xca, 0x66, 0xab, - 0x81, 0xde, 0x54, 0x46, 0x33, 0x2d, 0xb4, 0x87, 0xf2, 0xe0, 0x38, 0x96, 0xed, 0x3e, 0x96, 0x2a, - 0x12, 0x4a, 0x9f, 0xaf, 0x6d, 0x08, 0xd0, 0x0c, 0x11, 0xaf, 0xf6, 0xbb, 0xc2, 0x17, 0x6e, 0x32, - 0x10, 0xf6, 0x95, 0x11, 0xa3, 0x19, 0xdf, 0x90, 0x44, 0x22, 0x54, 0x08, 0x93, 0x4d, 0xa7, 0x14, - 0xff, 0x32, 0xe9, 0x11, 0x27, 0x1e, 0x7c, 0x6c, 0x65, 0x96, 0xf1, 0xc7, 0xcf, 0x5a, 0xaf, 0x1a, - 0x58, 0x1d, 0x16, 0x00, 0xc0, 0x29, 0x58, 0x83, 0x88, 0x1e, 0x0c, 0x1c, 0xaf, 0xe2, 0xf4, 0xa0, - 0x54, 0x6e, 0x55, 0xcf, 0xe9, 0x71, 0x7a, 0xf0, 0x39, 0x19, 0x4c, 0xaf, 0x40, 0x1f, 0xcd, 0xa9, - 0x3c, 0xed, 0x69, 0x02, 0xeb, 0x3f, 0xc8, 0x8c, 0xe9, 0x3a, 0x6d, 0xb3, 0x1b, 0x2e, 0x03, 0x90, - 0x27, 0xed, 0x87, 0x47, 0x31, 0x41, 0x82, 0xa2, 0x63, 0xc6, 0xab, 0xef, 0x06, 0x05, 0x1f, 0xbd, - 0xa6, 0xcb, 0xd0, 0xdf, 0x11, 0x3b, 0x5c, 0x21, 0x22, 0x15, 0xd3, 0x37, 0x0d, 0x92, 0x9f, 0x19, - 0x9d, 0x04, 0x6d, 0x97, 0x18, 0x46, 0xbe, 0x1d, 0xed, 0xcf, 0xbf, 0x94, 0xc1, 0xd5, 0xa4, 0x7d, - 0x94, 0x7a, 0xbd, 0xa6, 0xef, 0xb8, 0xd0, 0x80, 0x6d, 0x68, 0xf5, 0xfc, 0xbe, 0xf5, 0x3d, 0x97, - 0xa4, 0x06, 0x9b, 0xcd, 0xf4, 0x51, 0x7b, 0x83, 0x2c, 0x1a, 0xe1, 0xf7, 0x40, 0x7b, 0xec, 0x2b, - 0x2f, 0xa6, 0xb1, 0x7f, 0x42, 0x12, 0x89, 0xd9, 0x9b, 0x92, 0x78, 0x3a, 0xa0, 0x3e, 0x7a, 0x04, - 0x40, 0x05, 0x2b, 0x37, 0x86, 0x5e, 0xd6, 0xab, 0xeb, 0x68, 0x10, 0xb8, 0x0e, 0x3c, 0x7a, 0x7d, - 0xc3, 0x28, 0xaf, 0x96, 0x9a, 0xfa, 0xa6, 0xa1, 0xaf, 0x54, 0x9b, 0x2d, 0xea, 0x94, 0x45, 0xbe, - 0x9a, 0x52, 0xaf, 0x05, 0xa7, 0x9b, 0x1b, 0x4b, 0xcd, 0xb2, 0x51, 0x5d, 0xc7, 0xe9, 0x86, 0x5e, - 0xd7, 0xcf, 0xd3, 0xb7, 0xd3, 0xda, 0x87, 0x15, 0x30, 0x8b, 0x26, 0x00, 0x4d, 0x32, 0x2f, 0xd0, - 0xfe, 0x2e, 0x0f, 0x66, 0x0d, 0xe8, 0x39, 0xdd, 0xcb, 0x78, 0x8e, 0x30, 0xa9, 0xa9, 0xc7, 0xd7, - 0x65, 0xd1, 0xf3, 0xdb, 0x0c, 0xb3, 0x8b, 0x0c, 0xa3, 0xf1, 0x13, 0x4d, 0xf3, 0xb2, 0x69, 0x75, - 0xcd, 0x8b, 0xb4, 0xab, 0x99, 0x36, 0xa2, 0x04, 0x75, 0x11, 0xa8, 0xce, 0x15, 0x1b, 0xba, 0xcd, - 0xf6, 0x15, 0xdd, 0xdf, 0x29, 0x75, 0x3a, 0x2e, 0xf4, 0x3c, 0xba, 0x7a, 0x31, 0xe0, 0x8d, 0x7a, - 0x33, 0x38, 0x8e, 0x53, 0x99, 0xcc, 0xc4, 0x41, 0xa6, 0x3f, 0x39, 0xcc, 0x59, 0xb2, 0xf7, 0x83, - 0x9c, 0x05, 0x26, 0x67, 0x94, 0xcc, 0x1e, 0x97, 0x28, 0xf2, 0xa7, 0x74, 0xae, 0x07, 0xb3, 0xb6, - 0xb9, 0x0b, 0xf5, 0x07, 0x7b, 0x96, 0x0b, 0x3d, 0xec, 0x18, 0x23, 0x1b, 0x6c, 0x92, 0xf6, 0xab, - 0x42, 0xe7, 0xcd, 0xc5, 0x24, 0x96, 0x4e, 0xf7, 0x57, 0x46, 0x50, 0xfd, 0x01, 0xfd, 0x8c, 0xac, - 0x7d, 0x58, 0x06, 0x73, 0x94, 0xa9, 0x92, 0xbd, 0x5f, 0xed, 0x68, 0xd7, 0x71, 0xc6, 0xaf, 0x89, - 0xd2, 0x02, 0xe3, 0x17, 0x3f, 0x68, 0x3f, 0x2a, 0x8b, 0xba, 0x3b, 0x0f, 0xa8, 0x38, 0x2e, 0x23, - 0xde, 0x71, 0x74, 0xcb, 0xd9, 0xa3, 0x8e, 0xaa, 0xd3, 0x06, 0x79, 0xc8, 0x72, 0x51, 0x4f, 0xfb, - 0x35, 0x21, 0x67, 0x6a, 0xc1, 0x6a, 0x1c, 0x11, 0x80, 0x9f, 0x92, 0xc1, 0x02, 0xe5, 0xaa, 0x49, - 0xcf, 0xf9, 0x08, 0x1d, 0x78, 0xfb, 0x71, 0x61, 0x43, 0x70, 0x40, 0xfd, 0x69, 0x49, 0x8f, 0x18, - 0x20, 0x3f, 0x26, 0x14, 0x1c, 0x4d, 0xb8, 0x22, 0x47, 0x04, 0xe5, 0xbb, 0xf2, 0x60, 0x76, 0xc3, - 0x83, 0x2e, 0xf5, 0xdb, 0xd7, 0x1e, 0xce, 0x03, 0x79, 0x05, 0x72, 0x1b, 0xa9, 0x2f, 0x11, 0xf6, - 0xf0, 0x65, 0x2b, 0xcb, 0x10, 0x45, 0x36, 0x52, 0x0c, 0x6c, 0x37, 0x81, 0x05, 0x22, 0xd2, 0x92, - 0xef, 0x23, 0x23, 0x31, 0xf0, 0xa6, 0xed, 0x4b, 0x1d, 0xc7, 0x56, 0x11, 0x2e, 0x0b, 0x65, 0x29, - 0x23, 0x9e, 0x6a, 0x70, 0x8b, 0xcc, 0x67, 0xf3, 0x46, 0x5f, 0xaa, 0x7a, 0x3b, 0xb8, 0xca, 0xe9, - 0x41, 0x72, 0x7e, 0x85, 0xc9, 0x5c, 0xc0, 0x99, 0x07, 0xbd, 0xd2, 0xfe, 0x4e, 0xc8, 0x57, 0x57, - 0x5c, 0x3a, 0xe9, 0x74, 0xa1, 0x37, 0x1e, 0x93, 0xe4, 0x24, 0x50, 0x50, 0x0e, 0xbc, 0xff, 0x62, - 0xe8, 0xcd, 0x46, 0xed, 0x9c, 0x3e, 0x78, 0x19, 0xa3, 0xa0, 0x3d, 0x5f, 0x06, 0x33, 0x4b, 0xae, - 0x63, 0x76, 0xda, 0xa6, 0xe7, 0x6b, 0xdf, 0x94, 0xc0, 0xdc, 0xba, 0xb9, 0xdf, 0x75, 0xcc, 0x0e, - 0xf6, 0xef, 0xef, 0xeb, 0x0b, 0x7a, 0xe4, 0x55, 0xd0, 0x17, 0xd0, 0x47, 0xfe, 0x60, 0x60, 0x78, - 0x74, 0x2f, 0x27, 0x72, 0xaf, 0x66, 0xb8, 0xcd, 0x27, 0x0d, 0x0a, 0x56, 0x1a, 0xf0, 0xb5, 0xc8, - 0xf2, 0x14, 0x63, 0x51, 0x7e, 0x58, 0x2c, 0xfc, 0xa8, 0x08, 0xc9, 0xa3, 0xd9, 0x95, 0x7f, 0xc1, - 0x34, 0x28, 0x56, 0x20, 0xb6, 0xe2, 0xfe, 0xa7, 0x04, 0xa6, 0x9a, 0xd0, 0xc7, 0x16, 0xdc, 0x9d, - 0x9c, 0xa7, 0x70, 0x07, 0x67, 0x88, 0x9c, 0xd8, 0x83, 0x67, 0x34, 0x59, 0x67, 0xce, 0x5b, 0xe3, - 0xff, 0x29, 0x3c, 0x12, 0x49, 0xb9, 0x8b, 0xb4, 0xcc, 0x43, 0x79, 0x24, 0x26, 0x92, 0xca, 0xde, - 0xd7, 0xea, 0x3d, 0x12, 0x75, 0xad, 0x62, 0x7a, 0xbd, 0xd7, 0xb0, 0xfa, 0x99, 0xe8, 0x6d, 0x46, - 0x99, 0x4f, 0x70, 0x8e, 0x7a, 0x12, 0x98, 0x22, 0x32, 0x0f, 0xe6, 0xa3, 0xfd, 0x7e, 0x0a, 0x84, - 0x04, 0x3e, 0x7b, 0x1d, 0xe4, 0x14, 0x74, 0x51, 0x8b, 0x2f, 0x7c, 0x22, 0x31, 0x08, 0xe6, 0xea, - 0xd0, 0xbf, 0xe2, 0xb8, 0x97, 0x9a, 0xbe, 0xe9, 0x43, 0xed, 0x5f, 0x24, 0x72, 0x5d, 0x1e, 0x13, - 0xfd, 0xa4, 0x0e, 0x4e, 0x90, 0x0a, 0xd1, 0x8c, 0xb8, 0xff, 0x26, 0x15, 0xb9, 0x7e, 0xa0, 0x10, - 0x98, 0x7c, 0xc6, 0xc1, 0x4f, 0xb5, 0x9f, 0x19, 0x18, 0xf4, 0x49, 0x1a, 0x30, 0x69, 0xa0, 0x92, - 0x61, 0x19, 0x8c, 0xbf, 0x1f, 0x4f, 0xfb, 0x88, 0x90, 0x59, 0x2d, 0x46, 0xf3, 0x68, 0xba, 0x82, - 0x7f, 0x7f, 0x1c, 0xc8, 0x97, 0x77, 0x4c, 0x5f, 0x7b, 0xb7, 0x0c, 0x40, 0xa9, 0xd3, 0x59, 0x23, - 0x3e, 0xe0, 0xac, 0x43, 0xda, 0x59, 0x30, 0xd7, 0xde, 0x31, 0xa3, 0x9b, 0x33, 0x48, 0x7f, 0xc0, - 0xa5, 0xa9, 0x4f, 0x8e, 0x9c, 0xc9, 0x89, 0x54, 0xb5, 0x3e, 0x98, 0x50, 0x19, 0x94, 0x76, 0xe8, - 0x68, 0xce, 0x87, 0xc2, 0x4c, 0x3c, 0x42, 0x87, 0x3e, 0x5f, 0x8c, 0xd8, 0x8b, 0x9f, 0xc3, 0x51, - 0xd2, 0xe1, 0x01, 0x9b, 0x28, 0x21, 0xe5, 0x49, 0x6f, 0xb1, 0x80, 0x1e, 0xc9, 0x7c, 0x4d, 0x24, - 0x74, 0xad, 0xaa, 0x77, 0xac, 0x40, 0xb4, 0x34, 0x60, 0x96, 0xf6, 0xe2, 0x5c, 0x3a, 0xf8, 0x92, - 0x05, 0xf7, 0x0c, 0x30, 0x0f, 0x3b, 0x96, 0x0f, 0x83, 0x5a, 0x52, 0x01, 0x26, 0x41, 0xcc, 0x7f, - 0xa0, 0x3d, 0x4f, 0x38, 0xe8, 0x1a, 0x16, 0xe8, 0xc1, 0x1a, 0xc5, 0xb4, 0x3f, 0xb1, 0x30, 0x6a, - 0x62, 0x34, 0xb3, 0x07, 0xeb, 0x87, 0x65, 0x70, 0x75, 0xcb, 0xd9, 0xde, 0xee, 0xc2, 0x40, 0x4c, - 0x90, 0x78, 0x67, 0x6a, 0xe6, 0x38, 0xe1, 0xc2, 0x3b, 0x41, 0xce, 0x03, 0x56, 0x78, 0x94, 0x0c, - 0x3d, 0xf0, 0x27, 0xa6, 0x12, 0x67, 0x51, 0x58, 0x5c, 0x03, 0xf9, 0x8c, 0x41, 0x41, 0x2c, 0xe0, - 0xb3, 0x30, 0xd9, 0xec, 0x81, 0xf8, 0x82, 0x04, 0xe6, 0xc9, 0xbd, 0x88, 0x81, 0x82, 0xde, 0x3f, - 0x46, 0x00, 0xb4, 0x6f, 0xe6, 0x44, 0xfd, 0x6c, 0xb1, 0x4c, 0x38, 0x4e, 0x62, 0x44, 0x2c, 0x16, - 0x54, 0x65, 0x28, 0xb9, 0x09, 0xdc, 0xd4, 0x99, 0x07, 0xb3, 0x2b, 0x30, 0x68, 0x69, 0x9e, 0xf6, - 0xfe, 0x94, 0x3d, 0xd1, 0x59, 0x30, 0x87, 0x2f, 0x07, 0x6b, 0xd0, 0x63, 0x92, 0x64, 0xd5, 0x8c, - 0x4b, 0x53, 0x6f, 0x04, 0xf3, 0x17, 0xe1, 0x96, 0xe3, 0xc2, 0x06, 0x77, 0x96, 0x92, 0x4f, 0x1c, - 0x1c, 0x9e, 0x4e, 0xbd, 0x19, 0x1c, 0xa7, 0x8e, 0xee, 0x4b, 0x68, 0xae, 0x6f, 0xba, 0xfb, 0xf4, - 0x60, 0x5a, 0x7f, 0xb2, 0xf6, 0x97, 0x6c, 0x83, 0x59, 0xe2, 0x51, 0xbc, 0xf5, 0xa0, 0xd8, 0x99, - 0x4a, 0xc7, 0x8c, 0x4e, 0x4f, 0x01, 0xd3, 0x54, 0x47, 0x02, 0x83, 0x2e, 0xa9, 0x07, 0x0d, 0xf3, - 0xaa, 0x4f, 0x01, 0x33, 0x48, 0x44, 0xd8, 0x6e, 0xa0, 0x5d, 0xef, 0xe9, 0x01, 0x1f, 0xe2, 0xf7, - 0x46, 0x94, 0x55, 0xfb, 0x85, 0x50, 0x67, 0x74, 0x4e, 0x67, 0x9e, 0x98, 0x86, 0xf9, 0x89, 0x5c, - 0x24, 0xaf, 0x30, 0xe5, 0x2f, 0xed, 0x57, 0x3b, 0x9e, 0xb6, 0x96, 0x4e, 0x6b, 0xce, 0x00, 0x10, - 0x36, 0xbf, 0x20, 0x70, 0x06, 0x93, 0xc2, 0xc7, 0xc6, 0x4f, 0x3c, 0x0a, 0xd8, 0x2f, 0x0e, 0xcc, - 0xce, 0x78, 0x01, 0x15, 0x3c, 0x42, 0x28, 0xc2, 0x49, 0xf6, 0xe8, 0xfc, 0x7c, 0x1e, 0x5c, 0x1d, - 0x9e, 0x70, 0xaa, 0x99, 0x5e, 0xd4, 0xb2, 0x2f, 0xa4, 0x83, 0x88, 0x3b, 0x52, 0x12, 0x36, 0xc7, - 0x93, 0xa0, 0xe0, 0xed, 0x5d, 0x0c, 0x1d, 0x01, 0xc9, 0x83, 0xf6, 0x46, 0x39, 0xd5, 0x58, 0x35, - 0x90, 0xbf, 0x31, 0x37, 0xc2, 0x5b, 0xc1, 0x09, 0x7b, 0x6f, 0x37, 0xc4, 0x02, 0xf7, 0x34, 0xb4, - 0x67, 0x39, 0xf8, 0x82, 0x6f, 0xb2, 0x79, 0xf1, 0x26, 0x9b, 0x62, 0x24, 0x15, 0xa9, 0x74, 0xf6, - 0xea, 0xf1, 0xe9, 0xbe, 0x23, 0x68, 0xe5, 0xd4, 0x4a, 0x41, 0xe0, 0x97, 0x58, 0xf8, 0xff, 0x29, - 0x97, 0xaa, 0xe7, 0x1d, 0x7e, 0x72, 0x2d, 0x45, 0x4f, 0x78, 0x94, 0xc7, 0xd6, 0x3e, 0x2f, 0x01, - 0xad, 0x19, 0x39, 0xe4, 0x50, 0x50, 0xd7, 0x5d, 0x78, 0xd9, 0x82, 0x57, 0x38, 0xf7, 0xad, 0x37, - 0x09, 0xc7, 0xa1, 0xe6, 0x75, 0xe5, 0x00, 0xd1, 0xf8, 0x75, 0xf1, 0x01, 0xb8, 0x88, 0xc5, 0x9b, - 0x4e, 0x57, 0xe2, 0x04, 0x62, 0x87, 0x4b, 0xe0, 0x0c, 0x83, 0xea, 0xb2, 0xeb, 0xec, 0x26, 0x48, - 0xf6, 0x15, 0xac, 0x64, 0x37, 0x78, 0xc9, 0xde, 0x9b, 0xa8, 0x2e, 0x03, 0x08, 0xc7, 0xa8, 0xe3, - 0xfb, 0x43, 0x39, 0x3e, 0x8b, 0x93, 0x63, 0xe5, 0x90, 0xf4, 0xb3, 0x97, 0xe5, 0x1f, 0xe4, 0xc1, - 0x9c, 0x01, 0xcd, 0x4e, 0x38, 0x08, 0xfc, 0x9f, 0x8c, 0x79, 0xf7, 0x34, 0x90, 0xf7, 0xa3, 0x75, - 0x9a, 0xc7, 0x1d, 0xac, 0x0c, 0xfb, 0x25, 0x7e, 0xc0, 0xcb, 0x35, 0xf8, 0xa3, 0x03, 0xbd, 0x85, - 0x24, 0x60, 0x1b, 0xca, 0x22, 0xb6, 0x61, 0x7e, 0x90, 0x6d, 0x78, 0x33, 0x38, 0xde, 0x35, 0x3d, - 0xbf, 0x72, 0xb1, 0x65, 0xed, 0x42, 0xcf, 0x37, 0x77, 0x7b, 0xd8, 0x0a, 0x94, 0x8d, 0xfe, 0x64, - 0xfe, 0x1e, 0xf8, 0xc4, 0xf3, 0x60, 0x83, 0xaa, 0x78, 0xf8, 0x98, 0xb9, 0x1f, 0x12, 0x3a, 0xfc, - 0x35, 0xac, 0xec, 0x74, 0x9a, 0x71, 0xdf, 0x08, 0x6b, 0x4b, 0xa7, 0x80, 0xba, 0xa6, 0x37, 0x9b, - 0xa5, 0x15, 0x7c, 0x26, 0x24, 0x70, 0x12, 0xea, 0x9c, 0x7d, 0x2c, 0x12, 0x1f, 0x41, 0x5a, 0x9d, - 0x8b, 0xc6, 0x5e, 0xe5, 0x98, 0x3a, 0x0b, 0xa6, 0x5c, 0xd8, 0xeb, 0x5a, 0xd0, 0x53, 0x72, 0xda, - 0x37, 0x24, 0x50, 0xdc, 0xb0, 0x5d, 0x68, 0x76, 0xb4, 0x67, 0xc6, 0x0f, 0x21, 0x23, 0x2a, 0x05, - 0x1f, 0xf7, 0x2a, 0x71, 0x55, 0x96, 0x36, 0x3a, 0xc4, 0xc8, 0x58, 0xe0, 0x13, 0x5b, 0x8e, 0x8d, - 0x2f, 0x35, 0xf3, 0x26, 0x7d, 0x76, 0x0a, 0x14, 0xf4, 0xdd, 0x9e, 0xbf, 0x7f, 0xf6, 0xb1, 0x60, - 0xbe, 0xe9, 0xbb, 0xd0, 0xdc, 0x65, 0x36, 0xd5, 0x7d, 0xe7, 0x12, 0xb4, 0x83, 0x4d, 0x75, 0xfc, - 0x70, 0xd7, 0x9d, 0x60, 0xca, 0x76, 0x36, 0xcd, 0x3d, 0x7f, 0x47, 0xbd, 0xee, 0x40, 0x34, 0x1a, - 0xaa, 0x7e, 0x0d, 0x1a, 0xfe, 0xef, 0x4f, 0xef, 0xc6, 0x53, 0xab, 0xa2, 0xed, 0x94, 0xf6, 0xfc, - 0x9d, 0xa5, 0x6b, 0x3f, 0xf5, 0x67, 0x67, 0x72, 0x9f, 0xfb, 0xb3, 0x33, 0xb9, 0xaf, 0xfc, 0xd9, - 0x99, 0xdc, 0x8f, 0xff, 0xf9, 0x99, 0x63, 0x9f, 0xfb, 0xf3, 0x33, 0xc7, 0xbe, 0xf0, 0xe7, 0x67, - 0x8e, 0x7d, 0x8f, 0xd4, 0xbb, 0x78, 0xb1, 0x88, 0xa9, 0x3c, 0xe9, 0xff, 0x0d, 0x00, 0x00, 0xff, - 0xff, 0xe5, 0x76, 0x0c, 0x3b, 0xd1, 0x2b, 0x02, 0x00, + // 21504 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7b, 0x98, 0x24, 0x49, + 0x59, 0x37, 0x3a, 0x95, 0x59, 0x55, 0xdd, 0x1d, 0x7d, 0x99, 0x9c, 0xdc, 0xd9, 0x61, 0x36, 0x59, + 0x66, 0xd7, 0xd9, 0x65, 0x59, 0x97, 0xa5, 0x77, 0x59, 0x10, 0xd9, 0x65, 0x97, 0xa5, 0xba, 0x2a, + 0xbb, 0xbb, 0x76, 0xab, 0xab, 0x9a, 0xac, 0xea, 0x19, 0x46, 0x3f, 0x4f, 0x9b, 0x53, 0x15, 0xdd, + 0x9d, 0x3b, 0xd5, 0x99, 0x45, 0x66, 0xf6, 0xcc, 0x36, 0xe7, 0xf9, 0xce, 0x27, 0xe2, 0x0a, 0x88, + 0x88, 0xa8, 0xa8, 0x88, 0xdc, 0x16, 0x01, 0x01, 0xb9, 0xdf, 0x3e, 0x50, 0x2e, 0x72, 0x11, 0x44, + 0x54, 0x14, 0x2f, 0x80, 0x72, 0xc4, 0x3b, 0x7e, 0x47, 0x8f, 0x1f, 0x1e, 0x05, 0xf1, 0x13, 0x3d, + 0x4f, 0x5c, 0x32, 0x33, 0xa2, 0xba, 0x32, 0x2b, 0xb2, 0xba, 0xb2, 0x7a, 0xd1, 0xef, 0xaf, 0xaa, + 0x8c, 0x8c, 0x7c, 0xe3, 0x8d, 0xf7, 0xf7, 0x46, 0xc4, 0x1b, 0x11, 0x6f, 0xbc, 0x01, 0x4e, 0xf7, + 0x2e, 0xde, 0xd6, 0x73, 0x1d, 0xdf, 0xf1, 0x6e, 0x6b, 0x3b, 0xbb, 0xbb, 0xa6, 0xdd, 0xf1, 0x16, + 0xf1, 0xb3, 0x3a, 0x65, 0xda, 0xfb, 0xfe, 0x7e, 0x0f, 0x6a, 0x37, 0xf6, 0x2e, 0x6d, 0xdf, 0xd6, + 0xb5, 0x2e, 0xde, 0xd6, 0xbb, 0x78, 0xdb, 0xae, 0xd3, 0x81, 0xdd, 0xe0, 0x03, 0xfc, 0x40, 0xb3, + 0x6b, 0x37, 0xc7, 0xe5, 0xea, 0x3a, 0x6d, 0xb3, 0xeb, 0xf9, 0x8e, 0x0b, 0x69, 0xce, 0x53, 0x51, + 0x91, 0xf0, 0x32, 0xb4, 0xfd, 0x80, 0xc2, 0xb5, 0xdb, 0x8e, 0xb3, 0xdd, 0x85, 0xe4, 0xdd, 0xc5, + 0xbd, 0xad, 0xdb, 0x3c, 0xdf, 0xdd, 0x6b, 0xfb, 0xf4, 0xed, 0xf5, 0xfd, 0x6f, 0x3b, 0xd0, 0x6b, + 0xbb, 0x56, 0xcf, 0x77, 0x5c, 0x92, 0xe3, 0xec, 0x9f, 0xff, 0xde, 0x34, 0x90, 0x8d, 0x5e, 0x5b, + 0xfb, 0xfa, 0x14, 0x90, 0x4b, 0xbd, 0x9e, 0xf6, 0x49, 0x09, 0x80, 0x15, 0xe8, 0x9f, 0x83, 0xae, + 0x67, 0x39, 0xb6, 0x76, 0x1c, 0x4c, 0x19, 0xf0, 0xd9, 0x7b, 0xd0, 0xf3, 0xef, 0xca, 0xbf, 0xe0, + 0xaf, 0xe4, 0x9c, 0xf6, 0x7a, 0x09, 0x4c, 0x1b, 0xd0, 0xeb, 0x39, 0xb6, 0x07, 0xd5, 0x67, 0x80, + 0x02, 0x74, 0x5d, 0xc7, 0x3d, 0x9d, 0xbb, 0x3e, 0x77, 0xf3, 0xec, 0x1d, 0xb7, 0x2c, 0xd2, 0xea, + 0x2f, 0x1a, 0xbd, 0xf6, 0x62, 0xa9, 0xd7, 0x5b, 0x8c, 0x28, 0x2d, 0x06, 0x1f, 0x2d, 0xea, 0xe8, + 0x0b, 0x83, 0x7c, 0xa8, 0x9e, 0x06, 0x53, 0x97, 0x49, 0x86, 0xd3, 0xd2, 0xf5, 0xb9, 0x9b, 0x67, + 0x8c, 0xe0, 0x11, 0xbd, 0xe9, 0x40, 0xdf, 0xb4, 0xba, 0xde, 0x69, 0x99, 0xbc, 0xa1, 0x8f, 0xda, + 0xc3, 0x39, 0x50, 0xc0, 0x44, 0xd4, 0x32, 0xc8, 0xb7, 0x9d, 0x0e, 0xc4, 0xc5, 0x2f, 0xdc, 0x71, + 0x9b, 0x78, 0xf1, 0x8b, 0x65, 0xa7, 0x03, 0x0d, 0xfc, 0xb1, 0x7a, 0x3d, 0x98, 0x0d, 0xc4, 0x12, + 0xb1, 0xc1, 0x26, 0x9d, 0xbd, 0x03, 0xe4, 0x51, 0x7e, 0x75, 0x1a, 0xe4, 0xeb, 0x1b, 0xb5, 0x9a, + 0x72, 0x4c, 0x3d, 0x01, 0xe6, 0x37, 0xea, 0xf7, 0xd7, 0x1b, 0xe7, 0xeb, 0x9b, 0xba, 0x61, 0x34, + 0x0c, 0x25, 0xa7, 0xce, 0x83, 0x99, 0xa5, 0x52, 0x65, 0xb3, 0x5a, 0x5f, 0xdf, 0x68, 0x29, 0x92, + 0xf6, 0x2a, 0x19, 0x2c, 0x34, 0xa1, 0x5f, 0x81, 0x97, 0xad, 0x36, 0x6c, 0xfa, 0xa6, 0x0f, 0xb5, + 0x97, 0xe4, 0x42, 0x61, 0xaa, 0x1b, 0xa8, 0xd0, 0xf0, 0x15, 0xad, 0xc0, 0x93, 0x0e, 0x54, 0x80, + 0xa7, 0xb0, 0x48, 0xbf, 0x5e, 0x64, 0xd2, 0x0c, 0x96, 0xce, 0xd9, 0x27, 0x80, 0x59, 0xe6, 0x9d, + 0xba, 0x00, 0xc0, 0x52, 0xa9, 0x7c, 0xff, 0x8a, 0xd1, 0xd8, 0xa8, 0x57, 0x94, 0x63, 0xe8, 0x79, + 0xb9, 0x61, 0xe8, 0xf4, 0x39, 0xa7, 0x7d, 0x33, 0xc7, 0x80, 0x59, 0xe1, 0xc1, 0x5c, 0x1c, 0xce, + 0xcc, 0x00, 0x40, 0xb5, 0x37, 0x84, 0xe0, 0xac, 0x70, 0xe0, 0x3c, 0x29, 0x1d, 0xb9, 0xec, 0x01, + 0x7a, 0x48, 0x02, 0xd3, 0xcd, 0x9d, 0x3d, 0xbf, 0xe3, 0x5c, 0xb1, 0xb5, 0x99, 0x10, 0x19, 0xed, + 0xef, 0x58, 0x99, 0x3c, 0x9d, 0x97, 0xc9, 0xcd, 0x07, 0x2b, 0x41, 0x29, 0xc4, 0x48, 0xe3, 0x35, + 0xa1, 0x34, 0x4a, 0x9c, 0x34, 0x9e, 0x20, 0x4a, 0x28, 0x7b, 0x39, 0x7c, 0xe1, 0x6e, 0x50, 0x68, + 0xf6, 0xcc, 0x36, 0xd4, 0x3e, 0x2b, 0x83, 0xb9, 0x1a, 0x34, 0x2f, 0xc3, 0x52, 0xaf, 0xe7, 0x3a, + 0x97, 0xa1, 0x56, 0x8e, 0xf4, 0xf5, 0x34, 0x98, 0xf2, 0x50, 0xa6, 0x6a, 0x07, 0xd7, 0x60, 0xc6, + 0x08, 0x1e, 0xd5, 0x33, 0x00, 0x58, 0x1d, 0x68, 0xfb, 0x96, 0x6f, 0x41, 0xef, 0xb4, 0x74, 0xbd, + 0x7c, 0xf3, 0x8c, 0xc1, 0xa4, 0x68, 0x5f, 0x97, 0x44, 0x75, 0x0c, 0x73, 0xb1, 0xc8, 0x72, 0x10, + 0x23, 0xd5, 0xd7, 0x49, 0x22, 0x3a, 0x36, 0x94, 0x5c, 0x3a, 0xd9, 0xbe, 0x2d, 0x97, 0x5e, 0xb8, + 0x28, 0x47, 0xbd, 0xb1, 0xd9, 0xdc, 0x28, 0xaf, 0x6e, 0x36, 0xd7, 0x4b, 0x65, 0x5d, 0x81, 0xea, + 0x49, 0xa0, 0xe0, 0xbf, 0x9b, 0xd5, 0xe6, 0x66, 0x45, 0xaf, 0xe9, 0x2d, 0xbd, 0xa2, 0x6c, 0xa9, + 0x2a, 0x58, 0x30, 0xf4, 0x67, 0x6e, 0xe8, 0xcd, 0xd6, 0xe6, 0x72, 0xa9, 0x5a, 0xd3, 0x2b, 0xca, + 0x36, 0xfa, 0xb8, 0x56, 0x5d, 0xab, 0xb6, 0x36, 0x0d, 0xbd, 0x54, 0x5e, 0xd5, 0x2b, 0xca, 0x8e, + 0xfa, 0x28, 0x70, 0x55, 0xbd, 0xb1, 0x59, 0x5a, 0x5f, 0x37, 0x1a, 0xe7, 0xf4, 0x4d, 0xfa, 0x45, + 0x53, 0xb1, 0x48, 0x41, 0xad, 0xcd, 0xe6, 0x6a, 0xc9, 0xd0, 0x4b, 0x4b, 0x35, 0x5d, 0x79, 0x40, + 0x7b, 0x9e, 0x0c, 0xe6, 0xd7, 0xcc, 0x4b, 0xb0, 0xb9, 0x63, 0xba, 0xd0, 0xbc, 0xd8, 0x85, 0xda, + 0x0d, 0x02, 0x78, 0x6a, 0x9f, 0x65, 0xf1, 0xd2, 0x79, 0xbc, 0x6e, 0x1b, 0x20, 0x60, 0xae, 0x88, + 0x18, 0xc0, 0xfe, 0x39, 0x6c, 0x06, 0xab, 0x1c, 0x60, 0x4f, 0x4e, 0x49, 0x2f, 0x1d, 0x62, 0x3f, + 0xf8, 0x08, 0x40, 0x4c, 0xfb, 0x62, 0x1e, 0x2c, 0x54, 0xed, 0xcb, 0x96, 0x0f, 0x57, 0xa0, 0x0d, + 0x5d, 0x34, 0x0e, 0xbc, 0x2a, 0x27, 0xd2, 0xae, 0x5a, 0x00, 0x58, 0xf8, 0xbb, 0xd6, 0x7e, 0x0f, + 0xe2, 0xea, 0x0d, 0x96, 0x17, 0x4f, 0x3c, 0x1c, 0x22, 0xaa, 0xe1, 0xb7, 0x06, 0x43, 0xe7, 0xec, + 0x0d, 0x00, 0x44, 0x6f, 0x54, 0x00, 0x8a, 0x6b, 0x70, 0xf7, 0x22, 0x74, 0x95, 0x63, 0xea, 0x0c, + 0x28, 0xac, 0xa0, 0x2f, 0x95, 0x9c, 0xf6, 0x7a, 0x99, 0x51, 0x81, 0x65, 0x5e, 0x05, 0x6e, 0x17, + 0x61, 0x61, 0xd0, 0x48, 0x7f, 0x2d, 0x98, 0x21, 0x7c, 0x94, 0xad, 0x0e, 0x45, 0x2b, 0x4a, 0x50, + 0x6f, 0x04, 0xf3, 0xe4, 0x61, 0xd9, 0xea, 0xc2, 0xfb, 0xe1, 0x3e, 0x1d, 0xf3, 0xf9, 0x44, 0xed, + 0x47, 0xc3, 0x86, 0x5f, 0xe5, 0xf4, 0xe8, 0xbb, 0xd2, 0x32, 0x95, 0x4e, 0x91, 0x5e, 0xf6, 0x48, + 0x68, 0xfa, 0x07, 0x5a, 0xb8, 0xa5, 0x7d, 0x4b, 0x02, 0xb3, 0x4d, 0xdf, 0xe9, 0xa1, 0xe6, 0x62, + 0xd9, 0xdb, 0x62, 0xed, 0xfb, 0xd3, 0x6c, 0xfb, 0x2e, 0xf3, 0xe0, 0x3e, 0x61, 0x80, 0x1c, 0x99, + 0x02, 0x62, 0x5a, 0xf7, 0xd7, 0xc3, 0xd6, 0xbd, 0xcc, 0xa1, 0x72, 0x47, 0x2a, 0x6a, 0xdf, 0x86, + 0x6d, 0xfb, 0x65, 0x32, 0x50, 0x02, 0x35, 0xf3, 0xcb, 0x7b, 0xae, 0x0b, 0x6d, 0x5f, 0x0c, 0x84, + 0x3f, 0x62, 0x41, 0x58, 0xe5, 0x41, 0xb8, 0x23, 0x41, 0x99, 0x83, 0x52, 0x32, 0x6c, 0x63, 0x1f, + 0x0d, 0xd1, 0xbc, 0x9f, 0x43, 0xf3, 0xbb, 0xd3, 0xb3, 0x95, 0x0e, 0xd2, 0xd5, 0x11, 0x10, 0x3d, + 0x09, 0x14, 0x34, 0x1e, 0x96, 0x5b, 0xd5, 0x73, 0xfa, 0x66, 0xb5, 0x7e, 0xae, 0xda, 0xd2, 0x15, + 0xa8, 0xbd, 0x54, 0x8e, 0xfa, 0x5c, 0x1f, 0x77, 0x6a, 0x62, 0xa8, 0x7c, 0x51, 0x1a, 0xad, 0xdf, + 0x23, 0x65, 0x4c, 0x04, 0x13, 0xf1, 0x7e, 0x6f, 0x20, 0x53, 0xe9, 0x10, 0xb9, 0x6f, 0x04, 0x44, + 0x4e, 0x01, 0xb5, 0x5a, 0x3f, 0x57, 0xaa, 0x55, 0x2b, 0xa4, 0x8d, 0x6d, 0xb6, 0x2e, 0xac, 0x23, + 0x4c, 0x7e, 0x52, 0x06, 0x73, 0x84, 0x35, 0x03, 0x5e, 0x76, 0x2e, 0x09, 0x1a, 0x23, 0x5f, 0x4e, + 0x69, 0x3c, 0xb2, 0x25, 0xc4, 0xf4, 0x56, 0x3f, 0x92, 0xc2, 0x78, 0x4c, 0x20, 0xf7, 0x48, 0x1a, + 0x41, 0x0e, 0x74, 0x4d, 0xdb, 0x03, 0x7a, 0xb0, 0x81, 0x23, 0xc8, 0xc7, 0xf3, 0x81, 0x3d, 0x70, + 0xce, 0x82, 0x57, 0xb4, 0xb5, 0x08, 0x13, 0x4e, 0x6d, 0x73, 0x43, 0xd5, 0x56, 0x1a, 0xa4, 0xb6, + 0x7f, 0xc9, 0xda, 0x11, 0x4b, 0x3c, 0x7a, 0xb7, 0xc6, 0x8a, 0x1b, 0x71, 0x12, 0xbf, 0x5a, 0x10, + 0x28, 0x8a, 0xc4, 0x5b, 0x4b, 0xd7, 0x82, 0x19, 0xfc, 0xb7, 0x6e, 0xee, 0x42, 0xda, 0x86, 0xa2, + 0x04, 0xf5, 0x2c, 0x98, 0x23, 0x19, 0xdb, 0x8e, 0x8d, 0xea, 0x93, 0xc7, 0x19, 0xb8, 0x34, 0x04, + 0x62, 0xdb, 0x85, 0xa6, 0xef, 0xb8, 0x98, 0x46, 0x81, 0x80, 0xc8, 0x24, 0xa9, 0xb7, 0x82, 0x13, + 0x96, 0x87, 0x5b, 0xd5, 0x86, 0x07, 0x5d, 0xc2, 0xec, 0xe9, 0xe2, 0xf5, 0xb9, 0x9b, 0xa7, 0x8d, + 0x83, 0x2f, 0xb4, 0xaf, 0x86, 0x6d, 0x56, 0xe7, 0xf4, 0xec, 0x89, 0x69, 0x2a, 0x9e, 0x4e, 0xcb, + 0x2e, 0x8f, 0xd6, 0x83, 0x92, 0x7e, 0x73, 0x13, 0xe9, 0xc6, 0x32, 0x5e, 0x18, 0x80, 0xb4, 0x15, + 0xa3, 0x54, 0x94, 0xb7, 0xdc, 0xa8, 0xb7, 0xf4, 0x7a, 0x4b, 0xd9, 0x1a, 0xa8, 0x7f, 0xdb, 0xda, + 0xeb, 0xf2, 0x20, 0x7f, 0x9f, 0x63, 0xd9, 0xda, 0x43, 0x39, 0x4e, 0x81, 0x6c, 0xe8, 0x5f, 0x71, + 0xdc, 0x4b, 0x61, 0xb3, 0x8e, 0x12, 0x92, 0x91, 0x8c, 0x14, 0x4f, 0x1e, 0xaa, 0x78, 0xf9, 0x41, + 0x8a, 0xf7, 0x13, 0xac, 0xe2, 0xdd, 0xcd, 0x2b, 0xde, 0x4d, 0x03, 0xe4, 0x8f, 0x98, 0x8f, 0xe9, + 0x2e, 0x3e, 0x15, 0x76, 0x17, 0xf7, 0x72, 0x30, 0x3e, 0x5e, 0x8c, 0x4c, 0x3a, 0x00, 0xbf, 0x94, + 0x69, 0x37, 0x31, 0x08, 0xea, 0xed, 0x18, 0xa8, 0x77, 0x06, 0xf4, 0x20, 0xd6, 0xc1, 0x8e, 0xe6, + 0x81, 0x83, 0x9d, 0xca, 0x25, 0xf5, 0x6a, 0x70, 0xa2, 0x52, 0x5d, 0x5e, 0xd6, 0x0d, 0xbd, 0xde, + 0xda, 0xac, 0xeb, 0xad, 0xf3, 0x0d, 0xe3, 0x7e, 0xa5, 0xab, 0x3d, 0x2c, 0x03, 0x80, 0x24, 0x54, + 0x36, 0xed, 0x36, 0xec, 0x8a, 0xf5, 0xff, 0xff, 0xaf, 0x94, 0xae, 0x07, 0x89, 0xe8, 0xc7, 0xc0, + 0xf9, 0x4a, 0x49, 0xbc, 0x55, 0xc6, 0x12, 0x4b, 0x07, 0xea, 0x9b, 0x1f, 0x09, 0xb3, 0x87, 0xab, + 0xc0, 0xf1, 0x80, 0x1e, 0xcd, 0x3e, 0x78, 0xd1, 0xe0, 0xed, 0x79, 0xb0, 0x40, 0x61, 0x09, 0x56, + 0x81, 0x5e, 0x20, 0x34, 0x5d, 0xd5, 0xc0, 0x34, 0x5d, 0xf4, 0x09, 0x06, 0x83, 0xf0, 0x59, 0x5d, + 0x01, 0xb3, 0x3d, 0xe8, 0xee, 0x5a, 0x9e, 0x67, 0x39, 0x36, 0x59, 0xce, 0x5d, 0xb8, 0xe3, 0xb1, + 0xa1, 0xc4, 0xf1, 0xca, 0xf7, 0xe2, 0xba, 0xe9, 0xfa, 0x56, 0xdb, 0xea, 0x99, 0xb6, 0xbf, 0x1e, + 0x65, 0x36, 0xd8, 0x2f, 0x91, 0x61, 0x97, 0xca, 0x40, 0xe3, 0x6b, 0x12, 0xa3, 0x12, 0xbf, 0x92, + 0x62, 0x52, 0x99, 0x48, 0x30, 0x9d, 0x5a, 0x7c, 0x32, 0x53, 0xb5, 0x18, 0x80, 0xf7, 0xb6, 0x7a, + 0x0d, 0xb8, 0xba, 0x5a, 0x2f, 0x37, 0x0c, 0x43, 0x2f, 0xb7, 0x36, 0xd7, 0x75, 0x63, 0xad, 0xda, + 0x6c, 0x56, 0x1b, 0xf5, 0xe6, 0x61, 0x5a, 0xbb, 0xf6, 0x19, 0x39, 0xd4, 0x98, 0x0a, 0x6c, 0x77, + 0x2d, 0x1b, 0x6a, 0xf7, 0x1e, 0x52, 0x61, 0xf8, 0x35, 0x43, 0x71, 0x9c, 0x69, 0xf9, 0x31, 0x38, + 0xbf, 0x36, 0x3d, 0xce, 0x83, 0x09, 0xfe, 0x07, 0x6e, 0xfe, 0x5f, 0x96, 0xc1, 0x09, 0xa6, 0x21, + 0x1a, 0x70, 0x77, 0x6c, 0xeb, 0xc0, 0x3f, 0xc8, 0xb6, 0xdd, 0x2a, 0x8f, 0xe9, 0x20, 0xdb, 0xfb, + 0x00, 0x1b, 0x31, 0xb0, 0xbe, 0x39, 0x84, 0xb5, 0xc6, 0xc1, 0xfa, 0xd4, 0x11, 0x68, 0xa6, 0x43, + 0xf6, 0x1d, 0x99, 0x22, 0x7b, 0x0d, 0xb8, 0x7a, 0xbd, 0x64, 0xb4, 0xaa, 0xe5, 0xea, 0x7a, 0x09, + 0x8d, 0xa3, 0xcc, 0x90, 0x1d, 0x63, 0xdc, 0xf3, 0xa0, 0x0f, 0xc4, 0xf7, 0x23, 0x79, 0x70, 0xed, + 0xe0, 0x8e, 0xb6, 0xbc, 0x63, 0xda, 0xdb, 0x50, 0xb3, 0x44, 0xa0, 0xae, 0x80, 0xa9, 0x36, 0xce, + 0x4e, 0x70, 0x66, 0x37, 0xfe, 0x12, 0xfa, 0x72, 0x52, 0x82, 0x11, 0x7c, 0xaa, 0xbd, 0x9b, 0x55, + 0x88, 0x16, 0xaf, 0x10, 0x4f, 0x4f, 0x06, 0xef, 0x00, 0xdf, 0x31, 0xba, 0xf1, 0xb9, 0x50, 0x37, + 0xce, 0x73, 0xba, 0x51, 0x3e, 0x1c, 0xf9, 0x74, 0x6a, 0xf2, 0x1b, 0x8f, 0x84, 0x0e, 0x20, 0x56, + 0x9b, 0xac, 0xf8, 0x51, 0x61, 0x60, 0x77, 0xff, 0x6a, 0x19, 0x14, 0x2b, 0xb0, 0x0b, 0x7d, 0xc1, + 0x19, 0xfc, 0xdf, 0x4b, 0xa2, 0xdb, 0x69, 0x04, 0x06, 0x42, 0x3b, 0x7e, 0x2d, 0xc5, 0xb7, 0x76, + 0xa1, 0xe7, 0x9b, 0xbb, 0x3d, 0x2c, 0x6a, 0xd9, 0x88, 0x12, 0xb4, 0x1f, 0x92, 0x44, 0x36, 0xdb, + 0x12, 0x8a, 0xf9, 0x8f, 0xb1, 0x2a, 0xfc, 0x79, 0x09, 0x4c, 0x37, 0xa1, 0xdf, 0x70, 0x3b, 0xd0, + 0xd5, 0x9a, 0x11, 0x46, 0xd7, 0x83, 0x59, 0x0c, 0x0a, 0x9a, 0x66, 0x86, 0x38, 0xb1, 0x49, 0xea, + 0x4d, 0x60, 0x21, 0x7c, 0xc4, 0x9f, 0xd3, 0x6e, 0xbc, 0x2f, 0x55, 0xfb, 0x5a, 0x4e, 0xd4, 0x07, + 0x80, 0x2e, 0xfa, 0x52, 0x6e, 0x62, 0x5a, 0xa9, 0xd8, 0x7e, 0x7e, 0x22, 0xa9, 0xec, 0xb7, 0x49, + 0xdf, 0x29, 0x01, 0xb0, 0x61, 0x7b, 0x81, 0x5c, 0x1f, 0x9f, 0x42, 0xae, 0xda, 0x3f, 0xe5, 0xd2, + 0xcd, 0x62, 0xa2, 0x72, 0x62, 0x24, 0xf6, 0x0b, 0x29, 0xd6, 0x16, 0x62, 0x89, 0x4d, 0x60, 0x6b, + 0xf9, 0x38, 0x28, 0x9e, 0x37, 0xbb, 0x5d, 0xe8, 0x6b, 0xaf, 0x92, 0x41, 0xb1, 0xec, 0x42, 0xd3, + 0x87, 0x1a, 0x8c, 0x44, 0xa7, 0x81, 0x69, 0xd7, 0x71, 0xfc, 0x75, 0xd3, 0xdf, 0xa1, 0x72, 0x0b, + 0x9f, 0xd5, 0xa7, 0x82, 0x47, 0x6d, 0xed, 0x75, 0xbb, 0x3e, 0x7c, 0xd0, 0x5f, 0x77, 0xad, 0x5d, + 0xd3, 0xdd, 0xaf, 0x99, 0xf6, 0xf6, 0x9e, 0xb9, 0x0d, 0x29, 0x7b, 0x71, 0xaf, 0xa9, 0xa3, 0xca, + 0x2f, 0xb1, 0x1d, 0xcf, 0xbd, 0xbc, 0xd0, 0xbf, 0x93, 0x93, 0x13, 0x61, 0x71, 0x91, 0xb0, 0x17, + 0xd3, 0xf3, 0x68, 0x60, 0x7a, 0xd7, 0x86, 0xbb, 0x8e, 0x6d, 0xb5, 0x03, 0x6b, 0x35, 0x78, 0xd6, + 0x3e, 0x16, 0xa2, 0xb1, 0xc4, 0xa1, 0xb1, 0x28, 0x5c, 0x4a, 0x3a, 0x28, 0x9a, 0x23, 0xf4, 0x3b, + 0xd7, 0x81, 0x47, 0x93, 0x6e, 0x64, 0xb3, 0xd5, 0xd8, 0x2c, 0x1b, 0x7a, 0xa9, 0xa5, 0x6f, 0xd6, + 0x1a, 0xe5, 0x52, 0x6d, 0xd3, 0xd0, 0xd7, 0x1b, 0x0a, 0x44, 0xb3, 0xf3, 0x29, 0x03, 0xb6, 0x9d, + 0xcb, 0xd0, 0xd5, 0x9e, 0x9b, 0x13, 0x83, 0x28, 0x41, 0x28, 0x49, 0xf0, 0xc9, 0x22, 0xf0, 0xfd, + 0x84, 0xb0, 0x9f, 0x11, 0x15, 0x2c, 0x65, 0x3e, 0xa6, 0xc5, 0x7c, 0x5c, 0xa8, 0x8f, 0x49, 0x24, + 0xf5, 0x08, 0x00, 0xe9, 0x1f, 0x25, 0x30, 0x55, 0x76, 0xec, 0xcb, 0xd0, 0xf5, 0xd9, 0x49, 0x16, + 0x8b, 0x43, 0xae, 0x0f, 0x87, 0xd3, 0x60, 0x0a, 0xda, 0xbe, 0xeb, 0xf4, 0x82, 0x59, 0x56, 0xf0, + 0xa8, 0xbd, 0x31, 0xad, 0x84, 0x69, 0xc9, 0xf1, 0x6b, 0xb3, 0x83, 0x0b, 0xe2, 0xd8, 0x93, 0xfb, + 0xda, 0xce, 0xc3, 0x69, 0x70, 0x19, 0xcc, 0x40, 0xf6, 0xfd, 0xd8, 0x57, 0x64, 0x30, 0x4f, 0xda, + 0x6d, 0x13, 0x62, 0xb3, 0x50, 0x6b, 0xb0, 0xeb, 0x9c, 0x7d, 0xc2, 0x5f, 0x3d, 0xc6, 0x89, 0xbf, + 0x68, 0xf6, 0x7a, 0xe1, 0x0a, 0xf9, 0xea, 0x31, 0x83, 0x3e, 0x13, 0x35, 0x5f, 0x2a, 0x82, 0xbc, + 0xb9, 0xe7, 0xef, 0x68, 0xdf, 0x12, 0x9e, 0xf1, 0x72, 0xfd, 0x08, 0xe5, 0x27, 0x06, 0x92, 0x93, + 0xa0, 0xe0, 0x3b, 0x97, 0x60, 0x20, 0x07, 0xf2, 0x80, 0xe0, 0x30, 0x7b, 0xbd, 0x16, 0x7e, 0x41, + 0xe1, 0x08, 0x9e, 0x91, 0x81, 0x65, 0xb6, 0xdb, 0xce, 0x9e, 0xed, 0x57, 0x83, 0x55, 0xf2, 0x28, + 0x41, 0xfb, 0x82, 0xd0, 0x36, 0x94, 0x00, 0x83, 0xe9, 0x20, 0xbb, 0x38, 0x42, 0x53, 0x5a, 0x04, + 0xb7, 0x94, 0xd6, 0xd7, 0x37, 0x5b, 0x8d, 0xfb, 0xf5, 0x7a, 0x64, 0xed, 0x6e, 0x56, 0xeb, 0x9b, + 0xad, 0x55, 0x7d, 0xb3, 0xbc, 0x61, 0xe0, 0xc5, 0xc9, 0x52, 0xb9, 0xdc, 0xd8, 0xa8, 0xb7, 0x14, + 0xa8, 0xbd, 0x55, 0x02, 0x73, 0xe5, 0xae, 0xe3, 0x85, 0x08, 0x5f, 0x17, 0x21, 0x1c, 0x8a, 0x31, + 0xc7, 0x88, 0x51, 0xfb, 0x5f, 0x39, 0x51, 0x3f, 0x99, 0x40, 0x20, 0x0c, 0xf9, 0x98, 0x5e, 0xea, + 0x8d, 0x42, 0x7e, 0x32, 0xc3, 0xe9, 0x65, 0xdf, 0x24, 0x3e, 0xbb, 0x0c, 0xa6, 0x4a, 0x44, 0x31, + 0xb4, 0x3f, 0xc9, 0x81, 0x62, 0xd9, 0xb1, 0xb7, 0xac, 0x6d, 0x64, 0x41, 0x42, 0xdb, 0xbc, 0xd8, + 0x85, 0x15, 0xd3, 0x37, 0x2f, 0x5b, 0xf0, 0x0a, 0xae, 0xc0, 0xb4, 0xd1, 0x97, 0x8a, 0x98, 0xa2, + 0x29, 0xf0, 0xe2, 0xde, 0x36, 0x66, 0x6a, 0xda, 0x60, 0x93, 0xd0, 0xf8, 0x41, 0x1e, 0xd7, 0x5d, + 0xe8, 0xc2, 0x2e, 0x34, 0x3d, 0x88, 0xe6, 0x62, 0x36, 0xec, 0x62, 0xa5, 0x9d, 0x36, 0xe2, 0x5e, + 0xab, 0x67, 0xc1, 0x1c, 0x79, 0x85, 0xed, 0x1f, 0x0f, 0xab, 0xf1, 0xb4, 0xc1, 0xa5, 0xa9, 0x4f, + 0x00, 0x05, 0xf8, 0xa0, 0xef, 0x9a, 0xa7, 0x3b, 0x18, 0xaf, 0x47, 0x2d, 0x12, 0x47, 0xd9, 0xc5, + 0xc0, 0x51, 0x76, 0xb1, 0x89, 0xdd, 0x68, 0x0d, 0x92, 0x4b, 0xfb, 0x9f, 0xd3, 0xa1, 0xf5, 0xf2, + 0x79, 0x39, 0x52, 0x0c, 0x15, 0xe4, 0x6d, 0x73, 0x17, 0x52, 0xbd, 0xc0, 0xff, 0xd5, 0x5b, 0xc0, + 0x71, 0xf3, 0xb2, 0xe9, 0x9b, 0x6e, 0xcd, 0x69, 0x9b, 0x5d, 0x3c, 0x6c, 0x06, 0x2d, 0xbf, 0xff, + 0x05, 0xde, 0xb4, 0xf2, 0x1d, 0x17, 0xe2, 0x5c, 0xc1, 0xa6, 0x55, 0x90, 0x80, 0xa8, 0x5b, 0x6d, + 0xc7, 0xc6, 0xfc, 0xcb, 0x06, 0xfe, 0x8f, 0xa4, 0xd2, 0xb1, 0x3c, 0x54, 0x11, 0x4c, 0xa5, 0x4e, + 0xf6, 0x53, 0x9a, 0xfb, 0x76, 0x1b, 0x6f, 0x58, 0x4d, 0x1b, 0x71, 0xaf, 0xd5, 0x25, 0x30, 0x4b, + 0x77, 0x5f, 0xd6, 0x90, 0x5e, 0x15, 0xb1, 0x5e, 0x5d, 0xcf, 0xbb, 0x21, 0x12, 0x3c, 0x17, 0xeb, + 0x51, 0x3e, 0x83, 0xfd, 0x48, 0x7d, 0x06, 0x78, 0x34, 0x7d, 0x2c, 0xef, 0x79, 0xbe, 0xb3, 0x4b, + 0x40, 0x5f, 0xb6, 0xba, 0xa4, 0x06, 0x53, 0xb8, 0x06, 0x49, 0x59, 0xd4, 0x3b, 0xc0, 0xc9, 0x9e, + 0x0b, 0xb7, 0xa0, 0x7b, 0xc1, 0xdc, 0xdd, 0x7b, 0xb0, 0xe5, 0x9a, 0xb6, 0xd7, 0x73, 0x5c, 0xff, + 0xf4, 0x34, 0x66, 0x7e, 0xe0, 0x3b, 0xf5, 0x56, 0x70, 0xe2, 0x01, 0xcf, 0xb1, 0x4b, 0x3d, 0xab, + 0x66, 0x79, 0x3e, 0xb4, 0x4b, 0x9d, 0x8e, 0x7b, 0x7a, 0x06, 0x97, 0x75, 0xf0, 0x85, 0x7a, 0x23, + 0x98, 0x7f, 0xc0, 0xb1, 0xec, 0xa6, 0xef, 0x42, 0x73, 0x77, 0xc3, 0xed, 0x9e, 0x06, 0x64, 0x83, + 0x88, 0x4b, 0xa4, 0x9d, 0xef, 0x34, 0x28, 0x12, 0x48, 0xb4, 0x97, 0x14, 0x84, 0xbd, 0x9a, 0xa9, + 0x90, 0x12, 0xad, 0xc5, 0xdb, 0xc1, 0x14, 0xed, 0x35, 0x31, 0xf8, 0xb3, 0x77, 0x9c, 0xea, 0x5b, + 0x20, 0xa1, 0x54, 0x8c, 0x20, 0x9b, 0xfa, 0x24, 0x50, 0x6c, 0x63, 0x51, 0x61, 0x3d, 0x98, 0xbd, + 0xe3, 0xd1, 0x83, 0x0b, 0xc5, 0x59, 0x0c, 0x9a, 0x55, 0xfb, 0xa2, 0x2c, 0xe4, 0x08, 0x9d, 0xc4, + 0x71, 0xba, 0x9e, 0xe2, 0xab, 0xd2, 0x08, 0x5d, 0xf1, 0xad, 0xe0, 0x66, 0xda, 0xcf, 0x52, 0x9b, + 0xa6, 0xb2, 0xb9, 0xb4, 0x11, 0xcc, 0x6a, 0x91, 0xa5, 0xd3, 0x6c, 0x95, 0x8c, 0xd6, 0x66, 0xbd, + 0x51, 0x41, 0xb3, 0xe1, 0x5b, 0xc0, 0x4d, 0x43, 0x72, 0xeb, 0xad, 0xcd, 0x7a, 0x69, 0x4d, 0x57, + 0xb6, 0x78, 0x7b, 0xa9, 0xd9, 0x6a, 0xac, 0x6f, 0x1a, 0x1b, 0xf5, 0x7a, 0xb5, 0xbe, 0x42, 0x88, + 0x21, 0x03, 0xf5, 0x54, 0x94, 0xe1, 0xbc, 0x51, 0x6d, 0xe9, 0x9b, 0xe5, 0x46, 0x7d, 0xb9, 0xba, + 0xa2, 0x58, 0xc3, 0x8c, 0xad, 0x07, 0xd4, 0xeb, 0xc1, 0xb5, 0x1c, 0x27, 0xd5, 0x46, 0x1d, 0x4d, + 0xd1, 0xcb, 0xa5, 0x7a, 0x59, 0x47, 0xf3, 0xf1, 0x4b, 0xaa, 0x06, 0xae, 0x26, 0xe4, 0x36, 0x97, + 0xab, 0x35, 0x76, 0x57, 0xed, 0xd3, 0x39, 0xf5, 0x34, 0xb8, 0x8a, 0x7d, 0x47, 0x7d, 0x22, 0x94, + 0x5f, 0xcf, 0xa9, 0x37, 0x82, 0xeb, 0xb8, 0xaf, 0xc8, 0x06, 0xd9, 0x66, 0xb5, 0xb2, 0xb9, 0x56, + 0x6d, 0xae, 0x95, 0x5a, 0xe5, 0x55, 0xe5, 0x33, 0x78, 0xfa, 0x12, 0xda, 0xe3, 0x8c, 0x77, 0xf2, + 0xcb, 0x58, 0x3b, 0xa1, 0xc4, 0x2b, 0xea, 0xe3, 0x07, 0xc2, 0x9e, 0x6c, 0x17, 0x7f, 0x32, 0x1c, + 0x71, 0x2a, 0x9c, 0x0a, 0xdd, 0x9e, 0x82, 0x56, 0x3a, 0x1d, 0x6a, 0x8d, 0xa0, 0x42, 0xd7, 0x83, + 0x6b, 0xeb, 0x3a, 0x41, 0xca, 0xd0, 0xcb, 0x8d, 0x73, 0xba, 0xb1, 0x79, 0xbe, 0x54, 0xab, 0xe9, + 0xad, 0xcd, 0xe5, 0xaa, 0xd1, 0x6c, 0x29, 0x5b, 0xda, 0x3f, 0x49, 0xe1, 0xb2, 0x14, 0x23, 0xad, + 0x3f, 0x91, 0xd2, 0x36, 0xeb, 0xc4, 0xe5, 0xa7, 0xef, 0x02, 0x45, 0xcf, 0x37, 0xfd, 0x3d, 0x8f, + 0xb6, 0xea, 0xc7, 0x0c, 0x6e, 0xd5, 0x8b, 0x4d, 0x9c, 0xc9, 0xa0, 0x99, 0xb5, 0x2f, 0xe6, 0xd2, + 0x34, 0xd3, 0x31, 0xac, 0x4c, 0x59, 0x23, 0x88, 0xf8, 0x0c, 0xd0, 0x02, 0x6d, 0xaf, 0x36, 0x37, + 0x4b, 0x35, 0x43, 0x2f, 0x55, 0x2e, 0x84, 0xeb, 0x51, 0x50, 0xbd, 0x1a, 0x9c, 0xd8, 0xa8, 0x97, + 0x96, 0x6a, 0x3a, 0x6e, 0x2e, 0x8d, 0x7a, 0x5d, 0x2f, 0x23, 0xb9, 0xff, 0x10, 0xde, 0xfd, 0x41, + 0x56, 0x39, 0xe6, 0x1b, 0x59, 0x4e, 0x8c, 0xfc, 0xff, 0x4a, 0xd8, 0xcd, 0x2d, 0xd2, 0x30, 0x96, + 0xd6, 0x78, 0x71, 0xf8, 0x82, 0x90, 0x67, 0x9b, 0x10, 0x27, 0xe9, 0xf0, 0xf8, 0xfe, 0x11, 0xf0, + 0xb8, 0x1a, 0x9c, 0x60, 0xf1, 0xc0, 0x1e, 0x6e, 0xf1, 0x30, 0xfc, 0xb1, 0x0c, 0xa6, 0xd6, 0xac, + 0x6d, 0xec, 0x5e, 0xbc, 0x17, 0x19, 0x28, 0x0b, 0x40, 0x0a, 0xbd, 0x77, 0x24, 0xab, 0xc3, 0x4d, + 0xe6, 0x25, 0xf1, 0xf5, 0x16, 0xa1, 0x09, 0xfb, 0x17, 0x53, 0xf7, 0x4c, 0x94, 0xe1, 0x98, 0x9e, + 0xe9, 0x85, 0x52, 0x9a, 0x9e, 0x69, 0x30, 0xad, 0x54, 0x30, 0x21, 0xd3, 0xc1, 0x85, 0xcf, 0xde, + 0xb3, 0x5c, 0xd8, 0xc1, 0x66, 0x22, 0xae, 0xb7, 0x6c, 0xf0, 0x89, 0x67, 0xdd, 0xc3, 0x81, 0xc9, + 0x7a, 0xd9, 0xcc, 0x81, 0xe9, 0x70, 0x34, 0xc1, 0x1b, 0x3e, 0xe8, 0xa5, 0x5e, 0x6f, 0x6c, 0xac, + 0xac, 0x6e, 0x2e, 0x1b, 0xba, 0x4e, 0x97, 0x88, 0xb7, 0xb5, 0x77, 0x49, 0x60, 0x9e, 0xd6, 0x90, + 0x7a, 0x4f, 0x5c, 0x17, 0x0b, 0x32, 0x85, 0xe3, 0xdf, 0xd9, 0xe9, 0xc9, 0x0a, 0x0f, 0xc7, 0x13, + 0x93, 0x44, 0x98, 0xe8, 0x3e, 0xf1, 0xa6, 0xb0, 0x09, 0xdd, 0xc7, 0x81, 0xf2, 0x94, 0xd4, 0x14, + 0xb3, 0x9f, 0xa2, 0xbc, 0x04, 0x80, 0x62, 0x13, 0x76, 0x61, 0xdb, 0xd7, 0x3e, 0x24, 0x8f, 0xdc, + 0x26, 0xe2, 0xcc, 0x6d, 0x39, 0x95, 0xb9, 0x9d, 0xcf, 0xc0, 0xdc, 0x2e, 0x8c, 0x6e, 0x6e, 0x17, + 0xd3, 0x9a, 0xdb, 0x53, 0x71, 0xe6, 0x76, 0x42, 0xaf, 0x31, 0x9d, 0xd8, 0x6b, 0xf4, 0x19, 0xea, + 0x46, 0x8d, 0x9a, 0xf4, 0x7c, 0x22, 0x55, 0xe6, 0x4f, 0x14, 0xd3, 0x8e, 0xe3, 0x04, 0xf8, 0xa3, + 0x35, 0xcf, 0x7f, 0xac, 0x90, 0x66, 0xdc, 0x1f, 0xc8, 0x71, 0xba, 0x56, 0xf2, 0xca, 0x7c, 0x06, + 0x8b, 0x8e, 0xea, 0x0d, 0xe0, 0xba, 0xe8, 0x79, 0x53, 0x7f, 0x56, 0xb5, 0xd9, 0x6a, 0x62, 0x9b, + 0xbc, 0xdc, 0x30, 0x8c, 0x8d, 0x75, 0xb2, 0x5d, 0x75, 0x0a, 0xa8, 0x11, 0x15, 0x63, 0xa3, 0x4e, + 0x2c, 0xf0, 0x6d, 0x9e, 0xfa, 0x72, 0xb5, 0x5e, 0xd9, 0x0c, 0x47, 0xb5, 0xfa, 0x72, 0x43, 0xd9, + 0x51, 0x17, 0xc1, 0x2d, 0x0c, 0x75, 0xdc, 0x01, 0x92, 0x12, 0x4a, 0xf5, 0xca, 0xe6, 0x5a, 0x5d, + 0x5f, 0x6b, 0xd4, 0xab, 0x65, 0x9c, 0xde, 0xd4, 0x5b, 0x8a, 0x85, 0x4c, 0xc1, 0x3e, 0x9b, 0xbf, + 0xa9, 0x97, 0x8c, 0xf2, 0xaa, 0x6e, 0x90, 0x22, 0x1f, 0x50, 0x6f, 0x02, 0x67, 0x4b, 0xf5, 0x46, + 0x0b, 0xa5, 0x94, 0xea, 0x17, 0x5a, 0x17, 0xd6, 0xf5, 0xcd, 0x75, 0xa3, 0x51, 0xd6, 0x9b, 0x4d, + 0x34, 0x92, 0xd2, 0x19, 0x82, 0xd2, 0x55, 0x9f, 0x0e, 0xee, 0x62, 0x58, 0xd3, 0x5b, 0xd8, 0x37, + 0x62, 0xad, 0x81, 0xdd, 0xe3, 0x2a, 0xfa, 0xe6, 0x6a, 0xa9, 0xb9, 0x59, 0xad, 0x97, 0x1b, 0x6b, + 0xeb, 0xa5, 0x56, 0x15, 0x0d, 0xb8, 0xeb, 0x46, 0xa3, 0xd5, 0xd8, 0x3c, 0xa7, 0x1b, 0xcd, 0x6a, + 0xa3, 0xae, 0xd8, 0xa8, 0xca, 0xcc, 0x08, 0x1d, 0x58, 0x4a, 0x8e, 0x7a, 0x2d, 0x38, 0x1d, 0xa4, + 0xd7, 0x1a, 0x48, 0xd0, 0xcc, 0x9c, 0xa1, 0xc7, 0xda, 0x59, 0xcd, 0x56, 0xc3, 0x20, 0xb3, 0x86, + 0xb5, 0xea, 0x8a, 0x81, 0xa6, 0x3a, 0xca, 0xb3, 0x33, 0x9d, 0x53, 0xfc, 0x8b, 0x04, 0xf2, 0x4d, + 0xdf, 0xe9, 0x69, 0xdf, 0x19, 0x75, 0x87, 0x67, 0x00, 0x70, 0xb1, 0x2b, 0x44, 0xc5, 0xf4, 0x4d, + 0xba, 0x5a, 0xc3, 0xa4, 0x68, 0xbf, 0x26, 0xbc, 0x7f, 0x1b, 0x59, 0x5d, 0x4e, 0x2f, 0x66, 0xf8, + 0xf8, 0xa6, 0xd8, 0x71, 0xc8, 0x78, 0x42, 0xe9, 0xda, 0xc3, 0x8f, 0x8c, 0xb2, 0x43, 0xab, 0x81, + 0x53, 0x0c, 0xac, 0x48, 0xfe, 0x81, 0xca, 0x40, 0xf5, 0x51, 0xe0, 0xaa, 0x3e, 0xe5, 0xc3, 0x3a, + 0xb7, 0xa5, 0x7e, 0x07, 0x78, 0x0c, 0xa3, 0xfe, 0xfa, 0x5a, 0xe3, 0x9c, 0x1e, 0x2a, 0x7a, 0xa5, + 0xd4, 0x2a, 0x29, 0xdb, 0xda, 0xe7, 0x65, 0x90, 0x5f, 0x73, 0x2e, 0xf7, 0x6f, 0x9b, 0xdb, 0xf0, + 0x0a, 0xb3, 0xb7, 0x12, 0x3c, 0xf2, 0x47, 0xb0, 0x84, 0xc4, 0xbe, 0x16, 0xef, 0x22, 0xf3, 0x05, + 0x29, 0x8d, 0xd8, 0xd7, 0x0e, 0xeb, 0x17, 0xf3, 0x37, 0xa3, 0x88, 0x3d, 0x46, 0xb4, 0x50, 0x3d, + 0x0b, 0xce, 0x44, 0x2f, 0xaa, 0x15, 0xbd, 0xde, 0xaa, 0x2e, 0x5f, 0x88, 0x84, 0x5b, 0x35, 0x84, + 0xc4, 0x3f, 0xac, 0x9b, 0x4b, 0x5e, 0x2b, 0x38, 0x0d, 0x4e, 0x46, 0xef, 0x56, 0xf4, 0x56, 0xf0, + 0xe6, 0x01, 0xed, 0xa1, 0x02, 0x98, 0x23, 0xdd, 0xfe, 0x46, 0xaf, 0x83, 0xac, 0xef, 0x27, 0x45, + 0xe8, 0xde, 0x0c, 0x8e, 0x57, 0xd7, 0x97, 0x9b, 0x4d, 0xdf, 0x71, 0xcd, 0x6d, 0x88, 0xc7, 0x51, + 0x22, 0xad, 0xfe, 0x64, 0xed, 0xbd, 0xc2, 0xab, 0xff, 0xfc, 0x50, 0x43, 0xca, 0x8c, 0x41, 0xfd, + 0x2b, 0x42, 0xab, 0xf5, 0x02, 0x04, 0xd3, 0xa1, 0xff, 0xc0, 0x98, 0xdb, 0x5c, 0x3c, 0x2e, 0x5b, + 0x67, 0x9f, 0x2f, 0x81, 0x99, 0x96, 0xb5, 0x0b, 0x9f, 0xe3, 0xd8, 0xd0, 0x53, 0xa7, 0x80, 0xbc, + 0xb2, 0xd6, 0x52, 0x8e, 0xa1, 0x3f, 0x68, 0x5a, 0x94, 0xc3, 0x7f, 0x74, 0x54, 0x00, 0xfa, 0x53, + 0x6a, 0x29, 0x32, 0xfa, 0xb3, 0xa6, 0xb7, 0x94, 0x3c, 0xfa, 0x53, 0xd7, 0x5b, 0x4a, 0x01, 0xfd, + 0x59, 0xaf, 0xb5, 0x94, 0x22, 0xfa, 0x53, 0x6d, 0xb6, 0x94, 0x29, 0xf4, 0x67, 0xa9, 0xd9, 0x52, + 0xa6, 0xd1, 0x9f, 0x73, 0xcd, 0x96, 0x32, 0x83, 0xfe, 0x94, 0x5b, 0x2d, 0x05, 0xa0, 0x3f, 0xf7, + 0x35, 0x5b, 0xca, 0x2c, 0xfa, 0x53, 0x2a, 0xb7, 0x94, 0x39, 0xfc, 0x47, 0x6f, 0x29, 0xf3, 0xe8, + 0x4f, 0xb3, 0xd9, 0x52, 0x16, 0x30, 0xe5, 0x66, 0x4b, 0x39, 0x8e, 0xcb, 0xaa, 0xb6, 0x14, 0x05, + 0xfd, 0x59, 0x6d, 0xb6, 0x94, 0x13, 0x38, 0x73, 0xb3, 0xa5, 0xa8, 0xb8, 0xd0, 0x66, 0x4b, 0xb9, + 0x0a, 0xe7, 0x69, 0xb6, 0x94, 0x93, 0xb8, 0x88, 0x66, 0x4b, 0xb9, 0x1a, 0xb3, 0xa1, 0xb7, 0x94, + 0x53, 0x38, 0x8f, 0xd1, 0x52, 0x1e, 0x85, 0x5f, 0xd5, 0x5b, 0xca, 0x69, 0xcc, 0x98, 0xde, 0x52, + 0xae, 0xc1, 0x7f, 0x8c, 0x96, 0xa2, 0xe1, 0x57, 0xa5, 0x96, 0xf2, 0x68, 0xed, 0x31, 0x60, 0x66, + 0x05, 0xfa, 0x04, 0x44, 0x4d, 0x01, 0xf2, 0x0a, 0xf4, 0xd9, 0x89, 0xf8, 0xab, 0xf2, 0xe0, 0x51, + 0x74, 0xf1, 0x66, 0xd9, 0x75, 0x76, 0x6b, 0x70, 0xdb, 0x6c, 0xef, 0xeb, 0x0f, 0x22, 0x83, 0x4f, + 0x7b, 0x71, 0x8e, 0x5b, 0xd1, 0xee, 0x45, 0xbd, 0x11, 0xfe, 0x9f, 0x68, 0x20, 0x07, 0x6b, 0xd4, + 0x32, 0xbf, 0x46, 0x1d, 0x67, 0x12, 0xe6, 0x45, 0x26, 0x92, 0xff, 0xc0, 0x36, 0x06, 0x6e, 0x43, + 0x2a, 0xd7, 0xb7, 0x21, 0x85, 0x5a, 0x58, 0x0f, 0xba, 0x9e, 0x63, 0x9b, 0xdd, 0x26, 0x75, 0x3f, + 0x22, 0x73, 0xd5, 0xfe, 0x64, 0xf5, 0x99, 0x41, 0xa3, 0x22, 0x06, 0xdf, 0xd3, 0x92, 0x96, 0xb7, + 0xfa, 0x25, 0x14, 0xd3, 0xbe, 0x3e, 0x13, 0xb6, 0xaf, 0x16, 0xd7, 0xbe, 0x9e, 0x71, 0x08, 0xda, + 0xe9, 0x9a, 0x5a, 0x75, 0xb4, 0xa9, 0x68, 0xe4, 0x9c, 0x1f, 0xec, 0x7f, 0xc9, 0xda, 0xe7, 0x25, + 0x70, 0x4a, 0xb7, 0x07, 0x4d, 0x65, 0x58, 0x35, 0x7a, 0x2b, 0x0b, 0xcd, 0x3a, 0x2f, 0xd2, 0xbb, + 0x06, 0x56, 0x7b, 0x30, 0xcd, 0x18, 0x89, 0xfe, 0x56, 0x28, 0xd1, 0x26, 0x27, 0xd1, 0x7b, 0x47, + 0x27, 0x9d, 0x4e, 0xa0, 0xf5, 0xb1, 0xf6, 0x5d, 0x79, 0xed, 0x2f, 0x24, 0x70, 0x82, 0x78, 0x10, + 0xde, 0x47, 0x66, 0x4e, 0xb8, 0xb7, 0xe7, 0xad, 0xaf, 0x6e, 0x34, 0xcb, 0x22, 0xfa, 0xcd, 0xa4, + 0x68, 0xaf, 0x63, 0x05, 0x7e, 0x3f, 0x2f, 0xf0, 0x98, 0x7e, 0xbc, 0xbf, 0xb8, 0x18, 0x59, 0xff, + 0x7a, 0x28, 0xeb, 0x3a, 0x27, 0xeb, 0xbb, 0x46, 0xa2, 0x7a, 0xb4, 0x62, 0xfe, 0x6a, 0x1e, 0x3c, + 0x86, 0x70, 0x48, 0x15, 0x81, 0xf4, 0x83, 0x25, 0xbb, 0x63, 0x40, 0xcf, 0x37, 0x5d, 0x9f, 0x0b, + 0xbd, 0xd2, 0x37, 0x35, 0xcf, 0x65, 0x30, 0x35, 0x97, 0x86, 0x4e, 0xcd, 0xb5, 0xf7, 0xb0, 0x06, + 0xde, 0x79, 0x1e, 0xd9, 0x52, 0x02, 0x06, 0x31, 0x35, 0x8c, 0x6b, 0x51, 0xa1, 0xe5, 0xf7, 0x3d, + 0x1c, 0xca, 0xcb, 0x87, 0x2e, 0x21, 0x1d, 0xe2, 0xbf, 0x36, 0x5e, 0x4b, 0x3c, 0xcf, 0xbe, 0xe3, + 0xcd, 0x46, 0xa5, 0x93, 0xe9, 0x14, 0xea, 0xa5, 0xd3, 0x60, 0x06, 0x77, 0x39, 0x35, 0xcb, 0xbe, + 0xa4, 0xfd, 0xb9, 0x0c, 0xe6, 0xea, 0xf0, 0x4a, 0x79, 0xc7, 0xec, 0x76, 0xa1, 0xbd, 0x0d, 0xb5, + 0x07, 0x38, 0xdb, 0xde, 0xec, 0xf5, 0xea, 0xd1, 0xfe, 0x70, 0xf0, 0xa8, 0xde, 0x0b, 0x0a, 0x5e, + 0xdb, 0x09, 0x83, 0x3a, 0x7c, 0x67, 0xcc, 0xea, 0x75, 0x69, 0xcf, 0xdf, 0x59, 0xc4, 0x65, 0x95, + 0x7a, 0x56, 0x13, 0x7d, 0x60, 0x90, 0xef, 0xe8, 0x38, 0xf9, 0x57, 0x03, 0x3b, 0xe3, 0x5c, 0x42, + 0x67, 0x1c, 0x32, 0xbe, 0xc8, 0x32, 0x1d, 0xb3, 0x48, 0x72, 0x3d, 0x98, 0x6d, 0x07, 0x59, 0xc2, + 0x53, 0x7a, 0x6c, 0x92, 0xf6, 0x97, 0xa9, 0xba, 0x6b, 0xa1, 0xc2, 0xd3, 0x69, 0x15, 0x1c, 0xb3, + 0xa9, 0x79, 0x35, 0x38, 0xd1, 0x6a, 0x34, 0x36, 0xd7, 0x4a, 0xf5, 0x0b, 0x51, 0x6c, 0x95, 0x2d, + 0xed, 0x95, 0x79, 0xb0, 0xd0, 0x74, 0xba, 0x97, 0x61, 0x84, 0x73, 0x95, 0x73, 0xff, 0x64, 0xe5, + 0x94, 0x3b, 0x20, 0x27, 0xf5, 0x14, 0x28, 0x9a, 0xb6, 0x77, 0x05, 0x06, 0xe6, 0x3f, 0x7d, 0xa2, + 0x30, 0x7e, 0x84, 0xed, 0x08, 0x0c, 0x1e, 0xc6, 0xbb, 0x87, 0x48, 0x92, 0xe7, 0x2a, 0x06, 0xc8, + 0xb3, 0x60, 0xce, 0x23, 0x5e, 0x22, 0x2d, 0xc6, 0x19, 0x88, 0x4b, 0xc3, 0x2c, 0x12, 0x37, 0x25, + 0x99, 0xb2, 0x88, 0x9f, 0xb4, 0x87, 0xc3, 0xfe, 0x63, 0x83, 0x83, 0xb8, 0x74, 0x18, 0xc6, 0xd2, + 0x81, 0xfc, 0xea, 0x71, 0x4f, 0xe2, 0x4f, 0x83, 0x93, 0xc1, 0x09, 0xf5, 0xf2, 0x6a, 0xa9, 0x56, + 0xd3, 0xeb, 0x2b, 0xfa, 0x66, 0xb5, 0x42, 0xf6, 0x93, 0xa3, 0x94, 0x52, 0xab, 0xa5, 0xaf, 0xad, + 0xb7, 0x9a, 0x9b, 0xfa, 0xb3, 0xca, 0xba, 0x5e, 0xc1, 0x0e, 0xd8, 0xf8, 0x04, 0x65, 0xe0, 0x2a, + 0x5f, 0xaa, 0x37, 0xcf, 0xeb, 0x86, 0xb2, 0x73, 0xb6, 0x04, 0x66, 0x99, 0x81, 0x02, 0x71, 0x57, + 0x81, 0x5b, 0xe6, 0x5e, 0x97, 0x9a, 0xe3, 0xca, 0x31, 0xc4, 0x1d, 0x96, 0x4d, 0xc3, 0xee, 0xee, + 0x2b, 0x39, 0x55, 0x01, 0x73, 0xec, 0x98, 0xa0, 0x48, 0xda, 0x3b, 0xaf, 0x05, 0x33, 0xe7, 0x1d, + 0xf7, 0x12, 0xf6, 0x1a, 0xd6, 0x3e, 0x40, 0x62, 0xb0, 0x05, 0x11, 0x25, 0x18, 0x03, 0xec, 0xd5, + 0xe2, 0x6e, 0x62, 0x01, 0xb5, 0xc5, 0xa1, 0x51, 0x23, 0xae, 0x07, 0xb3, 0x57, 0x82, 0xdc, 0x51, + 0x4b, 0x67, 0x92, 0xb4, 0x5f, 0x14, 0x73, 0xfc, 0x1a, 0x5e, 0x64, 0xf6, 0xab, 0xfe, 0x6f, 0x97, + 0x40, 0x71, 0x05, 0xfa, 0xa5, 0x6e, 0x97, 0x95, 0xdb, 0xcb, 0x85, 0xcf, 0x91, 0x72, 0x95, 0x28, + 0x75, 0xbb, 0xf1, 0x8d, 0x8a, 0x11, 0x50, 0x70, 0xde, 0x89, 0x4b, 0x13, 0xf4, 0xd2, 0x1e, 0x52, + 0x60, 0xf6, 0x12, 0xfb, 0x58, 0xe4, 0x9a, 0xfd, 0x7a, 0xc6, 0x4c, 0x7a, 0x62, 0x14, 0x7f, 0x2f, + 0x97, 0xec, 0x24, 0x15, 0xe4, 0x53, 0xef, 0x07, 0x53, 0x7b, 0x1e, 0x2c, 0x9b, 0x5e, 0x30, 0xb4, + 0xf1, 0x35, 0x6d, 0x5c, 0x7c, 0x00, 0xb6, 0xfd, 0xc5, 0xea, 0x2e, 0x9a, 0xf8, 0x6c, 0x90, 0x8c, + 0x61, 0xbc, 0x22, 0xfa, 0x6c, 0x04, 0x14, 0xd0, 0xb4, 0xf3, 0x8a, 0xe5, 0xef, 0x94, 0x77, 0x4c, + 0x9f, 0x6e, 0xb6, 0x84, 0xcf, 0xda, 0x4b, 0x46, 0x80, 0x33, 0xd1, 0x61, 0x27, 0xf6, 0x38, 0x7a, + 0x6a, 0x10, 0xc7, 0xe0, 0x65, 0x33, 0x0a, 0x88, 0x7f, 0x2b, 0x81, 0x7c, 0xa3, 0x07, 0x6d, 0xe1, + 0xb3, 0x97, 0xa1, 0x6c, 0xa5, 0x3e, 0xd9, 0x3e, 0x2c, 0xee, 0x16, 0x1c, 0x56, 0x1a, 0x95, 0x1c, + 0x23, 0xd9, 0xdb, 0x40, 0xde, 0xb2, 0xb7, 0x1c, 0x6a, 0xd9, 0x3e, 0x3a, 0xc6, 0xd6, 0xa9, 0xda, + 0x5b, 0x8e, 0x81, 0x33, 0x8a, 0x7a, 0x04, 0x27, 0x95, 0x9d, 0xbd, 0xb8, 0xff, 0x6e, 0x1a, 0x14, + 0x89, 0x3a, 0x6b, 0x2f, 0x93, 0x81, 0x5c, 0xea, 0x74, 0x62, 0x04, 0x2f, 0x1d, 0x10, 0xbc, 0x83, + 0x3f, 0x0b, 0x31, 0x09, 0x9f, 0xf9, 0xc0, 0x6b, 0x82, 0x7d, 0x3b, 0x6d, 0x52, 0xa5, 0x4e, 0x27, + 0xfe, 0xdc, 0x42, 0x58, 0xa0, 0xc4, 0x17, 0xc8, 0xb6, 0x70, 0x59, 0xac, 0x85, 0xa7, 0x1e, 0x08, + 0x62, 0xf9, 0xcb, 0x1e, 0xa2, 0x7f, 0x90, 0xc0, 0x54, 0xcd, 0xf2, 0x7c, 0x84, 0x4d, 0x49, 0x04, + 0x9b, 0x6b, 0xc1, 0x4c, 0x20, 0x1a, 0xd4, 0xe5, 0xa1, 0xfe, 0x3c, 0x4a, 0xe0, 0x67, 0xe2, 0xf7, + 0xf1, 0xe8, 0x3c, 0x39, 0xb9, 0xf6, 0x94, 0x8b, 0xf8, 0x33, 0x6d, 0x51, 0xb1, 0x52, 0x7f, 0xb1, + 0xbf, 0x14, 0x0a, 0x7c, 0x8d, 0x13, 0xf8, 0x9d, 0xa3, 0x14, 0x99, 0xbd, 0xd0, 0x7f, 0x5f, 0x02, + 0x00, 0x95, 0x4d, 0x0f, 0x0e, 0x3f, 0x8e, 0x0b, 0x07, 0x92, 0x20, 0xdd, 0x57, 0xb2, 0xd2, 0x5d, + 0xe3, 0xa5, 0xfb, 0xdd, 0xc3, 0xab, 0x9a, 0x74, 0x40, 0x58, 0x55, 0x80, 0x6c, 0x85, 0xa2, 0x45, + 0x7f, 0xb5, 0xb7, 0x87, 0x42, 0x5d, 0xe7, 0x84, 0x7a, 0xf7, 0x88, 0x25, 0x65, 0x2f, 0xd7, 0x3f, + 0x92, 0xc0, 0x54, 0x13, 0xfa, 0xa8, 0x9b, 0xd4, 0xce, 0x89, 0xf4, 0xf0, 0x4c, 0xdb, 0x96, 0x04, + 0xdb, 0xf6, 0x37, 0x72, 0xa2, 0x81, 0xe1, 0x22, 0xc9, 0x50, 0x9e, 0x62, 0x56, 0x1f, 0x5e, 0x2f, + 0x14, 0x18, 0x6e, 0x18, 0xb5, 0xec, 0xa5, 0xfb, 0x56, 0x29, 0xf4, 0x14, 0xe1, 0xcf, 0xf5, 0xb1, + 0x66, 0x71, 0xee, 0xa0, 0x59, 0x2c, 0x7e, 0xae, 0x8f, 0xad, 0x63, 0xbc, 0x63, 0x42, 0x6a, 0x63, + 0x63, 0x0c, 0x3e, 0x03, 0xa3, 0xc8, 0xeb, 0x79, 0x32, 0x28, 0xd2, 0xcd, 0x83, 0x7b, 0x93, 0xf7, + 0x0e, 0x86, 0x4f, 0x2d, 0xde, 0x3f, 0x82, 0x29, 0x97, 0xb4, 0x2c, 0x1f, 0xb2, 0x21, 0x31, 0x6c, + 0xdc, 0x0a, 0x0a, 0x38, 0x6a, 0x36, 0x1d, 0xe7, 0x22, 0x77, 0x8f, 0x80, 0x84, 0x8e, 0xde, 0x1a, + 0x24, 0x53, 0x6a, 0x14, 0xc6, 0xb0, 0x92, 0x3f, 0x0a, 0x0a, 0x5f, 0x55, 0x01, 0x58, 0xdf, 0xbb, + 0xd8, 0xb5, 0xbc, 0x1d, 0xcb, 0xc6, 0x3e, 0x62, 0x73, 0xf4, 0x91, 0x04, 0x7f, 0x4e, 0x34, 0xff, + 0x62, 0x8d, 0x02, 0x05, 0xc8, 0x7b, 0xae, 0x45, 0x97, 0x01, 0xd0, 0x5f, 0xf5, 0x9e, 0xd0, 0xdb, + 0x32, 0xdf, 0x17, 0xb8, 0x05, 0x89, 0x21, 0xe2, 0x60, 0x91, 0x29, 0x3d, 0xf2, 0xba, 0x64, 0x23, + 0x7c, 0x17, 0xf8, 0x08, 0xdf, 0xdc, 0x69, 0xee, 0x62, 0xdf, 0x69, 0x6e, 0x84, 0xa3, 0x67, 0x3d, + 0x07, 0x62, 0xd7, 0x23, 0xd9, 0xc0, 0xff, 0xd1, 0x17, 0xd8, 0x3d, 0x08, 0x7b, 0xe7, 0x91, 0x33, + 0x03, 0x51, 0x02, 0xdb, 0xe7, 0xcd, 0x08, 0xf6, 0x79, 0x1f, 0x8d, 0xe6, 0x3e, 0x8e, 0xa0, 0xe1, + 0x9c, 0x42, 0x72, 0x1c, 0xbb, 0xf9, 0x3e, 0x76, 0xb5, 0x4f, 0x08, 0x07, 0xe2, 0x64, 0x64, 0x9c, + 0x38, 0x8b, 0xa1, 0x1c, 0x48, 0x21, 0x07, 0xcc, 0x1e, 0x70, 0x52, 0x0f, 0x3c, 0x8c, 0x7e, 0x3a, + 0x5d, 0xde, 0x1d, 0x61, 0xbd, 0x46, 0x05, 0x0b, 0xc1, 0xb1, 0xf8, 0xc6, 0xd2, 0x7d, 0x7a, 0xb9, + 0xa5, 0xc0, 0x83, 0x47, 0xe5, 0xf1, 0xa1, 0x78, 0x72, 0x00, 0x3e, 0x5a, 0x93, 0xd1, 0xfe, 0x87, + 0x04, 0x8a, 0xd4, 0xdc, 0xb8, 0xf7, 0x90, 0x10, 0x6a, 0xaf, 0x1a, 0x05, 0x92, 0xc4, 0xe8, 0x24, + 0x9f, 0x4d, 0x0b, 0xc0, 0x18, 0x0c, 0x8c, 0x0b, 0x99, 0x01, 0xa0, 0xfd, 0xb3, 0x04, 0xf2, 0xc8, + 0x0c, 0x12, 0x8b, 0xfd, 0xf0, 0x19, 0x61, 0x97, 0x60, 0x46, 0x00, 0x88, 0x7c, 0x8c, 0x7e, 0x2f, + 0x81, 0x99, 0x1e, 0xc9, 0x18, 0x46, 0x1e, 0xb9, 0x51, 0xa0, 0x33, 0x82, 0x46, 0xf4, 0x99, 0xf6, + 0x3e, 0xa1, 0x03, 0x0f, 0xc9, 0xfc, 0xa4, 0x83, 0x43, 0x1f, 0x47, 0x98, 0x88, 0x2d, 0xed, 0x5f, + 0x25, 0x00, 0x0c, 0xe8, 0x39, 0xdd, 0xcb, 0x70, 0xc3, 0xb5, 0xb4, 0x47, 0x47, 0x00, 0xd0, 0x66, + 0x9f, 0x8b, 0x9a, 0xfd, 0xe7, 0x24, 0x51, 0xe7, 0x5f, 0x4e, 0xf3, 0x02, 0xe2, 0x31, 0xe2, 0x7f, + 0x3a, 0x98, 0xa2, 0x72, 0xa4, 0x36, 0xa5, 0x98, 0xf0, 0x83, 0x8f, 0xb4, 0x0f, 0x0a, 0x39, 0x0f, + 0x8b, 0x70, 0x94, 0x0e, 0x80, 0xf2, 0x08, 0x00, 0x1c, 0x07, 0xb3, 0x01, 0x00, 0x1b, 0x46, 0x55, + 0x81, 0xda, 0xbb, 0x65, 0xec, 0x61, 0x41, 0x06, 0xb7, 0xc3, 0xf7, 0x34, 0x7f, 0x21, 0x3c, 0xd9, + 0x67, 0xe4, 0x11, 0x96, 0x9f, 0x11, 0x40, 0xbf, 0x2d, 0x34, 0xbb, 0x17, 0x60, 0xe8, 0x91, 0xd2, + 0x5f, 0x9d, 0xd5, 0xc1, 0x3c, 0x67, 0x95, 0xa8, 0xa7, 0xc1, 0x49, 0x2e, 0x81, 0x8c, 0x77, 0x1d, + 0xe5, 0x98, 0xaa, 0x81, 0x53, 0xdc, 0x1b, 0xfa, 0x00, 0x3b, 0x4a, 0x4e, 0x7b, 0xf8, 0x0b, 0xb9, + 0x70, 0xbd, 0xe7, 0xfd, 0x79, 0xba, 0xd2, 0xf6, 0x29, 0x3e, 0xd8, 0x65, 0xdb, 0xb1, 0x7d, 0xf8, + 0x20, 0xe3, 0xa6, 0x12, 0x26, 0x24, 0x5a, 0x0d, 0xa7, 0xc1, 0x94, 0xef, 0xb2, 0xae, 0x2b, 0xc1, + 0x23, 0xab, 0x58, 0x05, 0x5e, 0xb1, 0xea, 0xe0, 0xac, 0x65, 0xb7, 0xbb, 0x7b, 0x1d, 0x68, 0xc0, + 0xae, 0x89, 0x64, 0xe8, 0x95, 0xbc, 0x0a, 0xec, 0x41, 0xbb, 0x03, 0x6d, 0x9f, 0xf0, 0x19, 0x9c, + 0x7b, 0x15, 0xc8, 0xc9, 0x2b, 0xe3, 0x3d, 0xbc, 0x32, 0x3e, 0x6e, 0xd0, 0x12, 0x6e, 0xc2, 0x7a, + 0xdf, 0x9d, 0x00, 0x90, 0xba, 0x9d, 0xb3, 0xe0, 0x15, 0xaa, 0x86, 0xd7, 0xf4, 0xad, 0xfa, 0x35, + 0xc2, 0x0c, 0x06, 0x93, 0x59, 0xfb, 0x72, 0xa8, 0x7e, 0xcf, 0xe0, 0xd4, 0xef, 0x56, 0x41, 0x16, + 0xd2, 0x69, 0x5d, 0x6f, 0x04, 0xad, 0x9b, 0x07, 0x33, 0xd1, 0x6e, 0xb2, 0xac, 0x5e, 0x03, 0xae, + 0x0e, 0x3c, 0x8c, 0xeb, 0xba, 0x5e, 0x69, 0x6e, 0x6e, 0xac, 0xaf, 0x18, 0xa5, 0x8a, 0xae, 0x00, + 0xa4, 0x9f, 0x44, 0x2f, 0x43, 0xc7, 0xe0, 0xbc, 0xf6, 0x07, 0x12, 0x28, 0xe0, 0x43, 0xdb, 0xda, + 0xf7, 0x8d, 0x49, 0x73, 0x3c, 0xce, 0xe9, 0x29, 0x1c, 0x77, 0xc5, 0xaf, 0x30, 0xa1, 0xc2, 0xc4, + 0x5c, 0x1d, 0xea, 0x0a, 0x93, 0x04, 0x42, 0xd9, 0xcf, 0x84, 0x50, 0x93, 0x6c, 0xee, 0x38, 0x57, + 0xfe, 0x33, 0x37, 0x49, 0x54, 0xff, 0x23, 0x6e, 0x92, 0x03, 0x58, 0x98, 0x78, 0x93, 0x1c, 0xd0, + 0xee, 0x12, 0x9a, 0xa9, 0xf6, 0x91, 0x42, 0x38, 0xff, 0xfb, 0xa4, 0x74, 0xa8, 0xbd, 0xaf, 0x12, + 0x98, 0xb7, 0x6c, 0x1f, 0xba, 0xb6, 0xd9, 0x5d, 0xee, 0x9a, 0xdb, 0x81, 0x7d, 0xda, 0xbf, 0xe1, + 0x51, 0x65, 0xf2, 0x18, 0xfc, 0x17, 0xea, 0x19, 0x00, 0x7c, 0xb8, 0xdb, 0xeb, 0x9a, 0x7e, 0xa4, + 0x7a, 0x4c, 0x0a, 0xab, 0x7d, 0x79, 0x5e, 0xfb, 0x6e, 0x07, 0x57, 0x11, 0xd0, 0x5a, 0xfb, 0x3d, + 0xb8, 0x61, 0x5b, 0xcf, 0xde, 0xc3, 0xb1, 0x91, 0x89, 0x8e, 0x0e, 0x7a, 0xc5, 0xed, 0x00, 0x15, + 0xf9, 0x1d, 0x20, 0xf5, 0x6e, 0x70, 0x0d, 0x0e, 0x7b, 0x8d, 0xef, 0x08, 0x39, 0x6f, 0x75, 0xb6, + 0xa1, 0x5f, 0xdd, 0x5a, 0xb3, 0x3c, 0xcf, 0xb2, 0xb7, 0xf1, 0x74, 0x7c, 0xda, 0x88, 0xcf, 0xa0, + 0xfd, 0xad, 0x70, 0xdc, 0xa5, 0xa0, 0xcf, 0x18, 0x12, 0x77, 0x29, 0x6c, 0xa7, 0x72, 0x5f, 0x3b, + 0x0d, 0x57, 0x75, 0xf2, 0x02, 0xab, 0x3a, 0x2c, 0xa6, 0x05, 0xc1, 0xd5, 0x81, 0xd7, 0x0a, 0x05, + 0x76, 0x4a, 0xaa, 0x46, 0xf6, 0x7d, 0xdf, 0xd7, 0x65, 0xb0, 0x40, 0x8a, 0x5e, 0x72, 0x9c, 0x4b, + 0xbb, 0xa6, 0x7b, 0x49, 0xfb, 0x89, 0xc3, 0xed, 0xe2, 0x26, 0xee, 0x5e, 0xc5, 0x6d, 0xc9, 0xf6, + 0x29, 0x6f, 0xbe, 0x5f, 0x79, 0xb5, 0xdf, 0x12, 0x9e, 0x92, 0x70, 0xf2, 0x0c, 0x2a, 0x35, 0x99, + 0xed, 0x2d, 0xb1, 0xe3, 0x8d, 0x22, 0x0c, 0x66, 0x0f, 0xfc, 0x6f, 0x84, 0xc0, 0x07, 0xe3, 0x08, + 0xbb, 0x33, 0x30, 0x4e, 0xdc, 0xb5, 0xaf, 0x8c, 0x86, 0x5d, 0xc0, 0xd7, 0x08, 0xd8, 0x29, 0x40, + 0xbe, 0x14, 0x3a, 0x23, 0xa1, 0xbf, 0x6c, 0x85, 0xf2, 0xd9, 0xa1, 0x19, 0xc3, 0xf2, 0x44, 0xd0, + 0x3c, 0xc9, 0xb3, 0xd0, 0xe8, 0x65, 0x8a, 0xe9, 0x97, 0x84, 0x77, 0xdc, 0x06, 0x0a, 0x88, 0x70, + 0x37, 0x99, 0x56, 0x29, 0xb6, 0x5d, 0x27, 0xce, 0x66, 0xf6, 0x68, 0xbe, 0xb8, 0x00, 0x66, 0x82, + 0xf8, 0x57, 0xf8, 0x46, 0xc1, 0x10, 0xc3, 0x53, 0xa0, 0xe8, 0x39, 0x7b, 0x6e, 0x1b, 0xd2, 0x3d, + 0x50, 0xfa, 0x34, 0xc2, 0x7e, 0xdd, 0x50, 0x73, 0xe1, 0x80, 0x45, 0x92, 0x4f, 0x6d, 0x91, 0xc4, + 0xdb, 0xbb, 0x09, 0xf6, 0x83, 0xf6, 0x12, 0xe1, 0x6b, 0x3f, 0x38, 0xcc, 0x9a, 0xd0, 0x7f, 0x24, + 0x1a, 0x01, 0xbf, 0x2a, 0xb4, 0x1b, 0x34, 0xa4, 0x26, 0xe9, 0x54, 0xae, 0x31, 0x82, 0x1d, 0xfc, + 0x68, 0xf0, 0xa8, 0x20, 0x07, 0x35, 0x80, 0xb1, 0xc1, 0xbb, 0x61, 0xd4, 0x14, 0x59, 0x7b, 0x5e, + 0x1e, 0x28, 0x84, 0xb5, 0x46, 0x68, 0x0b, 0x6a, 0x2f, 0xcf, 0x1d, 0xb5, 0xc1, 0x1b, 0x3f, 0x83, + 0xfd, 0x5d, 0x49, 0x34, 0x58, 0x38, 0x27, 0xf8, 0xa8, 0x76, 0x31, 0x9a, 0x34, 0x42, 0x33, 0x4b, + 0x50, 0x3e, 0xed, 0x2d, 0x39, 0x91, 0xd8, 0xe3, 0x62, 0x2c, 0x66, 0xdf, 0x2b, 0x7d, 0x23, 0x1f, + 0x84, 0x31, 0x5c, 0x76, 0x9d, 0xdd, 0x0d, 0xb7, 0xab, 0xfd, 0x9b, 0xd0, 0xd5, 0x0e, 0x31, 0xb3, + 0x0b, 0x29, 0x7e, 0x76, 0x81, 0x57, 0xa4, 0xbb, 0xd1, 0x56, 0x58, 0x77, 0x84, 0xe1, 0x5b, 0xbd, + 0x09, 0x2c, 0x98, 0x9d, 0xce, 0xba, 0xb9, 0x0d, 0xcb, 0x68, 0xda, 0x6e, 0xfb, 0x34, 0xc4, 0x59, + 0x5f, 0x6a, 0xe2, 0x54, 0x86, 0xef, 0x23, 0xa7, 0x0e, 0x58, 0xa5, 0xe2, 0xcb, 0xb0, 0x1c, 0x88, + 0x54, 0x7e, 0x13, 0x19, 0xfe, 0xd0, 0x90, 0xd1, 0xde, 0x31, 0xa3, 0x80, 0x8c, 0xf4, 0x49, 0xd0, + 0x17, 0x4b, 0x80, 0xef, 0xec, 0x35, 0xef, 0x57, 0x24, 0x30, 0x85, 0xf0, 0x28, 0x75, 0x3a, 0xda, + 0x63, 0xb9, 0xb8, 0xa5, 0xb1, 0xde, 0x70, 0x2f, 0x14, 0x76, 0x43, 0x0c, 0x6a, 0x48, 0xe8, 0xc7, + 0x60, 0x12, 0x09, 0x51, 0xe2, 0x84, 0x28, 0xe6, 0x6d, 0x98, 0x58, 0x44, 0xf6, 0xe2, 0xfb, 0x8c, + 0x04, 0xe6, 0x83, 0x79, 0xc6, 0x32, 0xf4, 0xdb, 0x3b, 0xda, 0x9d, 0xa2, 0xeb, 0x5c, 0xb4, 0x25, + 0x86, 0x5b, 0xc2, 0x5d, 0xed, 0x5b, 0xb9, 0x94, 0x2a, 0xcf, 0x95, 0x1c, 0xb3, 0x48, 0x98, 0x4a, + 0x17, 0x93, 0x08, 0x66, 0x2f, 0xcc, 0x2f, 0x4b, 0x00, 0xb4, 0x9c, 0x70, 0xb2, 0x7c, 0x08, 0x49, + 0xfe, 0xa4, 0xf0, 0x6e, 0x31, 0xad, 0x78, 0x54, 0x6c, 0xfa, 0x9e, 0x43, 0xd0, 0x99, 0x6a, 0x58, + 0x49, 0x13, 0x69, 0xeb, 0x33, 0x95, 0xbd, 0x5e, 0xd7, 0x6a, 0x9b, 0x7e, 0xbf, 0x07, 0x60, 0xbc, + 0x78, 0xf1, 0x75, 0xdc, 0xa9, 0x8c, 0xc6, 0xb0, 0x8c, 0x18, 0x59, 0x92, 0x38, 0x3f, 0x52, 0x10, + 0xe7, 0x47, 0xd0, 0xab, 0x67, 0x08, 0xf1, 0x09, 0xa8, 0xa7, 0x0c, 0x8e, 0x37, 0x7a, 0xd0, 0x5e, + 0x72, 0xa1, 0xd9, 0x69, 0xbb, 0x7b, 0xbb, 0x17, 0x3d, 0xd6, 0x7d, 0x35, 0x59, 0x47, 0x99, 0x95, + 0x6b, 0x89, 0x5b, 0xb9, 0xd6, 0x7e, 0x58, 0x16, 0x8d, 0xc4, 0xc6, 0xec, 0xaf, 0x30, 0x3c, 0x8c, + 0x30, 0xd4, 0xa5, 0x72, 0xba, 0xea, 0x5b, 0xa4, 0xce, 0xa7, 0x59, 0xa4, 0x7e, 0xb3, 0x50, 0x5c, + 0x37, 0xa1, 0x7a, 0x4d, 0xc4, 0x77, 0x6e, 0xa1, 0x09, 0xfd, 0x18, 0x78, 0x6f, 0x04, 0xf3, 0x17, + 0xa3, 0x37, 0x21, 0xc4, 0x7c, 0xe2, 0x00, 0x8f, 0xd6, 0xb7, 0xa6, 0x5d, 0xa1, 0xe1, 0x59, 0x88, + 0x41, 0x37, 0x44, 0x50, 0x12, 0x71, 0x9b, 0x4b, 0xb5, 0xdc, 0x92, 0x58, 0x7e, 0xf6, 0x28, 0x7c, + 0x42, 0x02, 0xb3, 0xf8, 0x92, 0xf1, 0xa5, 0x7d, 0x7c, 0x90, 0x53, 0xd0, 0x28, 0x79, 0x31, 0x2b, + 0x66, 0x15, 0xe4, 0xbb, 0x96, 0x7d, 0x29, 0xf0, 0x77, 0x44, 0xff, 0xa3, 0x2b, 0x4a, 0xa5, 0x01, + 0x57, 0x94, 0x86, 0xdb, 0x24, 0x61, 0xb9, 0x31, 0xa3, 0xe9, 0x1b, 0x72, 0x22, 0x57, 0x94, 0x0e, + 0x25, 0x97, 0xbd, 0x18, 0xff, 0x3a, 0x0f, 0x8a, 0x4d, 0x68, 0xba, 0xed, 0x1d, 0xed, 0xfd, 0xd2, + 0xc0, 0xa9, 0xc4, 0x34, 0x3f, 0x95, 0x58, 0x06, 0x53, 0x5b, 0x56, 0xd7, 0x87, 0x2e, 0xf1, 0x01, + 0x67, 0xbb, 0x76, 0xd2, 0xc4, 0x97, 0xba, 0x4e, 0xfb, 0xd2, 0x22, 0x35, 0xed, 0x17, 0x83, 0x78, + 0xd1, 0x8b, 0xcb, 0xf8, 0x23, 0x23, 0xf8, 0x18, 0x19, 0x84, 0x9e, 0xe3, 0xfa, 0x71, 0xf7, 0x0f, + 0xc5, 0x50, 0x69, 0x3a, 0xae, 0x6f, 0x90, 0x0f, 0x11, 0xcc, 0x5b, 0x7b, 0xdd, 0x6e, 0x0b, 0x3e, + 0xe8, 0x07, 0xd3, 0xba, 0xe0, 0x19, 0x19, 0x8b, 0xce, 0xd6, 0x96, 0x07, 0xc9, 0xa2, 0x42, 0xc1, + 0xa0, 0x4f, 0xea, 0x49, 0x50, 0xe8, 0x5a, 0xbb, 0x16, 0x99, 0x88, 0x14, 0x0c, 0xf2, 0xa0, 0xde, + 0x02, 0x94, 0x68, 0x0e, 0x44, 0x18, 0x3d, 0x5d, 0xc4, 0x4d, 0xf3, 0x40, 0x3a, 0xd2, 0x99, 0x4b, + 0x70, 0xdf, 0x3b, 0x3d, 0x85, 0xdf, 0xe3, 0xff, 0xfc, 0x81, 0x1b, 0x91, 0x0d, 0x13, 0x22, 0xf1, + 0xf8, 0x19, 0xae, 0x0b, 0xdb, 0x8e, 0xdb, 0x09, 0x64, 0x13, 0x3f, 0xc1, 0xa0, 0xf9, 0xd2, 0x6d, + 0x73, 0x0c, 0x2c, 0x3c, 0x7b, 0x4d, 0x7b, 0x4f, 0x11, 0x75, 0x9b, 0xa8, 0xe8, 0xf3, 0x96, 0xbf, + 0xb3, 0x06, 0x7d, 0x53, 0xfb, 0x6b, 0x79, 0xa0, 0xc6, 0xcd, 0xfe, 0x6f, 0x8d, 0x1b, 0xa2, 0x71, + 0x24, 0xe6, 0x97, 0xbf, 0xe7, 0xda, 0x48, 0x8e, 0xd4, 0x8f, 0x96, 0x49, 0x51, 0xef, 0x06, 0xd7, + 0x44, 0x4f, 0xc1, 0x52, 0x6a, 0x85, 0x71, 0xad, 0x9d, 0x36, 0xe2, 0x33, 0xa8, 0xeb, 0xe0, 0x06, + 0xf2, 0x72, 0xb5, 0xb5, 0x56, 0x5b, 0xb5, 0xb6, 0x77, 0xba, 0xd6, 0xf6, 0x8e, 0xef, 0x55, 0x6d, + 0xcf, 0x87, 0x66, 0xa7, 0xb1, 0x65, 0x90, 0x9b, 0xc3, 0x00, 0xa6, 0x23, 0x92, 0x95, 0xf7, 0x11, + 0x17, 0x1b, 0xdd, 0x58, 0x4d, 0x89, 0x69, 0x29, 0x4f, 0x41, 0x2d, 0xc5, 0xdb, 0xeb, 0x86, 0x98, + 0x5e, 0xdb, 0x87, 0x69, 0xa4, 0xea, 0x7b, 0x5d, 0xdc, 0x5c, 0x70, 0xe6, 0xb4, 0xe3, 0x5c, 0x02, + 0x27, 0xd9, 0x37, 0x9b, 0x7f, 0x2b, 0x82, 0xc2, 0x8a, 0x6b, 0xf6, 0x76, 0xb4, 0xe7, 0x31, 0xfd, + 0xf3, 0xb8, 0xda, 0x44, 0xa8, 0x9d, 0xd2, 0x30, 0xed, 0x94, 0x87, 0x68, 0x67, 0x9e, 0xd1, 0xce, + 0xf8, 0x45, 0xe7, 0xb3, 0x60, 0xae, 0xed, 0x74, 0xbb, 0xb0, 0x8d, 0xe4, 0x51, 0xed, 0xe0, 0xd5, + 0x9e, 0x19, 0x83, 0x4b, 0xc3, 0x31, 0xf5, 0xa1, 0xdf, 0x24, 0x6b, 0xec, 0x44, 0xe9, 0xa3, 0x04, + 0xed, 0xe5, 0x12, 0xc8, 0xeb, 0x9d, 0x6d, 0xc8, 0xad, 0xc3, 0xe7, 0x98, 0x75, 0xf8, 0x53, 0xa0, + 0xe8, 0x9b, 0xee, 0x36, 0xf4, 0x83, 0x75, 0x02, 0xf2, 0x14, 0x86, 0xfa, 0x97, 0x99, 0x50, 0xff, + 0xdf, 0x0d, 0xf2, 0x48, 0x66, 0xd4, 0x2d, 0xfe, 0x86, 0x41, 0xf0, 0x63, 0xd9, 0x2f, 0xa2, 0x12, + 0x17, 0x51, 0xad, 0x0d, 0xfc, 0x41, 0x3f, 0xd6, 0x85, 0x83, 0xa1, 0x68, 0xaf, 0x05, 0x33, 0x56, + 0xdb, 0xb1, 0xab, 0xbb, 0xe6, 0x36, 0xa4, 0xd5, 0x8c, 0x12, 0x82, 0xb7, 0xfa, 0xae, 0xf3, 0x80, + 0x45, 0x17, 0xb5, 0xa2, 0x04, 0x54, 0x85, 0x1d, 0xab, 0xd3, 0x81, 0x36, 0x6d, 0xd9, 0xf4, 0xe9, + 0xec, 0x19, 0x90, 0x47, 0x3c, 0x20, 0xfd, 0x41, 0xc6, 0x82, 0x72, 0x4c, 0x9d, 0x43, 0xcd, 0x8a, + 0x34, 0x5e, 0x25, 0xc7, 0xaf, 0xb9, 0x8a, 0x78, 0x0d, 0x91, 0xca, 0x0d, 0x6e, 0x5c, 0x4f, 0x00, + 0x05, 0xdb, 0xe9, 0xc0, 0xa1, 0x83, 0x10, 0xc9, 0xa5, 0x3e, 0x19, 0x14, 0x60, 0x07, 0xf5, 0x0a, + 0x32, 0xce, 0x7e, 0x26, 0x59, 0x96, 0x06, 0xc9, 0x9c, 0xce, 0x35, 0x69, 0x10, 0xb7, 0xd9, 0x37, + 0xc0, 0x1f, 0x9d, 0x02, 0xc7, 0x49, 0x1f, 0xd0, 0xdc, 0xbb, 0x88, 0x48, 0x5d, 0x84, 0xda, 0xeb, + 0x07, 0x0f, 0x5c, 0xc7, 0x79, 0x65, 0x3f, 0x09, 0x0a, 0xde, 0xde, 0xc5, 0xd0, 0x08, 0x25, 0x0f, + 0x6c, 0xd3, 0x95, 0xc6, 0x32, 0x9c, 0xc9, 0xa3, 0x0e, 0x67, 0xdc, 0xd0, 0x24, 0x07, 0x8d, 0x3f, + 0x1a, 0xc8, 0xc8, 0x81, 0x8e, 0x60, 0x20, 0x1b, 0x34, 0x0c, 0x9d, 0x06, 0x53, 0xe6, 0x96, 0x0f, + 0xdd, 0xc8, 0x4c, 0xa4, 0x8f, 0x68, 0xa8, 0xbc, 0x08, 0xb7, 0x1c, 0x17, 0x89, 0x85, 0x84, 0x85, + 0x0d, 0x9f, 0x99, 0x96, 0x0b, 0xb8, 0x1d, 0xb4, 0x5b, 0xc1, 0x09, 0xdb, 0xa9, 0xc0, 0x1e, 0x95, + 0x33, 0x41, 0x71, 0x9e, 0xdc, 0xce, 0x7e, 0xe0, 0xc5, 0x81, 0xae, 0x64, 0xe1, 0x60, 0x57, 0xa2, + 0x7d, 0x2e, 0xed, 0x9c, 0xb9, 0x0f, 0xe8, 0xb1, 0x59, 0x68, 0xea, 0xd3, 0xc0, 0x5c, 0x87, 0x7a, + 0x88, 0xb5, 0xad, 0xb0, 0x95, 0xc4, 0x7e, 0xc7, 0x65, 0x8e, 0x14, 0x29, 0xcf, 0x2a, 0xd2, 0x0a, + 0x98, 0xc6, 0x47, 0xaf, 0x91, 0x26, 0x15, 0xfa, 0x3c, 0xf2, 0xf1, 0xb4, 0x2e, 0xac, 0x14, 0x23, + 0xb6, 0xc5, 0x32, 0xfd, 0xc4, 0x08, 0x3f, 0x4e, 0x37, 0xfb, 0x4e, 0x96, 0x50, 0xf6, 0xcd, 0xf1, + 0x97, 0x8a, 0xe0, 0x9a, 0xb2, 0xeb, 0x78, 0x1e, 0x3e, 0x82, 0xd3, 0xdf, 0x30, 0xdf, 0x28, 0x71, + 0x97, 0xfe, 0x3c, 0xa2, 0x9b, 0xdf, 0xa0, 0x06, 0x35, 0xb9, 0xa6, 0xf1, 0x17, 0xc2, 0x41, 0x6b, + 0xc2, 0xfd, 0x87, 0x18, 0xa1, 0xff, 0xe7, 0x68, 0x24, 0xef, 0xc9, 0x89, 0xc4, 0xd1, 0x49, 0x29, + 0xab, 0xec, 0x9b, 0xcb, 0x97, 0x24, 0xf0, 0xe8, 0x7e, 0x6e, 0x36, 0x6c, 0x2f, 0x6c, 0x30, 0xd7, + 0x0d, 0x69, 0x2f, 0x7c, 0xdc, 0x95, 0xc4, 0x3b, 0x7e, 0x63, 0xea, 0xce, 0x94, 0x16, 0xb3, 0x58, + 0x12, 0x1d, 0xe8, 0x49, 0xba, 0xe3, 0x37, 0x35, 0xf9, 0xec, 0x85, 0xfb, 0xbb, 0x79, 0x70, 0x7c, + 0xc5, 0x75, 0xf6, 0x7a, 0x5e, 0xd4, 0x03, 0xfd, 0xc9, 0xe0, 0x0d, 0xd9, 0xa2, 0x88, 0x69, 0x70, + 0x3d, 0x98, 0x75, 0xa9, 0x35, 0x17, 0x6d, 0xcf, 0xb2, 0x49, 0x6c, 0xef, 0x25, 0x1f, 0xa6, 0xf7, + 0x8a, 0xfa, 0x99, 0x3c, 0xd7, 0xcf, 0xf4, 0xf7, 0x1c, 0x85, 0x01, 0x3d, 0xc7, 0x1f, 0x4b, 0x29, + 0x07, 0xd5, 0x3e, 0x11, 0xc5, 0xf4, 0x17, 0x65, 0x50, 0xdc, 0xc6, 0x19, 0x69, 0x77, 0xf1, 0x78, + 0xb1, 0x9a, 0x61, 0xe2, 0x06, 0xfd, 0x34, 0x92, 0xab, 0xcc, 0xea, 0x70, 0xaa, 0x01, 0x2e, 0x99, + 0xdb, 0xec, 0x95, 0xea, 0xe1, 0x3c, 0x98, 0x0b, 0x4b, 0xaf, 0x76, 0x3c, 0x2e, 0xba, 0x2b, 0xa3, + 0x51, 0xf3, 0x22, 0x1a, 0x75, 0x60, 0x9d, 0x39, 0x1c, 0x75, 0x64, 0x66, 0xd4, 0x19, 0x38, 0xba, + 0xcc, 0xc5, 0x8c, 0x2e, 0xda, 0x73, 0x65, 0xd1, 0x6b, 0xf3, 0xf8, 0xae, 0x15, 0xd7, 0xe6, 0x91, + 0x3c, 0x58, 0x08, 0x5e, 0xde, 0x37, 0xbc, 0x56, 0xd9, 0x2b, 0xc9, 0x87, 0x25, 0x70, 0xe2, 0x60, + 0x67, 0xfe, 0x1d, 0xbc, 0x97, 0x1a, 0xaa, 0x93, 0x17, 0x7a, 0xa9, 0xe1, 0x27, 0x7e, 0x93, 0x2e, + 0x31, 0x08, 0x0a, 0x67, 0xef, 0x0d, 0xef, 0xc4, 0xc5, 0xc2, 0x9c, 0x08, 0x12, 0xcd, 0x5e, 0x80, + 0x3f, 0x25, 0x83, 0x99, 0x26, 0xf4, 0x6b, 0xe6, 0xbe, 0xb3, 0xe7, 0x6b, 0xa6, 0xe8, 0xf6, 0xdc, + 0x53, 0x41, 0xb1, 0x8b, 0x3f, 0xc1, 0x1d, 0x0c, 0x1b, 0x74, 0x94, 0xdd, 0xdf, 0xc2, 0xbe, 0x41, + 0x84, 0xb4, 0x41, 0xf3, 0xf3, 0xd1, 0x67, 0x44, 0x76, 0x47, 0x43, 0xee, 0xc6, 0xb2, 0xb5, 0x93, + 0x6a, 0xef, 0x34, 0xae, 0xe8, 0xec, 0x61, 0xf9, 0x61, 0x19, 0xcc, 0x37, 0xa1, 0x5f, 0xf5, 0x96, + 0xcd, 0xcb, 0x8e, 0x6b, 0xf9, 0x50, 0x5b, 0x11, 0x85, 0xe6, 0x0c, 0x00, 0x56, 0xf8, 0x19, 0x8d, + 0x89, 0xc5, 0xa4, 0x68, 0x6f, 0x49, 0xeb, 0x28, 0xc4, 0xf1, 0x31, 0x16, 0x10, 0x52, 0xf9, 0x58, + 0x24, 0x15, 0x3f, 0x81, 0x8b, 0xbf, 0x25, 0x0a, 0x44, 0xc9, 0x6d, 0xef, 0x58, 0x97, 0x61, 0x27, + 0x25, 0x10, 0xc1, 0x67, 0x11, 0x10, 0x21, 0xa1, 0xd4, 0xee, 0x2b, 0x1c, 0x1f, 0xe3, 0x70, 0x5f, + 0x49, 0x22, 0x38, 0x91, 0xb0, 0x56, 0xa8, 0xeb, 0xa1, 0xeb, 0x99, 0xf7, 0x8a, 0x8a, 0x35, 0x32, + 0xd9, 0x24, 0xd6, 0x64, 0x1b, 0xa9, 0x63, 0x21, 0x65, 0x0f, 0xd3, 0xe9, 0x7c, 0x16, 0x1d, 0xcb, + 0xc0, 0xa2, 0xb3, 0x17, 0xfa, 0xfb, 0x64, 0x70, 0x75, 0x18, 0xef, 0xa5, 0x09, 0xfd, 0x8a, 0xe9, + 0xed, 0x5c, 0x74, 0x4c, 0xb7, 0xa3, 0x95, 0xc7, 0x70, 0xe0, 0x50, 0xfb, 0x43, 0x16, 0x84, 0x3a, + 0x0f, 0xc2, 0x40, 0x57, 0xd2, 0x81, 0xbc, 0x8c, 0xa3, 0x93, 0x49, 0xf4, 0x76, 0x7d, 0x47, 0x08, + 0xd6, 0x33, 0x39, 0xb0, 0xee, 0x19, 0x95, 0xc5, 0xec, 0x81, 0xfb, 0x59, 0x32, 0x22, 0x30, 0x5e, + 0xcf, 0x17, 0x44, 0x01, 0x8b, 0xf1, 0x7a, 0x95, 0x63, 0xbd, 0x5e, 0x47, 0x1a, 0x23, 0x86, 0x7a, + 0x2c, 0x67, 0x3b, 0x46, 0x1c, 0xa1, 0x37, 0xf2, 0xbb, 0x64, 0xa0, 0xe0, 0x80, 0x5f, 0x8c, 0x47, + 0x38, 0x1b, 0x3f, 0x3b, 0x19, 0x9d, 0x03, 0xde, 0xe7, 0x53, 0x69, 0xbd, 0xcf, 0xb5, 0x77, 0xa6, + 0xf5, 0x31, 0xef, 0xe7, 0x76, 0x2c, 0x88, 0xa5, 0x72, 0x21, 0x1f, 0xc2, 0x41, 0xf6, 0xa0, 0xfd, + 0x98, 0x0c, 0x00, 0x6a, 0xd0, 0xf4, 0x6c, 0xc4, 0xb3, 0x44, 0xe1, 0xba, 0x8d, 0xf5, 0xbb, 0x47, + 0x40, 0x5d, 0xdd, 0x07, 0x14, 0xa1, 0x18, 0x9d, 0xba, 0x78, 0x7d, 0x5a, 0xdf, 0xca, 0x88, 0xab, + 0xb1, 0xc0, 0x92, 0xca, 0xdb, 0x32, 0xb6, 0xec, 0xec, 0x01, 0xf9, 0xef, 0x12, 0x28, 0xb4, 0x9c, + 0x26, 0xf4, 0x0f, 0x6f, 0x0a, 0xa4, 0x8e, 0x1a, 0x80, 0xcb, 0x1d, 0x47, 0xd4, 0x80, 0x41, 0x84, + 0xb2, 0x17, 0xdd, 0x7b, 0x25, 0x30, 0xd7, 0x72, 0xca, 0xe1, 0xe2, 0x94, 0xb8, 0xaf, 0xaa, 0xf8, + 0xd5, 0xff, 0x61, 0x05, 0xa3, 0x62, 0x0e, 0x75, 0xf5, 0xff, 0x70, 0x7a, 0xd9, 0xcb, 0xed, 0x4e, + 0x70, 0x7c, 0xc3, 0xee, 0x38, 0x06, 0xec, 0x38, 0x74, 0xa5, 0x5b, 0x55, 0x41, 0x7e, 0xcf, 0xee, + 0x38, 0x98, 0xe5, 0x82, 0x81, 0xff, 0xa3, 0x34, 0x17, 0x76, 0x1c, 0xea, 0x1b, 0x80, 0xff, 0x6b, + 0x7f, 0x21, 0x83, 0x3c, 0xfa, 0x56, 0x5c, 0xd4, 0xef, 0x92, 0x53, 0xc6, 0x41, 0x40, 0xe4, 0xc7, + 0x62, 0x09, 0xdd, 0xcb, 0xac, 0xfd, 0x13, 0x0f, 0xd6, 0x1b, 0xe2, 0xca, 0x63, 0x44, 0x11, 0xad, + 0xf9, 0xab, 0xa7, 0xc1, 0xd4, 0xc5, 0xae, 0xd3, 0xbe, 0x14, 0x1d, 0xd7, 0xa7, 0x8f, 0xea, 0x2d, + 0xa0, 0xe0, 0x9a, 0xf6, 0x36, 0xa4, 0x7b, 0x0a, 0x27, 0xfb, 0xfa, 0x42, 0xec, 0xf5, 0x62, 0x90, + 0x2c, 0xda, 0x3b, 0xd3, 0x44, 0x60, 0x18, 0x50, 0xf9, 0x74, 0xfa, 0x50, 0x19, 0xe1, 0xe4, 0x99, + 0x02, 0xe6, 0xca, 0xa5, 0x3a, 0xb9, 0xc7, 0xb0, 0x71, 0x4e, 0x57, 0x64, 0x0c, 0x33, 0x92, 0x49, + 0x86, 0x30, 0x23, 0xf2, 0xff, 0x69, 0x61, 0x1e, 0x50, 0xf9, 0xa3, 0x80, 0xf9, 0x33, 0x12, 0x98, + 0xaf, 0x59, 0x9e, 0x1f, 0xe7, 0xed, 0x9f, 0x10, 0xef, 0xf7, 0x25, 0x69, 0x4d, 0x65, 0xae, 0x1c, + 0xe1, 0x40, 0xbf, 0xa9, 0xcc, 0xe1, 0xa4, 0x22, 0x26, 0x73, 0x2c, 0x05, 0x73, 0x40, 0x2e, 0xb1, + 0x17, 0x96, 0x64, 0x6a, 0x43, 0x29, 0x2a, 0x64, 0xf2, 0x86, 0x52, 0x6c, 0xd9, 0xd9, 0xcb, 0xf7, + 0x2f, 0x24, 0x70, 0x02, 0x15, 0x9f, 0xb4, 0x2c, 0x15, 0x2f, 0xe6, 0xa1, 0xcb, 0x52, 0xa9, 0x57, + 0xc6, 0x0f, 0xf0, 0x32, 0x8e, 0x95, 0xf1, 0x61, 0x44, 0x27, 0x2c, 0xe6, 0x98, 0x65, 0xd8, 0x61, + 0x62, 0x4e, 0x58, 0x86, 0x1d, 0x5d, 0xcc, 0xc9, 0x4b, 0xb1, 0x23, 0x8a, 0xf9, 0xc8, 0x16, 0x58, + 0x7f, 0x41, 0x0e, 0xc5, 0x1c, 0xbb, 0xb6, 0x91, 0x20, 0xe6, 0xd4, 0x27, 0x7a, 0xb5, 0x77, 0x8f, + 0x28, 0xf8, 0x31, 0xaf, 0x6f, 0x8c, 0x02, 0xd3, 0x11, 0xae, 0x71, 0xfc, 0x9c, 0x0c, 0x16, 0x28, + 0x17, 0x83, 0xa7, 0xcc, 0x09, 0x18, 0xa5, 0x9e, 0x32, 0xa7, 0x3e, 0x03, 0xc4, 0x73, 0x36, 0xf9, + 0x33, 0x40, 0x89, 0xe5, 0x67, 0x0f, 0xce, 0x5f, 0xe5, 0xc1, 0x29, 0xc4, 0xc2, 0x9a, 0xd3, 0xb1, + 0xb6, 0xf6, 0x09, 0x17, 0xe7, 0xcc, 0xee, 0x1e, 0xf4, 0xb4, 0x0f, 0x48, 0xa2, 0x28, 0xfd, 0x17, + 0x00, 0x9c, 0x1e, 0x74, 0x49, 0x1c, 0x37, 0x0a, 0xd4, 0xdd, 0x71, 0x95, 0x3d, 0x58, 0x52, 0x78, + 0xfd, 0x4d, 0x23, 0x20, 0x62, 0x30, 0xf4, 0x90, 0x55, 0x38, 0x13, 0xbe, 0xe9, 0x77, 0xf0, 0xc8, + 0x1d, 0x74, 0xf0, 0xb8, 0x19, 0xc8, 0x66, 0xa7, 0x13, 0x42, 0xd5, 0xbf, 0x99, 0x8d, 0xcb, 0x34, + 0x50, 0x16, 0x94, 0xd3, 0x83, 0xd1, 0xd1, 0xbc, 0x98, 0x9c, 0x1e, 0xf4, 0xd5, 0x45, 0x50, 0x24, + 0xd7, 0x81, 0x87, 0x2b, 0xfa, 0x83, 0x33, 0xd3, 0x5c, 0xbc, 0x69, 0xd7, 0xe0, 0xd5, 0xf0, 0xce, + 0x54, 0x92, 0x19, 0xd4, 0x4f, 0x47, 0x76, 0xb2, 0xc1, 0x29, 0xd8, 0xd3, 0x47, 0xa6, 0x3c, 0x99, + 0xdd, 0xb0, 0x52, 0xaf, 0xd7, 0xdd, 0x6f, 0xd1, 0xc0, 0x03, 0xa9, 0x76, 0xc3, 0x98, 0xf8, 0x05, + 0xd2, 0x81, 0xf8, 0x05, 0xa9, 0x77, 0xc3, 0x38, 0x3e, 0xc6, 0xb1, 0x1b, 0x96, 0x44, 0x70, 0x22, + 0xf7, 0xf0, 0x60, 0xab, 0x99, 0xde, 0x46, 0xf0, 0x8f, 0x83, 0x3d, 0xab, 0x01, 0xef, 0xec, 0x32, + 0xe8, 0xa2, 0x82, 0xc4, 0x5b, 0x58, 0xd4, 0x27, 0x83, 0xe2, 0x96, 0xe3, 0xee, 0x9a, 0xc1, 0xc6, + 0x7d, 0xff, 0x49, 0x11, 0x7a, 0x03, 0xc0, 0x32, 0xce, 0x63, 0xd0, 0xbc, 0x68, 0x3e, 0xf2, 0x1c, + 0xab, 0x47, 0x83, 0x3e, 0xa2, 0xbf, 0xea, 0x8d, 0x60, 0x9e, 0xc6, 0x7e, 0xac, 0x43, 0xcf, 0x87, + 0x1d, 0x1a, 0xd1, 0x82, 0x4f, 0x54, 0xcf, 0x82, 0x39, 0x9a, 0xb0, 0x6c, 0x75, 0xa1, 0x47, 0x83, + 0x5a, 0x70, 0x69, 0xea, 0x29, 0x50, 0xb4, 0xbc, 0xfb, 0x3c, 0xc7, 0xa6, 0x01, 0xf9, 0xe8, 0x93, + 0x7a, 0x33, 0x38, 0x4e, 0xf3, 0x85, 0xc6, 0x2a, 0x39, 0xb0, 0xd3, 0x9f, 0x8c, 0x54, 0xcb, 0x76, + 0xd6, 0x5d, 0x67, 0xdb, 0x85, 0x9e, 0x87, 0x4f, 0x4d, 0x4d, 0x1b, 0x4c, 0x8a, 0x7a, 0x01, 0x9c, + 0xe8, 0x5a, 0xf6, 0x25, 0x0f, 0xc7, 0x08, 0x5e, 0xa6, 0x6e, 0x63, 0x73, 0x03, 0x62, 0x77, 0x33, + 0x8d, 0x8d, 0xca, 0x81, 0xfd, 0xc4, 0x38, 0x48, 0x45, 0xbd, 0x05, 0x28, 0x94, 0x9b, 0x25, 0xb3, + 0x7d, 0x09, 0xbf, 0xa7, 0xee, 0xa8, 0x07, 0xd2, 0x19, 0x61, 0x90, 0x30, 0xfa, 0x0b, 0x9c, 0x30, + 0x48, 0x24, 0xfd, 0x97, 0xe5, 0xc0, 0x1c, 0x57, 0x80, 0x09, 0xd4, 0xa0, 0x5b, 0xf4, 0xce, 0xef, + 0x58, 0x3e, 0x44, 0xcc, 0xd1, 0xb3, 0x2e, 0x4f, 0x1c, 0xc2, 0xbc, 0x71, 0xe0, 0x43, 0x63, 0x00, + 0x31, 0xc4, 0x17, 0xe9, 0xf0, 0xb0, 0x67, 0x99, 0x47, 0x6d, 0x55, 0x2e, 0x4d, 0x7b, 0x0e, 0x50, + 0x0f, 0x52, 0x63, 0xbc, 0x40, 0x72, 0xe9, 0xbc, 0x40, 0x90, 0xdc, 0xcc, 0x6e, 0xd7, 0xb9, 0x02, + 0x3b, 0x21, 0x59, 0xaa, 0xab, 0x07, 0xd2, 0xb5, 0xcf, 0x8f, 0x32, 0x2f, 0x4c, 0x7d, 0xb1, 0x06, + 0x6a, 0x64, 0x7b, 0xed, 0x36, 0x84, 0x1d, 0x7a, 0x70, 0x2d, 0x78, 0x4c, 0x79, 0xe5, 0x46, 0xea, + 0x59, 0xe4, 0x11, 0xdd, 0xb9, 0xf1, 0xb1, 0xab, 0x41, 0x91, 0xdc, 0x5f, 0xa7, 0xbd, 0x6c, 0x61, + 0x60, 0x5f, 0xb3, 0xc0, 0xf7, 0x35, 0x1b, 0x60, 0xce, 0x76, 0x50, 0x71, 0xeb, 0xa6, 0x6b, 0xee, + 0x7a, 0x49, 0x8b, 0xc4, 0x84, 0x6e, 0x68, 0x11, 0xd4, 0x99, 0xcf, 0x56, 0x8f, 0x19, 0x1c, 0x19, + 0xf5, 0xff, 0x00, 0xc7, 0x2f, 0xd2, 0x00, 0x0f, 0x1e, 0xa5, 0x2c, 0xc5, 0xbb, 0x50, 0xf6, 0x51, + 0x5e, 0xe2, 0xbf, 0x5c, 0x3d, 0x66, 0xf4, 0x13, 0x53, 0xbf, 0x17, 0x2c, 0xa0, 0xc7, 0x8e, 0x73, + 0x25, 0x60, 0x5c, 0x8e, 0xb7, 0x23, 0xfb, 0xc8, 0xaf, 0x71, 0x1f, 0xae, 0x1e, 0x33, 0xfa, 0x48, + 0xa9, 0x0d, 0x00, 0x76, 0xfc, 0xdd, 0x2e, 0x25, 0x9c, 0x8f, 0x57, 0xc9, 0x3e, 0xc2, 0xab, 0xe1, + 0x47, 0xab, 0xc7, 0x0c, 0x86, 0x84, 0x5a, 0x03, 0x33, 0xfe, 0x83, 0x3e, 0xa5, 0x57, 0x88, 0xf7, + 0x5d, 0xe8, 0xa3, 0xd7, 0x0a, 0xbe, 0x59, 0x3d, 0x66, 0x44, 0x04, 0xd4, 0x2a, 0x98, 0xee, 0x5d, + 0xa4, 0xc4, 0x8a, 0xf1, 0xfd, 0x5d, 0x1f, 0xb1, 0xf5, 0x8b, 0x21, 0xad, 0xf0, 0x73, 0xc4, 0x58, + 0xdb, 0xbb, 0x4c, 0x69, 0x4d, 0x09, 0x33, 0x56, 0x0e, 0xbe, 0x41, 0x8c, 0x85, 0x04, 0xd4, 0x2a, + 0x98, 0xf1, 0x6c, 0xb3, 0xe7, 0xed, 0x38, 0xbe, 0x77, 0x7a, 0xba, 0xcf, 0xcd, 0x35, 0x9e, 0x5a, + 0x93, 0x7e, 0x63, 0x44, 0x5f, 0xab, 0x4f, 0x06, 0x57, 0xef, 0xf5, 0x3a, 0xa6, 0x0f, 0xf5, 0x07, + 0x2d, 0xcf, 0xb7, 0xec, 0xed, 0x20, 0x42, 0x31, 0x19, 0x2c, 0x06, 0xbf, 0x54, 0x17, 0xe9, 0x81, + 0x37, 0x80, 0xdb, 0xa6, 0xd6, 0xbf, 0xd7, 0x4a, 0x8a, 0x65, 0xce, 0xb9, 0x3d, 0x0d, 0xe4, 0xd1, + 0x2b, 0x3c, 0xb8, 0x2c, 0x0c, 0x5e, 0xc7, 0xed, 0xd7, 0x1d, 0xdc, 0x80, 0xd1, 0x47, 0x7d, 0xe3, + 0xd3, 0xdc, 0x81, 0xf1, 0xe9, 0x7a, 0x30, 0x6b, 0x79, 0x6b, 0xd6, 0x36, 0x31, 0x8e, 0xe9, 0xf8, + 0xc1, 0x26, 0x91, 0xc5, 0x84, 0x3a, 0xbc, 0x42, 0x06, 0x8e, 0xe3, 0xc1, 0x62, 0x42, 0x90, 0xa2, + 0xdd, 0x04, 0xe6, 0xd8, 0x46, 0x46, 0x2e, 0xc1, 0xb5, 0x22, 0xd3, 0x9a, 0x3e, 0x69, 0x37, 0x82, + 0x05, 0x5e, 0xa7, 0x19, 0x0b, 0x42, 0x0e, 0xba, 0x42, 0xed, 0x06, 0x70, 0xbc, 0xaf, 0x61, 0x05, + 0x21, 0x63, 0x72, 0x51, 0xc8, 0x98, 0xeb, 0x01, 0x88, 0xb4, 0x78, 0x20, 0x99, 0xeb, 0xc0, 0x4c, + 0xa8, 0x97, 0x03, 0x33, 0xfc, 0x69, 0x0e, 0x4c, 0x07, 0xca, 0x36, 0x28, 0x03, 0x1a, 0x99, 0x6c, + 0x66, 0x7f, 0x28, 0x18, 0x99, 0xd8, 0x34, 0x64, 0x26, 0x44, 0x5e, 0xd9, 0x2d, 0xcb, 0xef, 0x06, + 0x27, 0x1b, 0xfb, 0x93, 0xd5, 0x75, 0x00, 0x2c, 0x8c, 0x51, 0x2b, 0x3a, 0xea, 0x78, 0x7b, 0x8a, + 0xf6, 0x40, 0xf4, 0x81, 0xa1, 0x71, 0xf6, 0x3b, 0xe8, 0x39, 0xc4, 0x19, 0x50, 0x20, 0x61, 0xfa, + 0x8f, 0xa9, 0x0b, 0x00, 0xe8, 0xcf, 0x5a, 0xd7, 0x8d, 0xaa, 0x5e, 0x2f, 0xeb, 0x4a, 0x4e, 0x7b, + 0x85, 0x04, 0x66, 0xc2, 0x46, 0x30, 0xb0, 0x92, 0x3a, 0x55, 0xad, 0xa1, 0xf7, 0x8c, 0x1e, 0x6c, + 0x54, 0xac, 0x92, 0x3d, 0x15, 0x3c, 0x6a, 0xcf, 0x83, 0xcb, 0x96, 0xeb, 0xf9, 0x86, 0x73, 0x65, + 0xd9, 0x71, 0xa3, 0x81, 0x95, 0x04, 0xb8, 0x8d, 0x7b, 0x8d, 0x0c, 0xc6, 0x0e, 0xc4, 0x67, 0xde, + 0xa0, 0x4b, 0x17, 0xfe, 0xa3, 0x04, 0x44, 0xd7, 0x77, 0x4d, 0xdb, 0xeb, 0x39, 0x1e, 0x34, 0x9c, + 0x2b, 0x5e, 0xc9, 0xee, 0x94, 0x9d, 0xee, 0xde, 0xae, 0xed, 0x51, 0x93, 0x2f, 0xee, 0x35, 0x92, + 0x0e, 0xbe, 0x45, 0x78, 0x01, 0x80, 0x72, 0xa3, 0x56, 0xd3, 0xcb, 0xad, 0x6a, 0xa3, 0xae, 0x1c, + 0x43, 0xd2, 0x6a, 0x95, 0x96, 0x6a, 0x48, 0x3a, 0xdf, 0x07, 0xa6, 0x83, 0x36, 0x4d, 0xa3, 0xdc, + 0xe4, 0x82, 0x28, 0x37, 0x6a, 0x09, 0x4c, 0x07, 0xad, 0x9c, 0x8e, 0x08, 0x8f, 0xed, 0x3f, 0xd5, + 0xbc, 0x6b, 0xba, 0x3e, 0x36, 0x50, 0x02, 0x22, 0x4b, 0xa6, 0x07, 0x8d, 0xf0, 0xb3, 0xb3, 0x4f, + 0xa0, 0x1c, 0xa8, 0x60, 0xa1, 0x54, 0xab, 0x6d, 0x36, 0x8c, 0xcd, 0x7a, 0xa3, 0xb5, 0x5a, 0xad, + 0xaf, 0x90, 0x11, 0xb2, 0xba, 0x52, 0x6f, 0x18, 0x3a, 0x19, 0x20, 0x9b, 0x4a, 0x8e, 0xdc, 0x62, + 0xbd, 0x34, 0x0d, 0x8a, 0x3d, 0x2c, 0x5d, 0xed, 0x4b, 0x72, 0xca, 0x70, 0x06, 0x21, 0x4e, 0x31, + 0xf7, 0xec, 0x72, 0x47, 0x0a, 0xa4, 0x01, 0x47, 0x7e, 0xcf, 0x82, 0x39, 0x62, 0xaa, 0x7b, 0x78, + 0x77, 0x06, 0x23, 0x27, 0x1b, 0x5c, 0x9a, 0xf6, 0x09, 0x29, 0x45, 0x8c, 0x83, 0x81, 0x1c, 0xa5, + 0x33, 0x2e, 0x7e, 0x2f, 0x37, 0xda, 0xa5, 0x16, 0xd5, 0x7a, 0x4b, 0x37, 0xea, 0xa5, 0x1a, 0xcd, + 0x22, 0xab, 0xa7, 0xc1, 0xc9, 0x7a, 0x83, 0x86, 0x74, 0x6c, 0x6e, 0xb6, 0x1a, 0x9b, 0xd5, 0xb5, + 0xf5, 0x86, 0xd1, 0x52, 0x0a, 0xea, 0x29, 0xa0, 0x92, 0xff, 0x9b, 0xd5, 0xe6, 0x66, 0xb9, 0x54, + 0x2f, 0xeb, 0x35, 0xbd, 0xa2, 0x14, 0xd5, 0xc7, 0x81, 0x1b, 0xc8, 0x25, 0x49, 0x8d, 0xe5, 0x4d, + 0xa3, 0x71, 0xbe, 0x89, 0x10, 0x34, 0xf4, 0x5a, 0x09, 0x29, 0x12, 0x73, 0x9b, 0xf5, 0x94, 0x7a, + 0x15, 0x38, 0x8e, 0xaf, 0xba, 0xaf, 0x35, 0x4a, 0x15, 0x5a, 0xde, 0xb4, 0x7a, 0x2d, 0x38, 0x5d, + 0xad, 0x37, 0x37, 0x96, 0x97, 0xab, 0xe5, 0xaa, 0x5e, 0x6f, 0x6d, 0xae, 0xeb, 0xc6, 0x5a, 0xb5, + 0xd9, 0x44, 0xdf, 0x2a, 0x33, 0xf8, 0xae, 0x60, 0xd2, 0x67, 0x6a, 0xef, 0x97, 0xc1, 0xfc, 0x39, + 0xb3, 0x6b, 0xa1, 0x81, 0x02, 0x5f, 0x22, 0xde, 0x77, 0x1a, 0xc8, 0xc7, 0x97, 0x8d, 0xd3, 0xf3, + 0x04, 0xf8, 0x41, 0xfb, 0x21, 0x39, 0xe5, 0x69, 0x20, 0x0a, 0x04, 0x29, 0x71, 0x91, 0x2b, 0x2d, + 0x66, 0xee, 0xfa, 0x5a, 0x29, 0xc5, 0x69, 0x20, 0x71, 0xf2, 0xe9, 0xc0, 0xff, 0xf9, 0x71, 0x81, + 0xaf, 0x80, 0xb9, 0x8d, 0x7a, 0x69, 0xa3, 0xb5, 0xda, 0x30, 0xaa, 0xdf, 0x83, 0x63, 0xd9, 0xcf, + 0x83, 0x99, 0xe5, 0x86, 0xb1, 0x54, 0xad, 0x54, 0xf4, 0xba, 0x52, 0x50, 0x1f, 0x05, 0xae, 0x6a, + 0xea, 0xc6, 0xb9, 0x6a, 0x59, 0xdf, 0xdc, 0xa8, 0x97, 0xce, 0x95, 0xaa, 0x35, 0xdc, 0x47, 0x14, + 0x13, 0x2e, 0x40, 0x9f, 0xd2, 0x7e, 0x20, 0x0f, 0x00, 0xa9, 0x3a, 0xbe, 0xca, 0x89, 0xb9, 0x26, + 0xfb, 0x0f, 0xd2, 0x4e, 0x1a, 0x22, 0x32, 0x31, 0xed, 0xb7, 0x0a, 0xa6, 0x5d, 0xfa, 0x82, 0xae, + 0x8e, 0x0d, 0xa3, 0x43, 0xfe, 0x06, 0xd4, 0x8c, 0xf0, 0x73, 0xed, 0x03, 0x69, 0xe6, 0x08, 0xb1, + 0x8c, 0xa5, 0x43, 0x72, 0x79, 0x3c, 0x40, 0x6a, 0x2f, 0xce, 0x81, 0x05, 0xbe, 0x62, 0xa8, 0x12, + 0xd8, 0x98, 0x12, 0xab, 0x04, 0xff, 0x31, 0x63, 0x64, 0x9d, 0x7d, 0x12, 0x1d, 0x4e, 0x41, 0xd0, + 0x32, 0xc9, 0xc1, 0xfe, 0xc0, 0x62, 0x51, 0x72, 0x88, 0x79, 0x64, 0x74, 0x28, 0x92, 0x3a, 0x05, + 0xe4, 0xd6, 0x83, 0xbe, 0x22, 0x6b, 0x5f, 0x93, 0xc1, 0x3c, 0x77, 0x0f, 0xb7, 0xf6, 0xce, 0x9c, + 0xc8, 0x1d, 0xb9, 0xcc, 0x0d, 0xdf, 0xb9, 0xc3, 0xde, 0xf0, 0x7d, 0xf6, 0x5e, 0x30, 0x45, 0xd3, + 0xb0, 0x7c, 0x1b, 0x75, 0x64, 0x0a, 0x1c, 0x07, 0xb3, 0x2b, 0x7a, 0x6b, 0xb3, 0xd9, 0x2a, 0x19, + 0x2d, 0xbd, 0xa2, 0xe4, 0xd0, 0xc0, 0xa7, 0xaf, 0xad, 0xb7, 0x2e, 0x28, 0x12, 0x1a, 0x13, 0x57, + 0x36, 0xaa, 0x15, 0x7d, 0xb3, 0x51, 0xaf, 0x5d, 0x50, 0xe4, 0xf4, 0x0e, 0x97, 0xfd, 0x8c, 0x4d, + 0xd8, 0xe1, 0x32, 0xa9, 0xf8, 0xec, 0xe7, 0xae, 0x9f, 0x93, 0x81, 0x42, 0x38, 0xd0, 0x1f, 0xec, + 0x41, 0xd7, 0x82, 0x76, 0x1b, 0x6a, 0x97, 0x44, 0x02, 0xc0, 0x1e, 0x08, 0x7d, 0x88, 0xfb, 0x77, + 0xc6, 0x6a, 0x24, 0x0f, 0x7d, 0x06, 0x77, 0xfe, 0x80, 0xc1, 0xfd, 0x5b, 0x69, 0x3d, 0x2e, 0xfb, + 0xd9, 0x1d, 0x0b, 0x64, 0x9f, 0x4e, 0xe3, 0x71, 0x39, 0x84, 0x83, 0x89, 0xc4, 0x75, 0x8e, 0x19, + 0x8f, 0x15, 0x59, 0x7b, 0x91, 0x0c, 0x8e, 0x57, 0x4c, 0x1f, 0x2e, 0xed, 0xb7, 0x82, 0x7b, 0x33, + 0x63, 0xee, 0xba, 0xce, 0x1d, 0xb8, 0xeb, 0x3a, 0xba, 0x7a, 0x53, 0xea, 0xbb, 0x7a, 0x53, 0x7b, + 0x4f, 0xda, 0x33, 0x9a, 0x7d, 0x3c, 0x8c, 0x2d, 0xf8, 0x72, 0xba, 0xb3, 0x97, 0xc9, 0x5c, 0x64, + 0xdf, 0xc0, 0xde, 0x3e, 0x03, 0x14, 0xc2, 0x0a, 0xe3, 0x54, 0xf8, 0x53, 0xf4, 0x7a, 0xf8, 0xcd, + 0x14, 0x31, 0x1c, 0x83, 0xa8, 0x18, 0x12, 0x1f, 0x15, 0x83, 0x5b, 0xa3, 0x96, 0xfb, 0x1d, 0x41, + 0xd2, 0x76, 0x86, 0x8c, 0x07, 0x61, 0x7c, 0xd8, 0xdc, 0xec, 0x3a, 0xc3, 0xc4, 0xe2, 0x27, 0x73, + 0x85, 0x31, 0xbd, 0x35, 0x54, 0x17, 0x45, 0x26, 0xf9, 0xa6, 0xf6, 0xb4, 0xee, 0xe4, 0x9c, 0x07, + 0x67, 0xc2, 0xf5, 0xe5, 0xd9, 0xb9, 0x93, 0x0f, 0xe3, 0x20, 0x7b, 0x14, 0xbe, 0x25, 0x81, 0x7c, + 0xd3, 0x71, 0xfd, 0x71, 0x61, 0x90, 0x76, 0x0b, 0x9c, 0x91, 0x40, 0x33, 0x7e, 0x0e, 0x9a, 0xdd, + 0x16, 0x78, 0x72, 0xf9, 0x13, 0x08, 0x83, 0x79, 0x1c, 0x2c, 0x10, 0x4e, 0xc2, 0x3b, 0x64, 0xfe, + 0x55, 0x22, 0xfd, 0xd5, 0xfd, 0xa2, 0x88, 0xe0, 0x8d, 0x90, 0x70, 0x0b, 0x3a, 0x00, 0x85, 0x4b, + 0xd3, 0xde, 0xc8, 0xe2, 0x52, 0xe1, 0x71, 0x19, 0x34, 0x03, 0x0f, 0xaf, 0x61, 0x19, 0x57, 0xcf, + 0x94, 0x26, 0xa2, 0x66, 0x42, 0xe1, 0xd9, 0x23, 0xf2, 0x90, 0x0c, 0x8a, 0xd4, 0x05, 0x70, 0xac, + 0x08, 0xa4, 0x6d, 0x19, 0xa1, 0x10, 0xc4, 0x5c, 0x05, 0xe5, 0x71, 0xb7, 0x8c, 0xe4, 0xf2, 0xb3, + 0xc7, 0xe1, 0xdf, 0xa9, 0x6f, 0x6b, 0xe9, 0xb2, 0x69, 0x75, 0xcd, 0x8b, 0xdd, 0x14, 0x91, 0xac, + 0x3f, 0x91, 0xf2, 0x34, 0x5f, 0x58, 0x55, 0xae, 0xbc, 0x18, 0x89, 0x7f, 0x17, 0x98, 0x71, 0xb9, + 0xbd, 0x3f, 0x64, 0x45, 0xf5, 0xf9, 0x15, 0xd3, 0xf7, 0x46, 0x94, 0x33, 0xd5, 0xd1, 0x3d, 0x21, + 0x7e, 0x26, 0x72, 0xd4, 0x68, 0xb6, 0xd4, 0xe9, 0x2c, 0x43, 0xd3, 0xdf, 0x73, 0x61, 0x27, 0xd5, + 0x10, 0xe1, 0xf6, 0x6d, 0x8f, 0x32, 0x92, 0xe0, 0x62, 0x49, 0xd6, 0x78, 0x74, 0x9e, 0x32, 0xa4, + 0x37, 0x08, 0x78, 0x19, 0x4b, 0x97, 0xf4, 0xb6, 0x10, 0x92, 0x06, 0x07, 0xc9, 0xd3, 0x46, 0x63, + 0x22, 0x7b, 0x40, 0x7e, 0x46, 0x06, 0x0b, 0xc4, 0x4e, 0x18, 0x37, 0x26, 0x1f, 0x4a, 0xe9, 0x32, + 0xc4, 0xdc, 0xd2, 0xc5, 0xb2, 0x33, 0x16, 0x58, 0xd2, 0x38, 0x18, 0x89, 0xf1, 0x91, 0x3d, 0x32, + 0xcf, 0x3f, 0x01, 0x00, 0xe3, 0x06, 0xfa, 0x89, 0x62, 0x14, 0xd7, 0x51, 0x7b, 0x27, 0x9d, 0x7f, + 0x34, 0xb9, 0x20, 0xe3, 0x8c, 0x8b, 0x67, 0xb8, 0x41, 0xc5, 0x27, 0x0a, 0x8d, 0x2a, 0xbf, 0x97, + 0xd2, 0xe6, 0xa5, 0x4e, 0x98, 0x43, 0x07, 0xf7, 0x11, 0x7b, 0xb9, 0x4f, 0xa6, 0x30, 0x7e, 0x87, + 0xb1, 0x92, 0x0e, 0xb5, 0xda, 0x08, 0x33, 0xfb, 0xd3, 0xe0, 0xa4, 0xa1, 0x97, 0x2a, 0x8d, 0x7a, + 0xed, 0x02, 0x7b, 0x65, 0x93, 0x22, 0xb3, 0x93, 0x93, 0x4c, 0x60, 0x7b, 0x5d, 0xca, 0x3e, 0x90, + 0x97, 0x55, 0xd2, 0x6c, 0x85, 0x59, 0x5c, 0x19, 0xde, 0xab, 0x09, 0x90, 0x3d, 0x4a, 0x14, 0xbe, + 0x56, 0x04, 0xb3, 0x06, 0x6c, 0x3b, 0xbb, 0xbb, 0xd0, 0xee, 0xc0, 0x8e, 0xf6, 0x3a, 0x19, 0xcc, + 0x85, 0xfb, 0x7f, 0x4d, 0xe8, 0x6b, 0xdf, 0x1b, 0x61, 0x73, 0x16, 0xcc, 0xa1, 0xca, 0x35, 0xf8, + 0xc0, 0xf1, 0x5c, 0x9a, 0x7a, 0x2b, 0x38, 0x11, 0xa0, 0xd0, 0xe8, 0x9b, 0xc2, 0x1c, 0x7c, 0xa1, + 0xbd, 0x97, 0xc5, 0x68, 0x83, 0xc7, 0xe8, 0xde, 0x78, 0x61, 0x86, 0xec, 0x2e, 0xb2, 0xac, 0xc6, + 0x80, 0xf5, 0x3b, 0x21, 0x58, 0xcf, 0xe2, 0xc0, 0xaa, 0x1c, 0x92, 0xfe, 0x51, 0xa2, 0xf6, 0xcb, + 0x32, 0x38, 0x19, 0x74, 0xc4, 0x93, 0x43, 0xeb, 0x93, 0x2c, 0x5a, 0xdf, 0xc7, 0xa3, 0xb5, 0x22, + 0x22, 0xcd, 0x41, 0x2c, 0xc7, 0xa0, 0xf6, 0xc5, 0x10, 0xb5, 0xef, 0xe7, 0x50, 0xab, 0x8d, 0xa9, + 0x9c, 0xa3, 0x44, 0xef, 0x43, 0x32, 0x38, 0x8d, 0xcc, 0xce, 0xb2, 0x63, 0x6f, 0x75, 0xad, 0xb6, + 0x6f, 0xd9, 0xdb, 0x91, 0x4b, 0xdb, 0x8a, 0xc8, 0xca, 0x66, 0x3f, 0xb6, 0xd2, 0x41, 0x6c, 0xf9, + 0x78, 0x1b, 0xa2, 0x6d, 0x2b, 0x8e, 0xad, 0x98, 0x21, 0x8c, 0x71, 0xd6, 0x8e, 0x34, 0x87, 0x4d, + 0x4a, 0xdf, 0xfa, 0x04, 0x39, 0x38, 0x4a, 0xfc, 0x1e, 0x02, 0x8c, 0xe9, 0xf1, 0x42, 0x19, 0x28, + 0xd8, 0x7f, 0x12, 0xf7, 0xec, 0xf4, 0x3e, 0xd3, 0x06, 0xef, 0x59, 0xdf, 0x0b, 0x04, 0x14, 0x78, + 0xd6, 0x07, 0x09, 0xea, 0x4d, 0x60, 0xa1, 0xbd, 0x03, 0xdb, 0x97, 0xaa, 0x76, 0xe0, 0x9b, 0x44, + 0x1c, 0x59, 0xfa, 0x52, 0xf9, 0xc1, 0xec, 0x7e, 0x1e, 0x4c, 0x7e, 0xe1, 0x91, 0x9b, 0xd8, 0xb0, + 0x4c, 0xc5, 0x34, 0xb4, 0x5f, 0x0f, 0x01, 0xaa, 0x73, 0x00, 0xdd, 0x35, 0x12, 0xd5, 0x74, 0xb0, + 0xd4, 0x47, 0x80, 0x45, 0x03, 0xa7, 0x1a, 0xeb, 0xad, 0x6a, 0xa3, 0xbe, 0xb9, 0xd1, 0xd4, 0x2b, + 0x9b, 0x4b, 0x01, 0x38, 0x4d, 0x45, 0xd6, 0xbe, 0x2a, 0x81, 0x29, 0xc2, 0x96, 0xa7, 0x3d, 0x3e, + 0x82, 0x60, 0xe8, 0x91, 0x02, 0xed, 0xed, 0xc2, 0x01, 0x82, 0x42, 0x41, 0xd0, 0x72, 0x62, 0x1a, + 0xc6, 0x53, 0xc1, 0x14, 0x01, 0x39, 0xd8, 0x05, 0x38, 0x13, 0x63, 0xd9, 0x51, 0x32, 0x46, 0x90, + 0x5d, 0x30, 0x58, 0xd0, 0x10, 0x36, 0xb2, 0xb7, 0xc6, 0x9f, 0x9b, 0x27, 0x4b, 0x07, 0xe7, 0x2d, + 0x7f, 0x07, 0x9f, 0x38, 0xd0, 0x9e, 0x29, 0xd2, 0x71, 0xdd, 0x0a, 0x0a, 0x97, 0x51, 0xee, 0x21, + 0xa7, 0x37, 0x48, 0x26, 0xed, 0xe7, 0x85, 0x63, 0x53, 0x73, 0xfa, 0x19, 0xf2, 0x14, 0x03, 0xce, + 0x1a, 0xc8, 0x77, 0x2d, 0xcf, 0xa7, 0x36, 0xf7, 0x9d, 0xa9, 0x08, 0x05, 0x7f, 0xaa, 0x3e, 0xdc, + 0x35, 0x30, 0x19, 0xed, 0x3e, 0x64, 0x31, 0x45, 0xa9, 0x02, 0x27, 0x58, 0x4e, 0x83, 0x29, 0x7a, + 0xb2, 0x9a, 0x6e, 0x4b, 0x05, 0x8f, 0x82, 0x5b, 0x41, 0x42, 0xb5, 0xcd, 0x5e, 0x07, 0xfe, 0xbf, + 0xe3, 0x60, 0x6a, 0xd5, 0xf2, 0x7c, 0xc7, 0xdd, 0xd7, 0x5e, 0x9f, 0x03, 0x53, 0xe7, 0xa0, 0xeb, + 0x59, 0x8e, 0x7d, 0xc0, 0x5d, 0xeb, 0x7a, 0x30, 0xdb, 0x73, 0xe1, 0x65, 0xcb, 0xd9, 0xf3, 0x98, + 0x51, 0x82, 0x49, 0x52, 0x35, 0x30, 0x6d, 0xee, 0xf9, 0x3b, 0x8e, 0x1b, 0x05, 0x64, 0x0a, 0x9e, + 0xd5, 0x33, 0x00, 0x90, 0xff, 0x75, 0x73, 0x17, 0x06, 0x77, 0xae, 0x47, 0x29, 0xaa, 0x0a, 0xf2, + 0xbe, 0xb5, 0x0b, 0x69, 0x84, 0x76, 0xfc, 0x1f, 0x09, 0x18, 0x47, 0x3b, 0xa5, 0x51, 0x65, 0x65, + 0x23, 0x78, 0xd4, 0xfe, 0x50, 0x06, 0xb3, 0x2b, 0xd0, 0xa7, 0xac, 0x7a, 0xda, 0x4b, 0x72, 0x42, + 0x97, 0x22, 0xa1, 0x79, 0x49, 0xd7, 0xf4, 0x82, 0xef, 0xc2, 0x21, 0x97, 0x4f, 0x8c, 0xc2, 0xc5, + 0xcb, 0xec, 0x5d, 0x11, 0x38, 0x76, 0xa8, 0x5f, 0x25, 0xce, 0xfc, 0x34, 0x33, 0xdd, 0x38, 0x3e, + 0xf8, 0x82, 0xb7, 0x89, 0x13, 0xe3, 0x6e, 0x50, 0xd9, 0x2f, 0x32, 0xf5, 0x89, 0xed, 0x8e, 0xa6, + 0x2f, 0xd3, 0x1c, 0x07, 0xae, 0x01, 0x61, 0x29, 0x51, 0x32, 0x46, 0x98, 0x5b, 0x30, 0x62, 0xc7, + 0x70, 0x4e, 0x26, 0x70, 0xf1, 0xab, 0x0c, 0x66, 0x9b, 0x3b, 0xce, 0x95, 0x40, 0x8e, 0xdf, 0x27, + 0x06, 0xec, 0xb5, 0x60, 0xe6, 0x72, 0x1f, 0xa8, 0x51, 0x02, 0x7b, 0xd7, 0x9c, 0xcc, 0xdf, 0x35, + 0xf7, 0x02, 0x39, 0x2d, 0x4c, 0x0c, 0x73, 0x31, 0x30, 0xf1, 0xd7, 0xc3, 0x49, 0x29, 0xae, 0x87, + 0x53, 0x9f, 0x02, 0xa6, 0x28, 0xd7, 0x74, 0x99, 0x3a, 0x19, 0xe0, 0x20, 0x33, 0x5b, 0xc1, 0x3c, + 0x5f, 0xc1, 0x74, 0xc8, 0xc7, 0x57, 0x2e, 0x7b, 0xe4, 0x7f, 0x53, 0xc2, 0xf1, 0x9a, 0x02, 0xe0, + 0xcb, 0x63, 0x00, 0x5e, 0xfb, 0x66, 0x4e, 0x74, 0x33, 0x27, 0x94, 0x40, 0xc8, 0xc1, 0xa1, 0x2e, + 0x3c, 0x1b, 0x4a, 0x2e, 0x7b, 0x79, 0xbe, 0x22, 0x0f, 0xe6, 0x2a, 0xd6, 0xd6, 0x56, 0xd8, 0x49, + 0xbe, 0x54, 0xb0, 0x93, 0x8c, 0x77, 0xa9, 0x42, 0x76, 0xee, 0x9e, 0xeb, 0x42, 0x3b, 0xa8, 0x14, + 0x6d, 0x4e, 0x7d, 0xa9, 0xea, 0xcd, 0xe0, 0x78, 0x30, 0x2e, 0xb0, 0x1d, 0xe5, 0x8c, 0xd1, 0x9f, + 0xac, 0x7d, 0x5d, 0xd8, 0x13, 0x20, 0x90, 0x28, 0x5b, 0xa5, 0x98, 0x06, 0x78, 0x37, 0x98, 0xdf, + 0x21, 0xb9, 0xf1, 0x72, 0x69, 0xd0, 0x59, 0x9e, 0xea, 0x8b, 0x87, 0xbf, 0x06, 0x3d, 0xcf, 0xdc, + 0x86, 0x06, 0x9f, 0xb9, 0xaf, 0xf9, 0xca, 0x69, 0x6e, 0x77, 0x14, 0x73, 0x2a, 0x10, 0xa8, 0x49, + 0xf6, 0xda, 0xf1, 0xc5, 0xb3, 0x20, 0xbf, 0x6c, 0x75, 0xa1, 0xf6, 0x23, 0x12, 0x98, 0x41, 0xb3, + 0x6e, 0xbb, 0x8d, 0x9e, 0x18, 0x07, 0xcb, 0xaf, 0xe5, 0x44, 0x6f, 0x35, 0x46, 0x74, 0x16, 0x43, + 0x1a, 0x31, 0xed, 0x46, 0xec, 0xf6, 0xe2, 0x44, 0x52, 0x13, 0xb8, 0x83, 0x0a, 0x4d, 0x3d, 0xb6, + 0xb6, 0xba, 0x8e, 0xc9, 0x6d, 0x18, 0xf4, 0x9b, 0x42, 0xd1, 0xa1, 0xc0, 0xba, 0xe3, 0xaf, 0x5b, + 0xb6, 0x1d, 0xc6, 0xd9, 0x38, 0x90, 0xce, 0xfb, 0xba, 0x24, 0x86, 0x2a, 0xc3, 0x75, 0xa7, 0xa5, + 0xc7, 0x68, 0xf6, 0x4d, 0x60, 0xe1, 0xe2, 0xbe, 0x0f, 0x3d, 0x9a, 0x8b, 0x16, 0x9b, 0x37, 0xfa, + 0x52, 0x99, 0x8b, 0x06, 0x92, 0x42, 0x9a, 0x25, 0x14, 0x98, 0x4e, 0xd4, 0xab, 0x23, 0xcc, 0x00, + 0x4f, 0x02, 0xa5, 0xde, 0xa8, 0xe8, 0xd8, 0xdf, 0x37, 0xf0, 0xa0, 0xdc, 0xd6, 0x7e, 0x52, 0x06, + 0x73, 0xd8, 0x01, 0x2f, 0x40, 0xe1, 0x06, 0x81, 0xf9, 0x88, 0xf6, 0x65, 0x61, 0x5f, 0x60, 0x5c, + 0x65, 0xb6, 0x80, 0x78, 0x41, 0x6f, 0x59, 0xdd, 0x7e, 0x41, 0x17, 0x8c, 0xbe, 0xd4, 0x01, 0x80, + 0xc8, 0x03, 0x01, 0xf9, 0x65, 0x21, 0x87, 0xe0, 0x61, 0xdc, 0x1d, 0x15, 0x2a, 0xbf, 0x22, 0x83, + 0x59, 0x34, 0x49, 0x09, 0x40, 0x69, 0x70, 0xa0, 0x38, 0x76, 0x77, 0x3f, 0x5a, 0x16, 0x09, 0x1e, + 0x53, 0x35, 0x92, 0x3f, 0x12, 0x9e, 0xb9, 0x63, 0x11, 0x31, 0xbc, 0x4c, 0x08, 0xbf, 0x0f, 0x0a, + 0xcd, 0xe7, 0x87, 0x30, 0x77, 0x54, 0xf0, 0x3d, 0x5c, 0x04, 0xc5, 0x8d, 0x1e, 0x46, 0xee, 0x4b, + 0xb2, 0xc8, 0xa5, 0x1d, 0x07, 0x0e, 0x83, 0x21, 0x33, 0xab, 0xeb, 0xb4, 0xcd, 0xee, 0x7a, 0x74, + 0xaa, 0x36, 0x4a, 0x50, 0xef, 0xa2, 0xfe, 0xe1, 0xe4, 0xc4, 0xf9, 0x4d, 0x89, 0xf7, 0x59, 0x60, + 0x19, 0x31, 0x07, 0xef, 0x6e, 0x05, 0x27, 0x3a, 0x96, 0x67, 0x5e, 0xec, 0x42, 0xdd, 0x6e, 0xbb, + 0xfb, 0x44, 0x1c, 0x74, 0x5a, 0x75, 0xe0, 0x85, 0x7a, 0x0f, 0x28, 0x78, 0xfe, 0x7e, 0x97, 0xcc, + 0x13, 0xd9, 0x73, 0x7a, 0xb1, 0x45, 0x35, 0x51, 0x76, 0x83, 0x7c, 0xc5, 0xba, 0x75, 0x4e, 0x89, + 0xb9, 0x75, 0xaa, 0x4f, 0x02, 0x45, 0xc7, 0xb5, 0xb6, 0x2d, 0x72, 0x45, 0xdd, 0xc2, 0x81, 0xb0, + 0xad, 0xc4, 0x14, 0x68, 0xe0, 0x2c, 0x06, 0xcd, 0xaa, 0x3e, 0x05, 0xcc, 0x58, 0xbb, 0xe6, 0x36, + 0xbc, 0xdf, 0xb2, 0xc9, 0xa1, 0xf6, 0x85, 0x3b, 0x4e, 0x1f, 0x38, 0x82, 0x48, 0xdf, 0x1b, 0x51, + 0x56, 0xf5, 0x6e, 0x70, 0x4d, 0xdb, 0x85, 0xa6, 0x0f, 0x91, 0x80, 0xce, 0x5b, 0x9d, 0x6d, 0xe8, + 0x57, 0xb7, 0xd6, 0x2c, 0xcf, 0xb3, 0xec, 0x6d, 0x7a, 0x0b, 0x65, 0x7c, 0x06, 0xed, 0x83, 0x92, + 0x68, 0x64, 0x3a, 0x2c, 0x19, 0xa2, 0x12, 0x23, 0xdc, 0x96, 0xcd, 0x48, 0x51, 0x16, 0x74, 0x8e, + 0x7d, 0xb5, 0x50, 0xcc, 0xb8, 0x78, 0xb6, 0xb2, 0x1f, 0xfa, 0x7f, 0x5f, 0x02, 0xd3, 0x15, 0xe7, + 0x8a, 0x8d, 0x9b, 0xc9, 0x9d, 0x62, 0x96, 0xf2, 0x80, 0x63, 0xe6, 0xfc, 0xbd, 0xcb, 0x89, 0x67, + 0xca, 0x70, 0x6d, 0x83, 0x22, 0x63, 0x60, 0x48, 0x6c, 0x77, 0x82, 0xb7, 0xe1, 0x26, 0x95, 0x93, + 0xbd, 0x5c, 0x7f, 0x5b, 0x06, 0xf9, 0x8a, 0xeb, 0xf4, 0xb4, 0xb7, 0xe5, 0x52, 0x38, 0x89, 0x75, + 0x5c, 0xa7, 0xd7, 0xc2, 0xd7, 0x59, 0x46, 0xfb, 0x22, 0x6c, 0x9a, 0x7a, 0x27, 0x98, 0xee, 0x39, + 0x9e, 0xe5, 0x07, 0x93, 0x90, 0x85, 0x3b, 0x1e, 0x33, 0xb0, 0x2f, 0x58, 0xa7, 0x99, 0x8c, 0x30, + 0x3b, 0xea, 0xf3, 0xb1, 0x08, 0x91, 0x5c, 0x90, 0x18, 0x83, 0x2b, 0x3d, 0xfb, 0x52, 0xb5, 0x97, + 0xb1, 0x48, 0x3e, 0x8d, 0x47, 0xf2, 0xb1, 0x03, 0x24, 0xec, 0x3a, 0xbd, 0xb1, 0xb8, 0x75, 0xbc, + 0x32, 0x44, 0xf5, 0xe9, 0x1c, 0xaa, 0xb7, 0x08, 0x95, 0x99, 0x3d, 0xa2, 0x1f, 0xcc, 0x03, 0x80, + 0x8d, 0x94, 0x0d, 0x34, 0x7d, 0x12, 0xb3, 0xd0, 0x7e, 0x38, 0xcf, 0xc8, 0xb2, 0xc4, 0xcb, 0xf2, + 0xf1, 0x31, 0x36, 0x10, 0x26, 0x1f, 0x23, 0xd1, 0x12, 0x28, 0xec, 0xa1, 0xd7, 0x54, 0xa2, 0x82, + 0x24, 0xf0, 0xa3, 0x41, 0xbe, 0xd4, 0x7e, 0x33, 0x07, 0x0a, 0x38, 0x41, 0x3d, 0x03, 0x00, 0x36, + 0x0b, 0xc8, 0x91, 0xcc, 0x1c, 0x36, 0x00, 0x98, 0x14, 0xac, 0xad, 0x56, 0x87, 0xbe, 0x26, 0x06, + 0x77, 0x94, 0x80, 0xbe, 0xc6, 0xc6, 0x02, 0xa6, 0x45, 0xcd, 0x07, 0x26, 0x05, 0x7d, 0x8d, 0x9f, + 0x6a, 0x70, 0x8b, 0xdc, 0x34, 0x90, 0x37, 0xa2, 0x84, 0xf0, 0xeb, 0x5a, 0x78, 0x3f, 0x65, 0xf0, + 0x35, 0x4e, 0x41, 0x53, 0x69, 0xac, 0x96, 0x4b, 0x51, 0x11, 0x45, 0x9c, 0xa9, 0x3f, 0x59, 0x7b, + 0x5d, 0xa8, 0x36, 0x15, 0x4e, 0x6d, 0x6e, 0x4f, 0x21, 0xde, 0xec, 0x95, 0xe7, 0x4f, 0x0b, 0x60, + 0xa6, 0xee, 0x74, 0xa8, 0xee, 0x30, 0xd3, 0xcd, 0x4f, 0x17, 0x52, 0x4d, 0x37, 0x43, 0x1a, 0x31, + 0x0a, 0xf2, 0x0c, 0x5e, 0x41, 0xc4, 0x28, 0xb0, 0xfa, 0xa1, 0x2e, 0x81, 0x22, 0xd6, 0xde, 0x83, + 0x17, 0x1f, 0x26, 0x91, 0xc0, 0xa2, 0x35, 0xe8, 0x97, 0xff, 0xe1, 0x74, 0xec, 0xbf, 0x81, 0x02, + 0xae, 0x60, 0xc2, 0xde, 0x10, 0x5f, 0x51, 0x29, 0xb9, 0xa2, 0x72, 0x72, 0x45, 0xf3, 0xfd, 0x15, + 0x4d, 0xb3, 0x8a, 0x10, 0xa7, 0x21, 0xd9, 0xeb, 0xf8, 0xdf, 0x4e, 0x01, 0x50, 0x37, 0x2f, 0x5b, + 0xdb, 0x64, 0x6f, 0xf9, 0x0f, 0x83, 0xd9, 0x13, 0xdd, 0x05, 0xfe, 0x31, 0x66, 0x20, 0xbc, 0x13, + 0x4c, 0xd1, 0x71, 0x8f, 0x56, 0xe4, 0x3a, 0xae, 0x22, 0x11, 0x15, 0x62, 0xd4, 0x3e, 0xe8, 0x1b, + 0x41, 0x7e, 0xee, 0x8e, 0x76, 0xa9, 0xef, 0x8e, 0xf6, 0xc1, 0x3b, 0x18, 0x31, 0x37, 0xb7, 0x6b, + 0xef, 0x13, 0x3e, 0x43, 0xc5, 0xf0, 0xc3, 0xd4, 0x28, 0xa6, 0x09, 0x3e, 0x09, 0x4c, 0x39, 0xe1, + 0x76, 0xb8, 0x1c, 0xbb, 0x8a, 0x56, 0xb5, 0xb7, 0x1c, 0x23, 0xc8, 0x29, 0xb8, 0x75, 0x26, 0xc4, + 0xc7, 0x44, 0x8e, 0x29, 0x9e, 0x5a, 0x09, 0xa2, 0x36, 0xa2, 0x7a, 0x9c, 0xb7, 0xfc, 0x9d, 0x9a, + 0x65, 0x5f, 0xf2, 0xb4, 0xef, 0x17, 0xb3, 0x20, 0x19, 0xfc, 0xa5, 0x74, 0xf8, 0xf3, 0x51, 0x93, + 0x9a, 0x3c, 0x6a, 0xf7, 0xc4, 0x51, 0x19, 0xcc, 0x6d, 0x0c, 0x80, 0x77, 0x81, 0x22, 0x61, 0x94, + 0x76, 0xa2, 0x67, 0x63, 0xf1, 0x0b, 0x29, 0x19, 0xf4, 0x0b, 0xed, 0xbd, 0x21, 0x8e, 0xe7, 0x38, + 0x1c, 0x97, 0x0e, 0xc5, 0x59, 0xe6, 0x90, 0x9e, 0x7d, 0x22, 0x98, 0xa2, 0x92, 0x56, 0x17, 0xd8, + 0x56, 0xac, 0x1c, 0x53, 0x01, 0x28, 0xae, 0x39, 0x97, 0x61, 0xcb, 0x51, 0x72, 0xe8, 0x3f, 0xe2, + 0xaf, 0xe5, 0x28, 0x92, 0xf6, 0xaa, 0x69, 0x30, 0x1d, 0x86, 0xcb, 0xfb, 0x7d, 0x09, 0x28, 0x65, + 0x3c, 0x43, 0x5b, 0x76, 0x9d, 0x5d, 0x52, 0x23, 0x71, 0x7f, 0xfc, 0x9f, 0x11, 0x76, 0x10, 0x09, + 0xc3, 0xd8, 0xf5, 0x17, 0x16, 0x83, 0x25, 0x59, 0xc2, 0x94, 0x82, 0x25, 0x4c, 0xed, 0xad, 0x42, + 0x0e, 0x23, 0xa2, 0xa5, 0x64, 0xdf, 0xd4, 0x7e, 0x4b, 0x02, 0x85, 0x72, 0xd7, 0xb1, 0x21, 0x7b, + 0x68, 0x74, 0xe8, 0xe9, 0xc4, 0xc1, 0xfb, 0x18, 0xda, 0x73, 0x25, 0x51, 0x5b, 0x23, 0x12, 0x00, + 0x2a, 0x5b, 0x50, 0xb6, 0x62, 0x83, 0x54, 0x22, 0xe9, 0xec, 0x05, 0xfa, 0x55, 0x09, 0xcc, 0x90, + 0xc8, 0x64, 0xa5, 0x6e, 0x57, 0x7b, 0x4c, 0x24, 0xd4, 0x01, 0x21, 0x07, 0xb5, 0x5f, 0x16, 0x3e, + 0x14, 0x15, 0xd6, 0x2a, 0xa4, 0x9d, 0x22, 0x44, 0x5b, 0xba, 0x33, 0x3a, 0x62, 0x3b, 0x71, 0x43, + 0x19, 0xca, 0x5e, 0xd4, 0x7f, 0x20, 0x21, 0x03, 0xc0, 0xbe, 0xb4, 0xee, 0xc2, 0xcb, 0x16, 0xbc, + 0xa2, 0x3d, 0x3a, 0x12, 0xf6, 0xc1, 0xb0, 0x4b, 0x6f, 0x12, 0x5e, 0xc4, 0x61, 0x48, 0xc6, 0x6e, + 0x84, 0xcd, 0x76, 0xa3, 0x4c, 0xb4, 0x17, 0xef, 0x8f, 0x85, 0xc5, 0x90, 0x31, 0xd8, 0xec, 0x82, + 0x6b, 0x36, 0xf1, 0x5c, 0x64, 0x2f, 0xd8, 0x8f, 0x4e, 0x81, 0xe9, 0x0d, 0xdb, 0xeb, 0x75, 0x4d, + 0x6f, 0x47, 0xfb, 0x57, 0x19, 0x14, 0xc9, 0x75, 0x9b, 0xda, 0x77, 0x71, 0xd1, 0x5d, 0x9e, 0xbd, + 0x07, 0xdd, 0xc0, 0x81, 0x87, 0x3c, 0x44, 0xf6, 0x91, 0xc4, 0xd8, 0x47, 0xda, 0x07, 0x65, 0xd1, + 0x49, 0x6a, 0x50, 0x28, 0xbd, 0xdf, 0x33, 0x3e, 0xa0, 0x48, 0xcf, 0x6a, 0xfb, 0x7b, 0x2e, 0xf4, + 0x06, 0x06, 0x14, 0x89, 0xa5, 0xb2, 0x4e, 0xbe, 0x32, 0xc2, 0xcf, 0x35, 0x13, 0x4c, 0xd1, 0xc4, + 0x03, 0x9b, 0x51, 0x07, 0x23, 0x1e, 0x9c, 0x02, 0x45, 0xd3, 0xf5, 0x2d, 0xcf, 0xa7, 0xdb, 0xb3, + 0xf4, 0x09, 0x75, 0x97, 0xe4, 0xdf, 0x86, 0xdb, 0x0d, 0xe2, 0x40, 0x85, 0x09, 0xda, 0xaf, 0x08, + 0xcd, 0x1f, 0x93, 0x6b, 0x9e, 0x0e, 0xf2, 0xfb, 0x47, 0x58, 0xe1, 0x7e, 0x14, 0xb8, 0xca, 0x28, + 0xb5, 0xf4, 0x4d, 0x12, 0x36, 0x28, 0x8c, 0x10, 0xd4, 0xd1, 0xde, 0x23, 0x33, 0xeb, 0x77, 0xfb, + 0xdc, 0x18, 0x41, 0xa5, 0x18, 0x8d, 0x11, 0x61, 0x42, 0xc2, 0x5e, 0x37, 0xb7, 0x84, 0x2b, 0x0b, + 0x2f, 0xe1, 0x6a, 0xbf, 0x24, 0xbc, 0x17, 0x15, 0x8a, 0x72, 0xc8, 0x1a, 0x60, 0xd2, 0x75, 0x7c, + 0x1f, 0x16, 0xda, 0x57, 0x1a, 0x56, 0xd2, 0x11, 0xc2, 0xf6, 0xcd, 0x53, 0x40, 0x2a, 0x55, 0xb5, + 0x1f, 0x9d, 0x02, 0x73, 0xe7, 0x5d, 0xcb, 0xb7, 0xec, 0xed, 0x96, 0xe3, 0x74, 0x3d, 0xed, 0x1b, + 0xcc, 0x46, 0xc5, 0x53, 0x40, 0xb1, 0xed, 0xd8, 0x5b, 0xd6, 0x36, 0x15, 0xe3, 0x19, 0xae, 0x72, + 0xa5, 0xea, 0xe2, 0xba, 0xeb, 0x5c, 0xb6, 0x3a, 0xd0, 0x2d, 0xe3, 0x5c, 0x06, 0xcd, 0x8d, 0xf4, + 0x98, 0x09, 0xbc, 0x76, 0x7b, 0xff, 0x57, 0x6c, 0x79, 0x61, 0xe4, 0x17, 0x9a, 0xc8, 0xc4, 0x5d, + 0xab, 0x82, 0xe9, 0xae, 0x69, 0x6f, 0xef, 0x05, 0x33, 0xef, 0xfe, 0x5d, 0xd4, 0x38, 0x4a, 0x35, + 0xfa, 0x91, 0x11, 0x7e, 0x8e, 0x9d, 0xdc, 0x90, 0xa9, 0x4f, 0xda, 0x1e, 0xfe, 0x7f, 0xf6, 0x63, + 0x39, 0x30, 0xcb, 0x14, 0xaa, 0xce, 0x82, 0xa9, 0x8a, 0xbe, 0x5c, 0xda, 0xa8, 0xb5, 0x94, 0x63, + 0x48, 0x8a, 0xcd, 0x8d, 0xb5, 0xb5, 0x92, 0x51, 0xfd, 0x1e, 0x5d, 0xc9, 0xa1, 0x77, 0x2b, 0x46, + 0x09, 0x3d, 0x2b, 0x12, 0x7a, 0x68, 0xae, 0x36, 0x8c, 0x96, 0x5e, 0x57, 0x64, 0x64, 0x8f, 0xea, + 0xcf, 0x5a, 0x2f, 0xd5, 0x2b, 0x4a, 0x1e, 0xfd, 0x5f, 0xda, 0xa8, 0xd5, 0xf4, 0x96, 0x52, 0x88, + 0x42, 0xb1, 0x15, 0x51, 0x72, 0xb9, 0xd4, 0xdc, 0x28, 0xd5, 0x94, 0x29, 0x94, 0xbc, 0xbc, 0x51, + 0xaf, 0x5f, 0x50, 0xa6, 0x51, 0x11, 0xe5, 0x46, 0x7d, 0xb9, 0x5a, 0xd1, 0xeb, 0x2d, 0x65, 0x46, + 0xbd, 0x0a, 0x1c, 0x6f, 0xb6, 0x8c, 0x52, 0x75, 0x65, 0xb5, 0xb5, 0xdc, 0x30, 0xce, 0x97, 0x8c, + 0x8a, 0x02, 0x54, 0x05, 0xcc, 0xad, 0x1b, 0x8d, 0x65, 0x1d, 0xc7, 0xf2, 0x28, 0xd5, 0x94, 0x59, + 0xf4, 0x55, 0xcb, 0x28, 0xd5, 0x9b, 0xb5, 0x52, 0x4b, 0x57, 0xe6, 0xce, 0xde, 0x07, 0xa6, 0x83, + 0xea, 0xaa, 0x45, 0x20, 0xe9, 0x75, 0xe5, 0x18, 0xfe, 0x6d, 0x2a, 0x39, 0xf4, 0xbb, 0x8c, 0xf8, + 0x2d, 0x02, 0xa9, 0xa2, 0x2b, 0x32, 0xfa, 0xad, 0xb6, 0x94, 0x3c, 0xfa, 0x5d, 0x47, 0x2c, 0x16, + 0x81, 0xb4, 0x5a, 0x55, 0x8a, 0xe8, 0xb7, 0xb5, 0xaa, 0x4c, 0xf1, 0xb7, 0x6e, 0x27, 0xf6, 0xc2, + 0x07, 0x25, 0x1f, 0x63, 0x68, 0xf8, 0xd1, 0x1c, 0x19, 0xff, 0xd7, 0x5e, 0x29, 0x89, 0xf4, 0x75, + 0xc9, 0xf4, 0xd3, 0x35, 0x9a, 0xb7, 0xe4, 0xc6, 0xd8, 0x6a, 0x54, 0x0d, 0x9c, 0xd2, 0xeb, 0x95, + 0xf5, 0x46, 0xb5, 0xde, 0x22, 0x01, 0xb3, 0xf4, 0x52, 0x79, 0x15, 0xe3, 0x0c, 0x11, 0x82, 0x6b, + 0x8d, 0x8a, 0x5e, 0xc3, 0x2f, 0x96, 0x1b, 0x1b, 0xf5, 0x8a, 0xb2, 0x85, 0xca, 0x2a, 0x6d, 0xb4, + 0x56, 0x37, 0x0d, 0xfd, 0x99, 0x1b, 0x55, 0x43, 0xaf, 0x28, 0xdb, 0x88, 0x46, 0xad, 0x54, 0x5f, + 0xd9, 0x28, 0xad, 0xd0, 0xfd, 0xc2, 0x8d, 0xf5, 0xf5, 0x06, 0xde, 0x31, 0xdc, 0xd1, 0xfe, 0x21, + 0x0f, 0xa6, 0x4b, 0x7b, 0xbe, 0xb3, 0x65, 0x75, 0xbb, 0xda, 0x43, 0xd2, 0xe1, 0x9b, 0x62, 0x89, + 0x6b, 0x8a, 0x07, 0x1a, 0x50, 0x50, 0x56, 0xd8, 0x78, 0x82, 0x04, 0xa6, 0x1d, 0x9e, 0x8e, 0x9c, + 0xb1, 0x65, 0xba, 0xd3, 0x4c, 0x1e, 0x89, 0x23, 0xae, 0x4d, 0x5b, 0x16, 0x7e, 0x43, 0x1f, 0xcf, + 0xde, 0x0f, 0xe6, 0x58, 0x4a, 0x38, 0xa8, 0x54, 0x69, 0x85, 0x44, 0x9d, 0x0a, 0xe2, 0xcc, 0x91, + 0xa8, 0x53, 0xf8, 0x50, 0x80, 0x84, 0xdb, 0x4b, 0xb5, 0x55, 0x43, 0x7a, 0x7a, 0x1c, 0xcc, 0x56, + 0xf4, 0x66, 0xd9, 0xa8, 0x62, 0x3f, 0x75, 0x25, 0xcf, 0x7b, 0x19, 0x24, 0x5a, 0x66, 0x7c, 0x8d, + 0x44, 0x95, 0xf2, 0x5b, 0x42, 0xf6, 0x56, 0x3c, 0xed, 0x74, 0x0a, 0xf9, 0x92, 0x47, 0x9a, 0x42, + 0x6a, 0x2f, 0xc9, 0x93, 0x75, 0xb2, 0xe6, 0xde, 0xee, 0xae, 0xe9, 0xee, 0x73, 0xfe, 0x6a, 0xa3, + 0xea, 0x5d, 0xfc, 0xf8, 0x9e, 0x18, 0xa1, 0x06, 0x99, 0x50, 0x3d, 0xd7, 0xd9, 0xed, 0x05, 0x7d, + 0x35, 0x7d, 0xd2, 0xfe, 0x1f, 0xe1, 0x99, 0x63, 0xa9, 0xba, 0xc8, 0x54, 0x66, 0x84, 0xa1, 0xfd, + 0x07, 0x24, 0x91, 0x59, 0x64, 0x62, 0x31, 0xdf, 0xee, 0x1a, 0xf1, 0x37, 0x79, 0x70, 0x15, 0x8d, + 0x3e, 0x12, 0xae, 0x3f, 0x20, 0x53, 0xf5, 0x35, 0x99, 0x6a, 0x06, 0x35, 0xa8, 0xe5, 0xc8, 0xa0, + 0x66, 0x36, 0xbc, 0xf3, 0x82, 0x1b, 0xde, 0x6f, 0x13, 0x3e, 0xf4, 0x50, 0xaa, 0x2e, 0x0e, 0xa8, + 0xe3, 0x64, 0xb6, 0xe5, 0x5f, 0x20, 0x89, 0xac, 0xb6, 0x0a, 0x71, 0xf8, 0xed, 0xae, 0x6b, 0xef, + 0xc8, 0x81, 0x05, 0x5e, 0x55, 0xd4, 0x27, 0x83, 0xe9, 0x1e, 0x4d, 0xa1, 0x72, 0x39, 0x1d, 0xa7, + 0x5c, 0x46, 0x98, 0x13, 0x41, 0x04, 0xed, 0x4e, 0xcf, 0xb1, 0xec, 0x70, 0x5d, 0x3e, 0x78, 0x46, + 0xf3, 0x4e, 0x3c, 0x75, 0x08, 0x62, 0xd1, 0xe1, 0x87, 0x28, 0x02, 0x69, 0x9e, 0x89, 0x40, 0x8a, + 0x84, 0xe8, 0xc3, 0x5d, 0x7c, 0xa3, 0xca, 0x9e, 0x4b, 0x1c, 0x5e, 0x24, 0x83, 0x4d, 0x3a, 0xfb, + 0x74, 0x30, 0x1d, 0x94, 0x8f, 0xac, 0xbb, 0x46, 0xad, 0x56, 0x5a, 0x2b, 0x91, 0x85, 0xca, 0xc6, + 0xba, 0x5e, 0x2f, 0x55, 0x95, 0x1c, 0x1a, 0xe8, 0x6a, 0x6b, 0xcd, 0xd6, 0x46, 0xa5, 0xda, 0x50, + 0x24, 0xfc, 0x84, 0x32, 0x95, 0xd7, 0xd7, 0x15, 0x59, 0x7b, 0xe3, 0x14, 0x98, 0x5a, 0x31, 0xbb, + 0x5d, 0xe8, 0xee, 0x6b, 0x5f, 0x95, 0x80, 0x12, 0xcc, 0x0e, 0xd6, 0x4c, 0xdb, 0xda, 0x82, 0x9e, + 0x9f, 0xbc, 0x50, 0xf1, 0x3e, 0xe1, 0x6b, 0x96, 0x68, 0x19, 0x8b, 0xfd, 0xf4, 0x63, 0x74, 0xfc, + 0x36, 0x90, 0xb7, 0xec, 0x2d, 0x87, 0x2e, 0x57, 0xf4, 0xfb, 0xdb, 0x04, 0x1f, 0xe3, 0x6d, 0x03, + 0x9c, 0x51, 0xf0, 0xa6, 0x25, 0x41, 0x2e, 0xb2, 0x5f, 0xb5, 0x78, 0x47, 0x1e, 0xcc, 0x07, 0x4c, + 0x54, 0xed, 0x0e, 0x7c, 0x90, 0xdd, 0x06, 0xfd, 0xc9, 0xbc, 0x68, 0xf0, 0x9b, 0xfe, 0xfa, 0x60, + 0x52, 0x31, 0x22, 0x6d, 0x01, 0xd0, 0x36, 0x7d, 0xb8, 0xed, 0xb8, 0x56, 0xb8, 0x16, 0xf1, 0xe4, + 0x34, 0xd4, 0xca, 0xe4, 0xeb, 0x7d, 0x83, 0xa1, 0xa3, 0xde, 0x03, 0x66, 0x61, 0x18, 0x6d, 0x30, + 0xd8, 0x26, 0x4d, 0xc4, 0x8b, 0xcd, 0xaf, 0xfd, 0x81, 0x50, 0x8c, 0x1d, 0x91, 0x6a, 0xa6, 0xc3, + 0x6c, 0x73, 0xb4, 0xae, 0x67, 0xa3, 0xbe, 0x56, 0x32, 0x9a, 0xab, 0xa5, 0x5a, 0xad, 0x5a, 0x5f, + 0x09, 0xc3, 0xde, 0xaa, 0x60, 0xa1, 0xd2, 0x38, 0x5f, 0x67, 0xe2, 0x12, 0xe7, 0xb5, 0x75, 0x30, + 0x1d, 0xc8, 0x6b, 0xd0, 0x29, 0x2a, 0x56, 0x66, 0xf4, 0x14, 0x15, 0x93, 0x84, 0x4c, 0x43, 0xab, + 0x1d, 0xba, 0xd6, 0xe3, 0xff, 0xda, 0x6f, 0x98, 0xa0, 0x80, 0xfd, 0x59, 0xb4, 0x77, 0xe1, 0x79, + 0x71, 0xaf, 0x6b, 0xb6, 0xa1, 0xb6, 0x9b, 0x62, 0x25, 0x3c, 0xb8, 0xf7, 0x53, 0x3a, 0x70, 0xef, + 0x27, 0xfe, 0x4b, 0x47, 0x8c, 0x93, 0x83, 0x7c, 0x68, 0x0c, 0x92, 0x85, 0x0f, 0x47, 0x93, 0xe8, + 0xd9, 0x44, 0x5c, 0x6f, 0x28, 0x9b, 0x31, 0x2a, 0x19, 0xcf, 0x53, 0xba, 0x55, 0x60, 0x31, 0x1f, + 0xa8, 0x24, 0x8e, 0xb2, 0x6f, 0xf1, 0x5f, 0xca, 0x83, 0x42, 0xb3, 0xd7, 0xb5, 0x7c, 0xed, 0xe7, + 0xa4, 0xb1, 0x60, 0x46, 0xee, 0x6a, 0x95, 0x87, 0xde, 0xd5, 0x1a, 0xf9, 0x4b, 0xe6, 0x05, 0xfc, + 0x25, 0x5b, 0xf0, 0x41, 0x9f, 0xf7, 0x97, 0xbc, 0x93, 0x4e, 0xdb, 0x88, 0xb7, 0xe5, 0x63, 0x07, + 0x88, 0x14, 0x57, 0x6b, 0xc0, 0x9d, 0x08, 0x67, 0x9f, 0x48, 0x43, 0xb3, 0x03, 0x50, 0x5c, 0x6a, + 0xb4, 0x5a, 0x8d, 0x35, 0xe5, 0x18, 0x9e, 0x7e, 0x35, 0xd6, 0x49, 0xa0, 0xdc, 0x6a, 0xbd, 0xae, + 0x1b, 0xdc, 0x8c, 0x8b, 0xbf, 0xb8, 0x2f, 0x71, 0x82, 0xc5, 0x97, 0x9d, 0xa5, 0x7a, 0x89, 0x2d, + 0x82, 0xc7, 0xf3, 0x93, 0xbd, 0x72, 0xfd, 0xb4, 0x0c, 0x0a, 0x6b, 0xd0, 0xdd, 0x86, 0xda, 0xb3, + 0x53, 0x38, 0xd8, 0x6d, 0x59, 0xae, 0x47, 0x42, 0xeb, 0x47, 0x0e, 0x76, 0x6c, 0x9a, 0x7a, 0x23, + 0x98, 0xf7, 0x60, 0xdb, 0xb1, 0x3b, 0x41, 0x26, 0xd2, 0x1f, 0xf1, 0x89, 0xda, 0xcb, 0x53, 0x42, + 0x86, 0x19, 0x1d, 0x8b, 0x97, 0x5c, 0x1a, 0x60, 0x06, 0x95, 0x9a, 0x3d, 0x30, 0x5f, 0x97, 0xd1, + 0x47, 0xbd, 0x7d, 0xed, 0xe5, 0xc2, 0x9e, 0x8f, 0xb7, 0x82, 0xe2, 0xc5, 0xe0, 0x8e, 0x26, 0x39, + 0xb6, 0x3f, 0xa6, 0x79, 0xd4, 0x25, 0x70, 0xc2, 0x83, 0x5d, 0xd8, 0xf6, 0x61, 0x07, 0x35, 0x5d, + 0x63, 0x68, 0xa7, 0x70, 0x30, 0xbb, 0xf6, 0x3b, 0x2c, 0x80, 0x77, 0xf3, 0x00, 0xde, 0x34, 0x40, + 0x94, 0xa8, 0x42, 0xf1, 0x73, 0x13, 0x54, 0x8d, 0x66, 0xd7, 0x09, 0x0d, 0xdf, 0xe0, 0x19, 0xbd, + 0xdb, 0xf1, 0x77, 0xbb, 0xf8, 0x1d, 0x3d, 0x1a, 0x1c, 0x3c, 0xab, 0x8b, 0x60, 0xca, 0xb4, 0xf7, + 0xf1, 0xab, 0x7c, 0x42, 0xad, 0x83, 0x4c, 0xda, 0xab, 0x42, 0xe4, 0xef, 0xe5, 0x90, 0x7f, 0xbc, + 0x18, 0xbb, 0xd9, 0x03, 0xff, 0x43, 0x53, 0xa0, 0xb0, 0x6e, 0x7a, 0x3e, 0xd4, 0xfe, 0xa7, 0x2c, + 0x8a, 0xfc, 0x4d, 0x60, 0x61, 0xcb, 0x69, 0xef, 0x79, 0xb0, 0xc3, 0x37, 0xca, 0xbe, 0xd4, 0x71, + 0x60, 0xae, 0xde, 0x02, 0x94, 0x20, 0x91, 0x92, 0x0d, 0x5c, 0x60, 0x0f, 0xa4, 0xe3, 0x6b, 0xe0, + 0xbc, 0x75, 0xd3, 0xf5, 0x1b, 0x5b, 0x38, 0x2d, 0xbc, 0x06, 0x8e, 0x4d, 0xe4, 0xa0, 0x2f, 0x26, + 0x40, 0x3f, 0x15, 0x0f, 0xfd, 0xb4, 0x00, 0xf4, 0x6a, 0x09, 0x4c, 0x6f, 0x59, 0x5d, 0x88, 0x3f, + 0x98, 0xc1, 0x1f, 0x0c, 0x1a, 0x93, 0xb0, 0xec, 0xc3, 0x31, 0x69, 0xd9, 0xea, 0x42, 0x23, 0xfc, + 0x2c, 0x98, 0xc8, 0x80, 0x68, 0x22, 0x53, 0x23, 0x27, 0xe1, 0x90, 0xe1, 0x65, 0x9b, 0xbb, 0x30, + 0xd8, 0xf8, 0xb6, 0xe9, 0xb1, 0xf4, 0x8e, 0xe9, 0x9b, 0x18, 0x8c, 0x39, 0x03, 0xff, 0xe7, 0x7d, + 0xb2, 0xe5, 0x7e, 0x9f, 0xec, 0xe7, 0xcb, 0xe9, 0x7a, 0xc4, 0x80, 0xd9, 0x98, 0x16, 0x75, 0x31, + 0x00, 0x88, 0x58, 0x8a, 0xe1, 0x33, 0x02, 0xa6, 0x6d, 0xba, 0xd0, 0x5f, 0x67, 0xbd, 0xa0, 0x0b, + 0x06, 0x9f, 0x88, 0x0f, 0xe1, 0x78, 0x4d, 0x73, 0x97, 0x5c, 0xf3, 0x56, 0x46, 0xef, 0xe8, 0xe1, + 0x8a, 0x03, 0xe9, 0x51, 0xff, 0x5b, 0x18, 0x77, 0xff, 0x3b, 0xa8, 0x8e, 0xd9, 0x37, 0xc3, 0xd7, + 0xe6, 0x81, 0x5c, 0xde, 0xf3, 0x1f, 0xd1, 0xdd, 0xef, 0xb7, 0x84, 0x7d, 0xcc, 0x69, 0x7f, 0xb6, + 0xe7, 0x1f, 0x6d, 0xef, 0x9b, 0x52, 0x4b, 0xc4, 0x7c, 0xd9, 0xe3, 0xea, 0x96, 0xbd, 0x8e, 0xbc, + 0x4d, 0x0e, 0x8f, 0x46, 0x3d, 0x94, 0x3b, 0xbc, 0x69, 0xae, 0x91, 0xfe, 0x89, 0xe9, 0x19, 0xc2, + 0xe7, 0xa0, 0xe3, 0xc9, 0x73, 0x37, 0x13, 0x60, 0xd7, 0x56, 0x2c, 0xca, 0x39, 0x83, 0x3c, 0x68, + 0xaf, 0x10, 0x3e, 0x30, 0x4a, 0xc4, 0x96, 0x78, 0x8c, 0x27, 0x9d, 0x4d, 0xf5, 0x1a, 0xa1, 0x63, + 0xa3, 0x09, 0xc5, 0x66, 0x0f, 0xd8, 0xdf, 0xb3, 0xc7, 0x74, 0x4a, 0x87, 0x46, 0x4c, 0x7b, 0xb5, + 0xf0, 0x82, 0x3e, 0xa9, 0xf6, 0x90, 0xbd, 0xfa, 0x74, 0xf2, 0x16, 0x73, 0x14, 0x4b, 0x2c, 0x78, + 0x02, 0xf7, 0xd6, 0xca, 0xa0, 0x48, 0x16, 0x7e, 0xb5, 0x37, 0x0b, 0x37, 0x11, 0xd4, 0x1b, 0xf1, + 0xc7, 0x77, 0xc2, 0xe7, 0x34, 0x6b, 0x0e, 0xdc, 0x31, 0x9f, 0x7c, 0xaa, 0x63, 0x3e, 0x7c, 0x04, + 0x16, 0x81, 0x76, 0x44, 0xea, 0x98, 0xf1, 0x74, 0x32, 0x4d, 0x0b, 0x1b, 0xc8, 0x50, 0xf6, 0x78, + 0xbf, 0xb0, 0x00, 0xe6, 0x48, 0xd1, 0xe4, 0x7c, 0xa1, 0xf6, 0x1e, 0xe9, 0xdb, 0x07, 0x75, 0xb5, + 0x0e, 0xe6, 0xae, 0x60, 0xb6, 0xc9, 0x7d, 0xb4, 0x74, 0xe5, 0xe2, 0x96, 0xc4, 0x75, 0x0f, 0x52, + 0xcf, 0xe0, 0x06, 0x5b, 0xee, 0x7b, 0x24, 0x63, 0xb2, 0xc1, 0x42, 0x0e, 0x4f, 0x14, 0xb1, 0x91, + 0xc5, 0x26, 0xa9, 0xa7, 0x40, 0xf1, 0xb2, 0x05, 0xaf, 0x54, 0x3b, 0xd4, 0xba, 0xa5, 0x4f, 0xda, + 0xaf, 0x0a, 0xfb, 0x4c, 0xb2, 0x70, 0x53, 0x5e, 0xb2, 0xd5, 0x42, 0x31, 0xcf, 0xc9, 0xa1, 0x6c, + 0x4d, 0x20, 0x1a, 0x90, 0x44, 0xee, 0xcc, 0xa6, 0x61, 0xe6, 0xcb, 0x29, 0x14, 0x31, 0xce, 0x70, + 0xe6, 0x83, 0xf0, 0x25, 0x9e, 0x35, 0x27, 0x02, 0x88, 0xca, 0x1f, 0x4b, 0x9f, 0x2f, 0x16, 0x19, + 0x6e, 0x48, 0xd1, 0xd9, 0x4b, 0xfe, 0x75, 0x32, 0x98, 0x69, 0x42, 0x7f, 0xd9, 0x82, 0xdd, 0x8e, + 0xa7, 0xb9, 0x87, 0x37, 0x8d, 0x6e, 0x03, 0xc5, 0x2d, 0x4c, 0x6c, 0xd8, 0xe6, 0x24, 0xcd, 0xa6, + 0xbd, 0x56, 0x12, 0xf5, 0x03, 0xa2, 0xab, 0x6f, 0x01, 0xb7, 0x63, 0x81, 0x49, 0xec, 0x34, 0x5d, + 0x72, 0xc9, 0x13, 0xb8, 0xc6, 0x47, 0x06, 0x73, 0x78, 0xfb, 0x1f, 0xfa, 0xa5, 0xae, 0xb5, 0x6d, + 0x6b, 0x7b, 0x63, 0x68, 0x21, 0xea, 0xed, 0xa0, 0x60, 0x22, 0x6a, 0xd4, 0xdd, 0x4d, 0x1b, 0xd8, + 0x79, 0xe2, 0xf2, 0x0c, 0x92, 0x31, 0xc5, 0xa5, 0x19, 0x91, 0x62, 0x07, 0x3c, 0x4f, 0xf0, 0xd2, + 0x8c, 0xa1, 0x85, 0x67, 0x8f, 0xd8, 0x57, 0x64, 0x70, 0x92, 0x32, 0x70, 0x0e, 0xba, 0xbe, 0xd5, + 0x36, 0xbb, 0x04, 0xb9, 0x17, 0xe7, 0xc6, 0x01, 0xdd, 0x2a, 0x98, 0xbf, 0xcc, 0x92, 0xa5, 0x10, + 0x9e, 0x1d, 0x08, 0x21, 0xc7, 0x80, 0xc1, 0x7f, 0x98, 0xe2, 0xf2, 0x01, 0x4e, 0xaa, 0x1c, 0xcd, + 0x09, 0x5e, 0x3e, 0x20, 0xcc, 0x44, 0xf6, 0x10, 0xbf, 0x8c, 0x06, 0xd5, 0x8c, 0xba, 0xcf, 0x3f, + 0x14, 0xc6, 0x76, 0x03, 0xcc, 0x62, 0x2c, 0xc9, 0x87, 0x74, 0x19, 0x22, 0x41, 0x89, 0xc3, 0x7e, + 0x87, 0x5e, 0x97, 0x1e, 0x7e, 0x6b, 0xb0, 0x74, 0xb4, 0xf3, 0x00, 0x44, 0xaf, 0xd8, 0x4e, 0x3a, + 0x17, 0xd7, 0x49, 0x4b, 0x62, 0x9d, 0xf4, 0x9b, 0x84, 0xc3, 0x1c, 0x0e, 0x66, 0xfb, 0xf0, 0xea, + 0x21, 0x16, 0xe0, 0x6e, 0x78, 0xe9, 0xd9, 0xeb, 0xc5, 0xab, 0xa8, 0x5e, 0x54, 0xf6, 0x7a, 0x5d, + 0xab, 0x8d, 0xe6, 0x53, 0x9f, 0x18, 0xcb, 0x7c, 0x8a, 0xed, 0x0f, 0xe4, 0xbe, 0xfe, 0xe0, 0x10, + 0x96, 0xf4, 0xcd, 0xe0, 0x38, 0x29, 0xa2, 0x1c, 0xb2, 0x55, 0x20, 0x41, 0xdc, 0xfa, 0x92, 0xf9, + 0x88, 0xe2, 0x82, 0x4a, 0x10, 0x0a, 0x61, 0x84, 0xa5, 0xcf, 0x74, 0xc6, 0x6e, 0x5a, 0x05, 0x89, + 0xe3, 0x6c, 0x02, 0x47, 0xb2, 0xf2, 0xc4, 0xda, 0xdd, 0xc0, 0x37, 0xda, 0x6b, 0x5f, 0xcc, 0x8f, + 0x63, 0x44, 0x78, 0x06, 0xf5, 0x34, 0x95, 0x63, 0x97, 0x34, 0xa2, 0x22, 0xc3, 0x7e, 0xa4, 0x05, + 0x1f, 0xf4, 0x57, 0x8f, 0x11, 0xbf, 0x54, 0xf5, 0x16, 0x70, 0xfc, 0xa2, 0xd9, 0xbe, 0xb4, 0xed, + 0x3a, 0x7b, 0xf8, 0xee, 0x6f, 0x87, 0x5e, 0x22, 0xbe, 0x7a, 0xcc, 0xe8, 0x7f, 0xa1, 0xde, 0x11, + 0x98, 0x0e, 0x85, 0x61, 0xa6, 0xc3, 0xea, 0x31, 0x6a, 0x3c, 0xa8, 0x4f, 0x0c, 0x3b, 0x9d, 0x62, + 0x62, 0xa7, 0xb3, 0x7a, 0x2c, 0xe8, 0x76, 0xd4, 0x0a, 0x98, 0xee, 0x58, 0x97, 0xf1, 0x56, 0x35, + 0x9e, 0x75, 0x0d, 0x0b, 0x3a, 0x54, 0xb1, 0x2e, 0x93, 0x8d, 0xed, 0xd5, 0x63, 0x46, 0xf8, 0xa5, + 0xba, 0x02, 0x66, 0xf0, 0xb6, 0x00, 0x26, 0x33, 0x9d, 0x2a, 0xa0, 0xd0, 0xea, 0x31, 0x23, 0xfa, + 0x16, 0x59, 0x1f, 0x79, 0x7c, 0xee, 0xfa, 0xde, 0x60, 0xbb, 0x3d, 0x97, 0x6a, 0xbb, 0x1d, 0xc9, + 0x82, 0x6c, 0xb8, 0x9f, 0x02, 0x85, 0x36, 0x96, 0xb0, 0x44, 0x25, 0x4c, 0x1e, 0xd5, 0xbb, 0x41, + 0x7e, 0xd7, 0x74, 0x83, 0xc9, 0xf3, 0x4d, 0xc3, 0xe9, 0xae, 0x99, 0xee, 0x25, 0x84, 0x20, 0xfa, + 0x6a, 0x69, 0x0a, 0x14, 0xb0, 0xe0, 0xc2, 0x3f, 0xda, 0xdb, 0xf2, 0xc4, 0x0c, 0x29, 0x3b, 0x36, + 0x1a, 0xf6, 0x5b, 0x4e, 0x70, 0x38, 0xfd, 0x57, 0x73, 0xe3, 0xb1, 0x20, 0xaf, 0x62, 0xae, 0xfa, + 0xb0, 0xad, 0x67, 0xef, 0xc1, 0xfb, 0xe1, 0x3e, 0x5d, 0x12, 0x1d, 0xf4, 0x4a, 0x3d, 0x03, 0x80, + 0x4f, 0x4f, 0xea, 0x85, 0x41, 0x4c, 0x99, 0x94, 0x68, 0xf9, 0xa0, 0x30, 0xdc, 0x51, 0xe5, 0x77, + 0x46, 0x30, 0x5d, 0xfa, 0x05, 0x11, 0x3f, 0x03, 0xef, 0x5a, 0x36, 0x53, 0xe7, 0xe0, 0x31, 0x65, + 0xa7, 0x94, 0xd6, 0xa8, 0x19, 0xc2, 0x5e, 0xf6, 0x7d, 0xd3, 0x5b, 0xf2, 0xe4, 0xb6, 0x03, 0x72, + 0x02, 0x5a, 0x7f, 0xd0, 0xf2, 0x7c, 0xcb, 0xde, 0xa6, 0xe7, 0x9b, 0x3f, 0x3b, 0x16, 0xa5, 0x19, + 0x30, 0xe0, 0xc8, 0x03, 0x07, 0x9c, 0x03, 0x01, 0x82, 0xf2, 0x43, 0x02, 0x04, 0x15, 0xd2, 0xad, + 0x1c, 0x7e, 0x84, 0xd5, 0x9f, 0x75, 0x5e, 0x7f, 0xee, 0x8a, 0x01, 0x68, 0x90, 0x5c, 0xc6, 0x62, + 0xdf, 0xbc, 0x2b, 0xd4, 0x94, 0x26, 0xa7, 0x29, 0xf7, 0x8e, 0xce, 0x48, 0xf6, 0xda, 0xf2, 0xa1, + 0x3c, 0xb8, 0x2a, 0x62, 0xa6, 0x0e, 0xaf, 0x50, 0x45, 0xf9, 0xfd, 0xb1, 0x28, 0x4a, 0x7a, 0x47, + 0xe7, 0xac, 0x35, 0xe6, 0x37, 0x85, 0xcf, 0xed, 0xf7, 0x03, 0x15, 0xca, 0x26, 0x46, 0x59, 0x4e, + 0x81, 0x22, 0xe9, 0x61, 0x28, 0x34, 0xf4, 0x29, 0x65, 0x77, 0x23, 0x76, 0xda, 0x5f, 0x94, 0xb7, + 0x09, 0xe8, 0x0f, 0x5d, 0xd7, 0x68, 0xed, 0xb9, 0x76, 0xd5, 0xf6, 0x1d, 0xed, 0x07, 0xc7, 0xa2, + 0x38, 0xa1, 0x37, 0x9c, 0x3c, 0x8a, 0x37, 0xdc, 0x48, 0xab, 0x1c, 0x41, 0x0d, 0x8e, 0x64, 0x95, + 0x23, 0xa6, 0xf0, 0xec, 0xf1, 0x7b, 0xa7, 0x0c, 0x4e, 0xd1, 0xc9, 0xd6, 0x12, 0x6f, 0x21, 0x6a, + 0x17, 0xc6, 0x01, 0xe4, 0xc9, 0xc0, 0x4c, 0xa2, 0x7e, 0xf4, 0xf8, 0x81, 0x8f, 0x52, 0x90, 0x78, + 0x9b, 0x25, 0x37, 0x1d, 0xec, 0xe3, 0x70, 0x2c, 0x48, 0x89, 0x5d, 0x62, 0x99, 0x82, 0x8d, 0xec, + 0x31, 0x7b, 0xa9, 0x0c, 0x8a, 0x24, 0x46, 0x82, 0xb6, 0x91, 0x89, 0xc3, 0x04, 0x7f, 0x3f, 0x8b, + 0xc0, 0x8e, 0x1c, 0xe1, 0x26, 0xb3, 0xf8, 0x11, 0x69, 0xf6, 0xe2, 0x06, 0xb2, 0x32, 0x01, 0x17, + 0x42, 0x09, 0xcc, 0x36, 0xa1, 0x5f, 0x36, 0x5d, 0xd7, 0x32, 0xb7, 0xc7, 0xe5, 0xf1, 0x2d, 0xea, + 0x3d, 0xac, 0x7d, 0x23, 0x27, 0x7a, 0x96, 0x3d, 0x5c, 0x08, 0x0f, 0x58, 0x8d, 0x89, 0x02, 0xfe, + 0x7a, 0xa1, 0xf3, 0xea, 0xc3, 0xa8, 0x4d, 0xc0, 0x63, 0x5b, 0x02, 0x53, 0x41, 0x1c, 0x8c, 0xdb, + 0xb8, 0xd8, 0x28, 0x3b, 0xfe, 0x6e, 0x70, 0x0c, 0x06, 0xff, 0x3f, 0x18, 0x7f, 0x41, 0x7b, 0x65, + 0x4a, 0x47, 0xf9, 0xe4, 0x20, 0x1e, 0xe9, 0xda, 0x58, 0x1a, 0x77, 0xf8, 0xa3, 0x0a, 0xdb, 0xf1, + 0xcb, 0x53, 0x74, 0x39, 0xb2, 0x66, 0xfa, 0xf0, 0x41, 0xed, 0x0f, 0x65, 0x30, 0xd5, 0x84, 0x3e, + 0x1a, 0x6f, 0x11, 0xfb, 0x87, 0xd6, 0x70, 0x95, 0x59, 0xf1, 0xa0, 0x67, 0x6b, 0xd5, 0xfb, 0xc0, + 0x4c, 0xcf, 0x75, 0xda, 0xd0, 0xf3, 0xe8, 0xea, 0x05, 0xeb, 0xa8, 0x36, 0x68, 0xf4, 0xc7, 0xac, + 0x2d, 0xae, 0x07, 0xdf, 0x18, 0xd1, 0xe7, 0x69, 0xcd, 0x00, 0x42, 0x89, 0x56, 0x70, 0xd2, 0x66, + 0x40, 0x52, 0xe1, 0xd9, 0x03, 0xfd, 0xbb, 0x32, 0x98, 0x6b, 0x42, 0x3f, 0x94, 0x62, 0x8a, 0x4d, + 0x8e, 0x78, 0x78, 0x39, 0x28, 0xe5, 0xc3, 0x41, 0xf9, 0x4e, 0xe1, 0x4b, 0x61, 0x79, 0x69, 0x86, + 0xc4, 0xc6, 0x82, 0xe7, 0x5b, 0x84, 0xee, 0x82, 0x15, 0xe3, 0x60, 0x02, 0xc7, 0xd7, 0x1e, 0x0b, + 0x66, 0x30, 0x2f, 0xb8, 0xc1, 0xfe, 0x68, 0x3e, 0x6a, 0xbc, 0x5f, 0xc8, 0xa8, 0xf1, 0xde, 0x03, + 0x0a, 0xbb, 0xa6, 0x7b, 0x29, 0x38, 0x7c, 0xfb, 0x38, 0xb1, 0xd5, 0x2f, 0xcf, 0x20, 0x5f, 0x0d, + 0xf6, 0xd3, 0x2c, 0xa4, 0xf3, 0xd3, 0x7c, 0xbd, 0x94, 0x6a, 0x24, 0x24, 0x73, 0x87, 0x31, 0x36, + 0xf9, 0x14, 0xe3, 0x66, 0x42, 0xd9, 0xd9, 0x2b, 0xc7, 0x8b, 0x65, 0x30, 0x8d, 0xc6, 0x6d, 0x6c, + 0x8f, 0x9f, 0x3f, 0xbc, 0x3a, 0x0c, 0x36, 0xf4, 0x53, 0xf6, 0xc0, 0x81, 0x44, 0xc6, 0x67, 0xde, + 0xa7, 0xe8, 0x81, 0x93, 0x0a, 0xcf, 0x1e, 0x8f, 0x77, 0x13, 0x3c, 0x70, 0x7b, 0xd0, 0xde, 0x20, + 0x03, 0x79, 0x05, 0xfa, 0x93, 0xb6, 0x22, 0xdf, 0x2e, 0x1c, 0x5e, 0x94, 0x13, 0x18, 0xe6, 0x79, + 0x71, 0x05, 0x8e, 0xa7, 0x01, 0x89, 0xc5, 0x15, 0x15, 0x62, 0x20, 0x7b, 0xd4, 0xde, 0x4f, 0x50, + 0x23, 0x9b, 0x0b, 0x3f, 0x30, 0x86, 0x5e, 0x75, 0xb2, 0x0b, 0x1f, 0x81, 0x00, 0x31, 0x8d, 0xa3, + 0x6a, 0x6f, 0x83, 0x0a, 0xcf, 0x1e, 0xb9, 0x9f, 0x91, 0xf1, 0x25, 0x66, 0xe5, 0x1d, 0xd8, 0xbe, + 0x04, 0x3b, 0xec, 0x45, 0xce, 0xa3, 0x42, 0x77, 0x1a, 0x4c, 0xb5, 0x09, 0x35, 0x0c, 0xde, 0xb4, + 0x11, 0x3c, 0xf2, 0x37, 0x0b, 0x25, 0xde, 0x9d, 0xc5, 0x77, 0x44, 0xe4, 0xf3, 0xb1, 0xe0, 0x22, + 0x76, 0xe1, 0x95, 0x40, 0xf1, 0x13, 0x30, 0x5b, 0xc8, 0x2c, 0xa3, 0xda, 0x76, 0x6c, 0xed, 0xbf, + 0x1e, 0x1e, 0x96, 0x6b, 0xc1, 0x8c, 0xd5, 0x76, 0x6c, 0x1c, 0x02, 0x2e, 0x38, 0x04, 0x14, 0x26, + 0x04, 0x6f, 0xf5, 0x5d, 0xe7, 0x01, 0x8b, 0xee, 0x9a, 0x47, 0x09, 0xa3, 0x1a, 0x13, 0x88, 0xf5, + 0xa3, 0x32, 0x26, 0x06, 0x94, 0x9d, 0x3d, 0x64, 0x9f, 0x8c, 0xbc, 0xdb, 0x48, 0x57, 0xf8, 0x88, + 0x58, 0x05, 0x1e, 0x65, 0x38, 0x63, 0x6b, 0x71, 0x24, 0xc3, 0x59, 0x02, 0x03, 0x13, 0xb8, 0x89, + 0x30, 0xc2, 0x31, 0xf3, 0x35, 0xe0, 0x43, 0xa0, 0x33, 0x3e, 0xf3, 0x70, 0x44, 0x74, 0x8e, 0xc6, + 0x44, 0xfc, 0x30, 0x0d, 0x4f, 0x4f, 0x2d, 0x1e, 0xed, 0xbf, 0x8d, 0x03, 0x9c, 0xbb, 0x46, 0xf1, + 0x57, 0x20, 0xde, 0x0a, 0xda, 0x5b, 0x25, 0xd1, 0x10, 0x28, 0x07, 0x24, 0x88, 0xa8, 0x8c, 0x05, + 0xc1, 0x37, 0x09, 0xc5, 0x26, 0x11, 0x29, 0x3f, 0x7b, 0x00, 0x5f, 0x24, 0x83, 0x05, 0xec, 0x23, + 0xd0, 0x85, 0xa6, 0x4b, 0x3a, 0xca, 0xb1, 0x38, 0xca, 0xbf, 0x5b, 0x38, 0xc0, 0x0f, 0x2f, 0x87, + 0x88, 0x8f, 0xb1, 0x40, 0x21, 0x16, 0xdd, 0x47, 0x90, 0x85, 0x89, 0x6c, 0xa3, 0x28, 0x21, 0x0b, + 0x54, 0xc5, 0xc7, 0x83, 0x47, 0x4a, 0x8f, 0x5c, 0x5e, 0x18, 0x41, 0x63, 0x9b, 0xb0, 0x47, 0xae, + 0x08, 0x13, 0xd9, 0x63, 0xf2, 0x86, 0xdb, 0xe9, 0x82, 0x73, 0xcb, 0xbc, 0xd8, 0x85, 0xda, 0xab, + 0xf3, 0xe1, 0x89, 0xb6, 0xdf, 0x1d, 0x8b, 0x07, 0xe6, 0x21, 0x2e, 0xa3, 0x52, 0x41, 0xde, 0x75, + 0xae, 0x90, 0xa5, 0xad, 0x79, 0x03, 0xff, 0x27, 0xf1, 0x2c, 0xbb, 0x7b, 0xbb, 0x36, 0x39, 0x19, + 0x3a, 0x6f, 0x04, 0x8f, 0xea, 0x8d, 0x60, 0xfe, 0x8a, 0xe5, 0xef, 0xac, 0x42, 0xb3, 0x03, 0x5d, + 0xc3, 0xb9, 0x82, 0x3d, 0xe6, 0xa6, 0x0d, 0x3e, 0x91, 0xf7, 0x5f, 0x11, 0xb0, 0x2f, 0x91, 0x50, + 0x26, 0x73, 0xfc, 0x2d, 0x8d, 0xe5, 0x19, 0xcf, 0x55, 0xf6, 0x0a, 0xf3, 0x01, 0x19, 0xcc, 0x18, + 0xce, 0x15, 0xaa, 0x24, 0xff, 0xd7, 0xd1, 0xea, 0x48, 0xea, 0x89, 0x1e, 0x96, 0x5c, 0xc8, 0xfe, + 0xc4, 0x27, 0x7a, 0x89, 0xc5, 0x4f, 0xe4, 0xe4, 0xd2, 0x9c, 0xe1, 0x5c, 0x69, 0x42, 0x9f, 0xb4, + 0x08, 0x6d, 0x73, 0x4c, 0x4e, 0xd6, 0x96, 0x47, 0x08, 0xd2, 0x79, 0x78, 0xf8, 0x9c, 0x76, 0x17, + 0x21, 0x14, 0x50, 0xc8, 0xe2, 0xa4, 0x77, 0x11, 0x86, 0x72, 0x30, 0x81, 0x18, 0x29, 0x32, 0x98, + 0x35, 0x9c, 0x2b, 0x68, 0x68, 0x58, 0xb6, 0xba, 0xdd, 0xf1, 0x8c, 0x90, 0x69, 0x8d, 0xff, 0x40, + 0x0c, 0x01, 0x17, 0x13, 0x37, 0xfe, 0x87, 0x30, 0x90, 0x3d, 0x0c, 0xcf, 0x27, 0x8d, 0x25, 0x18, + 0xa1, 0xed, 0xf1, 0xe0, 0x30, 0x6a, 0x83, 0x08, 0xd9, 0x38, 0xb2, 0x06, 0x11, 0xc7, 0xc1, 0x44, + 0x76, 0x4e, 0x16, 0xca, 0x78, 0x98, 0x1f, 0x6f, 0x9b, 0x78, 0x6f, 0x3a, 0xd7, 0x44, 0x3a, 0xec, + 0x72, 0x8c, 0x8c, 0x05, 0x8d, 0x14, 0x2e, 0x88, 0x02, 0x3c, 0x64, 0x8f, 0xc7, 0xc7, 0x64, 0x30, + 0x47, 0x58, 0x78, 0x84, 0x58, 0x01, 0x23, 0x35, 0x2a, 0xb6, 0x06, 0x47, 0xd3, 0xa8, 0x12, 0x38, + 0x98, 0xc8, 0x7d, 0xfe, 0xc8, 0x8e, 0x1b, 0xe1, 0xf8, 0x78, 0x1c, 0x82, 0x23, 0x1b, 0x63, 0x63, + 0x3c, 0x42, 0x3e, 0x8a, 0x31, 0x76, 0x44, 0xc7, 0xc8, 0x9f, 0x1f, 0xb6, 0xa2, 0x71, 0x62, 0x70, + 0x88, 0xa6, 0x30, 0x46, 0x18, 0x46, 0x6c, 0x0a, 0x47, 0x84, 0xc4, 0x9f, 0xca, 0x00, 0x10, 0x06, + 0xd6, 0x9c, 0xcb, 0xf8, 0x22, 0xcd, 0x31, 0x74, 0x67, 0xfd, 0x6e, 0xf5, 0xf2, 0x10, 0xb7, 0xfa, + 0x94, 0x21, 0x5c, 0xd2, 0xae, 0x04, 0x32, 0x52, 0x46, 0x95, 0x9c, 0xf8, 0x4a, 0x60, 0x72, 0xf9, + 0xd9, 0x63, 0xfc, 0x65, 0x62, 0xcd, 0x45, 0x07, 0x4c, 0x7f, 0x76, 0x2c, 0x28, 0x33, 0xb3, 0x7f, + 0x99, 0x9f, 0xfd, 0x1f, 0x02, 0xdb, 0x51, 0x6d, 0xc4, 0x61, 0x07, 0x47, 0xb3, 0xb7, 0x11, 0x8f, + 0xee, 0x80, 0xe8, 0x0f, 0xe4, 0xc1, 0x71, 0xda, 0x89, 0x7c, 0x3b, 0x40, 0x9c, 0xf2, 0x1c, 0x1e, + 0xd7, 0x49, 0x0e, 0x41, 0x79, 0x5c, 0x0b, 0x52, 0x69, 0x96, 0x32, 0x05, 0xd8, 0x9b, 0xc8, 0xea, + 0x46, 0x51, 0x7f, 0xb0, 0x67, 0xda, 0x1d, 0xf1, 0x70, 0xbf, 0x43, 0x80, 0x0f, 0xd6, 0x1a, 0x65, + 0x7e, 0xad, 0x71, 0xc0, 0xca, 0x64, 0xea, 0x9d, 0x6b, 0x2c, 0x32, 0xc2, 0xee, 0xc4, 0x77, 0xae, + 0xe3, 0xcb, 0xce, 0x1e, 0xa5, 0xf7, 0xca, 0x20, 0xdf, 0x74, 0x5c, 0x5f, 0x7b, 0x41, 0x9a, 0xd6, + 0x49, 0x24, 0x1f, 0x81, 0x14, 0x3c, 0xab, 0x65, 0x90, 0x47, 0x95, 0xa3, 0x33, 0x86, 0xdb, 0x92, + 0x8f, 0x3a, 0x9b, 0xbe, 0x89, 0xbd, 0xba, 0x51, 0xf9, 0x8b, 0xad, 0xfd, 0x1e, 0x34, 0xf0, 0xc7, + 0x69, 0xe3, 0xe9, 0x10, 0xf9, 0x35, 0xe3, 0x0f, 0x60, 0x64, 0x16, 0x4f, 0x27, 0xb6, 0xe4, 0xec, + 0x71, 0x7b, 0xf8, 0x38, 0xf5, 0x6d, 0x5d, 0xb6, 0xba, 0x50, 0x7b, 0x01, 0x71, 0x19, 0xa9, 0x9b, + 0xbb, 0x50, 0xfc, 0x48, 0x4c, 0xa2, 0x6b, 0x2b, 0x8e, 0x2f, 0x2b, 0x47, 0xf1, 0x65, 0xd3, 0x36, + 0x28, 0x72, 0x00, 0x9d, 0xb0, 0x34, 0xe9, 0x06, 0x95, 0x50, 0xf6, 0x44, 0xe2, 0x74, 0x9e, 0x68, + 0x42, 0x9f, 0x18, 0x95, 0x8d, 0xe0, 0x8a, 0xa4, 0xef, 0x1b, 0x4b, 0xc4, 0xce, 0xf0, 0x42, 0x1d, + 0xb9, 0xef, 0x06, 0xa6, 0x0f, 0xb0, 0xe0, 0xac, 0xf1, 0xe0, 0x7c, 0x77, 0xbc, 0x80, 0x78, 0x26, + 0xc7, 0x02, 0xd3, 0xdb, 0x43, 0x98, 0xd6, 0x39, 0x98, 0xee, 0x1e, 0x91, 0x8b, 0xec, 0x01, 0xfb, + 0xf1, 0x02, 0x38, 0x4e, 0x26, 0xfd, 0x25, 0xbb, 0x43, 0x23, 0xac, 0xbe, 0x59, 0x3a, 0xe2, 0xcd, + 0xb6, 0x83, 0x21, 0x58, 0xb9, 0x58, 0xce, 0x85, 0xbe, 0x58, 0xce, 0xea, 0x12, 0x09, 0xe7, 0x8a, + 0x3a, 0x51, 0xbc, 0xd3, 0x36, 0x2c, 0xcc, 0x04, 0x96, 0x3d, 0xee, 0x72, 0xc3, 0xef, 0xf8, 0x7b, + 0x44, 0xa7, 0xc4, 0xef, 0x11, 0xfd, 0xed, 0x74, 0xeb, 0x76, 0xb8, 0xe8, 0x3e, 0x81, 0x67, 0x6c, + 0x3b, 0xa5, 0x58, 0xd1, 0x13, 0xe0, 0xee, 0x3f, 0x87, 0x3b, 0x59, 0x14, 0x41, 0x64, 0x44, 0x77, + 0x32, 0x4c, 0xe0, 0x28, 0xdd, 0xc9, 0x86, 0x31, 0x90, 0x3d, 0x8e, 0xbf, 0x5d, 0xa0, 0xbb, 0xf9, + 0xb8, 0xdd, 0x68, 0x7f, 0x2c, 0x65, 0x3e, 0x4a, 0x7f, 0x33, 0x97, 0xca, 0xff, 0x19, 0xf3, 0x95, + 0x3c, 0x4c, 0xa7, 0xf1, 0x68, 0x4e, 0x22, 0x37, 0x81, 0x75, 0x23, 0x09, 0xfb, 0xa2, 0x9f, 0xb7, + 0x3a, 0xfe, 0xce, 0x98, 0x4e, 0x74, 0x5c, 0x41, 0xb4, 0x68, 0xbc, 0x7a, 0xf2, 0xa0, 0xfd, 0xaf, + 0x5c, 0xaa, 0x10, 0x52, 0xa1, 0x48, 0x30, 0x5b, 0x31, 0x22, 0x4e, 0x11, 0xf8, 0x29, 0x91, 0xde, + 0x04, 0x35, 0xfa, 0x9c, 0xd5, 0x81, 0xce, 0x23, 0x50, 0xa3, 0x31, 0x5f, 0xe3, 0xd3, 0xe8, 0x24, + 0x72, 0xff, 0x49, 0x35, 0x3a, 0x14, 0xc9, 0x98, 0x34, 0x3a, 0x91, 0x5e, 0xf6, 0x32, 0x7e, 0xe5, + 0x1c, 0x9d, 0x48, 0xd5, 0x2c, 0xfb, 0x92, 0xf6, 0x4f, 0x45, 0xa0, 0x04, 0x71, 0x84, 0xfd, 0x1d, + 0x1a, 0x0b, 0xe6, 0x43, 0xc2, 0x77, 0xa3, 0x8c, 0x10, 0xef, 0x85, 0x0f, 0x27, 0x55, 0x38, 0x10, + 0x4e, 0xaa, 0x04, 0xe6, 0x2d, 0xdb, 0x87, 0xae, 0x6d, 0x76, 0x97, 0xbb, 0xe6, 0xb6, 0x77, 0x7a, + 0x6a, 0xe0, 0xe5, 0x75, 0x55, 0x26, 0x8f, 0xc1, 0x7f, 0xc1, 0x5e, 0x20, 0x3a, 0xcd, 0x5f, 0x20, + 0x1a, 0x13, 0xfd, 0x6a, 0x26, 0x3e, 0xfa, 0x55, 0x18, 0xdd, 0x0a, 0x0c, 0x0f, 0x8e, 0x2d, 0x6a, + 0x1b, 0xa7, 0x0c, 0xf7, 0x77, 0x9b, 0x60, 0x14, 0xb6, 0x30, 0xf4, 0xe3, 0x6b, 0xe4, 0x54, 0xab, + 0x7b, 0x48, 0x11, 0x16, 0xfb, 0x95, 0x20, 0xb5, 0x85, 0xca, 0x56, 0x5e, 0xee, 0xab, 0x7c, 0x68, + 0xf2, 0xe4, 0x05, 0x4c, 0x1e, 0x56, 0xa9, 0x0a, 0xa2, 0x77, 0xba, 0x8a, 0x2f, 0x16, 0x8a, 0xd4, + 0x76, 0x02, 0xa7, 0x91, 0x0a, 0xe0, 0x44, 0x10, 0xed, 0xb6, 0xd7, 0x83, 0xa6, 0x6b, 0xda, 0x6d, + 0xa8, 0x7d, 0x52, 0x1a, 0x87, 0xd9, 0xbb, 0x0c, 0xa6, 0xad, 0xb6, 0x63, 0x37, 0xad, 0xe7, 0x04, + 0x97, 0xcb, 0x25, 0x07, 0x59, 0xc7, 0x12, 0xa9, 0xd2, 0x2f, 0x8c, 0xf0, 0x5b, 0xb5, 0x0a, 0x66, + 0xda, 0xa6, 0xdb, 0x21, 0x41, 0xf8, 0x0a, 0x7d, 0x17, 0x39, 0xc5, 0x12, 0x2a, 0x07, 0x9f, 0x18, + 0xd1, 0xd7, 0x6a, 0x83, 0x17, 0x62, 0xb1, 0x2f, 0x9a, 0x47, 0x2c, 0xb1, 0x4a, 0xf4, 0x11, 0x27, + 0x73, 0x24, 0x1d, 0x17, 0x76, 0x4d, 0x72, 0xe9, 0xf8, 0x14, 0xb9, 0x23, 0x3a, 0x4c, 0x48, 0xbb, + 0x3c, 0x80, 0x8b, 0x3a, 0x80, 0xc6, 0xa4, 0x97, 0x07, 0x84, 0xb8, 0xc8, 0x5e, 0x33, 0xdf, 0x55, + 0x04, 0xf3, 0xa4, 0x57, 0xa3, 0xe2, 0xd4, 0x5e, 0x24, 0x83, 0x62, 0x13, 0xfa, 0xf7, 0xc3, 0x7d, + 0xad, 0x79, 0xf8, 0x31, 0x59, 0x01, 0xf2, 0xa5, 0x30, 0xe0, 0x20, 0xfa, 0x9b, 0x76, 0xdf, 0x3e, + 0xe0, 0x6b, 0x91, 0xf0, 0x34, 0xe9, 0x7d, 0xfb, 0xe4, 0xe2, 0xb3, 0xc7, 0xe7, 0x27, 0x64, 0x20, + 0x97, 0x3a, 0x1d, 0xad, 0x7d, 0x78, 0x28, 0xae, 0x07, 0xb3, 0x41, 0x9b, 0x89, 0x62, 0x40, 0xb2, + 0x49, 0x69, 0x17, 0x41, 0x43, 0xd9, 0x94, 0x3a, 0x13, 0xdf, 0x55, 0x48, 0x28, 0x3b, 0x7b, 0x50, + 0xbe, 0x30, 0x45, 0x1b, 0xcd, 0x92, 0xe3, 0x5c, 0xc2, 0x47, 0x65, 0x7e, 0x51, 0x06, 0x85, 0x65, + 0xe8, 0xb7, 0x77, 0x34, 0x6f, 0x2c, 0x6d, 0xa6, 0xef, 0xde, 0xf3, 0x21, 0x41, 0x39, 0xd3, 0x46, + 0x7f, 0x0e, 0xd8, 0x5e, 0xc4, 0x2c, 0x4f, 0x3a, 0xfa, 0x73, 0x62, 0xe9, 0x13, 0x38, 0x04, 0x97, + 0x07, 0x0b, 0xe1, 0x0a, 0x18, 0xc1, 0xec, 0x1d, 0xb9, 0x47, 0xdc, 0x7a, 0xe8, 0x10, 0xbb, 0x59, + 0xfb, 0xfd, 0x74, 0x21, 0xd6, 0x42, 0x99, 0xf3, 0x35, 0xcf, 0x78, 0x61, 0x32, 0x45, 0xf0, 0x35, + 0x31, 0x06, 0x27, 0xb0, 0x02, 0x20, 0x83, 0x69, 0xcc, 0x50, 0xc5, 0xba, 0x8c, 0x5d, 0x0f, 0xb9, + 0x85, 0xca, 0xe7, 0x8e, 0x65, 0xa1, 0xf2, 0x6e, 0x7e, 0xa1, 0x52, 0x30, 0x62, 0x72, 0xb0, 0x4e, + 0x99, 0xd2, 0x17, 0x07, 0x7d, 0x3f, 0xf6, 0x65, 0xca, 0x14, 0xbe, 0x38, 0x43, 0xca, 0xcf, 0x1e, + 0xd1, 0x37, 0xfe, 0x17, 0xda, 0x59, 0x07, 0x1b, 0xb2, 0xda, 0xff, 0x38, 0x01, 0xf2, 0xe7, 0xd0, + 0x9f, 0x7f, 0x8c, 0x6e, 0xd4, 0x7a, 0xf9, 0x18, 0x82, 0x3b, 0x3c, 0x1d, 0xe4, 0x11, 0x7d, 0x3a, + 0xed, 0xb9, 0x45, 0x6c, 0x77, 0x18, 0x31, 0x62, 0xe0, 0xef, 0xd4, 0x53, 0xa0, 0xe8, 0x39, 0x7b, + 0x6e, 0x1b, 0x99, 0xdf, 0x48, 0x63, 0xe8, 0x53, 0xda, 0xa0, 0xa6, 0x1c, 0xe9, 0xc5, 0xf1, 0xb9, + 0x9c, 0x32, 0x17, 0x2c, 0xc9, 0xdc, 0x05, 0x4b, 0x29, 0xf6, 0x1f, 0x04, 0x78, 0xcb, 0x5e, 0x23, + 0xfe, 0x18, 0xdf, 0x35, 0xd8, 0x19, 0x17, 0xec, 0x31, 0x62, 0x39, 0xac, 0x3a, 0xa4, 0x75, 0x18, + 0xe7, 0x45, 0x1b, 0xc6, 0x91, 0x9f, 0xa8, 0xc3, 0xb8, 0x00, 0x0f, 0x13, 0x39, 0xe5, 0x5e, 0xa4, + 0x4e, 0xae, 0x17, 0xc6, 0x89, 0x6e, 0x9e, 0x53, 0xfa, 0x43, 0xa1, 0x33, 0x46, 0xe7, 0xd7, 0x91, + 0xd1, 0x39, 0x22, 0xf7, 0xd7, 0x5f, 0x93, 0x71, 0x24, 0xcd, 0xc0, 0x08, 0x12, 0xbf, 0x28, 0x29, + 0x35, 0x44, 0x68, 0x0c, 0xe6, 0xe2, 0x48, 0xcf, 0x8f, 0x1e, 0x5a, 0x9c, 0x17, 0x1d, 0xc3, 0xff, + 0xa4, 0x43, 0x8b, 0x8b, 0x32, 0x92, 0x3d, 0x90, 0xbf, 0x40, 0x2e, 0x26, 0x2b, 0xb5, 0x7d, 0xeb, + 0xf2, 0x98, 0x5b, 0x1a, 0x3f, 0xbc, 0xa4, 0x8c, 0x26, 0x7c, 0x40, 0x42, 0x84, 0xc3, 0x49, 0x47, + 0x13, 0x16, 0x63, 0x23, 0x7b, 0x98, 0x7e, 0x0c, 0x20, 0xe9, 0xd1, 0xb5, 0x9d, 0x37, 0xc8, 0x40, + 0x6e, 0x42, 0x5f, 0x83, 0x87, 0x47, 0xeb, 0x2c, 0x98, 0x63, 0x96, 0x0e, 0x82, 0x0b, 0x6f, 0xb8, + 0xb4, 0xb4, 0x07, 0xe5, 0x43, 0x91, 0xb1, 0x8b, 0x2e, 0x93, 0x3e, 0x28, 0x2f, 0xc2, 0xc4, 0x04, + 0x0e, 0xca, 0xd3, 0x65, 0x9f, 0x6f, 0x17, 0xa0, 0xc6, 0xb5, 0x02, 0x74, 0x28, 0xa0, 0x8e, 0x62, + 0x29, 0xe8, 0xed, 0x91, 0xb1, 0x31, 0x21, 0xac, 0x3e, 0xc4, 0x62, 0xd5, 0xe0, 0xb1, 0xba, 0x53, + 0x44, 0x4c, 0x62, 0xc6, 0x87, 0xd0, 0x04, 0xff, 0x9d, 0x21, 0x5c, 0x06, 0x07, 0xd7, 0xd3, 0x47, + 0xe6, 0x23, 0x7b, 0xc4, 0x7e, 0x8e, 0x8c, 0x5b, 0x4d, 0x32, 0xb7, 0x1a, 0xcf, 0xb8, 0x45, 0xa7, + 0x6d, 0x32, 0x37, 0x6d, 0x4b, 0x79, 0xb0, 0x22, 0xf2, 0x17, 0x0e, 0x98, 0x1b, 0x06, 0x51, 0x7e, + 0xcc, 0x07, 0x2b, 0x86, 0x72, 0x90, 0x3d, 0x38, 0x5f, 0x93, 0x01, 0x58, 0x71, 0x9d, 0xbd, 0x5e, + 0xc3, 0xed, 0x40, 0x57, 0xfb, 0xb3, 0x68, 0xa6, 0xf6, 0x93, 0x63, 0x98, 0xa9, 0xad, 0x03, 0xb0, + 0x1d, 0x12, 0xa7, 0x1a, 0x7e, 0xbb, 0xd8, 0xbc, 0x2c, 0x62, 0xca, 0x60, 0x68, 0xf0, 0x77, 0x0b, + 0x3f, 0x93, 0xc7, 0x38, 0xa9, 0xcf, 0x8a, 0xc8, 0x8d, 0x73, 0xa6, 0xf6, 0xee, 0x10, 0xeb, 0x16, + 0x87, 0xf5, 0x33, 0x0e, 0xc1, 0x49, 0xf6, 0x98, 0xff, 0xc3, 0x14, 0x98, 0x25, 0xfb, 0xb2, 0x44, + 0xa6, 0x7f, 0x13, 0x81, 0xfe, 0xb3, 0x63, 0x00, 0x7d, 0x03, 0xcc, 0x39, 0x11, 0x75, 0xd2, 0xa7, + 0xb2, 0x2b, 0x65, 0x89, 0xb0, 0x33, 0x7c, 0x19, 0x1c, 0x19, 0xed, 0xe3, 0x2c, 0xf2, 0x06, 0x8f, + 0xfc, 0xdd, 0x09, 0xf2, 0x66, 0x28, 0x8e, 0x13, 0xfa, 0xf7, 0x84, 0xd0, 0x6f, 0x70, 0xd0, 0x97, + 0x0e, 0xc3, 0xca, 0x04, 0xee, 0x55, 0x90, 0x41, 0x1e, 0x1f, 0x83, 0x7c, 0x4b, 0x86, 0x0b, 0x31, + 0xa7, 0xc1, 0x14, 0x6e, 0xb2, 0xe1, 0x04, 0x31, 0x78, 0x44, 0x6f, 0xcc, 0x2d, 0x1f, 0xba, 0xe1, + 0x12, 0x7b, 0xf0, 0x88, 0x78, 0x08, 0xdc, 0xcf, 0xbd, 0xd3, 0x45, 0xb2, 0xe3, 0x1c, 0x26, 0x8c, + 0x3c, 0x7b, 0x64, 0x25, 0x3e, 0xb6, 0x83, 0x91, 0xa3, 0xcc, 0x1e, 0x87, 0x30, 0x92, 0x3d, 0xf0, + 0x5f, 0xcc, 0x83, 0xd3, 0x64, 0xf9, 0x6f, 0xd9, 0x75, 0x76, 0xfb, 0xae, 0x31, 0xb3, 0x0e, 0xaf, + 0x0b, 0x37, 0x81, 0x05, 0x9f, 0x73, 0xbc, 0xa7, 0x3a, 0xd1, 0x97, 0xaa, 0xfd, 0x0e, 0xeb, 0x3c, + 0xf3, 0x2c, 0x1e, 0xc9, 0xa5, 0x04, 0x01, 0xc6, 0xf1, 0x9e, 0x7a, 0x47, 0x45, 0x90, 0x51, 0x66, + 0x35, 0x51, 0x1e, 0x69, 0x71, 0x39, 0xd4, 0xa9, 0x82, 0x88, 0x4e, 0x7d, 0x30, 0xd4, 0xa9, 0xef, + 0xe5, 0x74, 0x6a, 0xe5, 0xf0, 0x22, 0x99, 0xc0, 0x12, 0xd3, 0x02, 0x28, 0x2e, 0x5b, 0x5d, 0x1f, + 0xba, 0xda, 0x97, 0xe9, 0x3c, 0xea, 0xd5, 0x19, 0x76, 0x2f, 0x15, 0x50, 0xdc, 0xc2, 0xa5, 0x51, + 0x83, 0xec, 0x56, 0x31, 0x6c, 0x08, 0x87, 0x06, 0xfd, 0x36, 0x6d, 0x90, 0xbf, 0x3e, 0x32, 0x63, + 0x9b, 0x80, 0xa5, 0x08, 0xf2, 0x37, 0x9c, 0x85, 0x89, 0xdc, 0x6f, 0x55, 0x34, 0xe0, 0x2e, 0x1a, + 0x41, 0x2e, 0x65, 0x87, 0xb0, 0x02, 0x64, 0xab, 0xe3, 0xe1, 0xa6, 0x37, 0x63, 0xa0, 0xbf, 0x69, + 0x5d, 0x8e, 0xfa, 0x45, 0x45, 0x58, 0x9e, 0xb4, 0xcb, 0x91, 0x10, 0x17, 0xd9, 0x63, 0xf6, 0x4d, + 0xec, 0x6f, 0xda, 0xeb, 0x9a, 0x6d, 0x88, 0xb8, 0xcf, 0x0c, 0xb5, 0x05, 0x20, 0x59, 0xc1, 0x88, + 0x2f, 0x59, 0x6c, 0x3b, 0x2d, 0x1c, 0xa2, 0x9d, 0x8e, 0xba, 0x1a, 0x19, 0xca, 0x1c, 0x57, 0xfc, + 0xc8, 0x56, 0x23, 0x13, 0xd9, 0x98, 0xc0, 0xed, 0xa5, 0xc1, 0x79, 0xdc, 0x89, 0xb6, 0xd6, 0x51, + 0xf7, 0x6a, 0xa8, 0xb0, 0xc6, 0x76, 0xf6, 0x76, 0x94, 0xbd, 0x9a, 0x78, 0x1e, 0x26, 0x80, 0xd6, + 0x02, 0x45, 0xeb, 0xf3, 0x74, 0x18, 0xcd, 0x78, 0xbb, 0xd4, 0x73, 0x5c, 0x3f, 0xdd, 0x76, 0x29, + 0xe2, 0xce, 0xc0, 0xdf, 0xa5, 0x3d, 0xbf, 0xc5, 0x1f, 0xcf, 0x1e, 0xd7, 0xf0, 0x99, 0xe2, 0xfc, + 0xd6, 0x30, 0x06, 0xb2, 0x87, 0xf7, 0xad, 0x47, 0x34, 0x78, 0x8e, 0xda, 0x1c, 0x69, 0x1b, 0x18, + 0xdb, 0xd0, 0x39, 0x4a, 0x73, 0x8c, 0xe7, 0x21, 0x7b, 0xbc, 0xfe, 0x9e, 0x19, 0x38, 0xdf, 0x34, + 0xc1, 0x81, 0x33, 0x68, 0x99, 0x85, 0x11, 0x5b, 0xe6, 0xa8, 0xbb, 0x0b, 0x54, 0xd6, 0xe3, 0x1b, + 0x30, 0x47, 0xd9, 0x5d, 0x48, 0x60, 0x22, 0x7b, 0xc4, 0xdf, 0x2c, 0x83, 0x42, 0x73, 0xf2, 0xe3, + 0xe5, 0xa8, 0x73, 0x11, 0x2c, 0xab, 0xe6, 0xd8, 0x86, 0xcb, 0x51, 0xe6, 0x22, 0xb1, 0x2c, 0x4c, + 0x20, 0x7e, 0xff, 0x71, 0x30, 0x87, 0x27, 0xdc, 0xc1, 0x6e, 0xeb, 0xdf, 0xd3, 0x51, 0xf3, 0xf5, + 0x19, 0xb6, 0xd5, 0xfb, 0xc0, 0x74, 0xb0, 0x3b, 0x44, 0x47, 0xce, 0x45, 0xb1, 0xf6, 0x19, 0x70, + 0x69, 0x84, 0xdf, 0x1f, 0xca, 0x27, 0x62, 0xec, 0x3b, 0x81, 0xa3, 0xfa, 0x44, 0x1c, 0xe9, 0x6e, + 0xe0, 0x6f, 0x47, 0x23, 0xea, 0x7f, 0xcd, 0x0e, 0xf3, 0xfe, 0x5d, 0xc2, 0xfc, 0x80, 0x5d, 0xc2, + 0x4f, 0xb2, 0x58, 0x36, 0x79, 0x2c, 0xef, 0x11, 0x15, 0xe1, 0x18, 0xc7, 0xda, 0xf7, 0x86, 0x70, + 0x9e, 0xe3, 0xe0, 0x5c, 0x3a, 0x14, 0x2f, 0x13, 0x38, 0x3f, 0x99, 0x8f, 0xc6, 0xdc, 0x4f, 0x65, + 0xd8, 0x8e, 0xfb, 0x0e, 0x67, 0xe4, 0x0f, 0x1c, 0xce, 0xe0, 0x5a, 0x7a, 0xe1, 0x90, 0x2d, 0xfd, + 0x53, 0xac, 0x76, 0xb4, 0x78, 0xed, 0x78, 0xba, 0x38, 0x22, 0xe3, 0x1b, 0x99, 0xdf, 0x17, 0xaa, + 0xc7, 0x79, 0x4e, 0x3d, 0xca, 0x87, 0x63, 0x26, 0x7b, 0xfd, 0xf8, 0xf5, 0x60, 0x42, 0x7b, 0xc4, + 0xed, 0x7d, 0xd4, 0x8d, 0x48, 0x4e, 0x88, 0x63, 0x1b, 0xb9, 0x47, 0xd9, 0x88, 0x1c, 0xc6, 0xc9, + 0x04, 0x42, 0xba, 0xcd, 0x83, 0x59, 0xcc, 0xd3, 0x79, 0xab, 0xb3, 0x0d, 0x7d, 0xed, 0x35, 0xc4, + 0x55, 0x31, 0x08, 0xa0, 0x39, 0xa6, 0x28, 0x47, 0x71, 0xc7, 0x66, 0xd3, 0xfa, 0x0b, 0x10, 0x26, + 0x17, 0x19, 0x06, 0x27, 0x1d, 0x88, 0x71, 0x28, 0x07, 0xd9, 0x43, 0xf6, 0x71, 0xe2, 0xcc, 0x51, + 0x33, 0xf7, 0x9d, 0x3d, 0x5f, 0x7b, 0x68, 0x0c, 0x1d, 0xf4, 0x12, 0x28, 0x76, 0x31, 0x35, 0x7a, + 0x3a, 0x23, 0x79, 0xba, 0x43, 0x45, 0x40, 0xca, 0x37, 0xe8, 0x97, 0x69, 0x8f, 0x68, 0x44, 0x72, + 0x24, 0x74, 0x26, 0x7d, 0x44, 0x63, 0x48, 0xf9, 0x13, 0xb9, 0xaa, 0x67, 0x1a, 0x95, 0x6e, 0xed, + 0x5a, 0xfe, 0x98, 0x02, 0x41, 0x74, 0x11, 0xad, 0x20, 0x10, 0x04, 0x7e, 0x48, 0x7b, 0xf0, 0x94, + 0x91, 0x0a, 0xfa, 0x7c, 0xd2, 0x07, 0x4f, 0x93, 0x8b, 0xcf, 0x1e, 0x93, 0x9f, 0x26, 0x2d, 0xeb, + 0x1c, 0xf1, 0xc1, 0xcd, 0xd0, 0xbd, 0x77, 0xe4, 0xc6, 0x42, 0x58, 0x3b, 0xba, 0xc6, 0x32, 0xb0, + 0xfc, 0xec, 0x81, 0xf9, 0xc5, 0xef, 0x04, 0x85, 0x0a, 0xbc, 0xb8, 0xb7, 0xad, 0xdd, 0x0d, 0xa6, + 0x5b, 0x2e, 0x84, 0x55, 0x7b, 0xcb, 0x41, 0xd2, 0xf5, 0xd1, 0xff, 0x00, 0x12, 0xfa, 0x84, 0xf0, + 0xd8, 0x81, 0x66, 0x27, 0x3a, 0x86, 0x16, 0x3c, 0x6a, 0x2f, 0x97, 0x40, 0xbe, 0xe9, 0x9b, 0xbe, + 0x36, 0x13, 0x62, 0xab, 0x3d, 0xc4, 0x62, 0x71, 0x37, 0x8f, 0xc5, 0x4d, 0x9c, 0x2c, 0x30, 0x07, + 0x8b, 0xe8, 0xfb, 0x18, 0x00, 0x34, 0x30, 0xfd, 0x80, 0xe7, 0xd8, 0x28, 0x47, 0x70, 0x52, 0x32, + 0x78, 0xd6, 0x5e, 0x15, 0x8a, 0xfb, 0x5e, 0x4e, 0xdc, 0x8f, 0x17, 0x2b, 0x62, 0x02, 0x2b, 0x6d, + 0x12, 0x98, 0x41, 0xa2, 0x5d, 0x85, 0x66, 0xc7, 0xd3, 0xbe, 0x23, 0x52, 0xfe, 0x18, 0x31, 0x6b, + 0x1f, 0x16, 0x8e, 0xe9, 0x49, 0x6a, 0x15, 0x12, 0x8f, 0xf7, 0x17, 0x08, 0x62, 0x9a, 0x48, 0x7c, + 0x4c, 0x93, 0xdb, 0x40, 0xde, 0xb2, 0xb7, 0x1c, 0xea, 0xbd, 0xf6, 0xe8, 0x18, 0xda, 0x48, 0x27, + 0x0c, 0x9c, 0x51, 0x30, 0xe0, 0x67, 0x32, 0x5b, 0x13, 0xb9, 0x3b, 0x2f, 0x8f, 0x4a, 0xd7, 0xfe, + 0xcf, 0xa1, 0xc2, 0x56, 0x55, 0x90, 0xef, 0x99, 0xfe, 0x0e, 0x2d, 0x1a, 0xff, 0x47, 0x36, 0xf2, + 0x9e, 0x6d, 0xda, 0x8e, 0xbd, 0xbf, 0x6b, 0x3d, 0x27, 0xbc, 0xa2, 0x97, 0x4b, 0x43, 0x9c, 0x6f, + 0x43, 0x1b, 0xba, 0xa6, 0x0f, 0x9b, 0x97, 0xb7, 0xf1, 0x1c, 0x6b, 0xda, 0x60, 0x93, 0x52, 0xeb, + 0x3f, 0xe2, 0x38, 0x5e, 0xff, 0xb7, 0xac, 0x2e, 0xc4, 0x01, 0x9f, 0xa8, 0xfe, 0x07, 0xcf, 0xa9, + 0xf4, 0x7f, 0x40, 0x11, 0xd9, 0xa3, 0xf1, 0xaf, 0x12, 0x98, 0x6b, 0x22, 0x85, 0x6b, 0xee, 0xed, + 0xee, 0x9a, 0xee, 0xbe, 0x76, 0x43, 0x84, 0x0a, 0xa3, 0x9a, 0x39, 0x4e, 0x35, 0xb5, 0x5f, 0x13, + 0xbe, 0x9d, 0x9a, 0x36, 0x6d, 0xa6, 0x84, 0xd4, 0xed, 0xe0, 0x89, 0xa0, 0x80, 0xd4, 0x3b, 0xf0, + 0xe7, 0x4b, 0x6c, 0x08, 0x24, 0xa7, 0x60, 0x60, 0xac, 0xa1, 0xbc, 0x4d, 0x20, 0x28, 0x87, 0x04, + 0x8e, 0x37, 0x7d, 0xb3, 0x7d, 0x69, 0xc5, 0x71, 0x9d, 0x3d, 0xdf, 0xb2, 0xa1, 0xa7, 0x3d, 0x26, + 0x42, 0x20, 0xd0, 0xff, 0x5c, 0xa4, 0xff, 0xda, 0xbf, 0xe7, 0x44, 0x47, 0xd1, 0xb0, 0x5b, 0x65, + 0xc9, 0xc7, 0xc4, 0xb9, 0x12, 0x1b, 0x17, 0x45, 0x28, 0x66, 0x2f, 0xb4, 0x37, 0xc9, 0x40, 0xd1, + 0x1f, 0xec, 0x39, 0xae, 0x5f, 0x73, 0xda, 0x66, 0xd7, 0xf3, 0x1d, 0x17, 0x6a, 0x8d, 0x44, 0xa9, + 0xa1, 0x1e, 0xa6, 0xe3, 0xb4, 0xa3, 0xc1, 0x91, 0x3e, 0xb1, 0x6a, 0x27, 0xf3, 0x3a, 0xfe, 0x71, + 0xe1, 0x5d, 0x46, 0x22, 0x95, 0x7e, 0x8e, 0x62, 0xf4, 0x7c, 0x50, 0x97, 0x96, 0xce, 0x15, 0x5f, + 0x6c, 0xe7, 0x51, 0x88, 0xa9, 0x09, 0x2c, 0x95, 0x4b, 0x60, 0xbe, 0xb9, 0x77, 0x31, 0x24, 0xe2, + 0xb1, 0x46, 0xc8, 0x6b, 0x85, 0x83, 0x59, 0x50, 0xc5, 0x63, 0x09, 0xc5, 0xc8, 0xf7, 0x46, 0x30, + 0xef, 0xb1, 0xd9, 0x28, 0xde, 0x7c, 0xa2, 0x60, 0x10, 0x8b, 0xe1, 0xa5, 0x66, 0x2f, 0xc0, 0xf7, + 0x49, 0x60, 0xbe, 0xd1, 0x83, 0x36, 0xec, 0x10, 0x1f, 0x3b, 0x4e, 0x80, 0x2f, 0x4f, 0x29, 0x40, + 0x8e, 0x50, 0x8c, 0x00, 0x23, 0x7f, 0xd8, 0x4a, 0x20, 0xbc, 0x28, 0x21, 0x95, 0xe0, 0x92, 0x4a, + 0xcb, 0x5e, 0x70, 0x5f, 0x92, 0xc0, 0xac, 0xb1, 0x67, 0xaf, 0xbb, 0x0e, 0x1a, 0x8d, 0x5d, 0xed, + 0x9e, 0xa8, 0x83, 0xb8, 0x15, 0x9c, 0xe8, 0xec, 0xb9, 0x78, 0xfd, 0xa9, 0x6a, 0x37, 0x61, 0xdb, + 0xb1, 0x3b, 0x1e, 0xae, 0x47, 0xc1, 0x38, 0xf8, 0xe2, 0xae, 0xfc, 0x0b, 0xfe, 0x4a, 0xce, 0x69, + 0x2f, 0x12, 0x8e, 0x98, 0x43, 0x2a, 0xcf, 0x14, 0x2d, 0xde, 0x13, 0x08, 0xc6, 0xc5, 0x19, 0x56, + 0x42, 0xf6, 0xc2, 0xfd, 0xbc, 0x04, 0xd4, 0x52, 0xbb, 0xed, 0xec, 0xd9, 0x7e, 0x13, 0x76, 0x61, + 0xdb, 0x6f, 0xb9, 0x66, 0x1b, 0xb2, 0xf6, 0xb3, 0x02, 0xe4, 0x8e, 0xe5, 0xd2, 0x3e, 0x18, 0xfd, + 0xa5, 0x72, 0x7c, 0xb9, 0xf0, 0x8e, 0x23, 0xa9, 0xe5, 0xc1, 0x52, 0x52, 0x88, 0x53, 0x6c, 0x5f, + 0x51, 0xb0, 0xa0, 0xec, 0xa5, 0xfa, 0x29, 0x09, 0xcc, 0x04, 0x3d, 0xf6, 0xb6, 0x88, 0x30, 0x7f, + 0x3a, 0xe5, 0x64, 0x24, 0x24, 0x9e, 0x42, 0x86, 0xef, 0x4a, 0x31, 0xab, 0x88, 0xa3, 0x9f, 0x4e, + 0x74, 0xa5, 0xf4, 0xa2, 0x43, 0x8f, 0xf5, 0xc6, 0xe6, 0x72, 0xa3, 0x56, 0xd1, 0x0d, 0x45, 0xd6, + 0xbe, 0x2c, 0x81, 0xfc, 0xba, 0x65, 0x6f, 0xb3, 0x81, 0xcd, 0x4e, 0x22, 0x3b, 0xb2, 0x03, 0x1f, + 0xa4, 0x2d, 0x9d, 0x3c, 0xa8, 0x77, 0x80, 0x93, 0xf6, 0xde, 0xee, 0x45, 0xe8, 0x36, 0xb6, 0xf0, + 0x28, 0xeb, 0xb5, 0x9c, 0x26, 0xb4, 0x89, 0x11, 0x5a, 0x30, 0x06, 0xbe, 0xe3, 0x4d, 0x30, 0x81, + 0xc9, 0x03, 0xe2, 0x24, 0x46, 0xe2, 0x21, 0x53, 0x12, 0xc3, 0x54, 0xaa, 0x69, 0xc3, 0x00, 0xe2, + 0xd9, 0x6b, 0xea, 0x6f, 0x14, 0xc0, 0xd5, 0x25, 0x7b, 0x1f, 0xdb, 0x14, 0xa4, 0x83, 0x2f, 0xef, + 0x98, 0xf6, 0x36, 0xc4, 0x03, 0x44, 0x28, 0x71, 0x36, 0xd2, 0x7f, 0x8e, 0x8f, 0xf4, 0xaf, 0x1a, + 0x60, 0xca, 0x71, 0x3b, 0xd0, 0x5d, 0xda, 0xc7, 0x3c, 0xf5, 0x2f, 0x3b, 0xd3, 0x36, 0x39, 0xa8, + 0x88, 0x45, 0x4a, 0x7e, 0xb1, 0x41, 0xbe, 0x37, 0x02, 0x42, 0x67, 0x6f, 0x05, 0x53, 0x34, 0x4d, + 0x9d, 0x03, 0xd3, 0x0d, 0xa3, 0xa2, 0x1b, 0x9b, 0xd5, 0x8a, 0x72, 0x4c, 0xbd, 0x0a, 0x1c, 0xaf, + 0xb6, 0x74, 0xa3, 0xd4, 0xaa, 0x36, 0xea, 0x9b, 0x38, 0x5d, 0xc9, 0x69, 0xcf, 0xcf, 0x8b, 0x7a, + 0xf6, 0x26, 0x33, 0x33, 0x08, 0x56, 0x03, 0x4c, 0xb5, 0x49, 0x06, 0x3c, 0x84, 0xce, 0xa6, 0xaa, + 0x1d, 0x25, 0x48, 0x12, 0x8c, 0x80, 0x90, 0x7a, 0x06, 0x80, 0x2b, 0xae, 0x63, 0x6f, 0x47, 0x67, + 0xda, 0xa6, 0x0d, 0x26, 0x45, 0x7b, 0x28, 0x07, 0x8a, 0xe4, 0x1b, 0x7c, 0xb3, 0x09, 0xfe, 0x17, + 0x09, 0x3e, 0x78, 0x46, 0x16, 0x2f, 0x96, 0x57, 0x34, 0xd1, 0xa2, 0x8f, 0x48, 0x17, 0x89, 0x0c, + 0x88, 0x25, 0x4c, 0xab, 0x72, 0x1b, 0x28, 0x92, 0x6f, 0xa9, 0xd7, 0x41, 0x7c, 0x94, 0x52, 0x92, + 0x4d, 0xd0, 0x4f, 0x59, 0x5c, 0xa6, 0xd9, 0x6b, 0xf3, 0x47, 0x24, 0x30, 0x5d, 0x87, 0x7e, 0x79, + 0x07, 0xb6, 0x2f, 0x69, 0x8f, 0xe3, 0x17, 0x40, 0xbb, 0x16, 0xb4, 0xfd, 0x0b, 0xbb, 0xdd, 0x70, + 0x01, 0x34, 0x48, 0xd0, 0x5e, 0xc8, 0x76, 0xbe, 0xcf, 0xe0, 0xf5, 0xe7, 0x96, 0x01, 0x75, 0x0d, + 0x4a, 0x88, 0x51, 0x99, 0x53, 0xa0, 0xe8, 0x42, 0x6f, 0xaf, 0x1b, 0x2c, 0xa2, 0xd1, 0x27, 0xed, + 0xe1, 0x50, 0x9c, 0x65, 0x4e, 0x9c, 0xb7, 0x89, 0x17, 0x31, 0x81, 0xb0, 0xa7, 0x79, 0x30, 0x55, + 0xb5, 0x2d, 0xdf, 0x32, 0xbb, 0xda, 0x8b, 0xf2, 0x60, 0xbe, 0x09, 0xfd, 0x75, 0xd3, 0x35, 0x77, + 0xa1, 0x0f, 0x5d, 0x4f, 0xfb, 0x06, 0xdf, 0x27, 0xf4, 0xba, 0xa6, 0xbf, 0xe5, 0xb8, 0xbb, 0x81, + 0x6a, 0x06, 0xcf, 0x48, 0x35, 0x2f, 0x43, 0xd7, 0x8b, 0xf8, 0x0a, 0x1e, 0xd1, 0x9b, 0x2b, 0x8e, + 0x7b, 0x09, 0x0d, 0x82, 0x74, 0x9a, 0x46, 0x1f, 0x11, 0xbd, 0xae, 0xb3, 0x5d, 0x83, 0x97, 0x61, + 0x10, 0x55, 0x2d, 0x7c, 0x46, 0x73, 0x81, 0x8e, 0x53, 0x77, 0x7c, 0xd4, 0x69, 0xd7, 0x9c, 0x6d, + 0x12, 0x76, 0x76, 0xda, 0xe0, 0x13, 0xa3, 0x5c, 0xe6, 0x65, 0x88, 0x73, 0x15, 0xd9, 0x5c, 0x34, + 0x51, 0x5d, 0x04, 0x6a, 0xf8, 0x59, 0x0b, 0x76, 0xe1, 0x2e, 0xf4, 0xdd, 0x7d, 0x7c, 0xbb, 0xc4, + 0xb4, 0x31, 0xe0, 0x0d, 0x1d, 0xa0, 0xc5, 0x27, 0xeb, 0x54, 0x7a, 0x8b, 0x9c, 0xe4, 0x0e, 0x35, + 0x59, 0x17, 0xa1, 0x38, 0x91, 0xdb, 0xb3, 0x64, 0x64, 0xcd, 0xbc, 0x42, 0x06, 0x79, 0x3c, 0x78, + 0xbe, 0x39, 0xc7, 0xad, 0x30, 0xed, 0x42, 0xcf, 0x33, 0xb7, 0x61, 0xb0, 0xc2, 0x44, 0x1f, 0xd5, + 0x3b, 0x41, 0xa1, 0x8b, 0x31, 0x25, 0x83, 0xc3, 0x0d, 0x5c, 0xcd, 0x90, 0x81, 0x81, 0x68, 0x85, + 0x23, 0x01, 0x86, 0xdb, 0x20, 0x5f, 0x9c, 0xbd, 0x0f, 0x14, 0x08, 0xfc, 0x33, 0xa0, 0x50, 0xd1, + 0x97, 0x36, 0x56, 0x94, 0x63, 0xe8, 0x6f, 0xc0, 0xdf, 0x0c, 0x28, 0x2c, 0x97, 0x5a, 0xa5, 0x9a, + 0x22, 0xa1, 0x7a, 0x54, 0xeb, 0xcb, 0x0d, 0x45, 0x46, 0x89, 0xeb, 0xa5, 0x7a, 0xb5, 0xac, 0xe4, + 0xd5, 0x59, 0x30, 0x75, 0xbe, 0x64, 0xd4, 0xab, 0xf5, 0x15, 0xa5, 0xa0, 0xfd, 0x25, 0x8b, 0xdf, + 0x5d, 0x3c, 0x7e, 0x37, 0xc6, 0xf1, 0x34, 0x08, 0xb2, 0x9f, 0x0f, 0x21, 0xbb, 0x87, 0x83, 0xec, + 0x3b, 0x45, 0x88, 0x4c, 0xc0, 0x9d, 0xa9, 0x08, 0xa6, 0xd6, 0x5d, 0xa7, 0x0d, 0x3d, 0x4f, 0xfb, + 0x19, 0x09, 0x14, 0xcb, 0xa6, 0xdd, 0x86, 0x5d, 0xed, 0x9a, 0x08, 0x2a, 0xe2, 0x2a, 0x9a, 0x0b, + 0x5c, 0x45, 0xb5, 0xaf, 0xe5, 0x44, 0x7b, 0x3f, 0x4a, 0x77, 0x91, 0xd0, 0x8c, 0x91, 0x8f, 0x58, + 0x2f, 0x97, 0x48, 0x6a, 0x02, 0x37, 0xec, 0x48, 0x60, 0x86, 0xae, 0x06, 0x5c, 0x84, 0xec, 0x3c, + 0xfc, 0x1b, 0x39, 0xd1, 0xc9, 0x61, 0x50, 0x83, 0x90, 0x4c, 0x8c, 0x3c, 0xc4, 0x26, 0x82, 0xc3, + 0xa8, 0x4d, 0x60, 0xf3, 0x50, 0x02, 0xb3, 0x1b, 0xb6, 0x37, 0x48, 0x28, 0xe2, 0xe1, 0xf8, 0x83, + 0x6a, 0x30, 0x84, 0x0e, 0x15, 0x8e, 0x7f, 0x38, 0xbd, 0xec, 0x05, 0xf3, 0x8d, 0x1c, 0x38, 0xb9, + 0x02, 0x6d, 0xe8, 0x5a, 0x6d, 0x52, 0x83, 0x40, 0x12, 0xf7, 0xf0, 0x92, 0x78, 0x1c, 0xc7, 0xf9, + 0xa0, 0x2f, 0x78, 0x09, 0xbc, 0x3a, 0x94, 0xc0, 0x33, 0x38, 0x09, 0xdc, 0x2a, 0x48, 0x67, 0x02, + 0xd7, 0xaa, 0xcf, 0x80, 0xb9, 0xba, 0xe3, 0x5b, 0x5b, 0x56, 0x9b, 0xf8, 0xa0, 0xfd, 0x9c, 0x0c, + 0xf2, 0x35, 0xcb, 0xf3, 0xb5, 0x52, 0xd4, 0x9d, 0x5c, 0x0f, 0x66, 0x2d, 0xbb, 0xdd, 0xdd, 0xeb, + 0x40, 0x03, 0x9a, 0xa4, 0x5f, 0x99, 0x36, 0xd8, 0xa4, 0x68, 0x6b, 0x1f, 0xb1, 0x25, 0x07, 0x5b, + 0xfb, 0xbf, 0x25, 0xbc, 0x0c, 0xc3, 0xb2, 0x80, 0xe3, 0x52, 0xc6, 0xd8, 0x5d, 0x25, 0x30, 0x6f, + 0x33, 0x59, 0x03, 0x83, 0xbd, 0xff, 0x5e, 0x02, 0x96, 0x9c, 0xc1, 0x7f, 0xa1, 0x7d, 0x40, 0xa8, + 0xb1, 0x0e, 0x63, 0x28, 0x1d, 0x32, 0xcb, 0x23, 0x4c, 0x92, 0x55, 0xb0, 0x50, 0xad, 0xb7, 0x74, + 0xa3, 0x5e, 0xaa, 0xd1, 0x2c, 0xb2, 0xf6, 0xaf, 0x12, 0x28, 0x18, 0xb0, 0xd7, 0xdd, 0x67, 0x03, + 0x4f, 0x53, 0x47, 0xf1, 0x5c, 0xe8, 0x28, 0xae, 0x2e, 0x03, 0x60, 0xb6, 0x51, 0xc1, 0xf8, 0x66, + 0x2e, 0x69, 0x60, 0x38, 0x53, 0xae, 0x82, 0xa5, 0x30, 0xb7, 0xc1, 0x7c, 0xa9, 0xbd, 0x58, 0x78, + 0xe7, 0x88, 0xa3, 0x86, 0x39, 0x8c, 0xe9, 0x13, 0x3e, 0x28, 0xb4, 0xd9, 0x33, 0x94, 0xdc, 0xd1, + 0x88, 0xff, 0x2b, 0x12, 0xc8, 0xb7, 0x50, 0x6f, 0xc9, 0x74, 0x9c, 0x9f, 0x1d, 0x4d, 0xc7, 0x11, + 0x99, 0x18, 0x1d, 0xbf, 0x17, 0xcc, 0xb1, 0x1a, 0x4b, 0x5d, 0x25, 0x12, 0x55, 0x9c, 0xfb, 0x60, + 0x14, 0x0d, 0x1f, 0xc0, 0xce, 0xd1, 0x88, 0xf8, 0xd3, 0x8f, 0x07, 0x60, 0x0d, 0xee, 0x5e, 0x84, + 0xae, 0xb7, 0x63, 0xf5, 0xb4, 0xbf, 0x96, 0xc1, 0xcc, 0x0a, 0xf4, 0x9b, 0xbe, 0xe9, 0xef, 0x79, + 0x7d, 0xdb, 0x9d, 0xb6, 0x53, 0x36, 0xdb, 0x3b, 0x90, 0x76, 0x47, 0xc1, 0xa3, 0xf6, 0x1e, 0x59, + 0xd4, 0x9f, 0x28, 0x2a, 0x67, 0x31, 0x2c, 0x23, 0x06, 0x93, 0x27, 0x80, 0x7c, 0xc7, 0xf4, 0x4d, + 0x8a, 0xc5, 0x35, 0x7d, 0x58, 0x44, 0x84, 0x0c, 0x9c, 0x4d, 0x7b, 0x87, 0x24, 0xe2, 0x50, 0x24, + 0x50, 0x7e, 0x3a, 0x10, 0x3e, 0x90, 0x1b, 0x01, 0x85, 0x13, 0x60, 0xbe, 0xde, 0x68, 0x6d, 0xd6, + 0x1a, 0x2b, 0x2b, 0x3a, 0x4a, 0x55, 0x64, 0xf5, 0x14, 0x50, 0xd7, 0x4b, 0x17, 0xd6, 0xf4, 0x7a, + 0x6b, 0xb3, 0xde, 0xa8, 0xe8, 0xf4, 0xcb, 0xbc, 0x7a, 0x1c, 0xcc, 0x96, 0x4b, 0xe5, 0xd5, 0x20, + 0xa1, 0xa0, 0x9e, 0x06, 0x27, 0xd7, 0xf4, 0xb5, 0x25, 0xdd, 0x68, 0xae, 0x56, 0xd7, 0x37, 0x11, + 0x99, 0xe5, 0xc6, 0x46, 0xbd, 0xa2, 0x14, 0x55, 0x0d, 0x9c, 0x62, 0xde, 0x9c, 0x37, 0x1a, 0xf5, + 0x95, 0xcd, 0x66, 0xab, 0xd4, 0xd2, 0x95, 0x29, 0xf5, 0x2a, 0x70, 0xbc, 0x5c, 0xaa, 0xe3, 0xec, + 0xe5, 0x46, 0xbd, 0xae, 0x97, 0x5b, 0xca, 0xb4, 0xf6, 0xef, 0x79, 0x30, 0x5b, 0xf5, 0xea, 0xe6, + 0x2e, 0x3c, 0x67, 0x76, 0xad, 0x8e, 0xf6, 0x22, 0x66, 0xe6, 0x71, 0x23, 0x98, 0x77, 0xc9, 0x5f, + 0xd8, 0x69, 0x59, 0x90, 0xa0, 0x39, 0x6f, 0xf0, 0x89, 0x68, 0x4e, 0x6e, 0x63, 0x02, 0xc1, 0x9c, + 0x9c, 0x3c, 0xa9, 0x4b, 0x00, 0x90, 0x7f, 0xad, 0xe8, 0x8e, 0xd8, 0xb3, 0xfd, 0xad, 0xc9, 0xdc, + 0x85, 0x1e, 0x74, 0x2f, 0x5b, 0x6d, 0x18, 0xe4, 0x34, 0x98, 0xaf, 0xb4, 0x3f, 0x95, 0x45, 0xf7, + 0x17, 0x19, 0x50, 0x99, 0xea, 0xc4, 0xf4, 0x86, 0x3f, 0x22, 0x8b, 0xec, 0x0e, 0x0a, 0x91, 0x4c, + 0xa7, 0x29, 0x2f, 0x95, 0x46, 0x5b, 0xb6, 0x6d, 0x35, 0x1a, 0x9b, 0xcd, 0xd5, 0x86, 0xd1, 0x52, + 0x64, 0x75, 0x0e, 0x4c, 0xa3, 0xc7, 0x5a, 0xa3, 0xbe, 0xa2, 0xe4, 0xd5, 0xab, 0xc1, 0x89, 0xd5, + 0x52, 0x73, 0xb3, 0x5a, 0x3f, 0x57, 0xaa, 0x55, 0x2b, 0x9b, 0xe5, 0xd5, 0x92, 0xd1, 0x54, 0x0a, + 0xea, 0x35, 0xe0, 0xea, 0x56, 0x55, 0x37, 0x36, 0x97, 0xf5, 0x52, 0x6b, 0xc3, 0xd0, 0x9b, 0x9b, + 0xf5, 0xc6, 0x66, 0xbd, 0xb4, 0xa6, 0x2b, 0x45, 0xd4, 0xfc, 0xf1, 0xab, 0x48, 0x6d, 0xa6, 0x0e, + 0x2a, 0xe3, 0x74, 0x8c, 0x32, 0xce, 0xf4, 0x2b, 0x23, 0x60, 0xd5, 0xca, 0xd0, 0x9b, 0xba, 0x71, + 0x4e, 0x57, 0x66, 0x07, 0xe9, 0xda, 0x9c, 0x7a, 0x12, 0x28, 0x88, 0x87, 0xcd, 0x6a, 0x33, 0xc8, + 0x59, 0x51, 0xe6, 0xb5, 0x4f, 0x15, 0xc1, 0x29, 0x03, 0x6e, 0x5b, 0x9e, 0x0f, 0xdd, 0x75, 0x73, + 0x7f, 0x17, 0xda, 0x7e, 0xd0, 0xc9, 0xff, 0x73, 0x6a, 0x65, 0x5c, 0x03, 0xf3, 0x3d, 0x42, 0x63, + 0x0d, 0xfa, 0x3b, 0x4e, 0x87, 0x8e, 0xc2, 0x8f, 0x8b, 0xed, 0x39, 0x16, 0xd7, 0xd9, 0xec, 0x06, + 0xff, 0x35, 0xa3, 0xdb, 0x72, 0x82, 0x6e, 0xe7, 0x47, 0xd1, 0x6d, 0xf5, 0x5a, 0x30, 0xb3, 0xe7, + 0x41, 0x57, 0xdf, 0x35, 0xad, 0x6e, 0x70, 0xc7, 0x67, 0x98, 0xa0, 0xbd, 0x33, 0x2f, 0x7a, 0x62, + 0x85, 0xa9, 0xcb, 0x60, 0x31, 0xc6, 0xf4, 0xad, 0x67, 0x00, 0xa0, 0x95, 0xdd, 0x70, 0xbb, 0x54, + 0x59, 0x99, 0x14, 0xc4, 0xdf, 0x45, 0xab, 0xdb, 0xb5, 0xec, 0xed, 0x70, 0xdf, 0x3f, 0x4a, 0xd0, + 0x5e, 0x2a, 0x8b, 0x9c, 0x60, 0x49, 0xcb, 0x5b, 0xba, 0xd6, 0xf4, 0x62, 0x69, 0xc2, 0xfd, 0xee, + 0xc1, 0xa6, 0x53, 0x54, 0x15, 0x30, 0x87, 0xd3, 0x68, 0x0b, 0x54, 0xa6, 0x50, 0x1f, 0x1c, 0x90, + 0x5b, 0xd3, 0x5b, 0xab, 0x8d, 0x4a, 0xf8, 0x6e, 0x1a, 0x91, 0x44, 0xcc, 0x94, 0xea, 0x17, 0x70, + 0x6b, 0x9c, 0x51, 0x1f, 0x03, 0xae, 0x61, 0x3a, 0xec, 0x52, 0xcd, 0xd0, 0x4b, 0x95, 0x0b, 0x9b, + 0xfa, 0xb3, 0xaa, 0xcd, 0x56, 0x93, 0x6f, 0x5c, 0x41, 0x3b, 0x9a, 0x45, 0xfc, 0xea, 0x6b, 0xa5, + 0x6a, 0x8d, 0xf6, 0xef, 0xcb, 0x0d, 0x63, 0xad, 0xd4, 0x52, 0xe6, 0xb4, 0x57, 0xc8, 0x40, 0x59, + 0x81, 0xfe, 0xba, 0xe3, 0xfa, 0x66, 0xb7, 0x66, 0xd9, 0x97, 0x36, 0xdc, 0x2e, 0x37, 0xd9, 0x14, + 0x0e, 0xd3, 0xc1, 0x0f, 0x91, 0x1c, 0xc1, 0xf8, 0x1d, 0xf1, 0x1e, 0xce, 0x16, 0x29, 0x53, 0x94, + 0xa0, 0x3d, 0x57, 0x12, 0x59, 0xee, 0x16, 0x2f, 0x35, 0x9d, 0x9e, 0x3c, 0x6f, 0xd2, 0xe3, 0xf3, + 0x00, 0xd4, 0x8a, 0xda, 0x0b, 0xf2, 0x60, 0x7a, 0xd9, 0xb2, 0xcd, 0xae, 0xf5, 0x1c, 0x2e, 0x3a, + 0x66, 0xd4, 0xc7, 0xe4, 0x12, 0xfa, 0x18, 0x69, 0xa4, 0xf1, 0xf3, 0xa7, 0x64, 0xd1, 0xe5, 0x05, + 0x46, 0xf6, 0x01, 0x93, 0x31, 0x83, 0xe7, 0x47, 0x25, 0x91, 0xe5, 0x85, 0xe1, 0xf4, 0xd2, 0x61, + 0xf8, 0x99, 0x6f, 0x0f, 0x1b, 0xab, 0xaf, 0x7d, 0x4f, 0x0f, 0x52, 0x85, 0x19, 0xed, 0xf7, 0x64, + 0xa0, 0xad, 0x40, 0xff, 0x1c, 0x74, 0xc3, 0xa9, 0x00, 0xee, 0xf5, 0xa9, 0xbd, 0xcd, 0x34, 0xd9, + 0x37, 0xb3, 0x00, 0x9e, 0xe7, 0x01, 0x2c, 0x25, 0x34, 0x9e, 0x18, 0xd2, 0x31, 0x8d, 0xb7, 0x0a, + 0x8a, 0x1e, 0x7e, 0x4f, 0xd5, 0xec, 0x89, 0xf1, 0xc3, 0x25, 0x26, 0xc6, 0x52, 0x27, 0x84, 0x0d, + 0x4a, 0x40, 0xfb, 0x66, 0x38, 0x09, 0xfa, 0x1e, 0x4e, 0x3b, 0x96, 0x0f, 0xcd, 0x6c, 0x3a, 0x7d, + 0x71, 0xb3, 0x55, 0x97, 0x41, 0xf6, 0x8d, 0xf6, 0xd1, 0x02, 0x38, 0x39, 0xa8, 0x3a, 0xda, 0x2f, + 0xe7, 0xb8, 0x1d, 0x76, 0x88, 0x87, 0xfc, 0x1c, 0xdd, 0x40, 0x44, 0x0f, 0xea, 0x93, 0xc1, 0xd5, + 0xe1, 0x32, 0x5c, 0xcb, 0xa9, 0xc3, 0x2b, 0x5e, 0x17, 0xfa, 0x3e, 0x74, 0x71, 0xd5, 0xa6, 0x8d, + 0xc1, 0x2f, 0xd5, 0xa7, 0x82, 0x47, 0x59, 0xb6, 0x67, 0x75, 0xa0, 0xdb, 0xb2, 0x7a, 0x5e, 0xc9, + 0xee, 0xb4, 0xf6, 0x7c, 0xc7, 0xb5, 0x4c, 0x7a, 0x23, 0xe5, 0xb4, 0x11, 0xf7, 0x5a, 0xbd, 0x05, + 0x28, 0x96, 0xd7, 0xb0, 0x2f, 0x3a, 0xa6, 0xdb, 0xb1, 0xec, 0xed, 0x9a, 0xe5, 0xf9, 0xd4, 0x03, + 0xf8, 0x40, 0xba, 0xf6, 0x37, 0xb2, 0xe8, 0x61, 0xba, 0x21, 0xb0, 0xc6, 0x74, 0x28, 0x2f, 0x94, + 0x45, 0x8e, 0xc7, 0xa5, 0xa3, 0x9d, 0x4e, 0x59, 0x9e, 0x3f, 0x69, 0x43, 0x62, 0xf0, 0x08, 0x8e, + 0xbb, 0x16, 0x92, 0x1e, 0x18, 0x02, 0xe7, 0x74, 0xa3, 0xba, 0x5c, 0xd5, 0x91, 0x59, 0x71, 0x35, + 0x38, 0x11, 0xbd, 0xab, 0x5c, 0xd8, 0x6c, 0xea, 0xf5, 0x96, 0x32, 0x8d, 0xfa, 0x29, 0x92, 0xbc, + 0x5c, 0xaa, 0xd6, 0xf4, 0xca, 0x66, 0xab, 0x81, 0xde, 0x54, 0x46, 0x33, 0x2d, 0xb4, 0x87, 0xf2, + 0xe0, 0x38, 0x96, 0xed, 0x3e, 0x96, 0x2a, 0x12, 0x4a, 0x9f, 0xaf, 0x6d, 0x08, 0xd0, 0x0c, 0x11, + 0xaf, 0xf6, 0xbb, 0xc2, 0x17, 0x6e, 0x32, 0x10, 0xf6, 0x95, 0x11, 0xa3, 0x19, 0xdf, 0x90, 0x44, + 0x22, 0x54, 0x08, 0x93, 0x4d, 0xa7, 0x14, 0xff, 0x32, 0xe9, 0x11, 0x27, 0x1e, 0x7c, 0x6c, 0x65, + 0x96, 0xf1, 0xc7, 0xcf, 0x5a, 0xaf, 0x1a, 0x58, 0x1d, 0x16, 0x00, 0xc0, 0x29, 0x58, 0x83, 0x88, + 0x1e, 0x0c, 0x1c, 0xaf, 0xe2, 0xf4, 0xa0, 0x54, 0x6e, 0x55, 0xcf, 0xe9, 0x71, 0x7a, 0xf0, 0x39, + 0x19, 0x4c, 0xaf, 0x40, 0x1f, 0xcd, 0xa9, 0x3c, 0xed, 0x69, 0x02, 0xeb, 0x3f, 0xc8, 0x8c, 0xe9, + 0x3a, 0x6d, 0xb3, 0x1b, 0x2e, 0x03, 0x90, 0x27, 0xed, 0x87, 0x47, 0x31, 0x41, 0x82, 0xa2, 0x63, + 0xc6, 0xab, 0xef, 0x06, 0x05, 0x1f, 0xbd, 0xa6, 0xcb, 0xd0, 0xdf, 0x11, 0x3b, 0x5c, 0x21, 0x22, + 0x15, 0xd3, 0x37, 0x0d, 0x92, 0x9f, 0x19, 0x9d, 0x04, 0x6d, 0x97, 0x18, 0x46, 0xbe, 0x1d, 0xed, + 0xcf, 0xbf, 0x94, 0xc1, 0xd5, 0xa4, 0x7d, 0x94, 0x7a, 0xbd, 0xa6, 0xef, 0xb8, 0xd0, 0x80, 0x6d, + 0x68, 0xf5, 0xfc, 0xbe, 0xf5, 0x3d, 0x97, 0xa4, 0x06, 0x9b, 0xcd, 0xf4, 0x51, 0x7b, 0x83, 0x2c, + 0x1a, 0xe1, 0xf7, 0x40, 0x7b, 0xec, 0x2b, 0x2f, 0xa6, 0xb1, 0x7f, 0x52, 0x12, 0x89, 0xd9, 0x9b, + 0x92, 0x78, 0x3a, 0xa0, 0x3e, 0x76, 0x04, 0x40, 0x05, 0x2b, 0x37, 0x86, 0x5e, 0xd6, 0xab, 0xeb, + 0x68, 0x10, 0xb8, 0x0e, 0x3c, 0x7a, 0x7d, 0xc3, 0x28, 0xaf, 0x96, 0x9a, 0xfa, 0xa6, 0xa1, 0xaf, + 0x54, 0x9b, 0x2d, 0xea, 0x94, 0x45, 0xbe, 0x9a, 0x52, 0xaf, 0x05, 0xa7, 0x9b, 0x1b, 0x4b, 0xcd, + 0xb2, 0x51, 0x5d, 0xc7, 0xe9, 0x86, 0x5e, 0xd7, 0xcf, 0xd3, 0xb7, 0xd3, 0xda, 0x87, 0x15, 0x30, + 0x8b, 0x26, 0x00, 0x4d, 0x32, 0x2f, 0xd0, 0xfe, 0x2e, 0x0f, 0x66, 0x0d, 0xe8, 0x39, 0xdd, 0xcb, + 0x78, 0x8e, 0x30, 0xa9, 0xa9, 0xc7, 0xd7, 0x65, 0xd1, 0xf3, 0xdb, 0x0c, 0xb3, 0x8b, 0x0c, 0xa3, + 0xf1, 0x13, 0x4d, 0xf3, 0xb2, 0x69, 0x75, 0xcd, 0x8b, 0xb4, 0xab, 0x99, 0x36, 0xa2, 0x04, 0x75, + 0x11, 0xa8, 0xce, 0x15, 0x1b, 0xba, 0xcd, 0xf6, 0x15, 0xdd, 0xdf, 0x29, 0x75, 0x3a, 0x2e, 0xf4, + 0x3c, 0xba, 0x7a, 0x31, 0xe0, 0x8d, 0x7a, 0x33, 0x38, 0x8e, 0x53, 0x99, 0xcc, 0xc4, 0x41, 0xa6, + 0x3f, 0x39, 0xcc, 0x59, 0xb2, 0xf7, 0x83, 0x9c, 0x05, 0x26, 0x67, 0x94, 0xcc, 0x1e, 0x97, 0x28, + 0xf2, 0xa7, 0x74, 0xae, 0x07, 0xb3, 0xb6, 0xb9, 0x0b, 0xf5, 0x07, 0x7b, 0x96, 0x0b, 0x3d, 0xec, + 0x18, 0x23, 0x1b, 0x6c, 0x92, 0xf6, 0x51, 0xa1, 0xf3, 0xe6, 0x62, 0x12, 0x4b, 0xa7, 0xfb, 0x2b, + 0x23, 0xa8, 0xfe, 0x80, 0x7e, 0x46, 0xd6, 0x3e, 0x2c, 0x83, 0x39, 0xca, 0x54, 0xc9, 0xde, 0xaf, + 0x76, 0xb4, 0xeb, 0x38, 0xe3, 0xd7, 0x44, 0x69, 0x81, 0xf1, 0x8b, 0x1f, 0xb4, 0x1f, 0x95, 0x45, + 0xdd, 0x9d, 0x07, 0x54, 0x1c, 0x97, 0x11, 0xef, 0x38, 0xba, 0xe5, 0xec, 0x51, 0x47, 0xd5, 0x69, + 0x83, 0x3c, 0x64, 0xb9, 0xa8, 0xa7, 0xfd, 0xaa, 0x90, 0x33, 0xb5, 0x60, 0x35, 0x8e, 0x08, 0xc0, + 0x4f, 0xcb, 0x60, 0x81, 0x72, 0xd5, 0xa4, 0xe7, 0x7c, 0x84, 0x0e, 0xbc, 0xfd, 0xb8, 0xb0, 0x21, + 0x38, 0xa0, 0xfe, 0xb4, 0xa4, 0x47, 0x0c, 0x90, 0x1f, 0x17, 0x0a, 0x8e, 0x26, 0x5c, 0x91, 0x23, + 0x82, 0xf2, 0x5d, 0x79, 0x30, 0xbb, 0xe1, 0x41, 0x97, 0xfa, 0xed, 0x6b, 0x0f, 0xe7, 0x81, 0xbc, + 0x02, 0xb9, 0x8d, 0xd4, 0x97, 0x08, 0x7b, 0xf8, 0xb2, 0x95, 0x65, 0x88, 0x22, 0x1b, 0x29, 0x06, + 0xb6, 0x9b, 0xc0, 0x02, 0x11, 0x69, 0xc9, 0xf7, 0x91, 0x91, 0x18, 0x78, 0xd3, 0xf6, 0xa5, 0x8e, + 0x63, 0xab, 0x08, 0x97, 0x85, 0xb2, 0x94, 0x11, 0x4f, 0x35, 0xb8, 0x45, 0xe6, 0xb3, 0x79, 0xa3, + 0x2f, 0x55, 0xbd, 0x1d, 0x5c, 0xe5, 0xf4, 0x20, 0x39, 0xbf, 0xc2, 0x64, 0x2e, 0xe0, 0xcc, 0x83, + 0x5e, 0x69, 0x7f, 0x27, 0xe4, 0xab, 0x2b, 0x2e, 0x9d, 0x74, 0xba, 0xd0, 0x1b, 0x8f, 0x49, 0x72, + 0x12, 0x28, 0x28, 0x07, 0xde, 0x7f, 0x31, 0xf4, 0x66, 0xa3, 0x76, 0x4e, 0x1f, 0xbc, 0x8c, 0x51, + 0xd0, 0x9e, 0x2f, 0x83, 0x99, 0x25, 0xd7, 0x31, 0x3b, 0x6d, 0xd3, 0xf3, 0xb5, 0x6f, 0x4a, 0x60, + 0x6e, 0xdd, 0xdc, 0xef, 0x3a, 0x66, 0x07, 0xfb, 0xf7, 0xf7, 0xf5, 0x05, 0x3d, 0xf2, 0x2a, 0xe8, + 0x0b, 0xe8, 0x23, 0x7f, 0x30, 0x30, 0x3c, 0xba, 0x97, 0x13, 0xb9, 0x57, 0x33, 0xdc, 0xe6, 0x93, + 0x06, 0x05, 0x2b, 0x0d, 0xf8, 0x5a, 0x64, 0x79, 0x8a, 0xb1, 0x28, 0x3f, 0x2c, 0x16, 0x7e, 0x54, + 0x84, 0xe4, 0xd1, 0xec, 0xca, 0xbf, 0x60, 0x1a, 0x14, 0x2b, 0x10, 0x5b, 0x71, 0xff, 0x5d, 0x02, + 0x53, 0x4d, 0xe8, 0x63, 0x0b, 0xee, 0x4e, 0xce, 0x53, 0xb8, 0x83, 0x33, 0x44, 0x4e, 0xec, 0xc1, + 0x33, 0x9a, 0xac, 0x33, 0xe7, 0xad, 0xf1, 0xff, 0x14, 0x1e, 0x89, 0xa4, 0xdc, 0x45, 0x5a, 0xe6, + 0xa1, 0x3c, 0x12, 0x13, 0x49, 0x65, 0xef, 0x6b, 0xf5, 0x1e, 0x89, 0xba, 0x56, 0x31, 0xbd, 0xde, + 0x6b, 0x58, 0xfd, 0x4c, 0xf4, 0x36, 0xa3, 0xcc, 0x27, 0x38, 0x47, 0x3d, 0x09, 0x4c, 0x11, 0x99, + 0x07, 0xf3, 0xd1, 0x7e, 0x3f, 0x05, 0x42, 0x02, 0x9f, 0xbd, 0x0e, 0x72, 0x0a, 0xba, 0xa8, 0xc5, + 0x17, 0x3e, 0x91, 0x18, 0x04, 0x73, 0x75, 0xe8, 0x5f, 0x71, 0xdc, 0x4b, 0x4d, 0xdf, 0xf4, 0xa1, + 0xf6, 0x2f, 0x12, 0xb9, 0x2e, 0x8f, 0x89, 0x7e, 0x52, 0x07, 0x27, 0x48, 0x85, 0x68, 0x46, 0xdc, + 0x7f, 0x93, 0x8a, 0x5c, 0x3f, 0x50, 0x08, 0x4c, 0x3e, 0xe3, 0xe0, 0xa7, 0xda, 0xcf, 0x0c, 0x0c, + 0xfa, 0x24, 0x0d, 0x98, 0x34, 0x50, 0xc9, 0xb0, 0x0c, 0xc6, 0xdf, 0x8f, 0xa7, 0x7d, 0x44, 0xc8, + 0xac, 0x16, 0xa3, 0x79, 0x34, 0x5d, 0xc1, 0xbf, 0x3d, 0x0e, 0xe4, 0xcb, 0x3b, 0xa6, 0xaf, 0xbd, + 0x5b, 0x06, 0xa0, 0xd4, 0xe9, 0xac, 0x11, 0x1f, 0x70, 0xd6, 0x21, 0xed, 0x2c, 0x98, 0x6b, 0xef, + 0x98, 0xd1, 0xcd, 0x19, 0xa4, 0x3f, 0xe0, 0xd2, 0xd4, 0x27, 0x47, 0xce, 0xe4, 0x44, 0xaa, 0x5a, + 0x1f, 0x4c, 0xa8, 0x0c, 0x4a, 0x3b, 0x74, 0x34, 0xe7, 0x43, 0x61, 0x26, 0x1e, 0xa1, 0x43, 0x9f, + 0x2f, 0x46, 0xec, 0xc5, 0xcf, 0xe1, 0x28, 0xe9, 0xf0, 0x80, 0x4d, 0x94, 0x90, 0xf2, 0xa4, 0xb7, + 0x58, 0x40, 0x8f, 0x64, 0xbe, 0x26, 0x12, 0xba, 0x56, 0xd5, 0x3b, 0x56, 0x20, 0x5a, 0x1a, 0x30, + 0x4b, 0x7b, 0x71, 0x2e, 0x1d, 0x7c, 0xc9, 0x82, 0x7b, 0x06, 0x98, 0x87, 0x1d, 0xcb, 0x87, 0x41, + 0x2d, 0xa9, 0x00, 0x93, 0x20, 0xe6, 0x3f, 0xd0, 0x9e, 0x27, 0x1c, 0x74, 0x0d, 0x0b, 0xf4, 0x60, + 0x8d, 0x62, 0xda, 0x9f, 0x58, 0x18, 0x35, 0x31, 0x9a, 0xd9, 0x83, 0xf5, 0xc3, 0x32, 0xb8, 0xba, + 0xe5, 0x6c, 0x6f, 0x77, 0x61, 0x20, 0x26, 0x48, 0xbc, 0x33, 0x35, 0x73, 0x9c, 0x70, 0xe1, 0x9d, + 0x20, 0xe7, 0x01, 0x2b, 0x3c, 0x4a, 0x86, 0x1e, 0xf8, 0x13, 0x53, 0x89, 0xb3, 0x28, 0x2c, 0xae, + 0x81, 0x7c, 0xc6, 0xa0, 0x20, 0x16, 0xf0, 0x59, 0x98, 0x6c, 0xf6, 0x40, 0x7c, 0x41, 0x02, 0xf3, + 0xe4, 0x5e, 0xc4, 0x40, 0x41, 0xef, 0x1f, 0x23, 0x00, 0xda, 0x37, 0x73, 0xa2, 0x7e, 0xb6, 0x58, + 0x26, 0x1c, 0x27, 0x31, 0x22, 0x16, 0x0b, 0xaa, 0x32, 0x94, 0xdc, 0x04, 0x6e, 0xea, 0xcc, 0x83, + 0xd9, 0x15, 0x18, 0xb4, 0x34, 0x4f, 0x7b, 0x7f, 0xca, 0x9e, 0xe8, 0x2c, 0x98, 0xc3, 0x97, 0x83, + 0x35, 0xe8, 0x31, 0x49, 0xb2, 0x6a, 0xc6, 0xa5, 0xa9, 0x37, 0x82, 0xf9, 0x8b, 0x70, 0xcb, 0x71, + 0x61, 0x83, 0x3b, 0x4b, 0xc9, 0x27, 0x0e, 0x0e, 0x4f, 0xa7, 0xde, 0x0c, 0x8e, 0x53, 0x47, 0xf7, + 0x25, 0x34, 0xd7, 0x37, 0xdd, 0x7d, 0x7a, 0x30, 0xad, 0x3f, 0x59, 0xfb, 0x4b, 0xb6, 0xc1, 0x2c, + 0xf1, 0x28, 0xde, 0x7a, 0x50, 0xec, 0x4c, 0xa5, 0x63, 0x46, 0xa7, 0xa7, 0x80, 0x69, 0xaa, 0x23, + 0x81, 0x41, 0x97, 0xd4, 0x83, 0x86, 0x79, 0xd5, 0xa7, 0x80, 0x19, 0x24, 0x22, 0x6c, 0x37, 0xd0, + 0xae, 0xf7, 0xf4, 0x80, 0x0f, 0xf1, 0x7b, 0x23, 0xca, 0xaa, 0xfd, 0x42, 0xa8, 0x33, 0x3a, 0xa7, + 0x33, 0x4f, 0x4c, 0xc3, 0xfc, 0x44, 0x2e, 0x92, 0x57, 0x98, 0xf2, 0x97, 0xf6, 0xab, 0x1d, 0x4f, + 0x5b, 0x4b, 0xa7, 0x35, 0x67, 0x00, 0x08, 0x9b, 0x5f, 0x10, 0x38, 0x83, 0x49, 0xe1, 0x63, 0xe3, + 0x27, 0x1e, 0x05, 0xec, 0x17, 0x07, 0x66, 0x67, 0xbc, 0x80, 0x0a, 0x1e, 0x21, 0x14, 0xe1, 0x24, + 0x7b, 0x74, 0x7e, 0x3e, 0x0f, 0xae, 0x0e, 0x4f, 0x38, 0xd5, 0x4c, 0x2f, 0x6a, 0xd9, 0x17, 0xd2, + 0x41, 0xc4, 0x1d, 0x29, 0x09, 0x9b, 0xe3, 0x49, 0x50, 0xf0, 0xf6, 0x2e, 0x86, 0x8e, 0x80, 0xe4, + 0x41, 0x7b, 0xa3, 0x9c, 0x6a, 0xac, 0x1a, 0xc8, 0xdf, 0x98, 0x1b, 0xe1, 0xad, 0xe0, 0x84, 0xbd, + 0xb7, 0x1b, 0x62, 0x81, 0x7b, 0x1a, 0xda, 0xb3, 0x1c, 0x7c, 0xc1, 0x37, 0xd9, 0xbc, 0x78, 0x93, + 0x4d, 0x31, 0x92, 0x8a, 0x54, 0x3a, 0x7b, 0xf5, 0xf8, 0x4c, 0xdf, 0x11, 0xb4, 0x72, 0x6a, 0xa5, + 0x20, 0xf0, 0x4b, 0x2c, 0xfc, 0xff, 0x94, 0x4b, 0xd5, 0xf3, 0x0e, 0x3f, 0xb9, 0x96, 0xa2, 0x27, + 0x3c, 0xca, 0x63, 0x6b, 0x9f, 0x97, 0x80, 0xd6, 0x8c, 0x1c, 0x72, 0x28, 0xa8, 0xeb, 0x2e, 0xbc, + 0x6c, 0xc1, 0x2b, 0x9c, 0xfb, 0xd6, 0x9b, 0x84, 0xe3, 0x50, 0xf3, 0xba, 0x72, 0x80, 0x68, 0xfc, + 0xba, 0xf8, 0x00, 0x5c, 0xc4, 0xe2, 0x4d, 0xa7, 0x2b, 0x71, 0x02, 0xb1, 0xc3, 0x25, 0x70, 0x86, + 0x41, 0x75, 0xd9, 0x75, 0x76, 0x13, 0x24, 0xfb, 0x0a, 0x56, 0xb2, 0x1b, 0xbc, 0x64, 0xef, 0x4d, + 0x54, 0x97, 0x01, 0x84, 0x63, 0xd4, 0xf1, 0xfd, 0xa1, 0x1c, 0x9f, 0xc5, 0xc9, 0xb1, 0x72, 0x48, + 0xfa, 0xd9, 0xcb, 0xf2, 0x0f, 0xf2, 0x60, 0xce, 0x80, 0x66, 0x27, 0x1c, 0x04, 0xfe, 0x6f, 0xc6, + 0xbc, 0x7b, 0x1a, 0xc8, 0xfb, 0xd1, 0x3a, 0xcd, 0xe3, 0x0e, 0x56, 0x86, 0xfd, 0x12, 0x3f, 0xe0, + 0xe5, 0x1a, 0xfc, 0xd1, 0x81, 0xde, 0x42, 0x12, 0xb0, 0x0d, 0x65, 0x11, 0xdb, 0x30, 0x3f, 0xc8, + 0x36, 0xbc, 0x19, 0x1c, 0xef, 0x9a, 0x9e, 0x5f, 0xb9, 0xd8, 0xb2, 0x76, 0xa1, 0xe7, 0x9b, 0xbb, + 0x3d, 0x6c, 0x05, 0xca, 0x46, 0x7f, 0x32, 0x7f, 0x0f, 0x7c, 0xe2, 0x79, 0xb0, 0x41, 0x55, 0x3c, + 0x7c, 0xcc, 0xdc, 0x0f, 0x09, 0x1d, 0xfe, 0x1a, 0x56, 0x76, 0x3a, 0xcd, 0xb8, 0x6f, 0x84, 0xb5, + 0xa5, 0x53, 0x40, 0x5d, 0xd3, 0x9b, 0xcd, 0xd2, 0x0a, 0x3e, 0x13, 0x12, 0x38, 0x09, 0x75, 0xce, + 0x3e, 0x16, 0x89, 0x8f, 0x20, 0xad, 0xce, 0x45, 0x63, 0xaf, 0x72, 0x4c, 0x9d, 0x05, 0x53, 0x2e, + 0xec, 0x75, 0x2d, 0xe8, 0x29, 0x39, 0xed, 0x1b, 0x12, 0x28, 0x6e, 0xd8, 0x2e, 0x34, 0x3b, 0xda, + 0x33, 0xe3, 0x87, 0x90, 0x11, 0x95, 0x82, 0x8f, 0x7b, 0x95, 0xb8, 0x2a, 0x4b, 0x1b, 0x1d, 0x62, + 0x64, 0x2c, 0xf0, 0x89, 0x2d, 0xc7, 0xc6, 0x97, 0x9a, 0x79, 0x93, 0x3e, 0x3b, 0x05, 0x0a, 0xfa, + 0x6e, 0xcf, 0xdf, 0x3f, 0xfb, 0x58, 0x30, 0xdf, 0xf4, 0x5d, 0x68, 0xee, 0x32, 0x9b, 0xea, 0xbe, + 0x73, 0x09, 0xda, 0xc1, 0xa6, 0x3a, 0x7e, 0xb8, 0xeb, 0x4e, 0x30, 0x65, 0x3b, 0x9b, 0xe6, 0x9e, + 0xbf, 0xa3, 0x5e, 0x77, 0x20, 0x1a, 0x0d, 0x55, 0xbf, 0x06, 0x0d, 0xff, 0xf7, 0xa7, 0x77, 0xe3, + 0xa9, 0x55, 0xd1, 0x76, 0x4a, 0x7b, 0xfe, 0xce, 0xd2, 0xb5, 0x9f, 0xfe, 0xb3, 0x33, 0xb9, 0xcf, + 0xfd, 0xd9, 0x99, 0xdc, 0x57, 0xfe, 0xec, 0x4c, 0xee, 0xc7, 0xff, 0xfc, 0xcc, 0xb1, 0xcf, 0xfd, + 0xf9, 0x99, 0x63, 0x5f, 0xf8, 0xf3, 0x33, 0xc7, 0xbe, 0x47, 0xea, 0x5d, 0xbc, 0x58, 0xc4, 0x54, + 0x9e, 0xf4, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xca, 0x85, 0x9f, 0xc3, 0x2b, 0x02, 0x00, } func (m *Rpc) Marshal() (dAtA []byte, err error) { @@ -85111,9 +85110,9 @@ func (m *RpcPublishingCreateRequest) MarshalToSizedBuffer(dAtA []byte) (int, err _ = i var l int _ = l - if m.IncludeSpaceInfo { + if m.JoinSpace { i-- - if m.IncludeSpaceInfo { + if m.JoinSpace { dAtA[i] = 1 } else { dAtA[i] = 0 @@ -128509,7 +128508,7 @@ func (m *RpcPublishingCreateRequest) Size() (n int) { if l > 0 { n += 1 + l + sovCommands(uint64(l)) } - if m.IncludeSpaceInfo { + if m.JoinSpace { n += 2 } return n @@ -165553,7 +165552,7 @@ func (m *RpcPublishingCreateRequest) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 4: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IncludeSpaceInfo", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field JoinSpace", wireType) } var v int for shift := uint(0); ; shift += 7 { @@ -165570,7 +165569,7 @@ func (m *RpcPublishingCreateRequest) Unmarshal(dAtA []byte) error { break } } - m.IncludeSpaceInfo = bool(v != 0) + m.JoinSpace = bool(v != 0) default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) diff --git a/pb/protos/commands.proto b/pb/protos/commands.proto index 2d606a395..7cef605fb 100644 --- a/pb/protos/commands.proto +++ b/pb/protos/commands.proto @@ -1497,7 +1497,7 @@ message Rpc { string spaceId = 1; string objectId = 2; string uri = 3; - bool includeSpaceInfo = 4; + bool joinSpace = 4; } message Response { Error error = 1; From 7dbe057a217a7cfabc178ddec7d1bd984bae624f Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Mon, 31 Mar 2025 12:12:57 +0200 Subject: [PATCH 116/132] GO-5362 fix relation format --- pkg/lib/bundle/relation.gen.go | 4 ++-- pkg/lib/bundle/relations.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/lib/bundle/relation.gen.go b/pkg/lib/bundle/relation.gen.go index f3b0e482b..b7995fd27 100644 --- a/pkg/lib/bundle/relation.gen.go +++ b/pkg/lib/bundle/relation.gen.go @@ -9,7 +9,7 @@ import ( "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) -const RelationChecksum = "6388e7cd19fabdc6953ebc6d1f2cd0208054d488b3fe538b7e013b38d7311108" +const RelationChecksum = "a23583f8faef1cbfcd05ca1d2761538e67bbdd1336d1a467a0d657b5f986b313" const ( RelationKeyTag domain.RelationKey = "tag" RelationKeyCamera domain.RelationKey = "camera" @@ -287,7 +287,7 @@ var ( DataSource: model.Relation_details, Description: "", - Format: model.RelationFormat_bool, + Format: model.RelationFormat_checkbox, Hidden: true, Id: "_brautoWidgetDisabled", Key: "autoWidgetDisabled", diff --git a/pkg/lib/bundle/relations.json b/pkg/lib/bundle/relations.json index a73c38167..75c3c2160 100644 --- a/pkg/lib/bundle/relations.json +++ b/pkg/lib/bundle/relations.json @@ -1518,7 +1518,7 @@ "source": "details" }, { - "format": "bool", + "format": "checkbox", "hidden": true, "key": "autoWidgetDisabled", "maxCount": 0, From 80d9e88d978d6aee7c1d7ebfbf835a6e920bedb0 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Mon, 31 Mar 2025 12:35:27 +0200 Subject: [PATCH 117/132] GO-5377 update any-sync / fix closed conn release / quic write deadline (#2279) --- core/debug/netcheck.go | 2 +- go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/debug/netcheck.go b/core/debug/netcheck.go index eff9f1b60..8940cd019 100644 --- a/core/debug/netcheck.go +++ b/core/debug/netcheck.go @@ -223,7 +223,7 @@ func (c config) GetYamux() yamux.Config { func (c config) GetQuic() quic.Config { return quic.Config{ - WriteTimeoutSec: 60, + WriteTimeoutSec: 1200, DialTimeoutSec: 60, KeepAlivePeriodSec: 120, } diff --git a/go.mod b/go.mod index 90c579cb2..c9c72031c 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/VividCortex/ewma v1.2.0 github.com/adrium/goheif v0.0.0-20230113233934-ca402e77a786 github.com/anyproto/any-store v0.1.12 - github.com/anyproto/any-sync v0.6.8 + github.com/anyproto/any-sync v0.6.10 github.com/anyproto/anytype-publish-server/publishclient v0.0.0-20250131145601-de288583ff2a github.com/anyproto/go-chash v0.1.0 github.com/anyproto/go-naturaldate/v2 v2.0.2-0.20230524105841-9829cfd13438 diff --git a/go.sum b/go.sum index cc79e314e..2958e410f 100644 --- a/go.sum +++ b/go.sum @@ -84,8 +84,8 @@ github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kk github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA= github.com/anyproto/any-store v0.1.12 h1:VgTyfxM4BvFnYMbwWxV9FQmXWNlwp9xriWFh6VOjcm0= github.com/anyproto/any-store v0.1.12/go.mod h1:T6WNuCHcuXIRiaZ+QAcBHdxIbPbgNCMIf1u3P9jvAyU= -github.com/anyproto/any-sync v0.6.8 h1:aMS7U+RWCqAqaCokCQjtBbiEsoBSBdLGz0kckxqMB2w= -github.com/anyproto/any-sync v0.6.8/go.mod h1:P1hd0Hrc66juMNlr/k7SG55aEwOrBAsKGkh9TsLdml8= +github.com/anyproto/any-sync v0.6.10 h1:TV3yLkp5NK7FkddUvVtfxT01t/Xi+DlKbvisGEQwmC0= +github.com/anyproto/any-sync v0.6.10/go.mod h1:TSKgCoTV40Bt8AfCh3RxPUUAfYGrhc8Mzh8/AiVlvX4= github.com/anyproto/anytype-publish-server/publishclient v0.0.0-20250131145601-de288583ff2a h1:ZZM+0OUCQMWSLSflpkf0ZMVo3V76qEDDIXPpQOClNs0= github.com/anyproto/anytype-publish-server/publishclient v0.0.0-20250131145601-de288583ff2a/go.mod h1:4fkueCZcGniSMXkrwESO8zzERrh/L7WHimRNWecfGM0= github.com/anyproto/badger/v4 v4.2.1-0.20240110160636-80743fa3d580 h1:Ba80IlCCxkZ9H1GF+7vFu/TSpPvbpDCxXJ5ogc4euYc= From e12520ddd6694b416b69f5187c8169a3cf8594c1 Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Mon, 31 Mar 2025 12:38:21 +0200 Subject: [PATCH 118/132] GO-5376 All objects --- core/block/editor/archive.go | 2 +- core/block/editor/widget.go | 24 ++++++++++++++++++++++++ core/block/editor/widget/widget.go | 1 + 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/core/block/editor/archive.go b/core/block/editor/archive.go index 7820d402a..af987c580 100644 --- a/core/block/editor/archive.go +++ b/core/block/editor/archive.go @@ -55,7 +55,7 @@ func (p *Archive) Init(ctx *smartblock.InitContext) (err error) { func (p *Archive) CreationStateMigration(ctx *smartblock.InitContext) migration.Migration { return migration.Migration{ - Version: 2, + Version: 3, Proc: func(st *state.State) { template.InitTemplate(st, template.WithEmpty, diff --git a/core/block/editor/widget.go b/core/block/editor/widget.go index 19a9855a6..7992cc6ba 100644 --- a/core/block/editor/widget.go +++ b/core/block/editor/widget.go @@ -14,6 +14,7 @@ import ( "github.com/anyproto/anytype-heart/core/block/simple" "github.com/anyproto/anytype-heart/core/domain" "github.com/anyproto/anytype-heart/core/session" + "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/localstore/addr" "github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore/spaceindex" @@ -56,6 +57,7 @@ func (w *WidgetObject) CreationStateMigration(ctx *smartblock.InitContext) migra return migration.Migration{ Version: 2, Proc: func(st *state.State) { + // we purposefully do not add the ALl Objects widget here(as in migration3), because for new users we don't want to auto-create it template.InitTemplate(st, template.WithEmpty, template.WithObjectTypes([]domain.TypeKey{bundle.TypeKeyDashboard}), @@ -112,6 +114,28 @@ func (w *WidgetObject) StateMigrations() migration.Migrations { }, }, + { + Version: 3, + Proc: func(s *state.State) { + // add All Objects widget for existing spaces + _, err := w.CreateBlock(s, &pb.RpcBlockCreateWidgetRequest{ + ContextId: s.RootId(), + WidgetLayout: model.BlockContentWidget_Link, + Position: model.Block_InnerFirst, + TargetId: s.RootId(), + ViewId: "", + Block: &model.Block{ + Id: "allObjects", + Content: &model.BlockContentOfLink{Link: &model.BlockContentLink{ + TargetBlockId: widget.DefaultWidgetAll, + }}, + }, + }) + if err != nil { + log.Warnf("all objects migration failed: %s", err.Error()) + } + }, + }, }, ) } diff --git a/core/block/editor/widget/widget.go b/core/block/editor/widget/widget.go index 86047cc69..93e8c014f 100644 --- a/core/block/editor/widget/widget.go +++ b/core/block/editor/widget/widget.go @@ -20,6 +20,7 @@ const ( DefaultWidgetRecent = "recent" DefaultWidgetCollection = "collection" DefaultWidgetBin = "bin" + DefaultWidgetAll = "allObject" DefaultWidgetRecentOpen = "recentOpen" autoWidgetBlockSuffix = "-wrapper" // in case blockId is specifically provided to avoid bad tree merges ) From f8b723b91eccddc430dade8df15df5e76212948b Mon Sep 17 00:00:00 2001 From: Anastasia Shemyakinskaya <36507473+AnastasiaShemyakinskaya@users.noreply.github.com> Date: Mon, 31 Mar 2025 15:01:56 +0300 Subject: [PATCH 119/132] GO-5249: Wrong file permissions on export (#2278) Signed-off-by: AnastasiaShemyakinskaya --- core/block/export/export.go | 5 +++++ core/block/export/writer_test.go | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/core/block/export/export.go b/core/block/export/export.go index 9c34bf8ec..6da3b7085 100644 --- a/core/block/export/export.go +++ b/core/block/export/export.go @@ -63,6 +63,8 @@ const ( FilesObjects = "filesObjects" Files = "files" + + defaultFileName = "untitled" ) var log = logging.Logger("anytype-mw-export") @@ -1258,6 +1260,9 @@ func (fn *namer) Get(path, hash, title, ext string) (name string) { title = slug.Make(strings.TrimSuffix(title, ext)) name = text.TruncateEllipsized(title, fileLenLimit) name = strings.TrimSuffix(name, text.TruncateEllipsis) + if name == "" { + name = defaultFileName + } var ( i = 0 b = 36 diff --git a/core/block/export/writer_test.go b/core/block/export/writer_test.go index 53be6b6ca..6126f3f7f 100644 --- a/core/block/export/writer_test.go +++ b/core/block/export/writer_test.go @@ -75,3 +75,22 @@ func TestZipWriter_WriteFile(t *testing.T) { } assert.True(t, found) } + +func TestZipWriter_Get(t *testing.T) { + t.Run("file without name", func(t *testing.T) { + // given + path, err := ioutil.TempDir("", "") + require.NoError(t, err) + defer os.RemoveAll(path) + + wr, err := newZipWriter(path, uniqName()+".zip") + require.NoError(t, err) + + // when + name := wr.Namer().Get(Files, "hash", "", "") + + // then + require.NoError(t, wr.Close()) + assert.Equal(t, filepath.Join(Files, defaultFileName), name) + }) +} From beb98a02a20210a1bd6959bd50e132b2663e550e Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Mon, 31 Mar 2025 14:10:49 +0200 Subject: [PATCH 120/132] GO-5376 fix --- core/block/editor/archive.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/block/editor/archive.go b/core/block/editor/archive.go index af987c580..7820d402a 100644 --- a/core/block/editor/archive.go +++ b/core/block/editor/archive.go @@ -55,7 +55,7 @@ func (p *Archive) Init(ctx *smartblock.InitContext) (err error) { func (p *Archive) CreationStateMigration(ctx *smartblock.InitContext) migration.Migration { return migration.Migration{ - Version: 3, + Version: 2, Proc: func(st *state.State) { template.InitTemplate(st, template.WithEmpty, From 773adfcaf86670f35fedc70d6df1020ccb37ffad Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Mon, 31 Mar 2025 14:13:28 +0200 Subject: [PATCH 121/132] GO-5303 fixes --- core/block/service.go | 3 --- core/block/widget.go | 5 ++--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/core/block/service.go b/core/block/service.go index 9e801e050..64934e594 100644 --- a/core/block/service.go +++ b/core/block/service.go @@ -35,7 +35,6 @@ import ( "github.com/anyproto/anytype-heart/core/files" "github.com/anyproto/anytype-heart/core/files/fileobject" "github.com/anyproto/anytype-heart/core/files/fileuploader" - "github.com/anyproto/anytype-heart/core/notifications" "github.com/anyproto/anytype-heart/core/session" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" @@ -101,7 +100,6 @@ type Service struct { builtinObjectService builtinObjects fileObjectService fileobject.Service detailsService detailservice.Service - notificationService notifications.Notifications fileService files.Service fileUploaderService fileuploader.Service @@ -129,7 +127,6 @@ func (s *Service) Init(a *app.App) (err error) { s.objectStore = a.MustComponent(objectstore.CName).(objectstore.ObjectStore) s.restriction = a.MustComponent(restriction.CName).(restriction.Service) s.bookmark = a.MustComponent("bookmark-importer").(bookmarksvc.Service) - s.notificationService = app.MustComponent[notifications.Notifications](a) s.objectCreator = app.MustComponent[objectcreator.Service](a) s.templateService = app.MustComponent[template.Service](a) s.spaceService = a.MustComponent(space.CName).(space.Service) diff --git a/core/block/widget.go b/core/block/widget.go index 3f3e70b14..1057e79c0 100644 --- a/core/block/widget.go +++ b/core/block/widget.go @@ -96,7 +96,7 @@ func (s *Service) CreateTypeWidgetIfMissing(ctx context.Context, spaceId string, } widgetObjectId := space.DerivedIDs().Widgets spaceIndex := s.objectStore.SpaceIndex(space.Id()) - widgetDetails, err := s.objectStore.SpaceIndex(space.Id()).GetDetails(widgetObjectId) + widgetDetails, err := spaceIndex.GetDetails(widgetObjectId) if err == nil { keys := widgetDetails.Get(bundle.RelationKeyAutoWidgetTargets).StringList() if slices.Contains(keys, typeId) { @@ -105,7 +105,7 @@ func (s *Service) CreateTypeWidgetIfMissing(ctx context.Context, spaceId string, } } // this is not optimal, maybe it should be some cheaper way - records, err := s.objectStore.SpaceIndex(space.Id()).QueryRaw(&database.Filters{FilterObj: database.FiltersAnd{ + records, err := spaceIndex.QueryRaw(&database.Filters{FilterObj: database.FiltersAnd{ database.FilterEq{ Key: bundle.RelationKeyType, Cond: model.BlockContentDataviewFilter_Equal, @@ -141,5 +141,4 @@ func (s *Service) CreateTypeWidgetIfMissing(ctx context.Context, spaceId string, return cache.DoState(s, widgetObjectId, func(st *state.State, w widget.Widget) (err error) { return w.AddAutoWidget(st, typeId, key.String(), addr.ObjectTypeAllViewId, model.BlockContentWidget_View, targetName) }) - return err } From ead1a4f57ccddb6dccbb5a47303272275edf8bf7 Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Mon, 31 Mar 2025 14:16:05 +0200 Subject: [PATCH 122/132] GO-5303 fixed --- core/block/detailservice/set_details.go | 2 +- core/block/editor/archive.go | 2 +- core/block/editor/widget/widget.go | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/block/detailservice/set_details.go b/core/block/detailservice/set_details.go index d1b38a66f..f1e4b01ed 100644 --- a/core/block/detailservice/set_details.go +++ b/core/block/detailservice/set_details.go @@ -273,6 +273,6 @@ func (s *service) createFavoriteWidget(spc clientspace.Space) error { } return cache.DoState(s.objectGetter, widgetObjectId, func(st *state.State, w widget.Widget) (err error) { - return w.AddAutoWidget(st, widget.DefaultWidgetFavorite, widget.DefaultWidgetFavorite, "", model.BlockContentWidget_CompactList, "Favorites") + return w.AddAutoWidget(st, widget.DefaultWidgetFavorite, widget.DefaultWidgetFavorite, "", model.BlockContentWidget_CompactList, widget.DefaultWidgetFavoriteEventName) }) } diff --git a/core/block/editor/archive.go b/core/block/editor/archive.go index 2806d8b20..748fc1d8a 100644 --- a/core/block/editor/archive.go +++ b/core/block/editor/archive.go @@ -100,7 +100,7 @@ func (p *Archive) autoInstallBinWidget() error { st := sb.NewState() if w, ok := sb.(widget.Widget); ok { // We rely on AddAutoWidget to check if the widget was already installed/removed before - err = w.AddAutoWidget(st, widget.DefaultWidgetBin, widget.DefaultWidgetBin, "", model.BlockContentWidget_Link, "Bin") + err = w.AddAutoWidget(st, widget.DefaultWidgetBin, widget.DefaultWidgetBin, "", model.BlockContentWidget_Link, widget.DefaultWidgetBinEventName) if err != nil { return err } diff --git a/core/block/editor/widget/widget.go b/core/block/editor/widget/widget.go index e8d003cc9..a5d6eb0ea 100644 --- a/core/block/editor/widget/widget.go +++ b/core/block/editor/widget/widget.go @@ -22,6 +22,9 @@ const ( DefaultWidgetBin = "bin" DefaultWidgetRecentOpen = "recentOpen" autoWidgetBlockSuffix = "-wrapper" // in case blockId is specifically provided to avoid bad tree merges + + DefaultWidgetFavoriteEventName = "Favorite" + DefaultWidgetBinEventName = "Bin" ) type Widget interface { From 2eeb80cc2de70945b499ffe67415798d997d40a1 Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Mon, 31 Mar 2025 14:17:33 +0200 Subject: [PATCH 123/132] GO-5376 rename DefaultWidgetAll --- core/block/editor/widget/widget.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/block/editor/widget/widget.go b/core/block/editor/widget/widget.go index 93e8c014f..c35ac7d29 100644 --- a/core/block/editor/widget/widget.go +++ b/core/block/editor/widget/widget.go @@ -20,7 +20,7 @@ const ( DefaultWidgetRecent = "recent" DefaultWidgetCollection = "collection" DefaultWidgetBin = "bin" - DefaultWidgetAll = "allObject" + DefaultWidgetAll = "allObjects" DefaultWidgetRecentOpen = "recentOpen" autoWidgetBlockSuffix = "-wrapper" // in case blockId is specifically provided to avoid bad tree merges ) From cf52393df19c29ad7a42314eba477b5ba2bb1d7a Mon Sep 17 00:00:00 2001 From: Anastasia Shemyakinskaya <36507473+anastasiashemyakinskaya@users.noreply.github.com> Date: Mon, 31 Mar 2025 14:18:27 +0200 Subject: [PATCH 124/132] GO-5320: fix tests Signed-off-by: AnastasiaShemyakinskaya --- core/block/import/common/collection_test.go | 43 +++------------------ core/block/import/importer_test.go | 4 ++ 2 files changed, 10 insertions(+), 37 deletions(-) diff --git a/core/block/import/common/collection_test.go b/core/block/import/common/collection_test.go index 1d69268f6..e616e72db 100644 --- a/core/block/import/common/collection_test.go +++ b/core/block/import/common/collection_test.go @@ -9,7 +9,6 @@ import ( "github.com/anyproto/anytype-heart/core/block/collection" "github.com/anyproto/anytype-heart/core/domain" "github.com/anyproto/anytype-heart/pkg/lib/bundle" - "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) func TestMakeImportCollection(t *testing.T) { @@ -18,57 +17,32 @@ func TestMakeImportCollection(t *testing.T) { needToAddDate bool shouldBeFavorite bool shouldAddRelation bool - widgetSnapshot bool }{ - {"all false", false, false, false, false}, - {"add date", true, false, false, false}, - {"add favorite", false, true, false, false}, - {"add relations", false, false, true, false}, - {"with existing widget snapshot", false, false, false, true}, - {"all True", true, true, true, true}, + {"all false", false, false, false}, + {"add date", true, false, false}, + {"add favorite", false, true, false}, + {"add relations", false, false, true}, + {"all True", true, true, true}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { importer := NewImportCollection(collection.New()) - var widget *Snapshot - if tt.widgetSnapshot { - widget = &Snapshot{ - Id: "widget-id", - FileName: "existing", - Snapshot: &SnapshotModel{ - Data: &StateSnapshot{ - Blocks: []*model.Block{ - { - Id: "root-block", - ChildrenIds: []string{}, - Content: &model.BlockContentOfSmartblock{ - Smartblock: &model.BlockContentSmartblock{}, - }, - }, - }, - }, - }, - } - } - req := NewImportCollectionSetting( WithCollectionName("My Collection"), WithTargetObjects([]string{"obj1", "obj2"}), WithIcon("icon.png"), - WithWidgetSnapshot(widget), ) req.needToAddDate = tt.needToAddDate req.shouldBeFavorite = tt.shouldBeFavorite req.shouldAddRelations = tt.shouldAddRelation - root, widgetSnap, err := importer.MakeImportCollection(req) + root, err := importer.MakeImportCollection(req) assert.NoError(t, err) assert.NotNil(t, root) - assert.NotNil(t, widgetSnap) if tt.needToAddDate { assert.Contains(t, root.FileName, time.Now().Format("2006")) @@ -82,11 +56,6 @@ func TestMakeImportCollection(t *testing.T) { assert.Equal(t, domain.Bool(false), root.Snapshot.Data.Details.Get(bundle.RelationKeyIsFavorite)) } - if tt.widgetSnapshot { - assert.Equal(t, "existing", widgetSnap.FileName) - } else { - assert.Equal(t, "rootWidget", widgetSnap.FileName) - } }) } } diff --git a/core/block/import/importer_test.go b/core/block/import/importer_test.go index 782699cd7..98c23ad7d 100644 --- a/core/block/import/importer_test.go +++ b/core/block/import/importer_test.go @@ -16,6 +16,7 @@ import ( "github.com/anyproto/anytype-heart/core/block/import/web/parsers/mock_parsers" "github.com/anyproto/anytype-heart/core/block/process" "github.com/anyproto/anytype-heart/core/domain" + "github.com/anyproto/anytype-heart/space/mock_space" "github.com/anyproto/anytype-heart/core/block/import/common" "github.com/anyproto/anytype-heart/core/block/import/common/mock_common" @@ -971,6 +972,9 @@ func Test_ImportRootCollectionInResponse(t *testing.T) { fileSync.EXPECT().SendImportEvents().Return().Times(1) fileSync.EXPECT().ClearImportEvents().Return().Times(1) i.fileSync = fileSync + mockSpaceService := mock_space.NewMockService(t) + mockSpaceService.EXPECT().Get(nil, "space1").Return(nil, fmt.Errorf("not found")) + i.spaceService = mockSpaceService // when importRequest := &ImportRequest{ From 682a655798fa4b298c88e8f83de9257ead2240a3 Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Mon, 31 Mar 2025 15:28:41 +0200 Subject: [PATCH 125/132] GO-5303 remove unused func --- core/block/editor/smartblock/detailsinject.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/core/block/editor/smartblock/detailsinject.go b/core/block/editor/smartblock/detailsinject.go index cde641403..7afc67721 100644 --- a/core/block/editor/smartblock/detailsinject.go +++ b/core/block/editor/smartblock/detailsinject.go @@ -385,11 +385,6 @@ func (sb *smartBlock) changeResolvedLayoutForObjects(msgs []simple.EventMessage, return nil } -func (sb *smartBlock) getTypeDetails() (*domain.Details, error) { - typeId := sb.LocalDetails().GetString(bundle.RelationKeyType) - return sb.spaceIndex.GetDetails(typeId) -} - func getLayoutFromMessages(msgs []simple.EventMessage) (layout int64, found bool) { for _, ev := range msgs { if amend := ev.Msg.GetObjectDetailsAmend(); amend != nil { From f0d3cde2b030e9ed4c34b960f236d47349b5138a Mon Sep 17 00:00:00 2001 From: Mikhail Date: Mon, 31 Mar 2025 15:32:23 +0200 Subject: [PATCH 126/132] GO-5366 Add debug stat (#2277) --- pkg/lib/localstore/ftsearch/ftsearch.go | 18 ++++++++++++++++++ pkg/lib/localstore/objectstore/service.go | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/pkg/lib/localstore/ftsearch/ftsearch.go b/pkg/lib/localstore/ftsearch/ftsearch.go index 92ea248bc..52b2e6ffa 100644 --- a/pkg/lib/localstore/ftsearch/ftsearch.go +++ b/pkg/lib/localstore/ftsearch/ftsearch.go @@ -25,6 +25,7 @@ import ( "unicode" "github.com/anyproto/any-sync/app" + "github.com/anyproto/any-sync/app/debugstat" tantivy "github.com/anyproto/tantivy-go" "github.com/valyala/fastjson" @@ -102,6 +103,19 @@ type ftSearch struct { lang tantivy.Language } +func (f *ftSearch) ProvideStat() any { + count, _ := f.DocCount() + return count +} + +func (f *ftSearch) StatId() string { + return "doc_count" +} + +func (f *ftSearch) StatType() string { + return CName +} + func TantivyNew() FTSearch { return new(ftSearch) } @@ -138,6 +152,10 @@ func (f *ftSearch) DeleteObject(objectId string) error { func (f *ftSearch) Init(a *app.App) error { repoPath := app.MustComponent[wallet.Wallet](a).RepoPath() + statService, _ := app.GetComponent[debugstat.StatService](a) + if statService != nil { + statService.AddProvider(f) + } f.lang = validateLanguage(app.MustComponent[wallet.Wallet](a).FtsPrimaryLang()) f.rootPath = filepath.Join(repoPath, ftsDir2) f.blevePath = filepath.Join(repoPath, ftsDir) diff --git a/pkg/lib/localstore/objectstore/service.go b/pkg/lib/localstore/objectstore/service.go index fdd5393da..13be262e2 100644 --- a/pkg/lib/localstore/objectstore/service.go +++ b/pkg/lib/localstore/objectstore/service.go @@ -11,6 +11,7 @@ import ( anystore "github.com/anyproto/any-store" "github.com/anyproto/any-store/anyenc" "github.com/anyproto/any-sync/app" + "github.com/anyproto/any-sync/app/debugstat" "github.com/anyproto/any-sync/coordinator/coordinatorproto" "golang.org/x/exp/maps" @@ -124,6 +125,19 @@ type dsObjectStore struct { componentCtxCancel context.CancelFunc } +func (s *dsObjectStore) ProvideStat() any { + count, _ := s.ListIdsCrossSpace() + return len(count) +} + +func (s *dsObjectStore) StatId() string { + return "ds_count" +} + +func (s *dsObjectStore) StatType() string { + return CName +} + func (s *dsObjectStore) IterateSpaceIndex(f func(store spaceindex.Store) error) error { s.Lock() spaceIndexes := make([]spaceindex.Store, 0, len(s.spaceIndexes)) @@ -169,6 +183,10 @@ func (s *dsObjectStore) Init(a *app.App) (err error) { s.setDefaultConfig() s.oldStore = app.MustComponent[oldstore.Service](a) s.techSpaceIdProvider = app.MustComponent[TechSpaceIdProvider](a) + statService, _ := app.GetComponent[debugstat.StatService](a) + if statService != nil { + statService.AddProvider(s) + } return nil } From 09d08045d253abd3a781595c212b25309e07dfac Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Mon, 31 Mar 2025 16:17:41 +0200 Subject: [PATCH 127/132] GO-4459 remove member update --- core/api/docs/docs.go | 4 +- core/api/docs/swagger.json | 4 +- core/api/docs/swagger.yaml | 81 ------------------------------ core/api/internal/space/handler.go | 46 ----------------- 4 files changed, 4 insertions(+), 131 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 8b13e380e..b06ec07b5 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -6,10 +6,10 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"markdown":{"example":"# This is the title\n...","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"markdown":{"example":"# This is the title\n...","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"{{escape .Description}}","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-api/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects associated with a specific list (query or collection) within a space. When a view ID is provided, the objects are filtered and sorted according to the view's configuration. If no view ID is specified, all list objects are returned without filtering and sorting. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. The member_id path parameter can be provided as either the member's ID (starting with ` + "`" + `_participant` + "`" + `) or the member's identity. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to ` + "`" + `active` + "`" + ` and specifying a role (` + "`" + `reader` + "`" + ` or ` + "`" + `writer` + "`" + `), reject a joining member by setting the status to ` + "`" + `declined` + "`" + `, remove a member by setting the status to ` + "`" + `removed` + "`" + `, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/{format}":{"get":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” only). The endpoint calls the export service which converts the object’s content into the requested format. It is useful for sharing, or displaying the markdown representation of the objecte externally.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects associated with a specific list (query or collection) within a space. When a view ID is provided, the objects are filtered and sorted according to the view's configuration. If no view ID is specified, all list objects are returned without filtering and sorting. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. The member_id path parameter can be provided as either the member's ID (starting with ` + "`" + `_participant` + "`" + `) or the member's identity. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/{format}":{"get":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” only). The endpoint calls the export service which converts the object’s content into the requested format. It is useful for sharing, or displaying the markdown representation of the objecte externally.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index e25d58240..ae76dc771 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,8 +1,8 @@ { - "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"markdown":{"example":"# This is the title\n...","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"space.UpdateMemberRequest":{"properties":{"role":{"description":"Role to assign if approving a joining member","enum":["viewer","editor"],"example":"viewer","type":"string"},"status":{"description":"Status of the member","enum":["active","removed","declined"],"example":"active","type":"string"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"auth.DisplayCodeResponse":{"properties":{"challenge_id":{"description":"The challenge id associated with the displayed code and needed to solve the challenge for token","example":"67647f5ecda913e9a2e11b26","type":"string"}},"type":"object"},"auth.TokenResponse":{"properties":{"app_key":{"description":"The permanent app key","example":"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=","type":"string"},"session_token":{"description":"The ephemeral session token","example":"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII","type":"string"}},"type":"object"},"export.ObjectExportResponse":{"properties":{"markdown":{"example":"# This is the title\n...","type":"string"}},"type":"object"},"list.Filter":{"properties":{"condition":{"description":"The filter condition","example":"contains","type":"string"},"format":{"description":"The format of the property used for filtering","example":"text","type":"string"},"id":{"description":"The id of the filter","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for filtering","example":"name","type":"string"},"value":{"description":"The value used for filtering","example":"Some value...","type":"string"}},"type":"object"},"list.Sort":{"properties":{"format":{"description":"The format of the property used for sorting","example":"text","type":"string"},"id":{"description":"The id of the sort","example":"67bf3f21cda9134102e2422c","type":"string"},"property_key":{"description":"The property key used for sorting","example":"name","type":"string"},"sort_type":{"description":"The sort direction","example":"asc","type":"string"}},"type":"object"},"list.View":{"properties":{"filters":{"description":"The list of filters","items":{"$ref":"#/components/schemas/list.Filter"},"type":"array","uniqueItems":false},"id":{"description":"The id of the view","example":"67bf3f21cda9134102e2422c","type":"string"},"layout":{"description":"The layout of the view","enum":["grid","table"],"example":"grid","type":"string"},"name":{"description":"The name of the view","example":"All","type":"string"},"sorts":{"description":"The list of sorts","items":{"$ref":"#/components/schemas/list.Sort"},"type":"array","uniqueItems":false}},"type":"object"},"object.Block":{"properties":{"align":{"description":"The alignment of the block","enum":["AlignLeft","AlignCenter","AlignRight","AlignJustify"],"example":"AlignLeft","type":"string"},"background_color":{"description":"The background color of the block","example":"red","type":"string"},"children_ids":{"description":"The ids of the block's children","example":["['6797ce8ecda913cde14b02dc']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"file":{"$ref":"#/components/schemas/object.File"},"id":{"description":"The id of the block","example":"64394517de52ad5acb89c66c","type":"string"},"property":{"$ref":"#/components/schemas/object.Property"},"text":{"$ref":"#/components/schemas/object.Text"},"vertical_align":{"description":"The vertical alignment of the block","enum":["VerticalAlignTop","VerticalAlignMiddle","VerticalAlignBottom"],"example":"VerticalAlignTop","type":"string"}},"type":"object"},"object.CreateObjectRequest":{"properties":{"body":{"description":"The body of the object","example":"This is the body of the object. Markdown syntax is supported here.","type":"string"},"description":{"description":"The description of the object","example":"This is a description of the object.","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"name":{"description":"The name of the object","example":"My object","type":"string"},"source":{"description":"The source url, only applicable for bookmarks","example":"https://bookmark-source.com","type":"string"},"template_id":{"description":"The id of the template to use","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"type_key":{"description":"The key of the type of object to create","example":"ot-page","type":"string"}},"type":"object"},"object.File":{"description":"The file of the block, if applicable","properties":{"added_at":{"description":"The added at of the file","type":"integer"},"hash":{"description":"The hash of the file","type":"string"},"mime":{"description":"The mime of the file","type":"string"},"name":{"description":"The name of the file","type":"string"},"size":{"description":"The size of the file","type":"integer"},"state":{"description":"The state of the file","type":"string"},"style":{"description":"The style of the file","type":"string"},"target_object_id":{"description":"The target object id of the file","type":"string"},"type":{"description":"The type of the file","type":"string"}},"type":"object"},"object.Object":{"description":"The object","properties":{"archived":{"description":"Whether the object is archived","example":false,"type":"boolean"},"blocks":{"description":"The blocks of the object","items":{"$ref":"#/components/schemas/object.Block"},"type":"array","uniqueItems":false},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the object","example":"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ","type":"string"},"layout":{"description":"The layout of the object","example":"basic","type":"string"},"name":{"description":"The name of the object","example":"My object","type":"string"},"object":{"description":"The data model of the object","example":"object","type":"string"},"properties":{"description":"The properties of the object","items":{"$ref":"#/components/schemas/object.Property"},"type":"array","uniqueItems":false},"snippet":{"description":"The snippet of the object, especially important for notes as they don't have a name","example":"The beginning of the object body...","type":"string"},"space_id":{"description":"The id of the space the object is in","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"object.ObjectResponse":{"properties":{"object":{"$ref":"#/components/schemas/object.Object"}},"type":"object"},"object.Property":{"description":"The property block, if applicable","properties":{"checkbox":{"description":"The checkbox value, if applicable","example":true,"type":"boolean"},"date":{"description":"The date value, if applicable","example":"2025-02-14T12:34:56Z","type":"string"},"email":{"description":"The email value, if applicable","example":"example@example.com","type":"string"},"file":{"description":"The file references, if applicable","example":["['fileId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"format":{"description":"The format of the property","enum":["text","number","select","multi_select","date","file","checkbox","url","email","phone","object"],"example":"date","type":"string"},"id":{"description":"The id of the property","example":"last_modified_date","type":"string"},"multi_select":{"description":"The multi-select values, if applicable","items":{"$ref":"#/components/schemas/object.Tag"},"type":"array","uniqueItems":false},"name":{"description":"The name of the property","example":"Last modified date","type":"string"},"number":{"description":"The number value, if applicable","example":42,"type":"number"},"object":{"description":"The object references, if applicable","example":["['objectId']"],"items":{"type":"string"},"type":"array","uniqueItems":false},"phone":{"description":"The phone number value, if applicable","example":"+1234567890","type":"string"},"select":{"$ref":"#/components/schemas/object.Tag"},"text":{"description":"The text value, if applicable","example":"Some text...","type":"string"},"url":{"description":"The url value, if applicable","example":"https://example.com","type":"string"}},"type":"object"},"object.Tag":{"description":"The select value, if applicable","properties":{"color":{"description":"The color of the tag","example":"yellow","type":"string"},"id":{"description":"The id of the tag","example":"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq","type":"string"},"name":{"description":"The name of the tag","example":"in-progress","type":"string"}},"type":"object"},"object.Template":{"description":"The template","properties":{"archived":{"description":"Whether the template is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the template","example":"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge","type":"string"},"name":{"description":"The name of the template","example":"My template","type":"string"},"object":{"description":"The data model of the object","example":"template","type":"string"}},"type":"object"},"object.TemplateResponse":{"properties":{"template":{"$ref":"#/components/schemas/object.Template"}},"type":"object"},"object.Text":{"description":"The text of the block, if applicable","properties":{"checked":{"description":"Whether the text is checked","example":true,"type":"boolean"},"color":{"description":"The color of the text","example":"red","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"style":{"description":"The style of the text","enum":["Paragraph","Header1","Header2","Header3","Header4","Quote","Code","Title","Checkbox","Marked","Numbered","Toggle","Description","Callout"],"example":"Paragraph","type":"string"},"text":{"description":"The text","example":"Some text...","type":"string"}},"type":"object"},"object.Type":{"description":"The type of the object","properties":{"archived":{"description":"Whether the type is archived","example":false,"type":"boolean"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the type (which is unique across spaces)","example":"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu","type":"string"},"key":{"description":"The key of the type (can be the same across spaces for known types)","example":"ot-page","type":"string"},"name":{"description":"The name of the type","example":"Page","type":"string"},"object":{"description":"The data model of the object","example":"type","type":"string"},"recommended_layout":{"description":"The recommended layout of the type","example":"todo","type":"string"}},"type":"object"},"object.TypeResponse":{"properties":{"type":{"$ref":"#/components/schemas/object.Type"}},"type":"object"},"pagination.PaginatedResponse-list_View":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/list.View"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Object":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Object"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Template":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Template"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-object_Type":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/object.Type"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Member":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Member"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginatedResponse-space_Space":{"properties":{"data":{"description":"The list of items in the current result set","items":{"$ref":"#/components/schemas/space.Space"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/pagination.PaginationMeta"}},"type":"object"},"pagination.PaginationMeta":{"description":"The pagination metadata for the response","properties":{"has_more":{"description":"Indicates if there are more items available beyond the current result set","example":true,"type":"boolean"},"limit":{"description":"The maximum number of items returned in the result set","example":100,"type":"integer"},"offset":{"description":"The number of items skipped before starting to collect the result set","example":0,"type":"integer"},"total":{"description":"The total number of items available for the endpoint","example":1024,"type":"integer"}},"type":"object"},"search.SearchRequest":{"properties":{"query":{"description":"The search term to look for in object names and snippets","example":"test","type":"string"},"sort":{"$ref":"#/components/schemas/search.SortOptions"},"types":{"description":"The types of objects to search for, specified by key or ID","example":["ot-page","ot-678043f0cda9133be777049f","bafyreightzrdts2ymxyaeyzspwdfo2juspyam76ewq6qq7ixnw3523gs7q"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"search.SortDirection":{"default":"desc","description":"The direction to sort the search results","enum":["asc","desc"],"type":"string","x-enum-varnames":["Asc","Desc"]},"search.SortOptions":{"description":"The sorting criteria and direction for the search results","properties":{"direction":{"$ref":"#/components/schemas/search.SortDirection"},"property":{"$ref":"#/components/schemas/search.SortProperty"}},"type":"object"},"search.SortProperty":{"default":"last_modified_date","description":"The property to sort the search results by","enum":["created_date","last_modified_date","last_opened_date","name"],"type":"string","x-enum-varnames":["CreatedDate","LastModifiedDate","LastOpenedDate","Name"]},"space.CreateSpaceRequest":{"properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"name":{"description":"The name of the space","example":"New Space","type":"string"}},"type":"object"},"space.Member":{"description":"The member","properties":{"global_name":{"description":"The global name of the member in the network","example":"john.any","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The profile object id of the member","example":"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ","type":"string"},"identity":{"description":"The identity of the member in the network","example":"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ","type":"string"},"name":{"description":"The name of the member","example":"John Doe","type":"string"},"object":{"description":"The data model of the object","example":"member","type":"string"},"role":{"description":"The role of the member","enum":["viewer","editor","owner","no_permission"],"example":"owner","type":"string"},"status":{"description":"The status of the member","enum":["joining","active","removed","declined","removing","canceled"],"example":"active","type":"string"}},"type":"object"},"space.MemberResponse":{"properties":{"member":{"$ref":"#/components/schemas/space.Member"}},"type":"object"},"space.Space":{"description":"The space","properties":{"description":{"description":"The description of the space","example":"The local-first wiki","type":"string"},"gateway_url":{"description":"The gateway url to serve files and media","example":"http://127.0.0.1:31006","type":"string"},"icon":{"$ref":"#/components/schemas/util.Icon"},"id":{"description":"The id of the space","example":"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1","type":"string"},"name":{"description":"The name of the space","example":"My Space","type":"string"},"network_id":{"description":"The network id of the space","example":"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU","type":"string"},"object":{"description":"The data model of the object","example":"space","type":"string"}},"type":"object"},"space.SpaceResponse":{"properties":{"space":{"$ref":"#/components/schemas/space.Space"}},"type":"object"},"util.ForbiddenError":{"properties":{"error":{"properties":{"message":{"example":"Forbidden","type":"string"}},"type":"object"}},"type":"object"},"util.GoneError":{"properties":{"error":{"properties":{"message":{"example":"Resource is gone","type":"string"}},"type":"object"}},"type":"object"},"util.Icon":{"description":"The icon of the object","properties":{"color":{"description":"The color of the icon","example":"red","type":"string"},"emoji":{"description":"The emoji of the icon","example":"📄","type":"string"},"file":{"description":"The file of the icon","example":"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay","type":"string"},"format":{"$ref":"#/components/schemas/util.IconFormat"},"name":{"description":"The name of the icon","example":"document","type":"string"}},"type":"object"},"util.IconFormat":{"description":"The type of the icon","enum":["emoji","file","icon"],"example":"emoji","type":"string","x-enum-varnames":["IconFormatEmoji","IconFormatFile","IconFormatIcon"]},"util.NotFoundError":{"properties":{"error":{"properties":{"message":{"example":"Resource not found","type":"string"}},"type":"object"}},"type":"object"},"util.RateLimitError":{"properties":{"error":{"properties":{"message":{"example":"Rate limit exceeded","type":"string"}},"type":"object"}},"type":"object"},"util.ServerError":{"properties":{"error":{"properties":{"message":{"example":"Internal server error","type":"string"}},"type":"object"}},"type":"object"},"util.UnauthorizedError":{"properties":{"error":{"properties":{"message":{"example":"Unauthorized","type":"string"}},"type":"object"}},"type":"object"},"util.ValidationError":{"properties":{"error":{"properties":{"message":{"example":"Bad request","type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@anytype.io","name":"Anytype Support","url":"https://anytype.io/contact"},"description":"This API allows interaction with Anytype resources such as spaces, objects and types.","license":{"name":"Any Source Available License 1.0","url":"https://github.com/anyproto/anytype-api/blob/main/LICENSE.md"},"termsOfService":"https://anytype.io/terms_of_use","title":"Anytype API","version":"2025-03-17"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects associated with a specific list (query or collection) within a space. When a view ID is provided, the objects are filtered and sorted according to the view's configuration. If no view ID is specified, all list objects are returned without filtering and sorting. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. The member_id path parameter can be provided as either the member's ID (starting with `_participant`) or the member's identity. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]},"patch":{"description":"Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.UpdateMemberRequest"}}},"description":"Member to update","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Update member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/{format}":{"get":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” only). The endpoint calls the export service which converts the object’s content into the requested format. It is useful for sharing, or displaying the markdown representation of the objecte externally.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, + "paths": {"/auth/display_code":{"post":{"description":"This endpoint initiates a secure authentication flow by generating a new challenge. Clients must supply the name of the application (via a query parameter) that is requesting authentication. On success, the service returns a unique challenge ID. This challenge ID must then be used with the token endpoint (see below) to solve the challenge and retrieve an authentication token. In essence, this endpoint “boots up” the login process and is the first step in a multi-phase authentication sequence.","parameters":[{"description":"App name requesting the challenge","in":"query","name":"app_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.DisplayCodeResponse"}}},"description":"Challenge ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Start new challenge","tags":["auth"]}},"/auth/token":{"post":{"description":"After receiving a challenge ID from the display_code endpoint, the client calls this endpoint to provide the corresponding 4-digit code (also via a query parameter) along with the challenge ID. The endpoint verifies that the challenge solution is correct and, if it is, returns an ephemeral session token together with a permanent app key. These tokens are then used in subsequent API requests to authorize access. This endpoint is central to ensuring that only properly authenticated sessions can access further resources.","parameters":[{"description":"Challenge ID","in":"query","name":"challenge_id","required":true,"schema":{"type":"string"}},{"description":"4-digit code retrieved from Anytype Desktop app","in":"query","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auth.TokenResponse"}}},"description":"Authentication token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Invalid input"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"summary":"Retrieve token","tags":["auth"]}},"/search":{"post":{"description":"This endpoint executes a global search over every space the user has access to. It accepts pagination parameters (offset and limit) and a JSON body containing search criteria. The criteria include a search query string, an optional list of object types, and sort options (e.g. ascending/descending by creation, modification, or last opened dates). Internally, the endpoint aggregates results from each space, merges and sorts them (after last modified date by default), and returns a unified, paginated list of objects that match the search parameters.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects across all spaces","tags":["search"]}},"/spaces":{"get":{"description":"Retrieves a paginated list of all spaces that are accessible by the authenticated user. Each space record contains detailed information such as the space ID, name, icon (derived either from an emoji or image URL), and additional metadata. This endpoint is key to displaying a user’s workspaces.","parameters":[{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Space"}}},"description":"List of spaces"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List spaces","tags":["spaces"]},"post":{"description":"Creates a new workspace (or space) based on a supplied name in the JSON request body. The endpoint is subject to rate limiting and automatically applies default configurations such as generating a random icon and initializing the workspace with default settings (for example, a default dashboard or home page). On success, the new space’s full metadata is returned, enabling the client to immediately switch context to the new space.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.CreateSpaceRequest"}}},"description":"Space to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create space","tags":["spaces"]}},"/spaces/{space_id}":{"get":{"description":"Fetches full details about a single space identified by its space ID. The response includes metadata such as the space name, icon, and various workspace IDs (home, archive, profile, etc.). This detailed view supports use cases such as displaying space-specific settings.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.SpaceResponse"}}},"description":"Space"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Space not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get space","tags":["spaces"]}},"/spaces/{space_id}/lists/{list_id}/objects":{"post":{"description":"Enables clients to add one or more objects to a specific list (collection only) by submitting a JSON array of object IDs. Upon success, the endpoint returns a confirmation message. This endpoint is vital for building user interfaces that allow drag‑and‑drop or multi‑select additions to collections.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array"}}},"description":"List of object IDs","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Add objects to list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/objects/{object_id}":{"delete":{"description":"Removes a given object from the specified list (collection only) in a space. The endpoint takes the space, list, and object identifiers as path parameters. It's subject to rate limiting and returns a success message on completion. It is used for dynamically managing collections without affecting the underlying object data.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":"Objects removed successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Remove object from list","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/views":{"get":{"description":"Returns a paginated list of views defined for a specific list (query or collection) within a space. Each view includes configuration details such as layout, applied filters, and sorting options, enabling clients to render the list according to user preferences and context. This endpoint supports pagination parameters to control the number of views returned and the starting point of the result set.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-list_View"}}},"description":"List of views"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get list views","tags":["lists"]}},"/spaces/{space_id}/lists/{list_id}/{view_id}/objects":{"get":{"description":"Returns a paginated list of objects associated with a specific list (query or collection) within a space. When a view ID is provided, the objects are filtered and sorted according to the view's configuration. If no view ID is specified, all list objects are returned without filtering and sorting. This endpoint helps clients to manage grouped objects (for example, tasks within a list) by returning information for each item of the list.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"List ID","in":"path","name":"list_id","required":true,"schema":{"type":"string"}},{"description":"View ID","in":"path","name":"view_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get objects in list","tags":["lists"]}},"/spaces/{space_id}/members":{"get":{"description":"Returns a paginated list of members belonging to the specified space. Each member record includes the member’s profile ID, name, icon (which may be derived from an emoji or image), network identity, global name, status (e.g. joining, active) and role (e.g. Viewer, Editor, Owner). This endpoint supports collaborative features by allowing clients to show who is in a space and manage access rights.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-space_Member"}}},"description":"List of members"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List members","tags":["members"]}},"/spaces/{space_id}/members/{member_id}":{"get":{"description":"Fetches detailed information about a single member within a space. The endpoint returns the member’s identifier, name, icon, identity, global name, status and role. The member_id path parameter can be provided as either the member's ID (starting with `_participant`) or the member's identity. This is useful for user profile pages, permission management, and displaying member-specific information in collaborative environments.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Member ID or Identity","in":"path","name":"member_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.MemberResponse"}}},"description":"Member"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Member not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get member","tags":["members"]}},"/spaces/{space_id}/objects":{"get":{"description":"Retrieves a paginated list of objects in the given space. The endpoint takes query parameters for pagination (offset and limit) and returns detailed data about each object including its ID, name, icon, type information, a snippet of the content (if applicable), layout, space ID, blocks and details. It is intended for building views where users can see all objects in a space at a glance.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List objects","tags":["objects"]},"post":{"description":"Creates a new object in the specified space using a JSON payload. The creation process is subject to rate limiting. The payload must include key details such as the object name, icon, description, body content (which may support Markdown), source URL (required for bookmark objects), template identifier, and the type_key (which is the non-unique identifier of the type of object to create). Post-creation, additional operations (like setting featured properties or fetching bookmark metadata) may occur. The endpoint then returns the full object data, ready for further interactions.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.CreateObjectRequest"}}},"description":"Object to create","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The created object"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Create object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}":{"delete":{"description":"This endpoint “deletes” an object by marking it as archived. The deletion process is performed safely and is subject to rate limiting. It returns the object’s details after it has been archived. Proper error handling is in place for situations such as when the object isn’t found or the deletion cannot be performed because of permission issues.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The deleted object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ForbiddenError"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"423":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.RateLimitError"}}},"description":"Rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Delete object","tags":["objects"]},"get":{"description":"Fetches the full details of a single object identified by the object ID within the specified space. The response includes not only basic metadata (ID, name, icon, type) but also the complete set of blocks (which may include text, files, properties and dataviews) and extra details (such as timestamps and linked member information). This endpoint is essential when a client needs to render or edit the full object view.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.ObjectResponse"}}},"description":"The requested object"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get object","tags":["objects"]}},"/spaces/{space_id}/objects/{object_id}/{format}":{"get":{"description":"This endpoint exports a single object from the specified space into a desired format. The export format is provided as a path parameter (currently supporting “markdown” only). The endpoint calls the export service which converts the object’s content into the requested format. It is useful for sharing, or displaying the markdown representation of the objecte externally.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Object ID","in":"path","name":"object_id","required":true,"schema":{"type":"string"}},{"description":"Export format","in":"path","name":"format","required":true,"schema":{"enum":["markdown"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/export.ObjectExportResponse"}}},"description":"Object exported successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ValidationError"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Export object","tags":["export"]}},"/spaces/{space_id}/search":{"post":{"description":"This endpoint performs a focused search within a single space (specified by the space_id path parameter). Like the global search, it accepts pagination parameters and a JSON payload containing the search query, object types, and sorting preferences. The search is limited to the provided space and returns a list of objects that match the query. This allows clients to implement space‑specific filtering without having to process extraneous results.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.SearchRequest"}}},"description":"Search parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Object"}}},"description":"List of objects"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Search objects within a space","tags":["search"]}},"/spaces/{space_id}/types":{"get":{"description":"This endpoint retrieves a paginated list of object types (e.g. 'Page', 'Note', 'Task') available within the specified space. Each type’s record includes its unique identifier, type key, display name, icon, and a recommended layout. While a type's id is truly unique, a type's key can be the same across spaces for known types, e.g. 'ot-page' for 'Page'. Clients use this information when offering choices for object creation or for filtering objects by type through search.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Type"}}},"description":"List of types"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List types","tags":["types"]}},"/spaces/{space_id}/types/{type_id}":{"get":{"description":"Fetches detailed information about one specific object type by its ID. This includes the type’s unique key, name, icon, and recommended layout. This detailed view assists clients in understanding the expected structure and style for objects of that type and in guiding the user interface (such as displaying appropriate icons or layout hints).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TypeResponse"}}},"description":"The requested type"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get type","tags":["types"]}},"/spaces/{space_id}/types/{type_id}/templates":{"get":{"description":"This endpoint returns a paginated list of templates that are associated with a specific object type within a space. Templates provide pre‑configured structures for creating new objects. Each template record contains its identifier, name, and icon, so that clients can offer users a selection of templates when creating objects.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"The number of items to return","in":"query","name":"limit","schema":{"default":100,"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pagination.PaginatedResponse-object_Template"}}},"description":"List of templates"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"List templates","tags":["templates"]}},"/spaces/{space_id}/types/{type_id}/templates/{template_id}":{"get":{"description":"Fetches full details for one template associated with a particular object type in a space. The response provides the template’s identifier, name, icon, and any other relevant metadata. This endpoint is useful when a client needs to preview or apply a template to prefill object creation fields.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"schema":{"type":"string"}},{"description":"Type ID","in":"path","name":"type_id","required":true,"schema":{"type":"string"}},{"description":"Template ID","in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/object.TemplateResponse"}}},"description":"The requested template"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.UnauthorizedError"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.NotFoundError"}}},"description":"Resource not found"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.GoneError"}}},"description":"Resource deleted"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/util.ServerError"}}},"description":"Internal server error"}},"security":[{"bearerauth":[]}],"summary":"Get template","tags":["templates"]}}}, "openapi": "3.1.0", "servers": [ {"url":"http://localhost:31009/v1"} diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index cf5d69d2d..6cad0f8bc 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -687,24 +687,6 @@ components: space: $ref: '#/components/schemas/space.Space' type: object - space.UpdateMemberRequest: - properties: - role: - description: Role to assign if approving a joining member - enum: - - viewer - - editor - example: viewer - type: string - status: - description: Status of the member - enum: - - active - - removed - - declined - example: active - type: string - type: object util.ForbiddenError: properties: error: @@ -1473,69 +1455,6 @@ paths: summary: Get member tags: - members - patch: - description: Modifies a member's status and role in a space. Use this endpoint - to approve a joining member by setting the status to `active` and specifying - a role (`reader` or `writer`), reject a joining member by setting the status - to `declined`, remove a member by setting the status to `removed`, or update - an active member's role. This endpoint enables fine-grained control over member - access and permissions. - parameters: - - description: Space ID - in: path - name: space_id - required: true - schema: - type: string - - description: Member ID - in: path - name: member_id - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/space.UpdateMemberRequest' - description: Member to update - required: true - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/space.MemberResponse' - description: Member updated successfully - "400": - content: - application/json: - schema: - $ref: '#/components/schemas/util.ValidationError' - description: Bad request - "401": - content: - application/json: - schema: - $ref: '#/components/schemas/util.UnauthorizedError' - description: Unauthorized - "404": - content: - application/json: - schema: - $ref: '#/components/schemas/util.NotFoundError' - description: Member not found - "500": - content: - application/json: - schema: - $ref: '#/components/schemas/util.ServerError' - description: Internal server error - security: - - bearerauth: [] - summary: Update member - tags: - - members /spaces/{space_id}/objects: get: description: Retrieves a paginated list of objects in the given space. The endpoint diff --git a/core/api/internal/space/handler.go b/core/api/internal/space/handler.go index 5cd3f5606..4b8871ca9 100644 --- a/core/api/internal/space/handler.go +++ b/core/api/internal/space/handler.go @@ -189,49 +189,3 @@ func GetMemberHandler(s *SpaceService) gin.HandlerFunc { c.JSON(http.StatusOK, MemberResponse{Member: member}) } } - -// UpdateMemberHandler updates a member in a space -// -// @Summary Update member -// @Description Modifies a member's status and role in a space. Use this endpoint to approve a joining member by setting the status to `active` and specifying a role (`reader` or `writer`), reject a joining member by setting the status to `declined`, remove a member by setting the status to `removed`, or update an active member's role. This endpoint enables fine-grained control over member access and permissions. -// @Tags members -// @Accept json -// @Produce json -// @Param space_id path string true "Space ID" -// @Param member_id path string true "Member ID" -// @Param body body UpdateMemberRequest true "Member to update" -// @Success 200 {object} MemberResponse "Member updated successfully" -// @Failure 400 {object} util.ValidationError "Bad request" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 404 {object} util.NotFoundError "Member not found" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Security bearerauth -// @Router /spaces/{space_id}/members/{member_id} [patch] -func UpdateMemberHandler(s *SpaceService) gin.HandlerFunc { - return func(c *gin.Context) { - spaceId := c.Param("space_id") - memberId := c.Param("member_id") - - var req UpdateMemberRequest - if err := c.BindJSON(&req); err != nil { - apiErr := util.CodeToAPIError(http.StatusBadRequest, err.Error()) - c.AbortWithStatusJSON(http.StatusBadRequest, apiErr) - } - - member, err := s.UpdateMember(c.Request.Context(), spaceId, memberId, req) - code := util.MapErrorCode(err, - util.ErrToCode(ErrInvalidApproveMemberStatus, http.StatusBadRequest), - util.ErrToCode(ErrInvalidApproveMemberRole, http.StatusBadRequest), - util.ErrToCode(ErrMemberNotFound, http.StatusNotFound), - util.ErrToCode(ErrFailedUpdateMember, http.StatusInternalServerError), - ) - - if code != http.StatusOK { - apiErr := util.CodeToAPIError(code, err.Error()) - c.JSON(code, apiErr) - return - } - - c.JSON(http.StatusOK, MemberResponse{Member: member}) - } -} From 5c3474860e20f691bc36c77888164b39943e37fa Mon Sep 17 00:00:00 2001 From: Mikhail Date: Mon, 31 Mar 2025 16:55:27 +0200 Subject: [PATCH 128/132] GO-4701 Add tmp cleanup (#2276) --- pkg/lib/core/tmp_dir.go | 29 +++++++++++++++++++++ pkg/lib/core/tmp_dir_test.go | 50 ++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 pkg/lib/core/tmp_dir_test.go diff --git a/pkg/lib/core/tmp_dir.go b/pkg/lib/core/tmp_dir.go index 9a07eb6d2..fa7e22a24 100644 --- a/pkg/lib/core/tmp_dir.go +++ b/pkg/lib/core/tmp_dir.go @@ -4,6 +4,7 @@ import ( "os" "path/filepath" "sync" + "time" "github.com/anyproto/any-sync/app" @@ -54,8 +55,36 @@ func (s *TempDirService) TempDir() string { s.tempDir = os.TempDir() } else { s.tempDir = path + go s.cleanUp() } }) return s.tempDir } + +func (s *TempDirService) cleanUp() { + cutoff := time.Now().Add(-72 * time.Hour) + recursiveCleanup(s.tempDir, cutoff) +} + +func recursiveCleanup(path string, cutoff time.Time) { + entries, err := os.ReadDir(path) + if err != nil { + log.Warnf("tmp cleanup readdir: %v", err) + } + for _, entry := range entries { + fullEntryPath := filepath.Join(path, entry.Name()) + info, err := entry.Info() + if err != nil { + log.Warnf("tmp cleanup entry: %v", err) + } + if entry.IsDir() { + recursiveCleanup(fullEntryPath, cutoff) + } else if info.ModTime().IsZero() || info.ModTime().Before(cutoff) { + err = os.RemoveAll(fullEntryPath) + if err != nil { + log.Warnf("tmp cleanup delete: %v", err) + } + } + } +} diff --git a/pkg/lib/core/tmp_dir_test.go b/pkg/lib/core/tmp_dir_test.go new file mode 100644 index 000000000..99c98e202 --- /dev/null +++ b/pkg/lib/core/tmp_dir_test.go @@ -0,0 +1,50 @@ +package core + +import ( + "os" + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestTempDirService(t *testing.T) { + t.Run("cleanup", func(t *testing.T) { + // given + s := NewTempDirService() + s.tempDir = t.TempDir() + + oldFile := filepath.Join(s.tempDir, "old.txt") + require.NoError(t, os.WriteFile(oldFile, []byte("old"), 0600)) + oldTime := time.Now().Add(-100 * time.Hour) + require.NoError(t, os.Chtimes(oldFile, oldTime, oldTime)) + + newFile := filepath.Join(s.tempDir, "new.txt") + require.NoError(t, os.WriteFile(newFile, []byte("new"), 0600)) + + nestedDir := filepath.Join(s.tempDir, "nested") + require.NoError(t, os.MkdirAll(nestedDir, 0755)) + nestedOldFile := filepath.Join(nestedDir, "nested_old.txt") + require.NoError(t, os.WriteFile(nestedOldFile, []byte("nested old"), 0600)) + require.NoError(t, os.Chtimes(nestedOldFile, oldTime, oldTime)) + nestedNewFile := filepath.Join(nestedDir, "nested_new.txt") + require.NoError(t, os.WriteFile(nestedNewFile, []byte("nested new"), 0600)) + + // when + s.cleanUp() + + // then + _, err := os.Stat(oldFile) + require.True(t, os.IsNotExist(err), "old file should be deleted") + + _, err = os.Stat(newFile) + require.NoError(t, err, "new file should remain") + + _, err = os.Stat(nestedOldFile) + require.True(t, os.IsNotExist(err), "nested old file should be deleted") + + _, err = os.Stat(nestedNewFile) + require.NoError(t, err, "nested new file should remain") + }) +} From 6f75b2f96a16c36b8ecc4560e0206255cf3f2411 Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Mon, 31 Mar 2025 17:02:28 +0200 Subject: [PATCH 129/132] GO-4459 disable member update endpoint --- core/api/server/router.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/api/server/router.go b/core/api/server/router.go index a2fcb9616..119d23108 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -88,7 +88,7 @@ func (s *Server) NewRouter(mw apicore.ClientCommands, accountService apicore.Acc v1.GET("/spaces/:space_id", space.GetSpaceHandler(s.spaceService)) v1.GET("/spaces/:space_id/members", space.GetMembersHandler(s.spaceService)) v1.GET("/spaces/:space_id/members/:member_id", space.GetMemberHandler(s.spaceService)) - v1.PATCH("/spaces/:space_id/members/:member_id", s.rateLimit(maxWriteRequestsPerSecond), space.UpdateMemberHandler(s.spaceService)) + // v1.PATCH("/spaces/:space_id/members/:member_id", s.rateLimit(maxWriteRequestsPerSecond), space.UpdateMemberHandler(s.spaceService)) v1.POST("/spaces", s.rateLimit(maxWriteRequestsPerSecond), space.CreateSpaceHandler(s.spaceService)) // Type From bda55e79be30d155488d71e7a06283fea559c2f6 Mon Sep 17 00:00:00 2001 From: kirillston Date: Mon, 31 Mar 2025 18:48:29 +0300 Subject: [PATCH 130/132] GO-5331 Remove tasks and priority from Task --- pkg/lib/bundle/types.gen.go | 4 ++-- pkg/lib/bundle/types.json | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/pkg/lib/bundle/types.gen.go b/pkg/lib/bundle/types.gen.go index df36c8b8e..e5bf897e8 100644 --- a/pkg/lib/bundle/types.gen.go +++ b/pkg/lib/bundle/types.gen.go @@ -9,7 +9,7 @@ import ( "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) -const TypeChecksum = "91c804ca7dd4df74fafbdaff99e50fa2ffcc6cb0fb073887a90bdf1b4a3d98d5" +const TypeChecksum = "f2672b9f52915f228e335b78ed94ce1b6c7b195ceb1cba9a44b25a870a3b2ac0" const ( TypePrefix = "_ot" ) @@ -426,7 +426,7 @@ var ( Name: "Task", PluralName: "Tasks", Readonly: true, - RelationLinks: []*model.RelationLink{MustGetRelationLink(RelationKeyTag), MustGetRelationLink(RelationKeyAssignee), MustGetRelationLink(RelationKeyDone), MustGetRelationLink(RelationKeyDueDate), MustGetRelationLink(RelationKeyLinkedProjects), MustGetRelationLink(RelationKeyPriority), MustGetRelationLink(RelationKeyStatus), MustGetRelationLink(RelationKeyTasks)}, + RelationLinks: []*model.RelationLink{MustGetRelationLink(RelationKeyTag), MustGetRelationLink(RelationKeyAssignee), MustGetRelationLink(RelationKeyDone), MustGetRelationLink(RelationKeyDueDate), MustGetRelationLink(RelationKeyLinkedProjects), MustGetRelationLink(RelationKeyStatus)}, Revision: 2, Types: []model.SmartBlockType{model.SmartBlockType_Page}, Url: TypePrefix + "task", diff --git a/pkg/lib/bundle/types.json b/pkg/lib/bundle/types.json index 96cabd17d..9d9bccac6 100644 --- a/pkg/lib/bundle/types.json +++ b/pkg/lib/bundle/types.json @@ -107,9 +107,7 @@ "done", "dueDate", "linkedProjects", - "priority", - "status", - "tasks" + "status" ], "description": "A piece of work to be done or undertaken", "revision": 2 From 1dec3131e358c0f4594e3c739b6364b06bee3f93 Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Mon, 31 Mar 2025 17:53:41 +0200 Subject: [PATCH 131/132] GO-4459 export: fix gateway service init --- core/block/export/export.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/block/export/export.go b/core/block/export/export.go index e453221d7..0de884a91 100644 --- a/core/block/export/export.go +++ b/core/block/export/export.go @@ -103,7 +103,7 @@ func (e *export) Init(a *app.App) (err error) { e.spaceService = app.MustComponent[space.Service](a) e.accountService = app.MustComponent[account.Service](a) e.notificationService = app.MustComponent[notifications.Notifications](a) - e.gatewayService = app.MustComponent[gateway.Gateway](a) + e.gatewayService, _ = app.GetComponent[gateway.Gateway](a) return } @@ -212,9 +212,11 @@ func newExportContext(e *export, req pb.RpcObjectListExportRequest) *exportConte setOfList: make(map[string]struct{}), objectTypes: make(map[string]struct{}), relations: make(map[string]struct{}), - gatewayUrl: "http://" + e.gatewayService.Addr(), export: e, } + if e.gatewayService != nil { + ec.gatewayUrl = "http://" + e.gatewayService.Addr() + } return ec } From 05f04c24ab8a957cdcb690d69c4b3701f83c9e74 Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Mon, 31 Mar 2025 18:20:58 +0200 Subject: [PATCH 132/132] GO-4459 add comment --- core/api/internal/object/model.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index cef220e5e..22340b52f 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -26,7 +26,7 @@ type Object struct { Snippet string `json:"snippet" example:"The beginning of the object body..."` // The snippet of the object, especially important for notes as they don't have a name Layout string `json:"layout" example:"basic"` // The layout of the object Type Type `json:"type"` // The type of the object - Blocks []Block `json:"blocks"` // The blocks of the object + Blocks []Block `json:"blocks"` // The blocks of the object. Omitted in Search endpoints, returned only in GetObject endpoint Properties []Property `json:"properties"` // The properties of the object }