diff --git a/docs/apidocs.swagger.yaml b/docs/apidocs.swagger.yaml index f7274f4e..12628fa8 100644 --- a/docs/apidocs.swagger.yaml +++ b/docs/apidocs.swagger.yaml @@ -300,12 +300,16 @@ paths: type: integer format: int32 - name: pageToken - description: "A page token, received from a previous `ListMemos` call.\r\nProvide this to retrieve the subsequent page." + description: |- + A page token, received from a previous `ListMemos` call. + Provide this to retrieve the subsequent page. in: query required: false type: string - name: filter - description: "Filter is used to filter memos returned in the list.\r\nFormat: \"creator == 'users/{uid}' && visibilities == ['PUBLIC', 'PROTECTED']\"" + description: |- + Filter is used to filter memos returned in the list. + Format: "creator == 'users/{uid}' && visibilities == ['PUBLIC', 'PROTECTED']" in: query required: false type: string @@ -480,7 +484,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: filter - description: "Filter is used to filter users returned in the list.\r\nFormat: \"username == 'frank'\"" + description: |- + Filter is used to filter users returned in the list. + Format: "username == 'frank'" in: query required: false type: string @@ -641,7 +647,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name - description: "The resource name of the workspace setting.\r\nFormat: settings/{setting}" + description: |- + The resource name of the workspace setting. + Format: settings/{setting} in: path required: true type: string @@ -663,7 +671,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: setting.name - description: "name is the name of the setting.\r\nFormat: settings/{setting}" + description: |- + name is the name of the setting. + Format: settings/{setting} in: path required: true type: string @@ -699,7 +709,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: identityProvider.name - description: "The name of the identityProvider.\r\nFormat: identityProviders/{id}" + description: |- + The name of the identityProvider. + Format: identityProviders/{id} in: path required: true type: string @@ -737,7 +749,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: inbox.name - description: "The name of the inbox.\r\nFormat: inboxes/{id}" + description: |- + The name of the inbox. + Format: inboxes/{id} in: path required: true type: string @@ -781,7 +795,10 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: memo.name - description: "The name of the memo.\r\nFormat: memos/{id}\r\nid is the system generated id." + description: |- + The name of the memo. + Format: memos/{id} + id is the system generated id. in: path required: true type: string @@ -799,7 +816,9 @@ paths: $ref: '#/definitions/v1RowStatus' creator: type: string - title: "The name of the creator.\r\nFormat: users/{id}" + title: |- + The name of the creator. + Format: users/{id} createTime: type: string format: date-time @@ -852,7 +871,9 @@ paths: readOnly: true parent: type: string - title: "The name of the parent memo.\r\nFormat: memos/{id}" + title: |- + The name of the parent memo. + Format: memos/{id} readOnly: true snippet: type: string @@ -874,7 +895,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name_1 - description: "The name of the user.\r\nFormat: users/{id}" + description: |- + The name of the user. + Format: users/{id} in: path required: true type: string @@ -896,7 +919,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name_1 - description: "The name of the identityProvider to delete.\r\nFormat: identityProviders/{id}" + description: |- + The name of the identityProvider to delete. + Format: identityProviders/{id} in: path required: true type: string @@ -918,7 +943,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name_2 - description: "The name of the identityProvider to get.\r\nFormat: identityProviders/{id}" + description: |- + The name of the identityProvider to get. + Format: identityProviders/{id} in: path required: true type: string @@ -940,7 +967,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name_2 - description: "The name of the inbox to delete.\r\nFormat: inboxes/{id}" + description: |- + The name of the inbox to delete. + Format: inboxes/{id} in: path required: true type: string @@ -962,7 +991,10 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name_3 - description: "The name of the resource.\r\nFormat: resources/{id}\r\nid is the system generated unique identifier." + description: |- + The name of the resource. + Format: resources/{id} + id is the system generated unique identifier. in: path required: true type: string @@ -984,7 +1016,10 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name_3 - description: "The name of the resource.\r\nFormat: resources/{id}\r\nid is the system generated unique identifier." + description: |- + The name of the resource. + Format: resources/{id} + id is the system generated unique identifier. in: path required: true type: string @@ -1006,7 +1041,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name_4 - description: "The name of the memo.\r\nFormat: memos/{id}" + description: |- + The name of the memo. + Format: memos/{id} in: path required: true type: string @@ -1028,7 +1065,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name_4 - description: "The name of the memo.\r\nFormat: memos/{id}" + description: |- + The name of the memo. + Format: memos/{id} in: path required: true type: string @@ -1050,7 +1089,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name - description: "The name of the activity.\r\nFormat: activities/{id}" + description: |- + The name of the activity. + Format: activities/{id} in: path required: true type: string @@ -1072,7 +1113,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name - description: "The name of the user.\r\nFormat: users/{id}" + description: |- + The name of the user. + Format: users/{id} in: path required: true type: string @@ -1094,7 +1137,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name - description: "The name of the user.\r\nFormat: users/{id}" + description: |- + The name of the user. + Format: users/{id} in: path required: true type: string @@ -1115,7 +1160,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name - description: "The name of the user.\r\nFormat: users/{id}" + description: |- + The name of the user. + Format: users/{id} in: path required: true type: string @@ -1143,7 +1190,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name - description: "The name of the user.\r\nFormat: users/{id}" + description: |- + The name of the user. + Format: users/{id} in: path required: true type: string @@ -1170,7 +1219,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name - description: "The name of the memo.\r\nFormat: memos/{id}" + description: |- + The name of the memo. + Format: memos/{id} in: path required: true type: string @@ -1191,7 +1242,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name - description: "The name of the memo.\r\nFormat: memos/{id}" + description: |- + The name of the memo. + Format: memos/{id} in: path required: true type: string @@ -1218,7 +1271,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name - description: "The name of the memo.\r\nFormat: memos/{id}. Use \"memos/-\" to list all properties." + description: |- + The name of the memo. + Format: memos/{id}. Use "memos/-" to list all properties. in: path required: true type: string @@ -1241,7 +1296,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name - description: "The name of the memo.\r\nFormat: memos/{id}. Use \"memos/-\" to rebuild all memos." + description: |- + The name of the memo. + Format: memos/{id}. Use "memos/-" to rebuild all memos. in: path required: true type: string @@ -1268,7 +1325,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name - description: "The name of the memo.\r\nFormat: memos/{id}" + description: |- + The name of the memo. + Format: memos/{id} in: path required: true type: string @@ -1289,7 +1348,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name - description: "The name of the memo.\r\nFormat: memos/{id}" + description: |- + The name of the memo. + Format: memos/{id} in: path required: true type: string @@ -1316,7 +1377,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name - description: "The name of the memo.\r\nFormat: memos/{id}" + description: |- + The name of the memo. + Format: memos/{id} in: path required: true type: string @@ -1338,7 +1401,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name - description: "The name of the memo.\r\nFormat: memos/{id}" + description: |- + The name of the memo. + Format: memos/{id} in: path required: true type: string @@ -1365,7 +1430,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name - description: "The name of the memo.\r\nFormat: memos/{id}" + description: |- + The name of the memo. + Format: memos/{id} in: path required: true type: string @@ -1387,7 +1454,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name - description: "The name of the memo.\r\nFormat: memos/{id}" + description: |- + The name of the memo. + Format: memos/{id} in: path required: true type: string @@ -1414,7 +1483,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name - description: "The name of the user.\r\nFormat: users/{id}" + description: |- + The name of the user. + Format: users/{id} in: path required: true type: string @@ -1436,13 +1507,17 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: parent - description: "The parent, who owns the tags.\r\nFormat: memos/{id}. Use \"memos/-\" to list all tags." + description: |- + The parent, who owns the tags. + Format: memos/{id}. Use "memos/-" to list all tags. in: path required: true type: string pattern: memos/[^/]+ - name: filter - description: "Filter is used to filter memos.\r\nFormat: \"creator == 'users/{uid}' && visibilities == ['PUBLIC', 'PROTECTED']\"" + description: |- + Filter is used to filter memos. + Format: "creator == 'users/{uid}' && visibilities == ['PUBLIC', 'PROTECTED']" in: query required: false type: string @@ -1464,7 +1539,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: parent - description: "The parent, who owns the tags.\r\nFormat: memos/{id}. Use \"memos/-\" to delete all tags." + description: |- + The parent, who owns the tags. + Format: memos/{id}. Use "memos/-" to delete all tags. in: path required: true type: string @@ -1495,7 +1572,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: parent - description: "The parent, who owns the tags.\r\nFormat: memos/{id}. Use \"memos/-\" to rename all tags." + description: |- + The parent, who owns the tags. + Format: memos/{id}. Use "memos/-" to rename all tags. in: path required: true type: string @@ -1522,7 +1601,10 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: resource.name - description: "The name of the resource.\r\nFormat: resources/{id}\r\nid is the system generated unique identifier." + description: |- + The name of the resource. + Format: resources/{id} + id is the system generated unique identifier. in: path required: true type: string @@ -1554,7 +1636,9 @@ paths: format: int64 memo: type: string - title: "The related memo.\r\nFormat: memos/{id}" + title: |- + The related memo. + Format: memos/{id} tags: - ResourceService /api/v1/{setting.name}: @@ -1572,7 +1656,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: setting.name - description: "The name of the user.\r\nFormat: users/{id}" + description: |- + The name of the user. + Format: users/{id} in: path required: true type: string @@ -1609,7 +1695,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: user.name - description: "The name of the user.\r\nFormat: users/{id}" + description: |- + The name of the user. + Format: users/{id} in: path required: true type: string @@ -1663,7 +1751,9 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name - description: "The name of the user.\r\nFormat: users/{id}" + description: |- + The name of the user. + Format: users/{id} in: path required: true type: string @@ -1696,7 +1786,10 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: name - description: "The name of the resource.\r\nFormat: resources/{id}\r\nid is the system generated unique identifier." + description: |- + The name of the resource. + Format: resources/{id} + id is the system generated unique identifier. in: path required: true type: string @@ -1883,7 +1976,9 @@ definitions: properties: name: type: string - title: "The name of the identityProvider.\r\nFormat: identityProviders/{id}" + title: |- + The name of the identityProvider. + Format: identityProviders/{id} type: $ref: '#/definitions/apiv1IdentityProviderType' title: @@ -1927,7 +2022,9 @@ definitions: properties: name: type: string - title: "The name of the user.\r\nFormat: users/{id}" + title: |- + The name of the user. + Format: users/{id} locale: type: string description: The preferred locale of the user. @@ -1971,7 +2068,10 @@ definitions: weekStartDayOffset: type: integer format: int32 - description: "week_start_day_offset is the week start day offset from Sunday.\r\n0: Sunday, 1: Monday, 2: Tuesday, 3: Wednesday, 4: Thursday, 5: Friday, 6: Saturday\r\nDefault is Sunday." + description: |- + week_start_day_offset is the week start day offset from Sunday. + 0: Sunday, 1: Monday, 2: Tuesday, 3: Wednesday, 4: Thursday, 5: Friday, 6: Saturday + Default is Sunday. disallowChangeUsername: type: boolean description: disallow_change_username disallows changing username. @@ -2008,7 +2108,9 @@ definitions: properties: name: type: string - title: "name is the name of the setting.\r\nFormat: settings/{setting}" + title: |- + name is the name of the setting. + Format: settings/{setting} generalSetting: $ref: '#/definitions/apiv1WorkspaceGeneralSetting' storageSetting: @@ -2023,7 +2125,9 @@ definitions: description: storage_type is the storage type. filepathTemplate: type: string - title: "The template of file path.\r\ne.g. assets/{timestamp}_{filename}" + title: |- + The template of file path. + e.g. assets/{timestamp}_{filename} uploadSizeLimitMb: type: string format: int64 @@ -2182,7 +2286,9 @@ definitions: properties: name: type: string - title: "The name of the activity.\r\nFormat: activities/{id}" + title: |- + The name of the activity. + Format: activities/{id} creatorId: type: integer format: int32 @@ -2313,7 +2419,9 @@ definitions: properties: name: type: string - title: "The name of the inbox.\r\nFormat: inboxes/{id}" + title: |- + The name of the inbox. + Format: inboxes/{id} sender: type: string title: 'Format: users/{id}' @@ -2433,7 +2541,10 @@ definitions: additionalProperties: type: integer format: int32 - description: "tag_amounts is the amount of tags.\r\nkey is the tag name. e.g. \"tag1\".\r\nvalue is the amount of the tag." + description: |- + tag_amounts is the amount of tags. + key is the tag name. e.g. "tag1". + value is the amount of the tag. v1ListMemosResponse: type: object properties: @@ -2444,7 +2555,17 @@ definitions: $ref: '#/definitions/v1Memo' nextPageToken: type: string - description: "A token, which can be sent as `page_token` to retrieve the next page.\r\nIf this field is omitted, there are no subsequent pages." + description: |- + A token, which can be sent as `page_token` to retrieve the next page. + If this field is omitted, there are no subsequent pages. + v1ListNode: + type: object + properties: + children: + type: array + items: + type: object + $ref: '#/definitions/v1Node' v1ListResourcesResponse: type: object properties: @@ -2492,7 +2613,10 @@ definitions: properties: name: type: string - description: "The name of the memo.\r\nFormat: memos/{id}\r\nid is the system generated id." + description: |- + The name of the memo. + Format: memos/{id} + id is the system generated id. uid: type: string description: The user defined id of the memo. @@ -2500,7 +2624,9 @@ definitions: $ref: '#/definitions/v1RowStatus' creator: type: string - title: "The name of the creator.\r\nFormat: users/{id}" + title: |- + The name of the creator. + Format: users/{id} createTime: type: string format: date-time @@ -2553,7 +2679,9 @@ definitions: readOnly: true parent: type: string - title: "The name of the parent memo.\r\nFormat: memos/{id}" + title: |- + The name of the parent memo. + Format: memos/{id} readOnly: true snippet: type: string @@ -2578,7 +2706,9 @@ definitions: properties: name: type: string - title: "The name of the memo property.\r\nFormat: memos/{id}/properties/{property_id}" + title: |- + The name of the memo property. + Format: memos/{id}/properties/{property_id} property: $ref: '#/definitions/v1MemoProperty' readOnly: true @@ -2591,10 +2721,14 @@ definitions: properties: memo: type: string - title: "The name of memo.\r\nFormat: \"memos/{uid}\"" + title: |- + The name of memo. + Format: "memos/{uid}" relatedMemo: type: string - title: "The name of related memo.\r\nFormat: \"memos/{uid}\"" + title: |- + The name of related memo. + Format: "memos/{uid}" type: $ref: '#/definitions/v1MemoRelationType' v1MemoRelationType: @@ -2611,6 +2745,7 @@ definitions: $ref: '#/definitions/v1NodeType' lineBreakNode: $ref: '#/definitions/v1LineBreakNode' + description: Block nodes. paragraphNode: $ref: '#/definitions/v1ParagraphNode' codeBlockNode: @@ -2621,12 +2756,14 @@ definitions: $ref: '#/definitions/v1HorizontalRuleNode' blockquoteNode: $ref: '#/definitions/v1BlockquoteNode' - orderedListNode: - $ref: '#/definitions/v1OrderedListNode' - unorderedListNode: - $ref: '#/definitions/v1UnorderedListNode' - taskListNode: - $ref: '#/definitions/v1TaskListNode' + listNode: + $ref: '#/definitions/v1ListNode' + orderedListItemNode: + $ref: '#/definitions/v1OrderedListItemNode' + unorderedListItemNode: + $ref: '#/definitions/v1UnorderedListItemNode' + taskListItemNode: + $ref: '#/definitions/v1TaskListItemNode' mathBlockNode: $ref: '#/definitions/v1MathBlockNode' tableNode: @@ -2635,6 +2772,7 @@ definitions: $ref: '#/definitions/v1EmbeddedContentNode' textNode: $ref: '#/definitions/v1TextNode' + description: Inline nodes. boldNode: $ref: '#/definitions/v1BoldNode' italicNode: @@ -2679,9 +2817,10 @@ definitions: - HEADING - HORIZONTAL_RULE - BLOCKQUOTE - - ORDERED_LIST - - UNORDERED_LIST - - TASK_LIST + - LIST + - ORDERED_LIST_ITEM + - UNORDERED_LIST_ITEM + - TASK_LIST_ITEM - MATH_BLOCK - TABLE - EMBEDDED_CONTENT @@ -2704,7 +2843,10 @@ definitions: - SPOILER - HTML_ELEMENT default: NODE_UNSPECIFIED - v1OrderedListNode: + description: |2- + - LINE_BREAK: Block nodes. + - TEXT: Inline nodes. + v1OrderedListItemNode: type: object properties: number: @@ -2746,7 +2888,9 @@ definitions: format: int32 creator: type: string - title: "The name of the creator.\r\nFormat: users/{id}" + title: |- + The name of the creator. + Format: users/{id} contentId: type: string reactionType: @@ -2780,7 +2924,10 @@ definitions: properties: name: type: string - description: "The name of the resource.\r\nFormat: resources/{id}\r\nid is the system generated unique identifier." + description: |- + The name of the resource. + Format: resources/{id} + id is the system generated unique identifier. uid: type: string description: The user defined id of the resource. @@ -2802,7 +2949,9 @@ definitions: format: int64 memo: type: string - title: "The related memo.\r\nFormat: memos/{id}" + title: |- + The related memo. + Format: memos/{id} v1RestoreMarkdownNodesRequest: type: object properties: @@ -2886,7 +3035,7 @@ definitions: properties: content: type: string - v1TaskListNode: + v1TaskListItemNode: type: object properties: symbol: @@ -2906,7 +3055,7 @@ definitions: properties: content: type: string - v1UnorderedListNode: + v1UnorderedListItemNode: type: object properties: symbol: @@ -2924,7 +3073,9 @@ definitions: properties: name: type: string - title: "The name of the user.\r\nFormat: users/{id}" + title: |- + The name of the user. + Format: users/{id} id: type: integer format: int32 @@ -2998,7 +3149,9 @@ definitions: properties: owner: type: string - title: "The name of instance owner.\r\nFormat: \"users/{id}\"" + title: |- + The name of instance owner. + Format: "users/{id}" version: type: string title: version is the current version of instance diff --git a/go.mod b/go.mod index 3d0b5bfa..b260607b 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,7 @@ require ( github.com/spf13/cobra v1.8.1 github.com/spf13/viper v1.19.0 github.com/stretchr/testify v1.9.0 - github.com/usememos/gomark v0.0.0-20240714122951-35ed01b21822 + github.com/usememos/gomark v0.0.0-20240917110103-3ccacc410d19 golang.org/x/crypto v0.25.0 golang.org/x/exp v0.0.0-20240409090435-93d18d7e34b8 golang.org/x/mod v0.20.0 diff --git a/go.sum b/go.sum index 3d7362bd..d37ae009 100644 --- a/go.sum +++ b/go.sum @@ -439,8 +439,8 @@ github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVM github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/usememos/gomark v0.0.0-20240714122951-35ed01b21822 h1:4DQs0DJGaXLq+1eP6QfMkvcunyTVJ5OR7LK1cOm2imE= -github.com/usememos/gomark v0.0.0-20240714122951-35ed01b21822/go.mod h1:7CZRoYFQyyljzplOTeyODFR26O+wr0BbnpTWVLGfKJA= +github.com/usememos/gomark v0.0.0-20240917110103-3ccacc410d19 h1:LFNLNBuUxqyYqh8yZrPyuk0n72rRGHqGWfoGBmoysMk= +github.com/usememos/gomark v0.0.0-20240917110103-3ccacc410d19/go.mod h1:7CZRoYFQyyljzplOTeyODFR26O+wr0BbnpTWVLGfKJA= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= diff --git a/proto/api/v1/markdown_service.proto b/proto/api/v1/markdown_service.proto index c2e0ea77..28eaf279 100644 --- a/proto/api/v1/markdown_service.proto +++ b/proto/api/v1/markdown_service.proto @@ -70,71 +70,81 @@ message LinkMetadata { enum NodeType { NODE_UNSPECIFIED = 0; + + // Block nodes. LINE_BREAK = 1; PARAGRAPH = 2; CODE_BLOCK = 3; HEADING = 4; HORIZONTAL_RULE = 5; BLOCKQUOTE = 6; - ORDERED_LIST = 7; - UNORDERED_LIST = 8; - TASK_LIST = 9; - MATH_BLOCK = 10; - TABLE = 11; - EMBEDDED_CONTENT = 12; - TEXT = 13; - BOLD = 14; - ITALIC = 15; - BOLD_ITALIC = 16; - CODE = 17; - IMAGE = 18; - LINK = 19; - AUTO_LINK = 20; - TAG = 21; - STRIKETHROUGH = 22; - ESCAPING_CHARACTER = 23; - MATH = 24; - HIGHLIGHT = 25; - SUBSCRIPT = 26; - SUPERSCRIPT = 27; - REFERENCED_CONTENT = 28; - SPOILER = 29; - HTML_ELEMENT = 30; + LIST = 7; + ORDERED_LIST_ITEM = 8; + UNORDERED_LIST_ITEM = 9; + TASK_LIST_ITEM = 10; + MATH_BLOCK = 11; + TABLE = 12; + EMBEDDED_CONTENT = 13; + + // Inline nodes. + TEXT = 51; + BOLD = 52; + ITALIC = 53; + BOLD_ITALIC = 54; + CODE = 55; + IMAGE = 56; + LINK = 57; + AUTO_LINK = 58; + TAG = 59; + STRIKETHROUGH = 60; + ESCAPING_CHARACTER = 61; + MATH = 62; + HIGHLIGHT = 63; + SUBSCRIPT = 64; + SUPERSCRIPT = 65; + REFERENCED_CONTENT = 66; + SPOILER = 67; + HTML_ELEMENT = 68; } message Node { NodeType type = 1; + oneof node { - LineBreakNode line_break_node = 2; - ParagraphNode paragraph_node = 3; - CodeBlockNode code_block_node = 4; - HeadingNode heading_node = 5; - HorizontalRuleNode horizontal_rule_node = 6; - BlockquoteNode blockquote_node = 7; - OrderedListNode ordered_list_node = 8; - UnorderedListNode unordered_list_node = 9; - TaskListNode task_list_node = 10; - MathBlockNode math_block_node = 11; - TableNode table_node = 12; - EmbeddedContentNode embedded_content_node = 13; - TextNode text_node = 14; - BoldNode bold_node = 15; - ItalicNode italic_node = 16; - BoldItalicNode bold_italic_node = 17; - CodeNode code_node = 18; - ImageNode image_node = 19; - LinkNode link_node = 20; - AutoLinkNode auto_link_node = 21; - TagNode tag_node = 22; - StrikethroughNode strikethrough_node = 23; - EscapingCharacterNode escaping_character_node = 24; - MathNode math_node = 25; - HighlightNode highlight_node = 26; - SubscriptNode subscript_node = 27; - SuperscriptNode superscript_node = 28; - ReferencedContentNode referenced_content_node = 29; - SpoilerNode spoiler_node = 30; - HTMLElementNode html_element_node = 31; + // Block nodes. + LineBreakNode line_break_node = 11; + ParagraphNode paragraph_node = 12; + CodeBlockNode code_block_node = 13; + HeadingNode heading_node = 14; + HorizontalRuleNode horizontal_rule_node = 15; + BlockquoteNode blockquote_node = 16; + ListNode list_node = 17; + OrderedListItemNode ordered_list_item_node = 18; + UnorderedListItemNode unordered_list_item_node = 19; + TaskListItemNode task_list_item_node = 20; + MathBlockNode math_block_node = 21; + TableNode table_node = 22; + EmbeddedContentNode embedded_content_node = 23; + + // Inline nodes. + TextNode text_node = 51; + BoldNode bold_node = 52; + ItalicNode italic_node = 53; + BoldItalicNode bold_italic_node = 54; + CodeNode code_node = 55; + ImageNode image_node = 56; + LinkNode link_node = 57; + AutoLinkNode auto_link_node = 58; + TagNode tag_node = 59; + StrikethroughNode strikethrough_node = 60; + EscapingCharacterNode escaping_character_node = 61; + MathNode math_node = 62; + HighlightNode highlight_node = 63; + SubscriptNode subscript_node = 64; + SuperscriptNode superscript_node = 65; + ReferencedContentNode referenced_content_node = 66; + SpoilerNode spoiler_node = 67; + HTMLElementNode html_element_node = 68; } } @@ -162,19 +172,23 @@ message BlockquoteNode { repeated Node children = 1; } -message OrderedListNode { +message ListNode { + repeated Node children = 1; +} + +message OrderedListItemNode { string number = 1; int32 indent = 2; repeated Node children = 3; } -message UnorderedListNode { +message UnorderedListItemNode { string symbol = 1; int32 indent = 2; repeated Node children = 3; } -message TaskListNode { +message TaskListItemNode { string symbol = 1; int32 indent = 2; bool complete = 3; diff --git a/proto/gen/api/v1/markdown_service.pb.go b/proto/gen/api/v1/markdown_service.pb.go index 6cf10d5d..24b8ee60 100644 --- a/proto/gen/api/v1/markdown_service.pb.go +++ b/proto/gen/api/v1/markdown_service.pb.go @@ -24,37 +24,40 @@ const ( type NodeType int32 const ( - NodeType_NODE_UNSPECIFIED NodeType = 0 - NodeType_LINE_BREAK NodeType = 1 - NodeType_PARAGRAPH NodeType = 2 - NodeType_CODE_BLOCK NodeType = 3 - NodeType_HEADING NodeType = 4 - NodeType_HORIZONTAL_RULE NodeType = 5 - NodeType_BLOCKQUOTE NodeType = 6 - NodeType_ORDERED_LIST NodeType = 7 - NodeType_UNORDERED_LIST NodeType = 8 - NodeType_TASK_LIST NodeType = 9 - NodeType_MATH_BLOCK NodeType = 10 - NodeType_TABLE NodeType = 11 - NodeType_EMBEDDED_CONTENT NodeType = 12 - NodeType_TEXT NodeType = 13 - NodeType_BOLD NodeType = 14 - NodeType_ITALIC NodeType = 15 - NodeType_BOLD_ITALIC NodeType = 16 - NodeType_CODE NodeType = 17 - NodeType_IMAGE NodeType = 18 - NodeType_LINK NodeType = 19 - NodeType_AUTO_LINK NodeType = 20 - NodeType_TAG NodeType = 21 - NodeType_STRIKETHROUGH NodeType = 22 - NodeType_ESCAPING_CHARACTER NodeType = 23 - NodeType_MATH NodeType = 24 - NodeType_HIGHLIGHT NodeType = 25 - NodeType_SUBSCRIPT NodeType = 26 - NodeType_SUPERSCRIPT NodeType = 27 - NodeType_REFERENCED_CONTENT NodeType = 28 - NodeType_SPOILER NodeType = 29 - NodeType_HTML_ELEMENT NodeType = 30 + NodeType_NODE_UNSPECIFIED NodeType = 0 + // Block nodes. + NodeType_LINE_BREAK NodeType = 1 + NodeType_PARAGRAPH NodeType = 2 + NodeType_CODE_BLOCK NodeType = 3 + NodeType_HEADING NodeType = 4 + NodeType_HORIZONTAL_RULE NodeType = 5 + NodeType_BLOCKQUOTE NodeType = 6 + NodeType_LIST NodeType = 7 + NodeType_ORDERED_LIST_ITEM NodeType = 8 + NodeType_UNORDERED_LIST_ITEM NodeType = 9 + NodeType_TASK_LIST_ITEM NodeType = 10 + NodeType_MATH_BLOCK NodeType = 11 + NodeType_TABLE NodeType = 12 + NodeType_EMBEDDED_CONTENT NodeType = 13 + // Inline nodes. + NodeType_TEXT NodeType = 51 + NodeType_BOLD NodeType = 52 + NodeType_ITALIC NodeType = 53 + NodeType_BOLD_ITALIC NodeType = 54 + NodeType_CODE NodeType = 55 + NodeType_IMAGE NodeType = 56 + NodeType_LINK NodeType = 57 + NodeType_AUTO_LINK NodeType = 58 + NodeType_TAG NodeType = 59 + NodeType_STRIKETHROUGH NodeType = 60 + NodeType_ESCAPING_CHARACTER NodeType = 61 + NodeType_MATH NodeType = 62 + NodeType_HIGHLIGHT NodeType = 63 + NodeType_SUBSCRIPT NodeType = 64 + NodeType_SUPERSCRIPT NodeType = 65 + NodeType_REFERENCED_CONTENT NodeType = 66 + NodeType_SPOILER NodeType = 67 + NodeType_HTML_ELEMENT NodeType = 68 ) // Enum value maps for NodeType. @@ -67,63 +70,65 @@ var ( 4: "HEADING", 5: "HORIZONTAL_RULE", 6: "BLOCKQUOTE", - 7: "ORDERED_LIST", - 8: "UNORDERED_LIST", - 9: "TASK_LIST", - 10: "MATH_BLOCK", - 11: "TABLE", - 12: "EMBEDDED_CONTENT", - 13: "TEXT", - 14: "BOLD", - 15: "ITALIC", - 16: "BOLD_ITALIC", - 17: "CODE", - 18: "IMAGE", - 19: "LINK", - 20: "AUTO_LINK", - 21: "TAG", - 22: "STRIKETHROUGH", - 23: "ESCAPING_CHARACTER", - 24: "MATH", - 25: "HIGHLIGHT", - 26: "SUBSCRIPT", - 27: "SUPERSCRIPT", - 28: "REFERENCED_CONTENT", - 29: "SPOILER", - 30: "HTML_ELEMENT", + 7: "LIST", + 8: "ORDERED_LIST_ITEM", + 9: "UNORDERED_LIST_ITEM", + 10: "TASK_LIST_ITEM", + 11: "MATH_BLOCK", + 12: "TABLE", + 13: "EMBEDDED_CONTENT", + 51: "TEXT", + 52: "BOLD", + 53: "ITALIC", + 54: "BOLD_ITALIC", + 55: "CODE", + 56: "IMAGE", + 57: "LINK", + 58: "AUTO_LINK", + 59: "TAG", + 60: "STRIKETHROUGH", + 61: "ESCAPING_CHARACTER", + 62: "MATH", + 63: "HIGHLIGHT", + 64: "SUBSCRIPT", + 65: "SUPERSCRIPT", + 66: "REFERENCED_CONTENT", + 67: "SPOILER", + 68: "HTML_ELEMENT", } NodeType_value = map[string]int32{ - "NODE_UNSPECIFIED": 0, - "LINE_BREAK": 1, - "PARAGRAPH": 2, - "CODE_BLOCK": 3, - "HEADING": 4, - "HORIZONTAL_RULE": 5, - "BLOCKQUOTE": 6, - "ORDERED_LIST": 7, - "UNORDERED_LIST": 8, - "TASK_LIST": 9, - "MATH_BLOCK": 10, - "TABLE": 11, - "EMBEDDED_CONTENT": 12, - "TEXT": 13, - "BOLD": 14, - "ITALIC": 15, - "BOLD_ITALIC": 16, - "CODE": 17, - "IMAGE": 18, - "LINK": 19, - "AUTO_LINK": 20, - "TAG": 21, - "STRIKETHROUGH": 22, - "ESCAPING_CHARACTER": 23, - "MATH": 24, - "HIGHLIGHT": 25, - "SUBSCRIPT": 26, - "SUPERSCRIPT": 27, - "REFERENCED_CONTENT": 28, - "SPOILER": 29, - "HTML_ELEMENT": 30, + "NODE_UNSPECIFIED": 0, + "LINE_BREAK": 1, + "PARAGRAPH": 2, + "CODE_BLOCK": 3, + "HEADING": 4, + "HORIZONTAL_RULE": 5, + "BLOCKQUOTE": 6, + "LIST": 7, + "ORDERED_LIST_ITEM": 8, + "UNORDERED_LIST_ITEM": 9, + "TASK_LIST_ITEM": 10, + "MATH_BLOCK": 11, + "TABLE": 12, + "EMBEDDED_CONTENT": 13, + "TEXT": 51, + "BOLD": 52, + "ITALIC": 53, + "BOLD_ITALIC": 54, + "CODE": 55, + "IMAGE": 56, + "LINK": 57, + "AUTO_LINK": 58, + "TAG": 59, + "STRIKETHROUGH": 60, + "ESCAPING_CHARACTER": 61, + "MATH": 62, + "HIGHLIGHT": 63, + "SUBSCRIPT": 64, + "SUPERSCRIPT": 65, + "REFERENCED_CONTENT": 66, + "SPOILER": 67, + "HTML_ELEMENT": 68, } ) @@ -560,9 +565,10 @@ type Node struct { // *Node_HeadingNode // *Node_HorizontalRuleNode // *Node_BlockquoteNode - // *Node_OrderedListNode - // *Node_UnorderedListNode - // *Node_TaskListNode + // *Node_ListNode + // *Node_OrderedListItemNode + // *Node_UnorderedListItemNode + // *Node_TaskListItemNode // *Node_MathBlockNode // *Node_TableNode // *Node_EmbeddedContentNode @@ -675,23 +681,30 @@ func (x *Node) GetBlockquoteNode() *BlockquoteNode { return nil } -func (x *Node) GetOrderedListNode() *OrderedListNode { - if x, ok := x.GetNode().(*Node_OrderedListNode); ok { - return x.OrderedListNode +func (x *Node) GetListNode() *ListNode { + if x, ok := x.GetNode().(*Node_ListNode); ok { + return x.ListNode } return nil } -func (x *Node) GetUnorderedListNode() *UnorderedListNode { - if x, ok := x.GetNode().(*Node_UnorderedListNode); ok { - return x.UnorderedListNode +func (x *Node) GetOrderedListItemNode() *OrderedListItemNode { + if x, ok := x.GetNode().(*Node_OrderedListItemNode); ok { + return x.OrderedListItemNode } return nil } -func (x *Node) GetTaskListNode() *TaskListNode { - if x, ok := x.GetNode().(*Node_TaskListNode); ok { - return x.TaskListNode +func (x *Node) GetUnorderedListItemNode() *UnorderedListItemNode { + if x, ok := x.GetNode().(*Node_UnorderedListItemNode); ok { + return x.UnorderedListItemNode + } + return nil +} + +func (x *Node) GetTaskListItemNode() *TaskListItemNode { + if x, ok := x.GetNode().(*Node_TaskListItemNode); ok { + return x.TaskListItemNode } return nil } @@ -848,123 +861,129 @@ type isNode_Node interface { } type Node_LineBreakNode struct { - LineBreakNode *LineBreakNode `protobuf:"bytes,2,opt,name=line_break_node,json=lineBreakNode,proto3,oneof"` + // Block nodes. + LineBreakNode *LineBreakNode `protobuf:"bytes,11,opt,name=line_break_node,json=lineBreakNode,proto3,oneof"` } type Node_ParagraphNode struct { - ParagraphNode *ParagraphNode `protobuf:"bytes,3,opt,name=paragraph_node,json=paragraphNode,proto3,oneof"` + ParagraphNode *ParagraphNode `protobuf:"bytes,12,opt,name=paragraph_node,json=paragraphNode,proto3,oneof"` } type Node_CodeBlockNode struct { - CodeBlockNode *CodeBlockNode `protobuf:"bytes,4,opt,name=code_block_node,json=codeBlockNode,proto3,oneof"` + CodeBlockNode *CodeBlockNode `protobuf:"bytes,13,opt,name=code_block_node,json=codeBlockNode,proto3,oneof"` } type Node_HeadingNode struct { - HeadingNode *HeadingNode `protobuf:"bytes,5,opt,name=heading_node,json=headingNode,proto3,oneof"` + HeadingNode *HeadingNode `protobuf:"bytes,14,opt,name=heading_node,json=headingNode,proto3,oneof"` } type Node_HorizontalRuleNode struct { - HorizontalRuleNode *HorizontalRuleNode `protobuf:"bytes,6,opt,name=horizontal_rule_node,json=horizontalRuleNode,proto3,oneof"` + HorizontalRuleNode *HorizontalRuleNode `protobuf:"bytes,15,opt,name=horizontal_rule_node,json=horizontalRuleNode,proto3,oneof"` } type Node_BlockquoteNode struct { - BlockquoteNode *BlockquoteNode `protobuf:"bytes,7,opt,name=blockquote_node,json=blockquoteNode,proto3,oneof"` + BlockquoteNode *BlockquoteNode `protobuf:"bytes,16,opt,name=blockquote_node,json=blockquoteNode,proto3,oneof"` } -type Node_OrderedListNode struct { - OrderedListNode *OrderedListNode `protobuf:"bytes,8,opt,name=ordered_list_node,json=orderedListNode,proto3,oneof"` +type Node_ListNode struct { + ListNode *ListNode `protobuf:"bytes,17,opt,name=list_node,json=listNode,proto3,oneof"` } -type Node_UnorderedListNode struct { - UnorderedListNode *UnorderedListNode `protobuf:"bytes,9,opt,name=unordered_list_node,json=unorderedListNode,proto3,oneof"` +type Node_OrderedListItemNode struct { + OrderedListItemNode *OrderedListItemNode `protobuf:"bytes,18,opt,name=ordered_list_item_node,json=orderedListItemNode,proto3,oneof"` } -type Node_TaskListNode struct { - TaskListNode *TaskListNode `protobuf:"bytes,10,opt,name=task_list_node,json=taskListNode,proto3,oneof"` +type Node_UnorderedListItemNode struct { + UnorderedListItemNode *UnorderedListItemNode `protobuf:"bytes,19,opt,name=unordered_list_item_node,json=unorderedListItemNode,proto3,oneof"` +} + +type Node_TaskListItemNode struct { + TaskListItemNode *TaskListItemNode `protobuf:"bytes,20,opt,name=task_list_item_node,json=taskListItemNode,proto3,oneof"` } type Node_MathBlockNode struct { - MathBlockNode *MathBlockNode `protobuf:"bytes,11,opt,name=math_block_node,json=mathBlockNode,proto3,oneof"` + MathBlockNode *MathBlockNode `protobuf:"bytes,21,opt,name=math_block_node,json=mathBlockNode,proto3,oneof"` } type Node_TableNode struct { - TableNode *TableNode `protobuf:"bytes,12,opt,name=table_node,json=tableNode,proto3,oneof"` + TableNode *TableNode `protobuf:"bytes,22,opt,name=table_node,json=tableNode,proto3,oneof"` } type Node_EmbeddedContentNode struct { - EmbeddedContentNode *EmbeddedContentNode `protobuf:"bytes,13,opt,name=embedded_content_node,json=embeddedContentNode,proto3,oneof"` + EmbeddedContentNode *EmbeddedContentNode `protobuf:"bytes,23,opt,name=embedded_content_node,json=embeddedContentNode,proto3,oneof"` } type Node_TextNode struct { - TextNode *TextNode `protobuf:"bytes,14,opt,name=text_node,json=textNode,proto3,oneof"` + // Inline nodes. + TextNode *TextNode `protobuf:"bytes,51,opt,name=text_node,json=textNode,proto3,oneof"` } type Node_BoldNode struct { - BoldNode *BoldNode `protobuf:"bytes,15,opt,name=bold_node,json=boldNode,proto3,oneof"` + BoldNode *BoldNode `protobuf:"bytes,52,opt,name=bold_node,json=boldNode,proto3,oneof"` } type Node_ItalicNode struct { - ItalicNode *ItalicNode `protobuf:"bytes,16,opt,name=italic_node,json=italicNode,proto3,oneof"` + ItalicNode *ItalicNode `protobuf:"bytes,53,opt,name=italic_node,json=italicNode,proto3,oneof"` } type Node_BoldItalicNode struct { - BoldItalicNode *BoldItalicNode `protobuf:"bytes,17,opt,name=bold_italic_node,json=boldItalicNode,proto3,oneof"` + BoldItalicNode *BoldItalicNode `protobuf:"bytes,54,opt,name=bold_italic_node,json=boldItalicNode,proto3,oneof"` } type Node_CodeNode struct { - CodeNode *CodeNode `protobuf:"bytes,18,opt,name=code_node,json=codeNode,proto3,oneof"` + CodeNode *CodeNode `protobuf:"bytes,55,opt,name=code_node,json=codeNode,proto3,oneof"` } type Node_ImageNode struct { - ImageNode *ImageNode `protobuf:"bytes,19,opt,name=image_node,json=imageNode,proto3,oneof"` + ImageNode *ImageNode `protobuf:"bytes,56,opt,name=image_node,json=imageNode,proto3,oneof"` } type Node_LinkNode struct { - LinkNode *LinkNode `protobuf:"bytes,20,opt,name=link_node,json=linkNode,proto3,oneof"` + LinkNode *LinkNode `protobuf:"bytes,57,opt,name=link_node,json=linkNode,proto3,oneof"` } type Node_AutoLinkNode struct { - AutoLinkNode *AutoLinkNode `protobuf:"bytes,21,opt,name=auto_link_node,json=autoLinkNode,proto3,oneof"` + AutoLinkNode *AutoLinkNode `protobuf:"bytes,58,opt,name=auto_link_node,json=autoLinkNode,proto3,oneof"` } type Node_TagNode struct { - TagNode *TagNode `protobuf:"bytes,22,opt,name=tag_node,json=tagNode,proto3,oneof"` + TagNode *TagNode `protobuf:"bytes,59,opt,name=tag_node,json=tagNode,proto3,oneof"` } type Node_StrikethroughNode struct { - StrikethroughNode *StrikethroughNode `protobuf:"bytes,23,opt,name=strikethrough_node,json=strikethroughNode,proto3,oneof"` + StrikethroughNode *StrikethroughNode `protobuf:"bytes,60,opt,name=strikethrough_node,json=strikethroughNode,proto3,oneof"` } type Node_EscapingCharacterNode struct { - EscapingCharacterNode *EscapingCharacterNode `protobuf:"bytes,24,opt,name=escaping_character_node,json=escapingCharacterNode,proto3,oneof"` + EscapingCharacterNode *EscapingCharacterNode `protobuf:"bytes,61,opt,name=escaping_character_node,json=escapingCharacterNode,proto3,oneof"` } type Node_MathNode struct { - MathNode *MathNode `protobuf:"bytes,25,opt,name=math_node,json=mathNode,proto3,oneof"` + MathNode *MathNode `protobuf:"bytes,62,opt,name=math_node,json=mathNode,proto3,oneof"` } type Node_HighlightNode struct { - HighlightNode *HighlightNode `protobuf:"bytes,26,opt,name=highlight_node,json=highlightNode,proto3,oneof"` + HighlightNode *HighlightNode `protobuf:"bytes,63,opt,name=highlight_node,json=highlightNode,proto3,oneof"` } type Node_SubscriptNode struct { - SubscriptNode *SubscriptNode `protobuf:"bytes,27,opt,name=subscript_node,json=subscriptNode,proto3,oneof"` + SubscriptNode *SubscriptNode `protobuf:"bytes,64,opt,name=subscript_node,json=subscriptNode,proto3,oneof"` } type Node_SuperscriptNode struct { - SuperscriptNode *SuperscriptNode `protobuf:"bytes,28,opt,name=superscript_node,json=superscriptNode,proto3,oneof"` + SuperscriptNode *SuperscriptNode `protobuf:"bytes,65,opt,name=superscript_node,json=superscriptNode,proto3,oneof"` } type Node_ReferencedContentNode struct { - ReferencedContentNode *ReferencedContentNode `protobuf:"bytes,29,opt,name=referenced_content_node,json=referencedContentNode,proto3,oneof"` + ReferencedContentNode *ReferencedContentNode `protobuf:"bytes,66,opt,name=referenced_content_node,json=referencedContentNode,proto3,oneof"` } type Node_SpoilerNode struct { - SpoilerNode *SpoilerNode `protobuf:"bytes,30,opt,name=spoiler_node,json=spoilerNode,proto3,oneof"` + SpoilerNode *SpoilerNode `protobuf:"bytes,67,opt,name=spoiler_node,json=spoilerNode,proto3,oneof"` } type Node_HtmlElementNode struct { - HtmlElementNode *HTMLElementNode `protobuf:"bytes,31,opt,name=html_element_node,json=htmlElementNode,proto3,oneof"` + HtmlElementNode *HTMLElementNode `protobuf:"bytes,68,opt,name=html_element_node,json=htmlElementNode,proto3,oneof"` } func (*Node_LineBreakNode) isNode_Node() {} @@ -979,11 +998,13 @@ func (*Node_HorizontalRuleNode) isNode_Node() {} func (*Node_BlockquoteNode) isNode_Node() {} -func (*Node_OrderedListNode) isNode_Node() {} +func (*Node_ListNode) isNode_Node() {} -func (*Node_UnorderedListNode) isNode_Node() {} +func (*Node_OrderedListItemNode) isNode_Node() {} -func (*Node_TaskListNode) isNode_Node() {} +func (*Node_UnorderedListItemNode) isNode_Node() {} + +func (*Node_TaskListItemNode) isNode_Node() {} func (*Node_MathBlockNode) isNode_Node() {} @@ -1316,18 +1337,16 @@ func (x *BlockquoteNode) GetChildren() []*Node { return nil } -type OrderedListNode struct { +type ListNode struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Number string `protobuf:"bytes,1,opt,name=number,proto3" json:"number,omitempty"` - Indent int32 `protobuf:"varint,2,opt,name=indent,proto3" json:"indent,omitempty"` - Children []*Node `protobuf:"bytes,3,rep,name=children,proto3" json:"children,omitempty"` + Children []*Node `protobuf:"bytes,1,rep,name=children,proto3" json:"children,omitempty"` } -func (x *OrderedListNode) Reset() { - *x = OrderedListNode{} +func (x *ListNode) Reset() { + *x = ListNode{} if protoimpl.UnsafeEnabled { mi := &file_api_v1_markdown_service_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1335,13 +1354,13 @@ func (x *OrderedListNode) Reset() { } } -func (x *OrderedListNode) String() string { +func (x *ListNode) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OrderedListNode) ProtoMessage() {} +func (*ListNode) ProtoMessage() {} -func (x *OrderedListNode) ProtoReflect() protoreflect.Message { +func (x *ListNode) ProtoReflect() protoreflect.Message { mi := &file_api_v1_markdown_service_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1353,44 +1372,30 @@ func (x *OrderedListNode) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use OrderedListNode.ProtoReflect.Descriptor instead. -func (*OrderedListNode) Descriptor() ([]byte, []int) { +// Deprecated: Use ListNode.ProtoReflect.Descriptor instead. +func (*ListNode) Descriptor() ([]byte, []int) { return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{15} } -func (x *OrderedListNode) GetNumber() string { - if x != nil { - return x.Number - } - return "" -} - -func (x *OrderedListNode) GetIndent() int32 { - if x != nil { - return x.Indent - } - return 0 -} - -func (x *OrderedListNode) GetChildren() []*Node { +func (x *ListNode) GetChildren() []*Node { if x != nil { return x.Children } return nil } -type UnorderedListNode struct { +type OrderedListItemNode struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Symbol string `protobuf:"bytes,1,opt,name=symbol,proto3" json:"symbol,omitempty"` + Number string `protobuf:"bytes,1,opt,name=number,proto3" json:"number,omitempty"` Indent int32 `protobuf:"varint,2,opt,name=indent,proto3" json:"indent,omitempty"` Children []*Node `protobuf:"bytes,3,rep,name=children,proto3" json:"children,omitempty"` } -func (x *UnorderedListNode) Reset() { - *x = UnorderedListNode{} +func (x *OrderedListItemNode) Reset() { + *x = OrderedListItemNode{} if protoimpl.UnsafeEnabled { mi := &file_api_v1_markdown_service_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1398,13 +1403,13 @@ func (x *UnorderedListNode) Reset() { } } -func (x *UnorderedListNode) String() string { +func (x *OrderedListItemNode) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UnorderedListNode) ProtoMessage() {} +func (*OrderedListItemNode) ProtoMessage() {} -func (x *UnorderedListNode) ProtoReflect() protoreflect.Message { +func (x *OrderedListItemNode) ProtoReflect() protoreflect.Message { mi := &file_api_v1_markdown_service_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1416,45 +1421,44 @@ func (x *UnorderedListNode) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UnorderedListNode.ProtoReflect.Descriptor instead. -func (*UnorderedListNode) Descriptor() ([]byte, []int) { +// Deprecated: Use OrderedListItemNode.ProtoReflect.Descriptor instead. +func (*OrderedListItemNode) Descriptor() ([]byte, []int) { return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{16} } -func (x *UnorderedListNode) GetSymbol() string { +func (x *OrderedListItemNode) GetNumber() string { if x != nil { - return x.Symbol + return x.Number } return "" } -func (x *UnorderedListNode) GetIndent() int32 { +func (x *OrderedListItemNode) GetIndent() int32 { if x != nil { return x.Indent } return 0 } -func (x *UnorderedListNode) GetChildren() []*Node { +func (x *OrderedListItemNode) GetChildren() []*Node { if x != nil { return x.Children } return nil } -type TaskListNode struct { +type UnorderedListItemNode struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Symbol string `protobuf:"bytes,1,opt,name=symbol,proto3" json:"symbol,omitempty"` Indent int32 `protobuf:"varint,2,opt,name=indent,proto3" json:"indent,omitempty"` - Complete bool `protobuf:"varint,3,opt,name=complete,proto3" json:"complete,omitempty"` - Children []*Node `protobuf:"bytes,4,rep,name=children,proto3" json:"children,omitempty"` + Children []*Node `protobuf:"bytes,3,rep,name=children,proto3" json:"children,omitempty"` } -func (x *TaskListNode) Reset() { - *x = TaskListNode{} +func (x *UnorderedListItemNode) Reset() { + *x = UnorderedListItemNode{} if protoimpl.UnsafeEnabled { mi := &file_api_v1_markdown_service_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1462,13 +1466,13 @@ func (x *TaskListNode) Reset() { } } -func (x *TaskListNode) String() string { +func (x *UnorderedListItemNode) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TaskListNode) ProtoMessage() {} +func (*UnorderedListItemNode) ProtoMessage() {} -func (x *TaskListNode) ProtoReflect() protoreflect.Message { +func (x *UnorderedListItemNode) ProtoReflect() protoreflect.Message { mi := &file_api_v1_markdown_service_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1480,33 +1484,97 @@ func (x *TaskListNode) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TaskListNode.ProtoReflect.Descriptor instead. -func (*TaskListNode) Descriptor() ([]byte, []int) { +// Deprecated: Use UnorderedListItemNode.ProtoReflect.Descriptor instead. +func (*UnorderedListItemNode) Descriptor() ([]byte, []int) { return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{17} } -func (x *TaskListNode) GetSymbol() string { +func (x *UnorderedListItemNode) GetSymbol() string { if x != nil { return x.Symbol } return "" } -func (x *TaskListNode) GetIndent() int32 { +func (x *UnorderedListItemNode) GetIndent() int32 { if x != nil { return x.Indent } return 0 } -func (x *TaskListNode) GetComplete() bool { +func (x *UnorderedListItemNode) GetChildren() []*Node { + if x != nil { + return x.Children + } + return nil +} + +type TaskListItemNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Symbol string `protobuf:"bytes,1,opt,name=symbol,proto3" json:"symbol,omitempty"` + Indent int32 `protobuf:"varint,2,opt,name=indent,proto3" json:"indent,omitempty"` + Complete bool `protobuf:"varint,3,opt,name=complete,proto3" json:"complete,omitempty"` + Children []*Node `protobuf:"bytes,4,rep,name=children,proto3" json:"children,omitempty"` +} + +func (x *TaskListItemNode) Reset() { + *x = TaskListItemNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TaskListItemNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TaskListItemNode) ProtoMessage() {} + +func (x *TaskListItemNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TaskListItemNode.ProtoReflect.Descriptor instead. +func (*TaskListItemNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{18} +} + +func (x *TaskListItemNode) GetSymbol() string { + if x != nil { + return x.Symbol + } + return "" +} + +func (x *TaskListItemNode) GetIndent() int32 { + if x != nil { + return x.Indent + } + return 0 +} + +func (x *TaskListItemNode) GetComplete() bool { if x != nil { return x.Complete } return false } -func (x *TaskListNode) GetChildren() []*Node { +func (x *TaskListItemNode) GetChildren() []*Node { if x != nil { return x.Children } @@ -1524,7 +1592,7 @@ type MathBlockNode struct { func (x *MathBlockNode) Reset() { *x = MathBlockNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_markdown_service_proto_msgTypes[18] + mi := &file_api_v1_markdown_service_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1537,7 +1605,7 @@ func (x *MathBlockNode) String() string { func (*MathBlockNode) ProtoMessage() {} func (x *MathBlockNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_markdown_service_proto_msgTypes[18] + mi := &file_api_v1_markdown_service_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1550,7 +1618,7 @@ func (x *MathBlockNode) ProtoReflect() protoreflect.Message { // Deprecated: Use MathBlockNode.ProtoReflect.Descriptor instead. func (*MathBlockNode) Descriptor() ([]byte, []int) { - return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{18} + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{19} } func (x *MathBlockNode) GetContent() string { @@ -1573,7 +1641,7 @@ type TableNode struct { func (x *TableNode) Reset() { *x = TableNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_markdown_service_proto_msgTypes[19] + mi := &file_api_v1_markdown_service_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1586,7 +1654,7 @@ func (x *TableNode) String() string { func (*TableNode) ProtoMessage() {} func (x *TableNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_markdown_service_proto_msgTypes[19] + mi := &file_api_v1_markdown_service_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1599,7 +1667,7 @@ func (x *TableNode) ProtoReflect() protoreflect.Message { // Deprecated: Use TableNode.ProtoReflect.Descriptor instead. func (*TableNode) Descriptor() ([]byte, []int) { - return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{19} + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{20} } func (x *TableNode) GetHeader() []*Node { @@ -1635,7 +1703,7 @@ type EmbeddedContentNode struct { func (x *EmbeddedContentNode) Reset() { *x = EmbeddedContentNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_markdown_service_proto_msgTypes[20] + mi := &file_api_v1_markdown_service_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1648,7 +1716,7 @@ func (x *EmbeddedContentNode) String() string { func (*EmbeddedContentNode) ProtoMessage() {} func (x *EmbeddedContentNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_markdown_service_proto_msgTypes[20] + mi := &file_api_v1_markdown_service_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1661,7 +1729,7 @@ func (x *EmbeddedContentNode) ProtoReflect() protoreflect.Message { // Deprecated: Use EmbeddedContentNode.ProtoReflect.Descriptor instead. func (*EmbeddedContentNode) Descriptor() ([]byte, []int) { - return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{20} + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{21} } func (x *EmbeddedContentNode) GetResourceName() string { @@ -1689,7 +1757,7 @@ type TextNode struct { func (x *TextNode) Reset() { *x = TextNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_markdown_service_proto_msgTypes[21] + mi := &file_api_v1_markdown_service_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1702,7 +1770,7 @@ func (x *TextNode) String() string { func (*TextNode) ProtoMessage() {} func (x *TextNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_markdown_service_proto_msgTypes[21] + mi := &file_api_v1_markdown_service_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1715,7 +1783,7 @@ func (x *TextNode) ProtoReflect() protoreflect.Message { // Deprecated: Use TextNode.ProtoReflect.Descriptor instead. func (*TextNode) Descriptor() ([]byte, []int) { - return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{21} + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{22} } func (x *TextNode) GetContent() string { @@ -1737,7 +1805,7 @@ type BoldNode struct { func (x *BoldNode) Reset() { *x = BoldNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_markdown_service_proto_msgTypes[22] + mi := &file_api_v1_markdown_service_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1750,7 +1818,7 @@ func (x *BoldNode) String() string { func (*BoldNode) ProtoMessage() {} func (x *BoldNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_markdown_service_proto_msgTypes[22] + mi := &file_api_v1_markdown_service_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1763,7 +1831,7 @@ func (x *BoldNode) ProtoReflect() protoreflect.Message { // Deprecated: Use BoldNode.ProtoReflect.Descriptor instead. func (*BoldNode) Descriptor() ([]byte, []int) { - return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{22} + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{23} } func (x *BoldNode) GetSymbol() string { @@ -1792,7 +1860,7 @@ type ItalicNode struct { func (x *ItalicNode) Reset() { *x = ItalicNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_markdown_service_proto_msgTypes[23] + mi := &file_api_v1_markdown_service_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1805,7 +1873,7 @@ func (x *ItalicNode) String() string { func (*ItalicNode) ProtoMessage() {} func (x *ItalicNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_markdown_service_proto_msgTypes[23] + mi := &file_api_v1_markdown_service_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1818,7 +1886,7 @@ func (x *ItalicNode) ProtoReflect() protoreflect.Message { // Deprecated: Use ItalicNode.ProtoReflect.Descriptor instead. func (*ItalicNode) Descriptor() ([]byte, []int) { - return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{23} + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{24} } func (x *ItalicNode) GetSymbol() string { @@ -1847,7 +1915,7 @@ type BoldItalicNode struct { func (x *BoldItalicNode) Reset() { *x = BoldItalicNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_markdown_service_proto_msgTypes[24] + mi := &file_api_v1_markdown_service_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1860,7 +1928,7 @@ func (x *BoldItalicNode) String() string { func (*BoldItalicNode) ProtoMessage() {} func (x *BoldItalicNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_markdown_service_proto_msgTypes[24] + mi := &file_api_v1_markdown_service_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1873,7 +1941,7 @@ func (x *BoldItalicNode) ProtoReflect() protoreflect.Message { // Deprecated: Use BoldItalicNode.ProtoReflect.Descriptor instead. func (*BoldItalicNode) Descriptor() ([]byte, []int) { - return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{24} + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{25} } func (x *BoldItalicNode) GetSymbol() string { @@ -1901,7 +1969,7 @@ type CodeNode struct { func (x *CodeNode) Reset() { *x = CodeNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_markdown_service_proto_msgTypes[25] + mi := &file_api_v1_markdown_service_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1914,7 +1982,7 @@ func (x *CodeNode) String() string { func (*CodeNode) ProtoMessage() {} func (x *CodeNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_markdown_service_proto_msgTypes[25] + mi := &file_api_v1_markdown_service_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1927,7 +1995,7 @@ func (x *CodeNode) ProtoReflect() protoreflect.Message { // Deprecated: Use CodeNode.ProtoReflect.Descriptor instead. func (*CodeNode) Descriptor() ([]byte, []int) { - return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{25} + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{26} } func (x *CodeNode) GetContent() string { @@ -1949,7 +2017,7 @@ type ImageNode struct { func (x *ImageNode) Reset() { *x = ImageNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_markdown_service_proto_msgTypes[26] + mi := &file_api_v1_markdown_service_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1962,7 +2030,7 @@ func (x *ImageNode) String() string { func (*ImageNode) ProtoMessage() {} func (x *ImageNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_markdown_service_proto_msgTypes[26] + mi := &file_api_v1_markdown_service_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1975,7 +2043,7 @@ func (x *ImageNode) ProtoReflect() protoreflect.Message { // Deprecated: Use ImageNode.ProtoReflect.Descriptor instead. func (*ImageNode) Descriptor() ([]byte, []int) { - return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{26} + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{27} } func (x *ImageNode) GetAltText() string { @@ -2004,7 +2072,7 @@ type LinkNode struct { func (x *LinkNode) Reset() { *x = LinkNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_markdown_service_proto_msgTypes[27] + mi := &file_api_v1_markdown_service_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2017,7 +2085,7 @@ func (x *LinkNode) String() string { func (*LinkNode) ProtoMessage() {} func (x *LinkNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_markdown_service_proto_msgTypes[27] + mi := &file_api_v1_markdown_service_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2030,7 +2098,7 @@ func (x *LinkNode) ProtoReflect() protoreflect.Message { // Deprecated: Use LinkNode.ProtoReflect.Descriptor instead. func (*LinkNode) Descriptor() ([]byte, []int) { - return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{27} + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{28} } func (x *LinkNode) GetText() string { @@ -2059,7 +2127,7 @@ type AutoLinkNode struct { func (x *AutoLinkNode) Reset() { *x = AutoLinkNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_markdown_service_proto_msgTypes[28] + mi := &file_api_v1_markdown_service_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2072,7 +2140,7 @@ func (x *AutoLinkNode) String() string { func (*AutoLinkNode) ProtoMessage() {} func (x *AutoLinkNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_markdown_service_proto_msgTypes[28] + mi := &file_api_v1_markdown_service_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2085,7 +2153,7 @@ func (x *AutoLinkNode) ProtoReflect() protoreflect.Message { // Deprecated: Use AutoLinkNode.ProtoReflect.Descriptor instead. func (*AutoLinkNode) Descriptor() ([]byte, []int) { - return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{28} + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{29} } func (x *AutoLinkNode) GetUrl() string { @@ -2113,7 +2181,7 @@ type TagNode struct { func (x *TagNode) Reset() { *x = TagNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_markdown_service_proto_msgTypes[29] + mi := &file_api_v1_markdown_service_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2126,7 +2194,7 @@ func (x *TagNode) String() string { func (*TagNode) ProtoMessage() {} func (x *TagNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_markdown_service_proto_msgTypes[29] + mi := &file_api_v1_markdown_service_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2139,7 +2207,7 @@ func (x *TagNode) ProtoReflect() protoreflect.Message { // Deprecated: Use TagNode.ProtoReflect.Descriptor instead. func (*TagNode) Descriptor() ([]byte, []int) { - return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{29} + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{30} } func (x *TagNode) GetContent() string { @@ -2160,7 +2228,7 @@ type StrikethroughNode struct { func (x *StrikethroughNode) Reset() { *x = StrikethroughNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_markdown_service_proto_msgTypes[30] + mi := &file_api_v1_markdown_service_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2173,7 +2241,7 @@ func (x *StrikethroughNode) String() string { func (*StrikethroughNode) ProtoMessage() {} func (x *StrikethroughNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_markdown_service_proto_msgTypes[30] + mi := &file_api_v1_markdown_service_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2186,7 +2254,7 @@ func (x *StrikethroughNode) ProtoReflect() protoreflect.Message { // Deprecated: Use StrikethroughNode.ProtoReflect.Descriptor instead. func (*StrikethroughNode) Descriptor() ([]byte, []int) { - return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{30} + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{31} } func (x *StrikethroughNode) GetContent() string { @@ -2207,7 +2275,7 @@ type EscapingCharacterNode struct { func (x *EscapingCharacterNode) Reset() { *x = EscapingCharacterNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_markdown_service_proto_msgTypes[31] + mi := &file_api_v1_markdown_service_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2220,7 +2288,7 @@ func (x *EscapingCharacterNode) String() string { func (*EscapingCharacterNode) ProtoMessage() {} func (x *EscapingCharacterNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_markdown_service_proto_msgTypes[31] + mi := &file_api_v1_markdown_service_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2233,7 +2301,7 @@ func (x *EscapingCharacterNode) ProtoReflect() protoreflect.Message { // Deprecated: Use EscapingCharacterNode.ProtoReflect.Descriptor instead. func (*EscapingCharacterNode) Descriptor() ([]byte, []int) { - return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{31} + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{32} } func (x *EscapingCharacterNode) GetSymbol() string { @@ -2254,7 +2322,7 @@ type MathNode struct { func (x *MathNode) Reset() { *x = MathNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_markdown_service_proto_msgTypes[32] + mi := &file_api_v1_markdown_service_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2267,7 +2335,7 @@ func (x *MathNode) String() string { func (*MathNode) ProtoMessage() {} func (x *MathNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_markdown_service_proto_msgTypes[32] + mi := &file_api_v1_markdown_service_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2280,7 +2348,7 @@ func (x *MathNode) ProtoReflect() protoreflect.Message { // Deprecated: Use MathNode.ProtoReflect.Descriptor instead. func (*MathNode) Descriptor() ([]byte, []int) { - return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{32} + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{33} } func (x *MathNode) GetContent() string { @@ -2301,7 +2369,7 @@ type HighlightNode struct { func (x *HighlightNode) Reset() { *x = HighlightNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_markdown_service_proto_msgTypes[33] + mi := &file_api_v1_markdown_service_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2314,7 +2382,7 @@ func (x *HighlightNode) String() string { func (*HighlightNode) ProtoMessage() {} func (x *HighlightNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_markdown_service_proto_msgTypes[33] + mi := &file_api_v1_markdown_service_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2327,7 +2395,7 @@ func (x *HighlightNode) ProtoReflect() protoreflect.Message { // Deprecated: Use HighlightNode.ProtoReflect.Descriptor instead. func (*HighlightNode) Descriptor() ([]byte, []int) { - return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{33} + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{34} } func (x *HighlightNode) GetContent() string { @@ -2348,7 +2416,7 @@ type SubscriptNode struct { func (x *SubscriptNode) Reset() { *x = SubscriptNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_markdown_service_proto_msgTypes[34] + mi := &file_api_v1_markdown_service_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2361,7 +2429,7 @@ func (x *SubscriptNode) String() string { func (*SubscriptNode) ProtoMessage() {} func (x *SubscriptNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_markdown_service_proto_msgTypes[34] + mi := &file_api_v1_markdown_service_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2374,7 +2442,7 @@ func (x *SubscriptNode) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptNode.ProtoReflect.Descriptor instead. func (*SubscriptNode) Descriptor() ([]byte, []int) { - return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{34} + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{35} } func (x *SubscriptNode) GetContent() string { @@ -2395,7 +2463,7 @@ type SuperscriptNode struct { func (x *SuperscriptNode) Reset() { *x = SuperscriptNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_markdown_service_proto_msgTypes[35] + mi := &file_api_v1_markdown_service_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2408,7 +2476,7 @@ func (x *SuperscriptNode) String() string { func (*SuperscriptNode) ProtoMessage() {} func (x *SuperscriptNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_markdown_service_proto_msgTypes[35] + mi := &file_api_v1_markdown_service_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2421,7 +2489,7 @@ func (x *SuperscriptNode) ProtoReflect() protoreflect.Message { // Deprecated: Use SuperscriptNode.ProtoReflect.Descriptor instead. func (*SuperscriptNode) Descriptor() ([]byte, []int) { - return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{35} + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{36} } func (x *SuperscriptNode) GetContent() string { @@ -2443,7 +2511,7 @@ type ReferencedContentNode struct { func (x *ReferencedContentNode) Reset() { *x = ReferencedContentNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_markdown_service_proto_msgTypes[36] + mi := &file_api_v1_markdown_service_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2456,7 +2524,7 @@ func (x *ReferencedContentNode) String() string { func (*ReferencedContentNode) ProtoMessage() {} func (x *ReferencedContentNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_markdown_service_proto_msgTypes[36] + mi := &file_api_v1_markdown_service_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2469,7 +2537,7 @@ func (x *ReferencedContentNode) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferencedContentNode.ProtoReflect.Descriptor instead. func (*ReferencedContentNode) Descriptor() ([]byte, []int) { - return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{36} + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{37} } func (x *ReferencedContentNode) GetResourceName() string { @@ -2497,7 +2565,7 @@ type SpoilerNode struct { func (x *SpoilerNode) Reset() { *x = SpoilerNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_markdown_service_proto_msgTypes[37] + mi := &file_api_v1_markdown_service_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2510,7 +2578,7 @@ func (x *SpoilerNode) String() string { func (*SpoilerNode) ProtoMessage() {} func (x *SpoilerNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_markdown_service_proto_msgTypes[37] + mi := &file_api_v1_markdown_service_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2523,7 +2591,7 @@ func (x *SpoilerNode) ProtoReflect() protoreflect.Message { // Deprecated: Use SpoilerNode.ProtoReflect.Descriptor instead. func (*SpoilerNode) Descriptor() ([]byte, []int) { - return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{37} + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{38} } func (x *SpoilerNode) GetContent() string { @@ -2545,7 +2613,7 @@ type HTMLElementNode struct { func (x *HTMLElementNode) Reset() { *x = HTMLElementNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_markdown_service_proto_msgTypes[38] + mi := &file_api_v1_markdown_service_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2558,7 +2626,7 @@ func (x *HTMLElementNode) String() string { func (*HTMLElementNode) ProtoMessage() {} func (x *HTMLElementNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_markdown_service_proto_msgTypes[38] + mi := &file_api_v1_markdown_service_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2571,7 +2639,7 @@ func (x *HTMLElementNode) ProtoReflect() protoreflect.Message { // Deprecated: Use HTMLElementNode.ProtoReflect.Descriptor instead. func (*HTMLElementNode) Descriptor() ([]byte, []int) { - return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{38} + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{39} } func (x *HTMLElementNode) GetTagName() string { @@ -2599,7 +2667,7 @@ type TableNode_Row struct { func (x *TableNode_Row) Reset() { *x = TableNode_Row{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_markdown_service_proto_msgTypes[39] + mi := &file_api_v1_markdown_service_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2612,7 +2680,7 @@ func (x *TableNode_Row) String() string { func (*TableNode_Row) ProtoMessage() {} func (x *TableNode_Row) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_markdown_service_proto_msgTypes[39] + mi := &file_api_v1_markdown_service_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2625,7 +2693,7 @@ func (x *TableNode_Row) ProtoReflect() protoreflect.Message { // Deprecated: Use TableNode_Row.ProtoReflect.Descriptor instead. func (*TableNode_Row) Descriptor() ([]byte, []int) { - return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{19, 0} + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{20, 0} } func (x *TableNode_Row) GetCells() []*Node { @@ -2676,353 +2744,365 @@ var file_api_v1_markdown_service_proto_rawDesc = []byte{ 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x22, - 0xec, 0x10, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0xca, 0x11, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x45, 0x0a, 0x0f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x62, 0x72, 0x65, - 0x61, 0x6b, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x61, 0x6b, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x6c, 0x69, 0x6e, 0x65, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x44, 0x0a, 0x0e, 0x70, - 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, + 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x45, 0x0a, 0x0f, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x65, 0x6d, + 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x63, 0x6f, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x3e, 0x0a, 0x0c, 0x68, 0x65, 0x61, 0x64, - 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x54, 0x0a, 0x14, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x12, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x6e, 0x6f, 0x64, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, + 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x71, 0x75, - 0x6f, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x4b, 0x0a, 0x11, 0x6f, 0x72, 0x64, 0x65, 0x72, - 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, - 0x65, 0x48, 0x00, 0x52, 0x0f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, - 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x51, 0x0a, 0x13, 0x75, 0x6e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, - 0x64, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x55, 0x6e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, - 0x64, 0x65, 0x48, 0x00, 0x52, 0x11, 0x75, 0x6e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x4c, - 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x42, 0x0a, 0x0e, 0x74, 0x61, 0x73, 0x6b, 0x5f, - 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x61, 0x73, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x74, - 0x61, 0x73, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x45, 0x0a, 0x0f, 0x6d, - 0x61, 0x74, 0x68, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x74, 0x68, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x64, - 0x65, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x61, 0x74, 0x68, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, - 0x64, 0x65, 0x12, 0x38, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x48, - 0x00, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, 0x15, - 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x65, - 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x62, 0x65, 0x64, - 0x64, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, - 0x52, 0x13, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x6e, 0x6f, - 0x64, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x48, 0x00, 0x52, 0x08, 0x74, 0x65, 0x78, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x35, 0x0a, 0x09, - 0x62, 0x6f, 0x6c, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, - 0x6f, 0x6c, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x08, 0x62, 0x6f, 0x6c, 0x64, 0x4e, - 0x6f, 0x64, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x5f, 0x6e, 0x6f, - 0x64, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x4e, 0x6f, - 0x64, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, - 0x12, 0x48, 0x0a, 0x10, 0x62, 0x6f, 0x6c, 0x64, 0x5f, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x5f, - 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x65, 0x6d, - 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6c, 0x64, 0x49, 0x74, - 0x61, 0x6c, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x62, 0x6f, 0x6c, 0x64, - 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x63, 0x6f, - 0x64, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x64, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6f, 0x64, 0x65, 0x4e, 0x6f, 0x64, - 0x65, 0x12, 0x38, 0x0a, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, - 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, - 0x52, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x6c, - 0x69, 0x6e, 0x6b, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x6e, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x08, 0x6c, 0x69, 0x6e, 0x6b, 0x4e, 0x6f, - 0x64, 0x65, 0x12, 0x42, 0x0a, 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, - 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x65, 0x6d, - 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x4c, 0x69, - 0x6e, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x75, 0x74, 0x6f, 0x4c, 0x69, - 0x6e, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x74, 0x61, 0x67, 0x5f, 0x6e, 0x6f, - 0x64, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x67, 0x4e, 0x6f, 0x64, 0x65, 0x48, - 0x00, 0x52, 0x07, 0x74, 0x61, 0x67, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x50, 0x0a, 0x12, 0x73, 0x74, - 0x72, 0x69, 0x6b, 0x65, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65, - 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6b, 0x65, 0x74, 0x68, 0x72, 0x6f, - 0x75, 0x67, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x11, 0x73, 0x74, 0x72, 0x69, 0x6b, - 0x65, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x5d, 0x0a, 0x17, - 0x65, 0x73, 0x63, 0x61, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, - 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x73, 0x63, - 0x61, 0x70, 0x69, 0x6e, 0x67, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x4e, 0x6f, - 0x64, 0x65, 0x48, 0x00, 0x52, 0x15, 0x65, 0x73, 0x63, 0x61, 0x70, 0x69, 0x6e, 0x67, 0x43, 0x68, - 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x6d, - 0x61, 0x74, 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, - 0x74, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x61, 0x74, 0x68, 0x4e, 0x6f, - 0x64, 0x65, 0x12, 0x44, 0x0a, 0x0e, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, - 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x65, 0x6d, - 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, - 0x67, 0x68, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x68, 0x69, 0x67, 0x68, 0x6c, - 0x69, 0x67, 0x68, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x44, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, - 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x4a, - 0x0a, 0x10, 0x73, 0x75, 0x70, 0x65, 0x72, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6e, 0x6f, - 0x64, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x70, 0x65, 0x72, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x75, 0x70, 0x65, 0x72, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x5d, 0x0a, 0x17, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x65, - 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x48, 0x00, 0x52, 0x15, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x3e, 0x0a, 0x0c, 0x73, 0x70, 0x6f, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x70, 0x6f, 0x69, 0x6c, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x70, - 0x6f, 0x69, 0x6c, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x4b, 0x0a, 0x11, 0x68, 0x74, 0x6d, - 0x6c, 0x5f, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x1f, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x54, 0x4d, 0x4c, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4e, - 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x68, 0x74, 0x6d, 0x6c, 0x45, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x22, 0x0f, - 0x0a, 0x0d, 0x4c, 0x69, 0x6e, 0x65, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x22, - 0x3f, 0x0a, 0x0d, 0x50, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, - 0x12, 0x2e, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, - 0x22, 0x45, 0x0a, 0x0d, 0x43, 0x6f, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x64, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x53, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x69, - 0x6e, 0x67, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x2e, 0x0a, 0x08, - 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x2c, 0x0a, 0x12, - 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x4e, 0x6f, - 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x22, 0x40, 0x0a, 0x0e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x08, - 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x71, 0x0a, 0x0f, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6e, 0x64, 0x65, 0x6e, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x12, - 0x2e, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, - 0x73, 0x0a, 0x11, 0x55, 0x6e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, - 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x16, 0x0a, 0x06, - 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x69, 0x6e, - 0x64, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, - 0x64, 0x72, 0x65, 0x6e, 0x22, 0x8a, 0x01, 0x0a, 0x0c, 0x54, 0x61, 0x73, 0x6b, 0x4c, 0x69, 0x73, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x16, 0x0a, - 0x06, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x69, - 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, - 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, - 0x6e, 0x22, 0x29, 0x0a, 0x0d, 0x4d, 0x61, 0x74, 0x68, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, - 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xb7, 0x01, 0x0a, - 0x09, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x68, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, - 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x06, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x6f, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x5f, + 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x6d, + 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x48, 0x00, 0x52, 0x08, 0x6c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x58, + 0x0a, 0x16, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x69, + 0x74, 0x65, 0x6d, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, + 0x64, 0x65, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x4e, 0x6f, 0x64, + 0x65, 0x48, 0x00, 0x52, 0x13, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, + 0x49, 0x74, 0x65, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x5e, 0x0a, 0x18, 0x75, 0x6e, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, + 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x65, 0x6d, + 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x48, + 0x00, 0x52, 0x15, 0x75, 0x6e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, + 0x49, 0x74, 0x65, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x4f, 0x0a, 0x13, 0x74, 0x61, 0x73, 0x6b, + 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, + 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x74, 0x65, + 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x10, 0x74, 0x61, 0x73, 0x6b, 0x4c, 0x69, 0x73, + 0x74, 0x49, 0x74, 0x65, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x45, 0x0a, 0x0f, 0x6d, 0x61, 0x74, + 0x68, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x52, - 0x04, 0x72, 0x6f, 0x77, 0x73, 0x1a, 0x2f, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x28, 0x0a, 0x05, - 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, - 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, - 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x52, 0x0a, 0x13, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, - 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, - 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x24, 0x0a, 0x08, 0x54, 0x65, - 0x78, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x22, 0x52, 0x0a, 0x08, 0x42, 0x6f, 0x6c, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, - 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x2e, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, - 0x64, 0x72, 0x65, 0x6e, 0x22, 0x3e, 0x0a, 0x0a, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x4e, 0x6f, - 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x22, 0x42, 0x0a, 0x0e, 0x42, 0x6f, 0x6c, 0x64, 0x49, 0x74, 0x61, 0x6c, - 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x18, - 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x24, 0x0a, 0x08, 0x43, 0x6f, 0x64, 0x65, - 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x38, - 0x0a, 0x09, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, - 0x6c, 0x74, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x6c, 0x74, 0x54, 0x65, 0x78, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x30, 0x0a, 0x08, 0x4c, 0x69, 0x6e, 0x6b, - 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x40, 0x0a, 0x0c, 0x41, 0x75, - 0x74, 0x6f, 0x4c, 0x69, 0x6e, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1e, 0x0a, 0x0b, - 0x69, 0x73, 0x5f, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x69, 0x73, 0x52, 0x61, 0x77, 0x54, 0x65, 0x78, 0x74, 0x22, 0x23, 0x0a, 0x07, - 0x54, 0x61, 0x67, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x22, 0x2d, 0x0a, 0x11, 0x53, 0x74, 0x72, 0x69, 0x6b, 0x65, 0x74, 0x68, 0x72, 0x6f, 0x75, - 0x67, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x22, 0x2f, 0x0a, 0x15, 0x45, 0x73, 0x63, 0x61, 0x70, 0x69, 0x6e, 0x67, 0x43, 0x68, 0x61, 0x72, - 0x61, 0x63, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, - 0x62, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, - 0x6c, 0x22, 0x24, 0x0a, 0x08, 0x4d, 0x61, 0x74, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x0d, 0x48, 0x69, 0x67, 0x68, 0x6c, - 0x69, 0x67, 0x68, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x31, 0x2e, 0x4d, 0x61, 0x74, 0x68, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x48, + 0x00, 0x52, 0x0d, 0x6d, 0x61, 0x74, 0x68, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x64, 0x65, + 0x12, 0x38, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x16, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, + 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, 0x15, 0x65, 0x6d, + 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, + 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, + 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x13, + 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, + 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, + 0x52, 0x08, 0x74, 0x65, 0x78, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x62, 0x6f, + 0x6c, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6c, + 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x08, 0x62, 0x6f, 0x6c, 0x64, 0x4e, 0x6f, 0x64, + 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x5f, 0x6e, 0x6f, 0x64, 0x65, + 0x18, 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, + 0x48, 0x00, 0x52, 0x0a, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x48, + 0x0a, 0x10, 0x62, 0x6f, 0x6c, 0x64, 0x5f, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6c, 0x64, 0x49, 0x74, 0x61, 0x6c, + 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x62, 0x6f, 0x6c, 0x64, 0x49, 0x74, + 0x61, 0x6c, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x63, 0x6f, 0x64, 0x65, + 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x37, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, + 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6f, 0x64, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, + 0x38, 0x0a, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x38, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x09, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x6c, 0x69, 0x6e, + 0x6b, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x39, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, + 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, + 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x08, 0x6c, 0x69, 0x6e, 0x6b, 0x4e, 0x6f, 0x64, 0x65, + 0x12, 0x42, 0x0a, 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x4c, 0x69, 0x6e, 0x6b, + 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x75, 0x74, 0x6f, 0x4c, 0x69, 0x6e, 0x6b, + 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x74, 0x61, 0x67, 0x5f, 0x6e, 0x6f, 0x64, 0x65, + 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x67, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, + 0x07, 0x74, 0x61, 0x67, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x50, 0x0a, 0x12, 0x73, 0x74, 0x72, 0x69, + 0x6b, 0x65, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x3c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6b, 0x65, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, + 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x11, 0x73, 0x74, 0x72, 0x69, 0x6b, 0x65, 0x74, + 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x5d, 0x0a, 0x17, 0x65, 0x73, + 0x63, 0x61, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, + 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x65, + 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x73, 0x63, 0x61, 0x70, + 0x69, 0x6e, 0x67, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, + 0x48, 0x00, 0x52, 0x15, 0x65, 0x73, 0x63, 0x61, 0x70, 0x69, 0x6e, 0x67, 0x43, 0x68, 0x61, 0x72, + 0x61, 0x63, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x6d, 0x61, 0x74, + 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, + 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x74, 0x68, + 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x61, 0x74, 0x68, 0x4e, 0x6f, 0x64, 0x65, + 0x12, 0x44, 0x0a, 0x0e, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, + 0x68, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x44, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x73, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x4a, 0x0a, 0x10, + 0x73, 0x75, 0x70, 0x65, 0x72, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, + 0x18, 0x41, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x70, 0x65, 0x72, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x5d, 0x0a, 0x17, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x18, 0x42, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, + 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, + 0x52, 0x15, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x3e, 0x0a, 0x0c, 0x73, 0x70, 0x6f, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x43, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x6f, + 0x69, 0x6c, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x70, 0x6f, 0x69, + 0x6c, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x4b, 0x0a, 0x11, 0x68, 0x74, 0x6d, 0x6c, 0x5f, + 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x44, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x48, 0x54, 0x4d, 0x4c, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x48, 0x00, 0x52, 0x0f, 0x68, 0x74, 0x6d, 0x6c, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x22, 0x0f, 0x0a, 0x0d, + 0x4c, 0x69, 0x6e, 0x65, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x3f, 0x0a, + 0x0d, 0x50, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x2e, + 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x45, + 0x0a, 0x0d, 0x43, 0x6f, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x53, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, + 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x2e, 0x0a, 0x08, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, + 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x2c, 0x0a, 0x12, 0x48, 0x6f, + 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x22, 0x40, 0x0a, 0x0e, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, + 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x3a, 0x0a, 0x08, 0x4c, 0x69, + 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x75, 0x0a, 0x13, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x65, + 0x64, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, + 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, + 0x6f, 0x64, 0x65, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x77, 0x0a, + 0x15, 0x55, 0x6e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x74, + 0x65, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x16, + 0x0a, 0x06, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, + 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, + 0x65, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x8e, 0x01, 0x0a, 0x10, 0x54, 0x61, 0x73, 0x6b, 0x4c, + 0x69, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, + 0x62, 0x6f, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x06, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, + 0x72, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, + 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x63, + 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x29, 0x0a, 0x0d, 0x4d, 0x61, 0x74, 0x68, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4e, - 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x2b, 0x0a, - 0x0f, 0x53, 0x75, 0x70, 0x65, 0x72, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x54, 0x0a, 0x15, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4e, + 0x6e, 0x74, 0x22, 0xb7, 0x01, 0x0a, 0x09, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x12, 0x2a, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, + 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x04, 0x72, 0x6f, + 0x77, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x1a, 0x2f, 0x0a, 0x03, 0x52, + 0x6f, 0x77, 0x12, 0x28, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x52, 0x0a, 0x13, + 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x22, 0x27, 0x0a, 0x0b, 0x53, 0x70, 0x6f, 0x69, 0x6c, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xba, 0x01, 0x0a, 0x0f, 0x48, 0x54, - 0x4d, 0x4c, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x19, 0x0a, - 0x08, 0x74, 0x61, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x74, 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6d, - 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x54, 0x4d, 0x4c, - 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x41, 0x74, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x74, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x41, 0x74, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0xea, 0x03, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4c, 0x49, 0x4e, - 0x45, 0x5f, 0x42, 0x52, 0x45, 0x41, 0x4b, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x41, 0x52, - 0x41, 0x47, 0x52, 0x41, 0x50, 0x48, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x44, 0x45, - 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x48, 0x45, 0x41, 0x44, - 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x4f, 0x4e, - 0x54, 0x41, 0x4c, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x10, 0x05, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x4c, - 0x4f, 0x43, 0x4b, 0x51, 0x55, 0x4f, 0x54, 0x45, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x52, - 0x44, 0x45, 0x52, 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, 0x12, 0x0a, 0x0e, - 0x55, 0x4e, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x08, - 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x09, 0x12, - 0x0e, 0x0a, 0x0a, 0x4d, 0x41, 0x54, 0x48, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x0a, 0x12, - 0x09, 0x0a, 0x05, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0b, 0x12, 0x14, 0x0a, 0x10, 0x45, 0x4d, - 0x42, 0x45, 0x44, 0x44, 0x45, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54, 0x10, 0x0c, - 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x0d, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4f, - 0x4c, 0x44, 0x10, 0x0e, 0x12, 0x0a, 0x0a, 0x06, 0x49, 0x54, 0x41, 0x4c, 0x49, 0x43, 0x10, 0x0f, - 0x12, 0x0f, 0x0a, 0x0b, 0x42, 0x4f, 0x4c, 0x44, 0x5f, 0x49, 0x54, 0x41, 0x4c, 0x49, 0x43, 0x10, - 0x10, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x11, 0x12, 0x09, 0x0a, 0x05, 0x49, - 0x4d, 0x41, 0x47, 0x45, 0x10, 0x12, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4e, 0x4b, 0x10, 0x13, - 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0x10, 0x14, 0x12, - 0x07, 0x0a, 0x03, 0x54, 0x41, 0x47, 0x10, 0x15, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x52, 0x49, - 0x4b, 0x45, 0x54, 0x48, 0x52, 0x4f, 0x55, 0x47, 0x48, 0x10, 0x16, 0x12, 0x16, 0x0a, 0x12, 0x45, - 0x53, 0x43, 0x41, 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x48, 0x41, 0x52, 0x41, 0x43, 0x54, 0x45, - 0x52, 0x10, 0x17, 0x12, 0x08, 0x0a, 0x04, 0x4d, 0x41, 0x54, 0x48, 0x10, 0x18, 0x12, 0x0d, 0x0a, - 0x09, 0x48, 0x49, 0x47, 0x48, 0x4c, 0x49, 0x47, 0x48, 0x54, 0x10, 0x19, 0x12, 0x0d, 0x0a, 0x09, - 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x10, 0x1a, 0x12, 0x0f, 0x0a, 0x0b, 0x53, - 0x55, 0x50, 0x45, 0x52, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x10, 0x1b, 0x12, 0x16, 0x0a, 0x12, - 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x45, - 0x4e, 0x54, 0x10, 0x1c, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x50, 0x4f, 0x49, 0x4c, 0x45, 0x52, 0x10, - 0x1d, 0x12, 0x10, 0x0a, 0x0c, 0x48, 0x54, 0x4d, 0x4c, 0x5f, 0x45, 0x4c, 0x45, 0x4d, 0x45, 0x4e, - 0x54, 0x10, 0x1e, 0x32, 0xc7, 0x04, 0x0a, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x7b, 0x0a, 0x0d, 0x50, 0x61, 0x72, 0x73, 0x65, - 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x22, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x4d, 0x61, 0x72, - 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, - 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x73, - 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x3a, 0x70, - 0x61, 0x72, 0x73, 0x65, 0x12, 0x97, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x29, 0x2e, - 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x6f, 0x64, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4d, - 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, - 0x1d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, - 0x6e, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x3a, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x9f, - 0x01, 0x0a, 0x16, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x4d, 0x61, 0x72, 0x6b, - 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, - 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, - 0x66, 0x79, 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x4d, - 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, 0x2a, 0x22, - 0x1f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, - 0x6e, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x3a, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, - 0x12, 0x7b, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x12, 0x24, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, - 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x2f, - 0x6c, 0x69, 0x6e, 0x6b, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0xac, 0x01, - 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x42, 0x14, 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x75, 0x73, 0x65, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2f, - 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4d, - 0x41, 0x58, 0xaa, 0x02, 0x0c, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x56, - 0x31, 0xca, 0x02, 0x0c, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, - 0xe2, 0x02, 0x18, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, - 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x4d, 0x65, - 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x22, 0x24, 0x0a, 0x08, 0x54, 0x65, 0x78, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x52, 0x0a, 0x08, 0x42, 0x6f, 0x6c, 0x64, 0x4e, 0x6f, + 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x2e, 0x0a, 0x08, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, + 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x3e, 0x0a, 0x0a, 0x49, 0x74, + 0x61, 0x6c, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, + 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, + 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x42, 0x0a, 0x0e, 0x42, 0x6f, + 0x6c, 0x64, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, + 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x24, + 0x0a, 0x08, 0x43, 0x6f, 0x64, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x38, 0x0a, 0x09, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x6c, 0x74, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x6c, 0x74, 0x54, 0x65, 0x78, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x30, + 0x0a, 0x08, 0x4c, 0x69, 0x6e, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, + 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x10, + 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, + 0x22, 0x40, 0x0a, 0x0c, 0x41, 0x75, 0x74, 0x6f, 0x4c, 0x69, 0x6e, 0x6b, 0x4e, 0x6f, 0x64, 0x65, + 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, + 0x72, 0x6c, 0x12, 0x1e, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x65, 0x78, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x52, 0x61, 0x77, 0x54, 0x65, + 0x78, 0x74, 0x22, 0x23, 0x0a, 0x07, 0x54, 0x61, 0x67, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x11, 0x53, 0x74, 0x72, 0x69, 0x6b, + 0x65, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x2f, 0x0a, 0x15, 0x45, 0x73, 0x63, 0x61, 0x70, 0x69, + 0x6e, 0x67, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x22, 0x24, 0x0a, 0x08, 0x4d, 0x61, 0x74, 0x68, 0x4e, + 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, + 0x0d, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x2b, 0x0a, 0x0f, 0x53, 0x75, 0x70, 0x65, 0x72, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x54, 0x0a, 0x15, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x27, 0x0a, 0x0b, 0x53, 0x70, 0x6f, 0x69, 0x6c, 0x65, + 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0xba, 0x01, 0x0a, 0x0f, 0x48, 0x54, 0x4d, 0x4c, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x61, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4d, + 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x48, 0x54, 0x4d, 0x4c, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x1a, 0x3d, 0x0a, + 0x0f, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x83, 0x04, 0x0a, + 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x4e, 0x4f, 0x44, + 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x0e, 0x0a, 0x0a, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x42, 0x52, 0x45, 0x41, 0x4b, 0x10, 0x01, 0x12, + 0x0d, 0x0a, 0x09, 0x50, 0x41, 0x52, 0x41, 0x47, 0x52, 0x41, 0x50, 0x48, 0x10, 0x02, 0x12, 0x0e, + 0x0a, 0x0a, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x03, 0x12, 0x0b, + 0x0a, 0x07, 0x48, 0x45, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x48, + 0x4f, 0x52, 0x49, 0x5a, 0x4f, 0x4e, 0x54, 0x41, 0x4c, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x10, 0x05, + 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x51, 0x55, 0x4f, 0x54, 0x45, 0x10, 0x06, + 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x52, + 0x44, 0x45, 0x52, 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x49, 0x54, 0x45, 0x4d, 0x10, + 0x08, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x4e, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x45, 0x44, 0x5f, 0x4c, + 0x49, 0x53, 0x54, 0x5f, 0x49, 0x54, 0x45, 0x4d, 0x10, 0x09, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x41, + 0x53, 0x4b, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x49, 0x54, 0x45, 0x4d, 0x10, 0x0a, 0x12, 0x0e, + 0x0a, 0x0a, 0x4d, 0x41, 0x54, 0x48, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x0b, 0x12, 0x09, + 0x0a, 0x05, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0c, 0x12, 0x14, 0x0a, 0x10, 0x45, 0x4d, 0x42, + 0x45, 0x44, 0x44, 0x45, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54, 0x10, 0x0d, 0x12, + 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x33, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4f, 0x4c, + 0x44, 0x10, 0x34, 0x12, 0x0a, 0x0a, 0x06, 0x49, 0x54, 0x41, 0x4c, 0x49, 0x43, 0x10, 0x35, 0x12, + 0x0f, 0x0a, 0x0b, 0x42, 0x4f, 0x4c, 0x44, 0x5f, 0x49, 0x54, 0x41, 0x4c, 0x49, 0x43, 0x10, 0x36, + 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x37, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x4d, + 0x41, 0x47, 0x45, 0x10, 0x38, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4e, 0x4b, 0x10, 0x39, 0x12, + 0x0d, 0x0a, 0x09, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0x10, 0x3a, 0x12, 0x07, + 0x0a, 0x03, 0x54, 0x41, 0x47, 0x10, 0x3b, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x52, 0x49, 0x4b, + 0x45, 0x54, 0x48, 0x52, 0x4f, 0x55, 0x47, 0x48, 0x10, 0x3c, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x53, + 0x43, 0x41, 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x48, 0x41, 0x52, 0x41, 0x43, 0x54, 0x45, 0x52, + 0x10, 0x3d, 0x12, 0x08, 0x0a, 0x04, 0x4d, 0x41, 0x54, 0x48, 0x10, 0x3e, 0x12, 0x0d, 0x0a, 0x09, + 0x48, 0x49, 0x47, 0x48, 0x4c, 0x49, 0x47, 0x48, 0x54, 0x10, 0x3f, 0x12, 0x0d, 0x0a, 0x09, 0x53, + 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x10, 0x40, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x55, + 0x50, 0x45, 0x52, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x10, 0x41, 0x12, 0x16, 0x0a, 0x12, 0x52, + 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x4e, + 0x54, 0x10, 0x42, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x50, 0x4f, 0x49, 0x4c, 0x45, 0x52, 0x10, 0x43, + 0x12, 0x10, 0x0a, 0x0c, 0x48, 0x54, 0x4d, 0x4c, 0x5f, 0x45, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, + 0x10, 0x44, 0x32, 0xc7, 0x04, 0x0a, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x7b, 0x0a, 0x0d, 0x50, 0x61, 0x72, 0x73, 0x65, 0x4d, + 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x22, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x4d, 0x61, 0x72, 0x6b, + 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x65, + 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x73, 0x65, + 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x3a, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x12, 0x97, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4d, + 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x6d, + 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4d, 0x61, + 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, 0x1d, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, + 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x3a, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x9f, 0x01, + 0x0a, 0x16, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x4d, 0x61, 0x72, 0x6b, 0x64, + 0x6f, 0x77, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, + 0x79, 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x4d, 0x61, + 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, 0x2a, 0x22, 0x1f, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, + 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x3a, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x12, + 0x7b, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x24, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x2f, 0x6c, + 0x69, 0x6e, 0x6b, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0xac, 0x01, 0x0a, + 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x42, 0x14, 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x75, 0x73, 0x65, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2f, 0x6d, + 0x65, 0x6d, 0x6f, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4d, 0x41, + 0x58, 0xaa, 0x02, 0x0c, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, + 0xca, 0x02, 0x0c, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, + 0x02, 0x18, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, + 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x4d, 0x65, 0x6d, + 0x6f, 0x73, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -3038,7 +3118,7 @@ func file_api_v1_markdown_service_proto_rawDescGZIP() []byte { } var file_api_v1_markdown_service_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_api_v1_markdown_service_proto_msgTypes = make([]protoimpl.MessageInfo, 41) +var file_api_v1_markdown_service_proto_msgTypes = make([]protoimpl.MessageInfo, 42) var file_api_v1_markdown_service_proto_goTypes = []any{ (NodeType)(0), // 0: memos.api.v1.NodeType (*ParseMarkdownRequest)(nil), // 1: memos.api.v1.ParseMarkdownRequest @@ -3056,32 +3136,33 @@ var file_api_v1_markdown_service_proto_goTypes = []any{ (*HeadingNode)(nil), // 13: memos.api.v1.HeadingNode (*HorizontalRuleNode)(nil), // 14: memos.api.v1.HorizontalRuleNode (*BlockquoteNode)(nil), // 15: memos.api.v1.BlockquoteNode - (*OrderedListNode)(nil), // 16: memos.api.v1.OrderedListNode - (*UnorderedListNode)(nil), // 17: memos.api.v1.UnorderedListNode - (*TaskListNode)(nil), // 18: memos.api.v1.TaskListNode - (*MathBlockNode)(nil), // 19: memos.api.v1.MathBlockNode - (*TableNode)(nil), // 20: memos.api.v1.TableNode - (*EmbeddedContentNode)(nil), // 21: memos.api.v1.EmbeddedContentNode - (*TextNode)(nil), // 22: memos.api.v1.TextNode - (*BoldNode)(nil), // 23: memos.api.v1.BoldNode - (*ItalicNode)(nil), // 24: memos.api.v1.ItalicNode - (*BoldItalicNode)(nil), // 25: memos.api.v1.BoldItalicNode - (*CodeNode)(nil), // 26: memos.api.v1.CodeNode - (*ImageNode)(nil), // 27: memos.api.v1.ImageNode - (*LinkNode)(nil), // 28: memos.api.v1.LinkNode - (*AutoLinkNode)(nil), // 29: memos.api.v1.AutoLinkNode - (*TagNode)(nil), // 30: memos.api.v1.TagNode - (*StrikethroughNode)(nil), // 31: memos.api.v1.StrikethroughNode - (*EscapingCharacterNode)(nil), // 32: memos.api.v1.EscapingCharacterNode - (*MathNode)(nil), // 33: memos.api.v1.MathNode - (*HighlightNode)(nil), // 34: memos.api.v1.HighlightNode - (*SubscriptNode)(nil), // 35: memos.api.v1.SubscriptNode - (*SuperscriptNode)(nil), // 36: memos.api.v1.SuperscriptNode - (*ReferencedContentNode)(nil), // 37: memos.api.v1.ReferencedContentNode - (*SpoilerNode)(nil), // 38: memos.api.v1.SpoilerNode - (*HTMLElementNode)(nil), // 39: memos.api.v1.HTMLElementNode - (*TableNode_Row)(nil), // 40: memos.api.v1.TableNode.Row - nil, // 41: memos.api.v1.HTMLElementNode.AttributesEntry + (*ListNode)(nil), // 16: memos.api.v1.ListNode + (*OrderedListItemNode)(nil), // 17: memos.api.v1.OrderedListItemNode + (*UnorderedListItemNode)(nil), // 18: memos.api.v1.UnorderedListItemNode + (*TaskListItemNode)(nil), // 19: memos.api.v1.TaskListItemNode + (*MathBlockNode)(nil), // 20: memos.api.v1.MathBlockNode + (*TableNode)(nil), // 21: memos.api.v1.TableNode + (*EmbeddedContentNode)(nil), // 22: memos.api.v1.EmbeddedContentNode + (*TextNode)(nil), // 23: memos.api.v1.TextNode + (*BoldNode)(nil), // 24: memos.api.v1.BoldNode + (*ItalicNode)(nil), // 25: memos.api.v1.ItalicNode + (*BoldItalicNode)(nil), // 26: memos.api.v1.BoldItalicNode + (*CodeNode)(nil), // 27: memos.api.v1.CodeNode + (*ImageNode)(nil), // 28: memos.api.v1.ImageNode + (*LinkNode)(nil), // 29: memos.api.v1.LinkNode + (*AutoLinkNode)(nil), // 30: memos.api.v1.AutoLinkNode + (*TagNode)(nil), // 31: memos.api.v1.TagNode + (*StrikethroughNode)(nil), // 32: memos.api.v1.StrikethroughNode + (*EscapingCharacterNode)(nil), // 33: memos.api.v1.EscapingCharacterNode + (*MathNode)(nil), // 34: memos.api.v1.MathNode + (*HighlightNode)(nil), // 35: memos.api.v1.HighlightNode + (*SubscriptNode)(nil), // 36: memos.api.v1.SubscriptNode + (*SuperscriptNode)(nil), // 37: memos.api.v1.SuperscriptNode + (*ReferencedContentNode)(nil), // 38: memos.api.v1.ReferencedContentNode + (*SpoilerNode)(nil), // 39: memos.api.v1.SpoilerNode + (*HTMLElementNode)(nil), // 40: memos.api.v1.HTMLElementNode + (*TableNode_Row)(nil), // 41: memos.api.v1.TableNode.Row + nil, // 42: memos.api.v1.HTMLElementNode.AttributesEntry } var file_api_v1_markdown_service_proto_depIdxs = []int32{ 9, // 0: memos.api.v1.ParseMarkdownResponse.nodes:type_name -> memos.api.v1.Node @@ -3094,54 +3175,56 @@ var file_api_v1_markdown_service_proto_depIdxs = []int32{ 13, // 7: memos.api.v1.Node.heading_node:type_name -> memos.api.v1.HeadingNode 14, // 8: memos.api.v1.Node.horizontal_rule_node:type_name -> memos.api.v1.HorizontalRuleNode 15, // 9: memos.api.v1.Node.blockquote_node:type_name -> memos.api.v1.BlockquoteNode - 16, // 10: memos.api.v1.Node.ordered_list_node:type_name -> memos.api.v1.OrderedListNode - 17, // 11: memos.api.v1.Node.unordered_list_node:type_name -> memos.api.v1.UnorderedListNode - 18, // 12: memos.api.v1.Node.task_list_node:type_name -> memos.api.v1.TaskListNode - 19, // 13: memos.api.v1.Node.math_block_node:type_name -> memos.api.v1.MathBlockNode - 20, // 14: memos.api.v1.Node.table_node:type_name -> memos.api.v1.TableNode - 21, // 15: memos.api.v1.Node.embedded_content_node:type_name -> memos.api.v1.EmbeddedContentNode - 22, // 16: memos.api.v1.Node.text_node:type_name -> memos.api.v1.TextNode - 23, // 17: memos.api.v1.Node.bold_node:type_name -> memos.api.v1.BoldNode - 24, // 18: memos.api.v1.Node.italic_node:type_name -> memos.api.v1.ItalicNode - 25, // 19: memos.api.v1.Node.bold_italic_node:type_name -> memos.api.v1.BoldItalicNode - 26, // 20: memos.api.v1.Node.code_node:type_name -> memos.api.v1.CodeNode - 27, // 21: memos.api.v1.Node.image_node:type_name -> memos.api.v1.ImageNode - 28, // 22: memos.api.v1.Node.link_node:type_name -> memos.api.v1.LinkNode - 29, // 23: memos.api.v1.Node.auto_link_node:type_name -> memos.api.v1.AutoLinkNode - 30, // 24: memos.api.v1.Node.tag_node:type_name -> memos.api.v1.TagNode - 31, // 25: memos.api.v1.Node.strikethrough_node:type_name -> memos.api.v1.StrikethroughNode - 32, // 26: memos.api.v1.Node.escaping_character_node:type_name -> memos.api.v1.EscapingCharacterNode - 33, // 27: memos.api.v1.Node.math_node:type_name -> memos.api.v1.MathNode - 34, // 28: memos.api.v1.Node.highlight_node:type_name -> memos.api.v1.HighlightNode - 35, // 29: memos.api.v1.Node.subscript_node:type_name -> memos.api.v1.SubscriptNode - 36, // 30: memos.api.v1.Node.superscript_node:type_name -> memos.api.v1.SuperscriptNode - 37, // 31: memos.api.v1.Node.referenced_content_node:type_name -> memos.api.v1.ReferencedContentNode - 38, // 32: memos.api.v1.Node.spoiler_node:type_name -> memos.api.v1.SpoilerNode - 39, // 33: memos.api.v1.Node.html_element_node:type_name -> memos.api.v1.HTMLElementNode - 9, // 34: memos.api.v1.ParagraphNode.children:type_name -> memos.api.v1.Node - 9, // 35: memos.api.v1.HeadingNode.children:type_name -> memos.api.v1.Node - 9, // 36: memos.api.v1.BlockquoteNode.children:type_name -> memos.api.v1.Node - 9, // 37: memos.api.v1.OrderedListNode.children:type_name -> memos.api.v1.Node - 9, // 38: memos.api.v1.UnorderedListNode.children:type_name -> memos.api.v1.Node - 9, // 39: memos.api.v1.TaskListNode.children:type_name -> memos.api.v1.Node - 9, // 40: memos.api.v1.TableNode.header:type_name -> memos.api.v1.Node - 40, // 41: memos.api.v1.TableNode.rows:type_name -> memos.api.v1.TableNode.Row - 9, // 42: memos.api.v1.BoldNode.children:type_name -> memos.api.v1.Node - 41, // 43: memos.api.v1.HTMLElementNode.attributes:type_name -> memos.api.v1.HTMLElementNode.AttributesEntry - 9, // 44: memos.api.v1.TableNode.Row.cells:type_name -> memos.api.v1.Node - 1, // 45: memos.api.v1.MarkdownService.ParseMarkdown:input_type -> memos.api.v1.ParseMarkdownRequest - 3, // 46: memos.api.v1.MarkdownService.RestoreMarkdownNodes:input_type -> memos.api.v1.RestoreMarkdownNodesRequest - 5, // 47: memos.api.v1.MarkdownService.StringifyMarkdownNodes:input_type -> memos.api.v1.StringifyMarkdownNodesRequest - 7, // 48: memos.api.v1.MarkdownService.GetLinkMetadata:input_type -> memos.api.v1.GetLinkMetadataRequest - 2, // 49: memos.api.v1.MarkdownService.ParseMarkdown:output_type -> memos.api.v1.ParseMarkdownResponse - 4, // 50: memos.api.v1.MarkdownService.RestoreMarkdownNodes:output_type -> memos.api.v1.RestoreMarkdownNodesResponse - 6, // 51: memos.api.v1.MarkdownService.StringifyMarkdownNodes:output_type -> memos.api.v1.StringifyMarkdownNodesResponse - 8, // 52: memos.api.v1.MarkdownService.GetLinkMetadata:output_type -> memos.api.v1.LinkMetadata - 49, // [49:53] is the sub-list for method output_type - 45, // [45:49] is the sub-list for method input_type - 45, // [45:45] is the sub-list for extension type_name - 45, // [45:45] is the sub-list for extension extendee - 0, // [0:45] is the sub-list for field type_name + 16, // 10: memos.api.v1.Node.list_node:type_name -> memos.api.v1.ListNode + 17, // 11: memos.api.v1.Node.ordered_list_item_node:type_name -> memos.api.v1.OrderedListItemNode + 18, // 12: memos.api.v1.Node.unordered_list_item_node:type_name -> memos.api.v1.UnorderedListItemNode + 19, // 13: memos.api.v1.Node.task_list_item_node:type_name -> memos.api.v1.TaskListItemNode + 20, // 14: memos.api.v1.Node.math_block_node:type_name -> memos.api.v1.MathBlockNode + 21, // 15: memos.api.v1.Node.table_node:type_name -> memos.api.v1.TableNode + 22, // 16: memos.api.v1.Node.embedded_content_node:type_name -> memos.api.v1.EmbeddedContentNode + 23, // 17: memos.api.v1.Node.text_node:type_name -> memos.api.v1.TextNode + 24, // 18: memos.api.v1.Node.bold_node:type_name -> memos.api.v1.BoldNode + 25, // 19: memos.api.v1.Node.italic_node:type_name -> memos.api.v1.ItalicNode + 26, // 20: memos.api.v1.Node.bold_italic_node:type_name -> memos.api.v1.BoldItalicNode + 27, // 21: memos.api.v1.Node.code_node:type_name -> memos.api.v1.CodeNode + 28, // 22: memos.api.v1.Node.image_node:type_name -> memos.api.v1.ImageNode + 29, // 23: memos.api.v1.Node.link_node:type_name -> memos.api.v1.LinkNode + 30, // 24: memos.api.v1.Node.auto_link_node:type_name -> memos.api.v1.AutoLinkNode + 31, // 25: memos.api.v1.Node.tag_node:type_name -> memos.api.v1.TagNode + 32, // 26: memos.api.v1.Node.strikethrough_node:type_name -> memos.api.v1.StrikethroughNode + 33, // 27: memos.api.v1.Node.escaping_character_node:type_name -> memos.api.v1.EscapingCharacterNode + 34, // 28: memos.api.v1.Node.math_node:type_name -> memos.api.v1.MathNode + 35, // 29: memos.api.v1.Node.highlight_node:type_name -> memos.api.v1.HighlightNode + 36, // 30: memos.api.v1.Node.subscript_node:type_name -> memos.api.v1.SubscriptNode + 37, // 31: memos.api.v1.Node.superscript_node:type_name -> memos.api.v1.SuperscriptNode + 38, // 32: memos.api.v1.Node.referenced_content_node:type_name -> memos.api.v1.ReferencedContentNode + 39, // 33: memos.api.v1.Node.spoiler_node:type_name -> memos.api.v1.SpoilerNode + 40, // 34: memos.api.v1.Node.html_element_node:type_name -> memos.api.v1.HTMLElementNode + 9, // 35: memos.api.v1.ParagraphNode.children:type_name -> memos.api.v1.Node + 9, // 36: memos.api.v1.HeadingNode.children:type_name -> memos.api.v1.Node + 9, // 37: memos.api.v1.BlockquoteNode.children:type_name -> memos.api.v1.Node + 9, // 38: memos.api.v1.ListNode.children:type_name -> memos.api.v1.Node + 9, // 39: memos.api.v1.OrderedListItemNode.children:type_name -> memos.api.v1.Node + 9, // 40: memos.api.v1.UnorderedListItemNode.children:type_name -> memos.api.v1.Node + 9, // 41: memos.api.v1.TaskListItemNode.children:type_name -> memos.api.v1.Node + 9, // 42: memos.api.v1.TableNode.header:type_name -> memos.api.v1.Node + 41, // 43: memos.api.v1.TableNode.rows:type_name -> memos.api.v1.TableNode.Row + 9, // 44: memos.api.v1.BoldNode.children:type_name -> memos.api.v1.Node + 42, // 45: memos.api.v1.HTMLElementNode.attributes:type_name -> memos.api.v1.HTMLElementNode.AttributesEntry + 9, // 46: memos.api.v1.TableNode.Row.cells:type_name -> memos.api.v1.Node + 1, // 47: memos.api.v1.MarkdownService.ParseMarkdown:input_type -> memos.api.v1.ParseMarkdownRequest + 3, // 48: memos.api.v1.MarkdownService.RestoreMarkdownNodes:input_type -> memos.api.v1.RestoreMarkdownNodesRequest + 5, // 49: memos.api.v1.MarkdownService.StringifyMarkdownNodes:input_type -> memos.api.v1.StringifyMarkdownNodesRequest + 7, // 50: memos.api.v1.MarkdownService.GetLinkMetadata:input_type -> memos.api.v1.GetLinkMetadataRequest + 2, // 51: memos.api.v1.MarkdownService.ParseMarkdown:output_type -> memos.api.v1.ParseMarkdownResponse + 4, // 52: memos.api.v1.MarkdownService.RestoreMarkdownNodes:output_type -> memos.api.v1.RestoreMarkdownNodesResponse + 6, // 53: memos.api.v1.MarkdownService.StringifyMarkdownNodes:output_type -> memos.api.v1.StringifyMarkdownNodesResponse + 8, // 54: memos.api.v1.MarkdownService.GetLinkMetadata:output_type -> memos.api.v1.LinkMetadata + 51, // [51:55] is the sub-list for method output_type + 47, // [47:51] is the sub-list for method input_type + 47, // [47:47] is the sub-list for extension type_name + 47, // [47:47] is the sub-list for extension extendee + 0, // [0:47] is the sub-list for field type_name } func init() { file_api_v1_markdown_service_proto_init() } @@ -3331,7 +3414,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[15].Exporter = func(v any, i int) any { - switch v := v.(*OrderedListNode); i { + switch v := v.(*ListNode); i { case 0: return &v.state case 1: @@ -3343,7 +3426,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[16].Exporter = func(v any, i int) any { - switch v := v.(*UnorderedListNode); i { + switch v := v.(*OrderedListItemNode); i { case 0: return &v.state case 1: @@ -3355,7 +3438,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[17].Exporter = func(v any, i int) any { - switch v := v.(*TaskListNode); i { + switch v := v.(*UnorderedListItemNode); i { case 0: return &v.state case 1: @@ -3367,7 +3450,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[18].Exporter = func(v any, i int) any { - switch v := v.(*MathBlockNode); i { + switch v := v.(*TaskListItemNode); i { case 0: return &v.state case 1: @@ -3379,7 +3462,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[19].Exporter = func(v any, i int) any { - switch v := v.(*TableNode); i { + switch v := v.(*MathBlockNode); i { case 0: return &v.state case 1: @@ -3391,7 +3474,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[20].Exporter = func(v any, i int) any { - switch v := v.(*EmbeddedContentNode); i { + switch v := v.(*TableNode); i { case 0: return &v.state case 1: @@ -3403,7 +3486,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[21].Exporter = func(v any, i int) any { - switch v := v.(*TextNode); i { + switch v := v.(*EmbeddedContentNode); i { case 0: return &v.state case 1: @@ -3415,7 +3498,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[22].Exporter = func(v any, i int) any { - switch v := v.(*BoldNode); i { + switch v := v.(*TextNode); i { case 0: return &v.state case 1: @@ -3427,7 +3510,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[23].Exporter = func(v any, i int) any { - switch v := v.(*ItalicNode); i { + switch v := v.(*BoldNode); i { case 0: return &v.state case 1: @@ -3439,7 +3522,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[24].Exporter = func(v any, i int) any { - switch v := v.(*BoldItalicNode); i { + switch v := v.(*ItalicNode); i { case 0: return &v.state case 1: @@ -3451,7 +3534,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[25].Exporter = func(v any, i int) any { - switch v := v.(*CodeNode); i { + switch v := v.(*BoldItalicNode); i { case 0: return &v.state case 1: @@ -3463,7 +3546,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[26].Exporter = func(v any, i int) any { - switch v := v.(*ImageNode); i { + switch v := v.(*CodeNode); i { case 0: return &v.state case 1: @@ -3475,7 +3558,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[27].Exporter = func(v any, i int) any { - switch v := v.(*LinkNode); i { + switch v := v.(*ImageNode); i { case 0: return &v.state case 1: @@ -3487,7 +3570,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[28].Exporter = func(v any, i int) any { - switch v := v.(*AutoLinkNode); i { + switch v := v.(*LinkNode); i { case 0: return &v.state case 1: @@ -3499,7 +3582,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[29].Exporter = func(v any, i int) any { - switch v := v.(*TagNode); i { + switch v := v.(*AutoLinkNode); i { case 0: return &v.state case 1: @@ -3511,7 +3594,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[30].Exporter = func(v any, i int) any { - switch v := v.(*StrikethroughNode); i { + switch v := v.(*TagNode); i { case 0: return &v.state case 1: @@ -3523,7 +3606,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[31].Exporter = func(v any, i int) any { - switch v := v.(*EscapingCharacterNode); i { + switch v := v.(*StrikethroughNode); i { case 0: return &v.state case 1: @@ -3535,7 +3618,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[32].Exporter = func(v any, i int) any { - switch v := v.(*MathNode); i { + switch v := v.(*EscapingCharacterNode); i { case 0: return &v.state case 1: @@ -3547,7 +3630,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[33].Exporter = func(v any, i int) any { - switch v := v.(*HighlightNode); i { + switch v := v.(*MathNode); i { case 0: return &v.state case 1: @@ -3559,7 +3642,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[34].Exporter = func(v any, i int) any { - switch v := v.(*SubscriptNode); i { + switch v := v.(*HighlightNode); i { case 0: return &v.state case 1: @@ -3571,7 +3654,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[35].Exporter = func(v any, i int) any { - switch v := v.(*SuperscriptNode); i { + switch v := v.(*SubscriptNode); i { case 0: return &v.state case 1: @@ -3583,7 +3666,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[36].Exporter = func(v any, i int) any { - switch v := v.(*ReferencedContentNode); i { + switch v := v.(*SuperscriptNode); i { case 0: return &v.state case 1: @@ -3595,7 +3678,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[37].Exporter = func(v any, i int) any { - switch v := v.(*SpoilerNode); i { + switch v := v.(*ReferencedContentNode); i { case 0: return &v.state case 1: @@ -3607,7 +3690,7 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[38].Exporter = func(v any, i int) any { - switch v := v.(*HTMLElementNode); i { + switch v := v.(*SpoilerNode); i { case 0: return &v.state case 1: @@ -3619,6 +3702,18 @@ func file_api_v1_markdown_service_proto_init() { } } file_api_v1_markdown_service_proto_msgTypes[39].Exporter = func(v any, i int) any { + switch v := v.(*HTMLElementNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[40].Exporter = func(v any, i int) any { switch v := v.(*TableNode_Row); i { case 0: return &v.state @@ -3638,9 +3733,10 @@ func file_api_v1_markdown_service_proto_init() { (*Node_HeadingNode)(nil), (*Node_HorizontalRuleNode)(nil), (*Node_BlockquoteNode)(nil), - (*Node_OrderedListNode)(nil), - (*Node_UnorderedListNode)(nil), - (*Node_TaskListNode)(nil), + (*Node_ListNode)(nil), + (*Node_OrderedListItemNode)(nil), + (*Node_UnorderedListItemNode)(nil), + (*Node_TaskListItemNode)(nil), (*Node_MathBlockNode)(nil), (*Node_TableNode)(nil), (*Node_EmbeddedContentNode)(nil), @@ -3669,7 +3765,7 @@ func file_api_v1_markdown_service_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_v1_markdown_service_proto_rawDesc, NumEnums: 1, - NumMessages: 41, + NumMessages: 42, NumExtensions: 0, NumServices: 1, }, diff --git a/server/router/api/v1/markdown_service.go b/server/router/api/v1/markdown_service.go index d50f7a3e..bd1e2ab9 100644 --- a/server/router/api/v1/markdown_service.go +++ b/server/router/api/v1/markdown_service.go @@ -75,15 +75,18 @@ func convertFromASTNode(rawNode ast.Node) *v1pb.Node { case *ast.Blockquote: children := convertFromASTNodes(n.Children) node.Node = &v1pb.Node_BlockquoteNode{BlockquoteNode: &v1pb.BlockquoteNode{Children: children}} - case *ast.OrderedList: + case *ast.List: children := convertFromASTNodes(n.Children) - node.Node = &v1pb.Node_OrderedListNode{OrderedListNode: &v1pb.OrderedListNode{Number: n.Number, Indent: int32(n.Indent), Children: children}} - case *ast.UnorderedList: + node.Node = &v1pb.Node_ListNode{ListNode: &v1pb.ListNode{Children: children}} + case *ast.OrderedListItem: children := convertFromASTNodes(n.Children) - node.Node = &v1pb.Node_UnorderedListNode{UnorderedListNode: &v1pb.UnorderedListNode{Symbol: n.Symbol, Indent: int32(n.Indent), Children: children}} - case *ast.TaskList: + node.Node = &v1pb.Node_OrderedListItemNode{OrderedListItemNode: &v1pb.OrderedListItemNode{Number: n.Number, Indent: int32(n.Indent), Children: children}} + case *ast.UnorderedListItem: children := convertFromASTNodes(n.Children) - node.Node = &v1pb.Node_TaskListNode{TaskListNode: &v1pb.TaskListNode{Symbol: n.Symbol, Indent: int32(n.Indent), Complete: n.Complete, Children: children}} + node.Node = &v1pb.Node_UnorderedListItemNode{UnorderedListItemNode: &v1pb.UnorderedListItemNode{Symbol: n.Symbol, Indent: int32(n.Indent), Children: children}} + case *ast.TaskListItem: + children := convertFromASTNodes(n.Children) + node.Node = &v1pb.Node_TaskListItemNode{TaskListItemNode: &v1pb.TaskListItemNode{Symbol: n.Symbol, Indent: int32(n.Indent), Complete: n.Complete, Children: children}} case *ast.MathBlock: node.Node = &v1pb.Node_MathBlockNode{MathBlockNode: &v1pb.MathBlockNode{Content: n.Content}} case *ast.Table: @@ -170,15 +173,18 @@ func convertToASTNode(node *v1pb.Node) ast.Node { case *v1pb.Node_BlockquoteNode: children := convertToASTNodes(n.BlockquoteNode.Children) return &ast.Blockquote{Children: children} - case *v1pb.Node_OrderedListNode: - children := convertToASTNodes(n.OrderedListNode.Children) - return &ast.OrderedList{Number: n.OrderedListNode.Number, Indent: int(n.OrderedListNode.Indent), Children: children} - case *v1pb.Node_UnorderedListNode: - children := convertToASTNodes(n.UnorderedListNode.Children) - return &ast.UnorderedList{Symbol: n.UnorderedListNode.Symbol, Indent: int(n.UnorderedListNode.Indent), Children: children} - case *v1pb.Node_TaskListNode: - children := convertToASTNodes(n.TaskListNode.Children) - return &ast.TaskList{Symbol: n.TaskListNode.Symbol, Indent: int(n.TaskListNode.Indent), Complete: n.TaskListNode.Complete, Children: children} + case *v1pb.Node_ListNode: + children := convertToASTNodes(n.ListNode.Children) + return &ast.List{Children: children} + case *v1pb.Node_OrderedListItemNode: + children := convertToASTNodes(n.OrderedListItemNode.Children) + return &ast.OrderedListItem{Number: n.OrderedListItemNode.Number, Indent: int(n.OrderedListItemNode.Indent), Children: children} + case *v1pb.Node_UnorderedListItemNode: + children := convertToASTNodes(n.UnorderedListItemNode.Children) + return &ast.UnorderedListItem{Symbol: n.UnorderedListItemNode.Symbol, Indent: int(n.UnorderedListItemNode.Indent), Children: children} + case *v1pb.Node_TaskListItemNode: + children := convertToASTNodes(n.TaskListItemNode.Children) + return &ast.TaskListItem{Symbol: n.TaskListItemNode.Symbol, Indent: int(n.TaskListItemNode.Indent), Complete: n.TaskListItemNode.Complete, Children: children} case *v1pb.Node_MathBlockNode: return &ast.MathBlock{Content: n.MathBlockNode.Content} case *v1pb.Node_TableNode: diff --git a/server/runner/memoproperty/runner.go b/server/runner/memoproperty/runner.go index 514f5a6f..ec3df5d8 100644 --- a/server/runner/memoproperty/runner.go +++ b/server/runner/memoproperty/runner.go @@ -86,7 +86,7 @@ func GetMemoPropertyFromContent(content string) (*storepb.MemoPayload_Property, } case *ast.Link, *ast.AutoLink: property.HasLink = true - case *ast.TaskList: + case *ast.TaskListItem: property.HasTaskList = true if !n.Complete { property.HasIncompleteTasks = true @@ -108,11 +108,13 @@ func TraverseASTNodes(nodes []ast.Node, fn func(ast.Node)) { TraverseASTNodes(n.Children, fn) case *ast.Blockquote: TraverseASTNodes(n.Children, fn) - case *ast.OrderedList: + case *ast.List: TraverseASTNodes(n.Children, fn) - case *ast.UnorderedList: + case *ast.OrderedListItem: TraverseASTNodes(n.Children, fn) - case *ast.TaskList: + case *ast.UnorderedListItem: + TraverseASTNodes(n.Children, fn) + case *ast.TaskListItem: TraverseASTNodes(n.Children, fn) case *ast.Bold: TraverseASTNodes(n.Children, fn) diff --git a/web/src/components/MemoContent/List.tsx b/web/src/components/MemoContent/List.tsx new file mode 100644 index 00000000..2c06b239 --- /dev/null +++ b/web/src/components/MemoContent/List.tsx @@ -0,0 +1,29 @@ +import { Node, NodeType } from "@/types/proto/api/v1/markdown_service"; +import Renderer from "./Renderer"; + +interface Props { + index: string; + children: Node[]; +} + +const List: React.FC = ({ children }: Props) => { + let prevNode: Node | null = null; + let skipNextLineBreakFlag = false; + + return ( +
+ {children.map((child, index) => { + if (prevNode?.type !== NodeType.LINE_BREAK && child.type === NodeType.LINE_BREAK && skipNextLineBreakFlag) { + skipNextLineBreakFlag = false; + return null; + } + + prevNode = child; + skipNextLineBreakFlag = true; + return ; + })} +
+ ); +}; + +export default List; diff --git a/web/src/components/MemoContent/OrderedList.tsx b/web/src/components/MemoContent/OrderedList.tsx deleted file mode 100644 index 347716dd..00000000 --- a/web/src/components/MemoContent/OrderedList.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { repeat } from "lodash-es"; -import { Node } from "@/types/proto/api/v1/markdown_service"; -import Renderer from "./Renderer"; -import { BaseProps } from "./types"; - -interface Props extends BaseProps { - number: string; - indent: number; - children: Node[]; -} - -const OrderedList: React.FC = ({ number, indent, children }: Props) => { - return ( -
    -
  1. - {indent > 0 && ( -
    - {repeat(" ", indent)} -
    - )} -
    -
    - {number}. -
    -
    - {children.map((child, index) => ( - - ))} -
    -
    -
  2. -
- ); -}; - -export default OrderedList; diff --git a/web/src/components/MemoContent/OrderedListItem.tsx b/web/src/components/MemoContent/OrderedListItem.tsx new file mode 100644 index 00000000..d0d253d3 --- /dev/null +++ b/web/src/components/MemoContent/OrderedListItem.tsx @@ -0,0 +1,34 @@ +import { repeat } from "lodash-es"; +import { Node } from "@/types/proto/api/v1/markdown_service"; +import Renderer from "./Renderer"; +import { BaseProps } from "./types"; + +interface Props extends BaseProps { + number: string; + indent: number; + children: Node[]; +} + +const OrderedListItem: React.FC = ({ number, indent, children }: Props) => { + return ( +
  • + {indent > 0 && ( +
    + {repeat(" ", indent)} +
    + )} +
    +
    + {number}. +
    +
    + {children.map((child, index) => ( + + ))} +
    +
    +
  • + ); +}; + +export default OrderedListItem; diff --git a/web/src/components/MemoContent/Renderer.tsx b/web/src/components/MemoContent/Renderer.tsx index 1b7d5082..414a53e3 100644 --- a/web/src/components/MemoContent/Renderer.tsx +++ b/web/src/components/MemoContent/Renderer.tsx @@ -14,11 +14,12 @@ import { ImageNode, ItalicNode, LinkNode, + ListNode, MathBlockNode, MathNode, Node, NodeType, - OrderedListNode, + OrderedListItemNode, ParagraphNode, ReferencedContentNode, SpoilerNode, @@ -27,9 +28,9 @@ import { SuperscriptNode, TableNode, TagNode, - TaskListNode, + TaskListItemNode, TextNode, - UnorderedListNode, + UnorderedListItemNode, } from "@/types/proto/api/v1/markdown_service"; import Blockquote from "./Blockquote"; import Bold from "./Bold"; @@ -46,8 +47,9 @@ import Image from "./Image"; import Italic from "./Italic"; import LineBreak from "./LineBreak"; import Link from "./Link"; +import List from "./List"; import Math from "./Math"; -import OrderedList from "./OrderedList"; +import OrderedListItem from "./OrderedListItem"; import Paragraph from "./Paragraph"; import ReferencedContent from "./ReferencedContent"; import Spoiler from "./Spoiler"; @@ -56,9 +58,9 @@ import Subscript from "./Subscript"; import Superscript from "./Superscript"; import Table from "./Table"; import Tag from "./Tag"; -import TaskList from "./TaskList"; +import TaskListItem from "./TaskListItem"; import Text from "./Text"; -import UnorderedList from "./UnorderedList"; +import UnorderedListItem from "./UnorderedListItem"; interface Props { index: string; @@ -79,12 +81,14 @@ const Renderer: React.FC = ({ index, node }: Props) => { return ; case NodeType.BLOCKQUOTE: return
    ; - case NodeType.ORDERED_LIST: - return ; - case NodeType.UNORDERED_LIST: - return ; - case NodeType.TASK_LIST: - return ; + case NodeType.LIST: + return ; + case NodeType.ORDERED_LIST_ITEM: + return ; + case NodeType.UNORDERED_LIST_ITEM: + return ; + case NodeType.TASK_LIST_ITEM: + return ; case NodeType.MATH_BLOCK: return ; case NodeType.TABLE: diff --git a/web/src/components/MemoContent/TaskList.tsx b/web/src/components/MemoContent/TaskList.tsx deleted file mode 100644 index 59637194..00000000 --- a/web/src/components/MemoContent/TaskList.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import { Checkbox } from "@mui/joy"; -import clsx from "clsx"; -import { repeat } from "lodash-es"; -import { useContext, useState } from "react"; -import { markdownServiceClient } from "@/grpcweb"; -import { useMemoStore } from "@/store/v1"; -import { Node, NodeType, TaskListNode } from "@/types/proto/api/v1/markdown_service"; -import Renderer from "./Renderer"; -import { RendererContext } from "./types"; - -interface Props { - index: string; - symbol: string; - indent: number; - complete: boolean; - children: Node[]; -} - -const TaskList: React.FC = ({ index, indent, complete, children }: Props) => { - const context = useContext(RendererContext); - const memoStore = useMemoStore(); - const [checked] = useState(complete); - - const handleCheckboxChange = async (on: boolean) => { - if (context.readonly || !context.memoName) { - return; - } - - const nodeIndex = Number(index); - if (isNaN(nodeIndex)) { - return; - } - - const node = context.nodes[nodeIndex]; - if (node.type !== NodeType.TASK_LIST) { - return; - } - - (node.taskListNode as TaskListNode)!.complete = on; - const { markdown } = await markdownServiceClient.restoreMarkdownNodes({ nodes: context.nodes }); - await memoStore.updateMemo( - { - name: context.memoName, - content: markdown, - }, - ["content"], - ); - }; - - return ( -
      -
    • - {indent > 0 && ( -
      - {repeat(" ", indent)} -
      - )} -
      -
      - handleCheckboxChange(e.target.checked)} /> -
      -
      - {children.map((child, index) => ( - - ))} -
      -
      -
    • -
    - ); -}; - -export default TaskList; diff --git a/web/src/components/MemoContent/TaskListItem.tsx b/web/src/components/MemoContent/TaskListItem.tsx new file mode 100644 index 00000000..12f44e02 --- /dev/null +++ b/web/src/components/MemoContent/TaskListItem.tsx @@ -0,0 +1,62 @@ +import { Checkbox } from "@mui/joy"; +import clsx from "clsx"; +import { repeat } from "lodash-es"; +import { useContext, useState } from "react"; +import { markdownServiceClient } from "@/grpcweb"; +import { useMemoStore } from "@/store/v1"; +import { Node, TaskListItemNode } from "@/types/proto/api/v1/markdown_service"; +import Renderer from "./Renderer"; +import { RendererContext } from "./types"; + +interface Props { + node: Node; + index: string; + symbol: string; + indent: number; + complete: boolean; + children: Node[]; +} + +const TaskListItem: React.FC = ({ node, indent, complete, children }: Props) => { + const context = useContext(RendererContext); + const memoStore = useMemoStore(); + const [checked] = useState(complete); + + const handleCheckboxChange = async (on: boolean) => { + if (context.readonly || !context.memoName) { + return; + } + + (node.taskListItemNode as TaskListItemNode)!.complete = on; + const { markdown } = await markdownServiceClient.restoreMarkdownNodes({ nodes: context.nodes }); + await memoStore.updateMemo( + { + name: context.memoName, + content: markdown, + }, + ["content"], + ); + }; + + return ( +
  • + {indent > 0 && ( +
    + {repeat(" ", indent)} +
    + )} +
    +
    + handleCheckboxChange(e.target.checked)} /> +
    +
    + {children.map((child, index) => ( + + ))} +
    +
    +
  • + ); +}; + +export default TaskListItem; diff --git a/web/src/components/MemoContent/UnorderedList.tsx b/web/src/components/MemoContent/UnorderedList.tsx deleted file mode 100644 index acefce3e..00000000 --- a/web/src/components/MemoContent/UnorderedList.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { repeat } from "lodash-es"; -import { Node } from "@/types/proto/api/v1/markdown_service"; -import Renderer from "./Renderer"; - -interface Props { - symbol: string; - indent: number; - children: Node[]; -} - -const UnorderedList: React.FC = ({ indent, children }: Props) => { - return ( -
      -
    • - {indent > 0 && ( -
      - {repeat(" ", indent)} -
      - )} -
      -
      - -
      -
      - {children.map((child, index) => ( - - ))} -
      -
      -
    • -
    - ); -}; - -export default UnorderedList; diff --git a/web/src/components/MemoContent/UnorderedListItem.tsx b/web/src/components/MemoContent/UnorderedListItem.tsx new file mode 100644 index 00000000..ff033509 --- /dev/null +++ b/web/src/components/MemoContent/UnorderedListItem.tsx @@ -0,0 +1,33 @@ +import { repeat } from "lodash-es"; +import { Node } from "@/types/proto/api/v1/markdown_service"; +import Renderer from "./Renderer"; + +interface Props { + symbol: string; + indent: number; + children: Node[]; +} + +const UnorderedListItem: React.FC = ({ indent, children }: Props) => { + return ( +
  • + {indent > 0 && ( +
    + {repeat(" ", indent)} +
    + )} +
    +
    + +
    +
    + {children.map((child, index) => ( + + ))} +
    +
    +
  • + ); +}; + +export default UnorderedListItem;